ipc-registry.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // electron/modules/ipc-registry.ts - IPC 处理器自动注册模块
  2. import { ipcMain, type IpcMainInvokeEvent } from 'electron'
  3. import logger from './logger'
  4. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  5. type IpcHandler = (event: IpcMainInvokeEvent, ...args: any[]) => any
  6. // 存储所有已注册的 handler 名称
  7. const registeredHandlers = new Set<string>()
  8. /**
  9. * 注册 IPC 处理器
  10. * @param channel IPC 通道名称
  11. * @param handler 处理函数
  12. */
  13. export function registerHandler(channel: string, handler: IpcHandler): void {
  14. if (registeredHandlers.has(channel)) {
  15. logger.warn(`IPC handler "${channel}" 已存在,将被覆盖`)
  16. ipcMain.removeHandler(channel)
  17. }
  18. ipcMain.handle(channel, handler)
  19. registeredHandlers.add(channel)
  20. logger.debug(`已注册 IPC handler: ${channel}`)
  21. }
  22. /**
  23. * 批量注册 IPC 处理器
  24. * @param handlers 处理器映射对象
  25. */
  26. export function registerHandlers(handlers: Record<string, IpcHandler>): void {
  27. for (const [channel, handler] of Object.entries(handlers)) {
  28. registerHandler(channel, handler)
  29. }
  30. }
  31. /**
  32. * 移除指定的 IPC 处理器
  33. * @param channel IPC 通道名称
  34. */
  35. export function removeHandler(channel: string): void {
  36. if (registeredHandlers.has(channel)) {
  37. ipcMain.removeHandler(channel)
  38. registeredHandlers.delete(channel)
  39. logger.debug(`已移除 IPC handler: ${channel}`)
  40. }
  41. }
  42. /**
  43. * 移除所有已注册的 IPC 处理器
  44. */
  45. export function removeAllHandlers(): void {
  46. for (const channel of registeredHandlers) {
  47. ipcMain.removeHandler(channel)
  48. }
  49. const count = registeredHandlers.size
  50. registeredHandlers.clear()
  51. logger.info(`已移除所有 IPC handlers (共 ${count} 个)`)
  52. }
  53. /**
  54. * 获取所有已注册的 handler 名称
  55. */
  56. export function getRegisteredHandlers(): string[] {
  57. return Array.from(registeredHandlers)
  58. }
  59. /**
  60. * 检查 handler 是否已注册
  61. */
  62. export function isHandlerRegistered(channel: string): boolean {
  63. return registeredHandlers.has(channel)
  64. }