buffer = new Buffer(1024 * 1024);
buffer_size = 0;
client = new net.Socket();
client.on('data', function(data){
data.copy(buffer, buffer_size, 0, data.length);
buffer_size += data.length;
while (packet = getPacket()){
//process packet
}
});
function getPacket(){
if (buffer_size >= 4 && buffer_size >= buffer.readUint32LE(0)){
const packet_size = buffer.readUint32LE(0);
const packet = new Buffer(packet_size);
buffer.copy(packet, 0, 0, packet_size);
buffer.copy(buffer, 0, packet_size, buffer_size); // cut off a full packet
buffer_size -= packet_size;
return packet;
}
}
YnVmZmVyID0gbmV3IEJ1ZmZlcigxMDI0ICogMTAyNCk7CmJ1ZmZlcl9zaXplID0gMDsKCmNsaWVudCA9IG5ldyBuZXQuU29ja2V0KCk7CmNsaWVudC5vbignZGF0YScsIGZ1bmN0aW9uKGRhdGEpewoJZGF0YS5jb3B5KGJ1ZmZlciwgYnVmZmVyX3NpemUsIDAsIGRhdGEubGVuZ3RoKTsKCWJ1ZmZlcl9zaXplICs9IGRhdGEubGVuZ3RoOwoJd2hpbGUgKHBhY2tldCA9IGdldFBhY2tldCgpKXsKCQkvL3Byb2Nlc3MgcGFja2V0Cgl9Cn0pOwoKZnVuY3Rpb24gZ2V0UGFja2V0KCl7CglpZiAoYnVmZmVyX3NpemUgPj0gNCAmJiBidWZmZXJfc2l6ZSA+PSBidWZmZXIucmVhZFVpbnQzMkxFKDApKXsKCQljb25zdCBwYWNrZXRfc2l6ZSA9IGJ1ZmZlci5yZWFkVWludDMyTEUoMCk7CgkJY29uc3QgcGFja2V0ID0gbmV3IEJ1ZmZlcihwYWNrZXRfc2l6ZSk7CgkJYnVmZmVyLmNvcHkocGFja2V0LCAwLCAwLCBwYWNrZXRfc2l6ZSk7CgkJYnVmZmVyLmNvcHkoYnVmZmVyLCAwLCBwYWNrZXRfc2l6ZSwgYnVmZmVyX3NpemUpOyAvLyBjdXQgb2ZmIGEgZnVsbCBwYWNrZXQKCQlidWZmZXJfc2l6ZSAtPSBwYWNrZXRfc2l6ZTsKCQlyZXR1cm4gcGFja2V0OwoJfQp9