@samepage/internal
Version:
Utilities used across modules - not meant for use by users directly
103 lines • 4.05 kB
JavaScript
;
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