{"version":3,"sources":["../src/providers/wati/mapper.ts","../src/providers/wati/webhook-parser.ts","../src/providers/wati/index.ts"],"names":["normalizePhoneNumber","UnsupportedFeatureError","isRecord","ValidationError","noopLogger","HttpClient","RateLimiter","ProviderError","response","verifyHmacSha256"],"mappings":"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","file":"chunk-VLYB3RTY.cjs","sourcesContent":["// ---------------------------------------------------------------------------\n// Wati mapper — unified types → Wati REST API structure\n//\n// Wati has a completely different API surface:\n// - Different endpoint per message type\n// - Phone number in URL path or query param (not in body)\n// - Template parameters use a flat array structure\n// ---------------------------------------------------------------------------\n\nimport type { OutboundMessage, TemplateComponent } from '../../types/messages.js'\nimport type { MediaSource } from '../../types/common.js'\nimport { normalizePhoneNumber } from '../../utils/phone.js'\nimport { UnsupportedFeatureError } from '../../core/errors.js'\n\n/** The result of mapping: which endpoint to call and what body to send */\nexport interface WatiMappedRequest {\n  /** HTTP method */\n  method: 'POST'\n  /** Relative path (including phone number) */\n  path: string\n  /** Query parameters */\n  query?: Record<string, string>\n  /** JSON body */\n  body?: Record<string, unknown>\n  /** If true, use multipart/form-data instead of JSON */\n  multipart?: boolean\n}\n\n/**\n * Map a unified OutboundMessage to a Wati REST API request.\n *\n * Key differences from Cloud API:\n * - Each message type has its own endpoint\n * - Phone number goes in URL, not body\n * - Templates have flat parameter arrays\n */\nexport function mapOutboundToWati(message: OutboundMessage): WatiMappedRequest {\n  const phone = normalizePhoneNumber(message.to)\n\n  switch (message.type) {\n    case 'text':\n      return {\n        method: 'POST',\n        path: `/api/v1/sendSessionMessage/${phone}`,\n        body: {\n          messageText: message.text.body,\n        },\n      }\n\n    case 'template':\n      return {\n        method: 'POST',\n        path: '/api/v2/sendTemplateMessage',\n        query: { whatsappNumber: phone },\n        body: {\n          template_name: message.template.name,\n          broadcast_name: `waflow_${Date.now()}`,\n          parameters: flattenTemplateParameters(message.template.components),\n        },\n      }\n\n    case 'image': {\n      const imageUrl = extractWatiMediaUrl(message.image, 'image')\n      return {\n        method: 'POST',\n        path: `/api/v1/sendSessionFile/${phone}`,\n        body: {\n          url: imageUrl,\n          caption: message.image.caption ?? '',\n        },\n      }\n    }\n\n    case 'video': {\n      const videoUrl = extractWatiMediaUrl(message.video, 'video')\n      return {\n        method: 'POST',\n        path: `/api/v1/sendSessionFile/${phone}`,\n        body: {\n          url: videoUrl,\n          caption: message.video.caption ?? '',\n        },\n      }\n    }\n\n    case 'audio': {\n      const audioUrl = extractWatiMediaUrl(message.audio, 'audio')\n      return {\n        method: 'POST',\n        path: `/api/v1/sendSessionFile/${phone}`,\n        body: {\n          url: audioUrl,\n        },\n      }\n    }\n\n    case 'document': {\n      const docUrl = extractWatiMediaUrl(message.document, 'document')\n      return {\n        method: 'POST',\n        path: `/api/v1/sendSessionFile/${phone}`,\n        body: {\n          url: docUrl,\n          caption: message.document.caption ?? '',\n          filename: message.document.filename ?? '',\n        },\n      }\n    }\n\n    // Wati does not support these — throw immediately\n    case 'sticker':\n    case 'location':\n    case 'contacts':\n    case 'reaction':\n    case 'interactive.button':\n    case 'interactive.list':\n      throw new UnsupportedFeatureError({\n        message: `Message type \"${message.type}\" is not supported by the Wati provider`,\n        provider: 'wati',\n      })\n\n    default: {\n      // Exhaustive check\n      const _exhaustive: never = message\n      throw new Error(`Unhandled message type: ${JSON.stringify(_exhaustive)}`)\n    }\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Flatten template components into Wati's parameter format.\n * Wati expects: [{ name: \"1\", value: \"...\" }, { name: \"2\", value: \"...\" }]\n */\nfunction flattenTemplateParameters(\n  components?: TemplateComponent[],\n): Array<{ name: string; value: string }> {\n  if (!components) return []\n\n  const params: Array<{ name: string; value: string }> = []\n  let index = 1\n\n  for (const component of components) {\n    if (component.type === 'body') {\n      for (const param of component.parameters) {\n        if (param.type === 'text') {\n          params.push({ name: param.name?.trim() || String(index), value: param.text })\n          index++\n        }\n      }\n    }\n  }\n\n  return params\n}\n\n/**\n * Extract URL from a MediaSource, throwing if only an ID is provided.\n * Wati's sendSessionFile API requires a direct URL — it does not support\n * media IDs like the Cloud API does.\n */\nfunction extractWatiMediaUrl(source: MediaSource & { caption?: string; filename?: string }, mediaType: string): string {\n  if ('url' in source && source.url) {\n    return source.url\n  }\n  throw new UnsupportedFeatureError({\n    message: `Wati requires a URL for ${mediaType} messages. Media ID references are not supported — upload your file and use the URL instead.`,\n    provider: 'wati',\n  })\n}\n","// ---------------------------------------------------------------------------\n// Wati webhook parser — normalizes Wati's flat webhook payloads\n// ---------------------------------------------------------------------------\n\nimport type { WebhookEvent, IncomingMessage, WebhookMetadata } from '../../types/webhooks.js'\nimport type { WatiWebhookPayload } from './types.js'\nimport { isRecord } from '../../utils/assert.js'\n\n/**\n * Parse a raw Wati webhook payload into normalized WebhookEvent[].\n *\n * Wati sends flat JSON payloads — one event per webhook POST.\n * Unlike Cloud API, there is no nested entry/changes structure.\n */\nexport function parseWatiWebhook(\n  body: unknown,\n  options: { includeRaw?: boolean } = {},\n): WebhookEvent[] {\n  if (!isRecord(body)) return []\n\n  const payload = body as WatiWebhookPayload\n  const metadata = buildMetadata(payload, options.includeRaw ?? false)\n\n  // Determine event type from the payload\n  const eventType = payload.eventType ?? detectEventType(payload)\n\n  switch (eventType) {\n    case 'message':\n    case 'messages':\n      return parseIncomingMessage(payload, metadata)\n\n    case 'status':\n    case 'message_status':\n      return parseStatusUpdate(payload, metadata)\n\n    case 'error':\n      return parseError(payload, metadata)\n\n    default:\n      // Try to detect from payload shape\n      if (payload.waId && (payload.text || payload.type)) {\n        return parseIncomingMessage(payload, metadata)\n      }\n      if (payload.statusString && payload.localMessageId) {\n        return parseStatusUpdate(payload, metadata)\n      }\n      return []\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Parsers\n// ---------------------------------------------------------------------------\n\nfunction parseIncomingMessage(\n  payload: WatiWebhookPayload,\n  metadata: WebhookMetadata,\n): WebhookEvent[] {\n  if (!payload.waId) return []\n\n  const message = parseMessageContent(payload)\n\n  return [\n    {\n      type: 'message',\n      messageId: payload.messageId ?? '',\n      from: payload.waId,\n      timestamp: parseWatiTimestamp(payload.timestamp),\n      message,\n      contact: payload.senderName\n        ? { name: payload.senderName, waId: payload.waId }\n        : undefined,\n      metadata,\n    },\n  ]\n}\n\nfunction parseMessageContent(payload: WatiWebhookPayload): IncomingMessage {\n  const msgType = payload.type?.toLowerCase()\n\n  switch (msgType) {\n    case 'text':\n      return { type: 'text', body: payload.text ?? '' }\n\n    case 'image':\n      return {\n        type: 'image',\n        mediaId: payload.mediaUrl ?? '',\n        mimeType: payload.mimeType ?? 'image/jpeg',\n        caption: payload.caption,\n      }\n\n    case 'video':\n      return {\n        type: 'video',\n        mediaId: payload.mediaUrl ?? '',\n        mimeType: payload.mimeType ?? 'video/mp4',\n        caption: payload.caption,\n      }\n\n    case 'audio':\n      return {\n        type: 'audio',\n        mediaId: payload.mediaUrl ?? '',\n        mimeType: payload.mimeType ?? 'audio/ogg',\n      }\n\n    case 'document':\n      return {\n        type: 'document',\n        mediaId: payload.mediaUrl ?? '',\n        mimeType: payload.mimeType ?? 'application/octet-stream',\n        filename: payload.filename,\n        caption: payload.caption,\n      }\n\n    case 'location':\n      return {\n        type: 'location',\n        latitude: payload.latitude ?? 0,\n        longitude: payload.longitude ?? 0,\n        name: payload.locationName,\n        address: payload.locationAddress,\n      }\n\n    default:\n      // If there's text content, treat as text\n      if (payload.text) {\n        return { type: 'text', body: payload.text }\n      }\n      return { type: 'unknown', raw: payload }\n  }\n}\n\nfunction parseStatusUpdate(\n  payload: WatiWebhookPayload,\n  metadata: WebhookMetadata,\n): WebhookEvent[] {\n  const statusMap: Record<string, 'sent' | 'delivered' | 'read' | 'failed'> = {\n    sent: 'sent',\n    delivered: 'delivered',\n    read: 'read',\n    failed: 'failed',\n    error: 'failed',\n  }\n\n  const status = statusMap[payload.statusString?.toLowerCase() ?? ''] ?? 'sent'\n\n  return [\n    {\n      type: 'status',\n      messageId: payload.localMessageId ?? payload.messageId ?? '',\n      status,\n      recipientId: payload.waId ?? '',\n      timestamp: parseWatiTimestamp(payload.timestamp),\n      metadata,\n    },\n  ]\n}\n\nfunction parseError(\n  payload: WatiWebhookPayload,\n  metadata: WebhookMetadata,\n): WebhookEvent[] {\n  return [\n    {\n      type: 'error',\n      code: payload.errorCode ?? 0,\n      title: 'Wati Error',\n      message: payload.errorMessage ?? 'Unknown error',\n      metadata,\n    },\n  ]\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildMetadata(payload: WatiWebhookPayload, includeRaw: boolean): WebhookMetadata {\n  return {\n    provider: 'wati',\n    ...(includeRaw ? { raw: payload } : {}),\n  }\n}\n\nfunction detectEventType(payload: WatiWebhookPayload): string {\n  if (payload.errorCode !== undefined || payload.errorMessage) return 'error'\n  if (payload.statusString) return 'status'\n  if (payload.waId) return 'message'\n  return 'unknown'\n}\n\n/**\n * Parse Wati timestamp — handles both ISO strings and Unix epoch strings.\n * Wati's API doesn't document the exact format, so we handle both gracefully.\n */\nfunction parseWatiTimestamp(raw?: string): Date {\n  if (!raw) return new Date()\n  // If the timestamp is all digits, treat as Unix epoch (seconds)\n  if (/^\\d+$/.test(raw)) {\n    return new Date(parseInt(raw, 10) * 1000)\n  }\n  // Otherwise, try ISO string parsing\n  const date = new Date(raw)\n  return isNaN(date.getTime()) ? new Date() : date\n}\n","// ---------------------------------------------------------------------------\n// Wati Provider — full adapter for Wati's unique REST API surface\n// ---------------------------------------------------------------------------\n\nimport type { WhatsAppProviderAdapter, ProviderFeature } from '../../types/provider.js'\nimport type { SendResult } from '../../types/common.js'\nimport type { OutboundMessage } from '../../types/messages.js'\nimport type { MediaUpload, MediaUploadResult, MediaUrlResult, MediaDownloadResult } from '../../types/media.js'\nimport type { WebhookEvent } from '../../types/webhooks.js'\nimport type { WatiConfig, ClientOptions } from '../../types/config.js'\nimport type { WatiSendResponse } from './types.js'\nimport { HttpClient } from '../../core/http.js'\nimport { RateLimiter } from '../../core/rate-limiter.js'\nimport { noopLogger, type Logger } from '../../core/logger.js'\nimport { ProviderError, UnsupportedFeatureError, ValidationError } from '../../core/errors.js'\nimport { mapOutboundToWati } from './mapper.js'\nimport { parseWatiWebhook } from './webhook-parser.js'\nimport { verifyHmacSha256 } from '../../utils/crypto.js'\n\n/**\n * Features supported by the Wati provider.\n *\n * Note: 'webhook.signature_verification' is intentionally absent — Wati does NOT\n * natively sign its webhooks (no HMAC signature header). `verifyWebhookSignature`\n * is kept functional only for callers who front Wati with their own signing\n * proxy/gateway that adds an HMAC.\n */\nconst SUPPORTED_FEATURES = new Set<ProviderFeature>([\n  'media.upload',\n])\n\nfunction extractMessageIdFromRecord(record: Record<string, unknown>): string {\n  const candidates = [record.localMessageId, record.messageId, record.id]\n\n  for (const candidate of candidates) {\n    if (typeof candidate === 'string' && candidate.trim()) {\n      return candidate.trim()\n    }\n  }\n\n  return ''\n}\n\nfunction extractMessageId(response: WatiSendResponse): string {\n  const directMessageId = extractMessageIdFromRecord(\n    response as unknown as Record<string, unknown>,\n  )\n  if (directMessageId) {\n    return directMessageId\n  }\n\n  if (!Array.isArray(response.receivers)) {\n    return ''\n  }\n\n  for (const receiver of response.receivers) {\n    if (!receiver || typeof receiver !== 'object') {\n      continue\n    }\n\n    const nestedMessageId = extractMessageIdFromRecord(\n      receiver as Record<string, unknown>,\n    )\n    if (nestedMessageId) {\n      return nestedMessageId\n    }\n  }\n\n  return ''\n}\n\n\nexport class WatiProvider implements WhatsAppProviderAdapter {\n  readonly name = 'wati' as const\n\n  private readonly config: WatiConfig\n  private readonly options: ClientOptions\n  private readonly http: HttpClient\n  private readonly logger: Logger\n\n  constructor(config: WatiConfig, options: ClientOptions = {}) {\n    const channelNumber = typeof config.channelNumber === 'string' ? config.channelNumber.trim() : ''\n    if (!channelNumber) {\n      throw new ValidationError({\n        message: 'Wati channelNumber is required in provider config',\n        provider: 'wati',\n      })\n    }\n\n    this.config = {\n      ...config,\n      channelNumber,\n    }\n    this.options = options\n    this.logger = options.logger ?? noopLogger\n\n    this.http = new HttpClient({\n      baseUrl: config.baseUrl.replace(/\\/$/, ''),\n      defaultHeaders: {\n        Authorization: `Bearer ${config.apiKey}`,\n      },\n      timeout: options.timeout ?? 30_000,\n      provider: 'wati',\n      logger: this.logger,\n      rateLimiter: new RateLimiter(options.rateLimit),\n      retry: options.retry ?? {},\n      hooks: options.hooks,\n    })\n  }\n\n  // -- Messaging ----------------------------------------------------------\n\n  async sendMessage(message: OutboundMessage): Promise<SendResult> {\n    const mapped = mapOutboundToWati(message)\n    const body =\n      message.type === 'template' && mapped.body\n        ? {\n            ...mapped.body,\n            channel_number: this.config.channelNumber,\n          }\n        : mapped.body\n\n    const response = await this.http.request<WatiSendResponse>({\n      method: mapped.method,\n      path: mapped.path,\n      body,\n      query: mapped.query as Record<string, string | number | boolean | undefined>,\n    })\n\n    if (!response.data.result) {\n      throw new ProviderError({\n        message: response.data.info?.trim()\n          ? `Wati rejected the send request: ${response.data.info}`\n          : 'Wati rejected the send request',\n        provider: this.name,\n        statusCode: response.status,\n        raw: response.data,\n      })\n    }\n\n    const messageId = extractMessageId(response.data)\n\n    if (!messageId) {\n      this.logger.warn('Wati accepted the send request without a message ID', {\n        messageType: message.type,\n        path: mapped.path,\n        raw: response.data,\n      })\n    }\n\n    return {\n      messageId,\n      provider: this.name,\n      ...(this.options.includeRawResponse ? { raw: response.data } : {}),\n    }\n  }\n\n  async markAsRead(): Promise<void> {\n    // Wati does not support programmatic read receipts (read_receipts ❌).\n    throw new UnsupportedFeatureError({\n      message: 'markAsRead (read receipts) is not supported by the Wati provider',\n      provider: 'wati',\n    })\n  }\n\n  // -- Media --------------------------------------------------------------\n\n  async uploadMedia(params: MediaUpload): Promise<MediaUploadResult> {\n    const formData = new FormData()\n\n    if (params.file instanceof Blob) {\n      formData.set('file', params.file, params.filename ?? 'file')\n    } else if (params.file instanceof ReadableStream) {\n      // The ReadableStream branch still buffers the whole stream into memory via\n      // `new Response(stream).blob()` — unavoidable with fetch FormData. Callers\n      // with very large media should prefer URL-based sends where supported.\n      const response = new Response(params.file)\n      const blob = await response.blob()\n      formData.set('file', blob, params.filename ?? 'file')\n    } else {\n      // Uint8Array — pass the view directly. Blob already copies the bytes, so an\n      // extra `.slice()` here would just double peak memory for no benefit. The\n      // cast is type-only (Uint8Array<ArrayBufferLike> → BlobPart); it copies nothing.\n      const blob = new Blob([params.file as BlobPart], { type: params.mimeType })\n      formData.set('file', blob, params.filename ?? 'file')\n    }\n\n    const response = await this.http.uploadRequest<{ id?: string; url?: string }>(\n      '/api/v1/media',\n      formData,\n    )\n\n    // Wati sends require a URL (the mapper throws on a media id), so surface the\n    // URL alongside the id. Callers should pass `url` to subsequent message sends.\n    return { id: response.data.id ?? response.data.url ?? '', url: response.data.url }\n  }\n\n  async getMediaUrl(_mediaId: string): Promise<MediaUrlResult> {\n    throw new UnsupportedFeatureError({\n      message: 'getMediaUrl is not supported by the Wati provider. Wati provides direct URLs in webhook payloads.',\n      provider: 'wati',\n    })\n  }\n\n  async downloadMedia(_mediaIdOrUrl: string): Promise<MediaDownloadResult> {\n    throw new UnsupportedFeatureError({\n      message: 'downloadMedia is not supported by the Wati provider. Use the direct media URL from the webhook payload.',\n      provider: 'wati',\n    })\n  }\n\n  async deleteMedia(_mediaId: string): Promise<void> {\n    throw new UnsupportedFeatureError({\n      message: 'deleteMedia is not supported by the Wati provider',\n      provider: 'wati',\n    })\n  }\n\n  // -- Webhooks -----------------------------------------------------------\n\n  parseWebhook(body: unknown): WebhookEvent[] {\n    return parseWatiWebhook(body, { includeRaw: this.options.includeRawWebhook ?? false })\n  }\n\n  // Wati does NOT natively sign its webhooks — it sends no HMAC signature header.\n  // This verification therefore only works when the caller fronts Wati with their\n  // own signing proxy/gateway that adds an HMAC over the raw body using\n  // `webhookSecret`. Without a `webhookSecret` configured it returns false, and\n  // `supports('webhook.signature_verification')` returns false accordingly.\n  async verifyWebhookSignature(body: string, signature: string): Promise<boolean> {\n    if (!this.config.webhookSecret) {\n      this.logger.warn('verifyWebhookSignature called but no webhookSecret configured')\n      return false\n    }\n    return verifyHmacSha256(body, signature, this.config.webhookSecret)\n  }\n\n  // -- Capabilities -------------------------------------------------------\n\n  supports(feature: ProviderFeature): boolean {\n    return SUPPORTED_FEATURES.has(feature)\n  }\n\n  /** Release the rate limiter's pending timer and queued waiters. */\n  destroy(): void {\n    this.http.destroy()\n  }\n}\n"]}