preload.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. /** Context-isolated renderer bridge for desktop package and update operations. */
  2. import { contextBridge, ipcRenderer } from 'electron'
  3. import { DESKTOP_IPC, type DshDesktopApi, type DesktopUpdateState } from './ipc.ts'
  4. import type { DesktopBackendState } from './backend-controller.ts'
  5. const api: DshDesktopApi = {
  6. protocolVersion: 1,
  7. locale: () => ipcRenderer.invoke(DESKTOP_IPC.localeGet) as Promise<ReturnType<DshDesktopApi['locale']> extends Promise<infer T> ? T : never>,
  8. plugins: {
  9. list: () => ipcRenderer.invoke(DESKTOP_IPC.pluginsList) as Promise<ReturnType<DshDesktopApi['plugins']['list']> extends Promise<infer T> ? T : never>,
  10. add: spec => ipcRenderer.invoke(DESKTOP_IPC.pluginsAdd, spec) as Promise<void>,
  11. remove: name => ipcRenderer.invoke(DESKTOP_IPC.pluginsRemove, name) as Promise<void>,
  12. toggle: (name, enabled) => ipcRenderer.invoke(DESKTOP_IPC.pluginsToggle, name, enabled) as Promise<void>,
  13. disableAll: () => ipcRenderer.invoke(DESKTOP_IPC.pluginsDisableAll) as Promise<void>,
  14. update: (name, version) => ipcRenderer.invoke(DESKTOP_IPC.pluginsUpdate, name, version) as Promise<void>,
  15. },
  16. backend: {
  17. status: () => ipcRenderer.invoke(DESKTOP_IPC.backendStatus) as ReturnType<DshDesktopApi['backend']['status']>,
  18. retry: () => ipcRenderer.invoke(DESKTOP_IPC.backendRetry) as Promise<void>,
  19. subscribe(listener) {
  20. const handle = (_event: Electron.IpcRendererEvent, state: DesktopBackendState): void => { listener(state) }
  21. ipcRenderer.on(DESKTOP_IPC.backendState, handle)
  22. return () => { ipcRenderer.off(DESKTOP_IPC.backendState, handle) }
  23. },
  24. },
  25. updates: {
  26. check: () => ipcRenderer.invoke(DESKTOP_IPC.updatesCheck) as Promise<DesktopUpdateState>,
  27. install: () => ipcRenderer.invoke(DESKTOP_IPC.updatesInstall) as Promise<void>,
  28. subscribe(listener) {
  29. const handle = (_event: Electron.IpcRendererEvent, state: DesktopUpdateState): void => { listener(state) }
  30. ipcRenderer.on(DESKTOP_IPC.updatesState, handle)
  31. return () => { ipcRenderer.off(DESKTOP_IPC.updatesState, handle) }
  32. },
  33. },
  34. }
  35. contextBridge.exposeInMainWorld('dshDesktop', api)