Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: websockets/ws
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 7.1.0
Choose a base ref
...
head repository: websockets/ws
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 7.1.1
Choose a head ref
  • 2 commits
  • 3 files changed
  • 1 contributor

Commits on Jul 14, 2019

  1. [minor] Throw an error on invalid usage

    Throw an error if the same `server` option is used for multiple
    WebSocket servers at the same time.
    lpinca committed Jul 14, 2019
    Copy the full SHA
    3641266 View commit details

Commits on Jul 19, 2019

  1. [dist] 7.1.1

    lpinca committed Jul 19, 2019
    Copy the full SHA
    cf467db View commit details
Showing with 36 additions and 8 deletions.
  1. +11 −0 lib/websocket-server.js
  2. +1 −1 package.json
  3. +24 −7 test/websocket-server.test.js
11 changes: 11 additions & 0 deletions lib/websocket-server.js
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@ const { format, parse } = require('./extension');
const { GUID } = require('./constants');

const keyRegex = /^[+/0-9A-Za-z]{22}==$/;
const kUsedByWebSocketServer = Symbol('kUsedByWebSocketServer');

/**
* Class representing a WebSocket server.
@@ -82,6 +83,14 @@ class WebSocketServer extends EventEmitter {
}

if (this._server) {
if (this._server[kUsedByWebSocketServer]) {
throw new Error(
'The HTTP/S server is already being used by another WebSocket server'
);
} else {
this._server[kUsedByWebSocketServer] = true;
}

this._removeListeners = addListeners(this._server, {
listening: this.emit.bind(this, 'listening'),
error: this.emit.bind(this, 'error'),
@@ -135,6 +144,8 @@ class WebSocketServer extends EventEmitter {
const server = this._server;

if (server) {
server[kUsedByWebSocketServer] = false;

this._removeListeners();
this._removeListeners = this._server = null;

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ws",
"version": "7.1.0",
"version": "7.1.1",
"description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js",
"keywords": [
"HyBi",
31 changes: 24 additions & 7 deletions test/websocket-server.test.js
Original file line number Diff line number Diff line change
@@ -17,11 +17,22 @@ describe('WebSocketServer', () => {
assert.throws(() => new WebSocket.Server());
});

it('throws an error if no port or server is specified', () => {
assert.throws(() => new WebSocket.Server({}));
});

describe('options', () => {
it('throws an error if no `port` or `server` option is specified', () => {
assert.throws(() => new WebSocket.Server({}));
});

it('throws an error if the server is already being used', () => {
const server = http.createServer();

new WebSocket.Server({ server });

assert.throws(
() => new WebSocket.Server({ server }),
/^Error: The HTTP\/S server is already being used by another WebSocket server$/
);
});

it('exposes options passed to constructor', (done) => {
const wss = new WebSocket.Server({ port: 0 }, () => {
assert.strictEqual(wss.options.port, 0);
@@ -225,15 +236,21 @@ describe('WebSocketServer', () => {

it('cleans event handlers on precreated server', (done) => {
const server = http.createServer();
const wss = new WebSocket.Server({ server });
const wss1 = new WebSocket.Server({ server });

server.listen(0, () => {
wss.close(() => {
wss1.close(() => {
assert.strictEqual(server.listenerCount('listening'), 0);
assert.strictEqual(server.listenerCount('upgrade'), 0);
assert.strictEqual(server.listenerCount('error'), 0);

server.close(done);
// Check that no error is thrown if `server` is resued now as there
// are no other `WebSocketServer`s using it.
const wss2 = new WebSocket.Server({ server });

wss2.close(() => {
server.close(done);
});
});
});
});