Fix terminal subscription snapshot ordering

This commit is contained in:
Mohamed Boudra
2026-05-08 19:29:15 +07:00
parent 9d5a47b1c3
commit 04b04fe5ee
+23 -3
View File
@@ -829,16 +829,36 @@ export async function createTerminal(options: CreateTerminalOptions): Promise<Te
}
function subscribe(listener: (msg: ServerMessage) => 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);
};
}