Skip to content

Instantly share code, notes, and snippets.

@bodokaiser
Last active December 15, 2015 14:58
Show Gist options
  • Save bodokaiser/5277842 to your computer and use it in GitHub Desktop.
Save bodokaiser/5277842 to your computer and use it in GitHub Desktop.
stream.Readable returns data on first read call even it first should buffer
var util = require('util');
var http = require('http');
var stream = require('stream');
var crypto = require('crypto');
var server = http.createServer();
server.on('request', function(request, response) {
response.writeHead(200, { "Content-Type": "text/plain" });
response.end('Hello World\n');
});
server.on('upgrade', function(request, socket) {
var key = request.headers['sec-websocket-key'];
var accept = generateAccept(key);
socket.write(util.format(
'HTTP/1.1 101 Switching Protocols\r\n' +
'Upgrade: websocket\r\n' +
'Connection: upgrade\r\n' +
'Sec-WebSocket-Accept: %s\r\n' +
'Sec-WebSocket-Version: 13\r\n' +
'\r\n', accept));
var wsstream = new stream.Readable();
console.log(wsstream);
wsstream._read = function() {
var chunk = socket.read();
if (chunk === null)
return this.push('');
this.push(chunk);
};
wsstream.on('readable', function() {
console.log('stream', wsstream.read());
});
console.log(wsstream);
socket.on('readable', function() {
// using wsstream.read() would return all data here
console.log('socket', wsstream.read(0));
});
});
server.listen(3000);
function generateAccept(key) {
var GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
return crypto.createHash('sha1').update(key.trim() + GUID).digest('base64');
}
@bodokaiser
Copy link
Author

To use it run node stream.js and open a WebBrowser with console. In the console you type in:

var ws = new WebSocket('ws://localhost:3000');

now you can send frames as you like with:

ws.send('some text message');

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment