Wire pubsub through iroh-gossip

This commit is contained in:
Eric Wendland 2026-05-22 16:45:49 +02:00
commit eec4c92145
8 changed files with 291 additions and 38 deletions

View file

@ -160,9 +160,9 @@ The bootstrap implementation provides:
CLI input and output are JSON views, while the store keeps durable Automerge
save bytes. `geth document sync <node-id> <name> [--bearer-secret <secret>]`
pulls authorized remote Automerge state.
- local daemon-lifetime pubsub snapshots: `geth pubsub pub/sub`; `geth pubsub
pub <topic> <message> --node <node-id>` publishes to an authorized peer;
`geth pubsub sub <topic> --node <node-id>` reads an authorized peer snapshot
- lossy pubsub wakeups: `geth pubsub pub/sub`; local messages are retained in
a daemon-lifetime ring buffer, while authorized remote publish/subscribe joins
deterministic native `iroh-gossip` topics after geth control authorization
- SSH certificate flow metadata:
- `geth ssh cert request --public-key <path> --principal <name> [--subject <principal>]`
- `geth ssh cert requests [--subject <principal>]`
@ -204,8 +204,9 @@ serving peer as a provider visible with `geth cas providers <hash>`.
libraries `iroh-blobs 0.97.0`, `iroh-docs 0.95.0`, and `iroh-gossip 0.95.0`
against the same daemon-owned endpoint generation. KV stores are mirrored into
native `iroh-docs` namespaces and peers receive read-only document tickets only
after geth authorization succeeds. Pubsub still uses its documented bootstrap
equivalent until the native gossip migration lands.
after geth authorization succeeds. Pubsub joins native `iroh-gossip` topics
only after the geth control path has authenticated the peer-card endpoint
binding and checked the topic capability.
Remote resource commands that accept `--bearer-secret` can also authorize with a
resource-scoped bearer proof generated from the private bearer token returned at
creation time. The persisted auth log stores a public bearer id and token
@ -245,14 +246,15 @@ manual `geth kv sync <node-id> <name>` and background ticks require `kv.read`
on the remote `resource:kv:<name>`. Authorized sync imports from the remote
Iroh Documents namespace where available, keeps SQLite as the durable local
index, and imports only remote entries that are not older than the local value.
Remote pubsub publish uses the protected Iroh control path too. The remote peer
requires `pubsub.publish` on `resource:pubsub:<topic>` before recording the
message in its local daemon-lifetime ring buffer. Pubsub remains lossy and is
not durable storage; facts that must survive restart or reconcile offline
belong in CAS, KV, document, or DB resources. Remote pubsub subscribe uses the
same protected path and requires `pubsub.subscribe` on
`resource:pubsub:<topic>` before returning the peer's current daemon-lifetime
snapshot for that topic.
Remote pubsub publish uses the protected Iroh control path as an authorization
preflight. The remote peer requires `pubsub.publish` on
`resource:pubsub:<topic>` before recording the message and broadcasting it on a
deterministic native `iroh-gossip` topic. Pubsub remains lossy and is not
durable storage; facts that must survive restart or reconcile offline belong in
CAS, KV, document, or DB resources. Remote pubsub subscribe uses the same
protected path, requires `pubsub.subscribe` on `resource:pubsub:<topic>`, joins
the gossip topic, and returns the peer's current daemon-lifetime snapshot for
that topic.
Remote pipe connect uses the same protected Iroh control path and requires
`pipe.connect` on `resource:pipe:<name>`. The current prototype records a remote
connection attempt and whether a listener exists. `geth pipe send <name>
@ -313,8 +315,8 @@ Everything meaningful is modeled as a resource. Planned resource kinds are:
- `pipe`: dumbpipe-like byte streams over Iroh; the bootstrap has a local
daemon registry only
- `document`: Automerge documents over Iroh streams
- `pubsub`: lossy notifications, not authoritative storage; the bootstrap
keeps only an in-memory daemon-lifetime ring buffer
- `pubsub`: lossy notifications over native `iroh-gossip` after geth
authorization, with only an in-memory daemon-lifetime ring buffer
- `cas`: content-addressed blob storage and distribution
- `ssh-proxy`: authorized SSH proxy/admin access over Iroh