f7d4e33409
Generalize the operator-agnostic pieces so any embed of the relay server can use them without depending on quartz-relay (Ktor, TOML, operator wrapper). quartz-relay shrinks to its actual job: TOML config, Ktor wiring, persistence sidecar, and the Relay composition. - Nip98AuthVerifier -> quartz nip98HttpAuth (verify() now suspend, uses kotlinx Mutex for KMP). Pairs with HTTPAuthorizationEvent. - PassThroughPolicy + KindAllowDenyPolicy + PubkeyAllowDenyPolicy + RejectFutureEventsPolicy -> quartz nip01Core/relay/server/policies alongside the existing EmptyPolicy / VerifyPolicy / FullAuthPolicy. - Collapse EmptyPolicy into 'object EmptyPolicy : PassThroughPolicy()' (PassThroughPolicy is now an open class instead of abstract). - BanStore -> quartz nip86RelayManagement/server. Reimplemented lock-free with kotlin.concurrent.atomics.AtomicReference + immutable state snapshots so it works in commonMain. - DynamicBanPolicy -> renamed to BanListPolicy; lives next to the BanStore it consults. The "Dynamic" qualifier was a contrast to static policies in quartz-relay; in its new home the name describes what it actually does. - Nip86Server -> quartz nip86RelayManagement/server next to Nip86Client. Drops the RelayInfo wrapper indirection: InfoHolder now operates on Nip11RelayInformation directly. - InProcessWebSocket -> quartz nip01Core/relay/server/inprocess. Constructor takes NostrServer (was: the operator-side Relay wrapper) so any embed can wire the same in-process bridge. - Move BanStoreTest, Nip86ServerTest, Nip98AuthVerifierTest into quartz/jvmAndroidTest. Adjust runBlocking-bodied tests so JUnit 4 sees Unit returns. PoliciesTest stays in quartz-relay tests because it uses module-local SyntheticEvents fixtures.