From 5dcb5ecc89cb87bc7f8dc386a7f2c98eb87f9ec0 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 9 Oct 2025 20:31:48 +0200 Subject: [PATCH] Fix race condition by making window.complete() async and awaiting it - window.complete() was fire-and-forget, causing execution-complete to arrive before console messages - This caused sandbox to unregister before console message responses arrived - Made complete() async and await sendRuntimeMessage() - SandboxedIframe wrapper now awaits window.complete() - Ensures all messages are processed before cleanup/unregister - Fixes 30-second timeout on javascript_repl --- .../web-ui/src/components/SandboxedIframe.ts | 4 ++-- .../sandbox/ConsoleRuntimeProvider.ts | 20 ++++++++----------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/packages/web-ui/src/components/SandboxedIframe.ts b/packages/web-ui/src/components/SandboxedIframe.ts index 47155016..d4f7a33d 100644 --- a/packages/web-ui/src/components/SandboxedIframe.ts +++ b/packages/web-ui/src/components/SandboxedIframe.ts @@ -339,7 +339,7 @@ export class SandboxIframe extends LitElement { } } - window.complete(); + await window.complete(); } catch (error) { console.error(error?.stack || error?.message || String(error)); @@ -352,7 +352,7 @@ export class SandboxIframe extends LitElement { } } - window.complete({ + await window.complete({ message: error?.message || String(error), stack: error?.stack || new Error().stack }); diff --git a/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts b/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts index 94a49404..f284d4f9 100644 --- a/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts +++ b/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts @@ -120,7 +120,7 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider { // Expose complete() method for user code to call let completionSent = false; - (window as any).complete = (error?: { message: string; stack: string }) => { + (window as any).complete = async (error?: { message: string; stack: string }) => { if (completionSent) return; completionSent = true; @@ -128,18 +128,14 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider { if ((window as any).sendRuntimeMessage) { if (finalError) { - (window as any) - .sendRuntimeMessage({ - type: "execution-error", - error: finalError, - }) - .catch(() => {}); + await (window as any).sendRuntimeMessage({ + type: "execution-error", + error: finalError, + }); } else { - (window as any) - .sendRuntimeMessage({ - type: "execution-complete", - }) - .catch(() => {}); + await (window as any).sendRuntimeMessage({ + type: "execution-complete", + }); } } };