Unify completion callback pattern across browser-javascript and javascript-repl

- Remove fallback timeout from ConsoleRuntimeProvider (was causing 2s delays)
- Add completion callback support to SandboxedIframe REPL wrapper
- Call completion callbacks before window.complete() in both success/error paths
- Both browser-javascript and javascript-repl now use identical completion pattern
- Ensures console logs are batched and sent before execution completes
This commit is contained in:
Mario Zechner 2025-10-09 20:24:20 +02:00
parent 6983ad4eaa
commit 33418d9dea
2 changed files with 20 additions and 9 deletions

View file

@ -329,9 +329,29 @@ export class SandboxIframe extends LitElement {
(async () => {
try {
${userCode}
// Call completion callbacks before complete()
if (window.__completionCallbacks && window.__completionCallbacks.length > 0) {
try {
await Promise.all(window.__completionCallbacks.map(cb => cb(true)));
} catch (e) {
console.error('Completion callback error:', e);
}
}
window.complete();
} catch (error) {
console.error(error?.stack || error?.message || String(error));
// Call completion callbacks before complete() (error path)
if (window.__completionCallbacks && window.__completionCallbacks.length > 0) {
try {
await Promise.all(window.__completionCallbacks.map(cb => cb(false)));
} catch (e) {
console.error('Completion callback error:', e);
}
}
window.complete({
message: error?.message || String(error),
stack: error?.stack || new Error().stack

View file

@ -143,15 +143,6 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider {
}
}
};
// Fallback timeout for HTML artifacts that don't call complete()
if (document.readyState === "complete" || document.readyState === "interactive") {
setTimeout(() => (window as any).complete(), 2000);
} else {
window.addEventListener("load", () => {
setTimeout(() => (window as any).complete(), 2000);
});
}
};
}