diff --git a/src/trans-websocket.coffee b/src/trans-websocket.coffee index 6c5e0b37..52c137f9 100644 --- a/src/trans-websocket.coffee +++ b/src/trans-websocket.coffee @@ -52,6 +52,7 @@ class WebSocketReceiver extends transport.GenericReceiver @connection.setNoDelay(true) catch x @ws.addEventListener('message', (m) => @didMessage(m.data)) + @heartbeat_cb = => @heartbeat_timeout() super @connection setUp: -> @@ -90,6 +91,18 @@ class WebSocketReceiver extends transport.GenericReceiver @ws = null @connection = null + heartbeat: -> + supportsHeartbeats = @ws.ping null, -> + clearTimeout(hto_ref) + + if supportsHeartbeats + hto_ref = setTimeout(@heartbeat_cb, 10000) + else + super + + heartbeat_timeout: -> + @session.close(3000, 'No response from heartbeat') + Transport = transport.Transport diff --git a/src/transport.coffee b/src/transport.coffee index 5d6c4d18..95e1ea91 100644 --- a/src/transport.coffee +++ b/src/transport.coffee @@ -163,7 +163,7 @@ class Session x = => if @recv @to_tref = setTimeout(x, @heartbeat_delay) - @recv.doSendFrame("h") + @recv.heartbeat() @to_tref = setTimeout(x, @heartbeat_delay) return @@ -266,6 +266,9 @@ class GenericReceiver utils.quote(m) @doSendFrame('a' + '[' + q_msgs.join(',') + ']') + heartbeat: -> + @doSendFrame('h') + # Write stuff to response, using chunked encoding if possible. class ResponseReceiver extends GenericReceiver