Compare commits

..

34 Commits

Author SHA1 Message Date
James Coglan d21a41330c Remove jstest copy of nopt, which will not run on Node <= v12 2023-09-07 19:19:31 +01:00
James Coglan 4983d151c4 Update TLS certificates 2023-09-07 18:59:44 +01:00
James Coglan 3c711fc376 Test on recent Node versions 2023-09-07 18:49:05 +01:00
James Coglan e9722f4a2f Don't pass events to process.exit(), which is an error in Node v20 2023-09-07 18:48:18 +01:00
James Coglan f1f48e6c23 Use 0.0.0.0 in Autobahn example because localhost does not seem to work on Node v18 2023-09-07 18:47:42 +01:00
James Coglan eae09c0780 Remove .npmignore 2021-05-24 23:28:02 +01:00
James Coglan 0528a5d4bd Bump version to 0.11.4 2021-05-24 23:08:15 +01:00
James Coglan fff2a43d63 Update the test TLS certificate 2021-05-18 22:15:00 +01:00
James Coglan 46806f86f4 Switch from Travis CI to GitHub Actions 2021-05-18 22:12:42 +01:00
James Coglan 32af9bb353 Travis update: cache npm modules, remove sudo, run on Node 15 2021-03-12 21:36:08 +00:00
James Coglan 6b66c9fd9d Merge branch 'fix-double-close' 2021-03-12 17:01:26 +00:00
James Coglan 98ddef1e9a Test on Node.js version 15 2021-03-12 17:01:15 +00:00
John Lees-Miller e316a82f86 Fix hang on double close 2021-03-12 16:57:24 +00:00
James Coglan 0be69bd810 Update the TLS certificate 2020-05-14 17:47:36 +01:00
James Coglan b1c5f9049f Add Node versions 13 and 14 on Travis 2020-05-14 17:19:07 +01:00
James Coglan 3eb0a395f3 Mention license change in the changelog 2019-06-13 11:40:24 +01:00
James Coglan f878a91eb5 Formatting change: {...} should have spaces inside the braces 2019-06-11 16:02:47 +01:00
James Coglan a2d1fa84e4 Bump version to 0.11.3 2019-06-10 12:32:02 +01:00
James Coglan 4f31ad9851 Set the 'files' attribute in package.json 2019-06-10 12:31:15 +01:00
James Coglan e27ce57c48 Bump version to 0.11.2 2019-06-10 12:27:56 +01:00
James Coglan eb6fac855c Let npm reformat package.json 2019-06-10 12:25:35 +01:00
James Coglan 4009b68a43 Switch license to Apache 2.0 2019-06-10 06:33:20 +01:00
James Coglan 063a1362df Remove the Autobahn link from the readme 2019-06-07 00:30:30 +01:00
James Coglan b4dc4e1411 Merge pull request #65 from lpinca/gh-64
Set close timer before closing the driver.
2019-05-29 16:01:28 +01:00
James Coglan ccaa8ea76e Change markdown formatting of docs. 2019-05-29 15:36:45 +01:00
James Coglan 17fae3cc5c Merge pull request #72 from arnaud16571542/patch-1
Create LICENSE
2019-05-29 14:25:01 +01:00
James Coglan 8e9f7923ad Update Travis target versions. 2019-05-28 23:16:09 +01:00
James Coglan acc3ea9795 Put all source files in strict mode. 2019-05-28 23:13:08 +01:00
arnaud16571542 01cdfb18db Create LICENSE 2019-03-03 09:41:09 +01:00
James Coglan 2634e930f9 Update the self-signed SSL certificates. 2018-07-26 11:08:56 +01:00
Luigi Pinca 5f3e939518 Set close timer before closing the driver.
Fixes: https://github.com/faye/faye-websocket-node/issues/64
2017-10-04 17:34:37 +02:00
James Coglan b85f22e43b Drop testing for io.js releases, which barely anybody is still using. 2017-08-01 23:48:34 +01:00
James Coglan 1f439f6e9c Test on Node 8. 2017-08-01 00:52:04 +01:00
James Coglan 4b667a1ba5 Formatting tweaks to package.json. 2017-08-01 00:49:18 +01:00
22 changed files with 276 additions and 212 deletions
+41
View File
@@ -0,0 +1,41 @@
on:
- push
- pull_request
jobs:
test:
strategy:
fail-fast: false
matrix:
node:
- '0.8'
- '0.10'
- '0.12'
- '4'
- '6'
- '8'
- '10'
- '12'
- '14'
- '16'
- '18'
- '20'
name: node.js v${{ matrix.node }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node }}
- if: matrix.node == '0.8'
run: npm conf set strict-ssl false
- run: node --version
- run: npm install
- run: npm install 'nopt@5'
- run: rm -rf node_modules/jstest/node_modules/nopt
- run: npm test
+1
View File
@@ -1 +1,2 @@
node_modules
package-lock.json
-6
View File
@@ -1,6 +0,0 @@
.git
.gitignore
.npmignore
.travis.yml
node_modules
spec
-17
View File
@@ -1,17 +0,0 @@
sudo: false
language: node_js
node_js:
- "0.8"
- "0.10"
- "0.12"
- "iojs-1"
- "iojs-2"
- "iojs-3"
- "4"
- "5"
- "6"
- "7"
before_install:
- '[ "${TRAVIS_NODE_VERSION}" != "0.8" ] || npm install -g npm@~1.4.0'
+55 -40
View File
@@ -1,124 +1,139 @@
### 0.11.4 / 2021-05-24
- Prevent the client hanging if `close()` is called when already closing
### 0.11.3 / 2019-06-10
- Fix a race condition that caused a timeout not to be cancelled immediately
when the WebSocket is closed
- Change license from MIT to Apache 2.0
### 0.11.2 / 2019-06-10
(This version was pulled due to an error when publishing)
### 0.11.1 / 2017-01-22
* Forcibly close the I/O stream after a timeout if the peer does not respond
- Forcibly close the I/O stream after a timeout if the peer does not respond
after calling `close()`
### 0.11.0 / 2016-02-24
* Introduce a `net` option to the `Client` class for setting things like, say, `servername`
- 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
- 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
- Don't send input to the driver before `start()` is called
### 0.9.3 / 2015-02-19
* Make sure the TCP socket is not left open when closing the connection
- Make sure the TCP socket is not left open when closing the connection
### 0.9.2 / 2014-12-21
* Only emit `error` once, and don't emit it after `close`
- Only emit `error` once, and don't emit it after `close`
### 0.9.1 / 2014-12-18
* Check that all options to the WebSocket constructor are recognized
- Check that all options to the WebSocket constructor are recognized
### 0.9.0 / 2014-12-13
* Allow protocol extensions to be passed into websocket-extensions
- Allow protocol extensions to be passed into websocket-extensions
### 0.8.1 / 2014-11-12
* Send the correct hostname when upgrading a connection to TLS
- Send the correct hostname when upgrading a connection to TLS
### 0.8.0 / 2014-11-08
* Support connections via HTTP proxies
* Close the connection cleanly if we're still waiting for a handshake response
- Support connections via HTTP proxies
- Close the connection cleanly if we're still waiting for a handshake response
### 0.7.3 / 2014-10-04
* Allow sockets to be closed when they are in any state other than `CLOSED`
- Allow sockets to be closed when they are in any state other than `CLOSED`
### 0.7.2 / 2013-12-29
* Make sure the `close` event is emitted by clients on Node v0.10
- Make sure the `close` event is emitted by clients on Node v0.10
### 0.7.1 / 2013-12-03
* Support the `maxLength` websocket-driver option
* Make the client emit `error` events on network errors
- Support the `maxLength` websocket-driver option
- Make the client emit `error` events on network errors
### 0.7.0 / 2013-09-09
* Allow the server to send custom headers with EventSource responses
- Allow the server to send custom headers with EventSource responses
### 0.6.1 / 2013-07-05
* Add `ca` option to the client for specifying certificate authorities
* Start the server driver asynchronously so that `onopen` handlers can be added
- Add `ca` option to the client for specifying certificate authorities
- Start the server driver asynchronously so that `onopen` handlers can be added
### 0.6.0 / 2013-05-12
* Add support for custom headers
- Add support for custom headers
### 0.5.0 / 2013-05-05
* Extract the protocol handlers into the `websocket-driver` library
* Support the Node streaming API
- Extract the protocol handlers into the `websocket-driver` library
- Support the Node streaming API
### 0.4.4 / 2013-02-14
* Emit the `close` event if TCP is closed before CLOSE frame is acked
- Emit the `close` event if TCP is closed before CLOSE frame is acked
### 0.4.3 / 2012-07-09
* Add `Connection: close` to EventSource response
* Handle situations where `request.socket` is undefined
- Add `Connection: close` to EventSource response
- Handle situations where `request.socket` is undefined
### 0.4.2 / 2012-04-06
* Add WebSocket error code `1011`.
* Handle URLs with no path correctly by sending `GET /`
- Add WebSocket error code `1011`.
- Handle URLs with no path correctly by sending `GET /`
### 0.4.1 / 2012-02-26
* Treat anything other than a `Buffer` as a string when calling `send()`
- Treat anything other than a `Buffer` as a string when calling `send()`
### 0.4.0 / 2012-02-13
* Add `ping()` method to server-side `WebSocket` and `EventSource`
* Buffer `send()` calls until the draft-76 handshake is complete
* Fix HTTPS problems on Node 0.7
- Add `ping()` method to server-side `WebSocket` and `EventSource`
- Buffer `send()` calls until the draft-76 handshake is complete
- Fix HTTPS problems on Node 0.7
### 0.3.1 / 2012-01-16
* Call `setNoDelay(true)` on `net.Socket` objects to reduce latency
- Call `setNoDelay(true)` on `net.Socket` objects to reduce latency
### 0.3.0 / 2012-01-13
* Add support for `EventSource` connections
- Add support for `EventSource` connections
### 0.2.0 / 2011-12-21
* Add support for `Sec-WebSocket-Protocol` negotiation
* Support `hixie-76` close frames and 75/76 ignored segments
* Improve performance of HyBi parsing/framing functions
* Decouple parsers from TCP and reduce write volume
- Add support for `Sec-WebSocket-Protocol` negotiation
- Support `hixie-76` close frames and 75/76 ignored segments
- Improve performance of HyBi parsing/framing functions
- Decouple parsers from TCP and reduce write volume
### 0.1.2 / 2011-12-05
* Detect closed sockets on the server side when TCP connection breaks
* Make `hixie-76` sockets work through HAProxy
- Detect closed sockets on the server side when TCP connection breaks
- Make `hixie-76` sockets work through HAProxy
### 0.1.1 / 2011-11-30
* Fix `addEventListener()` interface methods
- Fix `addEventListener()` interface methods
### 0.1.0 / 2011-11-27
* Initial release, based on WebSocket components from Faye
- Initial release, based on WebSocket components from Faye
+12
View File
@@ -0,0 +1,12 @@
Copyright 2010-2021 James Coglan
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
+44 -73
View File
@@ -1,10 +1,5 @@
# faye-websocket
* Travis CI build: [![Build
status](https://secure.travis-ci.org/faye/faye-websocket-node.svg)](http://travis-ci.org/faye/faye-websocket-node)
* Autobahn tests: [server](http://faye.jcoglan.com/autobahn/servers/),
[client](http://faye.jcoglan.com/autobahn/clients/)
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
@@ -43,11 +38,11 @@ var server = http.createServer();
server.on('upgrade', function(request, socket, body) {
if (WebSocket.isWebSocket(request)) {
var ws = new WebSocket(request, socket, body);
ws.on('message', function(event) {
ws.send(event.data);
});
ws.on('close', function(event) {
console.log('close', event.code, event.reason);
ws = null;
@@ -125,8 +120,8 @@ require. Only the `origin` setting is required.
var ws = new WebSocket.Client('ws://www.example.com/', [], {
proxy: {
origin: 'http://username:password@proxy.example.com',
headers: {'User-Agent': 'node'},
tls: {cert: fs.readFileSync('client.crt')}
headers: { 'User-Agent': 'node' },
tls: { cert: fs.readFileSync('client.crt') }
}
});
```
@@ -169,7 +164,7 @@ array of extensions to the `:extensions` option. For example, to add
```js
var deflate = require('permessage-deflate');
var ws = new WebSocket(request, socket, body, [], {extensions: [deflate]});
var ws = new WebSocket(request, socket, body, [], { extensions: [deflate] });
```
@@ -186,53 +181,53 @@ var ws = new WebSocket.Client(url, protocols, options);
`protocols` is an array of subprotocols as described above, or `null`.
`options` is an optional object containing any of these fields:
* `extensions` - an array of
- `extensions` - an array of
[websocket-extensions](https://github.com/faye/websocket-extensions-node)
compatible extensions, as described above
* `headers` - an object containing key-value pairs representing HTTP headers to
- `headers` - an object containing key-value pairs representing HTTP headers to
be sent during the handshake process
* `maxLength` - the maximum allowed size of incoming message frames, in bytes.
- `maxLength` - the maximum allowed size of incoming message frames, in bytes.
The default value is `2^26 - 1`, or 1 byte short of 64 MiB.
* `ping` - an integer that sets how often the WebSocket should send ping frames,
- `ping` - an integer that sets how often the WebSocket should send ping frames,
measured in seconds
The client accepts some additional options:
* `proxy` - settings for a proxy as described above
* `net` - an object containing settings for the origin server that will be
- `proxy` - settings for a proxy as described above
- `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
- `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}}`
- `ca` - (legacy) a shorthand for passing `{ tls: { ca: value } }`
## WebSocket API
Both server- and client-side `WebSocket` objects support the following API.
* <b>`on('open', function(event) {})`</b> fires when the socket connection is
- **`on('open', function(event) {})`** fires when the socket connection is
established. Event has no attributes.
* <b>`on('message', function(event) {})`</b> fires when the socket receives a
message. Event has one attribute, <b>`data`</b>, which is either a `String`
(for text frames) or a `Buffer` (for binary frames).
* <b>`on('error', function(event) {})`</b> fires when there is a protocol error
due to bad data sent by the other peer. This event is purely informational,
you do not need to implement error recover.
* <b>`on('close', function(event) {})`</b> fires when either the client or the
server closes the connection. Event has two optional attributes, <b>`code`</b>
and <b>`reason`</b>, that expose the status code and message sent by the peer
- **`on('message', function(event) {})`** fires when the socket receives a
message. Event has one attribute, **`data`**, which is either a `String` (for
text frames) or a `Buffer` (for binary frames).
- **`on('error', function(event) {})`** fires when there is a protocol error due
to bad data sent by the other peer. This event is purely informational, you do
not need to implement error recover.
- **`on('close', function(event) {})`** fires when either the client or the
server closes the connection. Event has two optional attributes, **`code`**
and **`reason`**, that expose the status code and message sent by the peer
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
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.
* <b>`version`</b> is a string containing the version of the `WebSocket`
protocol the connection is using.
* <b>`protocol`</b> is a string (which may be empty) identifying the subprotocol
- **`send(message)`** accepts either a `String` or a `Buffer` and sends a text
or binary message over the connection to the other peer.
- **`ping(message, function() {})`** sends a ping frame with an optional message
and fires the callback when a matching pong is received.
- **`close(code, reason)`** closes the connection, sending the given status code
and reason text, both of which are optional.
- **`version`** is a string containing the version of the `WebSocket` protocol
the connection is using.
- **`protocol`** is a string (which may be empty) identifying the subprotocol
the socket is using.
@@ -254,18 +249,18 @@ server.on('request', function(request, response) {
if (EventSource.isEventSource(request)) {
var es = new EventSource(request, response);
console.log('open', es.url, es.lastEventId);
// Periodically send messages
var loop = setInterval(function() { es.send('Hello') }, 1000);
es.on('close', function() {
clearInterval(loop);
es = null;
});
} else {
// Normal HTTP request
response.writeHead(200, {'Content-Type': 'text/plain'});
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.end('Hello');
}
});
@@ -278,25 +273,25 @@ event-type is `'message'` with no ID. For example, to send a `notification`
event with ID `99`:
```js
es.send('Breaking News!', {event: 'notification', id: '99'});
es.send('Breaking News!', { event: 'notification', id: '99' });
```
The `EventSource` object exposes the following properties:
* <b>`url`</b> is a string containing the URL the client used to create the
- **`url`** is a string containing the URL the client used to create the
EventSource.
* <b>`lastEventId`</b> is a string containing the last event ID received by the
- **`lastEventId`** is a string containing the last event ID received by the
client. You can use this when the client reconnects after a dropped connection
to determine which messages need resending.
When you initialize an EventSource with ` new EventSource()`, you can pass
configuration options after the `response` parameter. Available options are:
* <b>`headers`</b> is an object containing custom headers to be set on the
- **`headers`** is an object containing custom headers to be set on the
EventSource response.
* <b>`retry`</b> is a number that tells the client how long (in seconds) it
should wait after a dropped connection before attempting to reconnect.
* <b>`ping`</b> is a number that tells the server how often (in seconds) to send
- **`retry`** is a number that tells the client how long (in seconds) it should
wait after a dropped connection before attempting to reconnect.
- **`ping`** is a number that tells the server how often (in seconds) to send
'ping' packets to the client to keep the connection open, to defeat timeouts
set by proxies. The client will ignore these messages.
@@ -305,7 +300,7 @@ every 15 seconds and is retryable every 10 seconds if the connection is broken:
```js
var es = new EventSource(request, response, {
headers: {'Access-Control-Allow-Origin': '*'},
headers: { 'Access-Control-Allow-Origin': '*' },
ping: 15,
retry: 10
});
@@ -314,27 +309,3 @@ var es = new EventSource(request, response, {
You can send a ping message at any time by calling `es.ping()`. Unlike
WebSocket, the client does not send a response to this; it is merely to send
some data over the wire to keep the connection alive.
## License
(The MIT License)
Copyright (c) 2010-2017 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
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+3 -3
View File
@@ -2,10 +2,10 @@ var WebSocket = require('..').Client,
deflate = require('permessage-deflate'),
pace = require('pace');
var host = 'ws://localhost:9001',
var host = 'ws://0.0.0.0:9001',
agent = encodeURIComponent('node-' + process.version),
cases = 0,
options = {extensions: [deflate]};
options = { extensions: [deflate] };
var socket = new WebSocket(host + '/getCaseCount'),
url, progress;
@@ -20,7 +20,7 @@ var runCase = function(n) {
if (n > cases) {
url = host + '/updateReports?agent=' + agent;
socket = new WebSocket(url);
socket.onclose = process.exit;
socket.onclose = function() { process.exit() };
return;
}
+3 -3
View File
@@ -5,12 +5,12 @@ var WebSocket = require('..').Client,
var url = process.argv[2],
proxy = process.argv[3],
ca = fs.readFileSync(__dirname + '/../spec/server.crt'),
tls = {ca: ca};
tls = { ca: ca };
var ws = new WebSocket(url, [], {
proxy: {origin: proxy, headers: {'User-Agent': 'Echo'}, tls: tls},
proxy: { origin: proxy, headers: { 'User-Agent': 'Echo' }, tls: tls },
tls: tls,
headers: {Origin: 'http://faye.jcoglan.com'},
headers: { Origin: 'http://faye.jcoglan.com' },
extensions: [deflate]
});
+1 -1
View File
@@ -2,6 +2,6 @@ var ProxyServer = require('../spec/proxy_server');
var port = process.argv[2],
secure = process.argv[3] === 'tls',
proxy = new ProxyServer({debug: true, tls: secure});
proxy = new ProxyServer({ debug: true, tls: secure });
proxy.listen(port);
+4 -4
View File
@@ -6,7 +6,7 @@ var WebSocket = require('..'),
var port = process.argv[2] || 7000,
secure = process.argv[3] === 'tls',
options = {extensions: [deflate], ping: 5};
options = { extensions: [deflate], ping: 5 };
var upgradeHandler = function(request, socket, head) {
var ws = new WebSocket(request, socket, head, ['irc', 'xmpp'], options);
@@ -33,11 +33,11 @@ var requestHandler = function(request, response) {
time += 1;
es.send('Time: ' + time);
setTimeout(function() {
if (es) es.send('Update!!', {event: 'update', id: time});
if (es) es.send('Update!!', { event: 'update', id: time });
}, 1000);
}, 2000);
fs.createReadStream(__dirname + '/haproxy.conf').pipe(es, {end: false});
fs.createReadStream(__dirname + '/haproxy.conf').pipe(es, { end: false });
es.onclose = function() {
clearInterval(loop);
@@ -51,7 +51,7 @@ var staticHandler = function(request, response) {
fs.readFile(__dirname + path, function(err, content) {
var status = err ? 404 : 200;
response.writeHead(status, {'Content-Type': 'text/html'});
response.writeHead(status, { 'Content-Type': 'text/html' });
response.write(content || 'Not found');
response.end();
});
+2
View File
@@ -1,3 +1,5 @@
'use strict';
var Stream = require('stream').Stream,
util = require('util'),
driver = require('websocket-driver'),
+3 -1
View File
@@ -4,6 +4,8 @@
// * https://dom.spec.whatwg.org/#interface-eventtarget
// * https://dom.spec.whatwg.org/#interface-event
'use strict';
var util = require('util'),
driver = require('websocket-driver'),
API = require('./websocket/api');
@@ -12,7 +14,7 @@ var WebSocket = function(request, socket, body, protocols, options) {
options = options || {};
this._stream = socket;
this._driver = driver.http(request, {maxLength: options.maxLength, protocols: protocols});
this._driver = driver.http(request, { maxLength: options.maxLength, protocols: protocols });
var self = this;
if (!this._stream || !this._stream.writable) return;
+14 -10
View File
@@ -1,3 +1,5 @@
'use strict';
var Stream = require('stream').Stream,
util = require('util'),
driver = require('websocket-driver'),
@@ -103,14 +105,16 @@ var instance = {
"The code must be either 1000, or between 3000 and 4999. " +
code + " is neither.");
if (this.readyState < API.CLOSING) {
var self = this;
this._closeTimer = setTimeout(function() {
self._beginClose('', 1006);
}, API.CLOSE_TIMEOUT);
}
if (this.readyState !== API.CLOSED) this.readyState = API.CLOSING;
this._driver.close(reason, code);
var self = this;
this._closeTimer = setTimeout(function() {
self._beginClose('', 1006);
}, API.CLOSE_TIMEOUT);
},
_configureStream: function() {
@@ -129,7 +133,7 @@ var instance = {
});
},
_open: function() {
_open: function() {
if (this.readyState !== API.CONNECTING) return;
this.readyState = API.OPEN;
@@ -145,7 +149,7 @@ var instance = {
if (this.readable) this.emit('data', data);
var event = new Event('message', {data: data});
var event = new Event('message', { data: data });
event.initEvent('message', false, false);
this.dispatchEvent(event);
},
@@ -153,7 +157,7 @@ var instance = {
_emitError: function(message) {
if (this.readyState >= API.CLOSING) return;
var event = new Event('error', {message: message});
var event = new Event('error', { message: message });
event.initEvent('error', false, false);
this.dispatchEvent(event);
},
@@ -183,7 +187,7 @@ var instance = {
var reason = this._closeParams ? this._closeParams[0] : '',
code = this._closeParams ? this._closeParams[1] : 1006;
var event = new Event('close', {code: code, reason: reason});
var event = new Event('close', { code: code, reason: reason });
event.initEvent('close', false, false);
this.dispatchEvent(event);
}
+2
View File
@@ -1,3 +1,5 @@
'use strict';
var Event = function(eventType, options) {
this.type = eventType;
for (var key in options)
+2
View File
@@ -1,3 +1,5 @@
'use strict';
var Event = require('./event');
var EventTarget = {
+6 -4
View File
@@ -1,3 +1,5 @@
'use strict';
var util = require('util'),
net = require('net'),
tls = require('tls'),
@@ -6,14 +8,14 @@ var util = require('util'),
API = require('./api'),
Event = require('./api/event');
var DEFAULT_PORTS = {'http:': 80, 'https:': 443, 'ws:':80, 'wss:': 443},
var DEFAULT_PORTS = { 'http:': 80, 'https:': 443, 'ws:':80, 'wss:': 443 },
SECURE_PROTOCOLS = ['https:', 'wss:'];
var Client = function(_url, protocols, options) {
options = options || {};
this.url = _url;
this._driver = driver.client(this.url, {maxLength: options.maxLength, protocols: protocols});
this._driver = driver.client(this.url, { maxLength: options.maxLength, protocols: protocols });
['open', 'error'].forEach(function(event) {
this._driver.on(event, function() {
@@ -65,12 +67,12 @@ Client.prototype._configureProxy = function(proxy, originTLS) {
for (name in proxy.headers) this._proxy.setHeader(name, proxy.headers[name]);
}
this._proxy.pipe(this._stream, {end: false});
this._proxy.pipe(this._stream, { end: false });
this._stream.pipe(this._proxy);
this._proxy.on('connect', function() {
if (secure) {
var options = {socket: self._stream, servername: uri.hostname};
var options = { socket: self._stream, servername: uri.hostname };
for (name in originTLS) options[name] = originTLS[name];
self._stream = tls.connect(options);
self._configureStream();
+34 -20
View File
@@ -1,21 +1,35 @@
{ "name" : "faye-websocket"
, "description" : "Standards-compliant WebSocket server and client"
, "homepage" : "https://github.com/faye/faye-websocket-node"
, "author" : "James Coglan <jcoglan@gmail.com> (http://jcoglan.com/)"
, "keywords" : ["websocket", "eventsource"]
, "license" : "MIT"
, "version" : "0.11.1"
, "engines" : {"node": ">=0.8.0"}
, "main" : "./lib/faye/websocket"
, "dependencies" : {"websocket-driver": ">=0.5.1"}
, "devDependencies" : {"jstest": "", "pace": "", "permessage-deflate": ""}
, "scripts" : {"test": "jstest spec/runner.js"}
, "repository" : { "type" : "git"
, "url" : "git://github.com/faye/faye-websocket-node.git"
}
, "bugs" : "https://github.com/faye/faye-websocket-node/issues"
{
"name": "faye-websocket",
"description": "Standards-compliant WebSocket server and client",
"homepage": "https://github.com/faye/faye-websocket-node",
"author": "James Coglan <jcoglan@gmail.com> (http://jcoglan.com/)",
"keywords": [
"websocket",
"eventsource"
],
"license": "Apache-2.0",
"version": "0.11.4",
"engines": {
"node": ">=0.8.0"
},
"files": [
"lib"
],
"main": "./lib/faye/websocket",
"dependencies": {
"websocket-driver": ">=0.5.1"
},
"devDependencies": {
"jstest": "*",
"pace": "*",
"permessage-deflate": "*"
},
"scripts": {
"test": "jstest spec/runner.js"
},
"repository": {
"type": "git",
"url": "git://github.com/faye/faye-websocket-node.git"
},
"bugs": "https://github.com/faye/faye-websocket-node/issues"
}
+2 -2
View File
@@ -17,7 +17,7 @@ var WebSocketSteps = test.asyncSteps({
},
proxy: function(port, secure, callback) {
this._proxyServer = new ProxyServer({tls: secure})
this._proxyServer = new ProxyServer({ tls: secure })
this._proxyServer.listen(port)
process.nextTick(callback)
},
@@ -157,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(101, {"Upgrade": "websocket"})
check_open(101, { "Upgrade": "websocket" })
check_protocol("echo")
}})
+2 -2
View File
@@ -4,8 +4,8 @@ var fs = require('fs'),
net = require('net'),
url = require('url');
var AGENTS = {'http:': http, 'https:': https},
PORTS = {'http:': 80, 'https:': 443};
var AGENTS = { 'http:': http, 'https:': https },
PORTS = { 'http:': 80, 'https:': 443 };
var ProxyServer = function(options) {
var proxy = options.tls
+17 -11
View File
@@ -1,13 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIB+TCCAWICCQDr4AAn4L7GeDANBgkqhkiG9w0BAQUFADBBMQswCQYDVQQGEwJV
SzEPMA0GA1UECBMGTG9uZG9uMQ0wCwYDVQQKEwRGYXllMRIwEAYDVQQDEwlsb2Nh
bGhvc3QwHhcNMTYxMjI5MTEyNTA2WhcNMTcxMjI5MTEyNTA2WjBBMQswCQYDVQQG
EwJVSzEPMA0GA1UECBMGTG9uZG9uMQ0wCwYDVQQKEwRGYXllMRIwEAYDVQQDEwls
b2NhbGhvc3QwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALqXLvze/oYkelPw
uT+eI2bkk6QDyB9h3pRW5m53F4W7rZybRT+NvzlTWU27K6XxbMA6V50hVU7evIgk
Mh3vsFIXNFHFW0Li/hZdmgE7Tle853cxB9uVI3WtP5ju14m2knCPKVvbhsy089cb
ptD8fO2CXm+54AsCUkAheUSVTU11AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAA9Vn
zJ5gyhLnVdcJnvBzBvGebRvfCf91HbZdbQ+J8ySRqNr8KYc1RZg1xAmSnpc7/Uvu
QWh2/Z/zVLnHvhtTHngSbNHX2FGBYS0Ticrvc2sV1l+MYubPfG/k6fyW0hZenY6R
Dur664VQ7whZ+l2Nf2Gj1beM7iBNehiWu1bPpW8=
MIIDCTCCAfECFGK6xC8kSXk3aNAjEuRTAeHoO1BFMA0GCSqGSIb3DQEBCwUAMEEx
CzAJBgNVBAYTAlVLMQ8wDQYDVQQIDAZMb25kb24xDTALBgNVBAoMBEZheWUxEjAQ
BgNVBAMMCWxvY2FsaG9zdDAeFw0yMzA5MDcxNzU4NTVaFw0yNDA5MDYxNzU4NTVa
MEExCzAJBgNVBAYTAlVLMQ8wDQYDVQQIDAZMb25kb24xDTALBgNVBAoMBEZheWUx
EjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAMGREBi/onEuDpfFOi+6ugGeYTEV+n/KrYDWdT5FCFrL3Ab/kCpWCpwzv6A5
lEPoqyf1Y0+cpcxwZm24fZV8uaaQ53xamzp7/6K+6IeNdI3Lq1J7gJx5wU5tdm2U
jbWv7U0R+XX6MzWYqRFWuCNu2n9uvTl0AKDnyAWmRbhMKXriD5IWbPvMqgI/FnXh
VnK7z+UHzLb214Q0VlfUs4U8oJjA5K7IEiMF2FkA3HPnxdvtjDNDCYyahumWLozP
lbSo8Zlyr4xpp7yUv9TAhJozs+Y320cBpLlEeQoFIel+nOc7xgD2Wmu11ds0p/4j
8qdFOv1h9d2DsLQ5ZFJxbXVNu0UCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAaMQl
AnLCKsdodSl6KV3joaGSSkY8WuD1Y76/bieArwRRqdSA4eGYcAHnsyEUqP2otgCj
+vS9h9jGMbLLjPindE+0jij9TpA9oNk8exUQSN5CNgBbrxWakDR6GmK7nWYD4/uh
wcj7QuysExGqpvY1eXh8ki81a5g3if2wjSkprF0VEtulv/MB7eBqvyEZ2d6IuNUc
IG3FmHcCRiGW0S+fPshmSN+OkUtMBJxHXRbr7TFy3Iz4vSDcq0XznVksNTavz5ve
r4qWhPn0J3lfo9y5GBPCv7RWnxqnQWNM8dXPmS8Wh8hteSde8rtHkPuRDF/1VdER
myxYuyLx/dhkxp57kw==
-----END CERTIFICATE-----
+28 -15
View File
@@ -1,15 +1,28 @@
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQC6ly783v6GJHpT8Lk/niNm5JOkA8gfYd6UVuZudxeFu62cm0U/
jb85U1lNuyul8WzAOledIVVO3ryIJDId77BSFzRRxVtC4v4WXZoBO05XvOd3MQfb
lSN1rT+Y7teJtpJwjylb24bMtPPXG6bQ/Hztgl5vueALAlJAIXlElU1NdQIDAQAB
AoGBAKwv476bEgo8E17u4CSjDExhVxWeH8lGCZ6eats5r01MGjRQ3SB+8B44mkqv
FOJ33kGuFTf9kLnNtfF0ZYNWs0AaDZ6c2Bfom3VtP3YzoTfZHcyHRNCt00Pp79Pt
Gc0HSeq3SvsnJZxgtQOItEvzbaaSFETefJ2iJZrLymDlh5XBAkEA5rbb+J/r37mX
56ZH9SG4cHhF2EIn86NgihRMMhcHWkuGDM0j0H1jaKwDkLtvGqacXpiiiUAgl0eo
AZZ4+XnNXQJBAM8KWL4q3/IPH/hQgx8mJeefwS19LLUQsq62phuWiOiPrirvLSfK
yokreRpOkwt1CRIeI5kauKtZ+7ycJQRv5vkCQQCfYnZGpVxTO6j4jIQrkbcUY9KE
mvd0tkpsOaeF9yjKNWCPGW0DjIwPdL4lz4bq120xYKrwvI+HUyZ6qlQ6rO21AkEA
nAU1COGwb24cbnjlxtRtnhXScqAwz6XssSKtHH8dXvvfiTVCNwloBWSAV2W9A9ZH
ZqLVuqvbXC1sOh8E+koFqQJAWynSNx9Hm1zLRp9XtpE80ZBytBL/BR9We6cg0HB+
c1cv3HhZj3gyN197k33/sok+1wY4HgxAimFhgoxamdM/zg==
-----END RSA PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDBkRAYv6JxLg6X
xTovuroBnmExFfp/yq2A1nU+RQhay9wG/5AqVgqcM7+gOZRD6Ksn9WNPnKXMcGZt
uH2VfLmmkOd8Wps6e/+ivuiHjXSNy6tSe4CcecFObXZtlI21r+1NEfl1+jM1mKkR
Vrgjbtp/br05dACg58gFpkW4TCl64g+SFmz7zKoCPxZ14VZyu8/lB8y29teENFZX
1LOFPKCYwOSuyBIjBdhZANxz58Xb7YwzQwmMmobpli6Mz5W0qPGZcq+Maae8lL/U
wISaM7PmN9tHAaS5RHkKBSHpfpznO8YA9lprtdXbNKf+I/KnRTr9YfXdg7C0OWRS
cW11TbtFAgMBAAECggEAB+Pxa4jYRtPRTXeBNTPf5DQAEz+pm+73nqJfWh/3RLg9
ql1dk5Q5T3++hnoCZLhFzdWvbC3fBlPooP1dxSu156fNf+CzpjEqzQgKM4hdIXCV
dcHKDtbZvegxZSsika7vte4PJLODxeIItke6LtuUdZBej0p+whBgs3ZBLk+Qe01M
la73SCNi0Pjg8auyMRvncLqFvKE/KplemeCS30+AMoyhtLKQmrOo+Ub94N+tp8fR
COtsmIJQX6uj1cg3Ikn23G5Kll66gt3kzNRGgNfkcygWmfPFE4WHBZXvOiLHhs7j
FsAtA+vVODDyofmgT686LsEg70aM58SCXhX5DtsxYQKBgQDsejwS1Po4rrAqZj7j
ny9lnZuCGo/P9CnDzcNnsJAxVBh5knKkVNC8r6ubMBwrf3lq+I7RbI3AAS/vxcON
Rhj39cvUMSv5/fkMAGDIHL2yW8LBufYbyyQm2ChFuas51560aAsCrFN1gB0I8A1M
eRkNFcoPzeS8GHkjhE8P4EyRkQKBgQDRi/EQ+nA5nfLggl+G67ACiMe2i3FZs1mP
4WWA7fvfty/L6WBGuxCU1v9hMBj63LhHrlKF2MOHbKNuBwGYjeNgqaBWw+ahwdPX
N06x/FhR1q8AiVH26S5nRAaoh5ode5H2dx17e0QteEFe29nFoSkT47sAOxRfkWjx
QqBdBgH0dQKBgG54zAegJyTDttiX21lKzEGUV0l4Tya+0aP/RAH0oefpeWWR3KyY
UstS5cAhwYcwjfBDHbUIGVBRPautn6Un0hJEaWw/bGPlGatZodzaUGQ6KcmGrkpd
pA3hfS7VhgAHksSEtmARUQvbRbUfL5dCG0nZnAO2E90rMaw96xFnn12BAoGAeX9J
jA2Zal7hhzkwiDs5t451NauOUnNCF8GZp/LU2rcNWI79SqWGDLbIJiLMKRA3LSCv
KnovjOL5s38OdtS2JMLVe9lkbR/EY4Hm+B4XW4Q9vfLg+mfjhu6Tab4OJtASJrST
/JfRRQf35zdUAlnaRnUBZTXcLzlRfqmh763fDk0CgYEAuBYr1xVFrdwn/YSHn5m5
amexAv821RCWvuZMUPfnSHGoxOGGI0DEOocznIuExNoRVrsKMeuskbpoVuo/b4S5
BVjzP+lNlkDEJVcYLnlX3t4elA9IYj7RqwZTmT8BrVEoH3AFns3O2jDzZw47I7dK
bCewTY0p5+4zEWlgsxX/Mtk=
-----END PRIVATE KEY-----