Packages

File-backed SIMD JSON projection and bounded streaming for Elixir

Current section

Files

Jump to
simd_json CHANGELOG.md
Raw

CHANGELOG.md

# Changelog

All notable changes to SimdJson are documented here. The project follows
[Semantic Versioning](https://semver.org/spec/v2.0.0.html). Beginning with
`1.0.0`, backward-incompatible public changes increment the major version,
compatible features increment the minor version, and compatible fixes
increment the patch version.

## 1.0.0

First public release candidate.

### Added

- Binary-only `decode/1,2` and `decode!/1,2` for the documented safe subset of
  Jason 1.4.5 behavior.
- `select/2` for one-call extraction of multiple scalar paths without
  materializing the complete decoded BEAM tree.
- `stream/2` for lazy, row-count- and byte-bounded projection of root or nested
  JSON arrays with no native prefetch.
- Owner-bound `open/1` and idempotent `close/1` around opaque, one-shot native
  documents.
- `open_file/1` and `select_file/2` over simdjson-owned memory maps, without a
  complete BEAM or padded native source copy.
- `stream_file/2` for bounded native streaming of root arrays, NDJSON, JSON
  Text Sequences, and comma-delimited documents through simdjson 5.0.1.
- A fixed native worker pool, finite non-blocking queue, cooperative
  cancellation, serialized stateful resources, and redacted `:telemetry`
  events.
- A SHA-256-pinned, versioned Linux x86-64 NIF release asset that supported
  consumers install without Zig or Zigler, plus the complete pinned simdjson,
  Zig/Zigler source-build inputs, provenance, licenses, and C ABI v6 sources.

### Safety and qualification

- JSON keys never create atoms; decoded and selected strings are copied into
  independent BEAM binaries.
- C++ exceptions terminate at a fixed C ABI and all public errors use a closed,
  redacted `SimdJson.Error` vocabulary.
- Ordinary, sanitizer, symbol, scheduler-latency, cancellation, lifecycle,
  saturation, differential compatibility, clean-package, and offline native
  build gates cover the qualified target.
- Sparse `select/2` and batched `stream/2` both exercise the same 45,666,793-byte,
  one-million-row fixture.

### Known limitations

- Only Ubuntu 24.04 x86-64 with glibc 2.39, OTP 27.3, Elixir 1.18.4, and the
  recorded simdjson CPU-dispatch paths is supported. Maintainer source builds
  additionally require Zig and Zigler 0.16.0.
- Supported installation downloads the immutable NIF from the matching GitHub
  release and therefore needs network access unless a checksummed local asset
  is supplied.
- Binary operations still receive a complete resident binary. File-backed
  operations accept paths, but socket, device, and iodata inputs are absent.
- File selection avoids a source copy but may use input-size-dependent parser
  indexes. Bounded parser memory applies to `stream_file/2`, not eager decode
  or arbitrary nested-document traversal.
- `decode/2` accepts only `[]`; key atomization, structs, custom decoders,
  decimal modes, and other Jason options are not implemented.
- Decode uses the last duplicate object value while Jason 1.4.5 uses the first.
  Projection returns the first occurrence of a requested repeated object key.
- Projection and stream fields return scalars only. JSONPath, wildcards,
  filters, defaults, public compiled plans, and raw cursor/batch APIs are absent.
- Open documents are process-owned and forward-only. Once selection or stream
  traversal accesses the cursor, another traversal requires another document.
- Native admission is bounded. A full queue returns `:busy` rather than waiting
  or falling back to synchronous parsing.
- Integers outside the implemented signed/unsigned 64-bit native boundary fail
  with `:number_out_of_range`; values are never silently rounded through float.
- AVX-512/Ice Lake dispatch is disabled by the qualified Zig 0.16.0 build
  profile. macOS, Windows, musl, ARM, cross-compilation, and other unqualified
  environments remain experimental or unsupported.