class Volt::Channel
Public Class Methods
new()
click to toggle source
# 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
Public Instance Methods
close!()
click to toggle source
# File lib/volt/page/channel.rb, line 125 def close! self.status = :closed ` this.socket.close(); ` end
closed(error)
click to toggle source
# File lib/volt/page/channel.rb, line 83 def closed(error) self.status = :closed self.connected = false self.error = `error.reason` # Trigger a disconnect event trigger!('disconnect') reconnect! end
connect!()
click to toggle source
# File lib/volt/page/channel.rb, line 29 def connect! # The websocket url can be overridden by config.public.websocket_url socket_url = Volt.config.try(:public).try(:websocket_url) || begin "#{`document.location.host`}/socket" end if socket_url !~ /^wss?[:]\/\// if socket_url !~ /^[:]\/\// # Add :// to the front socket_url = "://#{socket_url}" end ws_proto = (`document.location.protocol` == 'https:') ? 'wss' : 'ws' # Add wss? to the front 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
connected?()
click to toggle source
# File lib/volt/page/channel.rb, line 25 def connected? connected end
message_received(message)
click to toggle source
# File lib/volt/page/channel.rb, line 107 def message_received(message) message = EJSON.parse(message) trigger!('message', *message) end
opened()
click to toggle source
# 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 a connect event trigger!('connect') end
reconnect!()
click to toggle source
# 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)
click to toggle source
# File lib/volt/page/channel.rb, line 113 def send_message(message) if status != :open @queue << message else # TODO: Temp: wrap message in an array, so we're sure its valid JSON message = EJSON.stringify([message]) ` this.socket.send(message); ` end end
Private Instance Methods
reconnect_tick()
click to toggle source
# File lib/volt/page/channel.rb, line 134 def reconnect_tick if reconnect_in >= 1000 self.reconnect_in -= 1000 ` setTimeout(function() { self['$reconnect_tick'](); }, 1000); ` else connect! end end