Class: Volt::Channel
Instance Method Summary
collapse
Methods included from Eventable
#on, #remove_listener, #trigger!
#__reactive_dependency_get, included
Constructor Details
Returns a new instance of Channel.
14
15
16
17
18
19
20
21
22
23
|
# File 'lib/volt/page/channel.rb', line 14
def initialize
@socket = nil
self.status = :opening
self.connected = false
self.error = nil
self.retry_count = 0
@queue = []
connect!
end
|
Instance Method Details
125
126
127
128
129
130
|
# File 'lib/volt/page/channel.rb', line 125
def close!
self.status = :closed
`
this.socket.close();
`
end
|
#closed(error) ⇒ Object
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/volt/page/channel.rb', line 83
def closed(error)
self.status = :closed
self.connected = false
self.error = `error.reason`
trigger!('disconnect')
reconnect!
end
|
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
# File 'lib/volt/page/channel.rb', line 29
def connect!
socket_url = Volt.config.try(:public).try(:websocket_url) || begin
"#{`document.location.host`}/socket"
end
if socket_url !~ /^wss?[:]\/\//
if socket_url !~ /^[:]\/\//
socket_url = "://#{socket_url}"
end
ws_proto = (`document.location.protocol` == 'https:') ? 'wss' : 'ws'
socket_url = "#{ws_proto}#{socket_url}"
end
`
this.socket = new WebSocket(socket_url);
this.socket.onopen = function () {
self.$opened();
};
// Log errors
this.socket.onerror = function (error) {
console.log('WebSocket Error ', error);
};
// Log messages from the server
this.socket.onmessage = function(message) {
self['$message_received'](message.data);
};
this.socket.onclose = function(error) {
self.$closed(error);
};
`
end
|
25
26
27
|
# File 'lib/volt/page/channel.rb', line 25
def connected?
connected
end
|
#message_received(message) ⇒ Object
107
108
109
110
111
|
# File 'lib/volt/page/channel.rb', line 107
def message_received(message)
message = EJSON.parse(message)
trigger!('message', *message)
end
|
70
71
72
73
74
75
76
77
78
79
80
81
|
# File 'lib/volt/page/channel.rb', line 70
def opened
self.status = :open
self.connected = true
self.reconnect_interval = nil
self.retry_count = 0
@queue.each do |message|
send_message(message)
end
trigger!('connect')
end
|
#reconnect! ⇒ Object
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'lib/volt/page/channel.rb', line 94
def reconnect!
self.status = :reconnecting
self.reconnect_interval ||= 0
self.reconnect_interval += (1000 + rand(5000))
self.retry_count += 1
interval = self.reconnect_interval
self.reconnect_in = interval
reconnect_tick
end
|
#send_message(message) ⇒ Object
113
114
115
116
117
118
119
120
121
122
123
|
# File 'lib/volt/page/channel.rb', line 113
def send_message(message)
if status != :open
@queue << message
else
message = EJSON.stringify([message])
`
this.socket.send(message);
`
end
end
|