@parsrun/payments 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +184 -0
- package/dist/billing/index.d.ts +121 -0
- package/dist/billing/index.js +1082 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing-service-LsAFesou.d.ts +578 -0
- package/dist/dunning/index.d.ts +310 -0
- package/dist/dunning/index.js +2677 -0
- package/dist/dunning/index.js.map +1 -0
- package/dist/index.d.ts +185 -0
- package/dist/index.js +7698 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.js +1396 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/iyzico.d.ts +250 -0
- package/dist/providers/iyzico.js +469 -0
- package/dist/providers/iyzico.js.map +1 -0
- package/dist/providers/paddle.d.ts +66 -0
- package/dist/providers/paddle.js +437 -0
- package/dist/providers/paddle.js.map +1 -0
- package/dist/providers/stripe.d.ts +122 -0
- package/dist/providers/stripe.js +586 -0
- package/dist/providers/stripe.js.map +1 -0
- package/dist/schema-C5Zcju_j.d.ts +4191 -0
- package/dist/types.d.ts +388 -0
- package/dist/types.js +74 -0
- package/dist/types.js.map +1 -0
- package/dist/usage/index.d.ts +2674 -0
- package/dist/usage/index.js +2916 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/webhooks/index.d.ts +89 -0
- package/dist/webhooks/index.js +188 -0
- package/dist/webhooks/index.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/webhooks/index.ts","../../src/billing/types.ts","../../src/billing/provider-strategy.ts","../../src/types.ts","../../src/billing/fallback-executor.ts","../../src/billing/billing-service.ts"],"sourcesContent":["/**\n * @parsrun/payments - Webhook Handlers\n * Utilities for handling payment webhooks\n */\n\nimport type {\n PaymentProvider,\n WebhookEvent,\n WebhookEventType,\n WebhookHandler,\n} from \"../types.js\";\n\n/**\n * Webhook event handler registry\n */\nexport class WebhookHandlerRegistry {\n private handlers = new Map<WebhookEventType | \"*\", WebhookHandler[]>();\n\n /**\n * Register a handler for a specific event type\n */\n on<T = unknown>(type: WebhookEventType | \"*\", handler: WebhookHandler<T>): this {\n const handlers = this.handlers.get(type) ?? [];\n handlers.push(handler as WebhookHandler);\n this.handlers.set(type, handlers);\n return this;\n }\n\n /**\n * Register handlers for checkout events\n */\n onCheckout(handler: WebhookHandler): this {\n this.on(\"checkout.session.completed\", handler);\n this.on(\"checkout.session.expired\", handler);\n return this;\n }\n\n /**\n * Register handlers for subscription events\n */\n onSubscription(handler: WebhookHandler): this {\n this.on(\"subscription.created\", handler);\n this.on(\"subscription.updated\", handler);\n this.on(\"subscription.deleted\", handler);\n this.on(\"subscription.trial_will_end\", handler);\n return this;\n }\n\n /**\n * Register handlers for payment events\n */\n onPayment(handler: WebhookHandler): this {\n this.on(\"payment.succeeded\", handler);\n this.on(\"payment.failed\", handler);\n return this;\n }\n\n /**\n * Register handlers for invoice events\n */\n onInvoice(handler: WebhookHandler): this {\n this.on(\"invoice.created\", handler);\n this.on(\"invoice.paid\", handler);\n this.on(\"invoice.payment_failed\", handler);\n this.on(\"invoice.upcoming\", handler);\n return this;\n }\n\n /**\n * Register handlers for customer events\n */\n onCustomer(handler: WebhookHandler): this {\n this.on(\"customer.created\", handler);\n this.on(\"customer.updated\", handler);\n this.on(\"customer.deleted\", handler);\n return this;\n }\n\n /**\n * Get handlers for an event type\n */\n getHandlers(type: WebhookEventType): WebhookHandler[] {\n const specificHandlers = this.handlers.get(type) ?? [];\n const globalHandlers = this.handlers.get(\"*\") ?? [];\n return [...specificHandlers, ...globalHandlers];\n }\n\n /**\n * Execute all handlers for an event\n */\n async handle(event: WebhookEvent): Promise<void> {\n const handlers = this.getHandlers(event.type);\n\n for (const handler of handlers) {\n await handler(event);\n }\n }\n}\n\n/**\n * Webhook processor for handling incoming webhooks\n */\nexport class WebhookProcessor {\n private provider: PaymentProvider;\n private registry: WebhookHandlerRegistry;\n\n constructor(provider: PaymentProvider, registry?: WebhookHandlerRegistry) {\n this.provider = provider;\n this.registry = registry ?? new WebhookHandlerRegistry();\n }\n\n /**\n * Get the handler registry\n */\n get handlers(): WebhookHandlerRegistry {\n return this.registry;\n }\n\n /**\n * Process a webhook request\n */\n async process(request: Request): Promise<WebhookProcessResult> {\n try {\n // Get payload and signature\n const payload = await request.text();\n const signature = this.getSignature(request);\n\n if (!signature) {\n return {\n success: false,\n error: \"Missing webhook signature\",\n };\n }\n\n // Verify webhook\n const event = await this.provider.verifyWebhook(payload, signature);\n\n if (!event) {\n return {\n success: false,\n error: \"Invalid webhook signature\",\n };\n }\n\n // Handle event\n await this.registry.handle(event);\n\n return {\n success: true,\n event,\n };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : \"Unknown error\",\n };\n }\n }\n\n /**\n * Process raw webhook payload\n */\n async processRaw(\n payload: string | Uint8Array,\n signature: string\n ): Promise<WebhookProcessResult> {\n try {\n // Verify webhook\n const event = await this.provider.verifyWebhook(payload, signature);\n\n if (!event) {\n return {\n success: false,\n error: \"Invalid webhook signature\",\n };\n }\n\n // Handle event\n await this.registry.handle(event);\n\n return {\n success: true,\n event,\n };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : \"Unknown error\",\n };\n }\n }\n\n private getSignature(request: Request): string | null {\n // Stripe uses stripe-signature header\n const stripeSignature = request.headers.get(\"stripe-signature\");\n if (stripeSignature) return stripeSignature;\n\n // Paddle uses paddle-signature header\n const paddleSignature = request.headers.get(\"paddle-signature\");\n if (paddleSignature) return paddleSignature;\n\n return null;\n }\n}\n\n/**\n * Webhook process result\n */\nexport interface WebhookProcessResult {\n success: boolean;\n event?: WebhookEvent | undefined;\n error?: string | undefined;\n}\n\n/**\n * Create a webhook processor\n */\nexport function createWebhookProcessor(\n provider: PaymentProvider,\n registry?: WebhookHandlerRegistry\n): WebhookProcessor {\n return new WebhookProcessor(provider, registry);\n}\n\n/**\n * Create a webhook handler registry\n */\nexport function createWebhookHandlerRegistry(): WebhookHandlerRegistry {\n return new WebhookHandlerRegistry();\n}\n\n/**\n * Create a Hono/Express-compatible webhook handler\n */\nexport function createWebhookHandler(\n provider: PaymentProvider,\n handlers: Partial<Record<WebhookEventType | \"*\", WebhookHandler>>\n): (request: Request) => Promise<Response> {\n const registry = new WebhookHandlerRegistry();\n\n for (const [type, handler] of Object.entries(handlers)) {\n if (handler) {\n registry.on(type as WebhookEventType, handler);\n }\n }\n\n const processor = new WebhookProcessor(provider, registry);\n\n return async (request: Request): Promise<Response> => {\n const result = await processor.process(request);\n\n if (result.success) {\n return new Response(JSON.stringify({ received: true }), {\n status: 200,\n headers: { \"Content-Type\": \"application/json\" },\n });\n }\n\n return new Response(JSON.stringify({ error: result.error }), {\n status: 400,\n headers: { \"Content-Type\": \"application/json\" },\n });\n };\n}\n","/**\n * @parsrun/payments - Billing Types\n * Types for multi-provider billing service\n */\n\nimport type {\n PaymentProvider,\n PaymentProviderType,\n Customer,\n Subscription,\n} from \"../types.js\";\n\n// ============================================================================\n// Region & Routing\n// ============================================================================\n\n/**\n * Supported regions for provider routing\n */\nexport type BillingRegion =\n | \"TR\" // Turkey\n | \"EU\" // European Union\n | \"US\" // United States\n | \"UK\" // United Kingdom\n | \"APAC\" // Asia Pacific\n | \"LATAM\" // Latin America\n | \"GLOBAL\" // Default/fallback\n | string; // Custom regions\n\n/**\n * Region detection result\n */\nexport interface RegionDetectionResult {\n /** Detected region code */\n region: BillingRegion;\n /** Country code (ISO 3166-1 alpha-2) */\n countryCode?: string;\n /** Detection method used */\n method: \"ip\" | \"customer\" | \"explicit\" | \"default\";\n /** Confidence level */\n confidence: \"high\" | \"medium\" | \"low\";\n}\n\n/**\n * Region detector function type\n */\nexport type RegionDetector = (\n context: RegionDetectionContext\n) => BillingRegion | Promise<BillingRegion>;\n\n/**\n * Context for region detection\n */\nexport interface RegionDetectionContext {\n /** Customer ID if available */\n customerId?: string | undefined;\n /** Customer email */\n email?: string | undefined;\n /** Explicit country code */\n countryCode?: string | undefined;\n /** IP address */\n ipAddress?: string | undefined;\n /** Request headers */\n headers?: Record<string, string> | undefined;\n /** Custom context data */\n custom?: Record<string, unknown> | undefined;\n}\n\n// ============================================================================\n// Provider Strategy\n// ============================================================================\n\n/**\n * Provider routing rule\n */\nexport interface ProviderRoutingRule {\n /** Regions this rule applies to */\n regions: BillingRegion[];\n /** Provider to use */\n provider: PaymentProvider;\n /** Priority (lower = higher priority) */\n priority?: number;\n /** Rule condition (optional) */\n condition?: (context: RegionDetectionContext) => boolean;\n}\n\n/**\n * Provider strategy configuration\n */\nexport interface ProviderStrategyConfig {\n /** Default provider (used when no region matches) */\n default: PaymentProvider;\n\n /**\n * Region-based provider mapping\n * @example { TR: iyzicoProvider, EU: stripeProvider }\n */\n regions?: Record<BillingRegion, PaymentProvider>;\n\n /**\n * Advanced routing rules (takes precedence over regions)\n */\n rules?: ProviderRoutingRule[];\n\n /**\n * Custom region detector\n * Default: uses countryCode from context or \"GLOBAL\"\n */\n regionDetector?: RegionDetector;\n}\n\n// ============================================================================\n// Fallback Configuration\n// ============================================================================\n\n/**\n * Fallback configuration\n */\nexport interface FallbackConfig {\n /**\n * Enable fallback to alternative providers\n * @default false\n *\n * WARNING: Enable with caution! Fallback may cause:\n * - Double charges if not handled properly\n * - Inconsistent customer records across providers\n * - Webhook handling complexity\n *\n * Recommended only for:\n * - One-time payments (not subscriptions)\n * - Idempotent operations\n * - When you have proper reconciliation in place\n */\n enabled: boolean;\n\n /**\n * Fallback providers in order of preference\n * If not specified, uses all configured providers except the failed one\n */\n providers?: PaymentProvider[];\n\n /**\n * Operations that allow fallback\n * @default [\"createCheckout\"] - Only checkout is safe by default\n */\n allowedOperations?: FallbackOperation[];\n\n /**\n * Maximum fallback attempts\n * @default 1\n */\n maxAttempts?: number;\n\n /**\n * Errors that should trigger fallback\n * @default [\"API_ERROR\", \"RATE_LIMITED\", \"PROVIDER_UNAVAILABLE\"]\n */\n retryableErrors?: string[];\n\n /**\n * Callback when fallback is triggered\n */\n onFallback?: (context: FallbackContext) => void | Promise<void>;\n\n /**\n * Callback when all providers fail\n */\n onAllFailed?: (context: FallbackContext) => void | Promise<void>;\n}\n\n/**\n * Operations that can trigger fallback\n */\nexport type FallbackOperation =\n | \"createCheckout\"\n | \"createCustomer\"\n | \"createSubscription\"\n | \"createPayment\";\n\n/**\n * Fallback context for callbacks\n */\nexport interface FallbackContext {\n /** Operation that failed */\n operation: FallbackOperation;\n /** Original provider that failed */\n originalProvider: PaymentProviderType;\n /** Fallback provider being tried */\n fallbackProvider?: PaymentProviderType;\n /** Error that triggered fallback */\n error: Error;\n /** Attempt number */\n attempt: number;\n /** Total attempts made */\n totalAttempts: number;\n /** Whether all providers failed */\n allFailed: boolean;\n}\n\n// ============================================================================\n// Billing Service Configuration\n// ============================================================================\n\n/**\n * Billing service configuration\n */\nexport interface BillingServiceConfig {\n /**\n * Provider strategy configuration\n */\n providers: ProviderStrategyConfig;\n\n /**\n * Fallback configuration\n * @default { enabled: false }\n */\n fallback?: FallbackConfig;\n\n /**\n * Tenant ID for multi-tenant setups\n */\n tenantId?: string;\n\n /**\n * Enable debug logging\n */\n debug?: boolean;\n\n /**\n * Custom logger\n */\n logger?: BillingLogger;\n\n /**\n * Webhook configuration\n */\n webhooks?: {\n /**\n * Normalize events from all providers to unified format\n * @default true\n */\n normalize?: boolean;\n\n /**\n * Secret keys for each provider\n */\n secrets?: Partial<Record<PaymentProviderType, string>>;\n };\n}\n\n/**\n * Logger interface for billing service\n */\nexport interface BillingLogger {\n debug(message: string, context?: Record<string, unknown>): void;\n info(message: string, context?: Record<string, unknown>): void;\n warn(message: string, context?: Record<string, unknown>): void;\n error(message: string, context?: Record<string, unknown>): void;\n}\n\n// ============================================================================\n// High-Level Billing API Types\n// ============================================================================\n\n/**\n * Subscribe options (high-level)\n */\nexport interface SubscribeOptions {\n /** Customer email */\n email: string;\n /** Customer name */\n name?: string;\n /** Plan/Price ID */\n planId: string;\n /** Success redirect URL */\n successUrl: string;\n /** Cancel redirect URL */\n cancelUrl: string;\n /** Trial days */\n trialDays?: number;\n /** Country code for region routing */\n countryCode?: string;\n /** Custom metadata */\n metadata?: Record<string, string>;\n /**\n * Existing customer ID (skip customer creation)\n */\n customerId?: string;\n /**\n * Force specific provider (bypass region routing)\n */\n forceProvider?: PaymentProviderType;\n}\n\n/**\n * Subscribe result\n */\nexport interface SubscribeResult {\n /** Checkout URL to redirect user */\n checkoutUrl: string;\n /** Checkout session ID */\n sessionId: string;\n /** Customer ID (created or existing) */\n customerId: string;\n /** Provider used */\n provider: PaymentProviderType;\n /** Region detected */\n region: BillingRegion;\n}\n\n/**\n * Cancel subscription options\n */\nexport interface CancelOptions {\n /** Subscription ID */\n subscriptionId: string;\n /** Cancel immediately or at period end */\n immediate?: boolean;\n /** Reason for cancellation */\n reason?: string;\n /** Provider (if known, for faster lookup) */\n provider?: PaymentProviderType;\n}\n\n/**\n * Cancel result\n */\nexport interface CancelResult {\n /** Subscription ID */\n subscriptionId: string;\n /** New status */\n status: string;\n /** When subscription will end */\n endsAt: Date;\n /** Provider used */\n provider: PaymentProviderType;\n}\n\n/**\n * Get subscription options\n */\nexport interface GetSubscriptionOptions {\n /** Customer ID */\n customerId?: string;\n /** Customer email (alternative to customerId) */\n email?: string;\n /** Specific subscription ID */\n subscriptionId?: string;\n /** Provider hint */\n provider?: PaymentProviderType;\n}\n\n/**\n * Subscription with provider info\n */\nexport interface BillingSubscription extends Subscription {\n /** Provider that manages this subscription */\n provider: PaymentProviderType;\n}\n\n/**\n * Customer with provider info\n */\nexport interface BillingCustomer extends Customer {\n /** Provider that manages this customer */\n provider: PaymentProviderType;\n /** Region */\n region?: BillingRegion;\n}\n\n// ============================================================================\n// Provider Selection Result\n// ============================================================================\n\n/**\n * Provider selection result\n */\nexport interface ProviderSelection {\n /** Selected provider */\n provider: PaymentProvider;\n /** Provider type */\n type: PaymentProviderType;\n /** Region used for selection */\n region: BillingRegion;\n /** Selection reason */\n reason: \"region\" | \"rule\" | \"default\" | \"forced\" | \"fallback\";\n}\n\n// ============================================================================\n// Billing Errors\n// ============================================================================\n\n/**\n * Billing error codes\n */\nexport const BillingErrorCodes = {\n NO_PROVIDER_CONFIGURED: \"NO_PROVIDER_CONFIGURED\",\n PROVIDER_UNAVAILABLE: \"PROVIDER_UNAVAILABLE\",\n ALL_PROVIDERS_FAILED: \"ALL_PROVIDERS_FAILED\",\n REGION_NOT_SUPPORTED: \"REGION_NOT_SUPPORTED\",\n SUBSCRIPTION_NOT_FOUND: \"SUBSCRIPTION_NOT_FOUND\",\n CUSTOMER_NOT_FOUND: \"CUSTOMER_NOT_FOUND\",\n FALLBACK_DISABLED: \"FALLBACK_DISABLED\",\n OPERATION_NOT_ALLOWED: \"OPERATION_NOT_ALLOWED\",\n} as const;\n\nexport type BillingErrorCode = keyof typeof BillingErrorCodes;\n\n/**\n * Billing error\n */\nexport class BillingError extends Error {\n constructor(\n message: string,\n public readonly code: BillingErrorCode,\n public readonly provider?: PaymentProviderType,\n public readonly cause?: Error\n ) {\n super(message);\n this.name = \"BillingError\";\n }\n}\n","/**\n * @parsrun/payments - Provider Strategy\n * Region-based provider routing and selection\n */\n\nimport type { PaymentProvider, PaymentProviderType } from \"../types.js\";\nimport type {\n BillingRegion,\n ProviderStrategyConfig,\n ProviderRoutingRule,\n RegionDetectionContext,\n RegionDetector,\n ProviderSelection,\n BillingLogger,\n} from \"./types.js\";\nimport { BillingError } from \"./types.js\";\n\n/**\n * Default region detector\n * Uses countryCode from context, maps to region\n */\nconst defaultRegionDetector: RegionDetector = (context) => {\n if (!context.countryCode) {\n return \"GLOBAL\";\n }\n\n const countryToRegion: Record<string, BillingRegion> = {\n // Turkey\n TR: \"TR\",\n // EU countries\n DE: \"EU\", FR: \"EU\", IT: \"EU\", ES: \"EU\", NL: \"EU\", BE: \"EU\",\n AT: \"EU\", PT: \"EU\", GR: \"EU\", PL: \"EU\", CZ: \"EU\", RO: \"EU\",\n HU: \"EU\", SE: \"EU\", DK: \"EU\", FI: \"EU\", IE: \"EU\", SK: \"EU\",\n BG: \"EU\", HR: \"EU\", LT: \"EU\", LV: \"EU\", SI: \"EU\", EE: \"EU\",\n CY: \"EU\", LU: \"EU\", MT: \"EU\",\n // UK\n GB: \"UK\", UK: \"UK\",\n // US\n US: \"US\",\n // APAC\n JP: \"APAC\", CN: \"APAC\", KR: \"APAC\", AU: \"APAC\", NZ: \"APAC\",\n SG: \"APAC\", HK: \"APAC\", TW: \"APAC\", IN: \"APAC\", ID: \"APAC\",\n MY: \"APAC\", TH: \"APAC\", PH: \"APAC\", VN: \"APAC\",\n // LATAM\n BR: \"LATAM\", MX: \"LATAM\", AR: \"LATAM\", CL: \"LATAM\", CO: \"LATAM\",\n PE: \"LATAM\", VE: \"LATAM\", EC: \"LATAM\", UY: \"LATAM\", PY: \"LATAM\",\n };\n\n return countryToRegion[context.countryCode.toUpperCase()] ?? \"GLOBAL\";\n};\n\n/**\n * Provider Strategy\n * Handles region-based provider routing and selection\n */\nexport class ProviderStrategy {\n private readonly defaultProvider: PaymentProvider;\n private readonly regionProviders: Map<BillingRegion, PaymentProvider>;\n private readonly rules: ProviderRoutingRule[];\n private readonly regionDetector: RegionDetector;\n private readonly logger: BillingLogger | undefined;\n\n constructor(config: ProviderStrategyConfig, logger?: BillingLogger) {\n this.defaultProvider = config.default;\n this.regionProviders = new Map();\n this.rules = config.rules ?? [];\n this.regionDetector = config.regionDetector ?? defaultRegionDetector;\n this.logger = logger ?? undefined;\n\n // Build region provider map\n if (config.regions) {\n for (const [region, provider] of Object.entries(config.regions)) {\n this.regionProviders.set(region as BillingRegion, provider);\n }\n }\n\n // Sort rules by priority\n this.rules.sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));\n }\n\n /**\n * Select provider for given context\n */\n async selectProvider(\n context: RegionDetectionContext,\n forceProvider?: PaymentProviderType\n ): Promise<ProviderSelection> {\n // Forced provider\n if (forceProvider) {\n const provider = this.findProviderByType(forceProvider);\n if (provider) {\n this.logger?.debug(\"Provider forced\", { provider: forceProvider });\n return {\n provider,\n type: forceProvider,\n region: await this.detectRegion(context),\n reason: \"forced\",\n };\n }\n throw new BillingError(\n `Forced provider \"${forceProvider}\" not configured`,\n \"NO_PROVIDER_CONFIGURED\",\n forceProvider\n );\n }\n\n // Detect region\n const region = await this.detectRegion(context);\n this.logger?.debug(\"Region detected\", { region, context });\n\n // Check rules first (higher priority)\n for (const rule of this.rules) {\n if (rule.regions.includes(region)) {\n // Check additional condition if provided\n if (rule.condition && !rule.condition(context)) {\n continue;\n }\n\n this.logger?.debug(\"Rule matched\", {\n regions: rule.regions,\n provider: rule.provider.type,\n });\n\n return {\n provider: rule.provider,\n type: rule.provider.type,\n region,\n reason: \"rule\",\n };\n }\n }\n\n // Check region providers\n const regionProvider = this.regionProviders.get(region);\n if (regionProvider) {\n this.logger?.debug(\"Region provider selected\", {\n region,\n provider: regionProvider.type,\n });\n\n return {\n provider: regionProvider,\n type: regionProvider.type,\n region,\n reason: \"region\",\n };\n }\n\n // Fall back to default\n this.logger?.debug(\"Using default provider\", {\n region,\n provider: this.defaultProvider.type,\n });\n\n return {\n provider: this.defaultProvider,\n type: this.defaultProvider.type,\n region,\n reason: \"default\",\n };\n }\n\n /**\n * Detect region from context\n */\n async detectRegion(context: RegionDetectionContext): Promise<BillingRegion> {\n try {\n return await this.regionDetector(context);\n } catch (error) {\n this.logger?.warn(\"Region detection failed, using GLOBAL\", {\n error: error instanceof Error ? error.message : String(error),\n });\n return \"GLOBAL\";\n }\n }\n\n /**\n * Get all configured providers\n */\n getAllProviders(): PaymentProvider[] {\n const providers = new Set<PaymentProvider>();\n providers.add(this.defaultProvider);\n\n for (const provider of this.regionProviders.values()) {\n providers.add(provider);\n }\n\n for (const rule of this.rules) {\n providers.add(rule.provider);\n }\n\n return Array.from(providers);\n }\n\n /**\n * Get provider by type\n */\n getProviderByType(type: PaymentProviderType): PaymentProvider | undefined {\n return this.findProviderByType(type);\n }\n\n /**\n * Get default provider\n */\n getDefaultProvider(): PaymentProvider {\n return this.defaultProvider;\n }\n\n /**\n * Get provider for region\n */\n getProviderForRegion(region: BillingRegion): PaymentProvider {\n return this.regionProviders.get(region) ?? this.defaultProvider;\n }\n\n /**\n * Check if region is supported\n */\n isRegionSupported(region: BillingRegion): boolean {\n // GLOBAL is always supported via default provider\n if (region === \"GLOBAL\") return true;\n\n // Check if any rule matches\n for (const rule of this.rules) {\n if (rule.regions.includes(region)) return true;\n }\n\n // Check if region has explicit provider\n return this.regionProviders.has(region);\n }\n\n /**\n * Get supported regions\n */\n getSupportedRegions(): BillingRegion[] {\n const regions = new Set<BillingRegion>([\"GLOBAL\"]);\n\n for (const region of this.regionProviders.keys()) {\n regions.add(region);\n }\n\n for (const rule of this.rules) {\n for (const region of rule.regions) {\n regions.add(region);\n }\n }\n\n return Array.from(regions);\n }\n\n /**\n * Find provider by type across all configured providers\n */\n private findProviderByType(type: PaymentProviderType): PaymentProvider | undefined {\n if (this.defaultProvider.type === type) {\n return this.defaultProvider;\n }\n\n for (const provider of this.regionProviders.values()) {\n if (provider.type === type) {\n return provider;\n }\n }\n\n for (const rule of this.rules) {\n if (rule.provider.type === type) {\n return rule.provider;\n }\n }\n\n return undefined;\n }\n}\n\n/**\n * Create provider strategy\n */\nexport function createProviderStrategy(\n config: ProviderStrategyConfig,\n logger?: BillingLogger\n): ProviderStrategy {\n return new ProviderStrategy(config, logger);\n}\n","/**\n * @parsrun/payments - Type Definitions\n * Payment types and interfaces\n */\n\n// Re-export types from @parsrun/types for convenience\nexport {\n type,\n currencyCode,\n money,\n paymentCustomer,\n createCustomerRequest,\n cardDetails,\n paymentMethod,\n paymentIntentStatus,\n paymentIntent as parsPaymentIntent,\n createPaymentIntentRequest,\n subscriptionStatus as parsSubscriptionStatus,\n priceInterval,\n price as parsPrice,\n subscription as parsSubscription,\n createSubscriptionRequest,\n refundStatus,\n refund,\n createRefundRequest,\n webhookEventType,\n webhookEvent,\n stripeConfig,\n paddleConfig,\n iyzicoConfig,\n paymentsConfig,\n type CurrencyCode as ParsCurrencyCode,\n type Money,\n type PaymentCustomer,\n type CreateCustomerRequest as ParsCreateCustomerRequest,\n type CardDetails,\n type PaymentMethod as ParsPaymentMethod,\n type PaymentIntentStatus,\n type PaymentIntent as ParsPaymentIntentType,\n type CreatePaymentIntentRequest,\n type SubscriptionStatus as ParsSubscriptionStatus,\n type PriceInterval,\n type Price as ParsPrice,\n type Subscription as ParsSubscription,\n type CreateSubscriptionRequest as ParsCreateSubscriptionRequest,\n type RefundStatus,\n type Refund,\n type CreateRefundRequest,\n type WebhookEventType as ParsWebhookEventType,\n type WebhookEvent as ParsWebhookEvent,\n type StripeConfig,\n type PaddleConfig,\n type IyzicoConfig,\n type PaymentsConfig,\n} from \"@parsrun/types\";\n\n/**\n * Payment provider type\n */\nexport type PaymentProviderType = \"stripe\" | \"paddle\" | \"iyzico\";\n\n/**\n * Currency code (ISO 4217)\n */\nexport type CurrencyCode = \"USD\" | \"EUR\" | \"GBP\" | \"TRY\" | \"JPY\" | \"CAD\" | \"AUD\" | string;\n\n/**\n * Payment status\n */\nexport type PaymentStatus =\n | \"pending\"\n | \"processing\"\n | \"succeeded\"\n | \"failed\"\n | \"canceled\"\n | \"refunded\"\n | \"partially_refunded\";\n\n/**\n * Subscription status\n */\nexport type SubscriptionStatus =\n | \"active\"\n | \"past_due\"\n | \"unpaid\"\n | \"canceled\"\n | \"incomplete\"\n | \"incomplete_expired\"\n | \"trialing\"\n | \"paused\";\n\n/**\n * Billing interval\n */\nexport type BillingInterval = \"day\" | \"week\" | \"month\" | \"year\";\n\n// ============================================================================\n// Customer\n// ============================================================================\n\n/**\n * Customer data\n */\nexport interface Customer {\n /** Provider customer ID */\n id: string;\n /** Customer email */\n email: string;\n /** Customer name */\n name?: string | undefined;\n /** Phone number */\n phone?: string | undefined;\n /** Billing address */\n address?: Address | undefined;\n /** Custom metadata */\n metadata?: Record<string, string> | undefined;\n /** Provider-specific data */\n providerData?: unknown;\n}\n\n/**\n * Address\n */\nexport interface Address {\n line1?: string | undefined;\n line2?: string | undefined;\n city?: string | undefined;\n state?: string | undefined;\n postalCode?: string | undefined;\n country?: string | undefined;\n}\n\n/**\n * Create customer options\n */\nexport interface CreateCustomerOptions {\n email: string;\n name?: string | undefined;\n phone?: string | undefined;\n address?: Address | undefined;\n metadata?: Record<string, string> | undefined;\n}\n\n// ============================================================================\n// Products & Prices\n// ============================================================================\n\n/**\n * Product\n */\nexport interface Product {\n /** Provider product ID */\n id: string;\n /** Product name */\n name: string;\n /** Description */\n description?: string | undefined;\n /** Active status */\n active: boolean;\n /** Custom metadata */\n metadata?: Record<string, string> | undefined;\n /** Provider-specific data */\n providerData?: unknown;\n}\n\n/**\n * Price\n */\nexport interface Price {\n /** Provider price ID */\n id: string;\n /** Product ID */\n productId: string;\n /** Price in smallest currency unit (cents) */\n unitAmount: number;\n /** Currency */\n currency: CurrencyCode;\n /** Recurring billing details */\n recurring?: {\n interval: BillingInterval;\n intervalCount: number;\n } | undefined;\n /** Active status */\n active: boolean;\n /** Custom metadata */\n metadata?: Record<string, string> | undefined;\n /** Provider-specific data */\n providerData?: unknown;\n}\n\n// ============================================================================\n// Checkout\n// ============================================================================\n\n/**\n * Checkout line item\n */\nexport interface CheckoutLineItem {\n /** Price ID */\n priceId: string;\n /** Quantity */\n quantity: number;\n}\n\n/**\n * Create checkout options\n */\nexport interface CreateCheckoutOptions {\n /** Customer ID (optional, creates new if not provided) */\n customerId?: string | undefined;\n /** Customer email (for new customers) */\n customerEmail?: string | undefined;\n /** Line items */\n lineItems: CheckoutLineItem[];\n /** Success redirect URL */\n successUrl: string;\n /** Cancel redirect URL */\n cancelUrl: string;\n /** Checkout mode */\n mode: \"payment\" | \"subscription\" | \"setup\";\n /** Allow promotion codes */\n allowPromotionCodes?: boolean | undefined;\n /** Trial period days (subscription only) */\n trialDays?: number | undefined;\n /** Custom metadata */\n metadata?: Record<string, string> | undefined;\n /** Tenant ID for multi-tenant */\n tenantId?: string | undefined;\n}\n\n/**\n * Checkout session\n */\nexport interface CheckoutSession {\n /** Provider session ID */\n id: string;\n /** Checkout URL */\n url: string;\n /** Customer ID */\n customerId?: string | undefined;\n /** Payment status */\n status: \"open\" | \"complete\" | \"expired\";\n /** Mode */\n mode: \"payment\" | \"subscription\" | \"setup\";\n /** Amount total */\n amountTotal?: number | undefined;\n /** Currency */\n currency?: CurrencyCode | undefined;\n /** Provider-specific data */\n providerData?: unknown;\n}\n\n// ============================================================================\n// Subscriptions\n// ============================================================================\n\n/**\n * Subscription\n */\nexport interface Subscription {\n /** Provider subscription ID */\n id: string;\n /** Customer ID */\n customerId: string;\n /** Status */\n status: SubscriptionStatus;\n /** Price ID */\n priceId: string;\n /** Product ID */\n productId?: string | undefined;\n /** Current period start */\n currentPeriodStart: Date;\n /** Current period end */\n currentPeriodEnd: Date;\n /** Cancel at period end */\n cancelAtPeriodEnd: boolean;\n /** Canceled at */\n canceledAt?: Date | undefined;\n /** Trial start */\n trialStart?: Date | undefined;\n /** Trial end */\n trialEnd?: Date | undefined;\n /** Custom metadata */\n metadata?: Record<string, string> | undefined;\n /** Provider-specific data */\n providerData?: unknown;\n}\n\n/**\n * Create subscription options\n */\nexport interface CreateSubscriptionOptions {\n /** Customer ID */\n customerId: string;\n /** Price ID */\n priceId: string;\n /** Trial period days */\n trialDays?: number | undefined;\n /** Custom metadata */\n metadata?: Record<string, string> | undefined;\n /** Payment behavior */\n paymentBehavior?: \"default_incomplete\" | \"error_if_incomplete\" | \"allow_incomplete\" | undefined;\n}\n\n/**\n * Update subscription options\n */\nexport interface UpdateSubscriptionOptions {\n /** New price ID */\n priceId?: string | undefined;\n /** Cancel at period end */\n cancelAtPeriodEnd?: boolean | undefined;\n /** Custom metadata */\n metadata?: Record<string, string> | undefined;\n /** Proration behavior */\n prorationBehavior?: \"create_prorations\" | \"none\" | \"always_invoice\" | undefined;\n}\n\n// ============================================================================\n// Payments & Invoices\n// ============================================================================\n\n/**\n * Payment intent\n */\nexport interface PaymentIntent {\n /** Provider payment ID */\n id: string;\n /** Amount */\n amount: number;\n /** Currency */\n currency: CurrencyCode;\n /** Status */\n status: PaymentStatus;\n /** Customer ID */\n customerId?: string | undefined;\n /** Provider-specific data */\n providerData?: unknown;\n}\n\n/**\n * Invoice\n */\nexport interface Invoice {\n /** Provider invoice ID */\n id: string;\n /** Customer ID */\n customerId: string;\n /** Subscription ID */\n subscriptionId?: string | undefined;\n /** Status */\n status: \"draft\" | \"open\" | \"paid\" | \"void\" | \"uncollectible\";\n /** Amount due */\n amountDue: number;\n /** Amount paid */\n amountPaid: number;\n /** Currency */\n currency: CurrencyCode;\n /** Invoice URL */\n hostedInvoiceUrl?: string | undefined;\n /** PDF URL */\n invoicePdf?: string | undefined;\n /** Due date */\n dueDate?: Date | undefined;\n /** Provider-specific data */\n providerData?: unknown;\n}\n\n// ============================================================================\n// Portal\n// ============================================================================\n\n/**\n * Customer portal session\n */\nexport interface PortalSession {\n /** Portal URL */\n url: string;\n /** Return URL */\n returnUrl: string;\n}\n\n/**\n * Create portal options\n */\nexport interface CreatePortalOptions {\n /** Customer ID */\n customerId: string;\n /** Return URL */\n returnUrl: string;\n}\n\n// ============================================================================\n// Webhooks\n// ============================================================================\n\n/**\n * Webhook event types\n */\nexport type WebhookEventType =\n // Checkout\n | \"checkout.session.completed\"\n | \"checkout.session.expired\"\n // Customer\n | \"customer.created\"\n | \"customer.updated\"\n | \"customer.deleted\"\n // Subscription\n | \"subscription.created\"\n | \"subscription.updated\"\n | \"subscription.deleted\"\n | \"subscription.trial_will_end\"\n // Payment\n | \"payment.succeeded\"\n | \"payment.failed\"\n // Invoice\n | \"invoice.created\"\n | \"invoice.paid\"\n | \"invoice.payment_failed\"\n | \"invoice.upcoming\"\n // Refund\n | \"refund.created\"\n | \"refund.updated\";\n\n/**\n * Webhook event\n */\nexport interface WebhookEvent<T = unknown> {\n /** Event ID */\n id: string;\n /** Event type */\n type: WebhookEventType;\n /** Event data */\n data: T;\n /** Created timestamp */\n created: Date;\n /** Provider type */\n provider: PaymentProviderType;\n /** Raw event data */\n raw: unknown;\n}\n\n/**\n * Webhook handler\n */\nexport type WebhookHandler<T = unknown> = (\n event: WebhookEvent<T>\n) => void | Promise<void>;\n\n// ============================================================================\n// Provider Interface\n// ============================================================================\n\n/**\n * Payment provider interface\n */\nexport interface PaymentProvider {\n /** Provider type */\n readonly type: PaymentProviderType;\n\n // Customer\n createCustomer(options: CreateCustomerOptions): Promise<Customer>;\n getCustomer(customerId: string): Promise<Customer | null>;\n updateCustomer(customerId: string, options: Partial<CreateCustomerOptions>): Promise<Customer>;\n deleteCustomer(customerId: string): Promise<void>;\n\n // Checkout\n createCheckout(options: CreateCheckoutOptions): Promise<CheckoutSession>;\n getCheckout(sessionId: string): Promise<CheckoutSession | null>;\n\n // Subscriptions\n createSubscription(options: CreateSubscriptionOptions): Promise<Subscription>;\n getSubscription(subscriptionId: string): Promise<Subscription | null>;\n updateSubscription(subscriptionId: string, options: UpdateSubscriptionOptions): Promise<Subscription>;\n cancelSubscription(subscriptionId: string, cancelAtPeriodEnd?: boolean): Promise<Subscription>;\n listSubscriptions(customerId: string): Promise<Subscription[]>;\n\n // Portal\n createPortalSession(options: CreatePortalOptions): Promise<PortalSession>;\n\n // Webhooks\n verifyWebhook(payload: string | Uint8Array, signature: string): Promise<WebhookEvent | null>;\n\n // Products & Prices (optional)\n getProduct?(productId: string): Promise<Product | null>;\n getPrice?(priceId: string): Promise<Price | null>;\n listPrices?(productId?: string): Promise<Price[]>;\n}\n\n// ============================================================================\n// Provider Config\n// ============================================================================\n\n/**\n * Stripe provider config\n */\nexport interface StripeProviderConfig {\n /** Stripe secret key */\n secretKey: string;\n /** Webhook signing secret */\n webhookSecret?: string | undefined;\n /** API version */\n apiVersion?: string | undefined;\n}\n\n/**\n * Paddle provider config\n */\nexport interface PaddleProviderConfig {\n /** Paddle API key */\n apiKey: string;\n /** Paddle environment */\n environment?: \"sandbox\" | \"production\" | undefined;\n /** Webhook secret key */\n webhookSecret?: string | undefined;\n /** Seller ID */\n sellerId?: string | undefined;\n}\n\n// ============================================================================\n// Service Config\n// ============================================================================\n\n/**\n * Payment service config\n */\nexport interface PaymentServiceConfig {\n /** Payment provider */\n provider: PaymentProvider;\n /** Enable debug logging */\n debug?: boolean | undefined;\n}\n\n// ============================================================================\n// Errors\n// ============================================================================\n\n/**\n * Payment error\n */\nexport class PaymentError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = \"PaymentError\";\n }\n}\n\n/**\n * Common payment error codes\n */\nexport const PaymentErrorCodes = {\n INVALID_CONFIG: \"INVALID_CONFIG\",\n CUSTOMER_NOT_FOUND: \"CUSTOMER_NOT_FOUND\",\n SUBSCRIPTION_NOT_FOUND: \"SUBSCRIPTION_NOT_FOUND\",\n CHECKOUT_FAILED: \"CHECKOUT_FAILED\",\n PAYMENT_FAILED: \"PAYMENT_FAILED\",\n WEBHOOK_VERIFICATION_FAILED: \"WEBHOOK_VERIFICATION_FAILED\",\n API_ERROR: \"API_ERROR\",\n RATE_LIMITED: \"RATE_LIMITED\",\n} as const;\n","/**\n * @parsrun/payments - Fallback Executor\n * Handles provider fallback with safety controls\n */\n\nimport type { PaymentProvider, PaymentProviderType } from \"../types.js\";\nimport { PaymentErrorCodes } from \"../types.js\";\nimport type {\n FallbackConfig,\n FallbackOperation,\n FallbackContext,\n BillingLogger,\n} from \"./types.js\";\nimport { BillingError } from \"./types.js\";\n\n/**\n * Default retryable error codes\n */\nconst DEFAULT_RETRYABLE_ERRORS = [\n PaymentErrorCodes.API_ERROR,\n PaymentErrorCodes.RATE_LIMITED,\n \"PROVIDER_UNAVAILABLE\",\n \"ECONNREFUSED\",\n \"ETIMEDOUT\",\n \"ENOTFOUND\",\n \"NetworkError\",\n \"fetch failed\",\n];\n\n/**\n * Default allowed operations for fallback\n * Only checkout is safe by default - subscriptions can cause issues\n */\nconst DEFAULT_ALLOWED_OPERATIONS: FallbackOperation[] = [\"createCheckout\"];\n\n/**\n * Internal config type with required fields\n */\ninterface InternalFallbackConfig {\n enabled: boolean;\n maxAttempts: number;\n allowedOperations: FallbackOperation[];\n retryableErrors: string[];\n providers: PaymentProvider[] | undefined;\n onFallback: ((context: FallbackContext) => void | Promise<void>) | undefined;\n onAllFailed: ((context: FallbackContext) => void | Promise<void>) | undefined;\n}\n\n/**\n * Fallback Executor\n * Handles provider fallback with safety controls and logging\n */\nexport class FallbackExecutor {\n private readonly config: InternalFallbackConfig;\n private readonly logger: BillingLogger | undefined;\n\n constructor(config: FallbackConfig, logger?: BillingLogger) {\n this.config = {\n enabled: config.enabled,\n maxAttempts: config.maxAttempts ?? 1,\n allowedOperations: config.allowedOperations ?? DEFAULT_ALLOWED_OPERATIONS,\n retryableErrors: config.retryableErrors ?? DEFAULT_RETRYABLE_ERRORS,\n providers: config.providers,\n onFallback: config.onFallback,\n onAllFailed: config.onAllFailed,\n };\n this.logger = logger;\n }\n\n /**\n * Check if fallback is enabled\n */\n get isEnabled(): boolean {\n return this.config.enabled;\n }\n\n /**\n * Execute operation with fallback support\n *\n * @param operation - Operation name for safety checks\n * @param primaryProvider - Primary provider to try first\n * @param fallbackProviders - Fallback providers in order of preference\n * @param execute - Function that executes the operation on a provider\n */\n async execute<T>(\n operation: FallbackOperation,\n primaryProvider: PaymentProvider,\n fallbackProviders: PaymentProvider[],\n execute: (provider: PaymentProvider) => Promise<T>\n ): Promise<{ result: T; provider: PaymentProvider; usedFallback: boolean }> {\n // Check if fallback is enabled for this operation\n const canFallback = this.canFallback(operation);\n\n let lastError: Error | undefined;\n let attempt = 0;\n\n // Build provider list: primary + fallbacks\n const providers = [primaryProvider];\n if (canFallback) {\n for (const fb of fallbackProviders) {\n if (fb !== primaryProvider && providers.length <= this.config.maxAttempts) {\n providers.push(fb);\n }\n }\n }\n\n // Try each provider\n for (const provider of providers) {\n attempt++;\n const isUsingFallback = provider !== primaryProvider;\n\n try {\n this.logger?.debug(`Attempting ${operation}`, {\n provider: provider.type,\n attempt,\n isUsingFallback,\n });\n\n const result = await execute(provider);\n\n if (isUsingFallback) {\n this.logger?.info(`Fallback succeeded`, {\n operation,\n provider: provider.type,\n originalProvider: primaryProvider.type,\n });\n }\n\n return {\n result,\n provider,\n usedFallback: isUsingFallback,\n };\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n this.logger?.warn(`Provider ${provider.type} failed`, {\n operation,\n error: lastError.message,\n attempt,\n maxAttempts: providers.length,\n });\n\n // Check if we should try fallback\n if (\n isUsingFallback ||\n !canFallback ||\n attempt >= providers.length ||\n !this.isRetryableError(lastError)\n ) {\n // If this is the last attempt or not retryable, we'll throw\n if (attempt >= providers.length) {\n // Notify all failed callback\n if (this.config.onAllFailed) {\n await this.notifyAllFailed(\n operation,\n primaryProvider.type,\n lastError,\n attempt\n );\n }\n break;\n }\n continue;\n }\n\n // Notify fallback callback before trying next provider\n if (this.config.onFallback && attempt < providers.length) {\n const nextProvider = providers[attempt];\n if (nextProvider) {\n await this.notifyFallback(\n operation,\n primaryProvider.type,\n nextProvider.type,\n lastError,\n attempt,\n providers.length\n );\n }\n }\n }\n }\n\n // All providers failed\n throw new BillingError(\n `All providers failed for ${operation}: ${lastError?.message}`,\n \"ALL_PROVIDERS_FAILED\",\n primaryProvider.type,\n lastError\n );\n }\n\n /**\n * Check if fallback is allowed for operation\n */\n canFallback(operation: FallbackOperation): boolean {\n if (!this.config.enabled) {\n return false;\n }\n\n return this.config.allowedOperations.includes(operation);\n }\n\n /**\n * Check if error is retryable\n */\n isRetryableError(error: Error): boolean {\n const errorCode = (error as { code?: string }).code;\n const errorMessage = error.message;\n\n for (const retryable of this.config.retryableErrors) {\n if (errorCode === retryable) return true;\n if (errorMessage.includes(retryable)) return true;\n }\n\n return false;\n }\n\n /**\n * Notify fallback callback\n */\n private async notifyFallback(\n operation: FallbackOperation,\n originalProvider: PaymentProviderType,\n fallbackProvider: PaymentProviderType,\n error: Error,\n attempt: number,\n totalAttempts: number\n ): Promise<void> {\n if (!this.config.onFallback) return;\n\n const context: FallbackContext = {\n operation,\n originalProvider,\n fallbackProvider,\n error,\n attempt,\n totalAttempts,\n allFailed: false,\n };\n\n try {\n await this.config.onFallback(context);\n } catch (callbackError) {\n this.logger?.error(\"Fallback callback failed\", {\n error: callbackError instanceof Error ? callbackError.message : String(callbackError),\n });\n }\n }\n\n /**\n * Notify all failed callback\n */\n private async notifyAllFailed(\n operation: FallbackOperation,\n originalProvider: PaymentProviderType,\n error: Error,\n totalAttempts: number\n ): Promise<void> {\n if (!this.config.onAllFailed) return;\n\n const context: FallbackContext = {\n operation,\n originalProvider,\n // fallbackProvider is omitted when all failed (undefined not allowed in type)\n error,\n attempt: totalAttempts,\n totalAttempts,\n allFailed: true,\n };\n\n try {\n await this.config.onAllFailed(context);\n } catch (callbackError) {\n this.logger?.error(\"All-failed callback failed\", {\n error: callbackError instanceof Error ? callbackError.message : String(callbackError),\n });\n }\n }\n}\n\n/**\n * Create a disabled fallback executor (default behavior)\n */\nexport function createDisabledFallback(): FallbackExecutor {\n return new FallbackExecutor({ enabled: false });\n}\n\n/**\n * Create fallback executor\n */\nexport function createFallbackExecutor(\n config: FallbackConfig,\n logger?: BillingLogger\n): FallbackExecutor {\n return new FallbackExecutor(config, logger);\n}\n","/**\n * @parsrun/payments - Billing Service\n * High-level billing API with multi-provider support\n */\n\nimport type {\n PaymentProvider,\n PaymentProviderType,\n WebhookEventType,\n WebhookHandler,\n} from \"../types.js\";\nimport {\n WebhookHandlerRegistry,\n WebhookProcessor,\n} from \"../webhooks/index.js\";\nimport type { WebhookProcessResult } from \"../webhooks/index.js\";\nimport { ProviderStrategy } from \"./provider-strategy.js\";\nimport { FallbackExecutor, createDisabledFallback } from \"./fallback-executor.js\";\nimport type {\n BillingServiceConfig,\n BillingRegion,\n RegionDetectionContext,\n SubscribeOptions,\n SubscribeResult,\n CancelOptions,\n CancelResult,\n GetSubscriptionOptions,\n BillingSubscription,\n BillingCustomer,\n ProviderSelection,\n BillingLogger,\n} from \"./types.js\";\nimport { BillingError } from \"./types.js\";\n\n/**\n * Console logger (default)\n */\nconst consoleLogger: BillingLogger = {\n debug: (msg, ctx) => console.debug(`[Billing] ${msg}`, ctx ?? \"\"),\n info: (msg, ctx) => console.info(`[Billing] ${msg}`, ctx ?? \"\"),\n warn: (msg, ctx) => console.warn(`[Billing] ${msg}`, ctx ?? \"\"),\n error: (msg, ctx) => console.error(`[Billing] ${msg}`, ctx ?? \"\"),\n};\n\n/**\n * Null logger (disabled)\n */\nconst nullLogger: BillingLogger = {\n debug: () => {},\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\n/**\n * Billing Service\n *\n * High-level billing API with:\n * - Multi-provider support (Stripe, Paddle, iyzico)\n * - Region-based provider routing\n * - Optional fallback mechanism\n * - Unified webhook handling\n *\n * @example Basic usage\n * ```typescript\n * const billing = createBillingService({\n * providers: {\n * default: stripeProvider,\n * regions: {\n * TR: iyzicoProvider,\n * EU: stripeProvider,\n * },\n * },\n * });\n *\n * // Subscribe a customer\n * const result = await billing.subscribe({\n * email: \"user@example.com\",\n * planId: \"price_xxx\",\n * successUrl: \"https://app.com/success\",\n * cancelUrl: \"https://app.com/cancel\",\n * countryCode: \"TR\", // Will use iyzico\n * });\n *\n * // Redirect to checkout\n * redirect(result.checkoutUrl);\n * ```\n *\n * @example With fallback (opt-in)\n * ```typescript\n * const billing = createBillingService({\n * providers: {\n * default: stripeProvider,\n * regions: { TR: iyzicoProvider },\n * },\n * fallback: {\n * enabled: true, // WARNING: Enable with caution\n * allowedOperations: [\"createCheckout\"],\n * maxAttempts: 1,\n * onFallback: (ctx) => {\n * logger.warn(\"Payment fallback triggered\", ctx);\n * },\n * },\n * });\n * ```\n */\nexport class BillingService {\n private readonly strategy: ProviderStrategy;\n private readonly fallback: FallbackExecutor;\n private readonly webhookRegistry: WebhookHandlerRegistry;\n private readonly webhookProcessors: Map<PaymentProviderType, WebhookProcessor>;\n private readonly logger: BillingLogger;\n private readonly tenantId: string | undefined;\n private readonly debug: boolean;\n\n constructor(config: BillingServiceConfig) {\n this.debug = config.debug ?? false;\n this.logger = config.logger ?? (this.debug ? consoleLogger : nullLogger);\n this.tenantId = config.tenantId;\n\n // Initialize provider strategy\n this.strategy = new ProviderStrategy(config.providers, this.logger);\n\n // Initialize fallback executor\n this.fallback = config.fallback\n ? new FallbackExecutor(config.fallback, this.logger)\n : createDisabledFallback();\n\n // Initialize webhook handling\n this.webhookRegistry = new WebhookHandlerRegistry();\n this.webhookProcessors = new Map();\n\n // Create webhook processor for each provider\n for (const provider of this.strategy.getAllProviders()) {\n const processor = new WebhookProcessor(provider, this.webhookRegistry);\n this.webhookProcessors.set(provider.type, processor);\n }\n\n this.logger.info(\"BillingService initialized\", {\n providers: this.strategy.getAllProviders().map((p) => p.type),\n regions: this.strategy.getSupportedRegions(),\n fallbackEnabled: this.fallback.isEnabled,\n });\n }\n\n // ============================================================================\n // High-Level API\n // ============================================================================\n\n /**\n * Subscribe a customer to a plan\n *\n * This is the recommended way to handle subscriptions:\n * 1. Creates or retrieves customer\n * 2. Selects provider based on region\n * 3. Creates checkout session\n * 4. Returns checkout URL for redirect\n *\n * @example\n * ```typescript\n * const { checkoutUrl } = await billing.subscribe({\n * email: \"user@example.com\",\n * planId: \"price_monthly\",\n * successUrl: \"https://app.com/success\",\n * cancelUrl: \"https://app.com/cancel\",\n * countryCode: \"TR\",\n * });\n * redirect(checkoutUrl);\n * ```\n */\n async subscribe(options: SubscribeOptions): Promise<SubscribeResult> {\n const context: RegionDetectionContext = {\n email: options.email,\n countryCode: options.countryCode,\n customerId: options.customerId,\n };\n\n // Select provider\n const selection = await this.strategy.selectProvider(\n context,\n options.forceProvider\n );\n\n this.logger.info(\"Starting subscription\", {\n email: options.email,\n planId: options.planId,\n provider: selection.type,\n region: selection.region,\n });\n\n // Get or create customer\n let customerId = options.customerId;\n if (!customerId) {\n const customer = await this.executeWithFallback(\n \"createCustomer\",\n selection,\n async (provider) => {\n return provider.createCustomer({\n email: options.email,\n name: options.name,\n metadata: {\n ...options.metadata,\n region: selection.region,\n ...(this.tenantId && { tenantId: this.tenantId }),\n },\n });\n }\n );\n customerId = customer.id;\n }\n\n // Create checkout session\n const checkout = await this.executeWithFallback(\n \"createCheckout\",\n selection,\n async (provider) => {\n return provider.createCheckout({\n customerId,\n customerEmail: options.email,\n lineItems: [{ priceId: options.planId, quantity: 1 }],\n successUrl: options.successUrl,\n cancelUrl: options.cancelUrl,\n mode: \"subscription\",\n trialDays: options.trialDays,\n metadata: {\n ...options.metadata,\n region: selection.region,\n ...(this.tenantId && { tenantId: this.tenantId }),\n },\n });\n }\n );\n\n return {\n checkoutUrl: checkout.url,\n sessionId: checkout.id,\n customerId: customerId!,\n provider: selection.type,\n region: selection.region,\n };\n }\n\n /**\n * Cancel a subscription\n *\n * @example\n * ```typescript\n * const result = await billing.cancel({\n * subscriptionId: \"sub_xxx\",\n * immediate: false, // Cancel at period end\n * });\n * ```\n */\n async cancel(options: CancelOptions): Promise<CancelResult> {\n // Find the provider that owns this subscription\n const provider = options.provider\n ? this.strategy.getProviderByType(options.provider)\n : await this.findSubscriptionProvider(options.subscriptionId);\n\n if (!provider) {\n throw new BillingError(\n `Cannot find provider for subscription: ${options.subscriptionId}`,\n \"SUBSCRIPTION_NOT_FOUND\"\n );\n }\n\n this.logger.info(\"Canceling subscription\", {\n subscriptionId: options.subscriptionId,\n provider: provider.type,\n immediate: options.immediate,\n });\n\n const subscription = await provider.cancelSubscription(\n options.subscriptionId,\n !options.immediate // cancelAtPeriodEnd = !immediate\n );\n\n return {\n subscriptionId: subscription.id,\n status: subscription.status,\n endsAt: subscription.cancelAtPeriodEnd\n ? subscription.currentPeriodEnd\n : new Date(),\n provider: provider.type,\n };\n }\n\n /**\n * Get subscription(s) for a customer\n *\n * @example\n * ```typescript\n * // Get by customer ID\n * const subs = await billing.getSubscriptions({ customerId: \"cus_xxx\" });\n *\n * // Get specific subscription\n * const sub = await billing.getSubscription({ subscriptionId: \"sub_xxx\" });\n * ```\n */\n async getSubscriptions(\n options: GetSubscriptionOptions\n ): Promise<BillingSubscription[]> {\n const results: BillingSubscription[] = [];\n\n // If specific subscription ID provided\n if (options.subscriptionId) {\n const sub = await this.getSubscription(options);\n if (sub) results.push(sub);\n return results;\n }\n\n // Search across providers\n const providers = options.provider\n ? [this.strategy.getProviderByType(options.provider)].filter(Boolean)\n : this.strategy.getAllProviders();\n\n for (const provider of providers) {\n if (!provider) continue;\n\n try {\n if (options.customerId) {\n const subs = await provider.listSubscriptions(options.customerId);\n for (const sub of subs) {\n results.push({ ...sub, provider: provider.type });\n }\n }\n } catch (error) {\n this.logger.warn(`Failed to get subscriptions from ${provider.type}`, {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return results;\n }\n\n /**\n * Get a single subscription\n */\n async getSubscription(\n options: GetSubscriptionOptions\n ): Promise<BillingSubscription | null> {\n if (!options.subscriptionId) {\n const subs = await this.getSubscriptions(options);\n return subs[0] ?? null;\n }\n\n // Search across providers for the subscription\n const providers = options.provider\n ? [this.strategy.getProviderByType(options.provider)].filter(Boolean)\n : this.strategy.getAllProviders();\n\n for (const provider of providers) {\n if (!provider) continue;\n\n try {\n const sub = await provider.getSubscription(options.subscriptionId);\n if (sub) {\n return { ...sub, provider: provider.type };\n }\n } catch {\n // Continue to next provider\n }\n }\n\n return null;\n }\n\n /**\n * Get customer by ID\n */\n async getCustomer(\n customerId: string,\n provider?: PaymentProviderType\n ): Promise<BillingCustomer | null> {\n const providers = provider\n ? [this.strategy.getProviderByType(provider)].filter(Boolean)\n : this.strategy.getAllProviders();\n\n for (const p of providers) {\n if (!p) continue;\n\n try {\n const customer = await p.getCustomer(customerId);\n if (customer) {\n return { ...customer, provider: p.type };\n }\n } catch {\n // Continue to next provider\n }\n }\n\n return null;\n }\n\n /**\n * Create a customer portal session\n */\n async createPortalSession(\n customerId: string,\n returnUrl: string,\n provider?: PaymentProviderType\n ): Promise<{ url: string; provider: PaymentProviderType }> {\n const p = provider\n ? this.strategy.getProviderByType(provider)\n : await this.findCustomerProvider(customerId);\n\n if (!p) {\n throw new BillingError(\n `Cannot find provider for customer: ${customerId}`,\n \"CUSTOMER_NOT_FOUND\"\n );\n }\n\n const session = await p.createPortalSession({ customerId, returnUrl });\n return { url: session.url, provider: p.type };\n }\n\n // ============================================================================\n // Provider Selection\n // ============================================================================\n\n /**\n * Select provider for a region/context\n */\n async selectProvider(\n context: RegionDetectionContext,\n forceProvider?: PaymentProviderType\n ): Promise<ProviderSelection> {\n return this.strategy.selectProvider(context, forceProvider);\n }\n\n /**\n * Get all configured providers\n */\n getProviders(): PaymentProvider[] {\n return this.strategy.getAllProviders();\n }\n\n /**\n * Get provider by type\n */\n getProvider(type: PaymentProviderType): PaymentProvider | undefined {\n return this.strategy.getProviderByType(type);\n }\n\n /**\n * Get supported regions\n */\n getSupportedRegions(): BillingRegion[] {\n return this.strategy.getSupportedRegions();\n }\n\n // ============================================================================\n // Webhooks\n // ============================================================================\n\n /**\n * Register webhook handler for all providers\n *\n * @example\n * ```typescript\n * billing.onWebhook(\"subscription.created\", async (event) => {\n * console.log(`New subscription from ${event.provider}:`, event.data);\n * });\n *\n * // Handle all events\n * billing.onWebhook(\"*\", async (event) => {\n * await saveToAuditLog(event);\n * });\n * ```\n */\n onWebhook(type: WebhookEventType | \"*\", handler: WebhookHandler): this {\n this.webhookRegistry.on(type, handler);\n return this;\n }\n\n /**\n * Handle webhook request\n *\n * @example\n * ```typescript\n * app.post(\"/webhooks/:provider\", async (c) => {\n * const provider = c.req.param(\"provider\") as PaymentProviderType;\n * const result = await billing.handleWebhook(c.req.raw, provider);\n * return c.json({ received: result.success });\n * });\n * ```\n */\n async handleWebhook(\n request: Request,\n provider: PaymentProviderType\n ): Promise<WebhookProcessResult> {\n const processor = this.webhookProcessors.get(provider);\n if (!processor) {\n this.logger.error(`No webhook processor for provider: ${provider}`);\n return {\n success: false,\n error: `Unknown provider: ${provider}`,\n };\n }\n\n return processor.process(request);\n }\n\n /**\n * Handle raw webhook payload\n */\n async handleWebhookRaw(\n payload: string | Uint8Array,\n signature: string,\n provider: PaymentProviderType\n ): Promise<WebhookProcessResult> {\n const processor = this.webhookProcessors.get(provider);\n if (!processor) {\n return {\n success: false,\n error: `Unknown provider: ${provider}`,\n };\n }\n\n return processor.processRaw(payload, signature);\n }\n\n // ============================================================================\n // Low-Level Provider Access\n // ============================================================================\n\n /**\n * Execute operation on specific provider\n *\n * Use this for advanced operations not covered by high-level API\n *\n * @example\n * ```typescript\n * const prices = await billing.withProvider(\"stripe\", async (provider) => {\n * return provider.listPrices?.(\"prod_xxx\") ?? [];\n * });\n * ```\n */\n async withProvider<T>(\n type: PaymentProviderType,\n operation: (provider: PaymentProvider) => Promise<T>\n ): Promise<T> {\n const provider = this.strategy.getProviderByType(type);\n if (!provider) {\n throw new BillingError(\n `Provider not configured: ${type}`,\n \"NO_PROVIDER_CONFIGURED\",\n type\n );\n }\n return operation(provider);\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n /**\n * Execute operation with fallback support\n */\n private async executeWithFallback<T>(\n operation: \"createCustomer\" | \"createCheckout\" | \"createSubscription\" | \"createPayment\",\n selection: ProviderSelection,\n execute: (provider: PaymentProvider) => Promise<T>\n ): Promise<T> {\n // Get fallback providers (exclude primary)\n const fallbackProviders = this.strategy\n .getAllProviders()\n .filter((p) => p !== selection.provider);\n\n const result = await this.fallback.execute(\n operation,\n selection.provider,\n fallbackProviders,\n execute\n );\n\n if (result.usedFallback) {\n this.logger.warn(`Operation used fallback provider`, {\n operation,\n original: selection.type,\n fallback: result.provider.type,\n });\n }\n\n return result.result;\n }\n\n /**\n * Find which provider owns a subscription\n */\n private async findSubscriptionProvider(\n subscriptionId: string\n ): Promise<PaymentProvider | undefined> {\n for (const provider of this.strategy.getAllProviders()) {\n try {\n const sub = await provider.getSubscription(subscriptionId);\n if (sub) return provider;\n } catch {\n // Continue searching\n }\n }\n return undefined;\n }\n\n /**\n * Find which provider owns a customer\n */\n private async findCustomerProvider(\n customerId: string\n ): Promise<PaymentProvider | undefined> {\n for (const provider of this.strategy.getAllProviders()) {\n try {\n const customer = await provider.getCustomer(customerId);\n if (customer) return provider;\n } catch {\n // Continue searching\n }\n }\n return undefined;\n }\n}\n\n/**\n * Create billing service\n *\n * @example\n * ```typescript\n * import { createBillingService, createStripeProvider, createIyzicoProvider } from \"@parsrun/payments\";\n *\n * const stripeProvider = createStripeProvider({\n * secretKey: process.env.STRIPE_SECRET_KEY!,\n * webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,\n * });\n *\n * const iyzicoProvider = createIyzicoProvider({\n * apiKey: process.env.IYZICO_API_KEY!,\n * secretKey: process.env.IYZICO_SECRET_KEY!,\n * baseUrl: \"https://api.iyzipay.com\",\n * });\n *\n * const billing = createBillingService({\n * providers: {\n * default: stripeProvider,\n * regions: {\n * TR: iyzicoProvider,\n * EU: stripeProvider,\n * US: stripeProvider,\n * },\n * },\n * fallback: {\n * enabled: false, // Disabled by default - enable with caution!\n * },\n * debug: process.env.NODE_ENV === \"development\",\n * });\n *\n * export { billing };\n * ```\n */\nexport function createBillingService(config: BillingServiceConfig): BillingService {\n return new BillingService(config);\n}\n"],"mappings":"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","names":["type","type","subscription","type"]}
|