Tiny CBOR
This minimal generic library decodes and encodes most useful CBOR structures into simple JavaScript structures:
- Maps with keys as
string
s ornumber
s withCBORType
values as aMap
- 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
andundefined
- 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.