Tiny CBOR

This minimal generic library decodes and encodes most useful CBOR structures
into simple JavaScript structures:
- Maps with keys as
string
s or number
s with CBORType
values as a Map
- Arrays of
CBORType
values
- integers as
number
s
- float32 and float64 as
number
s
- float16
NaN
, Infinity
, -Infinity
string
s
- byte strings as
Uint8Array
- booleans
null
and undefined
- tags as
CBORTag(tag, value)
Limitations
This implementation does not support:
- indefinite length maps, arrays, text strings, or byte strings.
- half precision floating point numbers
- integers outside the range of
[-9007199254740991, 9007199254740991]
, see
Number.MAX_SAFE_INTEGER
- native output to JSON
- does not support generic objects, only
Map
s
This implementation has the following constraints:
- Map keys may only be strings or numbers
- Tags are not interpreted
Behavior
Maps that have duplicate keys will throw an error during decoding. Decoding data
that is incomplete will throw an error during decoding.
Example
CBOR byte decoding example, this outputs a CBORType which is up to you to ensure
matches the right underlying type (e.g. a string) at runtime.
// NPM
// import { decodeCBOR } from "@levischuck/tiny-cbor";
// or JSR
// import { decodeCBOR } from "jsr:@levischuck/tiny-cbor";
import { decodeCBOR } from "./index.ts";
// Get your bytes somehow, directly or with decodeBase64 / decodeHex (available through @levischuck/tiny-encodings)
// encoded ["hello", "world", 1]
const HELLO_WORLD_BYTES = new Uint8Array([
0x83, // Array (3)
0x65, // text (5),
0x68, // h
0x65, // e
0x6C, // l
0x6C, // l
0x6F, // o
0x65, // text(5),
0x77, // w
0x6F, // o
0x72, // r
0x6C, // l
0x64, // d
0x01, // 1
]);
const decoded = decodeCBOR(HELLO_WORLD_BYTES);
if (
Array.isArray(decoded) && decoded.length == 3 && decoded[0] == "hello" &&
decoded[1] == "world" && decoded[2] == 1
) {
console.log("Success!");
}
If you're looking to make this more ergonomic in JS / TS, check out
tiny-cbor-schema!
Where to get it
This library is available on
NPM and
JSR.
This library is no longer automatically published to Deno's Third Party Modules.
Newer versions may appear on deno.land/x, but do not work.