mirror of
https://github.com/sstent/node.git
synced 2026-01-26 15:12:37 +00:00
80 lines
2.5 KiB
JavaScript
80 lines
2.5 KiB
JavaScript
var Buffer = require('buffer').Buffer;
|
|
|
|
function OutgoingPacket(size, num) {
|
|
this.buffer = new Buffer(size + 3 + 1);
|
|
this.index = 0;
|
|
this.writeNumber(3, size);
|
|
this.writeNumber(1, num || 0);
|
|
};
|
|
module.exports = OutgoingPacket;
|
|
|
|
OutgoingPacket.prototype.writeNumber = function(bytes, number) {
|
|
for (var i = 0; i < bytes; i++) {
|
|
this.buffer[this.index++] = (number >> (i * 8)) & 0xff;
|
|
}
|
|
};
|
|
|
|
OutgoingPacket.prototype.writeFiller = function(bytes) {
|
|
for (var i = 0; i < bytes; i++) {
|
|
this.buffer[this.index++] = 0;
|
|
}
|
|
};
|
|
|
|
OutgoingPacket.prototype.write = function(bufferOrString, encoding) {
|
|
if (typeof bufferOrString == 'string') {
|
|
this.index += this.buffer.write(bufferOrString, this.index, encoding);
|
|
return;
|
|
}
|
|
|
|
bufferOrString.copy(this.buffer, this.index, 0);
|
|
this.index += bufferOrString.length;
|
|
};
|
|
|
|
OutgoingPacket.prototype.writeNullTerminated = function(bufferOrString, encoding) {
|
|
this.write(bufferOrString, encoding);
|
|
this.buffer[this.index++] = 0;
|
|
};
|
|
|
|
OutgoingPacket.prototype.writeLengthCoded = function(bufferOrStringOrNumber, encoding) {
|
|
if (bufferOrStringOrNumber === null) {
|
|
this.buffer[this.index++] = 251;
|
|
return;
|
|
}
|
|
|
|
if (typeof bufferOrStringOrNumber == 'number') {
|
|
if (bufferOrStringOrNumber <= 250) {
|
|
this.buffer[this.index++] = bufferOrStringOrNumber;
|
|
return;
|
|
}
|
|
|
|
// @todo support 8-byte numbers and simplify this
|
|
if (bufferOrStringOrNumber < 0xffff) {
|
|
this.buffer[this.index++] = 252;
|
|
this.buffer[this.index++] = (bufferOrStringOrNumber >> 0) & 0xff;
|
|
this.buffer[this.index++] = (bufferOrStringOrNumber >> 8) & 0xff;
|
|
} else if (bufferOrStringOrNumber < 0xffffff) {
|
|
this.buffer[this.index++] = 253;
|
|
this.buffer[this.index++] = (bufferOrStringOrNumber >> 0) & 0xff;
|
|
this.buffer[this.index++] = (bufferOrStringOrNumber >> 8) & 0xff;
|
|
this.buffer[this.index++] = (bufferOrStringOrNumber >> 16) & 0xff;
|
|
} else {
|
|
throw new Error('8 byte length coded numbers not supported yet');
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (bufferOrStringOrNumber instanceof Buffer) {
|
|
this.writeLengthCoded(bufferOrStringOrNumber.length);
|
|
this.write(bufferOrStringOrNumber);
|
|
return;
|
|
}
|
|
|
|
if (typeof bufferOrStringOrNumber == 'string') {
|
|
this.writeLengthCoded(Buffer.byteLength(bufferOrStringOrNumber, encoding));
|
|
this.write(bufferOrStringOrNumber, encoding);
|
|
return;
|
|
}
|
|
|
|
throw new Error('passed argument not a buffer, string or number: '+bufferOrStringOrNumber);
|
|
};
|