GitHub - polyglotted/msgpack-javascript: MessagePack serializer implementation for JavaScript / msgpack.org[JavaScript]
JavaScript ES6 implementation of the MessagePack protocol.
Design Goals
- Isomorphic
- Single codebase to serve both Browser and Node environments
- Future Ready
- Source and tests written in ES6
Installation
Basic Usage
Import
import {Packer, Unpacker} from 'msgpack-javascript';
Pack
let packer = new Packer(); packer.packNil(); packer.packBoolean(true); packer.packInt(0); packer.packInt(255); packer.packInt(65535); packer.packInt(-2147483648); packer.packInt(Date.now()); packer.packFloat(1.4e-45); packer.packDouble(4.9e-324); packer.packString('yo fibre'); packer.packArray([0, true, 'p']); packer.packBinary([0, 10, 255]); packer.packMap(new Map([[0, 'foo'], [1, 'bar']]));
Unpack
let unpacker = new Unpacker(packer.getBytes()), actual = {}; unpacker = new Unpacker(packer.getBytes()); actual.nil = unpacker.unpackNil(); actual.boolean = unpacker.unpackBoolean(); actual.fixnum = unpacker.unpackInt(); actual.byte = unpacker.unpackInt(); actual.short = unpacker.unpackInt(); actual.int = unpacker.unpackInt(); actual.long = unpacker.unpackInt(); actual.float = unpacker.unpackFloat(); actual.double = unpacker.unpackDouble(); actual.string = unpacker.unpackString(); actual.array = unpacker.unpackArray(); actual.binary = unpacker.unpackBinary(); actual.map = unpacker.unpackMap();
Reflect
Packer.packValue allows packing of any value that may be identified as one of the standard value types (excluding Extended).
let packer = new Packer(); packer.packValue(); // packs nil packer.packValue(true); // packs bool packer.packValue(0); // packs pos fixint packer.packValue(255); // packs uint8 packer.packValue(65535); // packs uint16 packer.packValue(-2147483648); // packs int32 packer.packValue(Date.now()); // packs uint64 packer.packValue(3.4028234 * Math.pow(10, 38)); // packs float32 packer.packValue(1.7976931348623157 * Math.pow(10, 308)); // packs float64 packer.packValue('yo fibre'); // packs fixed string packer.packValue([0, true, 'p']); // packs fixed array packer.packValue([0, 10, 255]); // packs bin8 packer.packValue(new Map([[0, 'foo'], [1, 'bar']])); // packs fixed map packer.packValue({foo: 'bar'}); // throws error
Unpacker.unpackValue unpacks the next value by evaluating the prefix of the next byte to be read.
Type Mapping
Source Format => JavaScript Type
| Source Format | JavaScript Type |
|---|---|
| pos fixint, neg fixint, int 8/16/32 and uint 8/16/32 | Number |
| int 64 and uint 64 | Long |
| nil | undefined |
| false and true | Boolean |
| float 32/64 | Number |
| fixstr and str 8/16/32 | String |
| bin 8/16/32 | Array (of bytes) |
| fixarray and array 16/32 | Array |
| fixmap map 16/32 | Map |
| fixext and ext 8/16/32 | Extended |
JavaScript Type => Output Format
| JavaScript Type | Output Format |
|---|---|
| Number, Long | pos fixint, neg fixint, int 8/16/32/64, uint 8/16/32/64, float 32/64 |
| undefined, null | nil |
| Boolean | false and true |
| String | fixstr and str 8/16/32 |
| Array (of bytes) | bin 8/16/32 |
| Array | fixarray and array 16/32 |
| Map | fixmap map 16/32 |
64-bit Integers
Support for 64-bit integers is realised via npm package pg-long.
