38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
import type { Editor } from "@graphite/editor";
|
|
import { createCrashDialog } from "@graphite/stores/dialog";
|
|
|
|
let editorRef: Editor | undefined = undefined;
|
|
|
|
export function createPanicManager(editor: Editor) {
|
|
destroyPanicManager();
|
|
|
|
editorRef = editor;
|
|
|
|
editor.subscriptions.subscribeFrontendMessage("DisplayDialogPanic", (data) => {
|
|
// `Error.stackTraceLimit` is only available in V8/Chromium
|
|
const previousStackTraceLimit = Error.stackTraceLimit;
|
|
Error.stackTraceLimit = Infinity;
|
|
const stackTrace = new Error().stack || "";
|
|
Error.stackTraceLimit = previousStackTraceLimit;
|
|
|
|
const panicDetails = `${data.panicInfo}${stackTrace ? `\n\n${stackTrace}` : ""}`;
|
|
|
|
// eslint-disable-next-line no-console
|
|
console.error(panicDetails);
|
|
|
|
createCrashDialog(panicDetails);
|
|
});
|
|
}
|
|
|
|
export function destroyPanicManager() {
|
|
const editor = editorRef;
|
|
if (!editor) return;
|
|
|
|
editor.subscriptions.unsubscribeFrontendMessage("DisplayDialogPanic");
|
|
}
|
|
|
|
// Self-accepting HMR: tear down the old instance and re-create with the new module's code
|
|
import.meta.hot?.accept((newModule) => {
|
|
if (editorRef) newModule?.createPanicManager(editorRef);
|
|
});
|