Fix terminal snapshot flushing
This commit is contained in:
@@ -9,6 +9,7 @@ import type {
|
||||
TerminalCommandFinishedInfo,
|
||||
TerminalExitInfo,
|
||||
TerminalSession,
|
||||
TerminalStateSnapshot,
|
||||
} from "./terminal.js";
|
||||
import type {
|
||||
TerminalListItem,
|
||||
@@ -21,6 +22,7 @@ import type {
|
||||
TerminalWorkerResponse,
|
||||
TerminalWorkerToParentMessage,
|
||||
WorkerCreateTerminalOptions,
|
||||
TerminalWorkerStateResult,
|
||||
WorkerTerminalInfo,
|
||||
} from "./terminal-worker-protocol.js";
|
||||
|
||||
@@ -186,15 +188,17 @@ export function createWorkerTerminalManager(
|
||||
return record.info.cwd;
|
||||
},
|
||||
send(message: ClientMessage): void {
|
||||
if (message.type === "resize") {
|
||||
record.state = {
|
||||
...record.state,
|
||||
rows: message.rows,
|
||||
cols: message.cols,
|
||||
};
|
||||
}
|
||||
sendBestEffortRequest({ type: "send", terminalId: record.info.id, message });
|
||||
},
|
||||
subscribe(listener: (msg: ServerMessage) => void): () => void {
|
||||
record.messageListeners.add(listener);
|
||||
queueMicrotask(() => {
|
||||
if (record.messageListeners.has(listener)) {
|
||||
listener({ type: "snapshot", state: record.state });
|
||||
}
|
||||
});
|
||||
return () => {
|
||||
record.messageListeners.delete(listener);
|
||||
};
|
||||
@@ -237,6 +241,12 @@ export function createWorkerTerminalManager(
|
||||
getState(): TerminalState {
|
||||
return record.state;
|
||||
},
|
||||
getStateSnapshot(): TerminalStateSnapshot {
|
||||
return {
|
||||
state: record.state,
|
||||
revision: 0,
|
||||
};
|
||||
},
|
||||
getTitle(): string | undefined {
|
||||
return record.info.title;
|
||||
},
|
||||
@@ -297,16 +307,6 @@ export function createWorkerTerminalManager(
|
||||
}
|
||||
}
|
||||
|
||||
function handleTerminalStateUpdatedEvent(
|
||||
message: Extract<TerminalWorkerToParentMessage, { type: "terminalStateUpdated" }>,
|
||||
): void {
|
||||
const record = recordsById.get(message.terminalId);
|
||||
if (!record) {
|
||||
return;
|
||||
}
|
||||
record.state = message.state;
|
||||
}
|
||||
|
||||
function handleTerminalExitEvent(
|
||||
message: Extract<TerminalWorkerToParentMessage, { type: "terminalExit" }>,
|
||||
): void {
|
||||
@@ -400,11 +400,6 @@ export function createWorkerTerminalManager(
|
||||
return;
|
||||
}
|
||||
|
||||
case "terminalStateUpdated": {
|
||||
handleTerminalStateUpdatedEvent(message);
|
||||
return;
|
||||
}
|
||||
|
||||
case "terminalExit": {
|
||||
handleTerminalExitEvent(message);
|
||||
return;
|
||||
@@ -525,6 +520,13 @@ export function createWorkerTerminalManager(
|
||||
return recordsById.get(id)?.session;
|
||||
},
|
||||
|
||||
async getTerminalState(id: string): Promise<TerminalStateSnapshot | null> {
|
||||
return (await sendRequest({
|
||||
type: "getTerminalState",
|
||||
terminalId: id,
|
||||
})) as TerminalWorkerStateResult;
|
||||
},
|
||||
|
||||
killTerminal(id: string): void {
|
||||
void sendRequest({ type: "killTerminal", terminalId: id }).catch(() => {
|
||||
// no-op; kill is intentionally best-effort and synchronous in the public interface.
|
||||
|
||||
Reference in New Issue
Block a user