beamdb 0.17.0

BEAM — distributed graph database syncing over WebSocket, WebRTC, and multicast. Successor to rod.
Documentation
[package]
name = "beamdb"
version = "0.17.0"
edition = "2024"
repository = "https://github.com/guan-tends/beam"
homepage = "https://github.com/guan-tends/beam"
documentation = "https://docs.rs/beamdb"
description = "BEAM — distributed graph database syncing over WebSocket, WebRTC, and multicast. Successor to rod."
readme = "README.md"
license = "MIT"
rust-version = "1.85"
authors = ["Martti Malmi <martti@mmalmi.org>", "David Newman <david.r.newman@proton.me>"]
keywords = ["p2p", "graph-database", "distributed", "sync", "websocket"]
categories = ["database", "network-programming", "asynchronous"]

[lib]
name = "beam"
crate-type = ["cdylib", "rlib"]

# ─── Cross-platform deps (compile on both native + WASM) ───
[dependencies]
web-time = "0.2"
serde = { version =  "1.0", features = ["derive"] }
serde_json = "1.0.64"
postcard = { version = "1", default-features = false, features = ["alloc"] }
rand = "0.9"
futures-util = "0.3.21"
async-trait = "0.1.51"
log = "0.4.14"
url = "2.2.2"
thiserror = "2.0"
arena-btreemap = { version = "0.1", features = ["serde"] }
allocator-api2 = "0.4"
bytes = "1.1.0"
rustc-hash = "2.1.3"
size_format = "1.0.2"
zeroize = "1.7"
base64 = "0.22"
java-utils = "0.1.0"
p256 = { version = "0.14", features = ["ecdh", "getrandom"] }
aes-gcm = "0.10"
pbkdf2 = "0.13"
sha2 = "0.11"
parking_lot = "0.12"

# ─── Native-only deps (gated out on WASM) ───
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
clap = { version = "4.6", features = ["derive", "env"] }
tokio = { version = "1.17.0", features = ["full"] }

# SIMD-accelerated JSON parser (x86_64 only — uses SSE4.2/AVX2).
# On non-x86_64 (WASM, ARM), falls back to serde_json.
[target.'cfg(target_arch = "x86_64")'.dependencies]
simd-json = "0.17"
tokio-stream = "0.1.8"
tokio-websockets = { version = "0.13", features = ["server", "client", "native-tls", "sha1_smol", "fastrand"] }
tokio-native-tls = "0.3.0"
http = "1"
oko-multicast-socket = { version = "0.5", features = ["tokio"] }
redb = "4.1"
persy = { version = "1.8", features = ["background_ops"], optional = true }
fjall = { version = "3", optional = true }
mimalloc = { version = "0.1.52", optional = true }
env_logger = "0.11"
dirs = "6.0"
# dev-dep: criterion is native-only (tokio runtime + threads don't work on WASM)
criterion = { version = "0.8", features=["async_futures", "async_tokio", "html_reports"] }
str0m = { version = "0.21", optional = true }
stun = { version = "0.17", optional = true }

# ─── WASM-only deps ───
[target.wasm32-unknown-unknown.dependencies]
tokio = { version = "1.17.0", default-features = false, features = ["rt", "sync", "macros"] }
tokio_with_wasm = { version = "0.8", features = ["time", "rt", "sync", "macros"] }
getrandom = { version = "0.2", features = ["js"] }
getrandom_04 = { package = "getrandom", version = "0.4", features = ["wasm_js"] }
getrandom_03 = { package = "getrandom", version = "0.3", features = ["wasm_js"] }

[features]
default = ["native", "mimalloc"]
webrtc = ["dep:str0m", "dep:stun"]
native = []
persy = ["dep:persy"]
fjall = ["dep:fjall"]
mimalloc = ["dep:mimalloc"]
# Node.js persistent storage via `node:fs/promises` (WASM only).
# Build: wasm-pack build --target nodejs --features node-fs --no-default-features
node-fs = []

[dev-dependencies]

[[example]]
name = "dump_redb"
required-features = ["native"]
[[example]]
name = "encrypted_data"
required-features = ["native"]
[[example]]
name = "nested_graph"
required-features = ["native"]
[[example]]
name = "persistent_storage"
required-features = ["native"]
[[example]]
name = "quickstart"
required-features = ["native"]
[[example]]
name = "two_node_sync"
required-features = ["native"]
[[example]]
name = "user_auth"
required-features = ["native"]

[[bench]]
name = "my_benchmark"
harness = false
required-features = []

[[bin]]
name = "beam"
path = "src/main.rs"
required-features = ["native"]

[[bin]]
name = "beam-sea-keygen"
path = "src/bin/beam-sea-keygen.rs"
required-features = ["native"]

[profile.release]
opt-level = 3
strip = true
lto = true
codegen-units = 1

# Profiling build — release optimizations with debug symbols and no stripping.
# Usage: cargo build --profile profiling --example profile_workload
# Binary lands at target/profiling/examples/profile_workload
[profile.profiling]
inherits = "release"
debug = true
strip = false

# WASM-only extras for browser adapters
[target.wasm32-unknown-unknown.dependencies.web-sys]
version = "0.3"
features = [
    "WebSocket",
    "console",
    "MessageEvent",
    "ErrorEvent",
    "CloseEvent",
    "Window",
    "IdbFactory",
    "Event",
    "EventTarget",
    "IdbDatabase",
    "IdbObjectStore",
    "IdbTransaction",
    "IdbRequest",
    "IdbObjectStoreParameters",
    "IdbTransactionMode",
    "IdbVersionChangeEvent",
    "IdbOpenDbRequest",
    "DomStringList",
    # OPFS (Origin Private File System) — browser persistent storage
    "StorageManager",
    "Navigator",
    "FileSystemDirectoryHandle",
    "FileSystemFileHandle",
    "FileSystemWritableFileStream",
    "FileSystemGetFileOptions",
    "FileSystemGetDirectoryOptions",
    "FileSystemRemoveOptions",
    "File",
    "Blob",
]

[target.wasm32-unknown-unknown.dependencies.wasm-bindgen]
version = "0.2"

[target.wasm32-unknown-unknown.dependencies.js-sys]
version = "0.3"

[target.wasm32-unknown-unknown.dependencies.wasm-bindgen-futures]
version = "0.4"

[target.wasm32-unknown-unknown.dependencies.console_error_panic_hook]
version = "0.1"


[package.metadata.wasm-pack.profile.release]
wasm-opt = false

[target.wasm32-unknown-unknown.dev-dependencies]
wasm-bindgen-test = "0.3"