protocol-buffers
Protocol Buffers for Node.js
npm install protocol-buffers
Usage
Assuming the following test.proto
file exists
enum FOO {
BAR = 1;
}
message Test {
required float num = 1;
required string payload = 2;
}
message AnotherOne {
repeated FOO list = 1;
}
Use the above proto file to encode/decode messages by doing
var protobuf = require('protocol-buffers')
var messages = protobuf(fs.readFileSync('test.proto'))
var buf = messages.Test.encode({
num: 42,
payload: 'hello world'
})
console.log(buf)
To decode a message use Test.decode
var obj = messages.Test.decode(buf)
console.log(obj)
You can also use protocol-buffers/require
to require .proto files from disk instead of
passing them as buffers.
var protobuf = require('protocol-buffers/require')
var messages = protobuf('test.proto')
Enums are accessed in the same way as messages
var buf = messages.AnotherOne.encode({
list: [
messages.FOO.BAR
]
})
See the Google Protocol Buffers docs for more information about the
available types etc.
Performance
This module is fast.
It uses code generation to build as fast as possible encoders/decoders for the protobuf schema.
You can run the benchmarks yourself by doing npm run bench
.
On my Macbook Air it gives the following results
Benchmarking JSON (baseline)
Running object encoding benchmark...
Encoded 1000000 objects in 2142 ms (466853 enc/s)
Running object decoding benchmark...
Decoded 1000000 objects in 970 ms (1030928 dec/s)
Running object encoding+decoding benchmark...
Encoded+decoded 1000000 objects in 3131 ms (319387 enc+dec/s)
Benchmarking protocol-buffers
Running object encoding benchmark...
Encoded 1000000 objects in 2089 ms (478698 enc/s)
Running object decoding benchmark...
Decoded 1000000 objects in 735 ms (1360544 dec/s)
Running object encoding+decoding benchmark...
Encoded+decoded 1000000 objects in 2826 ms (353857 enc+dec/s)
Note that JSON parsing/serialization in node is a native function that is really fast.
Leveldb encoding compatibility
Compiled protocol buffers messages are valid levelup encodings.
This means you can pass them as valueEncoding
and keyEncoding
.
var level = require('level')
var db = level('db')
db.put('hello', {payload:'world'}, {valueEncoding:messages.Test}, function(err) {
db.get('hello', {valueEncoding:messages.Test}, function(err, message) {
console.log(message)
})
})
License
MIT