aboutsummaryrefslogtreecommitdiffstats
path: root/lib/assets/javascripts/cable/connection.js.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'lib/assets/javascripts/cable/connection.js.coffee')
-rw-r--r--lib/assets/javascripts/cable/connection.js.coffee53
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/assets/javascripts/cable/connection.js.coffee b/lib/assets/javascripts/cable/connection.js.coffee
new file mode 100644
index 0000000000..4f7d2abada
--- /dev/null
+++ b/lib/assets/javascripts/cable/connection.js.coffee
@@ -0,0 +1,53 @@
+class Cable.Connection
+ constructor: (@consumer) ->
+ @open()
+
+ send: (data) ->
+ if @isOpen()
+ @websocket.send(JSON.stringify(data))
+ true
+ else
+ false
+
+ open: =>
+ @websocket = new WebSocket(@consumer.url)
+ @websocket.onmessage = @onMessage
+ @websocket.onopen = @onOpen
+ @websocket.onclose = @onClose
+ @websocket.onerror = @onError
+
+ close: ->
+ @websocket.close() unless @isClosed()
+
+ reopen: ->
+ if @isClosed()
+ @open()
+ else
+ @websocket.onclose = @open
+ @websocket.onerror = @open
+ @websocket.close()
+
+ isOpen: ->
+ @websocket.readyState is WebSocket.OPEN
+
+ isClosed: ->
+ @websocket.readyState in [ WebSocket.CLOSED, WebSocket.CLOSING ]
+
+ onMessage: (message) =>
+ data = JSON.parse message.data
+ @consumer.subscribers.notify(data.identifier, "received", data.message)
+
+ onOpen: =>
+ @consumer.subscribers.reload()
+
+ onClose: =>
+ @disconnect()
+
+ onError: =>
+ @disconnect()
+ @websocket.onclose = -> # no-op
+ @websocket.onerror = -> # no-op
+ try @close()
+
+ disconnect: ->
+ @consumer.subscribers.notifyAll("disconnected")