{"version":3,"file":"renderer.mjs","names":["createBaseContext"],"sources":["../../../src/adapters/electron/renderer.ts"],"sourcesContent":["import type { IpcRenderer, IpcRendererListener } from '@electron-toolkit/preload'\n\nimport type { EventContext } from '../../context'\nimport type { DirectionalEventa, Eventa } from '../../eventa'\n\nimport { createContext as createBaseContext } from '../../context'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, matchBy } from '../../eventa'\nimport { generatePayload, parsePayload } from './internal'\nimport { errorEvent } from './shared'\n\nexport function createContext(ipcRenderer: IpcRenderer, options?: {\n  messageEventName?: string | false\n  errorEventName?: string | false\n  extraListeners?: Record<string, IpcRendererListener>\n}) {\n  const ctx = createBaseContext() as EventContext<any, { raw: { ipcRendererEvent: Electron.IpcRendererEvent, event: Event | unknown } }>\n\n  const {\n    messageEventName = 'eventa-message',\n    errorEventName = 'eventa-error',\n    extraListeners = {},\n  } = options || {}\n\n  const cleanupRemoval: Array<{ remove: () => void }> = []\n\n  ctx.on(and(\n    matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection),\n    matchBy('*'),\n  ), (event) => {\n    const eventBody = generatePayload(event.id, { ...defineOutboundEventa(event.type), ...event })\n    // The message channel is disabled; do not publish to Electron IPC.\n    if (messageEventName === false) {\n      return\n    }\n\n    try {\n      ipcRenderer.send(messageEventName, eventBody)\n    }\n    catch (error) {\n      // Electron may close the target between scheduling and send.\n      if (!(error instanceof Error) || error?.message !== 'Object has been destroyed') {\n        throw error\n      }\n    }\n  })\n\n  function handleIncomingMessage(ipcRendererEvent: Electron.IpcRendererEvent, event: Event | unknown) {\n    try {\n      const { type, payload } = parsePayload<Eventa<any>>(event)\n      ctx.emit(defineInboundEventa(type), payload.body, { raw: { ipcRendererEvent, event } })\n    }\n    catch (error) {\n      console.error('Failed to parse IpcRenderer message:', error)\n      ctx.emit(errorEvent, { error }, { raw: { ipcRendererEvent, event } })\n    }\n  }\n\n  if (messageEventName) {\n    ipcRenderer.on(messageEventName, handleIncomingMessage)\n    cleanupRemoval.push({ remove: () => ipcRenderer.removeListener(messageEventName, handleIncomingMessage) })\n  }\n\n  if (errorEventName) {\n    const handleErrorMessage: IpcRendererListener = (ipcRendererEvent, error) => {\n      ctx.emit(errorEvent, { error }, { raw: { ipcRendererEvent, event: error } })\n    }\n    ipcRenderer.on(errorEventName, handleErrorMessage)\n    cleanupRemoval.push({ remove: () => ipcRenderer.removeListener(errorEventName, handleErrorMessage) })\n  }\n\n  for (const [eventName, listener] of Object.entries(extraListeners)) {\n    ipcRenderer.on(eventName, listener)\n    cleanupRemoval.push({ remove: () => ipcRenderer.removeListener(eventName, listener) })\n  }\n\n  return {\n    context: ctx,\n    dispose: (reason?: unknown) => {\n      // Cascade-cancel any in-flight `defineInvoke(...)` so main-bound\n      // RPCs don't hang after the renderer-side adapter is torn down.\n      ctx.abort(reason ?? new Error('eventa: invoke cancelled, electron renderer ipc disposed'))\n      cleanupRemoval.forEach(removal => removal.remove())\n    },\n  }\n}\n\nexport type * from './shared'\n"],"mappings":";;;AAUA,SAAgB,cAAc,aAA0B,SAIrD;CACD,MAAM,MAAMA,gBAAkB;CAE9B,MAAM,EACJ,mBAAmB,kBACnB,iBAAiB,gBACjB,iBAAiB,CAAC,MAChB,WAAW,CAAC;CAEhB,MAAM,iBAAgD,CAAC;CAEvD,IAAI,GAAG,IACL,SAAS,MAA8B,EAAE,mBAAA,cAAmD,CAAC,EAAE,cAAc,GAC7G,QAAQ,GAAG,CACb,IAAI,UAAU;EACZ,MAAM,YAAY,gBAAgB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,IAAI;GAAG,GAAG;EAAM,CAAC;EAE7F,IAAI,qBAAqB,OACvB;EAGF,IAAI;GACF,YAAY,KAAK,kBAAkB,SAAS;EAC9C,SACO,OAAO;GAEZ,IAAI,EAAE,iBAAiB,UAAU,OAAO,YAAY,6BAClD,MAAM;EAEV;CACF,CAAC;CAED,SAAS,sBAAsB,kBAA6C,OAAwB;EAClG,IAAI;GACF,MAAM,EAAE,MAAM,YAAY,aAA0B,KAAK;GACzD,IAAI,KAAK,oBAAoB,IAAI,GAAG,QAAQ,MAAM,EAAE,KAAK;IAAE;IAAkB;GAAM,EAAE,CAAC;EACxF,SACO,OAAO;GACZ,QAAQ,MAAM,wCAAwC,KAAK;GAC3D,IAAI,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,KAAK;IAAE;IAAkB;GAAM,EAAE,CAAC;EACtE;CACF;CAEA,IAAI,kBAAkB;EACpB,YAAY,GAAG,kBAAkB,qBAAqB;EACtD,eAAe,KAAK,EAAE,cAAc,YAAY,eAAe,kBAAkB,qBAAqB,EAAE,CAAC;CAC3G;CAEA,IAAI,gBAAgB;EAClB,MAAM,sBAA2C,kBAAkB,UAAU;GAC3E,IAAI,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,KAAK;IAAE;IAAkB,OAAO;GAAM,EAAE,CAAC;EAC7E;EACA,YAAY,GAAG,gBAAgB,kBAAkB;EACjD,eAAe,KAAK,EAAE,cAAc,YAAY,eAAe,gBAAgB,kBAAkB,EAAE,CAAC;CACtG;CAEA,KAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,cAAc,GAAG;EAClE,YAAY,GAAG,WAAW,QAAQ;EAClC,eAAe,KAAK,EAAE,cAAc,YAAY,eAAe,WAAW,QAAQ,EAAE,CAAC;CACvF;CAEA,OAAO;EACL,SAAS;EACT,UAAU,WAAqB;GAG7B,IAAI,MAAM,0BAAU,IAAI,MAAM,0DAA0D,CAAC;GACzF,eAAe,SAAQ,YAAW,QAAQ,OAAO,CAAC;EACpD;CACF;AACF"}