@cocalc/server
Version:
CoCalc server functionality: functions used by either the hub and the next.js server
89 lines • 3.3 kB
JavaScript
;
/*
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