JavaScript Avro implementation
npm install avro-jsPure JavaScript implementation of the Avro specification.
+ Fast! Typically twice as fast as JSON with much smaller encodings.
+ Full Avro support, including recursive schemas, sort order, and evolution.
+ Serialization of arbitrary JavaScript objects via logical types.
+ Unopinionated 64-bit integer compatibility.
+ No dependencies, avro-js even runs in the browser.
``bash`
$ npm install avro-js
avro-js is compatible with all versions of [node.js][] since 0.11 and major
browsers via [browserify][].
See doc/ folder.
Inside a node.js module, or using browserify:
`javascript`
var avro = require('avro-js');
+ Encode and decode objects:
`javascript`
// We can declare a schema inline:
var type = avro.parse({
name: 'Pet',
type: 'record',
fields: [
{name: 'kind', type: {name: 'Kind', type: 'enum', symbols: ['CAT', 'DOG']}},
{name: 'name', type: 'string'}
]
});
var pet = {kind: 'CAT', name: 'Albert'};
var buf = type.toBuffer(pet); // Serialized object.
var obj = type.fromBuffer(buf); // {kind: 'CAT', name: 'Albert'}
+ Generate random instances of a schema:
`javascript`
// We can also parse a JSON-stringified schema:
var type = avro.parse('{"type": "fixed", "name": "Id", "size": 4}');
var id = type.random(); // E.g. Buffer([48, 152, 2, 123])
+ Check whether an object fits a given schema:
`javascript`
// Or we can specify a path to a schema file (not in the browser):
var type = avro.parse('./Person.avsc');
var person = {name: 'Bob', address: {city: 'Cambridge', zip: '02139'}};
var status = type.isValid(person); // Boolean status.
+ Get a [readable stream][readable-stream] of decoded records from an Avro
container file (not in the browser):
`javascripttype
avro.createFileDecoder('./records.avro')
.on('metadata', function (type) { / is the writer's type. / })`
.on('data', function (record) { / Do something with the record. / });
+ Implement recursive schemata (due to lack of duck-typing):
`javascript
// example type: linked list with one long-int as element value
const recursiveRecordType = avro.parse({
"type": "record",
"name": "LongList",
"fields" : [
{"name": "value", "type": "long"},
{"name": "next", "type": ["null", "LongList"]} // optional next element via recursion
]
});
// will work
const validRecursiveRecordDTO = {
value: 1,
next: {
// no duck-typing support: from first nested level on the
// recursive type has to be explicitly specified.
LongList: {
value: 2,
next: null
}
}
};
const serializedValid = recursiveRecordType.parse(validRecursiveRecordDTO);
// will throw error
const invalidRecursiveRecordDTO = {
value: 1,
next: {
value: 2,
next: null
}
};
const serializedInvalid = recursiveRecordType.parse(invalidRecursiveRecordDTO);
``
[node.js]: https://nodejs.org/en/
[readable-stream]: https://nodejs.org/api/stream.html#stream_class_stream_readable
[browserify]: http://browserify.org/