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