Add error reporting

This commit is contained in:
2026-01-09 01:25:41 +01:00
parent 6b673a7781
commit 0c9632d627
2 changed files with 43 additions and 0 deletions

View File

@@ -20,6 +20,7 @@ export class BroadcastRenderer {
this.renderIntervalId = null; this.renderIntervalId = null;
this.scriptWorker = null; this.scriptWorker = null;
this.scriptWorkerReady = false; this.scriptWorkerReady = false;
this.scriptErrorKeys = new Set();
this.obsBrowser = !!globalThis.obsstudio; this.obsBrowser = !!globalThis.obsstudio;
this.supportsAnimatedDecode = this.supportsAnimatedDecode =
@@ -388,6 +389,7 @@ export class BroadcastRenderer {
} }
const offscreen = this.scriptCanvas.transferControlToOffscreen(); const offscreen = this.scriptCanvas.transferControlToOffscreen();
this.scriptWorker = new Worker("/js/broadcast/script-worker.js"); this.scriptWorker = new Worker("/js/broadcast/script-worker.js");
this.scriptWorker.addEventListener("message", (event) => this.handleScriptWorkerMessage(event));
this.scriptWorker.postMessage( this.scriptWorker.postMessage(
{ {
type: "init", type: "init",
@@ -416,6 +418,24 @@ export class BroadcastRenderer {
}); });
} }
handleScriptWorkerMessage(event) {
const { type, payload } = event.data || {};
if (type !== "scriptError" || !payload?.id) {
return;
}
const key = `${payload.id}:${payload.stage || "unknown"}`;
if (this.scriptErrorKeys.has(key)) {
return;
}
this.scriptErrorKeys.add(key);
const details = payload.message || "Unknown error";
if (this.showToast) {
this.showToast(`Script ${payload.id} ${payload.stage || "error"}: ${details}`, "error");
} else {
console.error(`Script ${payload.id} ${payload.stage || "error"}`, payload);
}
}
async spawnUserJavaScriptWorker(asset) { async spawnUserJavaScriptWorker(asset) {
if (!asset?.id || !asset?.url) { if (!asset?.id || !asset?.url) {
return; return;

View File

@@ -5,6 +5,27 @@ let channelName = "";
let tickIntervalId = null; let tickIntervalId = null;
let lastTick = 0; let lastTick = 0;
let startTime = 0; let startTime = 0;
const errorKeys = new Set();
function reportScriptError(id, stage, error) {
if (!id) {
return;
}
const key = `${id}:${stage}:${error?.message ?? error}`;
if (errorKeys.has(key)) {
return;
}
errorKeys.add(key);
self.postMessage({
type: "scriptError",
payload: {
id,
stage,
message: error?.message ?? String(error),
stack: error?.stack || "",
},
});
}
function updateScriptContexts() { function updateScriptContexts() {
scripts.forEach((script) => { scripts.forEach((script) => {
@@ -119,6 +140,7 @@ self.addEventListener("message", (event) => {
handlers = createScriptHandlers(payload.source, context, state); handlers = createScriptHandlers(payload.source, context, state);
} catch (error) { } catch (error) {
console.error(`Script ${payload.id} failed to initialize`, error); console.error(`Script ${payload.id} failed to initialize`, error);
reportScriptError(payload.id, "initialize", error);
return; return;
} }
const script = { const script = {
@@ -134,6 +156,7 @@ self.addEventListener("message", (event) => {
script.init(script.context, script.state); script.init(script.context, script.state);
} catch (error) { } catch (error) {
console.error(`Script ${payload.id} init failed`, error); console.error(`Script ${payload.id} init failed`, error);
reportScriptError(payload.id, "init", error);
} }
} }
ensureTickLoop(); ensureTickLoop();