Files
orca/src/preload/api/terminal-preview-bridge.ts
T
Neil 401664298f fix(preload): make a dropped bridge key a compile error
The split silently dropped jira.searchUsers and
runtimeEnvironments.retryControlConnection. Neither failed typecheck: the bridge
modules carried no satisfies annotation and the composed api object was
unannotated, so a missing key was only a runtime TypeError in the renderer.

Annotates each module against PreloadApi, the type window.api is already
declared as, so the contract supplies the shape rather than a parallel copy.
Deleting jira.searchUsers now fails with TS2741 naming the key.

Turning this on surfaced 106 places where a bridge locally annotated
Promise<unknown> or unknown[] over a contract that declares concrete types --
the bridge was erasing types the renderer relied on. Those annotations are gone.

Also exposes app.awaitBeforeUnloadCheckpoint, which was declared and called but
never actually on the bridge, so the lazy-chunk recovery reload optional-chained
to a no-op and navigated without joining the checkpoint. The missing key was
caught by the new annotation rather than by hand.
2026-09-01 18:24:49 -07:00

35 lines
1.3 KiB
TypeScript

import { ipcRenderer } from 'electron'
import type {
TerminalPreviewConnectResult,
TerminalPreviewDataPayload
} from '../../shared/terminal-preview'
import type { PreloadApi } from '../api-types'
export const terminalPreviewApi = {
connect: (
ptyId: string,
opts?: { scrollbackRows?: number }
): Promise<TerminalPreviewConnectResult> =>
ipcRenderer.invoke('terminalPreview:connect', { ptyId, opts }),
input: (ptyId: string, data: string): Promise<boolean> =>
ipcRenderer.invoke('terminalPreview:input', { ptyId, data }),
fit: (
ptyId: string,
cols: number,
rows: number
): Promise<{ cols: number; rows: number } | null> =>
ipcRenderer.invoke('terminalPreview:fit', { ptyId, cols, rows }),
ack: (ptyId: string, bytes: number): Promise<void> =>
ipcRenderer.invoke('terminalPreview:ack', { ptyId, bytes }),
unsubscribe: (ptyId: string): Promise<void> =>
ipcRenderer.invoke('terminalPreview:unsubscribe', { ptyId }),
onData: (callback: (payload: TerminalPreviewDataPayload) => void): (() => void) => {
const listener = (
_event: Electron.IpcRendererEvent,
payload: TerminalPreviewDataPayload
): void => callback(payload)
ipcRenderer.on('terminalPreview:data', listener)
return () => ipcRenderer.removeListener('terminalPreview:data', listener)
}
} satisfies PreloadApi['terminalPreview']