UNPKG

automata-metaverse

Version:

Automaton execution engines for self-referential CanvasL/JSONL systems

95 lines (81 loc) 2.55 kB
/** * Peer Discovery Coordination * * Coordinates peer discovery via MQTT Herald (A₁₀) and WebRTC Messenger (A₉) */ import type { SwarmContext } from '../automata/types.js'; export interface DiscoveredPeer { peerId: string; timestamp: number; webrtcConnected: boolean; mqttDiscovered: boolean; } /** * Peer Discovery Coordinator * * Coordinates discovery between MQTT Herald and WebRTC Messenger */ export class PeerDiscovery { private discoveredPeers: Map<string, DiscoveredPeer> = new Map(); /** * Discover peers via MQTT and establish WebRTC connections */ async discoverPeers(swarm: SwarmContext): Promise<DiscoveredPeer[]> { const a9 = swarm.get(9); // WebRTC Messenger const a10 = swarm.get(10); // MQTT Herald if (!a9 || !a10) { console.warn('PeerDiscovery: A₉ or A₁₀ not available'); return []; } // Get discovered peers from MQTT Herald let mqttPeers: Map<string, any> = new Map(); if ('getDiscoveredPeers' in a10 && typeof a10.getDiscoveredPeers === 'function') { mqttPeers = (a10 as any).getDiscoveredPeers(); } // For each MQTT-discovered peer, establish WebRTC connection for (const [peerId, peerInfo] of mqttPeers.entries()) { if (!this.discoveredPeers.has(peerId)) { this.discoveredPeers.set(peerId, { peerId, timestamp: peerInfo.timestamp || Date.now(), webrtcConnected: false, mqttDiscovered: true }); // Request WebRTC connection via A₉ if ('connectToPeer' in a9 && typeof a9.connectToPeer === 'function') { try { await (a9 as any).connectToPeer(peerId); const peer = this.discoveredPeers.get(peerId); if (peer) { peer.webrtcConnected = true; } } catch (error) { console.error(`PeerDiscovery: Failed to connect to peer ${peerId}:`, error); } } } } return Array.from(this.discoveredPeers.values()); } /** * Get discovered peers */ getDiscoveredPeers(): DiscoveredPeer[] { return Array.from(this.discoveredPeers.values()); } /** * Get peer by ID */ getPeer(peerId: string): DiscoveredPeer | undefined { return this.discoveredPeers.get(peerId); } /** * Update peer connection status */ updatePeerConnection(peerId: string, connected: boolean): void { const peer = this.discoveredPeers.get(peerId); if (peer) { peer.webrtcConnected = connected; } } }