federer
Version:
Experiments in asynchronous federated learning and decentralized learning
89 lines • 3.21 kB
JavaScript
;
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