From fdd4e242466c87bbc8516cab21d2f2f093d1a347 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 9 Oct 2025 20:41:22 +0200 Subject: [PATCH] Fix message routing by broadcasting to all providers and consumers - Router was stopping propagation after first handler returned true - This prevented consumers from seeing messages that providers handled - executionConsumer never received execution-complete because ConsoleRuntimeProvider handled it first - Now all providers and consumers receive all messages - Fixes javascript_repl never completing --- .../src/components/sandbox/ConsoleRuntimeProvider.ts | 7 ------- .../src/components/sandbox/RuntimeMessageRouter.ts | 10 +++++----- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts b/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts index e4859d5d..283ff964 100644 --- a/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts +++ b/packages/web-ui/src/components/sandbox/ConsoleRuntimeProvider.ts @@ -166,13 +166,6 @@ export class ConsoleRuntimeProvider implements SandboxRuntimeProvider { return true; } - // Don't handle execution-complete/error - let executionConsumer handle those - // We just need to respond to allow the message to proceed - if (message.type === "execution-complete" || message.type === "execution-error") { - respond({ success: true }); - return false; // Don't stop propagation - } - return false; } diff --git a/packages/web-ui/src/components/sandbox/RuntimeMessageRouter.ts b/packages/web-ui/src/components/sandbox/RuntimeMessageRouter.ts index d88c95f0..5d5096b0 100644 --- a/packages/web-ui/src/components/sandbox/RuntimeMessageRouter.ts +++ b/packages/web-ui/src/components/sandbox/RuntimeMessageRouter.ts @@ -153,15 +153,15 @@ export class RuntimeMessageRouter { // 1. Try provider handlers first (for bidirectional comm) for (const provider of context.providers) { if (provider.handleMessage) { - const handled = await provider.handleMessage(e.data, respond); - if (handled) return; // Stop if handled + await provider.handleMessage(e.data, respond); + // Don't stop - let consumers also handle the message } } - // 2. Broadcast to consumers (for one-way messages like console) + // 2. Broadcast to consumers (one-way messages or lifecycle events) for (const consumer of context.consumers) { - const consumed = await consumer.handleMessage(e.data); - if (consumed) break; // Stop if consumed + await consumer.handleMessage(e.data); + // Don't stop - let all consumers see the message } };