{"version":3,"file":"factories.cjs","names":["PostHogSubscriber","MixpanelSubscriber","AmplitudeSubscriber","SegmentSubscriber","WebhookSubscriber","SlackSubscriber"],"sources":["../src/mock-event-subscriber.ts","../src/factories.ts"],"sourcesContent":["/**\n * Mock Events Subscriber for Testing\n *\n * In-memory subscriber that captures all events events for testing assertions.\n * Useful for unit testing code that uses Events without making real API calls.\n *\n * @example Basic testing\n * ```typescript\n * import { Events } from 'autotel/events';\n * import { MockEventSubscriber } from 'autotel-subscribers/mock-event-subscriber';\n * import { describe, it, expect, beforeEach } from 'vitest';\n *\n * describe('CheckoutService', () => {\n *   let mockSubscriber: MockEventSubscriber;\n *   let events: Events;\n *\n *   beforeEach(() => {\n *     mockSubscriber = new MockEventSubscriber();\n *     events = new Events('checkout', { subscribers: [mockSubscriber] });\n *   });\n *\n *   it('should track order completion', async () => {\n *     const service = new CheckoutService(events);\n *     await service.completeOrder('ord_123', 99.99);\n *\n *     expect(mockSubscriber.events).toHaveLength(1);\n *     expect(mockSubscriber.events[0]).toMatchObject({\n *       type: 'event',\n *       name: 'order.completed',\n *       attributes: { orderId: 'ord_123', amount: 99.99 }\n *     });\n *   });\n *\n *   it('should track checkout funnel', () => {\n *     events.trackFunnelStep('checkout', 'started', { cartValue: 99.99 });\n *     events.trackFunnelStep('checkout', 'completed', { cartValue: 99.99 });\n *\n *     const funnelEvents = mockSubscriber.getFunnelEvents('checkout');\n *     expect(funnelEvents).toHaveLength(2);\n *     expect(funnelEvents[0].step).toBe('started');\n *     expect(funnelEvents[1].step).toBe('completed');\n *   });\n * });\n * ```\n *\n * @example With Outbox Pattern\n * ```typescript\n * import { createPublisher } from 'autotel-outbox';\n * import { MockOutboxStorage } from 'autotel-outbox/testing';\n *\n * it('should broadcast events to all subscribers', async () => {\n *   const mockOutbox = new MockOutboxStorage();\n *   const mockSubscriber = new MockEventSubscriber();\n *\n *   // Add events to outbox\n *   await mockOutbox.writeEvent({\n *     id: '1',\n *     type: 'order.completed',\n *     aggregateId: 'ord_123',\n *     aggregateType: 'Order',\n *     payload: { amount: 99.99 },\n *     createdAt: new Date().toISOString(),\n *     publishedAt: null\n *   });\n *\n *   // Run publisher\n *   const publisher = createPublisher(mockOutbox, [mockSubscriber]);\n *   await publisher();\n *\n *   // Assert event was broadcast\n *   expect(mockSubscriber.events).toHaveLength(1);\n *   expect(mockSubscriber.events[0].name).toBe('order.completed');\n * });\n * ```\n */\n\nimport type {\n  EventSubscriber,\n  EventAttributes,\n  FunnelStatus,\n  OutcomeStatus,\n} from 'autotel/event-subscriber';\n\n/**\n * Captured event data\n */\nexport interface CapturedEvent {\n  type: 'event' | 'funnel' | 'outcome' | 'value';\n  name: string;\n  attributes?: EventAttributes;\n  funnel?: string;\n  step?: FunnelStatus;\n  operation?: string;\n  outcome?: OutcomeStatus;\n  value?: number;\n  timestamp: string;\n}\n\n/**\n * Mock subscriber for testing\n *\n * Captures all events calls in memory for test assertions.\n * Does not make any real API calls.\n */\nexport class MockEventSubscriber implements EventSubscriber {\n  readonly name = 'MockEventSubscriber';\n  readonly version = '1.0.0';\n\n  /**\n   * All captured events\n   */\n  public events: CapturedEvent[] = [];\n\n  /**\n   * Track if shutdown was called\n   */\n  public shutdownCalled = false;\n\n  async trackEvent(name: string, attributes?: EventAttributes): Promise<void> {\n    this.events.push({\n      type: 'event',\n      name,\n      attributes,\n      timestamp: new Date().toISOString(),\n    });\n  }\n\n  async trackFunnelStep(\n    funnelName: string,\n    step: FunnelStatus,\n    attributes?: EventAttributes,\n  ): Promise<void> {\n    this.events.push({\n      type: 'funnel',\n      name: `${funnelName}.${step}`,\n      funnel: funnelName,\n      step,\n      attributes,\n      timestamp: new Date().toISOString(),\n    });\n  }\n\n  async trackOutcome(\n    operationName: string,\n    outcome: OutcomeStatus,\n    attributes?: EventAttributes,\n  ): Promise<void> {\n    this.events.push({\n      type: 'outcome',\n      name: `${operationName}.${outcome}`,\n      operation: operationName,\n      outcome,\n      attributes,\n      timestamp: new Date().toISOString(),\n    });\n  }\n\n  async trackValue(\n    name: string,\n    value: number,\n    attributes?: EventAttributes,\n  ): Promise<void> {\n    this.events.push({\n      type: 'value',\n      name,\n      value,\n      attributes,\n      timestamp: new Date().toISOString(),\n    });\n  }\n\n  async shutdown(): Promise<void> {\n    this.shutdownCalled = true;\n  }\n\n  /**\n   * Reset captured events (useful between tests)\n   */\n  reset(): void {\n    this.events = [];\n    this.shutdownCalled = false;\n  }\n\n  /**\n   * Get events by type\n   */\n  getEventsByType(\n    type: 'event' | 'funnel' | 'outcome' | 'value',\n  ): CapturedEvent[] {\n    return this.events.filter((e) => e.type === type);\n  }\n\n  /**\n   * Get events by name\n   */\n  getEventsByName(name: string): CapturedEvent[] {\n    return this.events.filter((e) => e.name === name);\n  }\n\n  /**\n   * Get funnel events for a specific funnel\n   */\n  getFunnelEvents(funnelName: string): CapturedEvent[] {\n    return this.events.filter(\n      (e) => e.type === 'funnel' && e.funnel === funnelName,\n    );\n  }\n\n  /**\n   * Get outcome events for a specific operation\n   */\n  getOutcomeEvents(operationName: string): CapturedEvent[] {\n    return this.events.filter(\n      (e) => e.type === 'outcome' && e.operation === operationName,\n    );\n  }\n\n  /**\n   * Get value events by metric name\n   */\n  getValueEvents(metricName: string): CapturedEvent[] {\n    return this.events.filter(\n      (e) => e.type === 'value' && e.name === metricName,\n    );\n  }\n\n  /**\n   * Assert that an event was tracked\n   */\n  assertEventTracked(\n    name: string,\n    attributes?: Partial<EventAttributes>,\n  ): void {\n    const events = this.getEventsByName(name);\n\n    if (events.length === 0) {\n      throw new Error(`No events found with name: ${name}`);\n    }\n\n    if (attributes) {\n      const matchingEvent = events.find((event) => {\n        if (!event.attributes) return false;\n\n        return Object.entries(attributes).every(\n          ([key, value]) => event.attributes![key] === value,\n        );\n      });\n\n      if (!matchingEvent) {\n        throw new Error(\n          `Event \"${name}\" found, but no matching attributes: ${JSON.stringify(attributes)}`,\n        );\n      }\n    }\n  }\n\n  /**\n   * Assert that a funnel step was tracked\n   */\n  assertFunnelStepTracked(\n    funnelName: string,\n    step: FunnelStatus,\n    attributes?: Partial<EventAttributes>,\n  ): void {\n    const events = this.getFunnelEvents(funnelName);\n    const matchingEvent = events.find((e) => e.step === step);\n\n    if (!matchingEvent) {\n      throw new Error(\n        `Funnel \"${funnelName}\" step \"${step}\" was not tracked`,\n      );\n    }\n\n    if (attributes) {\n      const hasMatchingAttributes = Object.entries(attributes).every(\n        ([key, value]) => matchingEvent.attributes?.[key] === value,\n      );\n\n      if (!hasMatchingAttributes) {\n        throw new Error(\n          `Funnel step tracked, but attributes don't match: ${JSON.stringify(attributes)}`,\n        );\n      }\n    }\n  }\n\n  /**\n   * Assert that an outcome was tracked\n   */\n  assertOutcomeTracked(\n    operationName: string,\n    outcome: OutcomeStatus,\n    attributes?: Partial<EventAttributes>,\n  ): void {\n    const events = this.getOutcomeEvents(operationName);\n    const matchingEvent = events.find((e) => e.outcome === outcome);\n\n    if (!matchingEvent) {\n      throw new Error(\n        `Outcome \"${operationName}.${outcome}\" was not tracked`,\n      );\n    }\n\n    if (attributes) {\n      const hasMatchingAttributes = Object.entries(attributes).every(\n        ([key, value]) => matchingEvent.attributes?.[key] === value,\n      );\n\n      if (!hasMatchingAttributes) {\n        throw new Error(\n          `Outcome tracked, but attributes don't match: ${JSON.stringify(attributes)}`,\n        );\n      }\n    }\n  }\n\n  /**\n   * Pretty print all captured events (useful for debugging)\n   */\n  printEvents(): void {\n    console.log(`\\n[${this.name}] Captured ${this.events.length} events:\\n`);\n    for (const [index, event] of this.events.entries()) {\n      console.log(`${index + 1}. [${event.type}] ${event.name}`);\n      if (event.attributes) {\n        console.log(`   Attributes:`, event.attributes);\n      }\n      if (event.value !== undefined) {\n        console.log(`   Value: ${event.value}`);\n      }\n      console.log(`   Timestamp: ${event.timestamp}\\n`);\n    }\n  }\n}\n","/**\n * Factory functions for creating events subscribers\n *\n * Function-based alternatives to `new SubscriberClass()` pattern.\n * Provides a consistent API and better tree-shaking.\n *\n * @example\n * ```typescript\n * import { createPostHogSubscriber, createWebhookSubscriber } from 'autotel-subscribers/factories'\n *\n * const events = new Events('my-service', {\n *   subscribers: [\n *     createPostHogSubscriber({ apiKey: 'phc_...' }),\n *     createWebhookSubscriber({ url: 'https://...' })\n *   ]\n * })\n * ```\n */\n\nimport { PostHogSubscriber } from './posthog';\nimport { MixpanelSubscriber } from './mixpanel';\nimport { AmplitudeSubscriber } from './amplitude';\nimport { SegmentSubscriber } from './segment';\nimport { WebhookSubscriber } from './webhook';\nimport { SlackSubscriber } from './slack';\nimport { MockEventSubscriber } from './mock-event-subscriber';\n\nimport type {\n  EventSubscriber,\n  EventAttributes,\n  OutcomeStatus,\n  FunnelStatus,\n  EventTrackingOptions,\n} from 'autotel/event-subscriber';\n\nexport type { PostHogConfig } from './posthog';\nexport type { MixpanelConfig } from './mixpanel';\nexport type { AmplitudeConfig } from './amplitude';\nexport type { SegmentConfig } from './segment';\nexport type { WebhookConfig } from './webhook';\nexport type { SlackSubscriberConfig } from './slack';\n\n/** Create a PostHog events subscriber */\nexport function createPostHogSubscriber(config: {\n  apiKey: string;\n  host?: string;\n  enabled?: boolean;\n}): EventSubscriber {\n  return new PostHogSubscriber(config);\n}\n\n/** Create a Mixpanel events subscriber */\nexport function createMixpanelSubscriber(config: {\n  token: string;\n  enabled?: boolean;\n}): EventSubscriber {\n  return new MixpanelSubscriber(config);\n}\n\n/** Create an Amplitude events subscriber */\nexport function createAmplitudeSubscriber(config: {\n  apiKey: string;\n  enabled?: boolean;\n}): EventSubscriber {\n  return new AmplitudeSubscriber(config);\n}\n\n/** Create a Segment events subscriber */\nexport function createSegmentSubscriber(config: {\n  writeKey: string;\n  enabled?: boolean;\n}): EventSubscriber {\n  return new SegmentSubscriber(config);\n}\n\n/** Create a Webhook events subscriber with retry and timeout support */\nexport function createWebhookSubscriber(config: {\n  url: string;\n  method?: 'POST' | 'PUT';\n  headers?: Record<string, string>;\n  enabled?: boolean;\n  maxRetries?: number;\n  timeoutMs?: number;\n  retryDelayMs?: number;\n}): EventSubscriber {\n  return new WebhookSubscriber(config);\n}\n\n/** Create a Slack events subscriber */\nexport function createSlackSubscriber(config: {\n  webhookUrl: string;\n  channel?: string;\n  enabled?: boolean;\n}): EventSubscriber {\n  return new SlackSubscriber(config);\n}\n\n/** Create a mock events subscriber for testing */\nexport function createMockSubscriber(): MockEventSubscriber {\n  return new MockEventSubscriber();\n}\n\n/**\n * Strategy for composing multiple subscribers\n *\n * - `parallel`: Send to all subscribers concurrently, fail if any fails\n * - `failover`: Try subscribers in order until one succeeds\n * - `round-robin`: Cycle through subscribers sequentially\n * - `random`: Pick a random subscriber each time\n * - `race`: Send to all, succeed when any succeeds\n * - `mirrored`: Send to primary, mirror to others (primary failure fails all)\n */\nexport type ComposeSubscriberStrategy =\n  | 'parallel'\n  | 'failover'\n  | 'round-robin'\n  | 'random'\n  | 'race'\n  | 'mirrored';\n\n/** Configuration options for composing multiple subscribers */\nexport type ComposeSubscribersOptions = {\n  name?: string;\n  strategy?: ComposeSubscriberStrategy;\n  maxAttemptsPerSubscriber?: number;\n  initialRetryDelayMs?: number;\n  maxRetryDelayMs?: number;\n  isRetriable?: (error: unknown) => boolean;\n  logger?: Pick<Console, 'debug' | 'warn' | 'error'>;\n};\n\ntype SubscriberMethod =\n  | 'trackEvent'\n  | 'trackFunnelStep'\n  | 'trackOutcome'\n  | 'trackValue';\n\ntype MethodCall = {\n  method: SubscriberMethod;\n  args: unknown[];\n};\n\nfunction backoffDelay(attempt: number, initialMs: number, maxMs: number): number {\n  return Math.min(maxMs, initialMs * 2 ** (attempt - 1));\n}\n\nasync function callSubscriber(subscriber: EventSubscriber, call: MethodCall): Promise<void> {\n  switch (call.method) {\n    case 'trackEvent': {\n      await subscriber.trackEvent(\n        call.args[0] as string,\n        call.args[1] as EventAttributes | undefined,\n        call.args[2] as EventTrackingOptions | undefined,\n      );\n      return;\n    }\n    case 'trackFunnelStep': {\n      await subscriber.trackFunnelStep(\n        call.args[0] as string,\n        call.args[1] as FunnelStatus,\n        call.args[2] as EventAttributes | undefined,\n        call.args[3] as EventTrackingOptions | undefined,\n      );\n      return;\n    }\n    case 'trackOutcome': {\n      await subscriber.trackOutcome(\n        call.args[0] as string,\n        call.args[1] as OutcomeStatus,\n        call.args[2] as EventAttributes | undefined,\n        call.args[3] as EventTrackingOptions | undefined,\n      );\n      return;\n    }\n    case 'trackValue': {\n      await subscriber.trackValue(\n        call.args[0] as string,\n        call.args[1] as number,\n        call.args[2] as EventAttributes | undefined,\n        call.args[3] as EventTrackingOptions | undefined,\n      );\n    }\n  }\n}\n\n/**\n * Compose multiple subscribers into one with a specified strategy\n *\n * @example\n * ```typescript\n * const multiSubscriber = composeSubscribers(\n *   [\n *     createPostHogSubscriber({ apiKey: '...' }),\n *     createWebhookSubscriber({ url: '...' })\n *   ],\n *   { strategy: 'parallel' }\n * )\n * ```\n *\n * @param subscribers - Array of subscribers to compose\n * @param options - Configuration for composition strategy and retry behavior\n * @returns A composite EventSubscriber that applies the strategy\n */\nexport function composeSubscribers(\n  subscribers: EventSubscriber[],\n  options: ComposeSubscribersOptions = {},\n): EventSubscriber {\n  const strategy = options.strategy ?? 'parallel';\n  const name = options.name ?? `ComposedSubscriber(${strategy})`;\n  const maxAttempts = options.maxAttemptsPerSubscriber ?? 1;\n  const initialRetryDelayMs = options.initialRetryDelayMs ?? 250;\n  const maxRetryDelayMs = options.maxRetryDelayMs ?? 10_000;\n  const isRetriable = options.isRetriable ?? (() => true);\n  const logger = options.logger ?? console;\n  let rrCounter = 0;\n\n  const sendOne = async (subscriber: EventSubscriber, call: MethodCall): Promise<void> => {\n    let lastError: unknown;\n\n    for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n      try {\n        await callSubscriber(subscriber, call);\n        return;\n      } catch (error) {\n        lastError = error;\n        const retryable = isRetriable(error);\n        logger.warn?.('composeSubscribers attempt failed', {\n          subscriber: subscriber.name,\n          attempt,\n          retryable,\n          strategy,\n          error,\n        });\n\n        if (!retryable || attempt >= maxAttempts) break;\n        await new Promise((resolve) =>\n          setTimeout(resolve, backoffDelay(attempt, initialRetryDelayMs, maxRetryDelayMs)),\n        );\n      }\n    }\n\n    throw (lastError instanceof Error ? lastError : new Error(String(lastError)));\n  };\n\n  const orderForSequential = (): number[] => {\n    const n = subscribers.length;\n    if (n === 0) return [];\n\n    if (strategy === 'failover') {\n      return Array.from({ length: n }, (_, i) => i);\n    }\n\n    const start =\n      strategy === 'random' ? Math.floor(Math.random() * n) : rrCounter++ % n;\n\n    return Array.from({ length: n }, (_, i) => (start + i) % n);\n  };\n\n  const execute = async (call: MethodCall): Promise<void> => {\n    if (subscribers.length === 0) return;\n\n    if (strategy === 'parallel') {\n      await Promise.all(subscribers.map((subscriber) => sendOne(subscriber, call)));\n      return;\n    }\n\n    if (strategy === 'race') {\n      const attempts = subscribers.map(async (subscriber) => {\n        await sendOne(subscriber, call);\n        return subscriber.name ?? 'unknown';\n      });\n\n      try {\n        await Promise.any(attempts);\n      } catch (error) {\n        if (error instanceof AggregateError && error.errors.length > 0) {\n          throw error.errors.at(-1);\n        }\n        throw error;\n      }\n      return;\n    }\n\n    if (strategy === 'mirrored') {\n      const primary = subscribers[0];\n      if (!primary) return;\n      await sendOne(primary, call);\n\n      for (const mirror of subscribers.slice(1)) {\n        void sendOne(mirror, call).catch((error) => {\n          logger.warn?.('composeSubscribers mirror failed', {\n            subscriber: mirror.name,\n            error,\n          });\n        });\n      }\n      return;\n    }\n\n    const order = orderForSequential();\n    let lastError: unknown;\n\n    for (const index of order) {\n      const subscriber = subscribers[index];\n      if (!subscriber) continue;\n\n      try {\n        await sendOne(subscriber, call);\n        return;\n      } catch (error) {\n        lastError = error;\n      }\n    }\n\n    throw (lastError instanceof Error ? lastError : new Error(String(lastError)));\n  };\n\n  return {\n    name,\n    async trackEvent(name_, attributes, options_) {\n      await execute({ method: 'trackEvent', args: [name_, attributes, options_] });\n    },\n    async trackFunnelStep(funnel, step, attributes, options_) {\n      await execute({\n        method: 'trackFunnelStep',\n        args: [funnel, step, attributes, options_],\n      });\n    },\n    async trackOutcome(operation, outcome, attributes, options_) {\n      await execute({\n        method: 'trackOutcome',\n        args: [operation, outcome, attributes, options_],\n      });\n    },\n    async trackValue(name_, value, attributes, options_) {\n      await execute({ method: 'trackValue', args: [name_, value, attributes, options_] });\n    },\n    async shutdown() {\n      await Promise.all(subscribers.map(async (subscriber) => subscriber.shutdown?.()));\n    },\n  };\n}\n"],"mappings":"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"}