@downcity/services 0.1.67 → 0.1.71

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 (79) hide show
  1. package/bin/accounts/index.d.ts +1 -5
  2. package/bin/accounts/index.d.ts.map +1 -1
  3. package/bin/accounts/index.js +1 -4
  4. package/bin/accounts/index.js.map +1 -1
  5. package/bin/balance/index.d.ts +3 -3
  6. package/bin/balance/index.d.ts.map +1 -1
  7. package/bin/balance/index.js +2 -2
  8. package/bin/balance/index.js.map +1 -1
  9. package/bin/balance/routes.d.ts.map +1 -1
  10. package/bin/balance/routes.js +36 -0
  11. package/bin/balance/routes.js.map +1 -1
  12. package/bin/balance/schema.d.ts +161 -0
  13. package/bin/balance/schema.d.ts.map +1 -1
  14. package/bin/balance/schema.js +38 -0
  15. package/bin/balance/schema.js.map +1 -1
  16. package/bin/balance/service.d.ts +171 -5
  17. package/bin/balance/service.d.ts.map +1 -1
  18. package/bin/balance/service.js +77 -11
  19. package/bin/balance/service.js.map +1 -1
  20. package/bin/balance/types.d.ts +81 -1
  21. package/bin/balance/types.d.ts.map +1 -1
  22. package/bin/balance/utils.d.ts +5 -1
  23. package/bin/balance/utils.d.ts.map +1 -1
  24. package/bin/balance/utils.js +17 -0
  25. package/bin/balance/utils.js.map +1 -1
  26. package/bin/index.d.ts +8 -10
  27. package/bin/index.d.ts.map +1 -1
  28. package/bin/index.js +6 -7
  29. package/bin/index.js.map +1 -1
  30. package/bin/payment/helpers.d.ts +68 -0
  31. package/bin/payment/helpers.d.ts.map +1 -0
  32. package/bin/payment/helpers.js +148 -0
  33. package/bin/payment/helpers.js.map +1 -0
  34. package/bin/payment/index.d.ts +10 -28
  35. package/bin/payment/index.d.ts.map +1 -1
  36. package/bin/payment/index.js +9 -890
  37. package/bin/payment/index.js.map +1 -1
  38. package/bin/payment/providers.d.ts +25 -0
  39. package/bin/payment/providers.d.ts.map +1 -0
  40. package/bin/payment/providers.js +415 -0
  41. package/bin/payment/providers.js.map +1 -0
  42. package/bin/payment/routes.d.ts +29 -0
  43. package/bin/payment/routes.d.ts.map +1 -0
  44. package/bin/payment/routes.js +394 -0
  45. package/bin/payment/routes.js.map +1 -0
  46. package/bin/{billing → payment}/service.d.ts +99 -278
  47. package/bin/payment/service.d.ts.map +1 -0
  48. package/bin/payment/service.js +72 -0
  49. package/bin/payment/service.js.map +1 -0
  50. package/bin/payment/types.d.ts +11 -18
  51. package/bin/payment/types.d.ts.map +1 -1
  52. package/bin/usage/index.d.ts +3 -174
  53. package/bin/usage/index.d.ts.map +1 -1
  54. package/bin/usage/index.js +2 -117
  55. package/bin/usage/index.js.map +1 -1
  56. package/bin/usage/service.d.ts +353 -0
  57. package/bin/usage/service.d.ts.map +1 -0
  58. package/bin/usage/service.js +140 -0
  59. package/bin/usage/service.js.map +1 -0
  60. package/package.json +2 -2
  61. package/bin/billing/index.d.ts +0 -7
  62. package/bin/billing/index.d.ts.map +0 -1
  63. package/bin/billing/index.js +0 -6
  64. package/bin/billing/index.js.map +0 -1
  65. package/bin/billing/routes.d.ts +0 -14
  66. package/bin/billing/routes.d.ts.map +0 -1
  67. package/bin/billing/routes.js +0 -61
  68. package/bin/billing/routes.js.map +0 -1
  69. package/bin/billing/schema.d.ts +0 -582
  70. package/bin/billing/schema.d.ts.map +0 -1
  71. package/bin/billing/schema.js +0 -81
  72. package/bin/billing/schema.js.map +0 -1
  73. package/bin/billing/service.d.ts.map +0 -1
  74. package/bin/billing/service.js +0 -492
  75. package/bin/billing/service.js.map +0 -1
  76. package/bin/billing/types.d.ts +0 -226
  77. package/bin/billing/types.d.ts.map +0 -1
  78. package/bin/billing/types.js +0 -10
  79. package/bin/billing/types.js.map +0 -1
@@ -1,492 +0,0 @@
1
- /**
2
- * Downcity 官方 Billing 服务实现。
3
- *
4
- * 设计边界:
5
- * - usage 负责记录事实,billing 负责把事实换算成 charge
6
- * - balance 负责真正的钱包扣减与流水
7
- * - pricing rule 使用 microcredits,1 credit = 1 USD = 1_000_000 microcredits
8
- */
9
- import { InstallableService, } from "@downcity/city";
10
- import { rawAll, rawFirst, rawRun } from "../balance/raw.js";
11
- import { microcreditsToCredits } from "../balance/amount.js";
12
- import { billingCharges, billingPricingRules, CHARGE_TABLE, PRICING_RULE_TABLE } from "./schema.js";
13
- import { registerBillingRoutes } from "./routes.js";
14
- const TOKENS_PER_MTOKEN = 1_000_000;
15
- const PRICING_RULE_COLUMNS = [
16
- "rule_id",
17
- "service_id",
18
- "action_id",
19
- "model_id",
20
- "provider_id",
21
- "request_microcredits",
22
- "input_token_microcredits",
23
- "input_mtoken_microcredits",
24
- "output_token_microcredits",
25
- "output_mtoken_microcredits",
26
- "cached_token_microcredits",
27
- "cached_mtoken_microcredits",
28
- "image_microcredits",
29
- "status",
30
- "note",
31
- "created_at",
32
- "updated_at",
33
- ].join(", ");
34
- const PRICING_RULE_MTOKEN_COLUMNS = [
35
- "input_mtoken_microcredits",
36
- "output_mtoken_microcredits",
37
- "cached_mtoken_microcredits",
38
- ];
39
- /**
40
- * Billing 服务实例。
41
- */
42
- export class BillingService extends InstallableService {
43
- id = "billing";
44
- name = "Billing";
45
- version = "0.1.0";
46
- schema = {
47
- pricing_rules: billingPricingRules,
48
- charges: billingCharges,
49
- };
50
- balance;
51
- initialRules;
52
- requireBeforeCall;
53
- constructor(options) {
54
- super();
55
- this.balance = options.balance;
56
- this.initialRules = options.pricing_rules ?? [];
57
- this.requireBeforeCall = options.require_before_call !== false;
58
- this.instruction = [
59
- "根据 service 调用的标准 metering 计算扣费,并通过 balance 执行 microcredits 扣款。",
60
- "pricing rule 使用 microcredits:1 credit = 1 USD = 1_000_000 microcredits。",
61
- "Billing 不负责 provider 调用,也不替代 usage 事实层。",
62
- ].join("\n");
63
- }
64
- async _onInit() {
65
- await super._onInit();
66
- await this.ensurePricingRuleColumns();
67
- for (const rule of this.initialRules) {
68
- await this.upsertPricingRule(rule);
69
- }
70
- }
71
- install(ctx) {
72
- registerBillingRoutes(this, ctx);
73
- if (this.requireBeforeCall) {
74
- ctx.hook.before(async (serviceCtx) => {
75
- if (!shouldBill(serviceCtx))
76
- return;
77
- const rule = await this.resolvePricingRule(serviceCtx);
78
- if (!rule)
79
- return;
80
- const amount_microcredits = calculateChargeAmount(serviceCtx, rule, { estimate: true });
81
- if (amount_microcredits <= 0)
82
- return;
83
- await this.balance.requireMicrocredits(serviceCtx.user.user_id, amount_microcredits);
84
- });
85
- }
86
- ctx.hook.after(async (serviceCtx) => {
87
- if (!shouldBill(serviceCtx))
88
- return;
89
- if (serviceCtx.locals.ai_billing_handled)
90
- return;
91
- if (!isSuccessfulOutput(serviceCtx.output))
92
- return;
93
- await this.settle(serviceCtx);
94
- });
95
- }
96
- /**
97
- * 新增或更新 pricing rule。
98
- */
99
- async upsertPricingRule(input) {
100
- const now = new Date().toISOString();
101
- const rule = normalizePricingRule(input, now);
102
- const existing = await this.readPricingRule(rule.rule_id);
103
- if (existing) {
104
- await rawRun(this.resolveRaw(), [
105
- `UPDATE ${PRICING_RULE_TABLE}`,
106
- "SET service_id = ?, action_id = ?, model_id = ?, provider_id = ?, request_microcredits = ?, input_token_microcredits = ?, input_mtoken_microcredits = ?, output_token_microcredits = ?, output_mtoken_microcredits = ?, cached_token_microcredits = ?, cached_mtoken_microcredits = ?, image_microcredits = ?, status = ?, note = ?, updated_at = ?",
107
- "WHERE rule_id = ?",
108
- ].join(" "), [
109
- rule.service_id,
110
- rule.action_id,
111
- rule.model_id,
112
- rule.provider_id,
113
- rule.request_microcredits,
114
- rule.input_token_microcredits,
115
- rule.input_mtoken_microcredits,
116
- rule.output_token_microcredits,
117
- rule.output_mtoken_microcredits,
118
- rule.cached_token_microcredits,
119
- rule.cached_mtoken_microcredits,
120
- rule.image_microcredits,
121
- rule.status,
122
- rule.note,
123
- now,
124
- rule.rule_id,
125
- ]);
126
- return await this.readPricingRuleRequired(rule.rule_id);
127
- }
128
- await rawRun(this.resolveRaw(), [
129
- `INSERT INTO ${PRICING_RULE_TABLE} (${PRICING_RULE_COLUMNS})`,
130
- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
131
- ].join(" "), [
132
- rule.rule_id,
133
- rule.service_id,
134
- rule.action_id,
135
- rule.model_id,
136
- rule.provider_id,
137
- rule.request_microcredits,
138
- rule.input_token_microcredits,
139
- rule.input_mtoken_microcredits,
140
- rule.output_token_microcredits,
141
- rule.output_mtoken_microcredits,
142
- rule.cached_token_microcredits,
143
- rule.cached_mtoken_microcredits,
144
- rule.image_microcredits,
145
- rule.status,
146
- rule.note,
147
- rule.created_at,
148
- rule.updated_at,
149
- ]);
150
- return await this.readPricingRuleRequired(rule.rule_id);
151
- }
152
- /**
153
- * 列出 pricing rules。
154
- */
155
- async listPricingRules(query = {}) {
156
- const rows = await rawAll(this.resolveRaw(), [
157
- `SELECT ${PRICING_RULE_COLUMNS} FROM ${PRICING_RULE_TABLE}`,
158
- "ORDER BY updated_at DESC, rowid DESC",
159
- "LIMIT ?",
160
- ].join(" "), [normalizeLimit(query.limit)]);
161
- return rows.map(parsePricingRuleRow);
162
- }
163
- /**
164
- * 列出 charge。
165
- */
166
- async listCharges(query = {}) {
167
- const params = [];
168
- const clauses = [];
169
- if (query.user_id) {
170
- clauses.push("user_id = ?");
171
- params.push(String(query.user_id));
172
- }
173
- if (query.town_id) {
174
- clauses.push("town_id = ?");
175
- params.push(String(query.town_id));
176
- }
177
- const where = clauses.length > 0 ? `WHERE ${clauses.join(" AND ")}` : "";
178
- const rows = await rawAll(this.resolveRaw(), [
179
- `SELECT charge_id, user_id, town_id, service_id, action_id, model_id, provider_id, rule_id, amount_microcredits, status, note, metadata_json, created_at FROM ${CHARGE_TABLE}`,
180
- where,
181
- "ORDER BY created_at DESC, rowid DESC",
182
- "LIMIT ?",
183
- ].join(" "), [...params, normalizeLimit(query.limit)]);
184
- return rows.map(parseChargeRow);
185
- }
186
- /**
187
- * 对当前 service 调用执行结算。
188
- */
189
- async settle(ctx) {
190
- const rule = await this.resolvePricingRule(ctx);
191
- if (!rule)
192
- return undefined;
193
- const amount_microcredits = calculateChargeAmount(ctx, rule, { estimate: false });
194
- if (amount_microcredits <= 0)
195
- return undefined;
196
- const charge = await this.createCharge(ctx, rule, amount_microcredits);
197
- await this.balance.subMicrocredits(ctx.user.user_id, amount_microcredits, {
198
- note: charge.note,
199
- ref: charge.charge_id,
200
- meta: {
201
- charge_id: charge.charge_id,
202
- service_id: charge.service_id,
203
- action_id: charge.action_id,
204
- model_id: charge.model_id,
205
- provider_id: charge.provider_id,
206
- rule_id: charge.rule_id,
207
- metering: ctx.metering ?? {},
208
- },
209
- });
210
- return charge;
211
- }
212
- /**
213
- * 显式扣费。
214
- *
215
- * 关键说明(中文)
216
- * - AI Provider 可以自行完成 usage 与价格换算,然后通过 AIService 调用这里。
217
- * - Billing 只负责扣余额和记录账单,不理解 provider 内部 usage 结构。
218
- */
219
- async charge(input) {
220
- if (!shouldBill(input.ctx))
221
- return undefined;
222
- const amount_microcredits = normalizeNonNegativeInteger(input.amount_microcredits, "amount_microcredits");
223
- if (amount_microcredits <= 0)
224
- return undefined;
225
- const charge = await this.createCharge(input.ctx, undefined, amount_microcredits, {
226
- note: input.note,
227
- metadata: input.metadata,
228
- });
229
- await this.balance.subMicrocredits(input.ctx.user.user_id, amount_microcredits, {
230
- note: charge.note,
231
- ref: charge.charge_id,
232
- meta: {
233
- charge_id: charge.charge_id,
234
- service_id: charge.service_id,
235
- action_id: charge.action_id,
236
- model_id: charge.model_id,
237
- provider_id: charge.provider_id,
238
- explicit_billing: true,
239
- ...(input.metadata ? { billing: input.metadata } : {}),
240
- },
241
- });
242
- return charge;
243
- }
244
- async createCharge(ctx, rule, amount_microcredits, options = {}) {
245
- const now = new Date().toISOString();
246
- const charge = {
247
- charge_id: `chg_${randomId()}`,
248
- user_id: ctx.user?.user_id ?? "",
249
- town_id: ctx.town?.town_id ?? "",
250
- service_id: ctx.service?.id ?? "",
251
- action_id: ctx.action?.id ?? "",
252
- model_id: ctx.variant?.id ?? ctx.metering?.model_id ?? "",
253
- provider_id: ctx.metering?.provider_id ?? "",
254
- rule_id: rule?.rule_id ?? "",
255
- amount: microcreditsToCredits(amount_microcredits),
256
- amount_microcredits,
257
- status: "settled",
258
- note: options.note || `${ctx.service?.id ?? "service"} ${ctx.action?.id ?? "action"}`,
259
- metadata_json: JSON.stringify({
260
- metering: ctx.metering ?? {},
261
- pricing_rule: rule?.rule_id ?? "",
262
- ...(options.metadata ? { billing: options.metadata } : {}),
263
- }),
264
- created_at: now,
265
- };
266
- await rawRun(this.resolveRaw(), [
267
- `INSERT INTO ${CHARGE_TABLE} (charge_id, user_id, town_id, service_id, action_id, model_id, provider_id, rule_id, amount_microcredits, status, note, metadata_json, created_at)`,
268
- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
269
- ].join(" "), [
270
- charge.charge_id,
271
- charge.user_id,
272
- charge.town_id,
273
- charge.service_id,
274
- charge.action_id,
275
- charge.model_id,
276
- charge.provider_id,
277
- charge.rule_id,
278
- charge.amount_microcredits,
279
- charge.status,
280
- charge.note,
281
- charge.metadata_json,
282
- charge.created_at,
283
- ]);
284
- return charge;
285
- }
286
- async resolvePricingRule(ctx) {
287
- const rules = (await this.listPricingRules({ limit: 200 }))
288
- .filter((rule) => rule.status === "active")
289
- .filter((rule) => matchesRule(rule.service_id, ctx.service?.id ?? ""))
290
- .filter((rule) => matchesRule(rule.action_id, ctx.action?.id ?? ""))
291
- .filter((rule) => matchesRule(rule.model_id, ctx.variant?.id ?? ctx.metering?.model_id ?? ""))
292
- .filter((rule) => matchesRule(rule.provider_id, ctx.metering?.provider_id ?? ""));
293
- return rules.sort((a, b) => scoreRule(b) - scoreRule(a))[0];
294
- }
295
- async readPricingRule(rule_id) {
296
- const row = await rawFirst(this.resolveRaw(), [
297
- `SELECT ${PRICING_RULE_COLUMNS} FROM ${PRICING_RULE_TABLE}`,
298
- "WHERE rule_id = ?",
299
- ].join(" "), [rule_id]);
300
- return row ? parsePricingRuleRow(row) : undefined;
301
- }
302
- async readPricingRuleRequired(rule_id) {
303
- const row = await this.readPricingRule(rule_id);
304
- if (!row)
305
- throw new Error(`pricing rule not found: ${rule_id}`);
306
- return row;
307
- }
308
- async ensurePricingRuleColumns() {
309
- for (const column of PRICING_RULE_MTOKEN_COLUMNS) {
310
- try {
311
- await rawRun(this.resolveRaw(), `ALTER TABLE ${PRICING_RULE_TABLE} ADD COLUMN ${column} INTEGER NOT NULL DEFAULT 0`, []);
312
- }
313
- catch (error) {
314
- const message = error instanceof Error ? error.message : String(error);
315
- if (!/duplicate column|already exists/i.test(message))
316
- throw error;
317
- }
318
- }
319
- }
320
- resolveRaw() {
321
- if (!this._raw) {
322
- throw new Error("billing service raw database is not ready");
323
- }
324
- return this._raw;
325
- }
326
- }
327
- /**
328
- * 创建 Billing 服务实例。
329
- */
330
- export function billingService(options) {
331
- return new BillingService(options);
332
- }
333
- /**
334
- * 是否应该对当前调用计费。
335
- */
336
- function shouldBill(ctx) {
337
- return Boolean(ctx.identity?.kind === "user" && ctx.user?.user_id && ctx.town?.town_id && ctx.service?.id !== "billing");
338
- }
339
- /**
340
- * 判断输出是否成功。
341
- */
342
- function isSuccessfulOutput(output) {
343
- return !(output instanceof Response) || output.status < 400;
344
- }
345
- /**
346
- * 计算扣费金额。
347
- */
348
- function calculateChargeAmount(ctx, rule, options) {
349
- const metering = ctx.metering ?? {};
350
- const request_count = Number(metering.request_count ?? 1);
351
- const input_tokens = options.estimate ? 0 : Number(metering.input_tokens ?? 0);
352
- const output_tokens = options.estimate ? 0 : Number(metering.output_tokens ?? 0);
353
- const cached_tokens = options.estimate ? 0 : Number(metering.cached_tokens ?? 0);
354
- const image_count = options.estimate ? 0 : Number(metering.image_count ?? 0);
355
- const total = request_count * rule.request_microcredits
356
- + input_tokens * rule.input_token_microcredits
357
- + (input_tokens * rule.input_mtoken_microcredits) / TOKENS_PER_MTOKEN
358
- + output_tokens * rule.output_token_microcredits
359
- + (output_tokens * rule.output_mtoken_microcredits) / TOKENS_PER_MTOKEN
360
- + cached_tokens * rule.cached_token_microcredits
361
- + (cached_tokens * rule.cached_mtoken_microcredits) / TOKENS_PER_MTOKEN
362
- + image_count * rule.image_microcredits;
363
- return Number.isFinite(total) && total > 0 ? Math.ceil(total) : 0;
364
- }
365
- /**
366
- * 规则字段为空时表示 fallback。
367
- */
368
- function matchesRule(rule_value, actual_value) {
369
- return !rule_value || rule_value === actual_value;
370
- }
371
- /**
372
- * 规则越具体优先级越高。
373
- */
374
- function scoreRule(rule) {
375
- return [
376
- rule.service_id,
377
- rule.action_id,
378
- rule.model_id,
379
- rule.provider_id,
380
- ].filter(Boolean).length;
381
- }
382
- /**
383
- * 标准化 pricing rule。
384
- */
385
- function normalizePricingRule(input, now) {
386
- const service_id = normalizeText(input.service_id ?? "ai");
387
- const action_id = normalizeText(input.action_id ?? "");
388
- const model_id = normalizeText(input.model_id ?? "");
389
- const provider_id = normalizeText(input.provider_id ?? "");
390
- return {
391
- rule_id: normalizeText(input.rule_id) || `price_${randomId()}`,
392
- service_id,
393
- action_id,
394
- model_id,
395
- provider_id,
396
- request_microcredits: normalizeNonNegativeInteger(input.request_microcredits ?? 0, "request_microcredits"),
397
- input_token_microcredits: normalizeNonNegativeInteger(input.input_token_microcredits ?? 0, "input_token_microcredits"),
398
- input_mtoken_microcredits: normalizeNonNegativeInteger(input.input_mtoken_microcredits ?? 0, "input_mtoken_microcredits"),
399
- output_token_microcredits: normalizeNonNegativeInteger(input.output_token_microcredits ?? 0, "output_token_microcredits"),
400
- output_mtoken_microcredits: normalizeNonNegativeInteger(input.output_mtoken_microcredits ?? 0, "output_mtoken_microcredits"),
401
- cached_token_microcredits: normalizeNonNegativeInteger(input.cached_token_microcredits ?? 0, "cached_token_microcredits"),
402
- cached_mtoken_microcredits: normalizeNonNegativeInteger(input.cached_mtoken_microcredits ?? 0, "cached_mtoken_microcredits"),
403
- image_microcredits: normalizeNonNegativeInteger(input.image_microcredits ?? 0, "image_microcredits"),
404
- status: input.status === "disabled" ? "disabled" : "active",
405
- note: normalizeText(input.note),
406
- created_at: now,
407
- updated_at: now,
408
- };
409
- }
410
- /**
411
- * 解析 pricing rule 行。
412
- */
413
- function parsePricingRuleRow(row) {
414
- return {
415
- rule_id: String(row.rule_id),
416
- service_id: String(row.service_id ?? ""),
417
- action_id: String(row.action_id ?? ""),
418
- model_id: String(row.model_id ?? ""),
419
- provider_id: String(row.provider_id ?? ""),
420
- request_microcredits: Number(row.request_microcredits ?? 0),
421
- input_token_microcredits: Number(row.input_token_microcredits ?? 0),
422
- input_mtoken_microcredits: Number(row.input_mtoken_microcredits ?? 0),
423
- output_token_microcredits: Number(row.output_token_microcredits ?? 0),
424
- output_mtoken_microcredits: Number(row.output_mtoken_microcredits ?? 0),
425
- cached_token_microcredits: Number(row.cached_token_microcredits ?? 0),
426
- cached_mtoken_microcredits: Number(row.cached_mtoken_microcredits ?? 0),
427
- image_microcredits: Number(row.image_microcredits ?? 0),
428
- status: row.status === "disabled" ? "disabled" : "active",
429
- note: String(row.note ?? ""),
430
- created_at: String(row.created_at ?? ""),
431
- updated_at: String(row.updated_at ?? ""),
432
- };
433
- }
434
- /**
435
- * 解析 charge 行。
436
- */
437
- function parseChargeRow(row) {
438
- const amount_microcredits = Number(row.amount_microcredits ?? 0);
439
- return {
440
- charge_id: String(row.charge_id),
441
- user_id: String(row.user_id ?? ""),
442
- town_id: String(row.town_id ?? ""),
443
- service_id: String(row.service_id ?? ""),
444
- action_id: String(row.action_id ?? ""),
445
- model_id: String(row.model_id ?? ""),
446
- provider_id: String(row.provider_id ?? ""),
447
- rule_id: String(row.rule_id ?? ""),
448
- amount: microcreditsToCredits(amount_microcredits),
449
- amount_microcredits,
450
- status: row.status === "skipped" ? "skipped" : "settled",
451
- note: String(row.note ?? ""),
452
- metadata_json: String(row.metadata_json ?? "{}"),
453
- created_at: String(row.created_at ?? ""),
454
- };
455
- }
456
- /**
457
- * 标准化非负整数。
458
- */
459
- function normalizeNonNegativeInteger(value, label) {
460
- const normalized = Number(value ?? 0);
461
- if (!Number.isSafeInteger(normalized) || normalized < 0) {
462
- throw new TypeError(`${label} must be a non-negative integer`);
463
- }
464
- return normalized;
465
- }
466
- /**
467
- * 标准化 limit。
468
- */
469
- function normalizeLimit(value) {
470
- const normalized = Number(value ?? 20);
471
- if (!Number.isInteger(normalized) || normalized <= 0)
472
- return 20;
473
- return Math.min(normalized, 200);
474
- }
475
- /**
476
- * 标准化文本。
477
- */
478
- function normalizeText(value) {
479
- return String(value ?? "").trim();
480
- }
481
- /**
482
- * 生成随机 ID。
483
- */
484
- function randomId() {
485
- const bytes = new Uint8Array(12);
486
- crypto.getRandomValues(bytes);
487
- return btoa(String.fromCharCode(...bytes))
488
- .replace(/\+/g, "-")
489
- .replace(/\//g, "_")
490
- .replace(/=+$/, "");
491
- }
492
- //# sourceMappingURL=service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/billing/service.ts"],"names":[],"mappings":"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"}