UNPKG

@cocalc/server

Version:

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

115 lines 3.68 kB
"use strict"; /* Handle a project query (or query cancel) message from a project. */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.cancelAll = void 0; const database_1 = require("@cocalc/database"); const async_utils_1 = require("@cocalc/util/async-utils"); const message_1 = require("@cocalc/util/message"); const logger_1 = __importDefault(require("@cocalc/backend/logger")); const logger = (0, logger_1.default)("project-connection:handle-query"); function handleQuery(opts) { switch (opts.mesg.event) { case "query": query(opts); return; case "query_cancel": cancel(opts); return; default: throw Error(`unknown event ${opts.mesg.event}`); } } exports.default = handleQuery; const changefeeds = {}; function query({ project_id, mesg, sendResponse }) { logger.debug("query", project_id); const { id, changes, options, query } = mesg; if (!query) { throw Error("query must be defined"); } let first = true; // relevant if changes is true if (changes) { if (changefeeds[project_id] === undefined) { changefeeds[project_id] = new Set([id]); } else { changefeeds[project_id].add(id); } } const database = (0, database_1.db)(); database.user_query({ // use callback rather than async/await here, due to changefeed project_id, query, options, changes: changes ? id : undefined, cb: (err, result) => { if (result?.action == "close") { err = "close"; } if (err) { if (err != "close") { logger.debug("query: err=", err); } if (changefeeds[project_id]?.has(id)) { changefeeds[project_id]?.delete(id); } sendResponse((0, message_1.error)({ error: `${err}` })); if (changes && !first) { database.user_query_cancel_changefeed({ id }); } } else { let resp; if (changes && !first) { resp = result; resp.id = id; resp.multi_response = true; } else { first = false; resp = { ...mesg }; resp.query = result; } sendResponse(resp); } }, }); } async function cancel({ project_id, mesg, sendResponse, }) { const c = changefeeds[project_id]; if (!c?.has(mesg.id)) { // no such changefeed -- nothing to do sendResponse(mesg); return; } const database = (0, database_1.db)(); const resp = await (0, async_utils_1.callback2)(database.user_query_cancel_changefeed, { id: mesg.id, }); mesg.resp = resp; sendResponse(mesg); c.delete(mesg.id); } async function cancelAll(project_id) { const database = (0, database_1.db)(); const c = changefeeds[project_id]; if (!c) return; for (const id of c) { try { await (0, async_utils_1.callback2)(database.user_query_cancel_changefeed, { id }); c.delete(id); } catch (err) { logger.debug("WARNING: error cancelling changefeed", id, err); } } } exports.cancelAll = cancelAll; //# sourceMappingURL=handle-query.js.map