assistant/electron/preload.ts

32 lines
1.4 KiB
TypeScript

import { contextBridge, ipcRenderer, type IpcRendererEvent } from 'electron';
import type { AssistantBridge, ViewMode, ViewportMessage } from './shared';
function subscribe<T>(channel: string, handler: (payload: T) => void): () => void {
const listener = (_event: IpcRendererEvent, payload: T): void => handler(payload);
ipcRenderer.on(channel, listener);
return () => ipcRenderer.removeListener(channel, listener);
}
const bridge: AssistantBridge = {
desktopChrome: {
platform: process.platform,
titleBar: process.platform === 'darwin' ? 'mac-inset' : 'native',
},
get: path => ipcRenderer.invoke('api:get', path),
post: (path, body) => ipcRenderer.invoke('api:post', path, body ?? {}),
put: (path, body) => ipcRenderer.invoke('api:put', path, body ?? {}),
del: path => ipcRenderer.invoke('api:delete', path),
openPath: filePath => ipcRenderer.invoke('shell:openPath', filePath),
meta: () => ipcRenderer.invoke('app:meta'),
browser: {
viewport: (message: ViewportMessage) => ipcRenderer.invoke('browser:viewport', message),
mode: (taskId: string, mode: ViewMode) => ipcRenderer.invoke('browser:mode', { taskId, mode }),
onState: handler => subscribe('browser:state', handler),
onReveal: handler => subscribe('browser:reveal', handler),
onHide: handler => subscribe('browser:hide', handler),
onUserInput: handler => subscribe('browser:user-input', handler),
},
};
contextBridge.exposeInMainWorld('assistant', bridge);