this.onFlush = callback;
};
TFramedTransport.receiver = function(callback) {
- var frameLeft = 0,
- framePos = 0,
- frame = null;
var residual = null;
return function(data) {
// Prepend any residual data from our previous read
if (residual) {
- var dat = new Buffer(data.length + residual.length);
- residual.copy(dat, 0, 0);
- data.copy(dat, residual.length, 0);
+ data = Buffer.concat([residual, data]);
residual = null;
}
// framed transport
while (data.length) {
- if (frameLeft === 0) {
- // TODO assumes we have all 4 bytes
- if (data.length < 4) {
- console.log("Expecting > 4 bytes, found only " + data.length);
- residual = data;
- throw new InputBufferUnderrunError();
- //throw Error("Expecting > 4 bytes, found only " + data.length);
- }
- frameLeft = binary.readI32(data, 0);
- frame = new Buffer(frameLeft);
- framePos = 0;
- data = data.slice(4, data.length);
+ if (data.length < 4) {
+ // Not enough bytes to continue, save and resume on next packet
+ residual = data;
+ return;
}
-
- if (data.length >= frameLeft) {
- data.copy(frame, framePos, 0, frameLeft);
- data = data.slice(frameLeft, data.length);
-
- frameLeft = 0;
- callback(new TFramedTransport(frame));
- } else if (data.length) {
- data.copy(frame, framePos, 0, data.length);
- frameLeft -= data.length;
- framePos += data.length;
- data = data.slice(data.length, data.length);
- throw new InputBufferUnderrunError();
+ var frameSize = binary.readI32(data, 0);
+ if (data.length < 4 + frameSize) {
+ // Not enough bytes to continue, save and resume on next packet
+ residual = data;
+ return;
}
+
+ var frame = data.slice(4, 4 + frameSize);
+ residual = data.slice(4 + frameSize);
+
+ callback(new TFramedTransport(frame));
+
+ data = residual;
+ residual = null;
}
};
};