lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee in websocket-rails-0.1.5 vs lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee in websocket-rails-0.1.6
- old
+ new
@@ -16,66 +16,84 @@
console.log(data.user_name);
});
###
class window.WebSocketRails
constructor: (@url, @use_websockets = true) ->
- @state = 'connecting'
- @callbacks = {}
- @channels = {}
+ @state = 'connecting'
+ @callbacks = {}
+ @channels = {}
+ @queue = {}
unless @supports_websockets() and @use_websockets
@_conn = new WebSocketRails.HttpConnection url, @
else
@_conn = new WebSocketRails.WebSocketConnection url, @
@_conn.new_message = @new_message
new_message: (data) =>
for socket_message in data
- if socket_message.length > 2
- event_name = socket_message[1]
- message = socket_message[2]
- @dispatch_channel socket_message...
+ event = new WebSocketRails.Event( socket_message )
+ if event.is_result()
+ @queue[event.id]?.run_callbacks(event.success, event.data)
+ @queue[event.id] = null
+ else if event.is_channel()
+ @dispatch_channel event
+ else if event.is_ping()
+ @pong()
else
- event_name = socket_message[0]
- message = socket_message[1]
- @dispatch socket_message...
+ @dispatch event
- if @state == 'connecting' and event_name == 'client_connected'
- @connection_established message
+ if @state == 'connecting' and event.name == 'client_connected'
+ @connection_established event.data
connection_established: (data) =>
@state = 'connected'
@connection_id = data.connection_id
+ @_conn.flush_queue data.connection_id
if @on_open?
@on_open(data)
bind: (event_name, callback) =>
@callbacks[event_name] ?= []
@callbacks[event_name].push callback
- trigger: (event_name, data) =>
- @_conn.trigger event_name, data, @connection_id
+ trigger: (event_name, data, success_callback, failure_callback) =>
+ event = new WebSocketRails.Event( [event_name, data, @connection_id], success_callback, failure_callback )
+ @queue[event.id] = event
+ @_conn.trigger event
- dispatch: (event_name, data) =>
- return unless @callbacks[event_name]?
- for callback in @callbacks[event_name]
- callback data
+ trigger_event: (event) =>
+ @queue[event.id] ?= event # Prevent replacing an event that has callbacks stored
+ @_conn.trigger event
+ dispatch: (event) =>
+ return unless @callbacks[event.name]?
+ for callback in @callbacks[event.name]
+ callback event.data
+
subscribe: (channel_name) =>
unless @channels[channel_name]?
channel = new WebSocketRails.Channel channel_name, @
@channels[channel_name] = channel
channel
else
@channels[channel_name]
- trigger_channel: (channel, event_name, data) =>
- @_conn.trigger_channel channel, event_name, @connection_id
+ subscribe_private: (channel_name) =>
+ unless @channels[channel_name]?
+ channel = new WebSocketRails.Channel channel_name, @, true
+ @channels[channel_name] = channel
+ channel
+ else
+ @channels[channel_name]
- dispatch_channel: (channel, event_name, message) =>
- return unless @channels[channel]?
- @channels[channel].dispatch event_name, message
+ dispatch_channel: (event) =>
+ return unless @channels[event.channel]?
+ @channels[event.channel].dispatch event.name, event.data
supports_websockets: =>
(typeof(WebSocket) == "function" or typeof(WebSocket) == "object")
+ pong: =>
+ pong = new WebSocketRails.Event( ['websocket_rails.pong',{},@connection_id] )
+ @_conn.trigger pong