Skip to content

Latest commit

 

History

History

leb128

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

leb128

npm version npm downloads Twitter Follow

This project is part of the @thi.ng/umbrella monorepo.

About

WASM based Little Endian Base 128 varint encoding / decoding, supporting (u)int64 range (however for JS purposes only up to MAX_SAFE_INTEGER).

The WASM binary (~860 bytes) is embedded as base64 string in the TypeScript source to make it easier to use in both browser & node environments. The source code of the actual implementation (written in Zig) is included in /src/leb128.zig

All public functions throw an error if the WASM module could not be initialized.

References:

Status

STABLE - used in production

Search or submit any issues for this package

Installation

yarn add @thi.ng/leb128

ES module import:

<script type="module" src="https://cdn.skypack.dev/@thi.ng/leb128"></script>

Skypack documentation

For Node.js REPL:

# with flag only for < v16
node --experimental-repl-await

> const leb128 = await import("@thi.ng/leb128");

Package sizes (gzipped, pre-treeshake): ESM: 1.07 KB

Dependencies

API

Generated API docs

import * as leb from "@thi.ng/leb128";

// if WASM is unavailable, the encode/decode functions will throw an error
enc = leb.encodeULEB128(Number.MAX_SAFE_INTEGER);
// Uint8Array [ 255, 255, 255, 255, 255, 255, 255, 15 ]

// decoding returns tuple of [value, bytes consumed]
leb.decodeULEB128(enc);
// [ 9007199254740991, 8 ]

// encode signed int
enc = leb.encodeSLEB128(Number.MIN_SAFE_INTEGER)
// Uint8Array [ 129, 128, 128, 128, 128, 128, 128, 112 ]

leb.decodeSLEB128(enc)
// [ -9007199254740991, 8 ]

Building the binary

Requirements:

# install required tools
brew install zig binaryen

# first run native tests
zig test packages/leb128/src/leb128.zig
# Test 1/2 min safe integer...OK
# Test 2/2 max safe integer...OK
# All tests passed.

# build binary and regenerate src/binary.ts
yarn build:binary

# test TS/JS version
yarn test

Authors

Karsten Schmidt

If this project contributes to an academic publication, please cite it as:

@misc{thing-leb128,
  title = "@thi.ng/leb128",
  author = "Karsten Schmidt",
  note = "https://thi.ng/leb128",
  year = 2019
}

License

© 2019 - 2022 Karsten Schmidt // Apache Software License 2.0