@cocalc/project
Version:
CoCalc: project daemon
95 lines • 4.46 kB
JavaScript
;
/* 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