@downcity/services 0.1.6

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 (78) hide show
  1. package/README.md +47 -0
  2. package/bin/accounts/db.d.ts +19 -0
  3. package/bin/accounts/db.d.ts.map +1 -0
  4. package/bin/accounts/db.js +68 -0
  5. package/bin/accounts/db.js.map +1 -0
  6. package/bin/accounts/index.d.ts +348 -0
  7. package/bin/accounts/index.d.ts.map +1 -0
  8. package/bin/accounts/index.js +681 -0
  9. package/bin/accounts/index.js.map +1 -0
  10. package/bin/accounts/oauth.d.ts +129 -0
  11. package/bin/accounts/oauth.d.ts.map +1 -0
  12. package/bin/accounts/oauth.js +220 -0
  13. package/bin/accounts/oauth.js.map +1 -0
  14. package/bin/accounts/schema.d.ts +319 -0
  15. package/bin/accounts/schema.d.ts.map +1 -0
  16. package/bin/accounts/schema.js +72 -0
  17. package/bin/accounts/schema.js.map +1 -0
  18. package/bin/balance/index.d.ts +7 -0
  19. package/bin/balance/index.d.ts.map +1 -0
  20. package/bin/balance/index.js +6 -0
  21. package/bin/balance/index.js.map +1 -0
  22. package/bin/balance/raw.d.ts +20 -0
  23. package/bin/balance/raw.d.ts.map +1 -0
  24. package/bin/balance/raw.js +75 -0
  25. package/bin/balance/raw.js.map +1 -0
  26. package/bin/balance/routes.d.ts +14 -0
  27. package/bin/balance/routes.d.ts.map +1 -0
  28. package/bin/balance/routes.js +166 -0
  29. package/bin/balance/routes.js.map +1 -0
  30. package/bin/balance/schema.d.ts +764 -0
  31. package/bin/balance/schema.d.ts.map +1 -0
  32. package/bin/balance/schema.js +185 -0
  33. package/bin/balance/schema.js.map +1 -0
  34. package/bin/balance/service.d.ts +880 -0
  35. package/bin/balance/service.d.ts.map +1 -0
  36. package/bin/balance/service.js +557 -0
  37. package/bin/balance/service.js.map +1 -0
  38. package/bin/balance/types.d.ts +326 -0
  39. package/bin/balance/types.d.ts.map +1 -0
  40. package/bin/balance/types.js +10 -0
  41. package/bin/balance/types.js.map +1 -0
  42. package/bin/balance/utils.d.ts +91 -0
  43. package/bin/balance/utils.d.ts.map +1 -0
  44. package/bin/balance/utils.js +231 -0
  45. package/bin/balance/utils.js.map +1 -0
  46. package/bin/index.d.ts +22 -0
  47. package/bin/index.d.ts.map +1 -0
  48. package/bin/index.js +16 -0
  49. package/bin/index.js.map +1 -0
  50. package/bin/payment/index.d.ts +19 -0
  51. package/bin/payment/index.d.ts.map +1 -0
  52. package/bin/payment/index.js +63 -0
  53. package/bin/payment/index.js.map +1 -0
  54. package/bin/payment/types.d.ts +107 -0
  55. package/bin/payment/types.d.ts.map +1 -0
  56. package/bin/payment/types.js +10 -0
  57. package/bin/payment/types.js.map +1 -0
  58. package/bin/payment-stripe/index.d.ts +17 -0
  59. package/bin/payment-stripe/index.d.ts.map +1 -0
  60. package/bin/payment-stripe/index.js +619 -0
  61. package/bin/payment-stripe/index.js.map +1 -0
  62. package/bin/payment-stripe/schema.d.ts +378 -0
  63. package/bin/payment-stripe/schema.d.ts.map +1 -0
  64. package/bin/payment-stripe/schema.js +47 -0
  65. package/bin/payment-stripe/schema.js.map +1 -0
  66. package/bin/payment-stripe/stripe.d.ts +38 -0
  67. package/bin/payment-stripe/stripe.d.ts.map +1 -0
  68. package/bin/payment-stripe/stripe.js +129 -0
  69. package/bin/payment-stripe/stripe.js.map +1 -0
  70. package/bin/payment-stripe/types.d.ts +331 -0
  71. package/bin/payment-stripe/types.d.ts.map +1 -0
  72. package/bin/payment-stripe/types.js +10 -0
  73. package/bin/payment-stripe/types.js.map +1 -0
  74. package/bin/usage/index.d.ts +177 -0
  75. package/bin/usage/index.d.ts.map +1 -0
  76. package/bin/usage/index.js +120 -0
  77. package/bin/usage/index.js.map +1 -0
  78. package/package.json +60 -0
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Stripe 一次性充值服务数据库 schema。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 本服务只管理 Stripe 支付侧事实,不直接维护余额账本
6
+ * - 真正的钱包账户、充值单与流水仍然由 balance 服务负责
7
+ * - 这里的表只负责记录 Stripe 支付映射与 webhook 事件
8
+ */
9
+ /**
10
+ * Stripe 支付记录表。
11
+ *
12
+ * 关键说明(中文)
13
+ * - 一条记录对应一次 topup 的 Stripe 支付尝试
14
+ * - `topup_id` 连接 balance 服务里的充值单
15
+ * - `checkout_url` 允许前端重试取回已创建的 Checkout 链接
16
+ */
17
+ export declare const stripePayments: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
18
+ name: "service_stripe_payments";
19
+ schema: undefined;
20
+ columns: {
21
+ payment_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
22
+ name: "payment_id";
23
+ tableName: "service_stripe_payments";
24
+ dataType: "string";
25
+ columnType: "SQLiteText";
26
+ data: string;
27
+ driverParam: string;
28
+ notNull: true;
29
+ hasDefault: false;
30
+ isPrimaryKey: true;
31
+ isAutoincrement: false;
32
+ hasRuntimeDefault: false;
33
+ enumValues: [string, ...string[]];
34
+ baseColumn: never;
35
+ identity: undefined;
36
+ generated: undefined;
37
+ }, {}, {
38
+ length: number | undefined;
39
+ }>;
40
+ topup_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
41
+ name: "topup_id";
42
+ tableName: "service_stripe_payments";
43
+ dataType: "string";
44
+ columnType: "SQLiteText";
45
+ data: string;
46
+ driverParam: string;
47
+ notNull: true;
48
+ hasDefault: false;
49
+ isPrimaryKey: false;
50
+ isAutoincrement: false;
51
+ hasRuntimeDefault: false;
52
+ enumValues: [string, ...string[]];
53
+ baseColumn: never;
54
+ identity: undefined;
55
+ generated: undefined;
56
+ }, {}, {
57
+ length: number | undefined;
58
+ }>;
59
+ user_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
60
+ name: "user_id";
61
+ tableName: "service_stripe_payments";
62
+ dataType: "string";
63
+ columnType: "SQLiteText";
64
+ data: string;
65
+ driverParam: string;
66
+ notNull: true;
67
+ hasDefault: false;
68
+ isPrimaryKey: false;
69
+ isAutoincrement: false;
70
+ hasRuntimeDefault: false;
71
+ enumValues: [string, ...string[]];
72
+ baseColumn: never;
73
+ identity: undefined;
74
+ generated: undefined;
75
+ }, {}, {
76
+ length: number | undefined;
77
+ }>;
78
+ stripe_checkout_session_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
79
+ name: "stripe_checkout_session_id";
80
+ tableName: "service_stripe_payments";
81
+ dataType: "string";
82
+ columnType: "SQLiteText";
83
+ data: string;
84
+ driverParam: string;
85
+ notNull: true;
86
+ hasDefault: false;
87
+ isPrimaryKey: false;
88
+ isAutoincrement: false;
89
+ hasRuntimeDefault: false;
90
+ enumValues: [string, ...string[]];
91
+ baseColumn: never;
92
+ identity: undefined;
93
+ generated: undefined;
94
+ }, {}, {
95
+ length: number | undefined;
96
+ }>;
97
+ stripe_payment_intent_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
98
+ name: "stripe_payment_intent_id";
99
+ tableName: "service_stripe_payments";
100
+ dataType: "string";
101
+ columnType: "SQLiteText";
102
+ data: string;
103
+ driverParam: string;
104
+ notNull: true;
105
+ hasDefault: false;
106
+ isPrimaryKey: false;
107
+ isAutoincrement: false;
108
+ hasRuntimeDefault: false;
109
+ enumValues: [string, ...string[]];
110
+ baseColumn: never;
111
+ identity: undefined;
112
+ generated: undefined;
113
+ }, {}, {
114
+ length: number | undefined;
115
+ }>;
116
+ amount: import("drizzle-orm/sqlite-core").SQLiteColumn<{
117
+ name: "amount";
118
+ tableName: "service_stripe_payments";
119
+ dataType: "number";
120
+ columnType: "SQLiteInteger";
121
+ data: number;
122
+ driverParam: number;
123
+ notNull: true;
124
+ hasDefault: false;
125
+ isPrimaryKey: false;
126
+ isAutoincrement: false;
127
+ hasRuntimeDefault: false;
128
+ enumValues: undefined;
129
+ baseColumn: never;
130
+ identity: undefined;
131
+ generated: undefined;
132
+ }, {}, {}>;
133
+ currency: import("drizzle-orm/sqlite-core").SQLiteColumn<{
134
+ name: "currency";
135
+ tableName: "service_stripe_payments";
136
+ dataType: "string";
137
+ columnType: "SQLiteText";
138
+ data: string;
139
+ driverParam: string;
140
+ notNull: true;
141
+ hasDefault: false;
142
+ isPrimaryKey: false;
143
+ isAutoincrement: false;
144
+ hasRuntimeDefault: false;
145
+ enumValues: [string, ...string[]];
146
+ baseColumn: never;
147
+ identity: undefined;
148
+ generated: undefined;
149
+ }, {}, {
150
+ length: number | undefined;
151
+ }>;
152
+ status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
153
+ name: "status";
154
+ tableName: "service_stripe_payments";
155
+ dataType: "string";
156
+ columnType: "SQLiteText";
157
+ data: string;
158
+ driverParam: string;
159
+ notNull: true;
160
+ hasDefault: false;
161
+ isPrimaryKey: false;
162
+ isAutoincrement: false;
163
+ hasRuntimeDefault: false;
164
+ enumValues: [string, ...string[]];
165
+ baseColumn: never;
166
+ identity: undefined;
167
+ generated: undefined;
168
+ }, {}, {
169
+ length: number | undefined;
170
+ }>;
171
+ checkout_url: import("drizzle-orm/sqlite-core").SQLiteColumn<{
172
+ name: "checkout_url";
173
+ tableName: "service_stripe_payments";
174
+ dataType: "string";
175
+ columnType: "SQLiteText";
176
+ data: string;
177
+ driverParam: string;
178
+ notNull: true;
179
+ hasDefault: false;
180
+ isPrimaryKey: false;
181
+ isAutoincrement: false;
182
+ hasRuntimeDefault: false;
183
+ enumValues: [string, ...string[]];
184
+ baseColumn: never;
185
+ identity: undefined;
186
+ generated: undefined;
187
+ }, {}, {
188
+ length: number | undefined;
189
+ }>;
190
+ metadata_json: import("drizzle-orm/sqlite-core").SQLiteColumn<{
191
+ name: "metadata_json";
192
+ tableName: "service_stripe_payments";
193
+ dataType: "string";
194
+ columnType: "SQLiteText";
195
+ data: string;
196
+ driverParam: string;
197
+ notNull: true;
198
+ hasDefault: false;
199
+ isPrimaryKey: false;
200
+ isAutoincrement: false;
201
+ hasRuntimeDefault: false;
202
+ enumValues: [string, ...string[]];
203
+ baseColumn: never;
204
+ identity: undefined;
205
+ generated: undefined;
206
+ }, {}, {
207
+ length: number | undefined;
208
+ }>;
209
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
210
+ name: "created_at";
211
+ tableName: "service_stripe_payments";
212
+ dataType: "string";
213
+ columnType: "SQLiteText";
214
+ data: string;
215
+ driverParam: string;
216
+ notNull: true;
217
+ hasDefault: false;
218
+ isPrimaryKey: false;
219
+ isAutoincrement: false;
220
+ hasRuntimeDefault: false;
221
+ enumValues: [string, ...string[]];
222
+ baseColumn: never;
223
+ identity: undefined;
224
+ generated: undefined;
225
+ }, {}, {
226
+ length: number | undefined;
227
+ }>;
228
+ updated_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
229
+ name: "updated_at";
230
+ tableName: "service_stripe_payments";
231
+ dataType: "string";
232
+ columnType: "SQLiteText";
233
+ data: string;
234
+ driverParam: string;
235
+ notNull: true;
236
+ hasDefault: false;
237
+ isPrimaryKey: false;
238
+ isAutoincrement: false;
239
+ hasRuntimeDefault: false;
240
+ enumValues: [string, ...string[]];
241
+ baseColumn: never;
242
+ identity: undefined;
243
+ generated: undefined;
244
+ }, {}, {
245
+ length: number | undefined;
246
+ }>;
247
+ };
248
+ dialect: "sqlite";
249
+ }>;
250
+ /**
251
+ * Stripe webhook 事件表。
252
+ *
253
+ * 关键说明(中文)
254
+ * - `event_id` 作为 webhook 幂等键
255
+ * - `sync_status` 用于区分已应用、忽略和失败的事件
256
+ */
257
+ export declare const stripeEvents: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
258
+ name: "service_stripe_events";
259
+ schema: undefined;
260
+ columns: {
261
+ event_id: import("drizzle-orm/sqlite-core").SQLiteColumn<{
262
+ name: "event_id";
263
+ tableName: "service_stripe_events";
264
+ dataType: "string";
265
+ columnType: "SQLiteText";
266
+ data: string;
267
+ driverParam: string;
268
+ notNull: true;
269
+ hasDefault: false;
270
+ isPrimaryKey: true;
271
+ isAutoincrement: false;
272
+ hasRuntimeDefault: false;
273
+ enumValues: [string, ...string[]];
274
+ baseColumn: never;
275
+ identity: undefined;
276
+ generated: undefined;
277
+ }, {}, {
278
+ length: number | undefined;
279
+ }>;
280
+ type: import("drizzle-orm/sqlite-core").SQLiteColumn<{
281
+ name: "type";
282
+ tableName: "service_stripe_events";
283
+ dataType: "string";
284
+ columnType: "SQLiteText";
285
+ data: string;
286
+ driverParam: string;
287
+ notNull: true;
288
+ hasDefault: false;
289
+ isPrimaryKey: false;
290
+ isAutoincrement: false;
291
+ hasRuntimeDefault: false;
292
+ enumValues: [string, ...string[]];
293
+ baseColumn: never;
294
+ identity: undefined;
295
+ generated: undefined;
296
+ }, {}, {
297
+ length: number | undefined;
298
+ }>;
299
+ payload_json: import("drizzle-orm/sqlite-core").SQLiteColumn<{
300
+ name: "payload_json";
301
+ tableName: "service_stripe_events";
302
+ dataType: "string";
303
+ columnType: "SQLiteText";
304
+ data: string;
305
+ driverParam: string;
306
+ notNull: true;
307
+ hasDefault: false;
308
+ isPrimaryKey: false;
309
+ isAutoincrement: false;
310
+ hasRuntimeDefault: false;
311
+ enumValues: [string, ...string[]];
312
+ baseColumn: never;
313
+ identity: undefined;
314
+ generated: undefined;
315
+ }, {}, {
316
+ length: number | undefined;
317
+ }>;
318
+ sync_status: import("drizzle-orm/sqlite-core").SQLiteColumn<{
319
+ name: "sync_status";
320
+ tableName: "service_stripe_events";
321
+ dataType: "string";
322
+ columnType: "SQLiteText";
323
+ data: string;
324
+ driverParam: string;
325
+ notNull: true;
326
+ hasDefault: false;
327
+ isPrimaryKey: false;
328
+ isAutoincrement: false;
329
+ hasRuntimeDefault: false;
330
+ enumValues: [string, ...string[]];
331
+ baseColumn: never;
332
+ identity: undefined;
333
+ generated: undefined;
334
+ }, {}, {
335
+ length: number | undefined;
336
+ }>;
337
+ sync_error: import("drizzle-orm/sqlite-core").SQLiteColumn<{
338
+ name: "sync_error";
339
+ tableName: "service_stripe_events";
340
+ dataType: "string";
341
+ columnType: "SQLiteText";
342
+ data: string;
343
+ driverParam: string;
344
+ notNull: true;
345
+ hasDefault: false;
346
+ isPrimaryKey: false;
347
+ isAutoincrement: false;
348
+ hasRuntimeDefault: false;
349
+ enumValues: [string, ...string[]];
350
+ baseColumn: never;
351
+ identity: undefined;
352
+ generated: undefined;
353
+ }, {}, {
354
+ length: number | undefined;
355
+ }>;
356
+ created_at: import("drizzle-orm/sqlite-core").SQLiteColumn<{
357
+ name: "created_at";
358
+ tableName: "service_stripe_events";
359
+ dataType: "string";
360
+ columnType: "SQLiteText";
361
+ data: string;
362
+ driverParam: string;
363
+ notNull: true;
364
+ hasDefault: false;
365
+ isPrimaryKey: false;
366
+ isAutoincrement: false;
367
+ hasRuntimeDefault: false;
368
+ enumValues: [string, ...string[]];
369
+ baseColumn: never;
370
+ identity: undefined;
371
+ generated: undefined;
372
+ }, {}, {
373
+ length: number | undefined;
374
+ }>;
375
+ };
376
+ dialect: "sqlite";
377
+ }>;
378
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/payment-stripe/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAazB,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOvB,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Stripe 一次性充值服务数据库 schema。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 本服务只管理 Stripe 支付侧事实,不直接维护余额账本
6
+ * - 真正的钱包账户、充值单与流水仍然由 balance 服务负责
7
+ * - 这里的表只负责记录 Stripe 支付映射与 webhook 事件
8
+ */
9
+ import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
10
+ /**
11
+ * Stripe 支付记录表。
12
+ *
13
+ * 关键说明(中文)
14
+ * - 一条记录对应一次 topup 的 Stripe 支付尝试
15
+ * - `topup_id` 连接 balance 服务里的充值单
16
+ * - `checkout_url` 允许前端重试取回已创建的 Checkout 链接
17
+ */
18
+ export const stripePayments = sqliteTable("service_stripe_payments", {
19
+ payment_id: text("payment_id").primaryKey(),
20
+ topup_id: text("topup_id").notNull(),
21
+ user_id: text("user_id").notNull(),
22
+ stripe_checkout_session_id: text("stripe_checkout_session_id").notNull(),
23
+ stripe_payment_intent_id: text("stripe_payment_intent_id").notNull(),
24
+ amount: integer("amount").notNull(),
25
+ currency: text("currency").notNull(),
26
+ status: text("status").notNull(),
27
+ checkout_url: text("checkout_url").notNull(),
28
+ metadata_json: text("metadata_json").notNull(),
29
+ created_at: text("created_at").notNull(),
30
+ updated_at: text("updated_at").notNull(),
31
+ });
32
+ /**
33
+ * Stripe webhook 事件表。
34
+ *
35
+ * 关键说明(中文)
36
+ * - `event_id` 作为 webhook 幂等键
37
+ * - `sync_status` 用于区分已应用、忽略和失败的事件
38
+ */
39
+ export const stripeEvents = sqliteTable("service_stripe_events", {
40
+ event_id: text("event_id").primaryKey(),
41
+ type: text("type").notNull(),
42
+ payload_json: text("payload_json").notNull(),
43
+ sync_status: text("sync_status").notNull(),
44
+ sync_error: text("sync_error").notNull(),
45
+ created_at: text("created_at").notNull(),
46
+ });
47
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/payment-stripe/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC,yBAAyB,EAAE;IACnE,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE;IAC3C,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IACpC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;IAClC,0BAA0B,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC,OAAO,EAAE;IACxE,wBAAwB,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE;IACpE,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;IACnC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IACpC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE;IAChC,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC5C,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;IAC9C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACxC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CACzC,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC,uBAAuB,EAAE;IAC/D,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE;IACvC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5B,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC5C,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAC1C,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IACxC,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;CACzC,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Stripe HTTP / webhook 工具函数。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 不直接依赖 Stripe SDK,统一走官方 HTTP API
6
+ * - 创建 Checkout 使用 form-urlencoded,兼容 Node 与 Worker
7
+ * - webhook 验签继续使用 Web Crypto API
8
+ */
9
+ import type { StripeCheckoutSessionResult, StripeCreateCheckoutSessionInput, StripeWebhookEvent } from "./types.js";
10
+ /**
11
+ * 规范化 Stripe API 基础地址。
12
+ */
13
+ export declare function normalizeStripeApiBaseURL(value: string | undefined): string;
14
+ /**
15
+ * 创建 Stripe Checkout Session。
16
+ */
17
+ export declare function createStripeCheckoutSession(secretKey: string, apiBaseURL: string, input: StripeCreateCheckoutSessionInput): Promise<StripeCheckoutSessionResult>;
18
+ /**
19
+ * 解析 Stripe webhook 事件。
20
+ */
21
+ export declare function parseStripeWebhookEvent(raw: string): StripeWebhookEvent;
22
+ /**
23
+ * 验证 Stripe webhook 签名。
24
+ */
25
+ export declare function verifyStripeSignature(raw: string, header: string | null, secret: string): Promise<boolean>;
26
+ /**
27
+ * 规范化非空字符串。
28
+ */
29
+ export declare function normalizeRequired(value: unknown, label: string): string;
30
+ /**
31
+ * 规范化可选字符串。
32
+ */
33
+ export declare function normalizeOptionalText(value: unknown): string;
34
+ /**
35
+ * 规范化 metadata 对象。
36
+ */
37
+ export declare function readMetadata(value: unknown): Record<string, unknown>;
38
+ //# sourceMappingURL=stripe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.d.ts","sourceRoot":"","sources":["../../src/payment-stripe/stripe.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,2BAA2B,EAC3B,gCAAgC,EAChC,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAI3E;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,2BAA2B,CAAC,CA2CtC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAGvE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BhH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIpE"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Stripe HTTP / webhook 工具函数。
3
+ *
4
+ * 关键说明(中文)
5
+ * - 不直接依赖 Stripe SDK,统一走官方 HTTP API
6
+ * - 创建 Checkout 使用 form-urlencoded,兼容 Node 与 Worker
7
+ * - webhook 验签继续使用 Web Crypto API
8
+ */
9
+ /**
10
+ * 规范化 Stripe API 基础地址。
11
+ */
12
+ export function normalizeStripeApiBaseURL(value) {
13
+ const normalized = String(value ?? "https://api.stripe.com/v1").trim();
14
+ if (!normalized)
15
+ throw new TypeError("Stripe API server URL is required");
16
+ return normalized.replace(/\/+$/, "");
17
+ }
18
+ /**
19
+ * 创建 Stripe Checkout Session。
20
+ */
21
+ export async function createStripeCheckoutSession(secretKey, apiBaseURL, input) {
22
+ const body = new URLSearchParams();
23
+ body.set("mode", "payment");
24
+ body.set("success_url", input.success_url);
25
+ body.set("cancel_url", input.cancel_url);
26
+ body.set("client_reference_id", input.topup.topup_id);
27
+ body.set("metadata[payment_id]", input.payment_id);
28
+ body.set("metadata[topup_id]", input.topup.topup_id);
29
+ body.set("metadata[user_id]", input.topup.user_id);
30
+ body.set("line_items[0][price_data][currency]", input.currency);
31
+ body.set("line_items[0][price_data][product_data][name]", input.item_name);
32
+ body.set("line_items[0][price_data][unit_amount]", String(input.topup.amount));
33
+ body.set("line_items[0][quantity]", "1");
34
+ body.set("payment_intent_data[metadata][payment_id]", input.payment_id);
35
+ body.set("payment_intent_data[metadata][topup_id]", input.topup.topup_id);
36
+ body.set("payment_intent_data[metadata][user_id]", input.topup.user_id);
37
+ const response = await fetch(`${normalizeStripeApiBaseURL(apiBaseURL)}/checkout/sessions`, {
38
+ method: "POST",
39
+ headers: {
40
+ authorization: `Bearer ${normalizeRequired(secretKey, "Stripe secret key")}`,
41
+ "content-type": "application/x-www-form-urlencoded",
42
+ },
43
+ body,
44
+ });
45
+ const payload = await readJSONRecord(response);
46
+ if (!response.ok) {
47
+ const message = String((payload.error && typeof payload.error === "object" ? payload.error.message : "") ||
48
+ payload.message ||
49
+ "Stripe checkout session creation failed").trim();
50
+ throw new Error(message || "Stripe checkout session creation failed");
51
+ }
52
+ const sessionId = normalizeRequired(payload.id, "Stripe checkout session id");
53
+ const checkoutURL = normalizeRequired(payload.url, "Stripe checkout session url");
54
+ return {
55
+ session_id: sessionId,
56
+ checkout_url: checkoutURL,
57
+ payment_intent_id: normalizeOptionalText(payload.payment_intent),
58
+ };
59
+ }
60
+ /**
61
+ * 解析 Stripe webhook 事件。
62
+ */
63
+ export function parseStripeWebhookEvent(raw) {
64
+ const parsed = JSON.parse(raw || "{}");
65
+ return parsed && typeof parsed === "object" ? parsed : {};
66
+ }
67
+ /**
68
+ * 验证 Stripe webhook 签名。
69
+ */
70
+ export async function verifyStripeSignature(raw, header, secret) {
71
+ const parts = Object.fromEntries(String(header ?? "").split(",").map((part) => {
72
+ const [key, value] = part.split("=");
73
+ return [key, value];
74
+ }));
75
+ const timestamp = parts.t;
76
+ const signature = parts.v1;
77
+ if (!timestamp || !signature)
78
+ return false;
79
+ const encoder = new TextEncoder();
80
+ const key = await crypto.subtle.importKey("raw", encoder.encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
81
+ const signed = await crypto.subtle.sign("HMAC", key, encoder.encode(`${timestamp}.${raw}`));
82
+ const expected = Array.from(new Uint8Array(signed))
83
+ .map((byte) => byte.toString(16).padStart(2, "0"))
84
+ .join("");
85
+ if (signature.length !== expected.length)
86
+ return false;
87
+ let result = 0;
88
+ for (let index = 0; index < signature.length; index++) {
89
+ result |= signature.charCodeAt(index) ^ expected.charCodeAt(index);
90
+ }
91
+ return result === 0;
92
+ }
93
+ /**
94
+ * 规范化非空字符串。
95
+ */
96
+ export function normalizeRequired(value, label) {
97
+ const normalized = String(value ?? "").trim();
98
+ if (!normalized)
99
+ throw new TypeError(`${label} is required`);
100
+ return normalized;
101
+ }
102
+ /**
103
+ * 规范化可选字符串。
104
+ */
105
+ export function normalizeOptionalText(value) {
106
+ return typeof value === "string" ? value.trim() : "";
107
+ }
108
+ /**
109
+ * 规范化 metadata 对象。
110
+ */
111
+ export function readMetadata(value) {
112
+ return value && typeof value === "object" && !Array.isArray(value)
113
+ ? value
114
+ : {};
115
+ }
116
+ /**
117
+ * 读取 JSON 响应并兜底为空对象。
118
+ */
119
+ async function readJSONRecord(response) {
120
+ const text = await response.text();
121
+ try {
122
+ const parsed = JSON.parse(text || "{}");
123
+ return parsed && typeof parsed === "object" ? parsed : {};
124
+ }
125
+ catch {
126
+ return { message: text };
127
+ }
128
+ }
129
+ //# sourceMappingURL=stripe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripe.js","sourceRoot":"","sources":["../../src/payment-stripe/stripe.ts"],"names":[],"mappings":"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"}