fix: restore guild gossip wire by protocol on shared swarm

Use getGossipWireSession/clearGossipWireSession for pearcord-gossip so
ensure/re-attach no longer steals or clobbers contacts/discovery planes.
This commit is contained in:
Raven Scott
2026-07-13 15:39:05 -04:00
parent 455274c9f9
commit 5f473acdb0
2 changed files with 15 additions and 11 deletions
+11 -6
View File
@@ -9,8 +9,15 @@ const {
COLLECTIONS, id, now, guildTopic, topicToBuffer, CHANNEL_TYPES, RPC COLLECTIONS, id, now, guildTopic, topicToBuffer, CHANNEL_TYPES, RPC
} = require('pearcord-shared') } = require('pearcord-shared')
const { const {
attachGossipMesh, broadcastGossip, ensureGuildWireChannels attachGossipMesh,
broadcastGossip,
ensureGuildWireChannels,
GOSSIP_PROTOCOL
} = require('./mesh') } = require('./mesh')
const {
getGossipWireSession,
clearGossipWireSession
} = require('pearcord-drive/mux-wire')
const { attachDriveMesh, requestAttachmentFromPeers } = require('pearcord-drive/attach-mesh') const { attachDriveMesh, requestAttachmentFromPeers } = require('pearcord-drive/attach-mesh')
const { attachVoiceMesh, broadcastVoiceMedia } = require('pearcord-voice-media') const { attachVoiceMesh, broadcastVoiceMedia } = require('pearcord-voice-media')
const { attachScreenMesh, broadcastScreenMedia } = require('pearcord-screen-share') const { attachScreenMesh, broadcastScreenMedia } = require('pearcord-screen-share')
@@ -1728,11 +1735,9 @@ class PearcordGuild extends EventEmitter {
} catch { } catch {
/* ignore */ /* ignore */
} }
if (conn._pearcordGossipWire?.session === existing) { clearGossipWireSession(conn, GOSSIP_PROTOCOL, existing)
conn._pearcordGossipWire = null
}
} }
const restored = conn._pearcordGossipWire?.session const restored = getGossipWireSession(conn, GOSSIP_PROTOCOL)
if (!force && this._isLiveRpcSession(restored)) { if (!force && this._isLiveRpcSession(restored)) {
this._channels.set(peerId, restored) this._channels.set(peerId, restored)
return restored return restored
@@ -1743,7 +1748,7 @@ class PearcordGuild extends EventEmitter {
return ch || null return ch || null
} catch (err) { } catch (err) {
if (err?.code === 'DUPLICATE_CHANNEL' || /DUPLICATE/i.test(String(err?.message || ''))) { if (err?.code === 'DUPLICATE_CHANNEL' || /DUPLICATE/i.test(String(err?.message || ''))) {
const retry = conn._pearcordGossipWire?.session const retry = getGossipWireSession(conn, GOSSIP_PROTOCOL)
if (this._isLiveRpcSession(retry)) { if (this._isLiveRpcSession(retry)) {
this._channels.set(peerId, retry) this._channels.set(peerId, retry)
return retry return retry
+4 -5
View File
@@ -4,7 +4,8 @@ const { wireSwarmConnection } = require('pearcord-shared')
const { const {
attachGossipWireSession, attachGossipWireSession,
broadcastGossipToSessions, broadcastGossipToSessions,
requestGossipFromPeer requestGossipFromPeer,
getGossipWireSession
} = require('pearcord-drive/mux-wire') } = require('pearcord-drive/mux-wire')
const GOSSIP_PROTOCOL = 'pearcord-gossip-v1' const GOSSIP_PROTOCOL = 'pearcord-gossip-v1'
@@ -22,10 +23,8 @@ function attachGossipMesh (guild, conn) {
} }
function restoreGossipWireFromConn (conn) { function restoreGossipWireFromConn (conn) {
const session = conn._pearcordGossipWire?.session // Protocol-keyed: shared swarm also holds contacts/discovery planes.
const rpc = session?.v2?.rpc return getGossipWireSession(conn, GOSSIP_PROTOCOL)
if (session && rpc && !rpc.closed && !rpc._destroyed) return session
return null
} }
function ensureGuildWireChannels (guild) { function ensureGuildWireChannels (guild) {