Compare commits

...

21 Commits

Author SHA1 Message Date
James Coglan dc392490a8 Bump version to 0.11.0 and drop support for Node < 0.8. 2016-02-24 08:34:09 +00:00
James Coglan 0feee7974c Bump the copyright year. 2016-02-06 19:15:41 +00:00
James Coglan 91d8e1ad41 Use https: URLs for github.com in package.json. 2016-02-06 18:11:32 +00:00
James Coglan c27fee0680 Document the net option to the Client class. 2016-02-06 18:11:17 +00:00
James Coglan 061494bc2c Introduce a 'net' option that can be used to pass through options to net.connect(). 2016-02-06 15:51:18 +00:00
James Coglan 958d3a458f Use the same guarded assignment pattern for all socket options we interfere with. 2016-02-06 13:43:56 +00:00
James Coglan 2d945cff5d Merge pull request #50 from lazyfrosch/support-sni
Support SNI communication with a webserver
2016-02-06 13:42:43 +00:00
Markus Frosch d3340cdd63 Support SNI communication with a webserver
The option servername has to be set in order for connecting to a
webserver that requires SNI for certificate selection.

Also see here:
https://nodejs.org/api/tls.html#tls_tls_connect_port_host_options_callback
2015-12-21 11:23:48 +01:00
James Coglan 0d15d7a3ec Add checks for the headers and status to the tests. 2015-11-25 22:24:52 +00:00
James Coglan cdc7f0891b Remove deflate config from example server; I must have accidentally committed this. 2015-11-25 21:58:09 +00:00
James Coglan f8c5b86e10 Create CODE_OF_CONDUCT.md. 2015-11-08 12:15:58 +00:00
James Coglan 53db3d6c25 Test on Node 5. 2015-11-05 21:22:50 +00:00
James Coglan dcb3375dda Run tests on major versions of iojs and node 4. 2015-10-17 13:01:07 +01:00
James Coglan 854c0a9658 Bump version to 0.10.0. 2015-07-08 21:10:01 +01:00
James Coglan d753d09372 Remove the optional signifier from the ping() docs. 2015-07-04 21:23:02 +01:00
James Coglan febde17f0e Store the closing parameters (code and reason) before calling 'finalize', so they are emitted if there is no socket connected. 2015-07-04 18:33:13 +01:00
James Coglan c52271c308 Update the TLS certificates since the old ones had expired. 2015-06-22 11:17:22 +01:00
James Coglan 8460dd9f03 Add the code and reason parameters to the close() API call. 2015-06-22 10:47:50 +01:00
James Coglan 66fc108591 Replace 'iff' with 'if and only if'. 2015-03-28 19:43:43 +00:00
James Coglan 58491dea2b Use permessage-deflate in the client example, and tweak code style a bit. 2015-03-28 09:47:36 +00:00
James Coglan cd220deb74 Remove an unneeded crypto import. 2015-03-28 09:47:08 +00:00
13 changed files with 110 additions and 68 deletions
+6 -1
View File
@@ -1,7 +1,12 @@
sudo: false
language: node_js
node_js:
- "0.8"
- "0.10"
- "0.12"
- "iojs"
- "iojs-1"
- "iojs-2"
- "iojs-3"
- "4"
- "5"
+8
View File
@@ -1,3 +1,11 @@
### 0.11.0 / 2016-02-24
* Introduce a `net` option to the `Client` class for setting things like, say, `servername`
### 0.10.0 / 2015-07-08
* Add the standard `code` and `reason` parameters to the `close` method
### 0.9.4 / 2015-03-08
* Don't send input to the driver before `start()` is called
+4
View File
@@ -0,0 +1,4 @@
# Code of Conduct
All projects under the [Faye](https://github.com/faye) umbrella are covered by
the [Code of Conduct](https://github.com/faye/code-of-conduct).
+14 -10
View File
@@ -9,7 +9,7 @@ This is a general-purpose WebSocket implementation extracted from the
[Faye](http://faye.jcoglan.com) project. It provides classes for easily building
WebSocket servers and clients in Node. It does not provide a server itself, but
rather makes it easy to handle WebSocket connections within an existing
[Node](http://nodejs.org/) application. It does not provide any abstraction
[Node](https://nodejs.org/) application. It does not provide any abstraction
other than the standard [WebSocket API](http://dev.w3.org/html5/websockets/).
It also provides an abstraction for handling
@@ -77,8 +77,9 @@ If you need to detect when the WebSocket handshake is complete, you can use the
If the connection's protocol version supports it, you can call `ws.ping()` to
send a ping message and wait for the client's response. This method takes a
message string, and an optional callback that fires when a matching pong message
is received. It returns `true` iff a ping message was sent. If the client does
not support ping/pong, this method sends no data and returns `false`.
is received. It returns `true` if and only if a ping message was sent. If the
client does not support ping/pong, this method sends no data and returns
`false`.
```js
ws.ping('Mic check, one, two', function() {
@@ -129,8 +130,8 @@ var ws = new WebSocket.Client('ws://www.example.com/', [], {
});
```
The `tls` value is a Node 'TLS options' object that will be passed to
[`tls.connect()`](http://nodejs.org/api/tls.html#tls_tls_connect_options_callback).
The `tls` value is an object that will be passed to
[`tls.connect()`](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback).
## Subprotocol negotiation
@@ -197,9 +198,12 @@ var ws = new WebSocket.Client(url, protocols, options);
The client accepts some additional options:
* `proxy` - settings for a proxy as described above
* `tls` - a Node 'TLS options' object containing TLS settings for the origin
server, this will be passed to
[`tls.connect()`](http://nodejs.org/api/tls.html#tls_tls_connect_options_callback)
* `net` - an object containing settings for the origin server that will be
passed to
[`net.connect()`](https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener)
* `tls` - an object containing TLS settings for the origin server, this will be
passed to
[`tls.connect()`](https://nodejs.org/api/tls.html#tls_tls_connect_options_callback)
* `ca` - (legacy) a shorthand for passing `{tls: {ca: value}}`
@@ -221,7 +225,7 @@ Both server- and client-side `WebSocket` objects support the following API.
that closed the connection.
* <b>`send(message)`</b> accepts either a `String` or a `Buffer` and sends a
text or binary message over the connection to the other peer.
* <b>`ping(message = '', function() {})`</b> sends a ping frame with an optional
* <b>`ping(message, function() {})`</b> sends a ping frame with an optional
message and fires the callback when a matching pong is received.
* <b>`close(code, reason)`</b> closes the connection, sending the given status
code and reason text, both of which are optional.
@@ -315,7 +319,7 @@ some data over the wire to keep the connection alive.
(The MIT License)
Copyright (c) 2010-2015 James Coglan
Copyright (c) 2010-2016 James Coglan
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the 'Software'), to deal in
+4 -4
View File
@@ -1,4 +1,4 @@
var WebSocket = require('../lib/faye/websocket'),
var WebSocket = require('..').Client,
deflate = require('permessage-deflate'),
pace = require('pace');
@@ -7,7 +7,7 @@ var host = 'ws://localhost:9001',
cases = 0,
options = {extensions: [deflate]};
var socket = new WebSocket.Client(host + '/getCaseCount'),
var socket = new WebSocket(host + '/getCaseCount'),
url, progress;
socket.onmessage = function(event) {
@@ -19,13 +19,13 @@ socket.onmessage = function(event) {
var runCase = function(n) {
if (n > cases) {
url = host + '/updateReports?agent=' + agent;
socket = new WebSocket.Client(url);
socket = new WebSocket(url);
socket.onclose = process.exit;
return;
}
url = host + '/runCase?case=' + n + '&agent=' + agent;
socket = new WebSocket.Client(url, [], options);
socket = new WebSocket(url, [], options);
socket.pipe(socket);
socket.on('close', function() {
+14 -7
View File
@@ -1,11 +1,18 @@
var WebSocket = require('../lib/faye/websocket'),
fs = require('fs');
var WebSocket = require('..').Client,
deflate = require('permessage-deflate'),
fs = require('fs');
var url = process.argv[2],
headers = {Origin: 'http://faye.jcoglan.com'},
ca = fs.readFileSync(__dirname + '/../spec/server.crt'),
proxy = {origin: process.argv[3], headers: {'User-Agent': 'Echo'}, tls: {ca: ca}},
ws = new WebSocket.Client(url, [], {headers: headers, proxy: proxy, tls: {ca: ca}});
var url = process.argv[2],
proxy = process.argv[3],
ca = fs.readFileSync(__dirname + '/../spec/server.crt'),
tls = {ca: ca};
var ws = new WebSocket(url, [], {
proxy: {origin: proxy, headers: {'User-Agent': 'Echo'}, tls: tls},
tls: tls,
headers: {Origin: 'http://faye.jcoglan.com'},
extensions: [deflate]
});
ws.onopen = function() {
console.log('[open]', ws.headers);
+1 -1
View File
@@ -1,4 +1,4 @@
var WebSocket = require('../lib/faye/websocket'),
var WebSocket = require('..'),
deflate = require('permessage-deflate'),
fs = require('fs'),
http = require('http'),
+11 -3
View File
@@ -92,9 +92,17 @@ var instance = {
return this._driver.ping(message, callback);
},
close: function() {
close: function(code, reason) {
if (code === undefined) code = 1000;
if (reason === undefined) reason = '';
if (code !== 1000 && (code < 3000 || code > 4999))
throw new Error("Failed to execute 'close' on WebSocket: " +
"The code must be either 1000, or between 3000 and 4999. " +
code + " is neither.");
if (this.readyState !== API.CLOSED) this.readyState = API.CLOSING;
this._driver.close();
this._driver.close(reason, code);
},
_configureStream: function() {
@@ -145,12 +153,12 @@ var instance = {
_beginClose: function(reason, code) {
if (this.readyState === API.CLOSED) return;
this.readyState = API.CLOSING;
this._closeParams = [reason, code];
if (this._stream) {
this._stream.end();
if (!this._stream.readable) this._finalizeClose();
}
this._closeParams = [reason, code];
},
_finalizeClose: function() {
+15 -11
View File
@@ -1,7 +1,6 @@
var util = require('util'),
net = require('net'),
tls = require('tls'),
crypto = require('crypto'),
url = require('url'),
driver = require('websocket-driver'),
API = require('./api'),
@@ -23,20 +22,25 @@ var Client = function(_url, protocols, options) {
});
}, this);
var proxy = options.proxy || {},
endpoint = url.parse(proxy.origin || this.url),
port = endpoint.port || DEFAULT_PORTS[endpoint.protocol],
secure = SECURE_PROTOCOLS.indexOf(endpoint.protocol) >= 0,
onConnect = function() { self._onConnect() },
originTLS = options.tls || {},
socketTLS = proxy.origin ? (proxy.tls || {}) : originTLS,
self = this;
var proxy = options.proxy || {},
endpoint = url.parse(proxy.origin || this.url),
port = endpoint.port || DEFAULT_PORTS[endpoint.protocol],
secure = SECURE_PROTOCOLS.indexOf(endpoint.protocol) >= 0,
onConnect = function() { self._onConnect() },
netOptions = options.net || {},
originTLS = options.tls || {},
socketTLS = proxy.origin ? (proxy.tls || {}) : originTLS,
self = this;
netOptions.host = socketTLS.host = endpoint.hostname;
netOptions.port = socketTLS.port = port;
originTLS.ca = originTLS.ca || options.ca;
socketTLS.servername = socketTLS.servername || endpoint.hostname;
this._stream = secure
? tls.connect(port, endpoint.hostname, socketTLS, onConnect)
: net.connect(port, endpoint.hostname, onConnect);
? tls.connect(socketTLS, onConnect)
: net.connect(netOptions, onConnect);
if (proxy.origin) this._configureProxy(proxy, originTLS);
+4 -4
View File
@@ -1,12 +1,12 @@
{ "name" : "faye-websocket"
, "description" : "Standards-compliant WebSocket server and client"
, "homepage" : "http://github.com/faye/faye-websocket-node"
, "homepage" : "https://github.com/faye/faye-websocket-node"
, "author" : "James Coglan <jcoglan@gmail.com> (http://jcoglan.com/)"
, "keywords" : ["websocket", "eventsource"]
, "license" : "MIT"
, "version" : "0.9.4"
, "engines" : {"node": ">=0.4.0"}
, "version" : "0.11.0"
, "engines" : {"node": ">=0.8.0"}
, "main" : "./lib/faye/websocket"
, "dependencies" : {"websocket-driver": ">=0.5.1"}
, "devDependencies" : {"jstest": "", "pace": "", "permessage-deflate": ""}
@@ -17,5 +17,5 @@
, "url" : "git://github.com/faye/faye-websocket-node.git"
}
, "bugs" : "http://github.com/faye/faye-websocket-node/issues"
, "bugs" : "https://github.com/faye/faye-websocket-node/issues"
}
+5 -2
View File
@@ -73,8 +73,11 @@ var WebSocketSteps = test.asyncSteps({
this._ws.close()
},
check_open: function(callback) {
check_open: function(status, headers, callback) {
this.assert( this._open )
this.assertEqual( status, this._ws.statusCode )
for (var name in headers)
this.assertEqual( headers[name], this._ws.headers[name.toLowerCase()] )
callback()
},
@@ -154,7 +157,7 @@ test.describe("Client", function() { with(this) {
sharedBehavior("socket client", function() { with(this) {
it("can open a connection", function() { with(this) {
open_socket(socket_url, protocols)
check_open()
check_open(101, {"Upgrade": "websocket"})
check_protocol("echo")
}})
+11 -12
View File
@@ -1,14 +1,13 @@
-----BEGIN CERTIFICATE-----
MIICIzCCAYwCCQDZaunNGmqaHjANBgkqhkiG9w0BAQUFADBWMQswCQYDVQQGEwJH
QjETMBEGA1UECBMKU29tZS1TdGF0ZTEPMA0GA1UEBxMGTG9uZG9uMQ0wCwYDVQQK
EwRGYXllMRIwEAYDVQQDEwlsb2NhbGhvc3QwHhcNMTQwNjIxMDkzNjAyWhcNMTUw
NjIxMDkzNjAyWjBWMQswCQYDVQQGEwJHQjETMBEGA1UECBMKU29tZS1TdGF0ZTEP
MA0GA1UEBxMGTG9uZG9uMQ0wCwYDVQQKEwRGYXllMRIwEAYDVQQDEwlsb2NhbGhv
c3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANc64/S51F2OVw1IGZql483S
sUf7QiuHyHCYxeHB8CeTKXyaH5h3ITmmqjzT5MWgTYuXf39XRf2VqicLWqs0xIAc
RKBE1VouLM0sbNzMv1yNG7im0bMywXNlOlOmUhtjYZvEx5I10UiJrVxIpEnNiCuZ
dgCuB944l/lQrndkaqWtAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEA1UmNwUA7KVaU
jg3iofsr0UgFCNO9sZ6PeEoh6NETrckhYd1TB3S7QAgHMiu4e8cEVnlYyIm6oJnp
l5edfaUHh3PGwt5jLzpg/l+OVT5qkixRJdazx+pd/CFYIgot2+7hEao9NC4GV1Tl
yR0IxlKRsQO3iZlpe7/Klqjaq/r9tQM=
MIIB+TCCAWICCQDQSYOsy9QdQzANBgkqhkiG9w0BAQUFADBBMQswCQYDVQQGEwJV
SzEPMA0GA1UECBMGTG9uZG9uMQ0wCwYDVQQKEwRGYXllMRIwEAYDVQQDEwlsb2Nh
bGhvc3QwHhcNMTUwNjIyMTAxNjUxWhcNMTYwNjIxMTAxNjUxWjBBMQswCQYDVQQG
EwJVSzEPMA0GA1UECBMGTG9uZG9uMQ0wCwYDVQQKEwRGYXllMRIwEAYDVQQDEwls
b2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM8rbhbRDJlVsXdJ
zP4QmQFTXZASd9P/rkxLM1J20N64YSNvaKsX4T/lq/detzMxfP82SKoHN3ItTIyI
/DiSRWRQVfQ0f9m3xEPpbyvyHViyzRayy+xPGoqC27yTd+03KtMi8w/BrKUqDwFO
xwmFPLxsOsBvcUztzKt/4GPao3htAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAALfl
U2nO8N8KTziEsJkLc6JV5jGCoUQnhttsq6l07fZpTpX9nuF8tKhZ2jSNL5DntAqm
M48g9rKd4wKp6IsPa66bkp/6u9k6hL2EhSWQTI7ii5Ap6u649XMB/lTEY4ZK/OGn
dnWXbPWznhgi30ROUzxUCev+yRVdlgLBJFerXzk=
-----END CERTIFICATE-----
+13 -13
View File
@@ -1,15 +1,15 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDXOuP0udRdjlcNSBmapePN0rFH+0Irh8hwmMXhwfAnkyl8mh+Y
dyE5pqo80+TFoE2Ll39/V0X9laonC1qrNMSAHESgRNVaLizNLGzczL9cjRu4ptGz
MsFzZTpTplIbY2GbxMeSNdFIia1cSKRJzYgrmXYArgfeOJf5UK53ZGqlrQIDAQAB
AoGBAK8U+NrbUCXK5IWpYSqsR+PmwNANVIaUrjjqDg7X9MQ8skLqHUmpnx2GtnVE
6ZTaEjq7wruUAxuF5CRe2CLtieouaLvF/gcAsff2Q4kL8taDrM54ECC69JFfijE4
jJfEkoJRi1B0nq2QxJke3Sm3vrW2zLDqAZ4EUIh3uxXIYgcBAkEA+imv190S+bCM
3H/3L5LHeTRwL58HWcYYjx+/K85yaCqf4wrwyYQ1jRho76uqkjq1mvL65nOniIxd
NRnLTiQ+jwJBANxAiY4ww16fUkBGBh2np0FfDUhWgk5G5aZWHsK+5SJZXvlV0kmn
kf2R+8hEzAAaOh3Y4d4UBXzOZCKh0nxYdgMCQQCNsQ7oNU+KHXWrbs+TIo/ZFtp0
Hp8LOiiu6Exfg49JcNsevhOkED5ErI7DMXhrWtWB7h4uaVN7BAXHDdUZbW4BAkAp
Yys1/+3GaxPOphniGq3wN8dML41e3i2rOwWevLZb5QVWvwy78HQbfQIeGOdooYUI
NMgErih10ma4p0XhPdI3AkBFp830jNItVGZtVvNRmtx2AR370qMs+AwFTK76mcMW
xysAGnAUv7h6Qx+M6b3He8OcWVMNqMiv8yI/o2PnsvUS
MIICXQIBAAKBgQDPK24W0QyZVbF3Scz+EJkBU12QEnfT/65MSzNSdtDeuGEjb2ir
F+E/5av3XrczMXz/NkiqBzdyLUyMiPw4kkVkUFX0NH/Zt8RD6W8r8h1Yss0Wssvs
TxqKgtu8k3ftNyrTIvMPwaylKg8BTscJhTy8bDrAb3FM7cyrf+Bj2qN4bQIDAQAB
AoGBAJym5nPyV2iK18qvz4Y93rSV6SXMETgJGi8unfw5Q+9l1G4LDEZzpCvA66v9
vuHDBhWlYoTPOCnp/vw1iSLt1/GJw62Hou8ewWJ/lrhiGHONwSWdWFV+G0juSXp/
yNos8ZvqOn8l67uremEIqsNqOZ3hJXKauEp4i1OF7W4y+Q6xAkEA891VfTKtL1yQ
5uLu+8drzXc9NVLnG0VVKZGg5sCfqhmijklcG7kdfNW66ujsVs3MlROsfPmC1k6B
OQN7i3h0lwJBANl6oMPnXxEnSOCSG1Ff6wEKnfdl3wuI9w+XTYd2jdi3oTffEYU0
l1KvtyfcpX5K254FhY3c86RI2l1XAeN5R5sCQBsqzCxPafW9xTLDk0YfWEYig4Ie
QzrJhYxE+fza9q6XfoGFcKpx+/P9R36GBlZBRQpSj8O4dDf1tPWqCqhl+e8CQCTp
/6fA+g37UQ9tPV3OniELIE0B6Z4XnXf0AqDfqqwCX0cQgfTOPHE4iiol9aE+K5Di
9wxhWKmmBAqb3iIyT8kCQQCtZiSOAu75DZdufUDUoAXCXPOwxga3Km+FoloRkp5e
O2fJKycb9tnoeMvXqLHBV7FjKH+9fPfOnKpPSETWho+8
-----END RSA PRIVATE KEY-----