feat(core): gossip this side's own currently-hosted public/private rooms - #131
Merged
Merged
Conversation
WireMeshTransport's periodic gossip tick (previously presence-only) now also carries an optional room/hosted extension listing this side's own currently-advertised public/private rooms, generalising the presence-readvertise mechanism into readvertiseGossip so both facts ride the same gossip frame per tick rather than a separate frame each. This is the write half of P3.8's room-discovery replacement for createRoom's own broadcastPatch: a peer's listKnownDevices() can now read another device's hosted-rooms advert directly, the same way it already reads presence/status, with no bespoke per-fact transport event needed. Merging a gossip-discovered room into listRooms is deliberately left for its own follow-up, since it needs to decide what a not-yet-joined room's synthesized shape should look like.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
This was referenced Sep 16, 2026
Closed
Mearman
added a commit
that referenced
this pull request
Sep 16, 2026
listRooms now also surfaces every public/private room this store has heard gossiped by another device (via room/hosted, #131/#132) but never joined or otherwise locally recorded, mixed into its existing Room[] result as a display-only placeholder -- id/name/type/owner/ description real, everything membership-shaped (members, memberJoins, etc.) genuinely empty, since a gossip hint is not the same as admission and this store has nothing else real to report for it. A room already known locally always wins; a gossip advert for it is silently ignored rather than shadowing the real record. MeshTransport gains an optional listKnownDevices method (matching WireMeshTransport's own already-shipped implementation) so RoomLifecycle can read it through the existing abstract requireTransport() port rather than depending on the concrete WireMeshTransport type -- absent for any transport implementation that doesn't offer it, in which case the merge step is simply a no-op, matching every construction site that predates this feature. A gossiped candidate is narrowed through a real type guard (isHostedRoomAdvert) before use, matching the codebase's own "an advert not participating in this convention is not an error" gossip-consumption pattern already established for presence/status.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Generalises WireMeshTransport's presence-only gossip tick (readvertisePresence) into readvertiseGossip, which now also carries an optional room/hosted extension listing this side's own currently-advertised public/private rooms, sourced from a new getHostedRooms constructor callback (the same pull-not-push shape getCurrentPresence already established). Both facts ride the same gossip frame per tick rather than a separate frame each.
This is the write half of the room-discovery replacement #48's own P3.8 investigation scoped out:
listKnownDevices()(#130, merged) can now read another device's hosted-rooms advert directly under room/hosted, the same way it already reads presence/status, with no bespoke per-fact transport event needed.Deliberately not wired into listRooms in this PR -- merging a gossip-discovered room into the existing local rooms map needs its own decision about what a not-yet-joined room's synthesized shape should look like (a full Room object has membership/grant fields a gossip hint doesn't carry), so that stays its own follow-up per #48's established pattern of giving each piece its own design pass.
Refs #48.