require('dotenv').config(); const { generateIdentity } = require("./src/core/identity"); const { PeerManager } = require("./src/state/peers"); const { DiagnosticsManager } = require("./src/state/diagnostics"); const { MessageHandler } = require("./src/p2p/messaging"); const { relayMessage } = require("./src/p2p/relay"); const { SwarmManager } = require("./src/p2p/swarm"); const { SSEManager } = require("./src/web/sse"); const { createServer, startServer } = require("./src/web/server"); const { DIAGNOSTICS_INTERVAL, ENABLE_CHAT, ENABLE_MAP } = require("./src/config/constants"); const main = async () => { const identity = generateIdentity(); const peerManager = new PeerManager(); const diagnostics = new DiagnosticsManager(); const sseManager = new SSEManager(); peerManager.addOrUpdatePeer(identity.id, peerManager.getSeq()); const broadcastUpdate = () => { sseManager.broadcastUpdate({ count: peerManager.size, totalUnique: peerManager.totalUniquePeers, direct: swarmManager.getSwarm().connections.size, id: identity.id, diagnostics: diagnostics.getStats(), chatEnabled: ENABLE_CHAT, mapEnabled: ENABLE_MAP, peers: peerManager.getPeersWithIps() }); }; const chatCallback = (msg) => { sseManager.broadcast(msg); }; const chatSystemFn = (msg) => { sseManager.broadcast(msg); }; const messageHandler = new MessageHandler( peerManager, diagnostics, (msg, sourceSocket) => relayMessage(msg, sourceSocket, swarmManager.getSwarm(), diagnostics), broadcastUpdate, chatCallback, chatSystemFn ); const swarmManager = new SwarmManager( identity, peerManager, diagnostics, messageHandler, (msg, sourceSocket) => relayMessage(msg, sourceSocket, swarmManager.getSwarm(), diagnostics), broadcastUpdate, chatSystemFn ); await swarmManager.start(); diagnostics.startLogging( () => peerManager.size, () => swarmManager.getSwarm().connections.size ); const diagnosticsTimer = setInterval(() => { broadcastUpdate(); }, DIAGNOSTICS_INTERVAL); diagnosticsTimer.unref(); const app = createServer(identity, peerManager, swarmManager, sseManager, diagnostics); const webServer = startServer(app, identity); let shuttingDown = false; const handleShutdown = async () => { if (shuttingDown) return; shuttingDown = true; clearInterval(diagnosticsTimer); diagnostics.stopLogging(); await swarmManager.shutdown(); webServer.close(() => { process.exit(0); }); }; process.on("SIGINT", handleShutdown); process.on("SIGTERM", handleShutdown); } main().catch(console.error);