32 lines
1.4 KiB
TypeScript
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);
|