@tokenbuddy/contracts 1.0.0 → 1.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/crypto.d.ts +50 -4
- package/dist/src/crypto.d.ts.map +1 -1
- package/dist/src/crypto.js +26 -4
- package/dist/src/crypto.js.map +1 -1
- package/dist/src/errors.d.ts +42 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +30 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/upstream-balance-probe.d.ts +41 -0
- package/dist/src/upstream-balance-probe.d.ts.map +1 -0
- package/dist/src/upstream-balance-probe.js +384 -0
- package/dist/src/upstream-balance-probe.js.map +1 -0
- package/package.json +2 -2
- package/src/crypto.ts +50 -4
- package/src/errors.ts +42 -0
- package/src/index.ts +1 -0
- package/src/upstream-balance-probe.ts +505 -0
- package/tests/crypto.test.ts +7 -7
package/dist/src/crypto.d.ts
CHANGED
|
@@ -9,37 +9,83 @@ export declare function encryptSm4EcbPkcs7Base64(plaintext: string, sm4KeyBase64
|
|
|
9
9
|
*/
|
|
10
10
|
export declare function decryptSm4EcbPkcs7Base64(encryptedBase64: string, sm4KeyBase64: string): string;
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
12
|
+
* 计算资源 slug 的 MD5 摘要(hex 编码)。
|
|
13
|
+
* 用作 Clawtip 支付的 indicator 字段,seller 端用于校验资源一致性。
|
|
14
|
+
*
|
|
15
|
+
* @param slug 资源 slug
|
|
16
|
+
* @returns 小写十六进制的 MD5 摘要
|
|
13
17
|
*/
|
|
14
18
|
export declare function computeIndicator(slug: string): string;
|
|
15
19
|
/**
|
|
16
|
-
*
|
|
20
|
+
* 生成 32 字符小写十六进制字符串作为订单号。
|
|
21
|
+
* 实现细节:UUID v4 去除中横线,保证全局唯一且 URL/日志友好。
|
|
22
|
+
*
|
|
23
|
+
* @returns 32 字符小写 hex 字符串
|
|
17
24
|
*/
|
|
18
25
|
export declare function generateOrderNo(): string;
|
|
19
26
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
27
|
+
* 加密 Clawtip 订单数据。
|
|
28
|
+
* 明文格式:`{"orderNo":..., "amount":..., "payTo":...}`,使用 SM4-ECB-PKCS7 加密后 base64 编码。
|
|
29
|
+
*
|
|
30
|
+
* @param orderNo 订单号
|
|
31
|
+
* @param amount 订单金额(分)
|
|
32
|
+
* @param payTo 收款方标识
|
|
33
|
+
* @param sm4KeyBase64 SM4 密钥的 base64 编码(必须解码为 16 字节)
|
|
34
|
+
* @returns base64 编码的密文
|
|
22
35
|
*/
|
|
23
36
|
export declare function encryptClawtipOrderData(orderNo: string, amount: number, payTo: string, sm4KeyBase64: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Clawtip 支付下单所需的完整参数。
|
|
39
|
+
* 由 `buildClawtipPaymentParams` 在 buyer 端组装后下发到 seller。
|
|
40
|
+
*/
|
|
24
41
|
export interface ClawtipPaymentParams {
|
|
42
|
+
/** 32 字符小写十六进制的订单号(UUID v4 去横线),全局唯一标识一次下单 */
|
|
25
43
|
orderNo: string;
|
|
44
|
+
/** 订单金额,单位为分(人民币 1 元 = 100 分) */
|
|
26
45
|
amountFen: number;
|
|
46
|
+
/** 收款方标识,seller 校验该字段决定打款目标 */
|
|
27
47
|
payTo: string;
|
|
48
|
+
/** SM4-ECB-PKCS7 加密的 `{orderNo, amount, payTo}` JSON,base64 编码 */
|
|
28
49
|
encryptedData: string;
|
|
50
|
+
/** 资源 slug 的 MD5 摘要,用于 seller 校验资源一致性 */
|
|
29
51
|
indicator: string;
|
|
52
|
+
/** 资源 slug(人类可读 ID),与 indicator 配对使用 */
|
|
30
53
|
slug: string;
|
|
54
|
+
/** Clawtip 平台的技能 ID */
|
|
31
55
|
skillId: string;
|
|
56
|
+
/** 支付场景的人类可读描述,展示给支付方 */
|
|
32
57
|
description: string;
|
|
58
|
+
/** 资源下载/访问 URL,可用于支付完成后的资源定位 */
|
|
33
59
|
resourceUrl: string;
|
|
34
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* 构造 `ClawtipPaymentParams` 所需的原始输入。
|
|
63
|
+
* 调用方只需要提供业务字段;`orderNo` 和 `encryptedData` 由 builder 自动生成。
|
|
64
|
+
*/
|
|
35
65
|
export interface ClawtipPaymentParamsInput {
|
|
66
|
+
/** 收款方标识 */
|
|
36
67
|
payTo: string;
|
|
68
|
+
/** SM4 密钥的 base64 编码(解密后必须为 16 字节) */
|
|
37
69
|
sm4KeyBase64: string;
|
|
70
|
+
/** 资源 slug,会同时参与 indicator 计算 */
|
|
38
71
|
skillSlug: string;
|
|
72
|
+
/** Clawtip 平台的技能 ID */
|
|
39
73
|
skillId: string;
|
|
74
|
+
/** 支付场景描述 */
|
|
40
75
|
description: string;
|
|
76
|
+
/** 资源 URL */
|
|
41
77
|
resourceUrl: string;
|
|
78
|
+
/** 订单金额(分),必须为正整数 */
|
|
42
79
|
amountFen: number;
|
|
43
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* 构造 `ClawtipPaymentParams` 完整参数。
|
|
83
|
+
* 负责:生成 `orderNo`、对 `(orderNo, amount, payTo)` 做 SM4 加密、计算 `indicator`。
|
|
84
|
+
* `amountFen` 必须为正整数,否则抛错。
|
|
85
|
+
*
|
|
86
|
+
* @param input 业务字段输入
|
|
87
|
+
* @returns 包含加密数据的完整支付参数
|
|
88
|
+
* @throws Error 当 `amountFen` 不是正整数时
|
|
89
|
+
*/
|
|
44
90
|
export declare function buildClawtipPaymentParams(input: ClawtipPaymentParamsInput): ClawtipPaymentParams;
|
|
45
91
|
//# sourceMappingURL=crypto.d.ts.map
|
package/dist/src/crypto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAWxF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAU9F;AAED
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAWxF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,eAAe,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAU9F;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GACnB,MAAM,CAOR;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,aAAa,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,YAAY;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,yBAAyB,GAAG,oBAAoB,CAiBhG"}
|
package/dist/src/crypto.js
CHANGED
|
@@ -86,20 +86,33 @@ function decryptSm4EcbPkcs7Base64(encryptedBase64, sm4KeyBase64) {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
/**
|
|
89
|
-
*
|
|
89
|
+
* 计算资源 slug 的 MD5 摘要(hex 编码)。
|
|
90
|
+
* 用作 Clawtip 支付的 indicator 字段,seller 端用于校验资源一致性。
|
|
91
|
+
*
|
|
92
|
+
* @param slug 资源 slug
|
|
93
|
+
* @returns 小写十六进制的 MD5 摘要
|
|
90
94
|
*/
|
|
91
95
|
function computeIndicator(slug) {
|
|
92
96
|
return crypto.createHash("md5").update(slug, "utf8").digest("hex");
|
|
93
97
|
}
|
|
94
98
|
/**
|
|
95
|
-
*
|
|
99
|
+
* 生成 32 字符小写十六进制字符串作为订单号。
|
|
100
|
+
* 实现细节:UUID v4 去除中横线,保证全局唯一且 URL/日志友好。
|
|
101
|
+
*
|
|
102
|
+
* @returns 32 字符小写 hex 字符串
|
|
96
103
|
*/
|
|
97
104
|
function generateOrderNo() {
|
|
98
105
|
return (0, uuid_1.v4)().replace(/-/g, "");
|
|
99
106
|
}
|
|
100
107
|
/**
|
|
101
|
-
*
|
|
102
|
-
*
|
|
108
|
+
* 加密 Clawtip 订单数据。
|
|
109
|
+
* 明文格式:`{"orderNo":..., "amount":..., "payTo":...}`,使用 SM4-ECB-PKCS7 加密后 base64 编码。
|
|
110
|
+
*
|
|
111
|
+
* @param orderNo 订单号
|
|
112
|
+
* @param amount 订单金额(分)
|
|
113
|
+
* @param payTo 收款方标识
|
|
114
|
+
* @param sm4KeyBase64 SM4 密钥的 base64 编码(必须解码为 16 字节)
|
|
115
|
+
* @returns base64 编码的密文
|
|
103
116
|
*/
|
|
104
117
|
function encryptClawtipOrderData(orderNo, amount, payTo, sm4KeyBase64) {
|
|
105
118
|
const plaintext = JSON.stringify({
|
|
@@ -109,6 +122,15 @@ function encryptClawtipOrderData(orderNo, amount, payTo, sm4KeyBase64) {
|
|
|
109
122
|
});
|
|
110
123
|
return encryptSm4EcbPkcs7Base64(plaintext, sm4KeyBase64);
|
|
111
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* 构造 `ClawtipPaymentParams` 完整参数。
|
|
127
|
+
* 负责:生成 `orderNo`、对 `(orderNo, amount, payTo)` 做 SM4 加密、计算 `indicator`。
|
|
128
|
+
* `amountFen` 必须为正整数,否则抛错。
|
|
129
|
+
*
|
|
130
|
+
* @param input 业务字段输入
|
|
131
|
+
* @returns 包含加密数据的完整支付参数
|
|
132
|
+
* @throws Error 当 `amountFen` 不是正整数时
|
|
133
|
+
*/
|
|
112
134
|
function buildClawtipPaymentParams(input) {
|
|
113
135
|
if (!Number.isInteger(input.amountFen) || input.amountFen < 1) {
|
|
114
136
|
throw new Error("amount_fen must be greater than zero");
|
package/dist/src/crypto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,4DAWC;AAMD,4DAUC;
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"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"}
|
package/dist/src/errors.d.ts
CHANGED
|
@@ -30,18 +30,60 @@ export declare enum ErrorCode {
|
|
|
30
30
|
UpstreamTimeout = "upstream_timeout",
|
|
31
31
|
ContractVersionDrift = "contract_version_drift"
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* 错误码到重试策略分类的映射。
|
|
35
|
+
* buyer / seller 路由层根据该结果决定是否自动重试、是否触发 fail-closed。
|
|
36
|
+
*
|
|
37
|
+
* @param code 业务错误码
|
|
38
|
+
* @returns 重试分类:`RetryableWithBackoff`(建议退避重试)、`FailClosed`(关闭交易、人工介入)、`NotRetryable`(直接报错给用户)
|
|
39
|
+
*/
|
|
33
40
|
export declare function getRetryClass(code: ErrorCode): RetryClass;
|
|
41
|
+
/**
|
|
42
|
+
* 错误码到 HTTP 状态码的映射。
|
|
43
|
+
* 当协议层把业务错误透传为 HTTP 响应(如 buyer → wallet-bootstrap 健康检查)时使用。
|
|
44
|
+
*
|
|
45
|
+
* @param code 业务错误码
|
|
46
|
+
* @returns 对应的 HTTP 状态码(4xx/5xx)
|
|
47
|
+
*/
|
|
34
48
|
export declare function getHttpStatus(code: ErrorCode): number;
|
|
49
|
+
/**
|
|
50
|
+
* 错误码到默认人类可读消息的映射。
|
|
51
|
+
* 用于 `createErrorEnvelope` 未传 `message` 参数时的兜底文案。
|
|
52
|
+
*
|
|
53
|
+
* @param code 业务错误码
|
|
54
|
+
* @returns 默认错误消息
|
|
55
|
+
*/
|
|
35
56
|
export declare function getDefaultMessage(code: ErrorCode): string;
|
|
57
|
+
/**
|
|
58
|
+
* 标准错误体的字段定义。HTTP 响应或 JSON-RPC error 对象均使用该结构。
|
|
59
|
+
*/
|
|
36
60
|
export interface ErrorBody {
|
|
61
|
+
/** 机器可读的错误码,用于客户端做错误分支处理 */
|
|
37
62
|
code: ErrorCode;
|
|
63
|
+
/** 错误重试分类(fail_closed / retryable_with_backoff / not_retryable) */
|
|
38
64
|
retryClass: RetryClass;
|
|
65
|
+
/** 人类可读的错误描述 */
|
|
39
66
|
message: string;
|
|
67
|
+
/** 推荐的 HTTP 状态码,HTTP 透传场景下使用 */
|
|
40
68
|
httpStatus: number;
|
|
69
|
+
/** 退避建议秒数(仅 429/重试类错误附带) */
|
|
41
70
|
retryAfterSeconds?: number;
|
|
42
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* 错误响应的标准外壳。所有非 2xx 响应都以 `{ error: {...} }` 形式返回。
|
|
74
|
+
*/
|
|
43
75
|
export interface ErrorEnvelope {
|
|
76
|
+
/** 嵌套的错误体 */
|
|
44
77
|
error: ErrorBody;
|
|
45
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* 构造标准错误响应外壳。
|
|
81
|
+
* 自动填充 `retryClass`、`httpStatus`、默认 `message`,调用方只需提供 `code` 和可选的覆盖字段。
|
|
82
|
+
*
|
|
83
|
+
* @param code 业务错误码,决定 retryClass / httpStatus / 默认 message
|
|
84
|
+
* @param message 自定义消息;省略时使用 `getDefaultMessage(code)` 兜底文案
|
|
85
|
+
* @param retryAfterSeconds 退避秒数,仅在需要时填入(如 429)
|
|
86
|
+
* @returns 完整的 `ErrorEnvelope` 对象
|
|
87
|
+
*/
|
|
46
88
|
export declare function createErrorEnvelope(code: ErrorCode, message?: string, retryAfterSeconds?: number): ErrorEnvelope;
|
|
47
89
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/src/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACpB,UAAU,gBAAgB;IAC1B,oBAAoB,2BAA2B;IAC/C,YAAY,kBAAkB;CAC/B;AAED,oBAAY,SAAS;IACnB,YAAY,kBAAkB;IAC9B,eAAe,qBAAqB;IACpC,0BAA0B,iCAAiC;IAC3D,qBAAqB,6BAA6B;IAClD,4BAA4B,mCAAmC;IAC/D,gBAAgB,sBAAsB;IACtC,cAAc,oBAAoB;IAClC,qBAAqB,4BAA4B;IACjD,sBAAsB,6BAA6B;IACnD,wBAAwB,+BAA+B;IACvD,oBAAoB,2BAA2B;IAC/C,iBAAiB,uBAAuB;IACxC,qBAAqB,6BAA6B;IAClD,iBAAiB,wBAAwB;IACzC,iBAAiB,wBAAwB;IACzC,qBAAqB,4BAA4B;IACjD,mBAAmB,yBAAyB;IAC5C,gBAAgB,uBAAuB;IACvC,eAAe,sBAAsB;IACrC,iBAAiB,wBAAwB;IACzC,qBAAqB,4BAA4B;IACjD,oBAAoB,2BAA2B;IAC/C,gBAAgB,uBAAuB;IACvC,eAAe,qBAAqB;IACpC,oBAAoB,2BAA2B;CAChD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,CAYzD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAuCrD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAuDzD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,MAAM,GACzB,aAAa,CAUf"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACpB,UAAU,gBAAgB;IAC1B,oBAAoB,2BAA2B;IAC/C,YAAY,kBAAkB;CAC/B;AAED,oBAAY,SAAS;IACnB,YAAY,kBAAkB;IAC9B,eAAe,qBAAqB;IACpC,0BAA0B,iCAAiC;IAC3D,qBAAqB,6BAA6B;IAClD,4BAA4B,mCAAmC;IAC/D,gBAAgB,sBAAsB;IACtC,cAAc,oBAAoB;IAClC,qBAAqB,4BAA4B;IACjD,sBAAsB,6BAA6B;IACnD,wBAAwB,+BAA+B;IACvD,oBAAoB,2BAA2B;IAC/C,iBAAiB,uBAAuB;IACxC,qBAAqB,6BAA6B;IAClD,iBAAiB,wBAAwB;IACzC,iBAAiB,wBAAwB;IACzC,qBAAqB,4BAA4B;IACjD,mBAAmB,yBAAyB;IAC5C,gBAAgB,uBAAuB;IACvC,eAAe,sBAAsB;IACrC,iBAAiB,wBAAwB;IACzC,qBAAqB,4BAA4B;IACjD,oBAAoB,2BAA2B;IAC/C,gBAAgB,uBAAuB;IACvC,eAAe,qBAAqB;IACpC,oBAAoB,2BAA2B;CAChD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,CAYzD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAuCrD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAuDzD;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,4BAA4B;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,mEAAmE;IACnE,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa;IACb,KAAK,EAAE,SAAS,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,iBAAiB,CAAC,EAAE,MAAM,GACzB,aAAa,CAUf"}
|
package/dist/src/errors.js
CHANGED
|
@@ -39,6 +39,13 @@ var ErrorCode;
|
|
|
39
39
|
ErrorCode["UpstreamTimeout"] = "upstream_timeout";
|
|
40
40
|
ErrorCode["ContractVersionDrift"] = "contract_version_drift";
|
|
41
41
|
})(ErrorCode || (exports.ErrorCode = ErrorCode = {}));
|
|
42
|
+
/**
|
|
43
|
+
* 错误码到重试策略分类的映射。
|
|
44
|
+
* buyer / seller 路由层根据该结果决定是否自动重试、是否触发 fail-closed。
|
|
45
|
+
*
|
|
46
|
+
* @param code 业务错误码
|
|
47
|
+
* @returns 重试分类:`RetryableWithBackoff`(建议退避重试)、`FailClosed`(关闭交易、人工介入)、`NotRetryable`(直接报错给用户)
|
|
48
|
+
*/
|
|
42
49
|
function getRetryClass(code) {
|
|
43
50
|
switch (code) {
|
|
44
51
|
case ErrorCode.BusyCapacity:
|
|
@@ -52,6 +59,13 @@ function getRetryClass(code) {
|
|
|
52
59
|
return RetryClass.NotRetryable;
|
|
53
60
|
}
|
|
54
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* 错误码到 HTTP 状态码的映射。
|
|
64
|
+
* 当协议层把业务错误透传为 HTTP 响应(如 buyer → wallet-bootstrap 健康检查)时使用。
|
|
65
|
+
*
|
|
66
|
+
* @param code 业务错误码
|
|
67
|
+
* @returns 对应的 HTTP 状态码(4xx/5xx)
|
|
68
|
+
*/
|
|
55
69
|
function getHttpStatus(code) {
|
|
56
70
|
switch (code) {
|
|
57
71
|
case ErrorCode.BusyCapacity:
|
|
@@ -92,6 +106,13 @@ function getHttpStatus(code) {
|
|
|
92
106
|
return 500;
|
|
93
107
|
}
|
|
94
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* 错误码到默认人类可读消息的映射。
|
|
111
|
+
* 用于 `createErrorEnvelope` 未传 `message` 参数时的兜底文案。
|
|
112
|
+
*
|
|
113
|
+
* @param code 业务错误码
|
|
114
|
+
* @returns 默认错误消息
|
|
115
|
+
*/
|
|
95
116
|
function getDefaultMessage(code) {
|
|
96
117
|
switch (code) {
|
|
97
118
|
case ErrorCode.BusyCapacity:
|
|
@@ -148,6 +169,15 @@ function getDefaultMessage(code) {
|
|
|
148
169
|
return "An unknown error occurred.";
|
|
149
170
|
}
|
|
150
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* 构造标准错误响应外壳。
|
|
174
|
+
* 自动填充 `retryClass`、`httpStatus`、默认 `message`,调用方只需提供 `code` 和可选的覆盖字段。
|
|
175
|
+
*
|
|
176
|
+
* @param code 业务错误码,决定 retryClass / httpStatus / 默认 message
|
|
177
|
+
* @param message 自定义消息;省略时使用 `getDefaultMessage(code)` 兜底文案
|
|
178
|
+
* @param retryAfterSeconds 退避秒数,仅在需要时填入(如 429)
|
|
179
|
+
* @returns 完整的 `ErrorEnvelope` 对象
|
|
180
|
+
*/
|
|
151
181
|
function createErrorEnvelope(code, message, retryAfterSeconds) {
|
|
152
182
|
return {
|
|
153
183
|
error: {
|
package/dist/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,6BAA6B,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./errors.js"), exports);
|
|
18
18
|
__exportStar(require("./crypto.js"), exports);
|
|
19
|
+
__exportStar(require("./upstream-balance-probe.js"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,8CAA4B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,8CAA4B;AAC5B,8DAA4C"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type BalanceCurrency = "USD" | "CNY" | null;
|
|
2
|
+
export type BalanceSource = "deepseek" | "stepfun" | "siliconflow" | "openrouter" | "novita" | "newapi_generic" | "usage_generic" | "unknown";
|
|
3
|
+
export type BalanceProbeTemplate = "auto" | "deepseek" | "stepfun" | "siliconflow" | "openrouter" | "novita" | "newapi_generic" | "usage_generic" | "none";
|
|
4
|
+
export interface BalanceSnapshot {
|
|
5
|
+
rawAmount: number | null;
|
|
6
|
+
amountUsdMicros: number | null;
|
|
7
|
+
currency: BalanceCurrency;
|
|
8
|
+
source: BalanceSource;
|
|
9
|
+
fetchedAt: number;
|
|
10
|
+
error?: {
|
|
11
|
+
httpStatus: number;
|
|
12
|
+
message: string;
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export interface BalanceProbeConfig {
|
|
16
|
+
upstreamUrl?: string;
|
|
17
|
+
upstreamBalanceUrl?: string;
|
|
18
|
+
upstreamApiKey?: string;
|
|
19
|
+
upstreamUserId?: string;
|
|
20
|
+
upstreamBalanceProbe?: {
|
|
21
|
+
template?: BalanceProbeTemplate;
|
|
22
|
+
url?: string;
|
|
23
|
+
userId?: string;
|
|
24
|
+
rechargeUrl?: string;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface BalanceProbeOptions {
|
|
28
|
+
fetch?: typeof fetch;
|
|
29
|
+
now?: () => number;
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
cnyUsdRate?: number;
|
|
32
|
+
cache?: BalanceProbeCache;
|
|
33
|
+
}
|
|
34
|
+
export declare class BalanceProbeCache {
|
|
35
|
+
private readonly entries;
|
|
36
|
+
get(key: string, now: number): BalanceSnapshot | undefined;
|
|
37
|
+
setFailure(key: string, snapshot: BalanceSnapshot, now: number): void;
|
|
38
|
+
}
|
|
39
|
+
export declare const defaultBalanceProbeCache: BalanceProbeCache;
|
|
40
|
+
export declare function probeUpstreamBalance(config: BalanceProbeConfig, options?: BalanceProbeOptions): Promise<BalanceSnapshot>;
|
|
41
|
+
//# sourceMappingURL=upstream-balance-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream-balance-probe.d.ts","sourceRoot":"","sources":["../../src/upstream-balance-probe.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;AACnD,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,SAAS,GACT,aAAa,GACb,YAAY,GACZ,QAAQ,GACR,gBAAgB,GAChB,eAAe,GACf,SAAS,CAAC;AAEd,MAAM,MAAM,oBAAoB,GAC5B,MAAM,GACN,UAAU,GACV,SAAS,GACT,aAAa,GACb,YAAY,GACZ,QAAQ,GACR,gBAAgB,GAChB,eAAe,GACf,MAAM,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE;QACN,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE;QACrB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;QAChC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAaD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuE;IAExF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAW1D,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAM7E;AAED,eAAO,MAAM,wBAAwB,mBAA0B,CAAC;AAEhE,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,eAAe,CAAC,CAsD1B"}
|