diff --git a/lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee b/lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee index bf6b22b1..2f1a477d 100644 --- a/lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee +++ b/lib/assets/javascripts/websocket_rails/websocket_rails.js.coffee @@ -24,6 +24,7 @@ class @WebSocketRails @callbacks = {} @channels = {} @queue = {} + @reconnect_event = status: false, old_connection_id: null @connect() @@ -45,25 +46,19 @@ class @WebSocketRails @state = 'disconnected' - # Reconnects the whole connection, + # Reconnects the whole connection, # keeping the messages queue and its' connected channels. - # + # # After successfull connection, this will: # - reconnect to all channels, that were active while disconnecting # - resend all events from which we haven't received any response yet reconnect: => - old_connection_id = @_conn?.connection_id - + unless @reconnect_event.status + @reconnect_event.status = true + @reconnect_event.old_connection_id = @_conn?.connection_id @disconnect() @connect() - # Resend all unfinished events from the previous connection. - for id, event of @queue - if event.connection_id == old_connection_id && !event.is_result() - @trigger_event event - - @reconnect_channels() - new_message: (data) => for socket_message in data event = new WebSocketRails.Event( socket_message ) @@ -78,6 +73,8 @@ class @WebSocketRails @dispatch event if @state == 'connecting' and event.name == 'client_connected' + if @reconnect_event.status + @process_reconnect() @connection_established event.data connection_established: (data) => @@ -143,6 +140,15 @@ class @WebSocketRails connection_stale: => @state != 'connected' + process_reconnect: -> + old_connection_id = @reconnect_event.old_connection_id + @reconnect_event.status = false + @reconnect_event.old_connection_id = null + for id, event of @queue + if event.connection_id == old_connection_id && !event.is_result() + @trigger_event event + @reconnect_channels() + # Destroy and resubscribe to all existing @channels. reconnect_channels: -> for name, channel of @channels