1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
[]
= "solid-pod-rs"
= true
= true
= true
= true
= true
= true
= true
= true
= "Rust-native Solid Pod server library — LDP, WAC, WebID, Solid-OIDC, Solid Notifications, NIP-98. Framework-agnostic."
= ["solid", "pod", "wac", "ldp", "webid"]
= ["web-programming::http-server"]
= "README.md"
[]
= "solid_pod_rs"
= "src/lib.rs"
[]
# `tokio` is optional so wasm32 / no-runtime consumers can opt out via
# `default-features = false, features = ["core"]`. Default builds still
# pull it in transitively through `tokio-runtime`.
= { = "1", = ["fs", "io-util", "sync", "macros", "rt", "time"], = true }
= "0.1"
= { = "1", = ["derive"] }
= "1"
= "1"
= "0.1"
= { = "1", = ["v4", "serde"] }
= "1"
= "0.10"
= "0.4"
= "2"
= { = "0.4", = ["serde"] }
= "0.22"
= { = "6", = true }
# SPARQL-Update parsing for PATCH bodies (pure-logic; always compiled).
= "0.3"
# WebSocketChannel2023 (Solid Notifications 0.2). Optional: only needed
# when a tokio runtime is configured for the notifications feature.
= { = "0.24", = true }
= { = "0.3", = true }
# HTTP client for WebhookChannel2023 delivery + did:nostr resolver.
# Optional so `core` consumers don't pull a TLS stack.
= { = "0.12", = false, = ["json", "rustls-tls"], = true }
# Optional backends
= { = "1", = true }
# Solid-OIDC (0.1) — DPoP, dynamic client registration, discovery
= { = "4", = true }
= { = "9", = true }
# NIP-98 Schnorr verification (Phase 3 close)
= { = "0.13", = ["schnorr"], = true }
# F5 (Sprint 4): DPoP jti replay cache — Solid-OIDC §5.2 / RFC 9449.
# Gated behind `dpop-replay-cache` (which implies `oidc`).
= { = "0.12", = true }
# Sprint 7 A: rate-limit primitive — parking_lot for the LRU bucket
# mutex (low contention, Send + Sync, already in dep tree via reqwest).
= { = "0.12", = true }
# Sprint 6 C: RFC 9421 HTTP Message Signatures for outgoing webhook
# deliveries (Solid Notifications 0.2 §5). Gated behind
# `webhook-signing` (which implies `jss-v04`).
= { = "2", = ["rand_core"], = true }
= { = "1", = true }
= { = "0.8", = true }
# Sprint 11 (row 120-124): multi-format config loader. YAML + TOML are
# optional so consumers that only care about JSON aren't dragged in.
# Gated behind `config-loader`.
= { = "0.9", = true }
= { = "0.8", = true }
[]
# `default` preserves the surface from 0.4.0-alpha.2: filesystem +
# in-memory backends, the tokio runtime, the notifications stack
# (WebSocketChannel2023 + WebhookChannel2023 — `reqwest`-backed), plus
# the JSS-parity umbrella.
= ["std", "fs-backend", "memory-backend", "tokio-runtime", "notifications"]
# ---------------------------------------------------------------------------
# 0.4.0-alpha.3: feature flags for wasm32 / CF-Workers consumers.
# Per ADR-076/078 absorption, `nostr-bbs-pod-worker` consumes the pure
# logic surfaces (wac, webid, dotfile, nip98 verifier, ldp parsers,
# interop types, security path/URL primitives) without dragging in tokio
# or reqwest. `core` is the entry point for those consumers.
# ---------------------------------------------------------------------------
= ["std"]
= []
# Activate the tokio runtime + the websocket/futures stack. Pulled in
# transitively by every async-IO feature below. Pure-logic consumers
# leave this off via `default-features = false, features = ["core"]`.
= ["dep:tokio", "dep:tokio-tungstenite", "dep:futures-util"]
= ["tokio-runtime", "dep:notify"]
= ["tokio-runtime"]
= ["dep:aws-sdk-s3", "tokio-runtime"]
= ["dep:openidconnect", "dep:jsonwebtoken", "tokio-runtime", "dep:reqwest"]
= ["dep:k256"]
= ["tokio-runtime", "dep:reqwest"]
# ---------------------------------------------------------------------------
# Sprint 4 / JSS parity umbrella (ADR-056 / PRD §F).
# `jss-v04` is the parent flag. Sub-features enable one bounded
# context each. Enabling `jss-v04` alone is a no-op.
# ---------------------------------------------------------------------------
= []
# F1/F2: SSRF guard + dotfile allowlist (lightweight structs always
# compiled; integration gated at call sites).
= ["jss-v04", "tokio-runtime"]
# F3: legacy `solid-0.1` WebSocket notifications adapter for SolidOS
# data-browser compat. Implies the tokio runtime + the new
# `notifications` feature it sits on top of.
= ["jss-v04", "tokio-runtime", "notifications"]
# F4: WAC `acl:origin` enforcement per WAC §4.3. When off, the
# evaluator ignores the Origin header for backward compat.
= ["jss-v04"]
# F5: DPoP jti replay cache (Solid-OIDC §5.2 / RFC 9449).
# Enables `oidc::replay` and pulls in `lru`.
= ["oidc", "jss-v04", "dep:lru", "tokio-runtime"]
# F6: JSS-compatible layered config loader. The `config` module is
# always compiled (lightweight struct definitions); this feature flag
# is the consumer-facing toggle for binary-layer wiring.
#
# Sprint 11 (row 120-124): extends with auto-detected YAML/TOML file
# loading, env overlay, and CLI overlay. YAML/TOML deps are pulled in
# only when this feature is enabled.
= ["jss-v04", "dep:serde_yaml", "dep:toml"]
# Sprint 6 C: RFC 9421 HTTP Message Signatures on outgoing webhook
# deliveries, Retry-After handling, circuit breaker. Consumers opt in.
= ["jss-v04", "dep:ed25519-dalek", "dep:httpdate", "dep:rand", "tokio-runtime", "dep:reqwest"]
# Sprint 6 D: did:nostr resolver (DID-Doc ↔ WebID bidirectional
# alsoKnownAs/owl:sameAs verification). Surfaces under
# `solid_pod_rs::interop::did_nostr`. No new crate dependencies: uses
# the reqwest + serde + url stack already pulled in by the library,
# and std::sync::RwLock for the cache.
= ["jss-v04", "security-primitives", "tokio-runtime", "dep:reqwest"]
# Sprint 7 A: rate-limit primitive. Library exposes a `RateLimiter`
# trait plus an LRU-backed reference implementation. CORS support is
# gated under `jss-v04` (no new deps). Enabling `rate-limit` pulls in
# `lru` + `parking_lot`.
= ["jss-v04", "dep:lru", "dep:parking_lot", "tokio-runtime"]
# Sprint 7 B: pod-level quota policy. Ships `FsQuotaStore` backed by
# `.quota.json` sidecars; integrates with the config loader via
# `JSS_DEFAULT_QUOTA`. `multitenant` and `parse_size` live in the
# always-on `jss-v04` umbrella; this flag only gates the FS adapter
# (which shares serde_json + tokio::fs already pulled in by the crate,
# no new deps).
= ["jss-v04", "config-loader", "tokio-runtime"]
[]
= { = "1", = ["full"] }
= "3"
= "4"
= "0.6"
= { = "0.5", = ["html_reports"] }
# Sprint 7 D: integration tests drive the server binary's actix `App`
# through `test::init_service`. Dev-dependency only — never ships in
# the library's public surface.
# Path-only dev-dependency: dropping the version pin avoids a publish
# cycle (solid-pod-rs-server depends on solid-pod-rs at the same
# version, so cargo can't resolve the dev-dep against crates.io until
# the parent itself publishes). cargo strips dev-deps from the
# published metadata, so this is the supported pattern.
= { = "../solid-pod-rs-server" }
= "0.7"
= { = "0.3", = ["env-filter"] }
= { = "0.8", = ["small_rng"] }
# Sprint 5 P0: real ES256 keypairs for DPoP / access-token JWT tests.
# Not pulled into the main library — tests only.
= { = "0.13", = ["pem", "ecdsa", "pkcs8"] }
= { = "0.10", = ["pem"] }
# HMAC-SHA256 for DPoP replay test fixtures (post-Sprint-5 the
# signature is now verified so fixtures must produce real MACs).
= "0.12"
# Sprint 11 row 152: real BIP-340 Schnorr signer for CID verifier
# integration tests, which run with `nip98-schnorr` enabled via the
# workspace's default feature cascade.
= { = "0.13", = ["schnorr"] }
# ---------------------------------------------------------------------------
# Examples — runnable via `cargo run --example <name>`.
# ---------------------------------------------------------------------------
[[]]
= "embed_in_actix"
= "examples/embed_in_actix.rs"
[[]]
= "custom_storage"
= "examples/custom_storage.rs"
[[]]
= "nip98_client"
= "examples/nip98_client.rs"
[[]]
= "notifications_consumer"
= "examples/notifications_consumer.rs"
[[]]
= "webhook_receiver"
= "examples/webhook_receiver.rs"
[[]]
= "wac_admin"
= "examples/wac_admin.rs"
[[]]
= "oidc_client"
= "examples/oidc_client.rs"
= ["oidc"]
# ---------------------------------------------------------------------------
# Benchmarks — criterion-based, see `docs/benchmarks.md`.
# ---------------------------------------------------------------------------
[[]]
= "storage_backend_bench"
= false
[[]]
= "wac_eval_bench"
= false
[[]]
= "ldp_content_negotiation_bench"
= false
[[]]
= "nip98_verify_bench"
= false
[[]]
= "dpop_replay_bench"
= false
= ["dpop-replay-cache"]