length-prefixed-message
Version:
Reads and writes binary length prefixed messages.
63 lines (51 loc) • 1.36 kB
JavaScript
var varint = require('varint');
var POOL_SIZE = 100000;
var MINIMUM_POOL_LENGTH = 100;
var pool = Buffer.alloc(POOL_SIZE);
exports.read = function(stream, cb) {
var msglen = 0;
var prev = null;
var lock = false;
var unlock = function() {
lock = false
};
var readable = function() {
if (lock) return;
lock = true;
if (!msglen) {
var buf = stream.read();
if (!buf) return unlock();
if (prev) {
buf = Buffer.concat([prev, buf]);
prev = null;
}
for (var i = 0; i < buf.length; i++) {
if (!(buf[i] & 0x80)) {
msglen = varint.decode(buf);
break;
}
}
if (!msglen) {
prev = buf;
return unlock();
}
buf = buf.slice(varint.decode.bytes);
stream.unshift(buf);
}
var chunk = stream.read(msglen);
if (!chunk) return unlock();
stream.removeListener('readable', readable);
cb(chunk)
};
stream.on('readable', readable);
readable();
};
exports.write = function(stream, msg) {
if (typeof msg === 'string') msg = Buffer.from(msg);
varint.encode(msg.length, pool);
var lenBuf = pool.slice(0, varint.encode.bytes);
pool = pool.slice(varint.encode.bytes);
if (pool.length < MINIMUM_POOL_LENGTH) pool = Buffer.alloc(POOL_SIZE);
stream.write(lenBuf);
stream.write(msg);
};