{"version":3,"file":"webhook.cjs","names":["createHttpClient","postJsonWithRetry"],"sources":["../src/webhook.ts"],"sourcesContent":["/**\n * Webhook Subscriber for autotel\n */\n\nimport type {\n  EventSubscriber,\n  EventAttributes,\n  EventTrackingOptions,\n  FunnelStatus,\n  OutcomeStatus,\n} from 'autotel/event-subscriber';\nimport { createHttpClient } from './http-client';\nimport { postJsonWithRetry } from './webhook-delivery';\n\nexport interface WebhookConfig {\n  url: string;\n  headers?: Record<string, string>;\n  enabled?: boolean;\n  maxRetries?: number;\n  method?: 'POST' | 'PUT';\n  timeoutMs?: number;\n  retryDelayMs?: number;\n}\n\nexport class WebhookSubscriber implements EventSubscriber {\n  readonly name = 'WebhookSubscriber';\n  readonly version = '1.1.0';\n\n  private readonly config: WebhookConfig;\n  private enabled: boolean;\n  private readonly pendingRequests: Set<Promise<void>> = new Set();\n  private readonly httpClient;\n\n  constructor(config: WebhookConfig) {\n    this.config = config;\n    this.enabled = config.enabled ?? true;\n    this.httpClient = createHttpClient({ timeoutMs: config.timeoutMs });\n  }\n\n  private async send(payload: unknown): Promise<void> {\n    if (!this.enabled) return;\n\n    await postJsonWithRetry(this.httpClient, this.config.url, payload, {\n      method: this.config.method,\n      headers: this.config.headers,\n      maxRetries: this.config.maxRetries,\n      retryDelayMs: this.config.retryDelayMs,\n      label: 'Webhook',\n    });\n  }\n\n  async trackEvent(\n    name: string,\n    attributes?: EventAttributes,\n    options?: EventTrackingOptions,\n  ): Promise<void> {\n    const request = this.send({\n      type: 'event',\n      name,\n      attributes,\n      timestamp: new Date().toISOString(),\n      autotel: options?.autotel,\n    });\n    this.trackRequest(request);\n    await request;\n  }\n\n  async trackFunnelStep(\n    funnelName: string,\n    step: FunnelStatus,\n    attributes?: EventAttributes,\n    options?: EventTrackingOptions,\n  ): Promise<void> {\n    const request = this.send({\n      type: 'funnel',\n      funnel: funnelName,\n      step,\n      attributes,\n      timestamp: new Date().toISOString(),\n      autotel: options?.autotel,\n    });\n    this.trackRequest(request);\n    await request;\n  }\n\n  async trackOutcome(\n    operationName: string,\n    outcome: OutcomeStatus,\n    attributes?: EventAttributes,\n    options?: EventTrackingOptions,\n  ): Promise<void> {\n    const request = this.send({\n      type: 'outcome',\n      operation: operationName,\n      outcome,\n      attributes,\n      timestamp: new Date().toISOString(),\n      autotel: options?.autotel,\n    });\n    this.trackRequest(request);\n    await request;\n  }\n\n  async trackValue(\n    name: string,\n    value: number,\n    attributes?: EventAttributes,\n    options?: EventTrackingOptions,\n  ): Promise<void> {\n    const request = this.send({\n      type: 'value',\n      name,\n      value,\n      attributes,\n      timestamp: new Date().toISOString(),\n      autotel: options?.autotel,\n    });\n    this.trackRequest(request);\n    await request;\n  }\n\n  private trackRequest(request: Promise<void>): void {\n    this.pendingRequests.add(request);\n    void request.catch(() => {}).finally(() => {\n      this.pendingRequests.delete(request);\n    });\n  }\n\n  async shutdown(): Promise<void> {\n    if (this.pendingRequests.size > 0) {\n      await Promise.allSettled(this.pendingRequests);\n    }\n  }\n}\n"],"mappings":";;;;;AAwBA,IAAa,oBAAb,MAA0D;CACxD,AAAS,OAAO;CAChB,AAAS,UAAU;CAEnB,AAAiB;CACjB,AAAQ;CACR,AAAiB,kCAAsC,IAAI,IAAI;CAC/D,AAAiB;CAEjB,YAAY,QAAuB;EACjC,KAAK,SAAS;EACd,KAAK,UAAU,OAAO,WAAW;EACjC,KAAK,aAAaA,0CAAiB,EAAE,WAAW,OAAO,UAAU,CAAC;CACpE;CAEA,MAAc,KAAK,SAAiC;EAClD,IAAI,CAAC,KAAK,SAAS;EAEnB,MAAMC,2CAAkB,KAAK,YAAY,KAAK,OAAO,KAAK,SAAS;GACjE,QAAQ,KAAK,OAAO;GACpB,SAAS,KAAK,OAAO;GACrB,YAAY,KAAK,OAAO;GACxB,cAAc,KAAK,OAAO;GAC1B,OAAO;EACT,CAAC;CACH;CAEA,MAAM,WACJ,MACA,YACA,SACe;EACf,MAAM,UAAU,KAAK,KAAK;GACxB,MAAM;GACN;GACA;GACA,4BAAW,IAAI,KAAK,EAAC,CAAC,YAAY;GAClC,SAAS,SAAS;EACpB,CAAC;EACD,KAAK,aAAa,OAAO;EACzB,MAAM;CACR;CAEA,MAAM,gBACJ,YACA,MACA,YACA,SACe;EACf,MAAM,UAAU,KAAK,KAAK;GACxB,MAAM;GACN,QAAQ;GACR;GACA;GACA,4BAAW,IAAI,KAAK,EAAC,CAAC,YAAY;GAClC,SAAS,SAAS;EACpB,CAAC;EACD,KAAK,aAAa,OAAO;EACzB,MAAM;CACR;CAEA,MAAM,aACJ,eACA,SACA,YACA,SACe;EACf,MAAM,UAAU,KAAK,KAAK;GACxB,MAAM;GACN,WAAW;GACX;GACA;GACA,4BAAW,IAAI,KAAK,EAAC,CAAC,YAAY;GAClC,SAAS,SAAS;EACpB,CAAC;EACD,KAAK,aAAa,OAAO;EACzB,MAAM;CACR;CAEA,MAAM,WACJ,MACA,OACA,YACA,SACe;EACf,MAAM,UAAU,KAAK,KAAK;GACxB,MAAM;GACN;GACA;GACA;GACA,4BAAW,IAAI,KAAK,EAAC,CAAC,YAAY;GAClC,SAAS,SAAS;EACpB,CAAC;EACD,KAAK,aAAa,OAAO;EACzB,MAAM;CACR;CAEA,AAAQ,aAAa,SAA8B;EACjD,KAAK,gBAAgB,IAAI,OAAO;EAChC,AAAK,QAAQ,YAAY,CAAC,CAAC,CAAC,CAAC,cAAc;GACzC,KAAK,gBAAgB,OAAO,OAAO;EACrC,CAAC;CACH;CAEA,MAAM,WAA0B;EAC9B,IAAI,KAAK,gBAAgB,OAAO,GAC9B,MAAM,QAAQ,WAAW,KAAK,eAAe;CAEjD;AACF"}