JSPM

  • Created
  • Published
  • Downloads 207
  • Score
    100M100P100Q79826F
  • License MIT

Zero-copy binary data types

Package Exports

  • @hazae41/binary

Readme

Zero-copy binary data types 🏎️

npm i @hazae41/binary

Node Package 📦

Current features

  • 100% TypeScript and ESM
  • No external dependencies
  • Unit-tested
  • Zero-copy reading and writing

Usage

Cursor

Writing

const cursor = Cursor.allocUnsafe(1024)

cursor.writeUint8(123)
cursor.writeUint16(1234)

console.log(cursor.offset) // 3

Reading

const bytes = new Uint8Array(/*...*/)
const cursor = new Cursor(bytes)

const uint8 = cursor.readUint8()
const uint16 = cursor.readUint16()

console.log(cursor.offset) // 3

Binary data types

Writable

class MyObject implements Writable {

  constructor(
    readonly x: number,
    readonly y: number
  ) {}

  size() {
    return 1 + 2
  }

  write(cursor: Cursor) {
    cursor.writeUint8(this.x)
    cursor.writeUint16(this.y)
  }

}
const myobject = new MyObject(1, 515)
const bytes = Writable.toBytes(myobject) // Uint8Array([1, 2, 3])

Readable

class MyObject {

  constructor(
    readonly x: number,
    readonly y: number
  ) {}

  static read(cursor: Cursor) {
    const x = cursor.readUint8()
    const y = cursor.readUint16()

    return new this(x, y)
  }

}
const bytes = new Uint8Array([1, 2, 3])
const myobject = Readable.fromBytes(MyObject, bytes) // MyObject(1, 515)

Opaque

This is a binary data type that just holds bytes, it can be used when a binary data type is required

const bytes = new Uint8Array([1, 2, 3])
const opaque = Readable.fromBytes(SafeOpaque, bytes) // Opaque(Uint8Array([1, 2, 3]))
const myobject = opaque.into(MyObject) // MyObject(1, 515)
const myobject = new MyObject(1, 515)
const opaque = Opaque.from(myobject) // Opaque(Uint8Array([1, 2, 3]))
const bytes = Writable.toBytes(opaque) // Uint8Array([1, 2, 3])