@cocalc/project
Version:
CoCalc: project daemon
136 lines • 6.03 kB
JavaScript
;
/*
Handle a general message from the hub. These are the generic message,
as opposed to the messages specific to "client" functionality such as
database queries.
*/
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 logger_1 = require("@cocalc/project/logger");
const message = __importStar(require("@cocalc/util/message"));
const named_servers_1 = __importDefault(require("@cocalc/project/named-servers"));
const { exec_shell_code } = require("@cocalc/project/exec_shell_code");
// Reading and writing files to/from project and sending over socket
const { read_file_from_project, write_file_to_project, } = require("@cocalc/project/read_write_files");
const { print_to_pdf } = require("@cocalc/project/print_to_pdf");
const process_kill_1 = __importDefault(require("@cocalc/backend/misc/process-kill"));
const { handle_save_blob_message } = require("@cocalc/project/blobs");
const client = require("@cocalc/project/client");
const smc_version_1 = require("@cocalc/util/smc-version");
const write_text_file_to_project_1 = __importDefault(require("./write-text-file-to-project"));
const winston = (0, logger_1.getLogger)("handle-message-from-hub");
function handleMessage(socket, mesg) {
winston.debug("received a message", {
event: mesg.event,
id: mesg.id,
"...": "...",
});
// We can't just log this in general, since it can be big.
// So only uncomment this for low level debugging, unfortunately.
// winston.debug("received ", mesg);
if (client.client?.handle_mesg(mesg, socket)) {
return;
}
switch (mesg.event) {
case "heartbeat":
winston.debug(`received heartbeat on socket '${socket.id}'`);
// Update the last hearbeat timestamp, so we know socket is working.
socket.heartbeat = new Date();
return;
case "ping":
// ping message is used only for debugging purposes.
socket.write_mesg("json", message.pong({ id: mesg.id }));
return;
case "named_server_port":
(0, named_servers_1.default)(socket, mesg);
return;
case "project_exec":
// this is no longer used by web browser clients; however it *is* used by the HTTP api served
// by the hub to api key users, so do NOT remove it!
// The web browser clients use the websocket api,
exec_shell_code(socket, mesg);
return;
case "read_file_from_project":
read_file_from_project(socket, mesg);
return;
case "write_file_to_project":
write_file_to_project(socket, mesg);
return;
case "write_text_file_to_project":
(0, write_text_file_to_project_1.default)(socket, mesg);
return;
case "print_to_pdf":
print_to_pdf(socket, mesg);
return;
case "send_signal":
if (mesg.pid &&
(mesg.signal == 2 || mesg.signal == 3 || mesg.signal == 9)) {
(0, process_kill_1.default)(mesg.pid, mesg.signal);
}
else {
if (mesg.id) {
socket.write_mesg("json", message.error({
id: mesg.id,
error: "invalid pid or signal (must be 2,3,9)",
}));
}
return;
}
if (mesg.id != null) {
// send back confirmation that a signal was sent
socket.write_mesg("json", message.signal_sent({ id: mesg.id }));
}
return;
case "save_blob":
handle_save_blob_message(mesg);
return;
case "error":
winston.error(`ERROR from hub: ${mesg.error}`);
return;
case "hello":
// No action -- this is used by the hub to send an initial control message that has no effect, so that
// we know this socket will be used for control messages.
winston.info(`hello from hub -- sending back our version = ${smc_version_1.version}`);
socket.write_mesg("json", message.version({ version: smc_version_1.version }));
return;
default:
if (mesg.id != null) {
// only respond with error if there is an id -- otherwise response has no meaning to hub.
const err = message.error({
id: mesg.id,
error: `Project does not implement handling mesg with event='${mesg.event}'`,
});
socket.write_mesg("json", err);
}
else {
winston.debug(`Dropping unknown message with event='${mesg.event}'`);
}
}
}
exports.default = handleMessage;
//# sourceMappingURL=handle-message.js.map