@revealui/services 0.0.3 → 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.
Files changed (108) hide show
  1. package/LICENSE +22 -0
  2. package/LICENSE.commercial +112 -0
  3. package/README.md +177 -0
  4. package/dist/api/create-checkout-session/index.d.ts +2 -0
  5. package/dist/api/create-checkout-session/index.d.ts.map +1 -0
  6. package/dist/api/create-checkout-session/index.js +61 -0
  7. package/dist/api/create-checkout-session/index.js.map +1 -0
  8. package/dist/api/create-portal-link/index.d.ts +2 -0
  9. package/dist/api/create-portal-link/index.d.ts.map +1 -0
  10. package/dist/api/create-portal-link/index.js +37 -0
  11. package/dist/api/create-portal-link/index.js.map +1 -0
  12. package/dist/api/handlers/customer-handlers.d.ts +27 -0
  13. package/dist/api/handlers/customer-handlers.d.ts.map +1 -0
  14. package/dist/api/handlers/customer-handlers.js +86 -0
  15. package/dist/api/handlers/customer-handlers.js.map +1 -0
  16. package/dist/api/handlers/index.d.ts +18 -0
  17. package/dist/api/handlers/index.d.ts.map +1 -0
  18. package/dist/api/handlers/index.js +18 -0
  19. package/dist/api/handlers/index.js.map +1 -0
  20. package/dist/api/handlers/invoice-handlers.d.ts +9 -0
  21. package/dist/api/handlers/invoice-handlers.d.ts.map +1 -0
  22. package/dist/api/handlers/invoice-handlers.js +52 -0
  23. package/dist/api/handlers/invoice-handlers.js.map +1 -0
  24. package/dist/api/handlers/payment-handlers.d.ts +13 -0
  25. package/dist/api/handlers/payment-handlers.d.ts.map +1 -0
  26. package/dist/api/handlers/payment-handlers.js +133 -0
  27. package/dist/api/handlers/payment-handlers.js.map +1 -0
  28. package/dist/api/handlers/payment-intent.d.ts +21 -0
  29. package/dist/api/handlers/payment-intent.d.ts.map +1 -0
  30. package/dist/api/handlers/payment-intent.js +87 -0
  31. package/dist/api/handlers/payment-intent.js.map +1 -0
  32. package/dist/api/handlers/product-handlers.d.ts +11 -0
  33. package/dist/api/handlers/product-handlers.d.ts.map +1 -0
  34. package/dist/api/handlers/product-handlers.js +43 -0
  35. package/dist/api/handlers/product-handlers.js.map +1 -0
  36. package/dist/api/handlers/subscription-handlers.d.ts +13 -0
  37. package/dist/api/handlers/subscription-handlers.d.ts.map +1 -0
  38. package/dist/api/handlers/subscription-handlers.js +115 -0
  39. package/dist/api/handlers/subscription-handlers.js.map +1 -0
  40. package/dist/api/index.d.ts +8 -0
  41. package/dist/api/index.d.ts.map +1 -0
  42. package/dist/api/index.js +8 -0
  43. package/dist/api/index.js.map +1 -0
  44. package/dist/api/types/stripe.d.ts +42 -0
  45. package/dist/api/types/stripe.d.ts.map +1 -0
  46. package/dist/api/types/stripe.js +72 -0
  47. package/dist/api/types/stripe.js.map +1 -0
  48. package/dist/api/update-price/index.d.ts +42 -0
  49. package/dist/api/update-price/index.d.ts.map +1 -0
  50. package/dist/api/update-price/index.js +78 -0
  51. package/dist/api/update-price/index.js.map +1 -0
  52. package/dist/api/update-product/index.d.ts +44 -0
  53. package/dist/api/update-product/index.d.ts.map +1 -0
  54. package/dist/api/update-product/index.js +85 -0
  55. package/dist/api/update-product/index.js.map +1 -0
  56. package/dist/api/utils.d.ts +34 -0
  57. package/dist/api/utils.d.ts.map +1 -0
  58. package/dist/api/utils.js +66 -0
  59. package/dist/api/utils.js.map +1 -0
  60. package/dist/api/webhooks/index.d.ts +2 -0
  61. package/dist/api/webhooks/index.d.ts.map +1 -0
  62. package/dist/api/webhooks/index.js +270 -0
  63. package/dist/api/webhooks/index.js.map +1 -0
  64. package/dist/client/index.d.ts +11 -0
  65. package/dist/client/index.d.ts.map +1 -0
  66. package/dist/client/index.js +12 -0
  67. package/dist/client/index.js.map +1 -0
  68. package/dist/index.d.ts +32 -24
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +45 -41
  71. package/dist/index.js.map +1 -0
  72. package/dist/stripe/db-circuit-breaker.d.ts +47 -0
  73. package/dist/stripe/db-circuit-breaker.d.ts.map +1 -0
  74. package/dist/stripe/db-circuit-breaker.js +223 -0
  75. package/dist/stripe/db-circuit-breaker.js.map +1 -0
  76. package/dist/stripe/index.d.ts +2 -0
  77. package/dist/stripe/index.d.ts.map +1 -0
  78. package/dist/stripe/index.js +2 -0
  79. package/dist/stripe/index.js.map +1 -0
  80. package/dist/stripe/stripeClient.d.ts +126 -0
  81. package/dist/stripe/stripeClient.d.ts.map +1 -0
  82. package/dist/stripe/stripeClient.js +226 -0
  83. package/dist/stripe/stripeClient.js.map +1 -0
  84. package/dist/supabase/index.d.ts +6 -0
  85. package/dist/supabase/index.d.ts.map +1 -0
  86. package/dist/supabase/index.js +5 -0
  87. package/dist/supabase/index.js.map +1 -0
  88. package/dist/supabase/resilience.d.ts +50 -0
  89. package/dist/supabase/resilience.d.ts.map +1 -0
  90. package/dist/supabase/resilience.js +166 -0
  91. package/dist/supabase/resilience.js.map +1 -0
  92. package/dist/supabase/types.d.ts +206 -0
  93. package/dist/supabase/types.d.ts.map +1 -0
  94. package/dist/supabase/types.js +19 -0
  95. package/dist/supabase/types.js.map +1 -0
  96. package/dist/supabase/utils/client.d.ts +4 -0
  97. package/dist/supabase/utils/client.d.ts.map +1 -0
  98. package/dist/supabase/utils/client.js +12 -0
  99. package/dist/supabase/utils/client.js.map +1 -0
  100. package/dist/supabase/utils/server.d.ts +10 -0
  101. package/dist/supabase/utils/server.d.ts.map +1 -0
  102. package/dist/supabase/utils/server.js +49 -0
  103. package/dist/supabase/utils/server.js.map +1 -0
  104. package/dist/supabase/utils/web.d.ts +4 -0
  105. package/dist/supabase/utils/web.d.ts.map +1 -0
  106. package/dist/supabase/utils/web.js +37 -0
  107. package/dist/supabase/utils/web.js.map +1 -0
  108. package/package.json +73 -16
@@ -0,0 +1,223 @@
1
+ /**
2
+ * DB-Backed Circuit Breaker
3
+ *
4
+ * Stores circuit state in NeonDB so all API instances share the same view.
5
+ *
6
+ * Architecture:
7
+ * - Local in-memory cache (5s TTL) — fast read path, no DB hit per request
8
+ * - DB write only on state transitions (open/closed/half-open changes)
9
+ * - Fail-open on DB errors: if we can't read state, we let the call through
10
+ * rather than blocking all traffic because the circuit state store is down
11
+ */
12
+ import { createLogger } from '@revealui/core/observability/logger';
13
+ import { getClient } from '@revealui/db';
14
+ import { circuitBreakerState } from '@revealui/db/schema';
15
+ import { eq } from 'drizzle-orm';
16
+ const logger = createLogger({ service: 'DbCircuitBreaker' });
17
+ const DEFAULT_CONFIG = {
18
+ failureThreshold: 5,
19
+ successThreshold: 2,
20
+ resetTimeout: 30_000,
21
+ cacheTtlMs: 5_000,
22
+ };
23
+ // Module-level cache shared across all instances in the same process
24
+ const localCache = new Map();
25
+ export class DbCircuitBreaker {
26
+ serviceName;
27
+ config;
28
+ constructor(serviceName, config = {}) {
29
+ this.serviceName = serviceName;
30
+ this.config = { ...DEFAULT_CONFIG, ...config };
31
+ }
32
+ /**
33
+ * Returns true if the circuit is open (requests should be blocked).
34
+ * Automatically transitions open→half-open when resetTimeout elapses.
35
+ */
36
+ async isOpen() {
37
+ const s = await this.readState();
38
+ if (s.state === 'closed')
39
+ return false;
40
+ if (s.state === 'half-open')
41
+ return false;
42
+ // state === 'open'
43
+ if (Date.now() - s.stateChangedAt >= this.config.resetTimeout) {
44
+ // Probe window: transition to half-open and allow one request through
45
+ await this.writeState({
46
+ ...s,
47
+ state: 'half-open',
48
+ successCount: 0,
49
+ stateChangedAt: Date.now(),
50
+ });
51
+ return false;
52
+ }
53
+ return true;
54
+ }
55
+ /**
56
+ * Record a successful call. Closes the circuit if enough successes in half-open.
57
+ */
58
+ async recordSuccess() {
59
+ const s = await this.readState();
60
+ if (s.state === 'half-open') {
61
+ const newSuccesses = s.successCount + 1;
62
+ if (newSuccesses >= this.config.successThreshold) {
63
+ await this.writeState({
64
+ ...s,
65
+ state: 'closed',
66
+ failureCount: 0,
67
+ successCount: 0,
68
+ stateChangedAt: Date.now(),
69
+ });
70
+ }
71
+ else {
72
+ // Update local cache only — no DB write until threshold is reached
73
+ localCache.set(this.serviceName, {
74
+ ...s,
75
+ successCount: newSuccesses,
76
+ cachedAt: s.cachedAt,
77
+ });
78
+ }
79
+ return;
80
+ }
81
+ if (s.state === 'closed' && s.failureCount > 0) {
82
+ // Reset sub-threshold failure counter locally (no DB write needed)
83
+ localCache.set(this.serviceName, { ...s, failureCount: 0 });
84
+ }
85
+ }
86
+ /**
87
+ * Record a failed call. Trips the circuit when the failure threshold is reached.
88
+ */
89
+ async recordFailure() {
90
+ const s = await this.readState();
91
+ const newFailures = s.failureCount + 1;
92
+ if (s.state === 'half-open' || newFailures >= this.config.failureThreshold) {
93
+ // Trip or re-trip the circuit
94
+ await this.writeState({
95
+ ...s,
96
+ state: 'open',
97
+ failureCount: newFailures,
98
+ successCount: 0,
99
+ lastFailureAt: Date.now(),
100
+ stateChangedAt: Date.now(),
101
+ });
102
+ }
103
+ else {
104
+ // Sub-threshold: update local counter without hitting DB
105
+ localCache.set(this.serviceName, {
106
+ ...s,
107
+ failureCount: newFailures,
108
+ lastFailureAt: Date.now(),
109
+ cachedAt: s.cachedAt,
110
+ });
111
+ }
112
+ }
113
+ /** Force-reset state and clear local cache. Primarily for testing. */
114
+ async reset() {
115
+ const fresh = {
116
+ state: 'closed',
117
+ failureCount: 0,
118
+ successCount: 0,
119
+ lastFailureAt: 0,
120
+ stateChangedAt: Date.now(),
121
+ cachedAt: Date.now(),
122
+ };
123
+ await this.writeState(fresh);
124
+ }
125
+ /** Clear only the local cache (forces next read to hit DB). For testing. */
126
+ clearLocalCache() {
127
+ localCache.delete(this.serviceName);
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ async readState() {
131
+ const cached = localCache.get(this.serviceName);
132
+ if (cached && Date.now() - cached.cachedAt < this.config.cacheTtlMs) {
133
+ return cached;
134
+ }
135
+ return this.readFromDb();
136
+ }
137
+ async readFromDb() {
138
+ try {
139
+ const db = getClient();
140
+ const [row] = await db
141
+ .select()
142
+ .from(circuitBreakerState)
143
+ .where(eq(circuitBreakerState.serviceName, this.serviceName));
144
+ const state = row
145
+ ? {
146
+ state: row.state,
147
+ failureCount: row.failureCount,
148
+ successCount: row.successCount,
149
+ lastFailureAt: row.lastFailureAt?.getTime() ?? 0,
150
+ stateChangedAt: row.stateChangedAt.getTime(),
151
+ cachedAt: Date.now(),
152
+ }
153
+ : {
154
+ state: 'closed',
155
+ failureCount: 0,
156
+ successCount: 0,
157
+ lastFailureAt: 0,
158
+ stateChangedAt: Date.now(),
159
+ cachedAt: Date.now(),
160
+ };
161
+ localCache.set(this.serviceName, state);
162
+ return state;
163
+ }
164
+ catch {
165
+ // Fail-open: if DB is unreachable, default to closed so Stripe calls proceed.
166
+ // We log a warning but don't block traffic over a missing circuit state row.
167
+ logger.warn(`DbCircuitBreaker: failed to read state for '${this.serviceName}', defaulting to closed`);
168
+ const fallback = {
169
+ state: 'closed',
170
+ failureCount: 0,
171
+ successCount: 0,
172
+ lastFailureAt: 0,
173
+ stateChangedAt: Date.now(),
174
+ cachedAt: Date.now(),
175
+ };
176
+ localCache.set(this.serviceName, fallback);
177
+ return fallback;
178
+ }
179
+ }
180
+ async writeState(s) {
181
+ const now = new Date();
182
+ // Optimistically update local cache first so subsequent in-process
183
+ // calls see the new state without waiting for the DB round-trip to complete.
184
+ localCache.set(this.serviceName, { ...s, cachedAt: Date.now() });
185
+ try {
186
+ const db = getClient();
187
+ await db
188
+ .insert(circuitBreakerState)
189
+ .values({
190
+ serviceName: this.serviceName,
191
+ state: s.state,
192
+ failureCount: s.failureCount,
193
+ successCount: s.successCount,
194
+ lastFailureAt: s.lastFailureAt ? new Date(s.lastFailureAt) : null,
195
+ stateChangedAt: new Date(s.stateChangedAt),
196
+ updatedAt: now,
197
+ })
198
+ .onConflictDoUpdate({
199
+ target: circuitBreakerState.serviceName,
200
+ set: {
201
+ state: s.state,
202
+ failureCount: s.failureCount,
203
+ successCount: s.successCount,
204
+ lastFailureAt: s.lastFailureAt ? new Date(s.lastFailureAt) : null,
205
+ stateChangedAt: new Date(s.stateChangedAt),
206
+ updatedAt: now,
207
+ },
208
+ });
209
+ }
210
+ catch (err) {
211
+ // Non-fatal: local cache has the new state; DB will catch up on next write.
212
+ logger.warn(`DbCircuitBreaker: failed to persist state for '${this.serviceName}'`, {
213
+ error: err instanceof Error ? err.message : String(err),
214
+ newState: s.state,
215
+ });
216
+ }
217
+ logger.info(`DbCircuitBreaker state transition: '${this.serviceName}' → ${s.state}`, {
218
+ failureCount: s.failureCount,
219
+ successCount: s.successCount,
220
+ });
221
+ }
222
+ }
223
+ //# sourceMappingURL=db-circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-circuit-breaker.js","sourceRoot":"","sources":["../../src/stripe/db-circuit-breaker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { getStripe, protectedStripe } from './stripeClient.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stripe/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { getStripe, protectedStripe } from './stripeClient.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stripe/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,126 @@
1
+ import Stripe from 'stripe';
2
+ import { DbCircuitBreaker } from './db-circuit-breaker.js';
3
+ /**
4
+ * Get or create Stripe client instance (production use)
5
+ */
6
+ declare function getStripe(): Stripe;
7
+ /**
8
+ * Factory function to create protected Stripe client with dependency injection
9
+ * @param stripeInstance - Stripe instance to use (for testing) or undefined to use getStripe()
10
+ */
11
+ declare function createProtectedStripe(stripeInstance?: Stripe): {
12
+ billingPortal: {
13
+ sessions: {
14
+ create: (params: Stripe.BillingPortal.SessionCreateParams, options?: Stripe.RequestOptions) => Promise<Stripe.BillingPortal.Session>;
15
+ };
16
+ };
17
+ customers: {
18
+ create: (params: Stripe.CustomerCreateParams, options?: Stripe.RequestOptions) => Promise<Stripe.Customer>;
19
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Customer | Stripe.DeletedCustomer>;
20
+ update: (id: string, params?: Stripe.CustomerUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Customer>;
21
+ del: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.DeletedCustomer>;
22
+ list: (params?: Stripe.CustomerListParams, options?: Stripe.RequestOptions) => Promise<Stripe.ApiList<Stripe.Customer>>;
23
+ };
24
+ paymentIntents: {
25
+ create: (params: Stripe.PaymentIntentCreateParams, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.PaymentIntent>;
26
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.PaymentIntent>;
27
+ update: (id: string, params?: Stripe.PaymentIntentUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.PaymentIntent>;
28
+ };
29
+ checkout: {
30
+ sessions: {
31
+ create: (params: Stripe.Checkout.SessionCreateParams, options?: Stripe.RequestOptions) => Promise<Stripe.Checkout.Session>;
32
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Checkout.Session>;
33
+ };
34
+ };
35
+ products: {
36
+ create: (params: Stripe.ProductCreateParams, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Product>;
37
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Product>;
38
+ update: (id: string, params?: Stripe.ProductUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Product>;
39
+ list: (params?: Stripe.ProductListParams, options?: Stripe.RequestOptions) => Promise<Stripe.ApiList<Stripe.Product>>;
40
+ };
41
+ prices: {
42
+ create: (params: Stripe.PriceCreateParams, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Price>;
43
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Price>;
44
+ update: (id: string, params?: Stripe.PriceUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Price>;
45
+ list: (params?: Stripe.PriceListParams, options?: Stripe.RequestOptions) => Promise<Stripe.ApiList<Stripe.Price>>;
46
+ };
47
+ subscriptions: {
48
+ list: (options?: Stripe.RequestOptions | undefined) => Promise<Stripe.ApiList<Stripe.Subscription>>;
49
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Subscription>;
50
+ update: (id: string, params?: Stripe.SubscriptionUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Subscription>;
51
+ cancel: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Subscription>;
52
+ };
53
+ readonly webhooks: Stripe["webhooks"];
54
+ readonly balance: Stripe["balance"];
55
+ };
56
+ /**
57
+ * Enhanced Stripe client with circuit breaker and retry protection
58
+ * Uses factory with production Stripe instance for backward compatibility
59
+ */
60
+ export declare const protectedStripe: {
61
+ billingPortal: {
62
+ sessions: {
63
+ create: (params: Stripe.BillingPortal.SessionCreateParams, options?: Stripe.RequestOptions) => Promise<Stripe.BillingPortal.Session>;
64
+ };
65
+ };
66
+ customers: {
67
+ create: (params: Stripe.CustomerCreateParams, options?: Stripe.RequestOptions) => Promise<Stripe.Customer>;
68
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Customer | Stripe.DeletedCustomer>;
69
+ update: (id: string, params?: Stripe.CustomerUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Customer>;
70
+ del: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.DeletedCustomer>;
71
+ list: (params?: Stripe.CustomerListParams, options?: Stripe.RequestOptions) => Promise<Stripe.ApiList<Stripe.Customer>>;
72
+ };
73
+ paymentIntents: {
74
+ create: (params: Stripe.PaymentIntentCreateParams, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.PaymentIntent>;
75
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.PaymentIntent>;
76
+ update: (id: string, params?: Stripe.PaymentIntentUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.PaymentIntent>;
77
+ };
78
+ checkout: {
79
+ sessions: {
80
+ create: (params: Stripe.Checkout.SessionCreateParams, options?: Stripe.RequestOptions) => Promise<Stripe.Checkout.Session>;
81
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Checkout.Session>;
82
+ };
83
+ };
84
+ products: {
85
+ create: (params: Stripe.ProductCreateParams, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Product>;
86
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Product>;
87
+ update: (id: string, params?: Stripe.ProductUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Product>;
88
+ list: (params?: Stripe.ProductListParams, options?: Stripe.RequestOptions) => Promise<Stripe.ApiList<Stripe.Product>>;
89
+ };
90
+ prices: {
91
+ create: (params: Stripe.PriceCreateParams, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Price>;
92
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Price>;
93
+ update: (id: string, params?: Stripe.PriceUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Price>;
94
+ list: (params?: Stripe.PriceListParams, options?: Stripe.RequestOptions) => Promise<Stripe.ApiList<Stripe.Price>>;
95
+ };
96
+ subscriptions: {
97
+ list: (options?: Stripe.RequestOptions | undefined) => Promise<Stripe.ApiList<Stripe.Subscription>>;
98
+ retrieve: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Subscription>;
99
+ update: (id: string, params?: Stripe.SubscriptionUpdateParams | undefined, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Subscription>;
100
+ cancel: (id: string, options?: Stripe.RequestOptions | undefined) => Promise<Stripe.Subscription>;
101
+ };
102
+ readonly webhooks: Stripe["webhooks"];
103
+ readonly balance: Stripe["balance"];
104
+ };
105
+ export { getStripe, createProtectedStripe };
106
+ export declare const __dbCircuitBreaker: DbCircuitBreaker;
107
+ export declare const __CIRCUIT_BREAKER_CONFIG: {
108
+ failureThreshold: number;
109
+ resetTimeout: number;
110
+ successThreshold: number;
111
+ };
112
+ export declare const __RETRY_CONFIG: {
113
+ maxAttempts: number;
114
+ backoff: number[];
115
+ timeout: number;
116
+ };
117
+ /**
118
+ * Reset the DB circuit breaker state and clear local cache (test-only).
119
+ */
120
+ export declare const __resetCircuitBreaker: () => Promise<void>;
121
+ /**
122
+ * Reset the cached Stripe instance (test-only)
123
+ * This allows tests to reset the production Stripe cache
124
+ */
125
+ export declare const __resetStripe: () => void;
126
+ //# sourceMappingURL=stripeClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripeClient.d.ts","sourceRoot":"","sources":["../../src/stripe/stripeClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ // Import config module (ESM)
2
+ // Config uses proxy for lazy loading, so import is safe - validation only happens on property access
3
+ import configModule from '@revealui/config';
4
+ import Stripe from 'stripe';
5
+ import { createLogger } from '@revealui/core/observability/logger';
6
+ import { DbCircuitBreaker } from './db-circuit-breaker.js';
7
+ const logger = createLogger({ service: 'Stripe' });
8
+ // Lazy initialization to handle missing env vars during build
9
+ let _stripe = null;
10
+ /**
11
+ * Get or create Stripe client instance (production use)
12
+ */
13
+ function getStripe() {
14
+ // Use cached instance if available
15
+ if (_stripe)
16
+ return _stripe;
17
+ // Try to get from config module, fallback to process.env for backward compatibility
18
+ let secretKey;
19
+ try {
20
+ // Accessing config.stripe.secretKey triggers lazy validation via proxy
21
+ // Type assertion needed because Proxy type inference fails for nested properties
22
+ // Config is a Proxy, so we need to access properties directly
23
+ secretKey = configModule.stripe?.secretKey;
24
+ }
25
+ catch {
26
+ // Config validation failed or module unavailable - will use process.env fallback
27
+ secretKey = undefined;
28
+ }
29
+ secretKey = secretKey ?? process.env.STRIPE_SECRET_KEY;
30
+ if (!secretKey) {
31
+ throw new Error('STRIPE_SECRET_KEY environment variable is required. Use @revealui/config or set STRIPE_SECRET_KEY.');
32
+ }
33
+ _stripe = new Stripe(secretKey, {
34
+ apiVersion: '2026-01-28.clover',
35
+ });
36
+ return _stripe;
37
+ }
38
+ /**
39
+ * Circuit breaker configuration
40
+ */
41
+ const CIRCUIT_BREAKER_CONFIG = {
42
+ failureThreshold: 5, // Open circuit after 5 failures
43
+ resetTimeout: 30000, // 30 seconds before half-open
44
+ successThreshold: 2, // Need 2 successes to close from half-open
45
+ };
46
+ /**
47
+ * Retry configuration
48
+ */
49
+ const RETRY_CONFIG = {
50
+ maxAttempts: 3,
51
+ backoff: [100, 200, 400], // Exponential backoff in milliseconds
52
+ timeout: 10000, // 10 second timeout
53
+ };
54
+ /**
55
+ * Shared DB-backed circuit breaker for all Stripe operations.
56
+ * State is persisted to NeonDB so all API instances share the same view.
57
+ * Local 5-second cache keeps the read path fast.
58
+ */
59
+ const stripeCircuitBreaker = new DbCircuitBreaker('stripe', {
60
+ failureThreshold: CIRCUIT_BREAKER_CONFIG.failureThreshold,
61
+ successThreshold: CIRCUIT_BREAKER_CONFIG.successThreshold,
62
+ resetTimeout: CIRCUIT_BREAKER_CONFIG.resetTimeout,
63
+ });
64
+ /**
65
+ * Sleep helper for exponential backoff
66
+ */
67
+ function sleep(ms) {
68
+ return new Promise((resolve) => setTimeout(resolve, ms));
69
+ }
70
+ /**
71
+ * Timeout wrapper for promises
72
+ */
73
+ function withTimeout(promise, timeoutMs) {
74
+ return Promise.race([
75
+ promise,
76
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Operation timed out after ${timeoutMs}ms`)), timeoutMs)),
77
+ ]);
78
+ }
79
+ /**
80
+ * Factory function to create protected Stripe client with dependency injection
81
+ * @param stripeInstance - Stripe instance to use (for testing) or undefined to use getStripe()
82
+ */
83
+ function createProtectedStripe(stripeInstance) {
84
+ // Use provided instance or get production instance
85
+ const getStripeInstance = () => {
86
+ return stripeInstance ?? getStripe();
87
+ };
88
+ /**
89
+ * Wrapper for Stripe API calls with circuit breaker and retry logic
90
+ */
91
+ async function callWithResilience(operation, operationName) {
92
+ // Check circuit breaker state (DB-backed, 5s local cache)
93
+ if (await stripeCircuitBreaker.isOpen()) {
94
+ logger.error(`Stripe circuit breaker is OPEN`, undefined, {
95
+ operation: operationName,
96
+ state: 'open',
97
+ });
98
+ throw new Error('Stripe circuit breaker is OPEN. Service may be unavailable. Please try again later.');
99
+ }
100
+ let lastError;
101
+ // Retry with exponential backoff
102
+ for (let attempt = 0; attempt < RETRY_CONFIG.maxAttempts; attempt++) {
103
+ try {
104
+ // Execute operation with timeout
105
+ const result = await withTimeout(operation(), RETRY_CONFIG.timeout);
106
+ // Success - record it and return
107
+ await stripeCircuitBreaker.recordSuccess();
108
+ return result;
109
+ }
110
+ catch (error) {
111
+ lastError = error;
112
+ // Check if it's a timeout or network error (retryable)
113
+ const isRetryable = error instanceof Error &&
114
+ (error.message.includes('timeout') ||
115
+ error.message.includes('ECONNREFUSED') ||
116
+ error.message.includes('ETIMEDOUT') ||
117
+ error.message.includes('network'));
118
+ // Don't retry non-retryable errors (e.g., validation errors from Stripe)
119
+ if (!isRetryable) {
120
+ await stripeCircuitBreaker.recordFailure();
121
+ logger.error(`Operation ${operationName} failed (non-retryable)`, error instanceof Error ? error : new Error(String(error)), {
122
+ operation: operationName,
123
+ attempt: attempt + 1,
124
+ maxAttempts: RETRY_CONFIG.maxAttempts,
125
+ });
126
+ throw error;
127
+ }
128
+ // Log retryable error
129
+ logger.warn(`Operation ${operationName} failed (retryable), retrying...`, {
130
+ operation: operationName,
131
+ attempt: attempt + 1,
132
+ maxAttempts: RETRY_CONFIG.maxAttempts,
133
+ error: error instanceof Error ? error.message : String(error),
134
+ });
135
+ // If this is the last attempt, don't wait
136
+ if (attempt === RETRY_CONFIG.maxAttempts - 1) {
137
+ break;
138
+ }
139
+ // Exponential backoff
140
+ const backoffMs = RETRY_CONFIG.backoff[attempt] ??
141
+ RETRY_CONFIG.backoff[RETRY_CONFIG.backoff.length - 1] ??
142
+ 1000;
143
+ await sleep(backoffMs);
144
+ }
145
+ }
146
+ // All retries failed
147
+ await stripeCircuitBreaker.recordFailure();
148
+ throw lastError instanceof Error
149
+ ? new Error(`${operationName} failed after ${RETRY_CONFIG.maxAttempts} attempts: ${lastError.message}`)
150
+ : new Error(`${operationName} failed after ${RETRY_CONFIG.maxAttempts} attempts`);
151
+ }
152
+ // Return protected Stripe client using the provided or production Stripe instance
153
+ return {
154
+ billingPortal: {
155
+ sessions: {
156
+ create: (params, options) => callWithResilience(() => getStripeInstance().billingPortal.sessions.create(params, options), 'billingPortal.sessions.create'),
157
+ },
158
+ },
159
+ customers: {
160
+ create: (params, options) => callWithResilience(() => getStripeInstance().customers.create(params, options), 'customers.create'),
161
+ retrieve: (...args) => callWithResilience(() => getStripeInstance().customers.retrieve(...args), 'customers.retrieve'),
162
+ update: (...args) => callWithResilience(() => getStripeInstance().customers.update(...args), 'customers.update'),
163
+ del: (...args) => callWithResilience(() => getStripeInstance().customers.del(...args), 'customers.del'),
164
+ list: (params, options) => callWithResilience(() => getStripeInstance().customers.list(params, options), 'customers.list'),
165
+ },
166
+ paymentIntents: {
167
+ create: (...args) => callWithResilience(() => getStripeInstance().paymentIntents.create(...args), 'paymentIntents.create'),
168
+ retrieve: (...args) => callWithResilience(() => getStripeInstance().paymentIntents.retrieve(...args), 'paymentIntents.retrieve'),
169
+ update: (...args) => callWithResilience(() => getStripeInstance().paymentIntents.update(...args), 'paymentIntents.update'),
170
+ },
171
+ checkout: {
172
+ sessions: {
173
+ create: (params, options) => callWithResilience(() => getStripeInstance().checkout.sessions.create(params, options), 'checkout.sessions.create'),
174
+ retrieve: (...args) => callWithResilience(() => getStripeInstance().checkout.sessions.retrieve(...args), 'checkout.sessions.retrieve'),
175
+ },
176
+ },
177
+ products: {
178
+ create: (...args) => callWithResilience(() => getStripeInstance().products.create(...args), 'products.create'),
179
+ retrieve: (...args) => callWithResilience(() => getStripeInstance().products.retrieve(...args), 'products.retrieve'),
180
+ update: (...args) => callWithResilience(() => getStripeInstance().products.update(...args), 'products.update'),
181
+ list: (params, options) => callWithResilience(() => getStripeInstance().products.list(params, options), 'products.list'),
182
+ },
183
+ prices: {
184
+ create: (...args) => callWithResilience(() => getStripeInstance().prices.create(...args), 'prices.create'),
185
+ retrieve: (...args) => callWithResilience(() => getStripeInstance().prices.retrieve(...args), 'prices.retrieve'),
186
+ update: (...args) => callWithResilience(() => getStripeInstance().prices.update(...args), 'prices.update'),
187
+ list: (params, options) => callWithResilience(() => getStripeInstance().prices.list(params, options), 'prices.list'),
188
+ },
189
+ subscriptions: {
190
+ list: (...args) => callWithResilience(() => getStripeInstance().subscriptions.list(...args), 'subscriptions.list'),
191
+ retrieve: (...args) => callWithResilience(() => getStripeInstance().subscriptions.retrieve(...args), 'subscriptions.retrieve'),
192
+ update: (...args) => callWithResilience(() => getStripeInstance().subscriptions.update(...args), 'subscriptions.update'),
193
+ cancel: (...args) => callWithResilience(() => getStripeInstance().subscriptions.cancel(...args), 'subscriptions.cancel'),
194
+ },
195
+ get webhooks() {
196
+ return getStripeInstance().webhooks;
197
+ },
198
+ get balance() {
199
+ return getStripeInstance().balance;
200
+ },
201
+ };
202
+ }
203
+ /**
204
+ * Enhanced Stripe client with circuit breaker and retry protection
205
+ * Uses factory with production Stripe instance for backward compatibility
206
+ */
207
+ export const protectedStripe = createProtectedStripe();
208
+ // Export factory for cases where you need explicit initialization control (e.g., testing)
209
+ export { getStripe, createProtectedStripe };
210
+ // Test-only exports (DO NOT USE IN PRODUCTION)
211
+ // These are exported with __ prefix to indicate they are internal and test-only
212
+ export const __dbCircuitBreaker = stripeCircuitBreaker;
213
+ export const __CIRCUIT_BREAKER_CONFIG = CIRCUIT_BREAKER_CONFIG;
214
+ export const __RETRY_CONFIG = RETRY_CONFIG;
215
+ /**
216
+ * Reset the DB circuit breaker state and clear local cache (test-only).
217
+ */
218
+ export const __resetCircuitBreaker = () => stripeCircuitBreaker.reset();
219
+ /**
220
+ * Reset the cached Stripe instance (test-only)
221
+ * This allows tests to reset the production Stripe cache
222
+ */
223
+ export const __resetStripe = () => {
224
+ _stripe = null;
225
+ };
226
+ //# sourceMappingURL=stripeClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripeClient.js","sourceRoot":"","sources":["../../src/stripe/stripeClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type { SupabaseClient } from '@supabase/supabase-js';
2
+ export { withSupabaseResilience } from './resilience.js';
3
+ export { default as createBrowserClient } from './utils/client.js';
4
+ export { default as createServerClient } from './utils/server.js';
5
+ export { createServerClientFromRequest } from './utils/web.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export { withSupabaseResilience } from './resilience.js';
2
+ export { default as createBrowserClient } from './utils/client.js';
3
+ export { default as createServerClient } from './utils/server.js';
4
+ export { createServerClientFromRequest } from './utils/web.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAA"}