UNPKG

@cocalc/server

Version:

CoCalc server functionality: functions used by either the hub and the next.js server

89 lines 3.3 kB
"use strict"; /* Handle incoming JSON messages from a project. */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.callProjectMessage = void 0; const handle_version_1 = __importDefault(require("./handle-version")); const handle_query_1 = __importDefault(require("./handle-query")); const handle_syncdoc_1 = __importDefault(require("./handle-syncdoc")); const message_1 = require("@cocalc/util/message"); const logger_1 = __importDefault(require("@cocalc/backend/logger")); const logger = (0, logger_1.default)("project-connection:handle-message"); const uuid_1 = require("uuid"); const util_1 = require("util"); const callCallbacks = {}; async function handleMessage({ socket, project_id, mesg, }) { logger.debug("received message ", project_id); if (mesg.event == "version") { (0, handle_version_1.default)(project_id, mesg.version); return; } // globally unique random uuid const { id } = mesg; if (id == null) { // all messages except "version" must have an id logger.warn("WARNING: all messages except 'version' must have an id", mesg); return; } const f = callCallbacks[id]; if (f != null) { f(mesg); return; } logger.debug("handling call from project"); function sendResponse(resp) { resp.id = id; socket.write_mesg("json", resp); } try { switch (mesg.event) { case "ping": sendResponse((0, message_1.pong)()); return; case "query": case "query_cancel": await (0, handle_query_1.default)({ project_id, mesg, sendResponse }); return; case "get_syncdoc_history": await (0, handle_syncdoc_1.default)({ project_id, mesg, sendResponse }); return; case "file_written_to_project": case "file_read_from_project": case "error": // ignore/deprecated/don't care...? return; default: throw Error(`unknown event '${mesg.event}'`); } } catch (err) { sendResponse((0, message_1.error)({ error: `${err}` })); } } exports.default = handleMessage; async function callProjectMessage({ socket, mesg, timeoutSeconds = 60, }) { logger.debug("callProjectMessage", mesg.event, mesg.id); while (mesg.id == null || callCallbacks[mesg.id] != null) { mesg.id = (0, uuid_1.v4)(); } const getResponse = (0, util_1.promisify)((cb) => { callCallbacks[mesg.id] = (resp) => { logger.debug("callProjectMessage -- got response", resp.id); cb(undefined, resp); }; setTimeout(() => { cb("timeout"); callCallbacks[mesg.id] = () => { logger.debug(mesg.id, `callProjectMessage -- ignoring response due to timeout ${timeoutSeconds}s`); }; }, timeoutSeconds * 1000); }); socket.write_mesg("json", mesg); return await getResponse(); } exports.callProjectMessage = callProjectMessage; //# sourceMappingURL=handle-message.js.map