var Stream = require('stream'); var sockjs = require('sockjs-client'); var resolve = require('url').resolve; var parse = require('url').parse; module.exports = function (u, cb) { var uri = parse(u).protocol ? u : resolve(window.location.href, u); var stream = new Stream; stream.readable = true; stream.writable = true; var ready = false; var buffer = []; var sock = sockjs(uri); stream.sock = sock; stream.write = function (msg) { if (!ready || buffer.length) buffer.push(msg) else sock.send(msg) }; stream.end = function (msg) { if (msg !== undefined) stream.write(msg); if (!ready) { stream._ended = true; return; } stream.writable = false; sock.close(); }; stream.destroy = function () { stream._ended = true; stream.writable = stream.readable = false; buffer.length = 0 sock.close(); }; sock.onopen = function () { if (typeof cb === 'function') cb(); ready = true; for (var i = 0; i < buffer.length; i++) { sock.send(buffer[i]); } buffer = []; stream.emit('connect'); if (stream._ended) stream.end(); }; sock.onmessage = function (e) { stream.emit('data', e.data); }; sock.onclose = function () { stream.emit('end'); stream.writable = false; stream.readable = false; }; return stream; };