blob: 39c58fd1545d8353cbaa94c87bfc777c654cc414 [file] [log] [blame]
var tape = require("tape");
var protobuf = require("..");
var oldBufferImpl = Buffer.alloc === undefined;
// extends Buffer
(CustomBuffer.prototype = Object.create(Buffer.prototype)).constructor = CustomBuffer;
function CustomBuffer(arg, encodingOrOffset, length) {
Buffer.call(this, arg, encodingOrOffset, length);
CustomBuffer.toCustom(this);
}
CustomBuffer.isBuffer = Buffer.isBuffer.bind(Buffer);
CustomBuffer.toCustom = function (b) {
b._isCustom = true;
return b;
}
CustomBuffer.isCustom = function (b) {
return !!b._isCustom;
}
CustomBuffer.from = function (valueOf, encodingOrOffset, length) {
return CustomBuffer.toCustom(oldBufferImpl
? new Buffer(valueOf, encodingOrOffset, length)
: Buffer.from(valueOf, encodingOrOffset, length)
);
}
CustomBuffer.alloc = function (size, fill, encoding) {
return CustomBuffer.toCustom(oldBufferImpl
? new Buffer(size, fill, encoding)
: Buffer.alloc(size, fill, encoding)
);
}
CustomBuffer.allocUnsafe = function (size) {
return CustomBuffer.toCustom(oldBufferImpl
? new Buffer(size)
: Buffer.allocUnsafe(size)
);
}
CustomBuffer.prototype.slice = function (start, end) {
return CustomBuffer.toCustom(this.slice(start, end));
}
tape.test("configure a custom encoder/decoder for bytes", function(test) {
var oldBuffer = protobuf.util.Buffer;
protobuf.util.Buffer = CustomBuffer;
protobuf.configure();
var root = protobuf.Root.fromJSON({
nested: {
test: {
nested: {
Test: {
fields: {
data: {
type: "bytes",
id: 1
}
}
}
}
}
}
});
var Test = root.lookup("test.Test");
var buffer = Test.encode({
data: CustomBuffer.from('some-data')
}).finish();
test.ok(CustomBuffer.isCustom(buffer), "should encode the message with a custom buffer");
var decoded = Test.decode(buffer);
test.ok(CustomBuffer.isCustom(decoded.data), "should decode `data` into a custom buffer");
protobuf.util.Buffer = oldBuffer;
protobuf.configure();
test.end();
});