Skip to content

@stainless-code/persist

Hydration-aware persistence for any reactive store — zero-dep persistSource core; codecs, backends, cross-tab transport, source + framework hydration adapters ship as opt-in recipes

persist-compressed

46 linesSource

Compress a string-wire StateStorage with @stainless-code/persist/backends/compressed (gzip/deflate). Backend wrapper — compose with createStorage; stack compress-then-encrypt.

Compressed backend wrapper

Not a StorageCodec. Uses CompressionStream / DecompressionStream (default gzip); output is base64 on the string wire. Returns undefined if streams unavailable. Documented stack with encryption: compress → encrypt.

Minimal wiring

ts
import { createStorage, jsonCodec } from "@stainless-code/persist";
import { createCompressedStorage } from "@stainless-code/persist/backends/compressed";

const storage = createStorage<Prefs>(
  () => createCompressedStorage(() => localStorage)!,
  jsonCodec(),
);

Richer graphs → persist-seroval as the codec.

Formats: gzip | deflate | deflate-raw (deflate-raw needs Node 20.12+).

Common mistakes

  • Using as a codec.
  • Encrypt-then-compress.
  • Assuming streams exist in every runtime.

API surface

  • createCompressedStorage(getStorage, { format? }) → StateStorage<string> | undefined

See also: persist-encrypted.