@thi.ng/bencode
Version:
Bencode binary encoder / decoder with optional UTF8 encoding & floating point support
157 lines (113 loc) • 5.39 kB
Markdown
<!-- This file is generated - DO NOT EDIT! -->
<!-- Please see: https://github.com/thi-ng/umbrella/blob/develop/CONTRIBUTING.md#changes-to-readme-files -->
# 
[](https://www.npmjs.com/package/@thi.ng/bencode)

[](https://mastodon.thi.ng/@toxi)
> [!NOTE]
> This is one of 212 standalone projects, maintained as part
> of the [.ng/umbrella](https://github.com/thi-ng/umbrella/) monorepo
> and anti-framework.
>
> 🚀 Please help me to work full-time on these projects by [sponsoring me on
> GitHub](https://github.com/sponsors/postspectacular). Thank you! ❤️
- [About](#about)
- [Features / behaviors](#features--behaviors)
- [Booleans](#booleans)
- [String handling](#string-handling)
- [Floating point values](#floating-point-values)
- [Status](#status)
- [Installation](#installation)
- [Dependencies](#dependencies)
- [API](#api)
- [Authors](#authors)
- [License](#license)
## About
Binary [Bencode](https://en.wikipedia.org/wiki/Bencode) encoder &
decoder for structured data.
### Features / behaviors
#### Booleans
Will be converted to `0` or `1` integers.
#### String handling
All JS strings will be UTF-8 encoded. To write raw bytes without
transformation, wrap them as `Uint8Array`. These too will be written as
Bencode strings (e.g. `len:xxx...`), but are used as is.
When decoding, UTF-8 is used by default, but can be disabled by passing `false`
as 2nd argument to
[`decode()`](https://docs.thi.ng/umbrella/bencode/functions/decode.html). In
that case, strings will be decoded as `Uint8Array`s, with the exception of
dictionary keys, which will be decoded via `String.fromCharCode()`.
#### Floating point values
This implementation has optional (non-standard) support for floating point
values. If these are not desired (e.g. for compatibility reasons), all numeric
values MUST be pre-rounded to integers. The encoder only chooses the custom
float encoding iff a number has a fractional part. Floats are encoded similarly
to standard ints (i.e. as text), but using `f` as prefix. Furthermore, only
floats with an absolute value in the semi-open `[1e-6,1e21)` interval can be
encoded. Float values requiring exponential notation will throw an error during
encoding.
## Status
**STABLE** - used in production
[Search or submit any issues for this package](https://github.com/thi-ng/umbrella/issues?q=%5Bbencode%5D+in%3Atitle)
## Installation
```bash
yarn add .ng/bencode
```
ESM import:
```ts
import * as bc from "@thi.ng/bencode";
```
Browser ESM import:
```html
<script type="module" src="https://esm.run/@thi.ng/bencode"></script>
```
[JSDelivr documentation](https://www.jsdelivr.com/)
For Node.js REPL:
```js
const bc = await import("@thi.ng/bencode");
```
Package sizes (brotli'd, pre-treeshake): ESM: 1.22 KB
## Dependencies
- [.ng/api](https://github.com/thi-ng/umbrella/tree/develop/packages/api)
- [.ng/arrays](https://github.com/thi-ng/umbrella/tree/develop/packages/arrays)
- [.ng/checks](https://github.com/thi-ng/umbrella/tree/develop/packages/checks)
- [.ng/errors](https://github.com/thi-ng/umbrella/tree/develop/packages/errors)
- [.ng/strings](https://github.com/thi-ng/umbrella/tree/develop/packages/strings)
- [.ng/transducers](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers)
- [.ng/transducers-binary](https://github.com/thi-ng/umbrella/tree/develop/packages/transducers-binary)
Note: .ng/api is in _most_ cases a type-only import (not used at runtime)
## API
[Generated API docs](https://docs.thi.ng/umbrella/bencode/)
```ts
import { encode, decode } from "@thi.ng/bencode";
import { hexDump } from "@thi.ng/transducers-binary";
[...hexDump({}, encode({ foo: "bar", "baz": [0, 1, 2, 3], "pi": Math.PI }))]
// [ '00000000 | 64 33 3a 62 61 7a 6c 69 30 65 69 31 65 69 32 65 | d3:bazli0ei1ei2e',
// '00000010 | 69 33 65 65 33 3a 66 6f 6f 33 3a 62 61 72 32 3a | i3ee3:foo3:bar2:',
// '00000020 | 70 69 66 33 2e 31 34 31 35 39 32 36 35 33 35 38 | pif3.14159265358',
// '00000030 | 39 37 39 33 65 65 00 00 00 00 00 00 00 00 00 00 | 9793ee..........' ]
// Uin8Array values are written verbatim (as Bencode strings)
[...hexDump({}, encode({ foo: new Uint8Array([0, 1 ,2, 3]) }))]
// [ '00000000 | 64 33 3a 66 6f 6f 34 3a 00 01 02 03 65 00 00 00 | d3:foo4:....e...' ]
const bytes = encode({ foo: [1, "a", { bar: "baz"}, [42]] });
// Uint8Array [ 100, 51, 58, 102, 111, 111, 108, 105, 49, 101, 49, ... ]
decode(bytes)
// { foo: [ 1, 'a', { bar: 'baz' }, [ 42 ] ] }
// decode w/o UTF8 decoding
// (note: dictionary keys will ALWAYS be utf8 decoded)
decode(bytes, false)
// { foo: [ 1, [ 97 ], { bar: [ 98, 97, 122 ] }, [ 42 ] ] }
```
## Authors
- [Karsten Schmidt](https://thi.ng)
If this project contributes to an academic publication, please cite it as:
```bibtex
{thing-bencode,
title = "@thi.ng/bencode",
author = "Karsten Schmidt",
note = "https://thi.ng/bencode",
year = 2016
}
```
## License
© 2016 - 2025 Karsten Schmidt // Apache License 2.0