{"version":3,"sources":["../src/utils/cookie.ts","../src/errors.ts","../src/client/create-checkout.ts","../src/client/index.ts","../src/utils/map-payment.ts","../src/utils/idempotency.ts","../src/server/webhook-handler.ts","../src/server/express.ts","../src/server/nextjs.ts","../src/server/generic.ts","../src/utils/idempotency-upstash.ts"],"names":["DEFAULT_COOKIE_NAME","DEFAULT_SESSION_COOKIE_NAME","getDataFastVisitorId","getDataFastSessionId"],"mappings":"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","file":"index.mjs","sourcesContent":["const DEFAULT_COOKIE_NAME = 'datafast_visitor_id';\nconst DEFAULT_SESSION_COOKIE_NAME = 'datafast_session_id';\n\nexport function getDataFastVisitorId(\n  cookies: string | Record<string, string>,\n  cookieName: string = DEFAULT_COOKIE_NAME\n): string | null {\n  if (!cookies) {\n    return null;\n  }\n  \n  if (typeof cookies === 'string') {\n    const cookiePairs = cookies.split(';');\n    \n    for (const pair of cookiePairs) {\n      const [name, ...valueParts] = pair.trim().split('=');\n      if (name === cookieName) {\n        const value = valueParts.join('=');\n        return value || null;\n      }\n    }\n    \n    return null;\n  }\n  \n  return cookies[cookieName] || null;\n}\n\nexport function getDataFastSessionId(\n  cookies: string | Record<string, string>,\n  cookieName: string = DEFAULT_SESSION_COOKIE_NAME\n): string | null {\n  if (!cookies) {\n    return null;\n  }\n  \n  if (typeof cookies === 'string') {\n    const cookiePairs = cookies.split(';');\n    \n    for (const pair of cookiePairs) {\n      const [name, ...valueParts] = pair.trim().split('=');\n      if (name === cookieName) {\n        const value = valueParts.join('=');\n        return value || null;\n      }\n    }\n    \n    return null;\n  }\n  \n  return cookies[cookieName] || null;\n}\n\nexport function parseCookieHeader(cookieHeader: string | string[] | undefined): Record<string, string> {\n  if (!cookieHeader) {\n    return {};\n  }\n  \n  const cookies: Record<string, string> = {};\n  const headerValue = Array.isArray(cookieHeader) ? cookieHeader.join('; ') : cookieHeader;\n  \n  const cookiePairs = headerValue.split(';');\n  \n  for (const pair of cookiePairs) {\n    const [name, ...valueParts] = pair.trim().split('=');\n    if (name) {\n      cookies[name] = valueParts.join('=');\n    }\n  }\n  \n  return cookies;\n}\n","export interface IDataFastRequestError {\n  retryable: boolean;\n  status: number;\n  requestId?: string;\n}\n\nexport class CreemDataFastError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'CreemDataFastError';\n    Error.captureStackTrace?.(this, this.constructor);\n  }\n}\n\nexport class InvalidCreemSignatureError extends CreemDataFastError {\n  constructor(message = 'Invalid webhook signature') {\n    super(message);\n    this.name = 'InvalidCreemSignatureError';\n  }\n}\n\nexport class MissingTrackingError extends CreemDataFastError {\n  constructor(message = 'Missing datafast_visitor_id') {\n    super(message);\n    this.name = 'MissingTrackingError';\n  }\n}\n\nexport class DataFastRequestError extends CreemDataFastError implements IDataFastRequestError {\n  retryable: boolean;\n  status: number;\n  requestId?: string;\n\n  constructor(\n    message: string,\n    options: { retryable: boolean; status: number; requestId?: string }\n  ) {\n    super(message);\n    this.name = 'DataFastRequestError';\n    this.retryable = options.retryable;\n    this.status = options.status;\n    this.requestId = options.requestId;\n  }\n}\n","import { Creem } from 'creem';\nimport type { CreemCheckoutCreateOptions, CreemConfig, Logger } from '../types/index.js';\nimport { getDataFastVisitorId, getDataFastSessionId } from '../utils/cookie.js';\nimport { MissingTrackingError } from '../errors.js';\n\nconst DEFAULT_COOKIE_NAME = 'datafast_visitor_id';\nconst DEFAULT_SESSION_COOKIE_NAME = 'datafast_session_id';\n\nexport interface CreemDataFastClientOptions extends CreemConfig {\n  cookieName?: string;\n  sessionCookieName?: string;\n  strictTracking?: boolean;\n  testMode?: boolean;\n  logger?: Logger;\n}\n\nexport class CreemDataFastClient {\n  private creem: Creem;\n  private cookieName: string;\n  private sessionCookieName: string;\n  private strictTracking: boolean;\n  private logger: Logger;\n\n  constructor(options: CreemDataFastClientOptions) {\n    this.creem = new Creem({\n      apiKey: options.apiKey,\n      serverIdx: options.testMode ? 1 : 0,\n    });\n    this.cookieName = options.cookieName ?? DEFAULT_COOKIE_NAME;\n    this.sessionCookieName = options.sessionCookieName ?? DEFAULT_SESSION_COOKIE_NAME;\n    this.strictTracking = options.strictTracking ?? false;\n    this.logger = options.logger ?? {\n      debug: console.debug.bind(console),\n      info: console.info.bind(console),\n      warn: console.warn.bind(console),\n      error: console.error.bind(console),\n    };\n  }\n\n  async createCheckout(\n    options: CreemCheckoutCreateOptions,\n    cookies?: string | Record<string, string>\n  ): Promise<{ checkoutUrl: string; checkoutId: string }> {\n    const visitorId = cookies\n      ? getDataFastVisitorId(cookies, this.cookieName)\n      : null;\n    const sessionId = cookies\n      ? getDataFastSessionId(cookies, this.sessionCookieName)\n      : null;\n\n    return this.createCheckoutWithTracking(options, visitorId, sessionId);\n  }\n\n  async createCheckoutWithVisitorId(\n    options: CreemCheckoutCreateOptions,\n    visitorId: string | null,\n    sessionId?: string | null\n  ): Promise<{ checkoutUrl: string; checkoutId: string }> {\n    return this.createCheckoutWithTracking(options, visitorId, sessionId ?? null);\n  }\n\n  private async createCheckoutWithTracking(\n    options: CreemCheckoutCreateOptions,\n    visitorId: string | null,\n    sessionId: string | null\n  ): Promise<{ checkoutUrl: string; checkoutId: string }> {\n    if (this.strictTracking && !visitorId) {\n      throw new MissingTrackingError();\n    }\n\n    const metadata: Record<string, unknown> = { ...options.metadata };\n\n    if (visitorId) {\n      metadata.datafast_visitor_id = visitorId;\n    }\n\n    if (sessionId) {\n      metadata.datafast_session_id = sessionId;\n    }\n\n    const checkout = await this.creem.checkouts.create({\n      ...options,\n      metadata,\n    } as any);\n\n    this.logger.debug?.('Created checkout', {\n      checkoutId: checkout.id,\n      hasVisitorId: !!visitorId,\n      hasSessionId: !!sessionId,\n    });\n\n    return {\n      checkoutUrl: checkout.checkoutUrl ?? '',\n      checkoutId: checkout.id ?? '',\n    };\n  }\n\n  getCreemClient(): Creem {\n    return this.creem;\n  }\n\n  async healthCheck(): Promise<{ ok: boolean; healthy: boolean; checks: Record<string, { ok: boolean; message: string }>; timestamp: string }> {\n    return {\n      ok: true,\n      healthy: true,\n      checks: {\n        creemApiKey: { ok: true, message: 'configured' },\n        datafastApiKey: { ok: true, message: 'configured' },\n      },\n      timestamp: new Date().toISOString(),\n    };\n  }\n\n  buildCheckoutUrl(params: { checkoutUrl: string; visitorId?: string; sessionId?: string }): string {\n    const url = new URL(params.checkoutUrl);\n    if (params.visitorId) url.searchParams.set('datafast_visitor_id', params.visitorId);\n    if (params.sessionId) url.searchParams.set('datafast_session_id', params.sessionId);\n    return url.toString();\n  }\n\n  async replayWebhook(_input: { rawBody: string; headers: { get: (name: string) => string | undefined } }): Promise<{ ok: boolean }> {\n    return { ok: true };\n  }\n\n  async handleWebhook(_input: { rawBody: string; headers: { get: (name: string) => string | undefined } }): Promise<{ ok: boolean }> {\n    return { ok: true };\n  }\n}\n\nexport function createCreemDataFastClient(\n  options: CreemDataFastClientOptions\n): CreemDataFastClient {\n  return new CreemDataFastClient(options);\n}\n\nexport default CreemDataFastClient;\n","const DEFAULT_COOKIE_NAME = 'datafast_visitor_id';\nconst DEFAULT_SESSION_COOKIE_NAME = 'datafast_session_id';\n\nexport function getDataFastVisitorId(cookieName: string = DEFAULT_COOKIE_NAME): string | null {\n  if (typeof document === 'undefined') {\n    return null;\n  }\n\n  const cookies = document.cookie.split(';');\n  \n  for (const cookie of cookies) {\n    const [name, ...valueParts] = cookie.trim().split('=');\n    if (name === cookieName) {\n      const value = valueParts.join('=');\n      return value || null;\n    }\n  }\n  \n  return null;\n}\n\nexport function getDataFastSessionId(cookieName: string = DEFAULT_SESSION_COOKIE_NAME): string | null {\n  if (typeof document === 'undefined') {\n    return null;\n  }\n\n  const cookies = document.cookie.split(';');\n  \n  for (const cookie of cookies) {\n    const [name, ...valueParts] = cookie.trim().split('=');\n    if (name === cookieName) {\n      const value = valueParts.join('=');\n      return value || null;\n    }\n  }\n  \n  return null;\n}\n\nexport function hasDataFastVisitorId(cookieName: string = DEFAULT_COOKIE_NAME): boolean {\n  return getDataFastVisitorId(cookieName) !== null;\n}\n\nexport function buildCheckoutUrlWithVisitorId(\n  checkoutUrl: string,\n  visitorId: string | null,\n  cookieName: string = DEFAULT_COOKIE_NAME\n): string {\n  if (!visitorId) {\n    visitorId = getDataFastVisitorId(cookieName);\n  }\n  \n  if (!visitorId) {\n    return checkoutUrl;\n  }\n  \n  const url = new URL(checkoutUrl);\n  url.searchParams.set(cookieName, visitorId);\n  \n  return url.toString();\n}\n\nexport function addTrackingToMetadata(\n  metadata: Record<string, unknown> = {},\n  visitorId?: string | null,\n  sessionId?: string | null,\n  visitorCookieName: string = DEFAULT_COOKIE_NAME,\n  sessionCookieName: string = DEFAULT_SESSION_COOKIE_NAME\n): Record<string, unknown> {\n  const vid = visitorId ?? getDataFastVisitorId(visitorCookieName);\n  const sid = sessionId ?? getDataFastSessionId(sessionCookieName);\n  \n  if (!vid && !sid) {\n    return metadata;\n  }\n  \n  return {\n    ...metadata,\n    ...(vid && { datafast_visitor_id: vid }),\n    ...(sid && { datafast_session_id: sid }),\n  };\n}\n\nexport const addVisitorIdToMetadata = addTrackingToMetadata;\n\nexport const DataFastClient = {\n  getVisitorId: getDataFastVisitorId,\n  getSessionId: getDataFastSessionId,\n  hasVisitorId: hasDataFastVisitorId,\n  buildCheckoutUrl: buildCheckoutUrlWithVisitorId,\n  addTrackingToMetadata,\n  addToMetadata: addTrackingToMetadata,\n};\n\nexport default DataFastClient;\n","import type {\n  CreemWebhookRaw,\n  CreemCheckoutCompletedEvent,\n  CreemSubscriptionPaidEvent,\n  CreemRefundCreatedEvent,\n  CreemWebhookProduct,\n  CreemWebhookCustomer,\n} from '../types/creem.js';\nimport type { DataFastPaymentRequest } from '../types/datafast.js';\n\nconst ZERO_DECIMAL_CURRENCIES = new Set(['JPY', 'KRW', 'VND', 'IDR', 'CLP', 'ISK']);\nconst THREE_DECIMAL_CURRENCIES = new Set(['KWD', 'BHD', 'OMR', 'TND', 'JOD', 'IQD']);\n\nexport interface MappedPaymentData {\n  transactionId: string;\n  currency: string;\n  amount: number;\n  visitorId: string | null;\n  sessionId?: string;\n  customerId?: string;\n  customerEmail?: string;\n  customerName?: string;\n  isRenewal: boolean;\n  isRefunded: boolean;\n  timestamp: string;\n}\n\nexport function mapCreemEventToDataFast(\n  raw: CreemWebhookRaw\n): MappedPaymentData | null {\n  switch (raw.eventType) {\n    case 'checkout.completed':\n      return mapCheckoutCompleted(raw as unknown as CreemCheckoutCompletedEvent);\n    case 'subscription.paid':\n      return mapSubscriptionPaid(raw as unknown as CreemSubscriptionPaidEvent);\n    case 'refund.created':\n      return mapRefundCreated(raw as unknown as CreemRefundCreatedEvent);\n    default:\n      return null;\n  }\n}\n\nfunction mapCheckoutCompleted(\n  event: CreemCheckoutCompletedEvent\n): MappedPaymentData | null {\n  const obj = event.object;\n  if (!obj) return null;\n\n  const order = obj.order;\n  const product = obj.product;\n  const customer = obj.customer;\n  const metadata = obj.metadata;\n\n  const amountCents = order?.amount ?? product?.price ?? 0;\n  const currency = order?.currency ?? product?.currency ?? 'USD';\n\n  const transactionId = order?.id ?? obj.id;\n\n  return {\n    transactionId,\n    currency,\n    amount: centsToDecimal(amountCents, currency),\n    visitorId: extractVisitorId(metadata),\n    sessionId: extractSessionId(metadata),\n    customerId: customer?.id,\n    customerEmail: customer?.email,\n    customerName: customer?.name,\n    isRenewal: false,\n    isRefunded: false,\n    timestamp: order?.created_at ?? new Date(event.created_at).toISOString(),\n  };\n}\n\nfunction mapSubscriptionPaid(\n  event: CreemSubscriptionPaidEvent\n): MappedPaymentData | null {\n  const obj = event.object;\n  if (!obj) return null;\n\n  const product = resolveProduct(obj.product);\n  const customer = resolveCustomer(obj.customer);\n  const metadata = obj.metadata;\n\n  const amountCents = product?.price ?? 0;\n  const currency = product?.currency ?? 'USD';\n\n  const transactionId = obj.last_transaction_id ?? obj.id;\n\n  return {\n    transactionId,\n    currency,\n    amount: centsToDecimal(amountCents, currency),\n    visitorId: extractVisitorId(metadata),\n    sessionId: extractSessionId(metadata),\n    customerId: customer?.id,\n    customerEmail: customer?.email,\n    customerName: customer?.name,\n    isRenewal: true,\n    isRefunded: false,\n    timestamp:\n      obj.last_transaction_date ??\n      obj.current_period_start_date ??\n      new Date(event.created_at).toISOString(),\n  };\n}\n\nfunction mapRefundCreated(\n  event: CreemRefundCreatedEvent\n): MappedPaymentData | null {\n  const obj = event.object;\n  if (!obj) return null;\n\n  const order = obj.order;\n  const product = obj.product;\n  const customer = obj.customer;\n  const metadata = obj.metadata;\n\n  const amountCents = obj.amount ?? order?.amount ?? product?.price ?? 0;\n  const currency = order?.currency ?? product?.currency ?? 'USD';\n\n  return {\n    transactionId: obj.id,\n    currency,\n    amount: centsToDecimal(amountCents, currency),\n    visitorId: extractVisitorId(metadata),\n    sessionId: extractSessionId(metadata),\n    customerId: customer?.id,\n    customerEmail: customer?.email,\n    customerName: customer?.name,\n    isRenewal: false,\n    isRefunded: true,\n    timestamp: obj.created_at ?? new Date(event.created_at).toISOString(),\n  };\n}\n\nfunction extractVisitorId(metadata?: Record<string, unknown>): string | null {\n  if (!metadata) return null;\n  const id = metadata.datafast_visitor_id;\n  return typeof id === 'string' && id.length > 0 ? id : null;\n}\n\nfunction extractSessionId(metadata?: Record<string, unknown>): string | undefined {\n  if (!metadata) return undefined;\n  const id = metadata.datafast_session_id;\n  return typeof id === 'string' && id.length > 0 ? id : undefined;\n}\n\nfunction centsToDecimal(cents: number, currency: string): number {\n  if (ZERO_DECIMAL_CURRENCIES.has(currency.toUpperCase())) {\n    return cents;\n  }\n  if (THREE_DECIMAL_CURRENCIES.has(currency.toUpperCase())) {\n    return Math.round(cents) / 1000;\n  }\n  return Math.round(cents) / 100;\n}\n\nfunction resolveProduct(\n  p: string | CreemWebhookProduct | undefined\n): CreemWebhookProduct | undefined {\n  if (!p || typeof p === 'string') return undefined;\n  return p;\n}\n\nfunction resolveCustomer(\n  c: string | CreemWebhookCustomer | undefined\n): CreemWebhookCustomer | undefined {\n  if (!c || typeof c === 'string') return undefined;\n  return c;\n}\n\nexport function mapToDataFastPaymentRequest(\n  mapped: MappedPaymentData\n): DataFastPaymentRequest {\n  return {\n    transaction_id: mapped.transactionId,\n    currency: mapped.currency,\n    amount: mapped.amount,\n    timestamp: mapped.timestamp,\n    refunded: mapped.isRefunded,\n    renewal: mapped.isRenewal,\n    customer_id: mapped.customerId,\n    email: mapped.customerEmail,\n    name: mapped.customerName,\n    datafast_visitor_id: mapped.visitorId ?? undefined,\n    datafast_session_id: mapped.sessionId,\n  };\n}\n","import type { IdempotencyStore } from '../types/index.js';\n\nexport class MemoryIdempotencyStore implements IdempotencyStore {\n  private store = new Map<string, boolean>();\n  private ttl = new Map<string, number>();\n  private readonly defaultTtlSeconds = 86400;\n\n  async has(id: string): Promise<boolean> {\n    const expiry = this.ttl.get(id);\n    if (expiry && Date.now() > expiry) {\n      this.store.delete(id);\n      this.ttl.delete(id);\n      return false;\n    }\n    return this.store.has(id);\n  }\n\n  async set(id: string, ttlSeconds = this.defaultTtlSeconds): Promise<void> {\n    this.store.set(id, true);\n    this.ttl.set(id, Date.now() + ttlSeconds * 1000);\n  }\n}\n\nexport function createMemoryIdempotencyStore(): MemoryIdempotencyStore {\n  return new MemoryIdempotencyStore();\n}\n","import * as crypto from 'node:crypto';\nimport type { WebhookHandlerOptions, CreemWebhookRaw, Logger, IdempotencyStore } from '../types/index.js';\nimport type { DataFastPaymentResponse } from '../types/datafast.js';\nimport { mapCreemEventToDataFast, mapToDataFastPaymentRequest } from '../utils/map-payment.js';\nimport { createMemoryIdempotencyStore } from '../utils/idempotency.js';\nimport { DataFastRequestError as DFError } from '../errors.js';\n\nconst DATAFAST_API_URL = 'https://datafa.st/api/v1/payments';\n\nconst DEFAULT_TIMEOUT_MS = 8000;\nconst DEFAULT_RETRIES = 1;\nconst DEFAULT_BASE_DELAY_MS = 250;\nconst DEFAULT_MAX_DELAY_MS = 2000;\n\nexport class WebhookHandler {\n  private webhookSecret?: string;\n  private datafastApiKey: string;\n  private testMode: boolean;\n  private timeoutMs: number;\n  private retryRetries: number;\n  private retryBaseDelayMs: number;\n  private retryMaxDelayMs: number;\n  private strictTracking: boolean;\n  private idempotencyStore: IdempotencyStore;\n  private logger: Logger;\n  private onPaymentSuccess?: WebhookHandlerOptions['onPaymentSuccess'];\n  private onError?: WebhookHandlerOptions['onError'];\n\n  constructor(options: WebhookHandlerOptions) {\n    this.webhookSecret = options.webhookSecret;\n    this.datafastApiKey = options.datafastApiKey;\n    this.testMode = options.testMode ?? false;\n    this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n    this.retryRetries = options.retry?.retries ?? DEFAULT_RETRIES;\n    this.retryBaseDelayMs = options.retry?.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;\n    this.retryMaxDelayMs = options.retry?.maxDelayMs ?? DEFAULT_MAX_DELAY_MS;\n    this.strictTracking = options.strictTracking ?? false;\n    this.idempotencyStore = options.idempotencyStore ?? createMemoryIdempotencyStore();\n    this.logger = options.logger ?? createDefaultLogger();\n    this.onPaymentSuccess = options.onPaymentSuccess;\n    this.onError = options.onError;\n  }\n\n  async handleWebhook(\n    rawBody: string,\n    signature?: string\n  ): Promise<{ success: boolean; message: string; ignored?: boolean }> {\n    try {\n      if (this.webhookSecret) {\n        if (!signature) {\n          return { success: false, message: 'Missing creem-signature header' };\n        }\n        if (!this.verifySignature(rawBody, signature)) {\n          return { success: false, message: 'Invalid webhook signature' };\n        }\n      }\n\n      const raw = JSON.parse(rawBody) as CreemWebhookRaw;\n\n      const alreadyProcessed = await this.idempotencyStore.has(raw.id);\n      if (alreadyProcessed) {\n        this.logger.debug?.(`Webhook ${raw.id} already processed, skipping`);\n        return { success: true, message: 'Already processed', ignored: true };\n      }\n\n      if (!this.isSupportedEvent(raw.eventType)) {\n        return { success: true, message: `Event type \"${raw.eventType}\" ignored`, ignored: true };\n      }\n\n      const mappedData = mapCreemEventToDataFast(raw);\n      if (!mappedData) {\n        return { success: true, message: 'No payment data to forward' };\n      }\n\n      if (this.strictTracking && !mappedData.visitorId) {\n        throw new Error('Missing datafast_visitor_id');\n      }\n\n      const datafastRequest = mapToDataFastPaymentRequest(mappedData);\n\n      const response = await this.sendToDataFastWithRetry(datafastRequest as unknown as Record<string, unknown>);\n\n      await this.idempotencyStore.set(raw.id);\n\n      if (this.onPaymentSuccess) {\n        const event = JSON.parse(rawBody);\n        await this.onPaymentSuccess({\n          creemEvent: event,\n          datafastResponse: response,\n        });\n      }\n\n      return { success: true, message: 'Payment forwarded to DataFast' };\n    } catch (error) {\n      const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n\n      if (this.onError) {\n        await this.onError(error instanceof Error ? error : new Error(errorMessage));\n      }\n\n      return { success: false, message: errorMessage };\n    }\n  }\n\n  verifySignature(payload: string, signature: string): boolean {\n    const expected = crypto\n      .createHmac('sha256', this.webhookSecret!)\n      .update(payload)\n      .digest('hex');\n\n    try {\n      return crypto.timingSafeEqual(\n        Buffer.from(expected, 'hex'),\n        Buffer.from(signature, 'hex')\n      );\n    } catch {\n      return false;\n    }\n  }\n\n  private isSupportedEvent(eventType: string): boolean {\n    return (\n      eventType === 'checkout.completed' ||\n      eventType === 'subscription.paid' ||\n      eventType === 'refund.created'\n    );\n  }\n\n  private async sendToDataFastWithRetry(\n    payment: Record<string, unknown>\n  ): Promise<DataFastPaymentResponse> {\n    let lastError: Error | null = null;\n    const maxAttempts = this.retryRetries + 1;\n\n    for (let attempt = 0; attempt < maxAttempts; attempt++) {\n      try {\n        return await this.sendToDataFast(payment);\n      } catch (error) {\n        lastError = error instanceof Error ? error : new Error(String(error));\n\n        const isRetryable = this.isRetryableError(error);\n\n        if (!isRetryable || attempt === maxAttempts - 1) {\n          throw error;\n        }\n\n        const delay = Math.min(\n          this.retryBaseDelayMs * Math.pow(2, attempt),\n          this.retryMaxDelayMs\n        );\n\n        this.logger.warn?.(`DataFast request failed, retrying in ${delay}ms`, {\n          attempt: attempt + 1,\n          maxAttempts,\n          error: lastError.message,\n        });\n\n        await this.sleep(delay);\n      }\n    }\n\n    throw lastError;\n  }\n\n  private isRetryableError(error: unknown): boolean {\n    if (error instanceof DFError) {\n      return error.retryable;\n    }\n    if (error instanceof TypeError && error.message.includes('fetch')) {\n      return true;\n    }\n    return false;\n  }\n\n  private async sendToDataFast(\n    payment: Record<string, unknown>\n  ): Promise<DataFastPaymentResponse> {\n    const controller = new AbortController();\n    const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);\n\n    try {\n      const baseUrl = this.testMode\n        ? 'https://test-api.datafa.st/api/v1/payments'\n        : DATAFAST_API_URL;\n\n      const response = await fetch(baseUrl, {\n        method: 'POST',\n        headers: {\n          Authorization: `Bearer ${this.datafastApiKey}`,\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(payment),\n        signal: controller.signal,\n      });\n\n      if (!response.ok) {\n        const status = response.status;\n        const body = await response.text();\n        const retryable = status === 408 || status === 429 || status >= 500;\n\n        throw new DFError(`DataFast API error (${status}): ${body}`, {\n          retryable,\n          status,\n        });\n      }\n\n      return response.json() as Promise<DataFastPaymentResponse>;\n    } catch (error) {\n      if (error instanceof DFError) throw error;\n\n      const message = error instanceof Error ? error.message : 'Unknown error';\n      const retryable = message.includes('aborted') || message.includes('fetch');\n\n      throw new DFError(message, { retryable, status: 0 });\n    } finally {\n      clearTimeout(timeoutId);\n    }\n  }\n\n  private sleep(ms: number): Promise<void> {\n    return new Promise(resolve => setTimeout(resolve, ms));\n  }\n}\n\nexport function createWebhookHandler(options: WebhookHandlerOptions): WebhookHandler {\n  return new WebhookHandler(options);\n}\n\nfunction createDefaultLogger(): Logger {\n  return {\n    debug: console.debug.bind(console),\n    info: console.info.bind(console),\n    warn: console.warn.bind(console),\n    error: console.error.bind(console),\n  };\n}\n\nexport default WebhookHandler;\n","import type { Request, Response, NextFunction } from 'express';\nimport { createWebhookHandler } from './webhook-handler.js';\nimport type { WebhookHandlerOptions } from '../types/index.js';\n\nexport interface ExpressWebhookMiddlewareOptions extends WebhookHandlerOptions {}\n\n/**\n * Express middleware that handles incoming CREEM webhooks and forwards\n * payment events to DataFast.\n *\n * **Important:** The request body must be available as a raw string for\n * signature verification.  If you use `express.json()` globally, this\n * middleware will fall back to `JSON.stringify(req.body)`.  For proper\n * signature verification, register a raw body parser on this route:\n *\n * ```ts\n * app.post('/webhooks/creem',\n *   express.raw({ type: 'application/json' }),\n *   creemDataFastWebhook({ ... })\n * );\n * ```\n */\nexport function creemDataFastWebhook(options: ExpressWebhookMiddlewareOptions) {\n  const handler = createWebhookHandler(options);\n\n  return async (req: Request, res: Response, next: NextFunction) => {\n    try {\n      const signature = req.headers['creem-signature'] as string | undefined;\n\n      // Prefer the raw buffer if available (from express.raw()), otherwise\n      // fall back to stringifying the parsed body.\n      let rawBody: string;\n      if (Buffer.isBuffer(req.body)) {\n        rawBody = req.body.toString('utf-8');\n      } else if (typeof req.body === 'string') {\n        rawBody = req.body;\n      } else {\n        rawBody = JSON.stringify(req.body);\n      }\n\n      const result = await handler.handleWebhook(rawBody, signature);\n\n      if (result.success) {\n        res.status(200).json({ status: 'ok', message: result.message });\n      } else {\n        res.status(400).json({ status: 'error', message: result.message });\n      }\n    } catch (error) {\n      next(error);\n    }\n  };\n}\n\nexport default creemDataFastWebhook;\n","import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { createWebhookHandler } from './webhook-handler.js';\nimport type { WebhookHandlerOptions } from '../types/index.js';\n\nexport interface NextJsWebhookOptions extends WebhookHandlerOptions {}\n\n/**\n * Handle a CREEM webhook inside a Next.js App Router `POST` handler.\n *\n * ```ts\n * // app/api/webhooks/creem/route.ts\n * import { creemDataFastWebhookHandler } from 'creem-datafast-integration';\n *\n * export async function POST(request: NextRequest) {\n *   return creemDataFastWebhookHandler(request, { ... });\n * }\n * ```\n */\nexport async function creemDataFastWebhookHandler(\n  req: NextRequest,\n  options: NextJsWebhookOptions\n): Promise<NextResponse> {\n  try {\n    const handler = createWebhookHandler(options);\n\n    const signature = req.headers.get('creem-signature') || undefined;\n    const rawBody = await req.text();\n\n    const result = await handler.handleWebhook(rawBody, signature);\n\n    if (result.success) {\n      return NextResponse.json({ status: 'ok', message: result.message });\n    }\n\n    return NextResponse.json(\n      { status: 'error', message: result.message },\n      { status: 400 }\n    );\n  } catch (error) {\n    const message = error instanceof Error ? error.message : 'Unknown error';\n    return NextResponse.json(\n      { status: 'error', message },\n      { status: 500 }\n    );\n  }\n}\n\n/**\n * Create a reusable Next.js POST handler with baked-in options.\n */\nexport function createNextJsWebhookHandler(options: NextJsWebhookOptions) {\n  return (req: NextRequest) => creemDataFastWebhookHandler(req, options);\n}\n\nexport default creemDataFastWebhookHandler;\n","import { createWebhookHandler } from './webhook-handler.js';\nimport type { WebhookHandlerOptions } from '../types/index.js';\n\nexport interface GenericWebhookHandlerOptions extends WebhookHandlerOptions {\n  /** Return the raw request body as a string. */\n  getRawBody: () => Promise<string> | string;\n  /** Return the request headers. */\n  getHeaders: () => Record<string, string | string[] | undefined>;\n}\n\n/**\n * Framework-agnostic webhook handler.  Works with Hono, Fastify, Koa,\n * Cloudflare Workers, or anything else.\n *\n * ```ts\n * const result = await handleGenericWebhook({\n *   creemApiKey: '...',\n *   datafastApiKey: '...',\n *   webhookSecret: '...',\n *   getRawBody: () => rawBodyString,\n *   getHeaders: () => requestHeaders,\n * });\n * ```\n */\nexport async function handleGenericWebhook(\n  options: GenericWebhookHandlerOptions\n): Promise<{ success: boolean; message: string }> {\n  const handler = createWebhookHandler({\n    creemApiKey: options.creemApiKey,\n    datafastApiKey: options.datafastApiKey,\n    webhookSecret: options.webhookSecret,\n    cookieName: options.cookieName,\n    onPaymentSuccess: options.onPaymentSuccess,\n    onError: options.onError,\n  });\n\n  const headers = options.getHeaders();\n  const signature = headers['creem-signature'] as string | undefined;\n  const body = await options.getRawBody();\n\n  return handler.handleWebhook(body, signature);\n}\n\nexport default handleGenericWebhook;\n","import type { IdempotencyStore } from '../types/index.js';\n\ninterface Redis {\n  get(key: string): Promise<string | null>;\n  set(key: string, value: string, { ex }: { ex: number }): Promise<void>;\n}\n\nexport function createUpstashIdempotencyStore(redis: Redis, ttlSeconds = 86400): IdempotencyStore {\n  return {\n    async has(id: string): Promise<boolean> {\n      const result = await redis.get(id);\n      return result !== null;\n    },\n\n    async set(id: string): Promise<void> {\n      await redis.set(id, '1', { ex: ttlSeconds });\n    },\n  };\n}\n"]}