{"version":3,"file":"index.mjs","names":["createBaseContext"],"sources":["../../../src/adapters/broadcast-channel/internal.ts","../../../src/adapters/broadcast-channel/shared.ts","../../../src/adapters/broadcast-channel/index.ts"],"sourcesContent":["import type { EventTag } from '../..'\nimport type { Payload } from './shared'\n\nimport { nanoid } from '../..'\n\nexport function generatePayload<T>(type: EventTag<any, any>, payload: T): Payload<T> {\n  return {\n    id: nanoid(),\n    type,\n    payload,\n  }\n}\n\nexport function parsePayload<T>(data: unknown): Payload<T> {\n  return data as Payload<T>\n}\n","import type { EventTag } from '../../eventa'\n\nimport { defineEventa } from '../../eventa'\n\nexport interface Payload<T> {\n  id: string\n  type: EventTag<any, any>\n  payload: T\n}\n\nexport const errorEvent = { ...defineEventa<{ error: unknown }>() }\n","import 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\nfunction withRemoval<K extends keyof BroadcastChannelEventMap>(channel: BroadcastChannel, type: K, listener: (event: BroadcastChannelEventMap[K]) => void) {\n  channel.addEventListener(type, listener)\n\n  return {\n    remove: () => {\n      channel.removeEventListener(type, listener)\n    },\n  }\n}\n\nexport interface BroadcastChannelAdapterOptions {\n  /**\n   * Whether to listen to `message` events.\n   * @default true\n   */\n  messageEvents?: boolean\n  /**\n   * Whether to listen to `messageerror` events.\n   * @default true\n   */\n  messageErrorEvents?: boolean\n  /**\n   * Whether to close the BroadcastChannel when disposing the context.\n   * @default false\n   */\n  closeOnDispose?: boolean\n}\n\nexport function createContext(channel: BroadcastChannel, options?: BroadcastChannelAdapterOptions) {\n  const ctx = createBaseContext() as EventContext<any, { raw: { message?: MessageEvent, messageError?: MessageEvent, error?: unknown } }>\n\n  const {\n    messageEvents: message = true,\n    messageErrorEvents: messageError = true,\n    closeOnDispose = false,\n  } = options || {}\n\n  const cleanupRemoval: Array<{ remove: () => void }> = []\n\n  ctx.on(and(matchBy((e: DirectionalEventa<any>) => e._flowDirection === EventaFlowDirection.Outbound || !e._flowDirection), matchBy('*')), (event) => {\n    const message = generatePayload(event.id, { ...defineOutboundEventa(event.type), ...event })\n    channel.postMessage(message)\n  })\n\n  if (message) {\n    cleanupRemoval.push(withRemoval(channel, 'message', (event) => {\n      try {\n        const { type, payload } = parsePayload<Eventa<any>>(event.data)\n        ctx.emit(defineInboundEventa(type), payload.body, { raw: { message: event } })\n      }\n      catch (error) {\n        console.error('Failed to parse BroadcastChannel message:', error)\n        ctx.emit(errorEvent, { error }, { raw: { error } })\n      }\n    }))\n  }\n\n  if (messageError) {\n    cleanupRemoval.push(withRemoval(channel, 'messageerror', (event) => {\n      ctx.emit(errorEvent, { error: event }, { raw: { messageError: event } })\n    }))\n  }\n\n  return {\n    context: ctx,\n    dispose: (reason?: unknown) => {\n      // Cascade-cancel any in-flight `defineInvoke(...)` so callers don't hang\n      // on a torn-down channel (especially when `closeOnDispose: true`).\n      ctx.abort(reason ?? new Error('eventa: invoke cancelled, BroadcastChannel disposed'))\n      cleanupRemoval.forEach(removal => removal.remove())\n      if (closeOnDispose) {\n        channel.close?.()\n      }\n    },\n  }\n}\n\nexport type * from './shared'\n"],"mappings":";;;AAKA,SAAgB,gBAAmB,MAA0B,SAAwB;CACnF,OAAO;EACL,IAAI,OAAO;EACX;EACA;CACF;AACF;AAEA,SAAgB,aAAgB,MAA2B;CACzD,OAAO;AACT;;;ACLA,MAAa,aAAa,EAAE,GAAG,aAAiC,EAAE;;;ACFlE,SAAS,YAAsD,SAA2B,MAAS,UAAwD;CACzJ,QAAQ,iBAAiB,MAAM,QAAQ;CAEvC,OAAO,EACL,cAAc;EACZ,QAAQ,oBAAoB,MAAM,QAAQ;CAC5C,EACF;AACF;AAoBA,SAAgB,cAAc,SAA2B,SAA0C;CACjG,MAAM,MAAMA,gBAAkB;CAE9B,MAAM,EACJ,eAAe,UAAU,MACzB,oBAAoB,eAAe,MACnC,iBAAiB,UACf,WAAW,CAAC;CAEhB,MAAM,iBAAgD,CAAC;CAEvD,IAAI,GAAG,IAAI,SAAS,MAA8B,EAAE,mBAAA,cAAmD,CAAC,EAAE,cAAc,GAAG,QAAQ,GAAG,CAAC,IAAI,UAAU;EACnJ,MAAM,UAAU,gBAAgB,MAAM,IAAI;GAAE,GAAG,qBAAqB,MAAM,IAAI;GAAG,GAAG;EAAM,CAAC;EAC3F,QAAQ,YAAY,OAAO;CAC7B,CAAC;CAED,IAAI,SACF,eAAe,KAAK,YAAY,SAAS,YAAY,UAAU;EAC7D,IAAI;GACF,MAAM,EAAE,MAAM,YAAY,aAA0B,MAAM,IAAI;GAC9D,IAAI,KAAK,oBAAoB,IAAI,GAAG,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;EAC/E,SACO,OAAO;GACZ,QAAQ,MAAM,6CAA6C,KAAK;GAChE,IAAI,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;EACpD;CACF,CAAC,CAAC;CAGJ,IAAI,cACF,eAAe,KAAK,YAAY,SAAS,iBAAiB,UAAU;EAClE,IAAI,KAAK,YAAY,EAAE,OAAO,MAAM,GAAG,EAAE,KAAK,EAAE,cAAc,MAAM,EAAE,CAAC;CACzE,CAAC,CAAC;CAGJ,OAAO;EACL,SAAS;EACT,UAAU,WAAqB;GAG7B,IAAI,MAAM,0BAAU,IAAI,MAAM,qDAAqD,CAAC;GACpF,eAAe,SAAQ,YAAW,QAAQ,OAAO,CAAC;GAClD,IAAI,gBACF,QAAQ,QAAQ;EAEpB;CACF;AACF"}