lib/volt/page/channel.rb in volt-0.7.23 vs lib/volt/page/channel.rb in volt-0.8.0
- old
+ new
@@ -1,34 +1,32 @@
# The channel is the connection between the front end and the backend.
-require 'volt/reactive/events'
require 'json'
+require 'volt/reactive/reactive_accessors'
+require 'volt/reactive/eventable'
class Channel
- include ReactiveTags
+ include ReactiveAccessors
+ include Eventable
- attr_reader :status, :error, :reconnect_interval
+ reactive_accessor :connected, :status, :error, :reconnect_interval, :retry_count
def initialize
@socket = nil
- @status = :opening
- @connected = false
- @error = nil
- @retry_count = 0
+ self.status = :opening
+ self.connected = false
+ self.error = nil
+ self.retry_count = 0
@queue = []
connect!
end
def connected?
- @connected
+ self.connected
end
- def retry_count
- @retry_count
- end
-
def connect!
%x{
this.socket = new SockJS('/channel');
this.socket.onopen = function() {
@@ -52,57 +50,43 @@
@reconnect_interval = nil
@retry_count = 0
@queue.each do |message|
send_message(message)
end
-
- trigger!('open')
- trigger!('changed')
- if old_status == :reconnecting
- trigger!('reconnected')
- end
end
def closed(error)
- @status = :closed
- @connected = false
- @error = `error.reason`
+ self.status = :closed
+ self.connected = false
+ self.error = `error.reason`
- trigger!('closed')
- trigger!('changed')
-
reconnect!
end
def reconnect!
- @status = :reconnecting
- @reconnect_interval ||= 0
- @reconnect_interval += (2000 + rand(5000))
- @retry_count += 1
+ self.status = :reconnecting
+ self.reconnect_interval ||= 0
+ self.reconnect_interval += (2000 + rand(5000))
+ self.retry_count += 1
- # Trigger changed for reconnect interval
- trigger!('changed')
+ interval = self.reconnect_interval
- interval = @reconnect_interval
-
%x{
setTimeout(function() {
self['$connect!']();
}, interval);
}
end
def message_received(message)
message = JSON.parse(message)
- trigger!('message', nil, *message)
- end
- tag_method(:send_message) do
- destructive!
+ trigger!('message', *message)
end
+
def send_message(message)
- if @status != :open
+ if self.status != :open
@queue << message
else
# TODO: Temp: wrap message in an array, so we're sure its valid JSON
message = JSON.dump([message])
%x{
@@ -110,10 +94,10 @@
}
end
end
def close!
- @status = :closed
+ self.status = :closed
%x{
this.socket.close();
}
end
end