UNPKG

federer

Version:

Experiments in asynchronous federated learning and decentralized learning

89 lines 3.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IPCServer = void 0; const tslib_1 = require("tslib"); const assert = require("assert"); const http = tslib_1.__importStar(require("http")); const io = tslib_1.__importStar(require("socket.io")); const Process_1 = require("./Process"); const ProcessTracker_1 = require("./ProcessTracker"); class IPCServer { constructor(clients, server, numberClients, logger) { this.clients = clients; this.server = server; this.numberClients = numberClients; this.logger = logger; assert(Number.isInteger(numberClients)); assert(numberClients > 0); this.tracker = new ProcessTracker_1.ProcessTracker(logger); // Register listeners, generate Promise that resolves when all nodes are // connected: this.nodesReadyPromise = Promise.all([ this.allClientsConnectedPromise(), this.serverConnectedPromise(), ]).then((processes) => { const [clientProcesses, serverProcess] = processes; this.tracker.register(serverProcess, "server"); clientProcesses.forEach((client, i) => this.tracker.register(client, `client-${i}`)); return processes; }); } static create(clientPort, serverPort, numberClients, logger) { return new IPCServer(createIOServer(clientPort), createIOServer(serverPort), numberClients, logger); } async networkReady() { const [clients, server] = await this.nodesReadyPromise; return { tracker: this.tracker, ipc: this, clients, server, }; } close() { this.clients.close(); this.server.close(); } /** * Returns a Promise that resolves once the server connects to the coordinator */ serverConnectedPromise() { return new Promise((resolve) => { this.server.once("connect", (socket) => { resolve(new Process_1.Process(socket)); }); }); } /** * Returns a Promise that resolves once all clients have connected to the * coordinator. */ allClientsConnectedPromise() { return new Promise((resolve) => { let connected = []; const listener = (socket) => { connected.push(new Process_1.Process(socket)); socket.once("disconnect", () => { connected = connected.filter((process) => process.socket !== socket); }); if (connected.length === this.numberClients) { this.clients.removeListener("connect", listener); resolve(connected); } }; this.clients.on("connect", listener); }); } } exports.IPCServer = IPCServer; /** Create a socket.io server listening on some port. */ function createIOServer(port) { const httpServer = http.createServer(); const server = new io.Server(httpServer, { pingInterval: 60000, pingTimeout: 180000, }); httpServer.listen(port); return server; } //# sourceMappingURL=IPCServer.js.map