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:
@@ -9,8 +9,15 @@ const {
|
||||
COLLECTIONS, id, now, guildTopic, topicToBuffer, CHANNEL_TYPES, RPC
|
||||
} = require('pearcord-shared')
|
||||
const {
|
||||
attachGossipMesh, broadcastGossip, ensureGuildWireChannels
|
||||
attachGossipMesh,
|
||||
broadcastGossip,
|
||||
ensureGuildWireChannels,
|
||||
GOSSIP_PROTOCOL
|
||||
} = require('./mesh')
|
||||
const {
|
||||
getGossipWireSession,
|
||||
clearGossipWireSession
|
||||
} = require('pearcord-drive/mux-wire')
|
||||
const { attachDriveMesh, requestAttachmentFromPeers } = require('pearcord-drive/attach-mesh')
|
||||
const { attachVoiceMesh, broadcastVoiceMedia } = require('pearcord-voice-media')
|
||||
const { attachScreenMesh, broadcastScreenMedia } = require('pearcord-screen-share')
|
||||
@@ -1728,11 +1735,9 @@ class PearcordGuild extends EventEmitter {
|
||||
} catch {
|
||||
/* ignore */
|
||||
}
|
||||
if (conn._pearcordGossipWire?.session === existing) {
|
||||
conn._pearcordGossipWire = null
|
||||
}
|
||||
clearGossipWireSession(conn, GOSSIP_PROTOCOL, existing)
|
||||
}
|
||||
const restored = conn._pearcordGossipWire?.session
|
||||
const restored = getGossipWireSession(conn, GOSSIP_PROTOCOL)
|
||||
if (!force && this._isLiveRpcSession(restored)) {
|
||||
this._channels.set(peerId, restored)
|
||||
return restored
|
||||
@@ -1743,7 +1748,7 @@ class PearcordGuild extends EventEmitter {
|
||||
return ch || null
|
||||
} catch (err) {
|
||||
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)) {
|
||||
this._channels.set(peerId, retry)
|
||||
return retry
|
||||
|
||||
@@ -4,7 +4,8 @@ const { wireSwarmConnection } = require('pearcord-shared')
|
||||
const {
|
||||
attachGossipWireSession,
|
||||
broadcastGossipToSessions,
|
||||
requestGossipFromPeer
|
||||
requestGossipFromPeer,
|
||||
getGossipWireSession
|
||||
} = require('pearcord-drive/mux-wire')
|
||||
|
||||
const GOSSIP_PROTOCOL = 'pearcord-gossip-v1'
|
||||
@@ -22,10 +23,8 @@ function attachGossipMesh (guild, conn) {
|
||||
}
|
||||
|
||||
function restoreGossipWireFromConn (conn) {
|
||||
const session = conn._pearcordGossipWire?.session
|
||||
const rpc = session?.v2?.rpc
|
||||
if (session && rpc && !rpc.closed && !rpc._destroyed) return session
|
||||
return null
|
||||
// Protocol-keyed: shared swarm also holds contacts/discovery planes.
|
||||
return getGossipWireSession(conn, GOSSIP_PROTOCOL)
|
||||
}
|
||||
|
||||
function ensureGuildWireChannels (guild) {
|
||||
|
||||
Reference in New Issue
Block a user