Pure JavaScript implementation of the Avro
specification.
```javascript const type = avro.Type.forSchema({
const buf = type.toBuffer({kind: 'CAT', name: 'Albert'}); // Encoded buffer. const val = type.fromBuffer(buf); // = {kind: 'CAT', name: 'Albert'} ```
```javascript const type = avro.Type.forValue({
// We can use
```javascript const snappy = require('snappy'); // Or your favorite Snappy library. const codecs = {
avro.createFileDecoder('./values.avro', {codecs})
```javascript // We first generate a protocol from its IDL specification. const protocol = avro.readProtocol(`
// We then create a corresponding server, implementing our endpoint. const server = avro.Service.forProtocol(protocol)
Features
- Blazingly fast and compactbenchmarks serialization! Typically faster than
- All the Avro goodness and more: type inferencetype-inference, schema
- Support for serializing arbitrary JavaScript objectslogical-types.
- Unopinionated 64-bit integer compatibilitycustom-long.
Installation
$ npm install avsc
avsc
is compatible with all versions of node.js since 0.11
.Documentation
Examples
Inside a node.js module, or using browserify:const avro = require('avsc');
- Encode and decode values from a known schema:
```javascript const type = avro.Type.forSchema({
type: 'record',
name: 'Pet',
fields: [
{
name: 'kind',
type: {type: 'enum', name: 'PetKind', symbols: ['CAT', 'DOG']}
},
{name: 'name', type: 'string'}
]
});const buf = type.toBuffer({kind: 'CAT', name: 'Albert'}); // Encoded buffer. const val = type.fromBuffer(buf); // = {kind: 'CAT', name: 'Albert'} ```
- Infer a value's schema and encode similar values:
```javascript const type = avro.Type.forValue({
city: 'Cambridge',
zipCodes: ['02138', '02139'],
visits: 2
});// We can use
type
to encode any values with the same structure:
const bufs = type.toBuffer({city: 'Seattle', zipCodes: ['98101'], visits: 3}),
type.toBuffer({city: 'NYC', zipCodes: [], visits: 0})
;
```- Get a readable streamreadable-stream of decoded values from an Avro
BlockDecoder
APIdecoder-api for an example including checksum validation):```javascript const snappy = require('snappy'); // Or your favorite Snappy library. const codecs = {
snappy: function (buf, cb) {
// Avro appends checksums to compressed blocks, which we skip here.
return snappy.uncompress(buf.slice(0, buf.length - 4), cb);
}
};avro.createFileDecoder('./values.avro', {codecs})
.on('metadata', function (type) { /* `type` is the writer's type. */ })
.on('data', function (val) { /* Do something with the decoded value. */ });
```- Implement a TCP server for an IDL-definedidl protocol:
```javascript // We first generate a protocol from its IDL specification. const protocol = avro.readProtocol(`
protocol LengthService {
/** Endpoint which returns the length of the input string. */
int stringLength(string str);
}
`);// We then create a corresponding server, implementing our endpoint. const server = avro.Service.forProtocol(protocol)
.createServer()
.onStringLength(function (str, cb) { cb(null, str.length); });
// Finally, we use our server to respond to incoming TCP connections!
require('net').createServer().on('connection', (con) => { server.createChannel(con); })
.listen(24950);
```