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(); });