UNPKG

@samepage/internal

Version:

Utilities used across modules - not meant for use by users directly

103 lines 4.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.removeNotebookListener = exports.addNotebookListener = exports.receiveChunkedMessage = exports.handleMessage = exports.HandlerError = void 0; const tslib_1 = require("tslib"); const apiClient_1 = require("./apiClient"); const dispatchAppEvent_1 = tslib_1.__importDefault(require("./dispatchAppEvent")); const registry_1 = require("./registry"); const sendExtensionError_1 = tslib_1.__importDefault(require("./sendExtensionError")); const messageHandlers = {}; class HandlerError extends Error { constructor(message, data) { super(message); this.data = data; } } exports.HandlerError = HandlerError; const handleMessage = ({ content, uuid, source: _source, }) => { const { source = _source, ...props } = JSON.parse(content); const handlers = messageHandlers[props.operation]; if (!(handlers === null || handlers === void 0 ? void 0 : handlers.length)) { (0, dispatchAppEvent_1.default)({ type: "log", id: `network-error-${props.operation}`, content: `Unknown network operation: ${props.operation || "No operation specified"}`, intent: "error", }); (0, sendExtensionError_1.default)({ type: "Unknown network operation", data: { source, uuid, props }, }); return; } // There are operations where the source is not available, so we can't send an error // ex: AUTHENTICATION, ERROR // if (!source) { // dispatchAppEvent({ // type: "log", // id: `network-error-anonymous`, // content: `Unknown source of message`, // intent: "error", // }); // sendExtensionError({ // type: "Unknown source of message", // data: { operation, source, uuid, props }, // }); // return; // } messageHandlers[props.operation].forEach((handler) => { try { handler(props, source, uuid); } catch (e) { (0, apiClient_1.apiPost)({ path: "errors", data: { method: "extension-error", type: "Message Handler Failed", notebookUuid: (0, registry_1.getSetting)("uuid"), data: e instanceof HandlerError ? e.data : e instanceof Error ? { message: e.message } : e, message: e instanceof Error ? e.message : "Unknown data thrown", stack: e instanceof Error ? e.stack : "Unknown stacktrace", version: process.env.VERSION, }, }); } }); }; exports.handleMessage = handleMessage; const ongoingMessages = {}; const receiveChunkedMessage = (str) => { const { message, uuid, chunk, total } = JSON.parse(str); if (!ongoingMessages[uuid]) { ongoingMessages[uuid] = []; } const ongoingMessage = ongoingMessages[uuid]; ongoingMessage[chunk] = message; if (ongoingMessage.filter((c) => !!c).length === total) { delete ongoingMessages[uuid]; (0, exports.handleMessage)({ content: ongoingMessage.join(""), uuid }); } }; exports.receiveChunkedMessage = receiveChunkedMessage; const addNotebookListener = ({ operation, handler, }) => { messageHandlers[operation] = (messageHandlers[operation] || []).concat(handler); return () => { const handlers = messageHandlers[operation] || []; const index = (messageHandlers[operation] || []).indexOf(handler); handlers.splice(index, 1); if (!handlers.length) { delete messageHandlers[operation]; } }; }; exports.addNotebookListener = addNotebookListener; const removeNotebookListener = ({ operation, }) => { delete messageHandlers[operation]; }; exports.removeNotebookListener = removeNotebookListener; //# sourceMappingURL=setupMessageHandlers.js.map