From 04b04fe5ee7f9f575dd21948664e7b9c6e92ed64 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 8 May 2026 19:29:15 +0700 Subject: [PATCH] Fix terminal subscription snapshot ordering --- packages/server/src/terminal/terminal.ts | 26 +++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/server/src/terminal/terminal.ts b/packages/server/src/terminal/terminal.ts index d0bb87280..ca5436c3f 100644 --- a/packages/server/src/terminal/terminal.ts +++ b/packages/server/src/terminal/terminal.ts @@ -829,16 +829,36 @@ export async function createTerminal(options: CreateTerminalOptions): Promise void): () => void { - listeners.add(listener); + let active = true; + let snapshotDelivered = false; + const queuedMessages: ServerMessage[] = []; + const subscriptionListener = (msg: ServerMessage): void => { + if (!active) { + return; + } + if (!snapshotDelivered) { + queuedMessages.push(msg); + return; + } + listener(msg); + }; + + listeners.add(subscriptionListener); terminal.write("", () => { - if (!disposed && listeners.has(listener)) { + if (!disposed && active && listeners.has(subscriptionListener)) { + snapshotDelivered = true; listener({ type: "snapshot", ...getStateSnapshot() }); + for (const message of queuedMessages.splice(0)) { + listener(message); + } } }); return () => { - listeners.delete(listener); + active = false; + queuedMessages.length = 0; + listeners.delete(subscriptionListener); }; }