@parsrun/service-adapters 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/payments/definition.ts","../../src/payments/server.ts","../../src/payments/client.ts"],"sourcesContent":["/**\n * @parsrun/service-adapters - Payments Service Definition\n */\n\nimport { defineService } from \"@parsrun/service\";\n\n/**\n * Payments Service Definition\n *\n * Provides payment processing, billing, usage tracking,\n * and dunning capabilities as a microservice.\n */\nexport const paymentsServiceDefinition = defineService({\n name: \"payments\",\n version: \"1.0.0\",\n description: \"Payments, billing, and subscription management microservice\",\n\n queries: {\n /**\n * Get subscription details\n */\n getSubscription: {\n input: undefined as unknown as {\n subscriptionId?: string;\n customerId?: string;\n },\n output: undefined as unknown as {\n id: string;\n customerId: string;\n status: \"active\" | \"canceled\" | \"past_due\" | \"trialing\" | \"paused\";\n planId: string;\n planName: string;\n currentPeriodStart: string;\n currentPeriodEnd: string;\n cancelAtPeriodEnd: boolean;\n provider: string;\n } | null,\n description: \"Get subscription details by ID or customer ID\",\n },\n\n /**\n * Get customer details\n */\n getCustomer: {\n input: undefined as unknown as { customerId: string },\n output: undefined as unknown as {\n id: string;\n email: string;\n name?: string;\n metadata?: Record<string, unknown>;\n provider: string;\n } | null,\n description: \"Get customer details\",\n },\n\n /**\n * Check quota status\n */\n checkQuota: {\n input: undefined as unknown as {\n customerId: string;\n featureKey: string;\n },\n output: undefined as unknown as {\n allowed: boolean;\n remaining: number | null;\n limit: number | null;\n resetAt?: string;\n percentage: number;\n },\n description: \"Check if customer has quota for a feature\",\n },\n\n /**\n * Get usage summary\n */\n getUsage: {\n input: undefined as unknown as {\n customerId: string;\n featureKey?: string;\n period?: \"hour\" | \"day\" | \"month\";\n },\n output: undefined as unknown as {\n features: Array<{\n featureKey: string;\n used: number;\n limit: number | null;\n percentage: number;\n }>;\n period: {\n start: string;\n end: string;\n };\n },\n description: \"Get usage summary for a customer\",\n },\n\n /**\n * Get available plans\n */\n getPlans: {\n input: undefined,\n output: undefined as unknown as {\n plans: Array<{\n id: string;\n name: string;\n displayName: string;\n tier: number;\n basePrice: number;\n currency: string;\n billingInterval: \"month\" | \"year\";\n features: Array<{\n featureKey: string;\n limitValue: number | null;\n limitPeriod: string | null;\n }>;\n }>;\n },\n description: \"Get available subscription plans\",\n },\n\n /**\n * Get dunning status\n */\n getDunningStatus: {\n input: undefined as unknown as { customerId: string },\n output: undefined as unknown as {\n inDunning: boolean;\n status?: \"active\" | \"resolved\" | \"abandoned\" | \"recovered\";\n currentStep?: number;\n totalSteps?: number;\n nextActionAt?: string;\n daysSinceFailure?: number;\n },\n description: \"Get dunning status for a customer\",\n },\n },\n\n mutations: {\n /**\n * Create a checkout session\n */\n createCheckout: {\n input: undefined as unknown as {\n email: string;\n planId: string;\n successUrl: string;\n cancelUrl: string;\n countryCode?: string;\n metadata?: Record<string, unknown>;\n },\n output: undefined as unknown as {\n checkoutUrl: string;\n sessionId: string;\n customerId?: string;\n provider: string;\n },\n description: \"Create a checkout session for subscription\",\n },\n\n /**\n * Cancel a subscription\n */\n cancelSubscription: {\n input: undefined as unknown as {\n subscriptionId: string;\n cancelAtPeriodEnd?: boolean;\n reason?: string;\n },\n output: undefined as unknown as {\n success: boolean;\n canceledAt?: string;\n effectiveAt?: string;\n },\n description: \"Cancel a subscription\",\n },\n\n /**\n * Update subscription\n */\n updateSubscription: {\n input: undefined as unknown as {\n subscriptionId: string;\n planId?: string;\n metadata?: Record<string, unknown>;\n },\n output: undefined as unknown as {\n success: boolean;\n subscription: {\n id: string;\n planId: string;\n status: string;\n };\n },\n description: \"Update a subscription (e.g., change plan)\",\n },\n\n /**\n * Create customer portal session\n */\n createPortalSession: {\n input: undefined as unknown as {\n customerId: string;\n returnUrl: string;\n },\n output: undefined as unknown as {\n portalUrl: string;\n expiresAt?: string;\n },\n description: \"Create a customer portal session for self-service\",\n },\n\n /**\n * Track usage\n */\n trackUsage: {\n input: undefined as unknown as {\n customerId: string;\n featureKey: string;\n quantity: number;\n metadata?: Record<string, unknown>;\n },\n output: undefined as unknown as {\n success: boolean;\n newTotal: number;\n remaining: number | null;\n },\n description: \"Track usage of a metered feature\",\n },\n\n /**\n * Assign plan to customer\n */\n assignPlan: {\n input: undefined as unknown as {\n customerId: string;\n planId: string;\n expiresAt?: string;\n },\n output: undefined as unknown as {\n success: boolean;\n previousPlanId?: string;\n newPlanId: string;\n },\n description: \"Manually assign a plan to a customer\",\n },\n\n /**\n * Handle webhook\n */\n handleWebhook: {\n input: undefined as unknown as {\n provider: \"stripe\" | \"paddle\" | \"iyzico\";\n payload: string;\n signature: string;\n },\n output: undefined as unknown as {\n success: boolean;\n eventType?: string;\n eventId?: string;\n },\n description: \"Handle payment provider webhook\",\n },\n },\n\n events: {\n emits: {\n /**\n * Subscription was created\n */\n \"subscription.created\": {\n data: undefined as unknown as {\n subscriptionId: string;\n customerId: string;\n planId: string;\n provider: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"A new subscription was created\",\n },\n\n /**\n * Subscription was renewed\n */\n \"subscription.renewed\": {\n data: undefined as unknown as {\n subscriptionId: string;\n customerId: string;\n planId: string;\n periodStart: string;\n periodEnd: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Subscription was renewed for a new period\",\n },\n\n /**\n * Subscription was canceled\n */\n \"subscription.canceled\": {\n data: undefined as unknown as {\n subscriptionId: string;\n customerId: string;\n reason?: string;\n effectiveAt: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Subscription was canceled\",\n },\n\n /**\n * Subscription plan changed\n */\n \"subscription.plan_changed\": {\n data: undefined as unknown as {\n subscriptionId: string;\n customerId: string;\n previousPlanId: string;\n newPlanId: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Subscription plan was changed\",\n },\n\n /**\n * Payment succeeded\n */\n \"payment.succeeded\": {\n data: undefined as unknown as {\n paymentId: string;\n customerId: string;\n amount: number;\n currency: string;\n invoiceId?: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Payment was successful\",\n },\n\n /**\n * Payment failed\n */\n \"payment.failed\": {\n data: undefined as unknown as {\n customerId: string;\n subscriptionId?: string;\n amount: number;\n currency: string;\n errorCode?: string;\n errorMessage?: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Payment failed\",\n },\n\n /**\n * Quota exceeded\n */\n \"quota.exceeded\": {\n data: undefined as unknown as {\n customerId: string;\n featureKey: string;\n used: number;\n limit: number;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Customer exceeded their quota for a feature\",\n },\n\n /**\n * Quota threshold reached\n */\n \"quota.threshold_reached\": {\n data: undefined as unknown as {\n customerId: string;\n featureKey: string;\n percentage: number;\n used: number;\n limit: number;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Customer reached a usage threshold (e.g., 80%)\",\n },\n\n /**\n * Dunning started\n */\n \"dunning.started\": {\n data: undefined as unknown as {\n customerId: string;\n subscriptionId: string;\n amount: number;\n currency: string;\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Dunning process started for a customer\",\n },\n\n /**\n * Dunning resolved\n */\n \"dunning.resolved\": {\n data: undefined as unknown as {\n customerId: string;\n resolution: \"recovered\" | \"canceled\" | \"manual\";\n timestamp: string;\n },\n delivery: \"at-least-once\",\n description: \"Dunning process was resolved\",\n },\n },\n\n handles: [\n // Events this service listens to\n \"user.created\", // Create customer record\n \"user.deleted\", // Cancel subscriptions\n \"tenant.suspended\", // Pause billing\n ],\n },\n});\n\n/**\n * Type export for the payments service definition\n */\nexport type PaymentsServiceDefinition = typeof paymentsServiceDefinition;\n","/**\n * @parsrun/service-adapters - Payments Service Server\n * Server-side implementation of the Payments microservice\n */\n\nimport type { Logger } from \"@parsrun/core\";\nimport { createLogger } from \"@parsrun/core\";\nimport {\n createRpcServer,\n createEventEmitter,\n createMemoryEventTransport,\n getEmbeddedRegistry,\n type RpcServer,\n type RpcHandlers,\n type EventEmitter,\n} from \"@parsrun/service\";\nimport { paymentsServiceDefinition } from \"./definition.js\";\n\n// ============================================================================\n// PAYMENTS SERVICE SERVER\n// ============================================================================\n\nexport interface PaymentsServiceServerOptions {\n /** Payment provider configurations */\n providers: {\n default: PaymentProviderConfig;\n regions?: Record<string, PaymentProviderConfig>;\n };\n /** Database/storage for usage tracking */\n storage?: PaymentsStorage;\n /** Logger */\n logger?: Logger;\n /** Event transport (for emitting events) */\n eventTransport?: ReturnType<typeof createMemoryEventTransport>;\n}\n\nexport interface PaymentProviderConfig {\n type: \"stripe\" | \"paddle\" | \"iyzico\" | \"mock\";\n secretKey?: string;\n webhookSecret?: string;\n}\n\nexport interface PaymentsStorage {\n // Usage tracking\n getUsage(customerId: string, featureKey: string): Promise<number>;\n trackUsage(customerId: string, featureKey: string, quantity: number): Promise<number>;\n resetUsage(customerId: string, featureKey?: string): Promise<void>;\n\n // Plans\n getPlan(planId: string): Promise<Plan | null>;\n getPlans(): Promise<Plan[]>;\n getCustomerPlan(customerId: string): Promise<string | null>;\n setCustomerPlan(customerId: string, planId: string): Promise<void>;\n}\n\nexport interface Plan {\n id: string;\n name: string;\n displayName: string;\n tier: number;\n basePrice: number;\n currency: string;\n billingInterval: \"month\" | \"year\";\n features: Array<{\n featureKey: string;\n limitValue: number | null;\n limitPeriod: string | null;\n }>;\n}\n\n// In-memory storage for demo\nclass InMemoryPaymentsStorage implements PaymentsStorage {\n private usage: Map<string, number> = new Map();\n private customerPlans: Map<string, string> = new Map();\n private plans: Plan[] = [\n {\n id: \"free\",\n name: \"free\",\n displayName: \"Free\",\n tier: 0,\n basePrice: 0,\n currency: \"USD\",\n billingInterval: \"month\",\n features: [\n { featureKey: \"api_calls\", limitValue: 1000, limitPeriod: \"month\" },\n { featureKey: \"storage_mb\", limitValue: 100, limitPeriod: null },\n ],\n },\n {\n id: \"pro\",\n name: \"pro\",\n displayName: \"Pro\",\n tier: 1,\n basePrice: 2900,\n currency: \"USD\",\n billingInterval: \"month\",\n features: [\n { featureKey: \"api_calls\", limitValue: 100000, limitPeriod: \"month\" },\n { featureKey: \"storage_mb\", limitValue: 10000, limitPeriod: null },\n ],\n },\n {\n id: \"enterprise\",\n name: \"enterprise\",\n displayName: \"Enterprise\",\n tier: 2,\n basePrice: 9900,\n currency: \"USD\",\n billingInterval: \"month\",\n features: [\n { featureKey: \"api_calls\", limitValue: null, limitPeriod: \"month\" },\n { featureKey: \"storage_mb\", limitValue: null, limitPeriod: null },\n ],\n },\n ];\n\n async getUsage(customerId: string, featureKey: string): Promise<number> {\n return this.usage.get(`${customerId}:${featureKey}`) ?? 0;\n }\n\n async trackUsage(customerId: string, featureKey: string, quantity: number): Promise<number> {\n const key = `${customerId}:${featureKey}`;\n const current = this.usage.get(key) ?? 0;\n const newTotal = current + quantity;\n this.usage.set(key, newTotal);\n return newTotal;\n }\n\n async resetUsage(customerId: string, featureKey?: string): Promise<void> {\n if (featureKey) {\n this.usage.delete(`${customerId}:${featureKey}`);\n } else {\n for (const key of this.usage.keys()) {\n if (key.startsWith(`${customerId}:`)) {\n this.usage.delete(key);\n }\n }\n }\n }\n\n async getPlan(planId: string): Promise<Plan | null> {\n return this.plans.find((p) => p.id === planId) ?? null;\n }\n\n async getPlans(): Promise<Plan[]> {\n return this.plans;\n }\n\n async getCustomerPlan(customerId: string): Promise<string | null> {\n return this.customerPlans.get(customerId) ?? \"free\";\n }\n\n async setCustomerPlan(customerId: string, planId: string): Promise<void> {\n this.customerPlans.set(customerId, planId);\n }\n}\n\n/**\n * Create Payments Service Server\n */\nexport function createPaymentsServiceServer(\n options: PaymentsServiceServerOptions\n): {\n rpcServer: RpcServer;\n eventEmitter: EventEmitter;\n register: () => void;\n} {\n const logger = options.logger ?? createLogger({ name: \"payments-service\" });\n const eventTransport = options.eventTransport ?? createMemoryEventTransport();\n const storage = options.storage ?? new InMemoryPaymentsStorage();\n\n // Create event emitter\n const eventEmitter = createEventEmitter({\n service: \"payments\",\n definition: paymentsServiceDefinition,\n transport: eventTransport,\n logger,\n });\n\n // Create handlers\n const handlers: RpcHandlers = {\n queries: {\n getSubscription: async (input, ctx) => {\n const { subscriptionId, customerId } = input as {\n subscriptionId?: string;\n customerId?: string;\n };\n ctx.logger.debug(\"Getting subscription\", { subscriptionId, customerId });\n\n // Mock response\n if (!subscriptionId && !customerId) {\n return null;\n }\n\n return {\n id: subscriptionId ?? `sub_${customerId}`,\n customerId: customerId ?? \"cus_123\",\n status: \"active\",\n planId: \"pro\",\n planName: \"Pro\",\n currentPeriodStart: new Date().toISOString(),\n currentPeriodEnd: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),\n cancelAtPeriodEnd: false,\n provider: options.providers.default.type,\n };\n },\n\n getCustomer: async (input, ctx) => {\n const { customerId } = input as { customerId: string };\n ctx.logger.debug(\"Getting customer\", { customerId });\n\n return {\n id: customerId,\n email: `${customerId}@example.com`,\n name: \"Test Customer\",\n provider: options.providers.default.type,\n };\n },\n\n checkQuota: async (input, ctx) => {\n const { customerId, featureKey } = input as {\n customerId: string;\n featureKey: string;\n };\n ctx.logger.debug(\"Checking quota\", { customerId, featureKey });\n\n const planId = await storage.getCustomerPlan(customerId);\n const plan = planId ? await storage.getPlan(planId) : null;\n const feature = plan?.features.find((f) => f.featureKey === featureKey);\n const used = await storage.getUsage(customerId, featureKey);\n const limit = feature?.limitValue ?? null;\n\n const percentage = limit ? Math.round((used / limit) * 100) : 0;\n const allowed = limit === null || used < limit;\n\n return {\n allowed,\n remaining: limit !== null ? Math.max(0, limit - used) : null,\n limit,\n percentage,\n };\n },\n\n getUsage: async (input, ctx) => {\n const { customerId, featureKey } = input as {\n customerId: string;\n featureKey?: string;\n };\n ctx.logger.debug(\"Getting usage\", { customerId, featureKey });\n\n const planId = await storage.getCustomerPlan(customerId);\n const plan = planId ? await storage.getPlan(planId) : null;\n\n const features = [];\n const featuresToCheck = featureKey\n ? plan?.features.filter((f) => f.featureKey === featureKey) ?? []\n : plan?.features ?? [];\n\n for (const f of featuresToCheck) {\n const used = await storage.getUsage(customerId, f.featureKey);\n features.push({\n featureKey: f.featureKey,\n used,\n limit: f.limitValue,\n percentage: f.limitValue ? Math.round((used / f.limitValue) * 100) : 0,\n });\n }\n\n return {\n features,\n period: {\n start: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(),\n end: new Date().toISOString(),\n },\n };\n },\n\n getPlans: async (_input, ctx) => {\n ctx.logger.debug(\"Getting plans\");\n const plans = await storage.getPlans();\n return { plans };\n },\n\n getDunningStatus: async (input, ctx) => {\n const { customerId } = input as { customerId: string };\n ctx.logger.debug(\"Getting dunning status\", { customerId });\n\n // Mock - no dunning\n return { inDunning: false };\n },\n },\n\n mutations: {\n createCheckout: async (input, ctx) => {\n const { email, planId, successUrl: _successUrl, cancelUrl: _cancelUrl, countryCode } = input as {\n email: string;\n planId: string;\n successUrl: string;\n cancelUrl: string;\n countryCode?: string;\n };\n void _successUrl; void _cancelUrl; // Reserved for real implementation\n ctx.logger.info(\"Creating checkout\", { email, planId, countryCode });\n\n const sessionId = `cs_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const customerId = `cus_${Date.now()}`;\n\n return {\n checkoutUrl: `https://checkout.example.com/${sessionId}`,\n sessionId,\n customerId,\n provider: options.providers.default.type,\n };\n },\n\n cancelSubscription: async (input, ctx) => {\n const { subscriptionId, cancelAtPeriodEnd, reason } = input as {\n subscriptionId: string;\n cancelAtPeriodEnd?: boolean;\n reason?: string;\n };\n ctx.logger.info(\"Canceling subscription\", { subscriptionId, reason });\n\n await eventEmitter.emit(\"subscription.canceled\", {\n subscriptionId,\n customerId: \"cus_123\",\n reason,\n effectiveAt: cancelAtPeriodEnd\n ? new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString()\n : new Date().toISOString(),\n timestamp: new Date().toISOString(),\n });\n\n return {\n success: true,\n canceledAt: new Date().toISOString(),\n effectiveAt: cancelAtPeriodEnd\n ? new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString()\n : new Date().toISOString(),\n };\n },\n\n updateSubscription: async (input, ctx) => {\n const { subscriptionId, planId } = input as {\n subscriptionId: string;\n planId?: string;\n };\n ctx.logger.info(\"Updating subscription\", { subscriptionId, planId });\n\n if (planId) {\n await eventEmitter.emit(\"subscription.plan_changed\", {\n subscriptionId,\n customerId: \"cus_123\",\n previousPlanId: \"pro\",\n newPlanId: planId,\n timestamp: new Date().toISOString(),\n });\n }\n\n return {\n success: true,\n subscription: {\n id: subscriptionId,\n planId: planId ?? \"pro\",\n status: \"active\",\n },\n };\n },\n\n createPortalSession: async (input, ctx) => {\n const { customerId, returnUrl: _returnUrl } = input as {\n customerId: string;\n returnUrl: string;\n };\n void _returnUrl; // Reserved for real implementation\n ctx.logger.info(\"Creating portal session\", { customerId });\n\n return {\n portalUrl: `https://billing.example.com/portal/${customerId}`,\n expiresAt: new Date(Date.now() + 60 * 60 * 1000).toISOString(),\n };\n },\n\n trackUsage: async (input, ctx) => {\n const { customerId, featureKey, quantity } = input as {\n customerId: string;\n featureKey: string;\n quantity: number;\n };\n ctx.logger.debug(\"Tracking usage\", { customerId, featureKey, quantity });\n\n const newTotal = await storage.trackUsage(customerId, featureKey, quantity);\n\n // Check quota\n const planId = await storage.getCustomerPlan(customerId);\n const plan = planId ? await storage.getPlan(planId) : null;\n const feature = plan?.features.find((f) => f.featureKey === featureKey);\n const limit = feature?.limitValue ?? null;\n\n // Emit events if thresholds reached\n if (limit !== null) {\n const percentage = Math.round((newTotal / limit) * 100);\n\n if (percentage >= 100 && newTotal - quantity < limit) {\n await eventEmitter.emit(\"quota.exceeded\", {\n customerId,\n featureKey,\n used: newTotal,\n limit,\n timestamp: new Date().toISOString(),\n });\n } else if (percentage >= 80 && Math.round(((newTotal - quantity) / limit) * 100) < 80) {\n await eventEmitter.emit(\"quota.threshold_reached\", {\n customerId,\n featureKey,\n percentage,\n used: newTotal,\n limit,\n timestamp: new Date().toISOString(),\n });\n }\n }\n\n return {\n success: true,\n newTotal,\n remaining: limit !== null ? Math.max(0, limit - newTotal) : null,\n };\n },\n\n assignPlan: async (input, ctx) => {\n const { customerId, planId } = input as {\n customerId: string;\n planId: string;\n };\n ctx.logger.info(\"Assigning plan\", { customerId, planId });\n\n const previousPlanId = await storage.getCustomerPlan(customerId);\n await storage.setCustomerPlan(customerId, planId);\n\n return {\n success: true,\n previousPlanId: previousPlanId ?? undefined,\n newPlanId: planId,\n };\n },\n\n handleWebhook: async (input, ctx) => {\n const { provider, payload: _payload, signature: _signature } = input as {\n provider: string;\n payload: string;\n signature: string;\n };\n void _payload; void _signature; // Reserved for real webhook verification\n ctx.logger.info(\"Handling webhook\", { provider });\n\n // In real implementation, would verify signature and process event\n return {\n success: true,\n eventType: \"payment.succeeded\",\n eventId: `evt_${Date.now()}`,\n };\n },\n },\n };\n\n // Create RPC server\n const rpcServer = createRpcServer({\n definition: paymentsServiceDefinition,\n handlers,\n logger,\n });\n\n // Register function\n const register = () => {\n const registry = getEmbeddedRegistry();\n registry.register(\"payments\", rpcServer);\n logger.info(\"Payments service registered\");\n };\n\n return {\n rpcServer,\n eventEmitter,\n register,\n };\n}\n","/**\n * @parsrun/service-adapters - Payments Service Client\n * Type-safe client for the Payments microservice\n */\n\nimport {\n useService,\n type ServiceClientOptions,\n} from \"@parsrun/service\";\nimport type { PaymentsServiceDefinition } from \"./definition.js\";\n\n// ============================================================================\n// PAYMENTS SERVICE CLIENT\n// ============================================================================\n\n/**\n * Type-safe Payments Service Client\n */\nexport interface PaymentsServiceClient {\n // ============ Queries ============\n\n /**\n * Get subscription details\n */\n getSubscription(options: {\n subscriptionId?: string;\n customerId?: string;\n }): Promise<Subscription | null>;\n\n /**\n * Get customer details\n */\n getCustomer(customerId: string): Promise<Customer | null>;\n\n /**\n * Check quota for a feature\n */\n checkQuota(\n customerId: string,\n featureKey: string\n ): Promise<QuotaStatus>;\n\n /**\n * Get usage summary\n */\n getUsage(options: {\n customerId: string;\n featureKey?: string;\n period?: \"hour\" | \"day\" | \"month\";\n }): Promise<UsageSummary>;\n\n /**\n * Get available plans\n */\n getPlans(): Promise<{ plans: Plan[] }>;\n\n /**\n * Get dunning status\n */\n getDunningStatus(customerId: string): Promise<DunningStatus>;\n\n // ============ Mutations ============\n\n /**\n * Create checkout session\n */\n createCheckout(options: CreateCheckoutOptions): Promise<CheckoutSession>;\n\n /**\n * Cancel subscription\n */\n cancelSubscription(options: CancelSubscriptionOptions): Promise<CancelResult>;\n\n /**\n * Update subscription\n */\n updateSubscription(options: UpdateSubscriptionOptions): Promise<UpdateResult>;\n\n /**\n * Create customer portal session\n */\n createPortalSession(\n customerId: string,\n returnUrl: string\n ): Promise<PortalSession>;\n\n /**\n * Track usage\n */\n trackUsage(options: TrackUsageOptions): Promise<TrackUsageResult>;\n\n /**\n * Assign plan to customer\n */\n assignPlan(\n customerId: string,\n planId: string,\n expiresAt?: string\n ): Promise<AssignPlanResult>;\n\n /**\n * Handle webhook\n */\n handleWebhook(options: WebhookOptions): Promise<WebhookResult>;\n\n // ============ Events ============\n\n /**\n * Subscribe to subscription events\n */\n onSubscriptionCreated(handler: (event: SubscriptionCreatedEvent) => Promise<void>): () => void;\n onSubscriptionRenewed(handler: (event: SubscriptionRenewedEvent) => Promise<void>): () => void;\n onSubscriptionCanceled(handler: (event: SubscriptionCanceledEvent) => Promise<void>): () => void;\n onSubscriptionPlanChanged(handler: (event: PlanChangedEvent) => Promise<void>): () => void;\n\n /**\n * Subscribe to payment events\n */\n onPaymentSucceeded(handler: (event: PaymentSucceededEvent) => Promise<void>): () => void;\n onPaymentFailed(handler: (event: PaymentFailedEvent) => Promise<void>): () => void;\n\n /**\n * Subscribe to quota events\n */\n onQuotaExceeded(handler: (event: QuotaExceededEvent) => Promise<void>): () => void;\n onQuotaThresholdReached(handler: (event: QuotaThresholdEvent) => Promise<void>): () => void;\n\n /**\n * Subscribe to dunning events\n */\n onDunningStarted(handler: (event: DunningStartedEvent) => Promise<void>): () => void;\n onDunningResolved(handler: (event: DunningResolvedEvent) => Promise<void>): () => void;\n\n /**\n * Close the client\n */\n close(): Promise<void>;\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface Subscription {\n id: string;\n customerId: string;\n status: \"active\" | \"canceled\" | \"past_due\" | \"trialing\" | \"paused\";\n planId: string;\n planName: string;\n currentPeriodStart: string;\n currentPeriodEnd: string;\n cancelAtPeriodEnd: boolean;\n provider: string;\n}\n\nexport interface Customer {\n id: string;\n email: string;\n name?: string;\n metadata?: Record<string, unknown>;\n provider: string;\n}\n\nexport interface QuotaStatus {\n allowed: boolean;\n remaining: number | null;\n limit: number | null;\n resetAt?: string;\n percentage: number;\n}\n\nexport interface UsageSummary {\n features: Array<{\n featureKey: string;\n used: number;\n limit: number | null;\n percentage: number;\n }>;\n period: {\n start: string;\n end: string;\n };\n}\n\nexport interface Plan {\n id: string;\n name: string;\n displayName: string;\n tier: number;\n basePrice: number;\n currency: string;\n billingInterval: \"month\" | \"year\";\n features: Array<{\n featureKey: string;\n limitValue: number | null;\n limitPeriod: string | null;\n }>;\n}\n\nexport interface DunningStatus {\n inDunning: boolean;\n status?: \"active\" | \"resolved\" | \"abandoned\" | \"recovered\";\n currentStep?: number;\n totalSteps?: number;\n nextActionAt?: string;\n daysSinceFailure?: number;\n}\n\nexport interface CreateCheckoutOptions {\n email: string;\n planId: string;\n successUrl: string;\n cancelUrl: string;\n countryCode?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CheckoutSession {\n checkoutUrl: string;\n sessionId: string;\n customerId?: string;\n provider: string;\n}\n\nexport interface CancelSubscriptionOptions {\n subscriptionId: string;\n cancelAtPeriodEnd?: boolean;\n reason?: string;\n}\n\nexport interface CancelResult {\n success: boolean;\n canceledAt?: string;\n effectiveAt?: string;\n}\n\nexport interface UpdateSubscriptionOptions {\n subscriptionId: string;\n planId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateResult {\n success: boolean;\n subscription: {\n id: string;\n planId: string;\n status: string;\n };\n}\n\nexport interface PortalSession {\n portalUrl: string;\n expiresAt?: string;\n}\n\nexport interface TrackUsageOptions {\n customerId: string;\n featureKey: string;\n quantity: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TrackUsageResult {\n success: boolean;\n newTotal: number;\n remaining: number | null;\n}\n\nexport interface AssignPlanResult {\n success: boolean;\n previousPlanId?: string;\n newPlanId: string;\n}\n\nexport interface WebhookOptions {\n provider: \"stripe\" | \"paddle\" | \"iyzico\";\n payload: string;\n signature: string;\n}\n\nexport interface WebhookResult {\n success: boolean;\n eventType?: string;\n eventId?: string;\n}\n\n// Event types\nexport interface SubscriptionCreatedEvent {\n subscriptionId: string;\n customerId: string;\n planId: string;\n provider: string;\n timestamp: string;\n}\n\nexport interface SubscriptionRenewedEvent {\n subscriptionId: string;\n customerId: string;\n planId: string;\n periodStart: string;\n periodEnd: string;\n timestamp: string;\n}\n\nexport interface SubscriptionCanceledEvent {\n subscriptionId: string;\n customerId: string;\n reason?: string;\n effectiveAt: string;\n timestamp: string;\n}\n\nexport interface PlanChangedEvent {\n subscriptionId: string;\n customerId: string;\n previousPlanId: string;\n newPlanId: string;\n timestamp: string;\n}\n\nexport interface PaymentSucceededEvent {\n paymentId: string;\n customerId: string;\n amount: number;\n currency: string;\n invoiceId?: string;\n timestamp: string;\n}\n\nexport interface PaymentFailedEvent {\n customerId: string;\n subscriptionId?: string;\n amount: number;\n currency: string;\n errorCode?: string;\n errorMessage?: string;\n timestamp: string;\n}\n\nexport interface QuotaExceededEvent {\n customerId: string;\n featureKey: string;\n used: number;\n limit: number;\n timestamp: string;\n}\n\nexport interface QuotaThresholdEvent {\n customerId: string;\n featureKey: string;\n percentage: number;\n used: number;\n limit: number;\n timestamp: string;\n}\n\nexport interface DunningStartedEvent {\n customerId: string;\n subscriptionId: string;\n amount: number;\n currency: string;\n timestamp: string;\n}\n\nexport interface DunningResolvedEvent {\n customerId: string;\n resolution: \"recovered\" | \"canceled\" | \"manual\";\n timestamp: string;\n}\n\n// ============================================================================\n// CLIENT FACTORY\n// ============================================================================\n\n/**\n * Create Payments Service Client\n *\n * @example\n * ```typescript\n * // Embedded mode\n * const payments = createPaymentsServiceClient();\n *\n * // HTTP mode\n * const payments = createPaymentsServiceClient({\n * mode: 'http',\n * baseUrl: 'https://payments.example.com',\n * });\n *\n * // Check quota before API call\n * const quota = await payments.checkQuota(customerId, 'api_calls');\n * if (!quota.allowed) {\n * throw new Error('Quota exceeded');\n * }\n *\n * // Track usage after API call\n * await payments.trackUsage({\n * customerId,\n * featureKey: 'api_calls',\n * quantity: 1,\n * });\n * ```\n */\nexport function createPaymentsServiceClient(\n options?: ServiceClientOptions\n): PaymentsServiceClient {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const client = useService<PaymentsServiceDefinition>(\"payments\", options) as any;\n\n return {\n // Queries\n async getSubscription(opts) {\n return client.query(\"getSubscription\", opts) as Promise<Subscription | null>;\n },\n\n async getCustomer(customerId) {\n return client.query(\"getCustomer\", { customerId }) as Promise<Customer | null>;\n },\n\n async checkQuota(customerId, featureKey) {\n return client.query(\"checkQuota\", { customerId, featureKey }) as Promise<QuotaStatus>;\n },\n\n async getUsage(opts) {\n return client.query(\"getUsage\", opts) as Promise<UsageSummary>;\n },\n\n async getPlans() {\n return client.query(\"getPlans\", undefined) as Promise<{ plans: Plan[] }>;\n },\n\n async getDunningStatus(customerId) {\n return client.query(\"getDunningStatus\", { customerId }) as Promise<DunningStatus>;\n },\n\n // Mutations\n async createCheckout(opts) {\n return client.mutate(\"createCheckout\", opts) as Promise<CheckoutSession>;\n },\n\n async cancelSubscription(opts) {\n return client.mutate(\"cancelSubscription\", opts) as Promise<CancelResult>;\n },\n\n async updateSubscription(opts) {\n return client.mutate(\"updateSubscription\", opts) as Promise<UpdateResult>;\n },\n\n async createPortalSession(customerId, returnUrl) {\n return client.mutate(\"createPortalSession\", { customerId, returnUrl }) as Promise<PortalSession>;\n },\n\n async trackUsage(opts) {\n return client.mutate(\"trackUsage\", opts) as Promise<TrackUsageResult>;\n },\n\n async assignPlan(customerId, planId, expiresAt) {\n return client.mutate(\"assignPlan\", { customerId, planId, expiresAt }) as Promise<AssignPlanResult>;\n },\n\n async handleWebhook(opts) {\n return client.mutate(\"handleWebhook\", opts) as Promise<WebhookResult>;\n },\n\n // Event subscriptions\n onSubscriptionCreated(handler) {\n return client.on(\"subscription.created\", async (event: { data: unknown }) => {\n await handler(event.data as SubscriptionCreatedEvent);\n });\n },\n\n onSubscriptionRenewed(handler) {\n return client.on(\"subscription.renewed\", async (event: { data: unknown }) => {\n await handler(event.data as SubscriptionRenewedEvent);\n });\n },\n\n onSubscriptionCanceled(handler) {\n return client.on(\"subscription.canceled\", async (event: { data: unknown }) => {\n await handler(event.data as SubscriptionCanceledEvent);\n });\n },\n\n onSubscriptionPlanChanged(handler) {\n return client.on(\"subscription.plan_changed\", async (event: { data: unknown }) => {\n await handler(event.data as PlanChangedEvent);\n });\n },\n\n onPaymentSucceeded(handler) {\n return client.on(\"payment.succeeded\", async (event: { data: unknown }) => {\n await handler(event.data as PaymentSucceededEvent);\n });\n },\n\n onPaymentFailed(handler) {\n return client.on(\"payment.failed\", async (event: { data: unknown }) => {\n await handler(event.data as PaymentFailedEvent);\n });\n },\n\n onQuotaExceeded(handler) {\n return client.on(\"quota.exceeded\", async (event: { data: unknown }) => {\n await handler(event.data as QuotaExceededEvent);\n });\n },\n\n onQuotaThresholdReached(handler) {\n return client.on(\"quota.threshold_reached\", async (event: { data: unknown }) => {\n await handler(event.data as QuotaThresholdEvent);\n });\n },\n\n onDunningStarted(handler) {\n return client.on(\"dunning.started\", async (event: { data: unknown }) => {\n await handler(event.data as DunningStartedEvent);\n });\n },\n\n onDunningResolved(handler) {\n return client.on(\"dunning.resolved\", async (event: { data: unknown }) => {\n await handler(event.data as DunningResolvedEvent);\n });\n },\n\n async close() {\n if (\"close\" in client && typeof client.close === \"function\") {\n await (client as { close: () => Promise<void> }).close();\n }\n },\n };\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@parsrun/service-adapters",
3
+ "version": "0.1.0",
4
+ "description": "Service definitions for Pars extracted microservices",
5
+ "keywords": [
6
+ "pars",
7
+ "service",
8
+ "adapters",
9
+ "email",
10
+ "payments"
11
+ ],
12
+ "homepage": "https://pars.run",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/parsrun/pars",
16
+ "directory": "packages/service-adapters"
17
+ },
18
+ "license": "MIT",
19
+ "type": "module",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js"
24
+ },
25
+ "./email": {
26
+ "types": "./dist/email/index.d.ts",
27
+ "import": "./dist/email/index.js"
28
+ },
29
+ "./payments": {
30
+ "types": "./dist/payments/index.d.ts",
31
+ "import": "./dist/payments/index.js"
32
+ }
33
+ },
34
+ "main": "./dist/index.js",
35
+ "types": "./dist/index.d.ts",
36
+ "files": [
37
+ "dist"
38
+ ],
39
+ "scripts": {
40
+ "build": "tsup",
41
+ "dev": "tsup --watch",
42
+ "test": "vitest run",
43
+ "test:watch": "vitest",
44
+ "typecheck": "tsc --noEmit",
45
+ "clean": "rm -rf dist node_modules"
46
+ },
47
+ "dependencies": {
48
+ "@parsrun/core": "workspace:*",
49
+ "@parsrun/service": "workspace:*",
50
+ "@parsrun/email": "workspace:*",
51
+ "@parsrun/payments": "workspace:*"
52
+ },
53
+ "devDependencies": {
54
+ "tsup": "^8.3.5",
55
+ "typescript": "^5.7.2",
56
+ "vitest": "^2.1.8"
57
+ }
58
+ }