compact-encoding-python
Pure-Python port of compact-encoding, wire-compatible with the JavaScript implementation. All multi-byte values are little-endian.
The public surface is a deliberate subset of the JS reference - the codecs needed by hyperschema-python and bare-rpc-python. Additive JS codecs (e.g. raw, any, bigint, the IP codecs) are not ported; they can be added later without breaking the wire format.
Install
pip install git+https://github.com/holepunchto/compact-encoding-python
Usage
import compact_encoding as cenc
data = cenc.encode(cenc.uint, 42) # -> bytes
n = cenc.decode(cenc.uint, data) # -> 42
Codecs
Every codec exposes preencode, encode, and decode. Pass one to the encode/decode helpers, or drive it directly through a State (see Three-phase API).
Scalars
| Codec | Python type | Notes |
|---|---|---|
uint |
int |
varint, 0 .. 2**53 - 1 |
int |
int |
zigzag varint |
bool |
bool |
single byte |
buffer |
bytes |
length-prefixed |
utf8 (alias string) |
str |
length-prefixed UTF-8 |
json |
any | length-prefixed UTF-8 JSON |
Fixed-width numbers
Little-endian, fixed size. Unsigned: uint8, uint16, uint24, uint32, uint40, uint48, uint56. Signed: int24, int40, int48, int56. IEEE 754 floats: float32, float64.
Fixed-width buffers
fixed(n) encodes exactly n bytes (no length prefix). fixed32 and fixed64 are fixed(32) and fixed(64) - 32- and 64-byte buffers, not bits.
Composites
array(codec)- a length-prefixed list ofcodecvalues (decode rejects lengths above0x100000).record(key_codec, value_codec)- a length-prefixed dict.frame(codec)- a nested value with its encoded byte length written ahead of it.
Encode / decode
encode(codec, value) -> bytes and decode(codec, data) -> value are the one-shot helpers.
Three-phase API
To pack several values into one buffer, drive a State directly: preencode every value to measure the buffer, allocate(), then encode.
import compact_encoding as cenc
state = cenc.State()
cenc.uint.preencode(state, 42)
cenc.utf8.preencode(state, "hi")
state.allocate()
cenc.uint.encode(state, 42)
cenc.utf8.encode(state, "hi")
state = cenc.State(state.buffer)
cenc.uint.decode(state) # -> 42
cenc.utf8.decode(state) # -> "hi"
A State holds start, end, buffer, and a remaining property, plus allocate() and rewind(). Codec is a typing Protocol for writing your own.
Errors
CompactError is the base error; OutOfBounds (a subclass) is raised when a decode reads past the end of the buffer. Out-of-range encodes raise ValueError.
License
Apache-2.0
Release files for compact-encoding 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| compact_encoding-0.0.1.tar.gz | 15.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| compact_encoding-0.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 29.1 kB
Release files / compact_encoding-0.0.1.tar.gz
| Download URL | compact_encoding-0.0.1.tar.gz |
|---|---|
| Size | 15.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c25f3f3a2fbd409f15999ce91b79e4fedd61b915db82c264d01c38b3481be5c3
|
|
BLAKE2b-256 checksum How to use checksums |
c1c507af1400b83f9b111ea6acd58ada2ec8ade69f5035e75fe72d71a979ceb4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|
Release files / compact_encoding-0.0.1-py3-none-any.whl
| Download URL | compact_encoding-0.0.1-py3-none-any.whl |
|---|---|
| Size | 13.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
82a93c9073ecb56d27ee84f122611d18415850cad2a9bbfbba954d6dbd5d9044
|
|
BLAKE2b-256 checksum How to use checksums |
0636e28a7f00b83e74e307258014f05c3280a30addc8911c9f3fde913cfba14d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.13
|