Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 15 additions & 6 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
'use strict';

const createWebSocketStream = require('./lib/stream');
const extension = require('./lib/extension');
const PerMessageDeflate = require('./lib/permessage-deflate');
const Receiver = require('./lib/receiver');
const Sender = require('./lib/sender');
const subprotocol = require('./lib/subprotocol');
const WebSocket = require('./lib/websocket');
const WebSocketServer = require('./lib/websocket-server');

WebSocket.createWebSocketStream = require('./lib/stream');
WebSocket.Server = require('./lib/websocket-server');
WebSocket.Receiver = require('./lib/receiver');
WebSocket.Sender = require('./lib/sender');

WebSocket.createWebSocketStream = createWebSocketStream;
WebSocket.extension = extension;
WebSocket.PerMessageDeflate = PerMessageDeflate;
WebSocket.Receiver = Receiver;
WebSocket.Sender = Sender;
WebSocket.Server = WebSocketServer;
WebSocket.subprotocol = subprotocol;
WebSocket.WebSocket = WebSocket;
WebSocket.WebSocketServer = WebSocket.Server;
WebSocket.WebSocketServer = WebSocketServer;

module.exports = WebSocket;
12 changes: 6 additions & 6 deletions lib/permessage-deflate.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ class PerMessageDeflate {
* acknowledge disabling of client context takeover
* @param {Number} [options.concurrencyLimit=10] The number of concurrent
* calls to zlib
* @param {Boolean} [options.isServer=false] Create the instance in either
* server or client mode
* @param {Number} [options.maxPayload=0] The maximum allowed message length
* @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the
* use of a custom server window size
* @param {Boolean} [options.serverNoContextTakeover=false] Request/accept
Expand All @@ -47,16 +50,13 @@ class PerMessageDeflate {
* deflate
* @param {Object} [options.zlibInflateOptions] Options to pass to zlib on
* inflate
* @param {Boolean} [isServer=false] Create the instance in either server or
* client mode
* @param {Number} [maxPayload=0] The maximum allowed message length
*/
constructor(options, isServer, maxPayload) {
this._maxPayload = maxPayload | 0;
constructor(options) {
this._options = options || {};
this._threshold =
this._options.threshold !== undefined ? this._options.threshold : 1024;
this._isServer = !!isServer;
this._maxPayload = this._options.maxPayload | 0;
this._isServer = !!this._options.isServer;
this._deflate = null;
this._inflate = null;

Expand Down
10 changes: 5 additions & 5 deletions lib/websocket-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -293,11 +293,11 @@ class WebSocketServer extends EventEmitter {
this.options.perMessageDeflate &&
secWebSocketExtensions !== undefined
) {
const perMessageDeflate = new PerMessageDeflate(
this.options.perMessageDeflate,
true,
this.options.maxPayload
);
const perMessageDeflate = new PerMessageDeflate({
...this.options.perMessageDeflate,
isServer: true,
maxPayload: this.options.maxPayload
});

try {
const offers = extension.parse(secWebSocketExtensions);
Expand Down
10 changes: 5 additions & 5 deletions lib/websocket.js
Original file line number Diff line number Diff line change
Expand Up @@ -755,11 +755,11 @@ function initAsClient(websocket, address, protocols, options) {
opts.timeout = opts.handshakeTimeout;

if (opts.perMessageDeflate) {
perMessageDeflate = new PerMessageDeflate(
opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},
false,
opts.maxPayload
);
perMessageDeflate = new PerMessageDeflate({
...opts.perMessageDeflate,
isServer: false,
maxPayload: opts.maxPayload
});
opts.headers['Sec-WebSocket-Extensions'] = format({
[PerMessageDeflate.extensionName]: perMessageDeflate.offer()
});
Expand Down
82 changes: 44 additions & 38 deletions test/permessage-deflate.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,13 @@ describe('PerMessageDeflate', () => {

describe('As server', () => {
it('accepts an offer with no parameters', () => {
const perMessageDeflate = new PerMessageDeflate({}, true);
const perMessageDeflate = new PerMessageDeflate({ isServer: true });

assert.deepStrictEqual(perMessageDeflate.accept([{}]), {});
});

it('accepts an offer with parameters', () => {
const perMessageDeflate = new PerMessageDeflate({}, true);
const perMessageDeflate = new PerMessageDeflate({ isServer: true });
const extensions = extension.parse(
'permessage-deflate; server_no_context_takeover; ' +
'client_no_context_takeover; server_max_window_bits=10; ' +
Expand All @@ -127,15 +127,13 @@ describe('PerMessageDeflate', () => {
});

it('prefers the configuration options', () => {
const perMessageDeflate = new PerMessageDeflate(
{
serverNoContextTakeover: true,
clientNoContextTakeover: true,
serverMaxWindowBits: 12,
clientMaxWindowBits: 11
},
true
);
const perMessageDeflate = new PerMessageDeflate({
serverNoContextTakeover: true,
clientNoContextTakeover: true,
serverMaxWindowBits: 12,
clientMaxWindowBits: 11,
isServer: true
});
const extensions = extension.parse(
'permessage-deflate; server_max_window_bits=14; client_max_window_bits=13'
);
Expand All @@ -153,10 +151,10 @@ describe('PerMessageDeflate', () => {
});

it('accepts the first supported offer', () => {
const perMessageDeflate = new PerMessageDeflate(
{ serverMaxWindowBits: 11 },
true
);
const perMessageDeflate = new PerMessageDeflate({
isServer: true,
serverMaxWindowBits: 11
});
const extensions = extension.parse(
'permessage-deflate; server_max_window_bits=10, permessage-deflate'
);
Expand All @@ -171,10 +169,10 @@ describe('PerMessageDeflate', () => {
});

it('throws an error if server_no_context_takeover is unsupported', () => {
const perMessageDeflate = new PerMessageDeflate(
{ serverNoContextTakeover: false },
true
);
const perMessageDeflate = new PerMessageDeflate({
isServer: true,
serverNoContextTakeover: false
});
const extensions = extension.parse(
'permessage-deflate; server_no_context_takeover'
);
Expand All @@ -186,10 +184,10 @@ describe('PerMessageDeflate', () => {
});

it('throws an error if server_max_window_bits is unsupported', () => {
const perMessageDeflate = new PerMessageDeflate(
{ serverMaxWindowBits: false },
true
);
const perMessageDeflate = new PerMessageDeflate({
isServer: true,
serverMaxWindowBits: false
});
const extensions = extension.parse(
'permessage-deflate; server_max_window_bits=10'
);
Expand All @@ -201,10 +199,10 @@ describe('PerMessageDeflate', () => {
});

it('throws an error if server_max_window_bits is less than configuration', () => {
const perMessageDeflate = new PerMessageDeflate(
{ serverMaxWindowBits: 11 },
true
);
const perMessageDeflate = new PerMessageDeflate({
isServer: true,
serverMaxWindowBits: 11
});
const extensions = extension.parse(
'permessage-deflate; server_max_window_bits=10'
);
Expand All @@ -216,10 +214,10 @@ describe('PerMessageDeflate', () => {
});

it('throws an error if client_max_window_bits is unsupported on client', () => {
const perMessageDeflate = new PerMessageDeflate(
{ clientMaxWindowBits: 10 },
true
);
const perMessageDeflate = new PerMessageDeflate({
isServer: true,
clientMaxWindowBits: 10
});
const extensions = extension.parse('permessage-deflate');

assert.throws(
Expand All @@ -229,7 +227,7 @@ describe('PerMessageDeflate', () => {
});

it('throws an error if client_max_window_bits has an invalid value', () => {
const perMessageDeflate = new PerMessageDeflate({}, true);
const perMessageDeflate = new PerMessageDeflate({ isServer: true });

const extensions = extension.parse(
'permessage-deflate; client_max_window_bits=16'
Expand Down Expand Up @@ -388,8 +386,10 @@ describe('PerMessageDeflate', () => {

it('works with the negotiated parameters', (done) => {
const perMessageDeflate = new PerMessageDeflate({
memLevel: 5,
level: 9
zlibDeflateOptions: {
memLevel: 5,
level: 9
}
});
const extensions = extension.parse(
'permessage-deflate; server_no_context_takeover; ' +
Expand Down Expand Up @@ -518,7 +518,7 @@ describe('PerMessageDeflate', () => {
});

it("doesn't use contex takeover if not allowed", (done) => {
const perMessageDeflate = new PerMessageDeflate({}, true);
const perMessageDeflate = new PerMessageDeflate({ isServer: true });
const extensions = extension.parse(
'permessage-deflate;server_no_context_takeover'
);
Expand Down Expand Up @@ -549,7 +549,7 @@ describe('PerMessageDeflate', () => {
});

it('uses contex takeover if allowed', (done) => {
const perMessageDeflate = new PerMessageDeflate({}, true);
const perMessageDeflate = new PerMessageDeflate({ isServer: true });
const extensions = extension.parse('permessage-deflate');
const buf = Buffer.from('foofoo');

Expand Down Expand Up @@ -591,7 +591,10 @@ describe('PerMessageDeflate', () => {
});

it('calls the callback when `maxPayload` is exceeded (1/2)', (done) => {
const perMessageDeflate = new PerMessageDeflate({}, false, 25);
const perMessageDeflate = new PerMessageDeflate({
isServer: false,
maxPayload: 25
});
const buf = Buffer.alloc(50, 'A');

perMessageDeflate.accept([{}]);
Expand All @@ -609,7 +612,10 @@ describe('PerMessageDeflate', () => {
it('calls the callback when `maxPayload` is exceeded (2/2)', (done) => {
// A copy of the previous test but with a larger input. See
// https://github.com/websockets/ws/pull/2285.
const perMessageDeflate = new PerMessageDeflate({}, false, 25);
const perMessageDeflate = new PerMessageDeflate({
isServer: false,
maxPayload: 25
});
const buf = Buffer.alloc(1024 * 1024, 'A');

perMessageDeflate.accept([{}]);
Expand Down
10 changes: 8 additions & 2 deletions test/receiver.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -922,7 +922,10 @@ describe('Receiver', () => {
});

it('emits an error if the message length exceeds `maxPayload`', (done) => {
const perMessageDeflate = new PerMessageDeflate({}, false, 25);
const perMessageDeflate = new PerMessageDeflate({
isServer: false,
maxPayload: 25
});
perMessageDeflate.accept([{}]);

const receiver = new Receiver({
Expand All @@ -949,7 +952,10 @@ describe('Receiver', () => {
});

it('emits an error if the sum of fragment lengths exceeds `maxPayload`', (done) => {
const perMessageDeflate = new PerMessageDeflate({}, false, 25);
const perMessageDeflate = new PerMessageDeflate({
isServer: false,
maxPayload: 25
});
perMessageDeflate.accept([{}]);

const receiver = new Receiver({
Expand Down
15 changes: 14 additions & 1 deletion wrapper.mjs
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
import createWebSocketStream from './lib/stream.js';
import extension from './lib/extension.js';
import PerMessageDeflate from './lib/permessage-deflate.js';
import Receiver from './lib/receiver.js';
import Sender from './lib/sender.js';
import subprotocol from './lib/subprotocol.js';
import WebSocket from './lib/websocket.js';
import WebSocketServer from './lib/websocket-server.js';

export { createWebSocketStream, Receiver, Sender, WebSocket, WebSocketServer };
export {
createWebSocketStream,
extension,
PerMessageDeflate,
Receiver,
Sender,
subprotocol,
WebSocket,
WebSocketServer
};

export default WebSocket;