From 8c12b386d36f6683e80cb64187af0f9498135852 Mon Sep 17 00:00:00 2001 From: Bryce Kahle Date: Sat, 25 Oct 2014 17:18:29 -0400 Subject: [PATCH 001/126] #129, #162 add ws ping-pong and close if no response MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This utilizes the web socket protocol ping-pong op codes. If the connection supports them, it will send them instead of heartbeat frames. If the client doesn’t respond within 10 seconds, it considers the connection closed. --- src/trans-websocket.coffee | 13 +++++++++++++ src/transport.coffee | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/trans-websocket.coffee b/src/trans-websocket.coffee index 1514c623..f4583cbc 100644 --- a/src/trans-websocket.coffee +++ b/src/trans-websocket.coffee @@ -50,6 +50,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: -> @@ -88,6 +89,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 d04fe91b..b99db865 100644 --- a/src/transport.coffee +++ b/src/transport.coffee @@ -158,7 +158,7 @@ class Session x = => if @recv @to_tref = setTimeout(x, @heartbeat_delay) - @recv.doSendFrame("h") + @recv.heartbeat() @to_tref = setTimeout(x, @heartbeat_delay) return @@ -264,6 +264,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 From dd3497abf30100b4eaa9b4df47ad36973bad2279 Mon Sep 17 00:00:00 2001 From: David Glasser Date: Thu, 5 Mar 2015 14:39:43 -0800 Subject: [PATCH 002/126] Release 0.3.14 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 991ba017..a0be98bb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "sockjs", "description": "SockJS-node is a server counterpart of SockJS-client a JavaScript library that provides a WebSocket-like object in the browser. SockJS gives you a coherent, cross-browser, Javascript API which creates a low latency, full duplex, cross-domain communication channel between the browser and the web server.", - "version": "0.3.13", + "version": "0.3.14", "author": "Marek Majkowski", "bugs": { "url": "https://github.com/sockjs/sockjs-node/issues" From 23f6cebd6257d2f5ff01dad80404a916204b55c1 Mon Sep 17 00:00:00 2001 From: Bryce Kahle Date: Wed, 11 Mar 2015 11:54:41 -0400 Subject: [PATCH 003/126] Fix #175 compatibility with coffeescript 1.9.0 --- src/sockjs.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sockjs.coffee b/src/sockjs.coffee index de505eea..55854fdd 100644 --- a/src/sockjs.coffee +++ b/src/sockjs.coffee @@ -108,10 +108,10 @@ generate_dispatcher = (options) -> class Listener constructor: (@options, emit) -> @app = new App() - @app.options = options + @app.options = @options @app.emit = emit @app.log('debug', 'SockJS v' + sockjsVersion() + ' ' + - 'bound to ' + JSON.stringify(options.prefix)) + 'bound to ' + JSON.stringify(@options.prefix)) @dispatcher = generate_dispatcher(@options) @webjs_handler = webjs.generateHandler(@app, @dispatcher) @path_regexp = new RegExp('^' + @options.prefix + '([/].+|[/]?)$') From cb9925c6f135094d8b901d8d4f8d7e2fa54f5058 Mon Sep 17 00:00:00 2001 From: Bryce Kahle Date: Wed, 11 Mar 2015 11:58:53 -0400 Subject: [PATCH 004/126] [dist] 0.3.15 --- Changelog | 10 ++++++++++ package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 71d0f723..af79ae41 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,13 @@ +0.3.15 +====== + + * Remove usage of naked '@' function params to be compatible with coffeescript 1.9.0 #175 + +0.3.14 +====== + + * Re-publish to npm because of build issue in 0.3.13 + 0.3.13 ====== diff --git a/package.json b/package.json index a0be98bb..96f0f238 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "sockjs", "description": "SockJS-node is a server counterpart of SockJS-client a JavaScript library that provides a WebSocket-like object in the browser. SockJS gives you a coherent, cross-browser, Javascript API which creates a low latency, full duplex, cross-domain communication channel between the browser and the web server.", - "version": "0.3.14", + "version": "0.3.15", "author": "Marek Majkowski", "bugs": { "url": "https://github.com/sockjs/sockjs-node/issues" From 7c8bfd254f943f3732c76b5f23d9893b3d25d8af Mon Sep 17 00:00:00 2001 From: Bryce Kahle Date: Fri, 29 May 2015 23:36:45 -0400 Subject: [PATCH 005/126] Fix #177 fix CORS response for null origin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Don’t respond with Access-Control-Allow-Origin: * for Origin: null --- src/trans-xhr.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trans-xhr.coffee b/src/trans-xhr.coffee index 793f7235..5b0ddcac 100644 --- a/src/trans-xhr.coffee +++ b/src/trans-xhr.coffee @@ -57,7 +57,7 @@ exports.app = return true xhr_cors: (req, res, content) -> - if !req.headers['origin'] or req.headers['origin'] is 'null' + if !req.headers['origin'] origin = '*' else origin = req.headers['origin'] From fd36bab1fcd94e4b6611f462eec0dd704977da67 Mon Sep 17 00:00:00 2001 From: Dan Ordille Date: Tue, 2 Jun 2015 16:51:38 -0400 Subject: [PATCH 006/126] Fix possible race condition in websocket heartbeat callback --- src/trans-websocket.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/trans-websocket.coffee b/src/trans-websocket.coffee index 52c137f9..c1b95110 100644 --- a/src/trans-websocket.coffee +++ b/src/trans-websocket.coffee @@ -101,7 +101,8 @@ class WebSocketReceiver extends transport.GenericReceiver super heartbeat_timeout: -> - @session.close(3000, 'No response from heartbeat') + if @session? + @session.close(3000, 'No response from heartbeat') From caa54280c20fb0ae5dcb227ae4a86e1e3c585dc8 Mon Sep 17 00:00:00 2001 From: "Lingjun.Meng" Date: Fri, 5 Jun 2015 01:58:47 +0800 Subject: [PATCH 007/126] add koa example --- examples/koa/index.html | 71 +++++++++++++++++++++++++++++++++++++++ examples/koa/package.json | 8 +++++ examples/koa/server.js | 29 ++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 examples/koa/index.html create mode 100644 examples/koa/package.json create mode 100644 examples/koa/server.js diff --git a/examples/koa/index.html b/examples/koa/index.html new file mode 100644 index 00000000..179ccc2b --- /dev/null +++ b/examples/koa/index.html @@ -0,0 +1,71 @@ + + + + + + +

SockJS Express example

+ +
+
+
+
+ + + diff --git a/examples/koa/package.json b/examples/koa/package.json new file mode 100644 index 00000000..8ee004f0 --- /dev/null +++ b/examples/koa/package.json @@ -0,0 +1,8 @@ +{ + "name": "sockjs-koa", + "version": "0.0.0-unreleasable", + "dependencies": { + "koa": "^0.21.0", + "sockjs": "*" + } +} diff --git a/examples/koa/server.js b/examples/koa/server.js new file mode 100644 index 00000000..1ad623be --- /dev/null +++ b/examples/koa/server.js @@ -0,0 +1,29 @@ +var koa = require('koa'); +var sockjs = require('sockjs'); +var http = require('http'); +var fs = require('fs'); +var path = require('path'); + +// 1. Echo sockjs server +var sockjs_opts = {sockjs_url: "http://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js"}; +var sockjs_echo = sockjs.createServer(sockjs_opts); +sockjs_echo.on('connection', function(conn) { + conn.on('data', function(message) { + conn.write(message); + }); +}); + +// 2. koa server +var app = koa(); + +app.use(function *() { + var filePath = __dirname + '/index.html'; + this.type = path.extname(filePath); + this.body = fs.createReadStream(filePath); +}); + +var server = http.createServer(app.callback()); +sockjs_echo.installHandlers(server, {prefix:'/echo'}); + +server.listen(9999, '0.0.0.0'); +console.log(' [*] Listening on 0.0.0.0:9999' ); From d4385b584682c5f0ae8ccb082678f4fbea90f7c7 Mon Sep 17 00:00:00 2001 From: Bryce Kahle Date: Tue, 21 Jul 2015 22:11:01 -0700 Subject: [PATCH 008/126] Fix #182 update sockjs-client version in docs and example to 1.0.1 --- README.md | 4 ++-- examples/echo/index.html | 2 +- examples/echo/server.js | 2 +- examples/express-3.x/index.html | 2 +- examples/express-3.x/server.js | 2 +- examples/express/index.html | 2 +- examples/express/server.js | 2 +- examples/hapi/html/index.html | 2 +- examples/hapi/server.js | 2 +- examples/multiplex/index.html | 2 +- examples/multiplex/server.js | 2 +- src/sockjs.coffee | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 3ae3870b..b1353f0b 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ A simplified echo SockJS server could look more or less like: var http = require('http'); var sockjs = require('sockjs'); -var echo = sockjs.createServer({ sockjs_url: 'http://cdn.jsdelivr.net/sockjs/0.3.4/sockjs.min.js' }); +var echo = sockjs.createServer({ sockjs_url: 'http://cdn.jsdelivr.net/sockjs/1.0.1/sockjs.min.js' }); echo.on('connection', function(conn) { conn.on('data', function(message) { conn.write(message); @@ -99,7 +99,7 @@ Where `options` is a hash which can contain: domain local to the SockJS server. This iframe also does need to load SockJS javascript client library, and this option lets you specify its url (if you're unsure, point it to - + the latest minified SockJS client release, this is the default). You must explicitly specify this url on the server side for security reasons - we don't want the possibility of running any foreign diff --git a/examples/echo/index.html b/examples/echo/index.html index c5c5fccf..41734548 100644 --- a/examples/echo/index.html +++ b/examples/echo/index.html @@ -1,7 +1,7 @@ - + - -

SockJS Express example

- -
-
-
-
- - - diff --git a/examples/express-3.x/package.json b/examples/express-3.x/package.json deleted file mode 100644 index 9c6a19f3..00000000 --- a/examples/express-3.x/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "sockjs-express", - "version": "0.0.0-unreleasable", - "dependencies": { - "express": "~3*", - "sockjs": "*" - } -} diff --git a/examples/express-3.x/server.js b/examples/express-3.x/server.js deleted file mode 100644 index 47484fcb..00000000 --- a/examples/express-3.x/server.js +++ /dev/null @@ -1,26 +0,0 @@ -var express = require('express'); -var sockjs = require('sockjs'); -var http = require('http'); - -// 1. Echo sockjs server -var sockjs_opts = {sockjs_url: "http://cdn.jsdelivr.net/sockjs/1.0.1/sockjs.min.js"}; - -var sockjs_echo = sockjs.createServer(sockjs_opts); -sockjs_echo.on('connection', function(conn) { - conn.on('data', function(message) { - conn.write(message); - }); -}); - -// 2. Express server -var app = express(); /* express.createServer will not work here */ -var server = http.createServer(app); - -sockjs_echo.installHandlers(server, {prefix:'/echo'}); - -console.log(' [*] Listening on 0.0.0.0:9999' ); -server.listen(9999, '0.0.0.0'); - -app.get('/', function (req, res) { - res.sendfile(__dirname + '/index.html'); -}); diff --git a/examples/express/index.html b/examples/express/index.html index 050ce550..c10e1282 100644 --- a/examples/express/index.html +++ b/examples/express/index.html @@ -1,7 +1,7 @@ - +