import { join } from "path"; import { Router } from "express"; const Primus = require("primus"); import base_path from "@cocalc/backend/base-path"; import Logger from "@cocalc/backend/logger"; import setup_primus_client from "@cocalc/hub/primus-client"; const { Client } = require("@cocalc/hub/client"); import { len } from "@cocalc/util/misc"; import { database } from "./database"; interface Options { httpServer; router: Router; projectControl; clients: { [id: string]: any }; // todo: when client is in typescript, use proper type... host: string; port: number; isPersonal: boolean; } export default function init({ httpServer, router, projectControl, clients, host, port, isPersonal, }: Options): void { const logger = Logger("primus"); // It is now safe to change the primusOpts below, and this // doesn't require changing anything anywhere else. // See https://github.com/primus/primus#getting-started const primusOpts = { pathname: join(base_path, "hub"), maxLength: 2 * 10485760, // 20MB - twice the default compression: true, }; const primus_server = new Primus(httpServer, primusOpts); logger.info(`listening on ${primusOpts.pathname}`); // Make it so new websocket connection requests get handled: primus_server.on("connection", function (conn) { // Now handle the connection logger.info(`new connection from ${conn.address.ip} -- ${conn.id}`); clients[conn.id] = new Client({ conn, logger, database, compute_server: projectControl, host, port, personal: isPersonal, }); logger.info(`num_clients=${len(clients)}`); }); // Serve the primus.js client code via the express router. setup_primus_client(router, primus_server); }