npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

node-buffer-interface

v0.0.2

Published

A NodeJS library to deal with binary data, serialize from / deserialize to JS values, e.g. String, Number, BigInt, Boolean, Object, Array, etc.

Downloads

3

Readme

A NodeJS library to deal with binary data, serialize from / deserialize to JS values, e.g. String, Number, BigInt, Boolean, Object, Array, etc.

Usage

// ESM
import BufInt from "node-buffer-interface";

// CJS
const BufInt = require("node-buffer-interface");

Methods

BufInt.serialize(value: unknown)

Serializes value into iterable chunks of Buffer

BufInt.serializeSync(value: unknown)

Serializes value into array of chunks of Buffer

BufInt.deserialize(buffer: Buffer | Uint8Array, offset: number)

Deserializes Buffer to value, returns deserialized value and new offset

Types

Some built-in types for BufInt are specified below.

Const

BufInt.Const(value: any)

Just a placeholder.

String

BufInt.String(sizeType: UINT, encoding: STRING)

Used to handle string interface. Adds extra few bytes at the beginning to store string length info.

Some known encodings can be used directly, e.g. BufInt.String.utf8_32be for UTF-8 encoding with uint32 size.

Buffer

BufInt.Buffer(sizeType: UINT)

Used to handle buffer interface. Adds extra few bytes at the beginning to store buffer length info.

Buffer with common sizes can be used directly, e.g. BufInt.Buffer.uint8 for buffer with uint8 size.

Number

BufInt.Number[NUMTYPE]

BigInt

BufInt.BigInt[TYPE]

Array

BufInt.Array(bufint: BufInt, sizeType: UINT)

Used to create array interface. Calls bufint method for every element in the array during serialize / deserialize. Adds extra few bytes at the beginning to store array length info.

Object

BufInt.Object(object: Record<string, BufInt>)

Used to create object interface. Objects should be ordered. Calls bufint method for every property during serialize / deserialize.

Enum

BufInt.Enum(values: Iterable<{ value: unknown, enumValue?: number }>, valueType: NUMTYPE)

Used to create enum interface. Auto-converts enumerables, like {ONE, TWO, THREE} to numbers {0, 1, 2}.

enumValue specifies number values to use in the buffer to the value. Defaults increments from minimum value. valueType specifies the number type to use in the buffer.

BufInt.Enum.fromArray can be used to use arrays as values instead, and the enumValue will be incremented from minimum.

Optional

BufInt.Optional(bufint: BufInt)

Used to create optional interface. Adds one extra byte to store value existence. 0 if undefined, 1 if exists.

BufInt.Optional.Nullable can be used to adds support for null values. Its value as number is 2.

BitFlags

BufInt.BitFlags(flags: ArrayLike<string | false>)

Used to create interface of an object of booleans. Uses one bit to store a boolean rather than a byte. A flag with false skips one bit. Can use up to 32 flags simultaneously.

For example, BitFlags(['a', 'b', false, 'c']) will get property a, b, and c from an object when serialize and uses 1 byte (3 bits) only rather than 3. If an object is {a: false, b: true, c: true}, then the byte will be 0b010100000.

BitField

BufInt.BitField(
    fields: ArrayLike<{
        key: string | false,
        bits: number
    }>, 
    bytes?: number
)

Used to create interface of an object of numbers. Each field / key can specify number of bits to use. Can use up to 32 bits simultaneously.

Consider following example:

BitField([
    { key: 'a', bits: 2 },
    { key: 'b', bits: 4 },
    { key: 'c', bits: 3 },
    { key: 'd', bits: 1 },
])

The byte representation will be AABBBBCC CD------

This interface will take property a, b, c, and d from an object when serialize and uses 2 bytes (10 bits) only rather than 4. If an object is {a: 2, b: 11, c: 5, d: 1}, then the byte will be 10101110 11000000.

Switch

BufInt.Switch(
    switchExpr: (value: unknown) => Cases
    cases: Iterable<{
        case: unknown;
        bufint: BufInt;
        enumValue?: number;
    }>,
    defaultCase: {
        bufint: BufInt;
        enumValue?: number;
    } | null | undefined,
    enumType: NUMTYPE
)

Used to create interface of switch case. Adds first few bytes to determine which case to use.

This allows multiple type of values to be used in a single bufint. The "switch" function expression determines which bufint to use depending on the case.

If any other value type is passed, it will check for default bufint provided. If the default bufint is not provided (null or undefined), it throws an error.

Same as enum, enumValue specifies number values to use in the buffer to the value. Defaults increments from minimum value. enumType specifies the number type to use in the buffer.

Consider following example:

BufInt.Switch(
    v => typeof v,
    [
        { case: 'string', bufint: BufInt.String.utf8_32be },
        { case: 'number', bufint: BufInt.Number.float64le },
        { case: 'boolean', bufint: BufInt.Boolean },
        { case: 'bigint', bufint: BufInt.Bigint.biguint64le },
    ],
    null,
    'uint8'
)

This allows string, number, boolean, or bigint value type to be used in a single bufint. The function v => typeof v acts as a "switch" function to determine which bufint to use.