msgpack / msgpack-node

MessagePack implementation for Node.js
Other
312 stars 71 forks source link

Change the timing to emit 'msg' event to consume a buffer in advance #32

Open shinichy opened 9 years ago

shinichy commented 9 years ago

When I work with msgpack.Stream + deasync(https://github.com/abbr/deasync), the following program causes stack overflow. This issue is caused because msgpack.Stream emits 'msg' event before it consumes a buffer and deasync allows processing io events before finishing 'msg' event callbacks. I know this doesn't usually happen but it's better to emit 'msg' after consuming a buffer to handle this kind of case.

'use strict'

var net = require('net');
var path = '/tmp/deasync.sock';
var msgpack = require('msgpack');

var server = net.createServer(function(c) {
  c.on('data', function() {
    c.write(msgpack.pack('foo'));
  });
  c.on('end', function() {
    console.log('end')
    server.close()
  })
  c.write(msgpack.pack('hello'));
});
server.listen(path);

var done = false;
var client = net.createConnection(path)
var stream = new msgpack.Stream(client)
stream.on('msg', function(msg) {
  console.log('msg: ' + msg)
  if (msg === 'hello') {
    client.write(msgpack.pack('foo'));
    require('deasync').loopWhile(() => !done);
    console.log('done');
    client.end()
  } else if (msg === 'foo') {
    done = true;
  }
});

Output

msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
msg: hello
:0

RangeError: Maximum call stack size exceeded