PRA-only-demo/src/preload/index.ts
2026-10-28 10:48:45 +08:00

45 lines
2.2 KiB
TypeScript

import { contextBridge, ipcRenderer } from "electron";
import type { AppInfo, Catalog, FlowDefinition, FlowSummary, RunEvent } from "../shared/types";
const api = {
app: {
info: (): Promise<AppInfo> => ipcRenderer.invoke("app:info")
},
catalog: {
get: (): Promise<Catalog> => ipcRenderer.invoke("catalog:get")
},
flows: {
list: (): Promise<FlowSummary[]> => ipcRenderer.invoke("flows:list"),
create: (name?: string): Promise<FlowDefinition> => ipcRenderer.invoke("flows:create", name),
createDemo: (): Promise<FlowDefinition> => ipcRenderer.invoke("flows:create-demo"),
createExamples: (): Promise<FlowSummary[]> => ipcRenderer.invoke("flows:create-examples"),
get: (id: string): Promise<FlowDefinition> => ipcRenderer.invoke("flows:get", id),
save: (flow: FlowDefinition): Promise<FlowDefinition> => ipcRenderer.invoke("flows:save", flow),
delete: (id: string): Promise<boolean> => ipcRenderer.invoke("flows:delete", id)
},
dialog: {
open: (options?: { title?: string; filters?: Array<{ name: string; extensions: string[] }>; directories?: boolean }): Promise<string | null> =>
ipcRenderer.invoke("dialog:open", options || {}),
save: (options?: { title?: string; defaultPath?: string; filters?: Array<{ name: string; extensions: string[] }> }): Promise<string | null> =>
ipcRenderer.invoke("dialog:save", options || {})
},
browser: {
pickElement: (options?: { url?: string }): Promise<import("../shared/types").ElementPickResult> =>
ipcRenderer.invoke("browser:pick-element", options || {})
},
run: {
start: (flow: FlowDefinition): Promise<{ runId: string }> => ipcRenderer.invoke("run:start", flow),
stop: (runId?: string): Promise<boolean> => ipcRenderer.invoke("run:stop", runId),
capabilities: (): Promise<{ count: number; ids: string[] }> => ipcRenderer.invoke("run:capabilities"),
onEvent: (callback: (event: RunEvent) => void): (() => void) => {
const listener = (_event: Electron.IpcRendererEvent, payload: RunEvent) => callback(payload);
ipcRenderer.on("run:event", listener);
return () => ipcRenderer.removeListener("run:event", listener);
}
}
};
contextBridge.exposeInMainWorld("rpa", api);
export type RpaApi = typeof api;