{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../src/adapters/event-target/internal.ts","../../../src/adapters/event-target/shared.ts","../../../src/adapters/event-target/index.ts"],"sourcesContent":["import type { EventTag } from '../..'\nimport type { CustomEventDetail as CustomEventDetailDetail } from './shared'\n\nimport { nanoid } from '../..'\n\nexport function generateCustomEventDetail<T>(type: EventTag<any, any>, payload: T): CustomEventDetailDetail<T> {\n  return {\n    id: nanoid(),\n    type,\n    payload,\n  }\n}\n\nexport function parseCustomEventDetail<T>(data: unknown): CustomEventDetailDetail<T> {\n  return data as CustomEventDetailDetail<T>\n}\n","import type { EventTag } from '../../eventa'\nimport type { AdapterErrorPayload } from '../errors'\n\nimport { defineEventa } from '../../eventa'\n\nexport type { AdapterErrorKind, AdapterErrorPayload } from '../errors'\n\nexport interface CustomEventDetail<T> {\n  id: string\n  type: EventTag<any, any>\n  payload: T\n}\n\n/**\n * Emitted by the EventTarget adapter when an inbound event fails to parse\n * (`kind: 'parse'`) or the underlying target dispatches an `error`\n * (`kind: 'fatal'`). This adapter is generic (it also backs WebSocket-style\n * targets), so the event is named generically rather than worker-specific.\n * Has a stable id so it can be subscribed to across module boundaries.\n */\nexport const adapterErrorEvent = defineEventa<AdapterErrorPayload>('eventa:adapter:error')\n","import type { EventContext } from '../../context'\nimport type { DirectionalEventa, Eventa } from '../../eventa'\n\nimport { createContext as createBaseContext } from '../../context'\nimport { and, defineInboundEventa, defineOutboundEventa, EventaFlowDirection, EventaType, matchBy } from '../../eventa'\nimport { toError } from '../errors'\nimport { generateCustomEventDetail, parseCustomEventDetail } from './internal'\nimport { adapterErrorEvent } from './shared'\n\nfunction withRemoval(eventTarget: EventTarget, type: string, listener: EventListenerOrEventListenerObject | null) {\n  eventTarget.addEventListener(type, listener)\n\n  return {\n    remove: () => {\n      eventTarget.removeEventListener(type, listener)\n    },\n  }\n}\n\nexport function createContext(eventTarget: EventTarget, options?: {\n  messageEventName?: string | false\n  errorEventName?: string | false\n  extraListeners?: Record<string, (event: Event) => void | Promise<void>>\n}) {\n  const ctx = createBaseContext() as EventContext<any, { raw: { event: CustomEvent | Event | unknown } }>\n\n  const {\n    messageEventName = 'message',\n    errorEventName = '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 detail = generateCustomEventDetail(event.id, { ...defineOutboundEventa(event.type), ...event })\n\n    const customEvent = new CustomEvent(messageEventName || EventaType.Event, {\n      detail,\n      bubbles: true,\n      cancelable: true,\n    })\n\n    eventTarget.dispatchEvent(customEvent)\n  })\n\n  if (messageEventName) {\n    cleanupRemoval.push(withRemoval(eventTarget, messageEventName, (event) => {\n      try {\n        const { type, payload } = parseCustomEventDetail<Eventa<any>>((event as CustomEvent).detail)\n        ctx.emit(defineInboundEventa(type), payload.body, { raw: { event } })\n      }\n      catch (error) {\n        console.error('Failed to parse EventTarget message:', error)\n        ctx.emit(adapterErrorEvent, { kind: 'parse', error: toError(error, 'eventa: EventTarget message parse error') }, { raw: { event } })\n      }\n    }))\n  }\n\n  if (errorEventName) {\n    cleanupRemoval.push(withRemoval(eventTarget, errorEventName, (event) => {\n      ctx.emit(adapterErrorEvent, { kind: 'fatal', error: toError(event, 'eventa: EventTarget error') }, { raw: { event } })\n    }))\n  }\n\n  for (const [eventName, listener] of Object.entries(extraListeners)) {\n    cleanupRemoval.push(withRemoval(eventTarget, eventName, listener))\n  }\n\n  return {\n    context: ctx,\n    dispose: (reason?: unknown) => {\n      ctx.abort(reason ?? new Error('eventa: invoke cancelled, EventTarget adapter disposed'))\n      cleanupRemoval.forEach(removal => removal.remove())\n    },\n  }\n}\n\nexport { adapterErrorEvent } from './shared'\nexport type * from './shared'\n"],"mappings":";;;;AAKA,SAAgB,0BAA6B,MAA0B,SAAwC;CAC7G,OAAO;EACL,IAAI,OAAO;EACX;EACA;CACF;AACF;AAEA,SAAgB,uBAA0B,MAA2C;CACnF,OAAO;AACT;;;;;;;;;;ACKA,MAAa,oBAAoB,aAAkC,sBAAsB;;;ACXzF,SAAS,YAAY,aAA0B,MAAc,UAAqD;CAChH,YAAY,iBAAiB,MAAM,QAAQ;CAE3C,OAAO,EACL,cAAc;EACZ,YAAY,oBAAoB,MAAM,QAAQ;CAChD,EACF;AACF;AAEA,SAAgB,cAAc,aAA0B,SAIrD;CACD,MAAM,MAAMA,gBAAkB;CAE9B,MAAM,EACJ,mBAAmB,WACnB,iBAAiB,SACjB,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,SAAS,0BAA0B,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,IAAI;GAAG,GAAG;EAAM,CAAC;EAEpG,MAAM,cAAc,IAAI,YAAY,oBAAA,SAAsC;GACxE;GACA,SAAS;GACT,YAAY;EACd,CAAC;EAED,YAAY,cAAc,WAAW;CACvC,CAAC;CAED,IAAI,kBACF,eAAe,KAAK,YAAY,aAAa,mBAAmB,UAAU;EACxE,IAAI;GACF,MAAM,EAAE,MAAM,YAAY,uBAAqC,MAAsB,MAAM;GAC3F,IAAI,KAAK,oBAAoB,IAAI,GAAG,QAAQ,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;EACtE,SACO,OAAO;GACZ,QAAQ,MAAM,wCAAwC,KAAK;GAC3D,IAAI,KAAK,mBAAmB;IAAE,MAAM;IAAS,OAAO,QAAQ,OAAO,yCAAyC;GAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;EACrI;CACF,CAAC,CAAC;CAGJ,IAAI,gBACF,eAAe,KAAK,YAAY,aAAa,iBAAiB,UAAU;EACtE,IAAI,KAAK,mBAAmB;GAAE,MAAM;GAAS,OAAO,QAAQ,OAAO,2BAA2B;EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACvH,CAAC,CAAC;CAGJ,KAAK,MAAM,CAAC,WAAW,aAAa,OAAO,QAAQ,cAAc,GAC/D,eAAe,KAAK,YAAY,aAAa,WAAW,QAAQ,CAAC;CAGnE,OAAO;EACL,SAAS;EACT,UAAU,WAAqB;GAC7B,IAAI,MAAM,0BAAU,IAAI,MAAM,wDAAwD,CAAC;GACvF,eAAe,SAAQ,YAAW,QAAQ,OAAO,CAAC;EACpD;CACF;AACF"}