msgpack4
Version:
A space-efficient object serialization library for node.js
67 lines (55 loc) • 1.55 kB
JavaScript
// Verify that a msgpack.Stream can handle partial messages arriving.
var assert = require('assert');
var buffer = require('buffer');
var msgpack = require('msgpack');
var net = require('net');
var netBindings = process.binding('net');
var sys = require('sys');
var MSGS = [
[1, 2, 3],
{'a' : 1, 'b' : 2},
{'test' : [1, 'a', 3]}
];
// Write a buffer to a stream with a delay
var writemsg = function(s, buf, delay) {
setTimeout(function() {
sys.debug(sys.inspect(buf));
s.write(buf);
},
delay
);
};
var fds = netBindings.socketpair();
var is = new net.Stream(fds[0]);
var ims = new msgpack.Stream(is);
var os = new net.Stream(fds[1]);
var msgsReceived = 0;
ims.addListener('msg', function(m) {
sys.debug('received msg: ' + sys.inspect(m));
assert.deepEqual(m, MSGS[msgsReceived]);
if (++msgsReceived == MSGS.length) {
is.end();
os.end();
}
});
is.resume();
// Serialize the messages into a single large buffer
var buf = new buffer.Buffer(0);
MSGS.forEach(function (m) {
var b = msgpack.pack(m);
var bb = new buffer.Buffer(buf.length + b.length);
buf.copy(bb, 0, 0, buf.length);
b.copy(bb, buf.length, 0, b.length);
buf = bb;
});
// Slice our single large buffer into 3 pieces and send them all off
// separately.
var nwrites = 3;
var sz = Math.ceil(buf.length / nwrites);
for (var i = 0; i < nwrites; i++) {
writemsg(
os,
buf.slice(i * sz, Math.min((i + 1) * sz, buf.length)),
(i + 1) * 1000
);
}