Socket
Socket
Sign inDemoInstall

ws

Package Overview
Dependencies
Maintainers
1
Versions
169
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ws - npm Package Compare versions

Comparing version 0.4.14 to 0.4.15

8

examples/fileapi/server.js

@@ -7,3 +7,3 @@ var WebSocketServer = require('../../').Server

, path = require('path')
, app = express()
, app = express.createServer()
, events = require('events')

@@ -49,6 +49,4 @@ , ansi = require('ansi')

var server = http.createServer(app);
var clientId = 0;
var wss = new WebSocketServer({server: server});
var wss = new WebSocketServer({server: app});
wss.on('connection', function(ws) {

@@ -105,4 +103,4 @@ var thisId = ++clientId;

console.log('Remember to wipe this directory if you upload lots and lots.');
server.listen(8080);
app.listen(8080);
console.log('Listening on http://localhost:8080');
});
var WebSocketServer = require('../../').Server
, http = require('http')
, express = require('express')
, app = express();
, app = express.createServer();
app.use(express.static(__dirname + '/public'));
var server = http.createServer(app);
var wss = new WebSocketServer({server: server});
var wss = new WebSocketServer({server: app});
wss.on('connection', function(ws) {

@@ -22,2 +20,2 @@ var id = setInterval(function() {

server.listen(8080);
app.listen(8080);

@@ -0,1 +1,9 @@

v0.4.15 - May 20th 2012
=====================
* Enable fauxe streaming for hixie tansport. [einaros]
* Allow hixie sender to deal with buffers. [einaros/pigne]
* Allow error code 1011. [einaros]
* Fix framing for empty packets (empty pings and pongs might break). [einaros]
* Improve error and close handling, to avoid connections lingering in CLOSING state. [einaros]
v0.4.14 - Apr 30th 2012

@@ -2,0 +10,0 @@ =====================

@@ -20,3 +20,5 @@ var spawn = require('child_process').spawn

});
gyp.on('exit', function(code) {});
gyp.on('exit', function(code) {
process.exit(code);
});
}

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

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

isValidErrorCode: function(code) {
return (code >= 1000 && code <= 1010 && code != 1004 && code != 1005 && code != 1006) ||
return (code >= 1000 && code <= 1011 && code != 1004 && code != 1005 && code != 1006) ||
(code >= 3000 && code <= 4999);

@@ -24,2 +24,3 @@ },

1010: 'extension handshake missing',
1011: 'an unexpected condition prevented the request from being fulfilled',
};

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

this.socket = socket;
this.continuationFrame = false;
this.isClosed = false;
}

@@ -35,2 +37,3 @@

Sender.prototype.send = function(data, options, cb) {
if (this.isClosed) return;
if (options && options.binary) {

@@ -41,9 +44,20 @@ this.error('hixie websockets do not support binary');

var length = Buffer.byteLength(data)
, buffer = new Buffer(2 + length);
var isString = typeof data == 'string'
, length = isString ? Buffer.byteLength(data) : data.length
, writeStartMarker = this.continuationFrame == false
, writeEndMarker = !options || !(typeof options.fin != 'undefined' && !options.fin)
, buffer = new Buffer((writeStartMarker ? 1 : 0) + length + (writeEndMarker ? 1 : 0))
, offset = writeStartMarker ? 1 : 0;
buffer.write('\x00', 'binary');
buffer.write(data, 1, 'utf8');
buffer.write('\xff', 1 + length, 'binary');
if (writeStartMarker) buffer.write('\x00', 'binary');
if (isString) buffer.write(data, offset, 'utf8');
else data.copy(buffer, offset, 0);
if (writeEndMarker) {
buffer.write('\xff', offset + length, 'binary');
this.continuationFrame = false;
}
else this.continuationFrame = true;
try {

@@ -63,5 +77,7 @@ this.socket.write(buffer, 'binary', cb);

Sender.prototype.close = function(code, data, mask, cb) {
var buffer = new Buffer([0xff, 0x00]);
if (this.isClosed) return;
this.isClosed = true;
try {
this.socket.write(buffer, 'binary', cb);
if (this.continuationFrame) this.socket.write(new Buffer([0xff], 'binary'));
this.socket.write(new Buffer([0xff, 0x00]), 'binary', cb);
} catch (e) {

@@ -68,0 +84,0 @@ this.error(e.toString());

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

try {
this._socket.write(new Buffer([opcode | (finalFragment ? 0x80 : 0), 0]), 'binary', cb);
this._socket.write(new Buffer([opcode | (finalFragment ? 0x80 : 0), 0 | (maskData ? 0x80 : 0)].concat(maskData ? [0, 0, 0, 0] : [])), 'binary', cb);
}

@@ -98,0 +98,0 @@ catch (e) {

@@ -28,2 +28,6 @@ /*!

// Close timeout
var closeTimeout = 30000; // Allow 5 seconds to terminate the connection cleanly
/**

@@ -87,8 +91,9 @@ * Node version 0.4 and 0.6 compatibility

this._sender.close(code, data, mask);
this.terminate();
}
catch (e) {
delete this._queue;
this.emit('error', e);
}
finally {
this.terminate();
}
}

@@ -249,5 +254,21 @@

WebSocket.prototype.terminate = function() {
if (this._socket) this._socket.end();
if (this.readyState == WebSocket.CLOSED) return;
if (this._socket) {
try {
// End the connection
this._socket.end();
}
catch (e) {
// Socket error during end() call, so just destroy it right now
cleanupWebsocketResources.call(this, true);
return;
}
// Add a timeout to ensure that the connection is completely
// cleaned up within 30 seconds, even if the clean close procedure
// fails for whatever reason
setTimeout(cleanupWebsocketResources.bind(this, true), closeTimeout);
}
else if (this.readyState == WebSocket.CONNECTING) {
this.readyState = WebSocket.CLOSED;
cleanupWebsocketResources.call(this, true);
}

@@ -423,3 +444,2 @@ };

(isNodeV4 ? agent : req).on('error', function(error) {
delete self._queue;
self.emit('error', error);

@@ -437,3 +457,2 @@ });

if (typeof serverKey == 'undefined' || serverKey !== expectedServerKey) {
delete self._queue;
self.emit('error', 'invalid server key');

@@ -447,3 +466,3 @@ removeAllListeners(self);

// cleanup
// perform cleanup on http resources
removeAllListeners(isNodeV4 ? agent : req);

@@ -463,35 +482,11 @@ req = null;

var self = this;
var receiver = new ReceiverClass();
this._receiver = new ReceiverClass();
// socket cleanup handlers
function closeSocket() {
if (self.readyState == WebSocket.CLOSED) return;
self.readyState = WebSocket.CLOSED;
if (socket) {
socket.removeListener('end', closeSocket);
socket.removeListener('close', closeSocket);
socket.removeListener('data', firstHandler);
socket.removeListener('data', realHandler);
socket.end();
self._socket = null;
socket = null;
}
if (self._sender) {
removeAllListeners(self._sender);
delete self._sender;
}
if (receiver) {
removeAllListeners(receiver);
receiver.cleanup();
receiver = null;
}
self.emit('close', self._closeCode || 1000, self._closeMessage || '');
removeAllListeners(self);
}
socket.on('end', closeSocket);
socket.on('close', closeSocket);
socket.on('end', cleanupWebsocketResources.bind(this));
socket.on('close', cleanupWebsocketResources.bind(this));
// ensure that the upgradeHead is added to the receiver
function firstHandler(data) {
if (WebSocket.OPEN != self.readyState) return;
if (self.readyState != WebSocket.OPEN) return;
if (upgradeHead && upgradeHead.length > 0) {

@@ -501,3 +496,3 @@ self.bytesReceived += upgradeHead.length;

upgradeHead = null;
receiver.add(head);
self._receiver.add(head);
}

@@ -507,3 +502,3 @@ dataHandler = realHandler;

self.bytesReceived += data.length;
receiver.add(data);
self._receiver.add(data);
}

@@ -514,3 +509,3 @@ }

if (data) self.bytesReceived += data.length;
receiver.add(data);
self._receiver.add(data);
}

@@ -527,7 +522,7 @@ var dataHandler = firstHandler;

// receiver event handlers
receiver.on('text', function (data, flags) {
self._receiver.on('text', function (data, flags) {
flags = flags || {};
self.emit('message', data, flags);
});
receiver.on('binary', function (data, flags) {
self._receiver.on('binary', function (data, flags) {
flags = flags || {};

@@ -537,3 +532,3 @@ flags.binary = true;

});
receiver.on('ping', function(data, flags) {
self._receiver.on('ping', function(data, flags) {
flags = flags || {};

@@ -543,15 +538,12 @@ self.pong(data, {mask: !self._isServer, binary: flags.binary === true}, true);

});
receiver.on('pong', function(data, flags) {
self._receiver.on('pong', function(data, flags) {
self.emit('pong', data, flags);
});
receiver.on('close', function(code, data, flags) {
self._receiver.on('close', function(code, data, flags) {
flags = flags || {};
self.close(code, data, {mask: !self._isServer});
self.close(code, data);
});
receiver.on('error', function(reason, errorCode) {
self._receiver.on('error', function(reason, errorCode) {
// close the connection when the receiver reports a HyBi error code
if (typeof errorCode !== 'undefined') {
self.close(errorCode, '', {mask: !self._isServer});
}
delete self._queue;
self.close(typeof errorCode != 'undefined' ? errorCode : 1002, '');
self.emit('error', reason, errorCode);

@@ -563,3 +555,3 @@ });

this._sender.on('error', function(error) {
delete self._queue;
self.close(1002, '');
self.emit('error', error);

@@ -612,2 +604,30 @@ });

function cleanupWebsocketResources(error) {
if (this.readyState == WebSocket.CLOSED) return;
var emitClose = this.readyState != WebSocket.CONNECTING;
this.readyState = WebSocket.CLOSED;
if (this._socket) {
removeAllListeners(this._socket);
try {
if (!error) this._socket.end();
else this._socket.terminate();
}
catch (e) { /* Ignore termination errors */ }
this._socket = null;
}
if (this._sender) {
removeAllListeners(this._sender);
this._sender = null;
}
if (this._receiver) {
removeAllListeners(this._receiver);
this._receiver.cleanup();
this._receiver = null;
}
if (emitClose) this.emit('close', this._closeCode || 1000, this._closeMessage || '');
removeAllListeners(this);
this.on('error', function() {}); // catch all errors after this
delete this._queue;
}
function removeAllListeners(instance) {

@@ -620,2 +640,2 @@ if (isNodeV4) {

else instance.removeAllListeners();
}
}

@@ -217,3 +217,4 @@ /*!

catch (e) {
try { socket.end(); } catch (_) {}
// if the upgrade write fails, shut the connection down hard
try { socket.destroy(); } catch (e) {}
return;

@@ -254,3 +255,3 @@ }

// setup handshake completion to run after client has been verified
var self = this;
var self = this;
var onClientVerified = function() {

@@ -297,3 +298,3 @@ var protocol = req.headers['sec-websocket-protocol'];

catch (e) {
try { socket.end(); } catch (_) {}
try { socket.destroy(); } catch (e) {}
return;

@@ -369,2 +370,3 @@ }

}
// no client verification required
onClientVerified();

@@ -380,5 +382,8 @@ }

socket.write(response.concat('', '').join('\r\n'));
socket.end();
}
catch (e) {}
catch (e) { /* ignore errors - we've aborted this connection */ }
finally {
// ensure that an early aborted connection is shut down completely
try { socket.destroy(); } catch (e) {}
}
}

@@ -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.14",
"version": "0.4.15",
"repository": {

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

@@ -34,2 +34,17 @@ var assert = require('assert')

it('frames and sends a buffer', function(done) {
var received;
var socket = {
write: function(data, encoding, cb) {
received = data;
process.nextTick(cb);
}
};
var sender = new Sender(socket, {});
sender.send(new Buffer('foobar'), {}, function() {
received.toString('utf8').should.eql('\u0000foobar\ufffd');
done();
});
});
it('throws an exception for binary data', function(done) {

@@ -47,2 +62,21 @@ var socket = {

});
it('can fauxe stream data', function(done) {
var received = [];
var socket = {
write: function(data, encoding, cb) {
received.push(data);
process.nextTick(cb);
}
};
var sender = new Sender(socket, {});
sender.send(new Buffer('foobar'), { fin: false }, function() {});
sender.send('bazbar', { fin: false }, function() {});
sender.send(new Buffer('end'), { fin: true }, function() {
received[0].toString('utf8').should.eql('\u0000foobar');
received[1].toString('utf8').should.eql('bazbar');
received[2].toString('utf8').should.eql('end\ufffd');
done();
});
});
});

@@ -65,3 +99,21 @@

});
it('sends a message end marker if fauxe streaming has started, before hixie close frame', function(done) {
var received = [];
var socket = {
write: function(data, encoding, cb) {
received.push(data);
if (cb) process.nextTick(cb);
}
};
var sender = new Sender(socket, {});
sender.send(new Buffer('foobar'), { fin: false }, function() {});
sender.close(null, null, null, function() {
received[0].toString('utf8').should.eql('\u0000foobar');
received[1].toString('utf8').should.eql('\ufffd');
received[2].toString('utf8').should.eql('\ufffd\u0000');
done();
});
});
});
});
SocketSocket SOC 2 Logo

Product

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

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc