Compare commits

...

17 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
18 changed files with 136 additions and 93 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
-6
View File
@@ -1,6 +0,0 @@
.git
.gitignore
.npmignore
.travis.yml
node_modules
spec
-19
View File
@@ -1,19 +0,0 @@
sudo: false
language: node_js
node_js:
- "0.8"
- "0.10"
- "0.12"
- "4"
- "5"
- "6"
- "7"
- "8"
- "9"
- "10"
- "11"
- "12"
before_install:
- '[ "${TRAVIS_NODE_VERSION}" != "0.8" ] || npm install -g npm@~1.4.0'
+5
View File
@@ -1,7 +1,12 @@
### 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
+1 -1
View File
@@ -1,4 +1,4 @@
Copyright 2010-2019 James Coglan
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
+13 -13
View File
@@ -1,4 +1,4 @@
# faye-websocket [![Build status](https://secure.travis-ci.org/faye/faye-websocket-node.svg)](http://travis-ci.org/faye/faye-websocket-node)
# faye-websocket
This is a general-purpose WebSocket implementation extracted from the
[Faye](http://faye.jcoglan.com) project. It provides classes for easily building
@@ -38,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;
@@ -120,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') }
}
});
```
@@ -164,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] });
```
@@ -200,7 +200,7 @@ The client accepts some additional options:
- `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
@@ -249,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');
}
});
@@ -273,7 +273,7 @@ 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:
@@ -300,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
});
+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();
});
+1 -1
View File
@@ -14,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;
+10 -8
View File
@@ -105,12 +105,14 @@ var instance = {
"The code must be either 1000, or between 3000 and 4999. " +
code + " is neither.");
if (this.readyState !== API.CLOSED) this.readyState = API.CLOSING;
var self = this;
if (this.readyState < API.CLOSING) {
var self = this;
this._closeTimer = setTimeout(function() {
self._beginClose('', 1006);
}, API.CLOSE_TIMEOUT);
}
this._closeTimer = setTimeout(function() {
self._beginClose('', 1006);
}, API.CLOSE_TIMEOUT);
if (this.readyState !== API.CLOSED) this.readyState = API.CLOSING;
this._driver.close(reason, code);
},
@@ -147,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);
},
@@ -155,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);
},
@@ -185,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);
}
+4 -4
View File
@@ -8,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() {
@@ -67,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();
+1 -1
View File
@@ -8,7 +8,7 @@
"eventsource"
],
"license": "Apache-2.0",
"version": "0.11.3",
"version": "0.11.4",
"engines": {
"node": ">=0.8.0"
},
+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 -10
View File
@@ -1,12 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIBuTCCASICCQDYxKMSaqIBUjANBgkqhkiG9w0BAQUFADAhMQswCQYDVQQGEwJV
SzESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTE4MDcyNjEwMDc1MVoXDTE5MDcyNjEw
MDc1MVowITELMAkGA1UEBhMCVUsxEjAQBgNVBAMMCWxvY2FsaG9zdDCBnzANBgkq
hkiG9w0BAQEFAAOBjQAwgYkCgYEA0yhJUiPwtCyZz6B8F+7nczFx5dGN2FqHt3Vr
X4Kw1bZYAibi2A1mLTUzq2XL1MkMZEKmU7Ed5W2XLE6pDBx+uwx2Ip+Ma04iPSIZ
tpvYsDueWVWEsQ+ErT03l6b+tEDRBi5Phg6BkOyB8Wrt7hAeGCDZCpQCYtAJ/S51
2BZTY2sCAwEAATANBgkqhkiG9w0BAQUFAAOBgQCm3xXFjYREjaj7SzBKq8R0YN57
v1a+6IG9Lc4LHKxg9BMK/duj3pBina0pK97acJVUUMljh6q1jcfU2nvp2JPky+DL
A7Ct59/Q4KB2Hlo3uCKEQvgpXkuRUbtgtLDSnr6IOQpfOJV3wbZC9hhSAG9vxDwz
Ntk1nrqynosPPRFkjQ==
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-----
MIICXQIBAAKBgQDTKElSI/C0LJnPoHwX7udzMXHl0Y3YWoe3dWtfgrDVtlgCJuLY
DWYtNTOrZcvUyQxkQqZTsR3lbZcsTqkMHH67DHYin4xrTiI9Ihm2m9iwO55ZVYSx
D4StPTeXpv60QNEGLk+GDoGQ7IHxau3uEB4YINkKlAJi0An9LnXYFlNjawIDAQAB
AoGBAIX7Wgq0o1avtij4O8Uz4chF529buBU/3D2cU7UWx/3S5aT355gPaHXm/BIV
VXB+4U38vGz+RWn+T53di4YTzpTZ2hUpsfR3qLPxEQDwws8NcGmaWMpkDNZYVMGi
jC37g3TCNlaW+rpdAhKg8izORjQkY3XI4rClZczojkVC954BAkEA8fBLjrqXEc7I
o1mTgduGBwYeBSRVoNLpTqQjrKfmmXFv1vntVhXZsqkgNgP4QJtLnr1IxAMxNeTK
gNU7nDhQ0QJBAN9uAmHXQgDZijQOujBTQSd/XdIvFAouNGLvGDreoXqMG3o7vEuS
H0rPj30u0zwJ7NluPKnshMjLWi/GWZaXX3sCQQDN/kLW65fk2aOLMaGeV0LuiA7X
YfBmVi2/f5HAV9THoQYQjAu/2CrbK5T5aLfeilsAdTmXawBjWsHwn515jZmBAkBW
nVDzGP2PUsXO1H69SSkS5L88Qd/k6nCIgePEvpWe6j2krw+ZxDW5TKl1f/eHaNmW
mLOPtA7twFdf+ea1CE2NAkB+DytRQjaWstKAO8dpVzyZ9J6bP+FAEGy7lg7GJvKP
HW14WK1OJ1luQ2vkftTPjJuE+5QDpkuXFMqJerzBtnL6
-----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-----