UNPKG

@cocalc/project

Version:
95 lines 4.46 kB
"use strict"; /* Create the TCP server that communicates with hubs */ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const net_1 = require("net"); const fs_1 = require("fs"); const awaiting_1 = require("awaiting"); const async_utils_1 = require("@cocalc/util/async-utils"); const logger_1 = require("@cocalc/project/logger"); const data_1 = require("@cocalc/project/data"); const { unlock_socket } = require("@cocalc/backend/misc_node"); const enable_messaging_protocol_1 = __importDefault(require("@cocalc/backend/tcp/enable-messaging-protocol")); const init_program_1 = require("@cocalc/project/init-program"); const secret_token_1 = require("@cocalc/project/servers/secret-token"); const client = require("@cocalc/project/client"); const uuid = __importStar(require("uuid")); const handle_message_1 = __importDefault(require("./handle-message")); const winston = (0, logger_1.getLogger)("hub-tcp-server"); async function init() { if (!secret_token_1.secretToken || secret_token_1.secretToken.length < 16) { // being extra careful since security throw Error("secret token must be defined and at least 16 characters"); return; } winston.info("starting tcp server: project <--> hub..."); const server = (0, net_1.createServer)(handleConnection); server.listen(init_program_1.options.hubPort, init_program_1.options.hostname); await (0, async_utils_1.once)(server, "listening"); const address = server.address(); if (address == null || typeof address == "string") { // null = failed; string doesn't happen since that's for unix domain // sockets, which we aren't using. // This is probably impossible, but it makes typescript happier. throw Error("failed to assign a port"); } const { port } = address; winston.info(`hub tcp_server listening ${init_program_1.options.hostname}:${port}`); await (0, awaiting_1.callback)(fs_1.writeFile, data_1.hubPortFile, `${port}`); } exports.default = init; async function handleConnection(socket) { winston.info(`*new* connection from ${socket.remoteAddress}`); socket.on("error", (err) => { winston.error(`socket '${socket.remoteAddress}' error - ${err}`); }); socket.on("close", () => { winston.info(`*closed* connection from ${socket.remoteAddress}`); }); try { await (0, awaiting_1.callback)(unlock_socket, socket, secret_token_1.secretToken); } catch (err) { winston.error("failed to unlock socket -- ignoring any future messages and closing connection"); socket.destroy("invalid secret token"); return; } socket.id = uuid.v4(); socket.heartbeat = new Date(); // obviously working now (0, enable_messaging_protocol_1.default)(socket); socket.on("mesg", (type, mesg) => { client.client?.active_socket(socket); // record that this socket is active now. if (type === "json") { // non-JSON types are handled elsewhere, e.g., for sending binary data. // I'm not sure that any other message types are actually used though. // winston.debug("received json mesg", mesg); (0, handle_message_1.default)(socket, mesg); } }); } //# sourceMappingURL=tcp-server.js.map