Socket
Socket
Sign inDemoInstall

ws

Package Overview
Dependencies
3
Maintainers
1
Versions
168
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.4.18 to 0.4.19

lib/BufferUtil.fallback.js

6

History.md

@@ -0,1 +1,7 @@

v0.4.19 - June 19th, 2012
=====================
* Change sender to merge buffers for relatively small payloads, may improve perf in some cases [einaros]
* Avoid EventEmitter for Receiver classes. As above this may improve perf. [einaros]
* Renamed fallback files from the somewhat misleading '*Windows'. [einaros]
v0.4.18 - June 14th 2012

@@ -2,0 +8,0 @@ =====================

9

install.js

@@ -19,6 +19,7 @@ var spawn = require('child_process').spawn

if (code !== 0) {
console.log('[ws v%s]'.blue + ' Native extension compilation failed.'.red, version);
console.log('[ws v%s]'.blue + ' On Windows, native extensions require Visual Studio and Python.'.red, version);
console.log('[ws v%s]'.blue + ' On Unix, native extensions require Python, make and a C++ compiler.'.red, version);
console.log('[ws v%s]'.blue + ' Start npm with --ws:verbose to show compilation output (if any).'.red, version);
console.log('[ws v%s]'.blue + ' Native code compile failed (but the module will still work):'.yellow, version);
console.log('[ws v%s]'.blue + ' The native extensions are faster, but not required.'.yellow, version);
console.log('[ws v%s]'.blue + ' On Windows, native extensions require Visual Studio and Python.'.yellow, version);
console.log('[ws v%s]'.blue + ' On Unix, native extensions require Python, make and a C++ compiler.'.yellow, version);
console.log('[ws v%s]'.blue + ' Start npm with --ws:verbose to show compilation output (if any).'.yellow, version);
}

@@ -25,0 +26,0 @@ else {

@@ -12,3 +12,3 @@ /*!

} catch (e) { try {
module.exports = require('./BufferUtilWindows');
module.exports = require('./BufferUtil.fallback');
} catch (e) {

@@ -15,0 +15,0 @@ console.error('bufferutil.node seems to not have been built. Run npm install.');

@@ -7,5 +7,3 @@ /*!

var events = require('events')
, util = require('util')
, EventEmitter = events.EventEmitter;
var util = require('util');

@@ -29,2 +27,9 @@ /**

this.dead = false;
this.onerror = function() {};
this.ontext = function() {};
this.onbinary = function() {};
this.onclose = function() {};
this.onping = function() {};
this.onpong = function() {};
}

@@ -35,8 +40,2 @@

/**
* Inherits from EventEmitter.
*/
util.inherits(Receiver, events.EventEmitter);
/**
* Add new data to the parser.

@@ -53,3 +52,3 @@ *

self.reset();
self.emit('close');
self.onclose();
return;

@@ -107,3 +106,3 @@ }

this.reset();
this.emit('text', output.toString('utf8'));
this.ontext(output.toString('utf8'));
return tail;

@@ -120,3 +119,3 @@ }

this.reset();
this.emit('error', reason, terminate);
this.onerror(reason, terminate);
return this;

@@ -123,0 +122,0 @@ }

@@ -7,5 +7,3 @@ /*!

var events = require('events')
, util = require('util')
, EventEmitter = events.EventEmitter
var util = require('util')
, Validation = require('./Validation').Validation

@@ -62,2 +60,9 @@ , ErrorCodes = require('./ErrorCodes')

this.dead = false;
this.onerror = function() {};
this.ontext = function() {};
this.onbinary = function() {};
this.onclose = function() {};
this.onping = function() {};
this.onpong = function() {};
};

@@ -68,8 +73,2 @@

/**
* Inherits from EventEmitter.
*/
util.inherits(Receiver, events.EventEmitter);
/**
* Add new data to the parser.

@@ -117,2 +116,8 @@ *

this.currentMessage = null;
this.onerror = null;
this.ontext = null;
this.onbinary = null;
this.onclose = null;
this.onping = null;
this.onpong = null;
}

@@ -300,3 +305,3 @@

this.reset();
this.emit('error', reason, protocolErrorCode);
this.onerror(reason, protocolErrorCode);
return this;

@@ -397,3 +402,3 @@ }

}
this.emit('text', messageBuffer.toString('utf8'), {masked: this.state.masked, buffer: messageBuffer});
this.ontext(messageBuffer.toString('utf8'), {masked: this.state.masked, buffer: messageBuffer});
this.currentMessage = [];

@@ -449,3 +454,3 @@ }

var messageBuffer = this.concatBuffers(this.currentMessage);
this.emit('binary', messageBuffer, {masked: this.state.masked, buffer: messageBuffer});
this.onbinary(messageBuffer, {masked: this.state.masked, buffer: messageBuffer});
this.currentMessage = [];

@@ -511,3 +516,3 @@ }

}
this.emit('close', code, message, {masked: self.state.masked});
this.onclose(code, message, {masked: self.state.masked});
this.reset();

@@ -551,3 +556,3 @@ },

finish: function(mask, data) {
this.emit('ping', this.unmask(mask, data, true), {masked: this.state.masked, binary: true});
this.onping(this.unmask(mask, data, true), {masked: this.state.masked, binary: true});
this.endPacket();

@@ -591,3 +596,3 @@ }

finish: function(mask, data) {
this.emit('pong', this.unmask(mask, data, true), {masked: this.state.masked, binary: true});
this.onpong(this.unmask(mask, data, true), {masked: this.state.masked, binary: true});
this.endPacket();

@@ -594,0 +599,0 @@ }

@@ -122,5 +122,5 @@ /*!

var totalLength = (maskData && !canModifyData) ? dataLength + dataOffset : dataOffset;
var mergeBuffers = dataLength < 32768 || (maskData && !canModifyData);
var totalLength = mergeBuffers ? dataLength + dataOffset : dataOffset;
var outputBuffer = new Buffer(totalLength);
outputBuffer[0] = finalFragment ? opcode | 0x80 : opcode;

@@ -137,5 +137,2 @@

var sendsDone = 0;
var cbCaller = function() { if (++sendsDone == 2 && typeof cb == 'function') cb(null); }
if (maskData) {

@@ -148,3 +145,3 @@ outputBuffer[1] = secondByte | 0x80;

outputBuffer[dataOffset - 1] = mask[3];
if (!canModifyData) {
if (mergeBuffers) {
bufferUtil.mask(data, mask, outputBuffer, dataOffset, dataLength);

@@ -162,4 +159,4 @@ try {

try {
this._socket.write(outputBuffer, 'binary', cb ? cbCaller : null);
this._socket.write(data, 'binary', cb ? cbCaller : null);
this._socket.write(outputBuffer, 'binary');
this._socket.write(data, 'binary', cb);
}

@@ -174,9 +171,21 @@ catch (e) {

outputBuffer[1] = secondByte;
try {
this._socket.write(outputBuffer, 'binary', cb ? cbCaller : null);
this._socket.write(data, 'binary', cb ? cbCaller : null);
if (mergeBuffers) {
data.copy(outputBuffer, dataOffset);
try {
this._socket.write(outputBuffer, 'binary', cb);
}
catch (e) {
if (typeof cb == 'function') cb(e);
else this.emit('error', e);
}
}
catch (e) {
if (typeof cb == 'function') cb(e);
else this.emit('error', e);
else {
try {
this._socket.write(outputBuffer, 'binary');
this._socket.write(data, 'binary', cb);
}
catch (e) {
if (typeof cb == 'function') cb(e);
else this.emit('error', e);
}
}

@@ -183,0 +192,0 @@ }

@@ -12,3 +12,3 @@ /*!

} catch (e) { try {
module.exports = require('./ValidationWindows');
module.exports = require('./Validation.fallback');
} catch (e) {

@@ -15,0 +15,0 @@ console.error('validation.node seems to not have been built. Run npm install.');

@@ -512,28 +512,28 @@ /*!

// receiver event handlers
self._receiver.on('text', function (data, flags) {
self._receiver.ontext = function (data, flags) {
flags = flags || {};
self.emit('message', data, flags);
});
self._receiver.on('binary', function (data, flags) {
};
self._receiver.onbinary = function (data, flags) {
flags = flags || {};
flags.binary = true;
self.emit('message', data, flags);
});
self._receiver.on('ping', function(data, flags) {
};
self._receiver.onping = function(data, flags) {
flags = flags || {};
self.pong(data, {mask: !self._isServer, binary: flags.binary === true}, true);
self.emit('ping', data, flags);
});
self._receiver.on('pong', function(data, flags) {
};
self._receiver.onpong = function(data, flags) {
self.emit('pong', data, flags);
});
self._receiver.on('close', function(code, data, flags) {
};
self._receiver.onclose = function(code, data, flags) {
flags = flags || {};
self.close(code, data);
});
self._receiver.on('error', function(reason, errorCode) {
};
self._receiver.onerror = function(reason, errorCode) {
// close the connection when the receiver reports a HyBi error code
self.close(typeof errorCode != 'undefined' ? errorCode : 1002, '');
self.emit('error', reason, errorCode);
});
};

@@ -614,3 +614,2 @@ // finalize the client

if (this._receiver) {
removeAllListeners(this._receiver);
this._receiver.cleanup();

@@ -617,0 +616,0 @@ this._receiver = null;

@@ -199,2 +199,4 @@ /*!

socket.setTimeout(0);
socket.setNoDelay(true);
try {

@@ -209,4 +211,2 @@ socket.write(headers.concat('', '').join('\r\n'));

socket.setTimeout(0);
socket.setNoDelay(true);
var client = new WebSocket([req, socket, upgradeHead], {

@@ -213,0 +213,0 @@ protocolVersion: version,

@@ -5,3 +5,3 @@ {

"description": "simple to use, blazing fast and thoroughly tested websocket client, server and console for node.js, up-to-date against RFC-6455",
"version": "0.4.18",
"version": "0.4.19",
"repository": {

@@ -8,0 +8,0 @@ "type": "git",

@@ -12,6 +12,6 @@ var assert = require('assert')

var gotData = false;
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
assert.equal('Hello', data);
});
};

@@ -28,6 +28,6 @@ p.add(getBufferFromHexString(packet));

var messages = [];
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
messages.push(data);
});
};

@@ -46,6 +46,6 @@ p.add(getBufferFromHexString(packet));

var gotData = false;
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
assert.equal('', data);
});
};

@@ -69,6 +69,6 @@ p.add(getBufferFromHexString(packet));

var messages = [];
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
messages.push(data);
});
};

@@ -98,9 +98,9 @@ for (var i = 0; i < packets.length; ++i) {

var messages = [];
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
messages.push(data);
});
p.on('error', function(reason, code) {
};
p.onerror = function(reason, code) {
gotError = code == true;
});
};

@@ -124,8 +124,8 @@ for (var i = 0; i < packets.length && !gotError; ++i) {

var gotError = false;
p.on('close', function() {
p.onclose = function() {
gotClose = true;
});
p.on('error', function(reason, code) {
};
p.onerror = function(reason, code) {
gotError = code == true;
});
};

@@ -132,0 +132,0 @@ for (var i = 0; i < packets.length && !gotError; ++i) {

@@ -6,13 +6,13 @@ var assert = require('assert')

describe('Receiver', function() {
describe('Receiver', function() {
it('can parse unmasked text message', function() {
var p = new Receiver();
var packet = '81 05 48 65 6c 6c 6f';
var gotData = false;
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
assert.equal('Hello', data);
});
};
p.add(getBufferFromHexString(packet));

@@ -24,8 +24,8 @@ gotData.should.be.ok;

var packet = '88 00';
var gotClose = false;
p.on('close', function(data) {
p.onclose = function(data) {
gotClose = true;
});
};
p.add(getBufferFromHexString(packet));

@@ -37,9 +37,9 @@ gotClose.should.be.ok;

var packet = '81 93 34 83 a8 68 01 b9 92 52 4f a1 c6 09 59 e6 8a 52 16 e6 cb 00 5b a1 d5';
var gotData = false;
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
assert.equal('5:::{"name":"echo"}', data);
});
};
p.add(getBufferFromHexString(packet));

@@ -53,9 +53,9 @@ gotData.should.be.ok;

var packet = '81 FE ' + pack(4, message.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
var gotData = false;
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
assert.equal(message, data);
});
};
p.add(getBufferFromHexString(packet));

@@ -71,7 +71,7 @@ gotData.should.be.ok;

var gotData = false;
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
assert.equal(message, data);
});
};
p.add(getBufferFromHexString(packet));

@@ -88,9 +88,9 @@ gotData.should.be.ok;

var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
var gotData = false;
p.on('text', function(data) {
gotData = true;
p.ontext = function(data) {
gotData = true;
assert.equal(message, data);
});
};
p.add(getBufferFromHexString(packet1));

@@ -106,6 +106,6 @@ p.add(getBufferFromHexString(packet2));

var gotPing = false;
p.on('ping', function(data) {
p.onping = function(data) {
gotPing = true;
assert.equal(message, data);
});
};

@@ -118,8 +118,8 @@ p.add(getBufferFromHexString(packet));

var packet = '89 00';
var gotPing = false;
p.on('ping', function(data) {
p.onping = function(data) {
gotPing = true;
});
};
p.add(getBufferFromHexString(packet));

@@ -132,23 +132,23 @@ gotPing.should.be.ok;

for (var i = 0; i < 300; ++i) message += (i % 5).toString();
var msgpiece1 = message.substr(0, 150);
var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece1, '34 83 a8 68'));
var pingMessage = 'Hello';
var pingPacket = '89 ' + getHybiLengthAsHexString(pingMessage.length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(pingMessage, '34 83 a8 68'));
var msgpiece2 = message.substr(150);
var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
var gotData = false;
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
assert.equal(message, data);
});
};
var gotPing = false;
p.on('ping', function(data) {
p.onping = function(data) {
gotPing = true;
assert.equal(pingMessage, data);
});
};
p.add(getBufferFromHexString(packet1));

@@ -164,23 +164,23 @@ p.add(getBufferFromHexString(pingPacket));

for (var i = 0; i < 300; ++i) message += (i % 5).toString();
var msgpiece1 = message.substr(0, 150);
var packet1 = '01 FE ' + pack(4, msgpiece1.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece1, '34 83 a8 68'));
var pingMessage = 'Hello';
var pingPacket = '89 ' + getHybiLengthAsHexString(pingMessage.length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(pingMessage, '34 83 a8 68'));
var msgpiece2 = message.substr(150);
var packet2 = '80 FE ' + pack(4, msgpiece2.length) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(msgpiece2, '34 83 a8 68'));
var gotData = false;
p.on('text', function(data) {
p.ontext = function(data) {
gotData = true;
assert.equal(message, data);
});
};
var gotPing = false;
p.on('ping', function(data) {
p.onping = function(data) {
gotPing = true;
assert.equal(pingMessage, data);
});
};
var buffers = [];

@@ -201,11 +201,11 @@ buffers = buffers.concat(splitBuffer(getBufferFromHexString(packet1)));

for (var i = 0; i < length; ++i) message[i] = i % 256;
var originalMessage = getHexStringFromBuffer(message);
var originalMessage = getHexStringFromBuffer(message);
var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
var gotData = false;
p.on('binary', function(data) {
p.onbinary = function(data) {
gotData = true;
assert.equal(originalMessage, getHexStringFromBuffer(data));
});
};
p.add(getBufferFromHexString(packet));

@@ -219,11 +219,11 @@ gotData.should.be.ok;

for (var i = 0; i < length; ++i) message[i] = i % 256;
var originalMessage = getHexStringFromBuffer(message);
var originalMessage = getHexStringFromBuffer(message);
var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
var gotData = false;
p.on('binary', function(data) {
p.onbinary = function(data) {
gotData = true;
assert.equal(originalMessage, getHexStringFromBuffer(data));
});
};
p.add(getBufferFromHexString(packet));

@@ -237,11 +237,11 @@ gotData.should.be.ok;

for (var i = 0; i < length; ++i) message[i] = i % 256;
var originalMessage = getHexStringFromBuffer(message);
var originalMessage = getHexStringFromBuffer(message);
var packet = '82 ' + getHybiLengthAsHexString(length, true) + ' 34 83 a8 68 ' + getHexStringFromBuffer(mask(message, '34 83 a8 68'));
var gotData = false;
p.on('binary', function(data) {
p.onbinary = function(data) {
gotData = true;
assert.equal(originalMessage, getHexStringFromBuffer(data));
});
};
p.add(getBufferFromHexString(packet));

@@ -255,11 +255,11 @@ gotData.should.be.ok;

for (var i = 0; i < length; ++i) message[i] = i % 256;
var originalMessage = getHexStringFromBuffer(message);
var originalMessage = getHexStringFromBuffer(message);
var packet = '82 ' + getHybiLengthAsHexString(length, false) + ' ' + getHexStringFromBuffer(message);
var gotData = false;
p.on('binary', function(data) {
p.onbinary = function(data) {
gotData = true;
assert.equal(originalMessage, getHexStringFromBuffer(data));
});
};
p.add(getBufferFromHexString(packet));

@@ -266,0 +266,0 @@ gotData.should.be.ok;

@@ -12,3 +12,3 @@ var http = require('http')

invalidKey: invalidRequestHandler,
closeAfterConnect: closeAfterConnectHandler
closeAfterConnect: closeAfterConnectHandler
},

@@ -38,3 +38,3 @@ createServer: function(port, handler, cb) {

function validServer(server, req, socket) {
if (typeof req.headers.upgrade === 'undefined' ||
if (typeof req.headers.upgrade === 'undefined' ||
req.headers.upgrade.toLowerCase() !== 'websocket') {

@@ -49,7 +49,7 @@ throw new Error('invalid headers');

}
// calc key
var key = req.headers['sec-websocket-key'];
var shasum = crypto.createHash('sha1');
shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
var key = req.headers['sec-websocket-key'];
var shasum = crypto.createHash('sha1');
shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
key = shasum.digest('base64');

@@ -70,7 +70,7 @@

var receiver = new Receiver();
receiver.on('text', function (message, flags) {
receiver.ontext = function (message, flags) {
server.emit('message', message, flags);
sender.send(message);
});
receiver.on('binary', function (message, flags) {
};
receiver.onbinary = function (message, flags) {
flags = flags || {};

@@ -80,15 +80,15 @@ flags.binary = true;

sender.send(message, {binary: true});
});
receiver.on('ping', function (message, flags) {
};
receiver.onping = function (message, flags) {
flags = flags || {};
server.emit('ping', message, flags);
});
receiver.on('pong', function (message, flags) {
};
receiver.onpong = function (message, flags) {
flags = flags || {};
server.emit('pong', message, flags);
});
receiver.on('close', function (code, message, flags) {
};
receiver.onclose = function (code, message, flags) {
flags = flags || {};
server.emit('close', code, message, flags);
});
};
socket.on('data', function (data) {

@@ -103,3 +103,3 @@ receiver.add(data);

function invalidRequestHandler(server, req, socket) {
if (typeof req.headers.upgrade === 'undefined' ||
if (typeof req.headers.upgrade === 'undefined' ||
req.headers.upgrade.toLowerCase() !== 'websocket') {

@@ -114,7 +114,7 @@ throw new Error('invalid headers');

}
// calc key
var key = req.headers['sec-websocket-key'];
var shasum = crypto.createHash('sha1');
shasum.update(key + "bogus");
var key = req.headers['sec-websocket-key'];
var shasum = crypto.createHash('sha1');
shasum.update(key + "bogus");
key = shasum.digest('base64');

@@ -134,3 +134,3 @@

function closeAfterConnectHandler(server, req, socket) {
if (typeof req.headers.upgrade === 'undefined' ||
if (typeof req.headers.upgrade === 'undefined' ||
req.headers.upgrade.toLowerCase() !== 'websocket') {

@@ -145,7 +145,7 @@ throw new Error('invalid headers');

}
// calc key
var key = req.headers['sec-websocket-key'];
var shasum = crypto.createHash('sha1');
shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
var key = req.headers['sec-websocket-key'];
var shasum = crypto.createHash('sha1');
shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
key = shasum.digest('base64');

@@ -152,0 +152,0 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Packages

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc