Files
AgentCompany/src/preload/index.ts
T

53 lines
1.8 KiB
TypeScript

import { contextBridge, ipcRenderer } from "electron";
import { IPC_CHANNELS } from "@shared/contracts/channels";
import type { DesktopApi } from "@shared/contracts/desktop-api";
import {
PRELOAD_FORWARDERS,
PRELOAD_INPUT_SCHEMAS,
mapPreloadInvokeArgs,
type PreloadForwardedApi,
} from "@shared/contracts/preload-forwarders";
import type { DesktopEvent } from "@shared/types";
function createForwardedApi(): PreloadForwardedApi {
const forwardedEntries = PRELOAD_FORWARDERS.map(({ api, channel, payload }) => {
const schema = PRELOAD_INPUT_SCHEMAS[api];
return [
api,
(...args: unknown[]) => ipcRenderer.invoke(
IPC_CHANNELS[channel],
...mapPreloadInvokeArgs(payload, args, schema),
),
];
});
return Object.fromEntries(forwardedEntries) as PreloadForwardedApi;
}
const api: DesktopApi = {
...createForwardedApi(),
subscribe: (callback: (event: DesktopEvent) => void) => {
const listener = (_event: Electron.IpcRendererEvent, payload: DesktopEvent) => callback(payload);
ipcRenderer.on(IPC_CHANNELS.rendererEvent, listener);
return () => {
ipcRenderer.removeListener(IPC_CHANNELS.rendererEvent, listener);
};
},
platform: process.platform as "win32" | "darwin" | "linux",
windowMinimize: async () => {
await ipcRenderer.invoke(IPC_CHANNELS.windowMinimize);
},
windowMaximize: async () => {
await ipcRenderer.invoke(IPC_CHANNELS.windowMaximize);
},
windowClose: async () => {
await ipcRenderer.invoke(IPC_CHANNELS.windowClose);
},
windowIsMaximized: async () => {
const result = (await ipcRenderer.invoke(IPC_CHANNELS.windowIsMaximized)) as { ok: true; data: boolean } | { ok: false };
return result.ok ? result.data : false;
},
};
contextBridge.exposeInMainWorld("agentCompany", api);