diff --git a/dist/fabric/src/inbound.js b/dist/fabric/src/inbound.js index a313823..ac56400 100644 --- a/dist/fabric/src/inbound.js +++ b/dist/fabric/src/inbound.js @@ -154,6 +154,28 @@ export class FabricInbound { joined.clear(); void syncChannels('initial'); }); + // Push-based membership events from the backend (companion to + // Fabric.Backend.Guild's RealtimeGateway.emitToUser). When the + // server tells us this user was added to / removed from a + // channel, we sub/unsub the socket.io room immediately — no + // 60s wait for the polling resync. Polling remains as a safety + // net for missed events. + socket.on('channel.joined', (evt) => { + const id = evt?.channelId; + if (!id || joined.has(id)) + return; + socket.emit('join_channel', { channelId: id }); + joined.add(id); + this.log.info(`fabric: agent ${agentId} channel.joined push on ${g.nodeId}: ${id} (now ${joined.size})`); + }); + socket.on('channel.left', (evt) => { + const id = evt?.channelId; + if (!id || !joined.has(id)) + return; + socket.emit('leave_channel', { channelId: id }); + joined.delete(id); + this.log.info(`fabric: agent ${agentId} channel.left push on ${g.nodeId}: ${id} (now ${joined.size})`); + }); const syncTimer = setInterval(() => void syncChannels('resync'), FabricInbound.CHANNEL_SYNC_INTERVAL_MS); this.channelSyncTimers.push(syncTimer); socket.on('message.created', (m) => { diff --git a/src/inbound.ts b/src/inbound.ts index 267527f..415c58a 100644 --- a/src/inbound.ts +++ b/src/inbound.ts @@ -199,6 +199,26 @@ export class FabricInbound { joined.clear(); void syncChannels('initial'); }); + // Push-based membership events from the backend (companion to + // Fabric.Backend.Guild's RealtimeGateway.emitToUser). When the + // server tells us this user was added to / removed from a + // channel, we sub/unsub the socket.io room immediately — no + // 60s wait for the polling resync. Polling remains as a safety + // net for missed events. + socket.on('channel.joined', (evt: { channelId?: string }) => { + const id = evt?.channelId; + if (!id || joined.has(id)) return; + socket.emit('join_channel', { channelId: id }); + joined.add(id); + this.log.info(`fabric: agent ${agentId} channel.joined push on ${g.nodeId}: ${id} (now ${joined.size})`); + }); + socket.on('channel.left', (evt: { channelId?: string }) => { + const id = evt?.channelId; + if (!id || !joined.has(id)) return; + socket.emit('leave_channel', { channelId: id }); + joined.delete(id); + this.log.info(`fabric: agent ${agentId} channel.left push on ${g.nodeId}: ${id} (now ${joined.size})`); + }); const syncTimer = setInterval( () => void syncChannels('resync'), FabricInbound.CHANNEL_SYNC_INTERVAL_MS,