Fix terminal subscription snapshot ordering
This commit is contained in:
@@ -829,16 +829,36 @@ export async function createTerminal(options: CreateTerminalOptions): Promise<Te
|
|||||||
}
|
}
|
||||||
|
|
||||||
function subscribe(listener: (msg: ServerMessage) => void): () => void {
|
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("", () => {
|
terminal.write("", () => {
|
||||||
if (!disposed && listeners.has(listener)) {
|
if (!disposed && active && listeners.has(subscriptionListener)) {
|
||||||
|
snapshotDelivered = true;
|
||||||
listener({ type: "snapshot", ...getStateSnapshot() });
|
listener({ type: "snapshot", ...getStateSnapshot() });
|
||||||
|
for (const message of queuedMessages.splice(0)) {
|
||||||
|
listener(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
listeners.delete(listener);
|
active = false;
|
||||||
|
queuedMessages.length = 0;
|
||||||
|
listeners.delete(subscriptionListener);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user