From 8e309100651a073d344211284434644c0a403199 Mon Sep 17 00:00:00 2001 From: Mark Hindess Date: Wed, 30 Jul 2014 13:57:25 +0100 Subject: [PATCH 1/3] Add webSocketKeepAliveTime setting to aid testing. --- red/comms.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/red/comms.js b/red/comms.js index be23729a6..3664f55cc 100644 --- a/red/comms.js +++ b/red/comms.js @@ -35,6 +35,8 @@ function init(_server,_settings) { } function start() { + + var webSocketKeepAliveTime = settings.webSocketKeepAliveTime || 15000; var path = settings.httpAdminRoot || "/"; path = path + (path.slice(-1) == "/" ? "":"/") + "comms"; wsServer = new ws.Server({server:server,path:path}); @@ -74,11 +76,11 @@ function start() { heartbeatTimer = setInterval(function() { var now = Date.now(); - if (now-lastSentTime > 15000) { + if (now-lastSentTime > webSocketKeepAliveTime) { lastSentTime = now; publish("hb",lastSentTime); } - }, 15000); + }, webSocketKeepAliveTime); } function publish(topic,data,retain) { From a8c491bf2b1df751f759466d01bb65b3d9c8928d Mon Sep 17 00:00:00 2001 From: Mark Hindess Date: Wed, 30 Jul 2014 13:58:11 +0100 Subject: [PATCH 2/3] Add comms keep alive tests. --- test/red/comms_spec.js | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/test/red/comms_spec.js b/test/red/comms_spec.js index f83a7839a..65aa25ad0 100644 --- a/test/red/comms_spec.js +++ b/test/red/comms_spec.js @@ -123,4 +123,55 @@ describe("comms", function() { }); }); } + + describe("keep alives", function() { + before(function(done) { + server = http.createServer(function(req,res){app(req,res)}); + comms.init(server, {webSocketKeepAliveTime: 100}); + server.listen(listenPort, address); + server.on('listening', function() { + port = server.address().port; + url = 'http://' + address + ':' + port + '/comms'; + comms.start(); + done(); + }); + }); + it('are sent', function(done) { + var ws = new WebSocket(url); + var count = 0; + ws.on('message', function(data) { + var msg = JSON.parse(data); + msg.should.have.property('topic','hb'); + msg.should.have.property('data').be.a.Number; + count++; + if (count == 3) { + ws.close(); + done(); + } + }); + }); + it('are not sent if other messages are sent', function(done) { + var ws = new WebSocket(url); + var count = 0; + var interval; + ws.on('open', function() { + ws.send('{"subscribe":"foo"}'); + interval = setInterval(function() { + comms.publish('foo', 'bar'); + }, 50); + }); + ws.on('message', function(data) { + var msg = JSON.parse(data); + msg.should.have.property('topic', 'foo'); + msg.should.have.property('data', 'bar'); + count++; + if (count == 5) { + clearInterval(interval); + ws.close(); + done(); + } + }); + }); + }); + }); From 195f581da7d6f326e6c0966b14d3fc0cecc07f8f Mon Sep 17 00:00:00 2001 From: Mark Hindess Date: Wed, 30 Jul 2014 13:58:40 +0100 Subject: [PATCH 3/3] Remove redundant assignment. The publish immediately overwrites this time so there isn't much point setting it. --- red/comms.js | 1 - 1 file changed, 1 deletion(-) diff --git a/red/comms.js b/red/comms.js index 3664f55cc..06b21ce37 100644 --- a/red/comms.js +++ b/red/comms.js @@ -77,7 +77,6 @@ function start() { heartbeatTimer = setInterval(function() { var now = Date.now(); if (now-lastSentTime > webSocketKeepAliveTime) { - lastSentTime = now; publish("hb",lastSentTime); } }, webSocketKeepAliveTime);