avro-js

1.12.0 • Public • Published

Avro-js

Pure JavaScript implementation of the Avro specification.

Features

  • 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.

Installation

$ npm install avro-js

avro-js is compatible with all versions of node.js since 0.11 and major browsers via browserify.

Documentation

See doc/ folder.

Examples

Inside a node.js module, or using browserify:

var avro = require('avro-js');
  • Encode and decode objects:

    // 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:

    // 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:

    // 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 of decoded records from an Avro container file (not in the browser):

    avro.createFileDecoder('./records.avro')
      .on('metadata', function (type) { /* `type` is the writer's type. */ })
      .on('data', function (record) { /* Do something with the record. */ });
  • Implement recursive schemata (due to lack of duck-typing):

      // 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);
    

Readme

Keywords

Package Sidebar

Install

npm i avro-js

Weekly Downloads

36,299

Version

1.12.0

License

Apache-2.0

Unpacked Size

170 kB

Total Files

13

Last publish

Collaborators

  • mtth
  • fokko
  • rdblue
  • sacharya
  • busbey
  • ryanskraba
  • iemejia