graphrefly-storage 0.0.7

GraphReFly storage tier dispatch + Node-side persistence (memory, file, redb)
Documentation
[package]
name        = "graphrefly-storage"
description = "GraphReFly storage tier dispatch + Node-side persistence (memory, file, redb)"
version.workspace      = true
edition.workspace      = true
rust-version.workspace = true
license.workspace      = true
repository.workspace   = true
homepage.workspace     = true
authors.workspace      = true

[dependencies]
graphrefly-core       = { workspace = true }
graphrefly-graph      = { workspace = true }   # for Codec types
graphrefly-structures = { workspace = true }   # BaseChange<T> envelope

# Persistence backends — each gated behind its own feature
redb             = { workspace = true, optional = true }
tempfile         = { version = "3", optional = true }   # atomic-rename helpers for FileStorage

# WAL frame substrate (M4.A — DS-14-storage Q1 lock)
# `serde_json` route gives canonical (sorted-key) JSON via `to_value` → BTreeMap
# → `to_string`, matching the TS `stableJsonString` algorithm byte-for-byte on
# the WAL frame schema (ASCII keys, integer numerics, no floats).
serde            = { workspace = true, features = ["derive"] }
serde_json       = { workspace = true }
sha2             = { workspace = true }
hex              = { workspace = true }

# Concurrency (M4.B — tier-level pending buffers)
parking_lot      = { workspace = true }

thiserror        = { workspace = true }
tracing          = { workspace = true }

[dev-dependencies]
indexmap.workspace = true
tempfile = "3"

[features]
default = ["memory", "file", "redb-store"]
memory     = []
file       = ["dep:tempfile"]
redb-store = ["dep:redb"]
# Future: sqlite-store via rusqlite, when there's a clear use case beyond redb.