@trustbaseai/protocol 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.
- package/README.md +348 -0
- package/dist/bundle-hash.d.ts +54 -0
- package/dist/bundle-hash.d.ts.map +1 -0
- package/dist/bundle-hash.js +105 -0
- package/dist/bundle-hash.js.map +1 -0
- package/dist/canonical.d.ts +65 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +215 -0
- package/dist/canonical.js.map +1 -0
- package/dist/constants.d.ts +200 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +216 -0
- package/dist/constants.js.map +1 -0
- package/dist/endpoint-protocol.d.ts +143 -0
- package/dist/endpoint-protocol.d.ts.map +1 -0
- package/dist/endpoint-protocol.js +236 -0
- package/dist/endpoint-protocol.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +121 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +116 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +637 -0
- package/dist/registry.js.map +1 -0
- package/dist/sp-framework.d.ts +686 -0
- package/dist/sp-framework.d.ts.map +1 -0
- package/dist/sp-framework.js +187 -0
- package/dist/sp-framework.js.map +1 -0
- package/dist/validation.d.ts +37 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +85 -0
- package/dist/validation.js.map +1 -0
- package/dist/ws-protocol.d.ts +242 -0
- package/dist/ws-protocol.d.ts.map +1 -0
- package/dist/ws-protocol.js +289 -0
- package/dist/ws-protocol.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 端点广播包 / 探测背书包 —— 类型 + 运行时校验 + 单调性判定。
|
|
3
|
+
*
|
|
4
|
+
* ## 事实出处
|
|
5
|
+
*
|
|
6
|
+
* 《PWA-内嵌P2P轻索引器设计-2026-09-22》§6.2(`endpoint_announce`)、§6.3(`probe_report`)、
|
|
7
|
+
* §6.4(防冒名三层)。
|
|
8
|
+
*
|
|
9
|
+
* ## ⚠️ 与链上已有部分的区别(诚实标注)
|
|
10
|
+
*
|
|
11
|
+
* - **链侧已实现**:`x/endpoint` 的指针 + 见证(`MsgUpdateEndpointPointer` /
|
|
12
|
+
* `MsgAttestEndpoint`),bundle_hash 长度与"必须等于当前指针"的校验都在链上。
|
|
13
|
+
* - **本文件描述的是链下 gossip 面**:广播包 / 背书包在
|
|
14
|
+
* `trustchain-relmerge` 里 grep **尚无实现**(无 `trustbase/endpoints/v1`、
|
|
15
|
+
* 无 `endpoint_announce` / `probe_report`),属 P2 阶段要落地的部分。
|
|
16
|
+
* 本 SDK 把它**先冻结成契约**,让索引器与 PWA 两侧从一开始就照同一份写。
|
|
17
|
+
* - 因此本文里的"签名域"是**新定义**(不是已存在的事实):签 `canonicalize(announce 去掉 sig)`,
|
|
18
|
+
* 与 `bundle_hash` 同一份规范化规则、同一份输入。这一点写死在 `announcementSigningPayload`。
|
|
19
|
+
*
|
|
20
|
+
* ## 校验函数不构造新对象
|
|
21
|
+
*
|
|
22
|
+
* 所有 `validateXxxAnnouncement` 通过时**返回入参本身**(同一引用),绝不重建对象:
|
|
23
|
+
* `bundle_hash` / `endpoint_hash` 是对**原文**算的,任何"顺手补一个默认字段"都会改掉
|
|
24
|
+
* 规范化字节,让哈希对不上。要改内容请显式构造新对象并重算哈希。
|
|
25
|
+
*
|
|
26
|
+
* ## 本包不做密码学
|
|
27
|
+
*
|
|
28
|
+
* `sig` / `pubkey` 只做**结构校验**(base64、长度下限)。真正的 secp256k1 验签
|
|
29
|
+
* 在 `@trustbase/identity` / `@trustbase/p2p`(planned),并且必须验:
|
|
30
|
+
* ① pubkey 与链上登记的卖家身份一致 ② 签名覆盖 `announcementSigningPayload(packet)`
|
|
31
|
+
* ③ 时间窗 + seq 单调(见下方 `shouldAcceptAnnouncement`)。
|
|
32
|
+
*/
|
|
33
|
+
import { type Validation } from './validation';
|
|
34
|
+
/** 端点数组条数上限(SDK 侧的防滥用护栏;设计文档未规定该数字) */
|
|
35
|
+
export declare const MAX_ENDPOINTS_PER_ANNOUNCEMENT = 32;
|
|
36
|
+
/** ttl_ms 上限:7 天。过长 = 陈旧端点污染(§6.2「ttl_ms 过期即失效」的反面) */
|
|
37
|
+
export declare const MAX_ANNOUNCEMENT_TTL_MS: number;
|
|
38
|
+
/** region 字段字节上限(护栏;链侧 `region_hint` 默认 16,这里放宽到 32) */
|
|
39
|
+
export declare const MAX_REGION_LENGTH = 32;
|
|
40
|
+
/** 卖家地址的宽松结构检查。严格校验 bech32 校验和是钱包层的事(本包不做)。 */
|
|
41
|
+
export declare function isLikelySellerAddress(value: unknown): value is string;
|
|
42
|
+
export interface WebRtcEndpointDescriptor {
|
|
43
|
+
kind: 'webrtc';
|
|
44
|
+
/** libp2p peer id(形如 `12D3Koo...`);与身份绑定变化必须重走链上校验(§6.4 第 3 层) */
|
|
45
|
+
peer_id: string;
|
|
46
|
+
/** libp2p multiaddr 列表,如 `/ip6/2001:db8::1/udp/51820/webrtc-direct` */
|
|
47
|
+
hints: string[];
|
|
48
|
+
}
|
|
49
|
+
export interface WebTransportEndpointDescriptor {
|
|
50
|
+
kind: 'webtransport';
|
|
51
|
+
/** https URL;证书自签,靠 cert_hash 固定(`serverCertificateHashes`) */
|
|
52
|
+
url: string;
|
|
53
|
+
/** base64: 前缀或裸 base64 的证书哈希 */
|
|
54
|
+
cert_hash: string;
|
|
55
|
+
}
|
|
56
|
+
export interface WssEndpointDescriptor {
|
|
57
|
+
kind: 'wss';
|
|
58
|
+
/** wss:// URL;仅商家/服务商确有受信域名证书的场合可用 */
|
|
59
|
+
url: string;
|
|
60
|
+
}
|
|
61
|
+
export type EndpointDescriptor = WebRtcEndpointDescriptor | WebTransportEndpointDescriptor | WssEndpointDescriptor;
|
|
62
|
+
export declare function isEndpointDescriptor(input: unknown): input is EndpointDescriptor;
|
|
63
|
+
export declare function validateEndpointDescriptor(input: unknown): Validation<EndpointDescriptor>;
|
|
64
|
+
export interface EndpointAnnouncement {
|
|
65
|
+
/** 协议版本;必须等于 GOSSIP_PROTOCOL_VERSION */
|
|
66
|
+
v: number;
|
|
67
|
+
type: 'endpoint_announce';
|
|
68
|
+
/** 卖家链上身份地址(tct1...)—— pubkey 必须与链上登记的该身份一致 */
|
|
69
|
+
seller: string;
|
|
70
|
+
/** **单调递增**序号。规则:只接受比本地更新的 seq;本地无记录时才接受旧 seq */
|
|
71
|
+
seq: number;
|
|
72
|
+
/** 签发时间(Unix 毫秒) */
|
|
73
|
+
issued_at: number;
|
|
74
|
+
/** 有效期(毫秒);`issued_at + ttl_ms` 之后整包失效,防重放 + 防陈旧端点污染 */
|
|
75
|
+
ttl_ms: number;
|
|
76
|
+
endpoints: EndpointDescriptor[];
|
|
77
|
+
/** base64 签名;签名域 = canonicalize(本对象去掉 sig),见 announcementSigningPayload */
|
|
78
|
+
sig: string;
|
|
79
|
+
/** base64 公钥;注意 §6.4 第 3 层:身份 ↔ peer_id 绑定变化必须重走链上校验 */
|
|
80
|
+
pubkey: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 校验端点广播包。
|
|
84
|
+
*
|
|
85
|
+
* **通过时返回入参本身**(同一引用),不做归一化 —— 见文件头说明。
|
|
86
|
+
* 验签不在这里做:本包零密码学依赖。
|
|
87
|
+
*/
|
|
88
|
+
export declare function validateEndpointAnnouncement(input: unknown): Validation<EndpointAnnouncement>;
|
|
89
|
+
export interface ProbeReport {
|
|
90
|
+
v: number;
|
|
91
|
+
type: 'probe_report';
|
|
92
|
+
/** 被探测的卖家地址 */
|
|
93
|
+
target: string;
|
|
94
|
+
/** = `announcementHashHex(announce)` —— 绑定"具体哪一版端点内容",防签名留白后被调包 */
|
|
95
|
+
endpoint_hash: string;
|
|
96
|
+
/** 可达性结论 */
|
|
97
|
+
ok: boolean;
|
|
98
|
+
/** 观测延迟(毫秒);上限与链侧 `MaxLatencyMs` 对齐 */
|
|
99
|
+
latency_ms: number;
|
|
100
|
+
/** 粗粒度地域(如 "cn-js");**不上传 IP、不上传浏览历史**(§9 隐私口径) */
|
|
101
|
+
region: string;
|
|
102
|
+
/** 签名时戳(Unix 毫秒);配合时间窗防重放 */
|
|
103
|
+
ts: number;
|
|
104
|
+
/** base64 签名;设备本地 WebCrypto 密钥(默认匿名,可自愿绑链上身份) */
|
|
105
|
+
sig: string;
|
|
106
|
+
pubkey: string;
|
|
107
|
+
}
|
|
108
|
+
/** 校验探测背书包(同样"通过即返回入参本身") */
|
|
109
|
+
export declare function validateProbeReport(input: unknown): Validation<ProbeReport>;
|
|
110
|
+
/** 判定理由码(冻结:日志/指标按它聚合,不要按文案聚合) */
|
|
111
|
+
export declare const AnnouncementDecision: {
|
|
112
|
+
/** 本地无该卖家记录 → 接受(前提:签名已由调用方验过) */
|
|
113
|
+
readonly NO_LOCAL_RECORD: "no_local_record";
|
|
114
|
+
/** seq 比本地新 → 接受 */
|
|
115
|
+
readonly NEWER_SEQ: "newer_seq";
|
|
116
|
+
/** seq 不比本地新 → 拒(防重放 / 防回滚到旧端点) */
|
|
117
|
+
readonly STALE_SEQ: "stale_seq";
|
|
118
|
+
/** 已过 issued_at + ttl_ms → 拒(防陈旧端点污染) */
|
|
119
|
+
readonly EXPIRED: "expired";
|
|
120
|
+
};
|
|
121
|
+
export type AnnouncementDecision = (typeof AnnouncementDecision)[keyof typeof AnnouncementDecision];
|
|
122
|
+
export interface AnnouncementAcceptance {
|
|
123
|
+
accept: boolean;
|
|
124
|
+
reason: AnnouncementDecision;
|
|
125
|
+
/** 剩余有效期(毫秒,可为负) */
|
|
126
|
+
ttl_remaining_ms: number;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 是否接受这条广播包(**只在签名已验证的前提下调用**)。
|
|
130
|
+
*
|
|
131
|
+
* 规则(§6.2):
|
|
132
|
+
* 1. `issued_at + ttl_ms <= now` → 拒(`expired`)
|
|
133
|
+
* 2. 本地无记录 → 接受(`no_local_record`)——"签名有效的旧包但本地无记录"是可接受的
|
|
134
|
+
* 3. `incoming.seq > local.seq` → 接受(`newer_seq`)
|
|
135
|
+
* 4. 其余 → 拒(`stale_seq`)
|
|
136
|
+
*
|
|
137
|
+
* @param local 本地已有的记录,只需 `seq` 字段;undefined/null 表示没有
|
|
138
|
+
* @param now 当前时间(毫秒),默认 `Date.now()`(显式传入便于测试)
|
|
139
|
+
*/
|
|
140
|
+
export declare function shouldAcceptAnnouncement(local: {
|
|
141
|
+
seq: number;
|
|
142
|
+
} | undefined | null, incoming: EndpointAnnouncement, now?: number): AnnouncementAcceptance;
|
|
143
|
+
//# sourceMappingURL=endpoint-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint-protocol.d.ts","sourceRoot":"","sources":["../src/endpoint-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 端点广播包 / 探测背书包 —— 类型 + 运行时校验 + 单调性判定。
|
|
4
|
+
*
|
|
5
|
+
* ## 事实出处
|
|
6
|
+
*
|
|
7
|
+
* 《PWA-内嵌P2P轻索引器设计-2026-09-22》§6.2(`endpoint_announce`)、§6.3(`probe_report`)、
|
|
8
|
+
* §6.4(防冒名三层)。
|
|
9
|
+
*
|
|
10
|
+
* ## ⚠️ 与链上已有部分的区别(诚实标注)
|
|
11
|
+
*
|
|
12
|
+
* - **链侧已实现**:`x/endpoint` 的指针 + 见证(`MsgUpdateEndpointPointer` /
|
|
13
|
+
* `MsgAttestEndpoint`),bundle_hash 长度与"必须等于当前指针"的校验都在链上。
|
|
14
|
+
* - **本文件描述的是链下 gossip 面**:广播包 / 背书包在
|
|
15
|
+
* `trustchain-relmerge` 里 grep **尚无实现**(无 `trustbase/endpoints/v1`、
|
|
16
|
+
* 无 `endpoint_announce` / `probe_report`),属 P2 阶段要落地的部分。
|
|
17
|
+
* 本 SDK 把它**先冻结成契约**,让索引器与 PWA 两侧从一开始就照同一份写。
|
|
18
|
+
* - 因此本文里的"签名域"是**新定义**(不是已存在的事实):签 `canonicalize(announce 去掉 sig)`,
|
|
19
|
+
* 与 `bundle_hash` 同一份规范化规则、同一份输入。这一点写死在 `announcementSigningPayload`。
|
|
20
|
+
*
|
|
21
|
+
* ## 校验函数不构造新对象
|
|
22
|
+
*
|
|
23
|
+
* 所有 `validateXxxAnnouncement` 通过时**返回入参本身**(同一引用),绝不重建对象:
|
|
24
|
+
* `bundle_hash` / `endpoint_hash` 是对**原文**算的,任何"顺手补一个默认字段"都会改掉
|
|
25
|
+
* 规范化字节,让哈希对不上。要改内容请显式构造新对象并重算哈希。
|
|
26
|
+
*
|
|
27
|
+
* ## 本包不做密码学
|
|
28
|
+
*
|
|
29
|
+
* `sig` / `pubkey` 只做**结构校验**(base64、长度下限)。真正的 secp256k1 验签
|
|
30
|
+
* 在 `@trustbase/identity` / `@trustbase/p2p`(planned),并且必须验:
|
|
31
|
+
* ① pubkey 与链上登记的卖家身份一致 ② 签名覆盖 `announcementSigningPayload(packet)`
|
|
32
|
+
* ③ 时间窗 + seq 单调(见下方 `shouldAcceptAnnouncement`)。
|
|
33
|
+
*/
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.AnnouncementDecision = exports.MAX_REGION_LENGTH = exports.MAX_ANNOUNCEMENT_TTL_MS = exports.MAX_ENDPOINTS_PER_ANNOUNCEMENT = void 0;
|
|
36
|
+
exports.isLikelySellerAddress = isLikelySellerAddress;
|
|
37
|
+
exports.isEndpointDescriptor = isEndpointDescriptor;
|
|
38
|
+
exports.validateEndpointDescriptor = validateEndpointDescriptor;
|
|
39
|
+
exports.validateEndpointAnnouncement = validateEndpointAnnouncement;
|
|
40
|
+
exports.validateProbeReport = validateProbeReport;
|
|
41
|
+
exports.shouldAcceptAnnouncement = shouldAcceptAnnouncement;
|
|
42
|
+
const constants_1 = require("./constants");
|
|
43
|
+
const bundle_hash_1 = require("./bundle-hash");
|
|
44
|
+
const validation_1 = require("./validation");
|
|
45
|
+
/** 端点数组条数上限(SDK 侧的防滥用护栏;设计文档未规定该数字) */
|
|
46
|
+
exports.MAX_ENDPOINTS_PER_ANNOUNCEMENT = 32;
|
|
47
|
+
/** ttl_ms 上限:7 天。过长 = 陈旧端点污染(§6.2「ttl_ms 过期即失效」的反面) */
|
|
48
|
+
exports.MAX_ANNOUNCEMENT_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
49
|
+
/** region 字段字节上限(护栏;链侧 `region_hint` 默认 16,这里放宽到 32) */
|
|
50
|
+
exports.MAX_REGION_LENGTH = 32;
|
|
51
|
+
/** `sig` / `pubkey` 这类 base64 字段的宽松结构上限,防超大包 */
|
|
52
|
+
const MAX_BASE64_LENGTH = 512;
|
|
53
|
+
const MIN_BASE64_LENGTH = 32;
|
|
54
|
+
const BASE64_RE = /^[A-Za-z0-9+/]+={0,2}$/;
|
|
55
|
+
function isBase64String(value, minLength = MIN_BASE64_LENGTH) {
|
|
56
|
+
return (typeof value === 'string' &&
|
|
57
|
+
value.length >= minLength &&
|
|
58
|
+
value.length <= MAX_BASE64_LENGTH &&
|
|
59
|
+
value.length % 4 === 0 &&
|
|
60
|
+
BASE64_RE.test(value));
|
|
61
|
+
}
|
|
62
|
+
/** 卖家地址的宽松结构检查。严格校验 bech32 校验和是钱包层的事(本包不做)。 */
|
|
63
|
+
function isLikelySellerAddress(value) {
|
|
64
|
+
return (typeof value === 'string' &&
|
|
65
|
+
value.length >= 8 &&
|
|
66
|
+
value.length <= 128 &&
|
|
67
|
+
value.startsWith('tct1') &&
|
|
68
|
+
value === value.toLowerCase());
|
|
69
|
+
}
|
|
70
|
+
function isEndpointDescriptor(input) {
|
|
71
|
+
return validateEndpointDescriptor(input).ok;
|
|
72
|
+
}
|
|
73
|
+
function validateEndpointDescriptor(input) {
|
|
74
|
+
if (!(0, validation_1.isPlainObject)(input))
|
|
75
|
+
return (0, validation_1.invalid)('invalid_endpoint', 'endpoint must be an object');
|
|
76
|
+
const kind = input['kind'];
|
|
77
|
+
if (typeof kind !== 'string' || !constants_1.ENDPOINT_KINDS.includes(kind)) {
|
|
78
|
+
return (0, validation_1.invalid)('invalid_endpoint_kind', `endpoint.kind must be one of: ${constants_1.ENDPOINT_KINDS.join(', ')}`);
|
|
79
|
+
}
|
|
80
|
+
switch (kind) {
|
|
81
|
+
case 'webrtc': {
|
|
82
|
+
if (!(0, validation_1.isNonEmptyString)(input['peer_id'])) {
|
|
83
|
+
return (0, validation_1.invalid)('invalid_endpoint', 'webrtc.peer_id must be a non-empty string');
|
|
84
|
+
}
|
|
85
|
+
if (!(0, validation_1.isStringArray)(input['hints']) || input['hints'].length === 0) {
|
|
86
|
+
return (0, validation_1.invalid)('invalid_endpoint', 'webrtc.hints must be a non-empty string array');
|
|
87
|
+
}
|
|
88
|
+
return (0, validation_1.valid)(input);
|
|
89
|
+
}
|
|
90
|
+
case 'webtransport': {
|
|
91
|
+
if (!(0, validation_1.isNonEmptyString)(input['url']) || !input['url'].startsWith('https://')) {
|
|
92
|
+
return (0, validation_1.invalid)('invalid_endpoint', 'webtransport.url must start with https://');
|
|
93
|
+
}
|
|
94
|
+
if (!(0, validation_1.isNonEmptyString)(input['cert_hash'])) {
|
|
95
|
+
return (0, validation_1.invalid)('invalid_endpoint', 'webtransport.cert_hash must be a non-empty string');
|
|
96
|
+
}
|
|
97
|
+
return (0, validation_1.valid)(input);
|
|
98
|
+
}
|
|
99
|
+
case 'wss':
|
|
100
|
+
default: {
|
|
101
|
+
if (!(0, validation_1.isNonEmptyString)(input['url']) || !input['url'].startsWith('wss://')) {
|
|
102
|
+
return (0, validation_1.invalid)('invalid_endpoint', 'wss.url must start with wss://');
|
|
103
|
+
}
|
|
104
|
+
return (0, validation_1.valid)(input);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 校验端点广播包。
|
|
110
|
+
*
|
|
111
|
+
* **通过时返回入参本身**(同一引用),不做归一化 —— 见文件头说明。
|
|
112
|
+
* 验签不在这里做:本包零密码学依赖。
|
|
113
|
+
*/
|
|
114
|
+
function validateEndpointAnnouncement(input) {
|
|
115
|
+
if (!(0, validation_1.isPlainObject)(input))
|
|
116
|
+
return (0, validation_1.invalid)('invalid_json', 'announcement must be a JSON object');
|
|
117
|
+
if (input['v'] !== constants_1.GOSSIP_PROTOCOL_VERSION) {
|
|
118
|
+
return (0, validation_1.invalid)('unsupported_version', `announcement.v must be ${constants_1.GOSSIP_PROTOCOL_VERSION}, got ${String(input['v'])}`);
|
|
119
|
+
}
|
|
120
|
+
if (input['type'] !== constants_1.ANNOUNCE_TYPE) {
|
|
121
|
+
return (0, validation_1.invalid)('unknown_type', `announcement.type must be "${constants_1.ANNOUNCE_TYPE}"`);
|
|
122
|
+
}
|
|
123
|
+
if (!isLikelySellerAddress(input['seller'])) {
|
|
124
|
+
return (0, validation_1.invalid)('invalid_seller', 'seller must be a tct1... address');
|
|
125
|
+
}
|
|
126
|
+
if (!(0, validation_1.isIntegerInRange)(input['seq'], 0, Number.MAX_SAFE_INTEGER)) {
|
|
127
|
+
return (0, validation_1.invalid)('invalid_seq', 'seq must be a non-negative safe integer');
|
|
128
|
+
}
|
|
129
|
+
if (!(0, validation_1.isIntegerInRange)(input['issued_at'], 1, Number.MAX_SAFE_INTEGER)) {
|
|
130
|
+
return (0, validation_1.invalid)('invalid_issued_at', 'issued_at must be a positive Unix millisecond timestamp');
|
|
131
|
+
}
|
|
132
|
+
if (!(0, validation_1.isIntegerInRange)(input['ttl_ms'], 1, exports.MAX_ANNOUNCEMENT_TTL_MS)) {
|
|
133
|
+
return (0, validation_1.invalid)('invalid_ttl', `ttl_ms must be between 1 and ${exports.MAX_ANNOUNCEMENT_TTL_MS} ms`);
|
|
134
|
+
}
|
|
135
|
+
const endpoints = input['endpoints'];
|
|
136
|
+
if (!Array.isArray(endpoints) || endpoints.length === 0) {
|
|
137
|
+
return (0, validation_1.invalid)('invalid_endpoints', 'endpoints must be a non-empty array');
|
|
138
|
+
}
|
|
139
|
+
if (endpoints.length > exports.MAX_ENDPOINTS_PER_ANNOUNCEMENT) {
|
|
140
|
+
return (0, validation_1.invalid)('invalid_endpoints', `at most ${exports.MAX_ENDPOINTS_PER_ANNOUNCEMENT} endpoints per announcement`);
|
|
141
|
+
}
|
|
142
|
+
for (const descriptor of endpoints) {
|
|
143
|
+
const result = validateEndpointDescriptor(descriptor);
|
|
144
|
+
if (!result.ok)
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
if (!isBase64String(input['sig'])) {
|
|
148
|
+
return (0, validation_1.invalid)('invalid_signature', 'sig must be a non-empty base64 string');
|
|
149
|
+
}
|
|
150
|
+
if (!isBase64String(input['pubkey'])) {
|
|
151
|
+
return (0, validation_1.invalid)('invalid_pubkey', 'pubkey must be a non-empty base64 string');
|
|
152
|
+
}
|
|
153
|
+
return (0, validation_1.valid)(input);
|
|
154
|
+
}
|
|
155
|
+
/** 校验探测背书包(同样"通过即返回入参本身") */
|
|
156
|
+
function validateProbeReport(input) {
|
|
157
|
+
if (!(0, validation_1.isPlainObject)(input))
|
|
158
|
+
return (0, validation_1.invalid)('invalid_json', 'probe report must be a JSON object');
|
|
159
|
+
if (input['v'] !== constants_1.GOSSIP_PROTOCOL_VERSION) {
|
|
160
|
+
return (0, validation_1.invalid)('unsupported_version', `probe_report.v must be ${constants_1.GOSSIP_PROTOCOL_VERSION}, got ${String(input['v'])}`);
|
|
161
|
+
}
|
|
162
|
+
if (input['type'] !== constants_1.PROBE_REPORT_TYPE) {
|
|
163
|
+
return (0, validation_1.invalid)('unknown_type', `probe_report.type must be "${constants_1.PROBE_REPORT_TYPE}"`);
|
|
164
|
+
}
|
|
165
|
+
if (!isLikelySellerAddress(input['target'])) {
|
|
166
|
+
return (0, validation_1.invalid)('invalid_seller', 'target must be a tct1... address');
|
|
167
|
+
}
|
|
168
|
+
if (!(0, bundle_hash_1.isBundleHashHex)(input['endpoint_hash'])) {
|
|
169
|
+
return (0, validation_1.invalid)('invalid_endpoint_hash', `endpoint_hash must be ${bundle_hash_1.ENDPOINT_BUNDLE_HASH_HEX_LEN} lowercase hex chars (see announcementHashHex)`);
|
|
170
|
+
}
|
|
171
|
+
if (typeof input['ok'] !== 'boolean') {
|
|
172
|
+
return (0, validation_1.invalid)('invalid_params', 'ok must be a boolean');
|
|
173
|
+
}
|
|
174
|
+
if (!(0, validation_1.isIntegerInRange)(input['latency_ms'], 0, constants_1.MAX_LATENCY_MS)) {
|
|
175
|
+
return (0, validation_1.invalid)('invalid_params', `latency_ms must be an integer between 0 and ${constants_1.MAX_LATENCY_MS}`);
|
|
176
|
+
}
|
|
177
|
+
const region = input['region'];
|
|
178
|
+
if (typeof region !== 'string' || region.length > exports.MAX_REGION_LENGTH) {
|
|
179
|
+
return (0, validation_1.invalid)('invalid_params', `region must be a string of at most ${exports.MAX_REGION_LENGTH} chars`);
|
|
180
|
+
}
|
|
181
|
+
if (!(0, validation_1.isIntegerInRange)(input['ts'], 1, Number.MAX_SAFE_INTEGER)) {
|
|
182
|
+
return (0, validation_1.invalid)('invalid_ts', 'ts must be a positive Unix millisecond timestamp');
|
|
183
|
+
}
|
|
184
|
+
if (!isBase64String(input['sig'])) {
|
|
185
|
+
return (0, validation_1.invalid)('invalid_signature', 'sig must be a non-empty base64 string');
|
|
186
|
+
}
|
|
187
|
+
if (!isBase64String(input['pubkey'])) {
|
|
188
|
+
return (0, validation_1.invalid)('invalid_pubkey', 'pubkey must be a non-empty base64 string');
|
|
189
|
+
}
|
|
190
|
+
return (0, validation_1.valid)(input);
|
|
191
|
+
}
|
|
192
|
+
// ---------------------------------------------------------------------------
|
|
193
|
+
// 接收判定(seq 单调 + TTL)
|
|
194
|
+
// ---------------------------------------------------------------------------
|
|
195
|
+
/** 判定理由码(冻结:日志/指标按它聚合,不要按文案聚合) */
|
|
196
|
+
exports.AnnouncementDecision = {
|
|
197
|
+
/** 本地无该卖家记录 → 接受(前提:签名已由调用方验过) */
|
|
198
|
+
NO_LOCAL_RECORD: 'no_local_record',
|
|
199
|
+
/** seq 比本地新 → 接受 */
|
|
200
|
+
NEWER_SEQ: 'newer_seq',
|
|
201
|
+
/** seq 不比本地新 → 拒(防重放 / 防回滚到旧端点) */
|
|
202
|
+
STALE_SEQ: 'stale_seq',
|
|
203
|
+
/** 已过 issued_at + ttl_ms → 拒(防陈旧端点污染) */
|
|
204
|
+
EXPIRED: 'expired',
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* 是否接受这条广播包(**只在签名已验证的前提下调用**)。
|
|
208
|
+
*
|
|
209
|
+
* 规则(§6.2):
|
|
210
|
+
* 1. `issued_at + ttl_ms <= now` → 拒(`expired`)
|
|
211
|
+
* 2. 本地无记录 → 接受(`no_local_record`)——"签名有效的旧包但本地无记录"是可接受的
|
|
212
|
+
* 3. `incoming.seq > local.seq` → 接受(`newer_seq`)
|
|
213
|
+
* 4. 其余 → 拒(`stale_seq`)
|
|
214
|
+
*
|
|
215
|
+
* @param local 本地已有的记录,只需 `seq` 字段;undefined/null 表示没有
|
|
216
|
+
* @param now 当前时间(毫秒),默认 `Date.now()`(显式传入便于测试)
|
|
217
|
+
*/
|
|
218
|
+
function shouldAcceptAnnouncement(local, incoming, now = Date.now()) {
|
|
219
|
+
const expiresAt = incoming.issued_at + incoming.ttl_ms;
|
|
220
|
+
const ttlRemaining = expiresAt - now;
|
|
221
|
+
if (ttlRemaining <= 0) {
|
|
222
|
+
return { accept: false, reason: exports.AnnouncementDecision.EXPIRED, ttl_remaining_ms: ttlRemaining };
|
|
223
|
+
}
|
|
224
|
+
if (local === undefined || local === null) {
|
|
225
|
+
return {
|
|
226
|
+
accept: true,
|
|
227
|
+
reason: exports.AnnouncementDecision.NO_LOCAL_RECORD,
|
|
228
|
+
ttl_remaining_ms: ttlRemaining,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
if (incoming.seq > local.seq) {
|
|
232
|
+
return { accept: true, reason: exports.AnnouncementDecision.NEWER_SEQ, ttl_remaining_ms: ttlRemaining };
|
|
233
|
+
}
|
|
234
|
+
return { accept: false, reason: exports.AnnouncementDecision.STALE_SEQ, ttl_remaining_ms: ttlRemaining };
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=endpoint-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint-protocol.js","sourceRoot":"","sources":["../src/endpoint-protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 协议层错误基类。
|
|
3
|
+
*
|
|
4
|
+
* 只用于"程序错误 / 契约被破坏"的场景(如:拿一个浮点数去算 `bundle_hash`)。
|
|
5
|
+
* 对端发来的数据不合规属于**可预期分支**,走 `Validation<T>` 返回,不抛异常
|
|
6
|
+
* —— 详见 validation.ts 顶部说明。
|
|
7
|
+
*/
|
|
8
|
+
export declare class ProtocolError extends Error {
|
|
9
|
+
/** 机器可读错误码(snake_case),日志与测试按它断言,不按 message 断言 */
|
|
10
|
+
readonly code: string;
|
|
11
|
+
constructor(code: string, message: string);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAK1C"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProtocolError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* 协议层错误基类。
|
|
6
|
+
*
|
|
7
|
+
* 只用于"程序错误 / 契约被破坏"的场景(如:拿一个浮点数去算 `bundle_hash`)。
|
|
8
|
+
* 对端发来的数据不合规属于**可预期分支**,走 `Validation<T>` 返回,不抛异常
|
|
9
|
+
* —— 详见 validation.ts 顶部说明。
|
|
10
|
+
*/
|
|
11
|
+
class ProtocolError extends Error {
|
|
12
|
+
/** 机器可读错误码(snake_case),日志与测试按它断言,不按 message 断言 */
|
|
13
|
+
code;
|
|
14
|
+
constructor(code, message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'ProtocolError';
|
|
17
|
+
this.code = code;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.ProtocolError = ProtocolError;
|
|
21
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,MAAa,aAAc,SAAQ,KAAK;IACtC,kDAAkD;IACzC,IAAI,CAAS;IAEtB,YAAY,IAAY,EAAE,OAAe;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AATD,sCASC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@trustbase/protocol` —— TrustBase 跨侧唯一事实来源。
|
|
3
|
+
*
|
|
4
|
+
* 这里只有**类型 + 纯函数 + 常量**:零副作用、零 Node 内建依赖、同一份代码
|
|
5
|
+
* 在 Node 与浏览器里跑出同样结果。私钥、签名、网络、存储都不在本包
|
|
6
|
+
* (分别在 planned 的 `@trustbase/identity` / `@trustbase/chain-client` /
|
|
7
|
+
* `@trustbase/p2p` / `@trustbase/store`)。
|
|
8
|
+
*
|
|
9
|
+
* 四个子模块:
|
|
10
|
+
* - `canonical` / `bundle-hash` —— 规范化 JSON 与 `bundle_hash`(**红线,换算法=破坏兼容**)
|
|
11
|
+
* - `registry` —— 链消息 type URL 注册表(逐条核对 proto,带 `文件:行号` 出处)
|
|
12
|
+
* - `ws-protocol` —— 索引器 WS 查询协议(订阅 + 查询)
|
|
13
|
+
* - `endpoint-protocol` —— 端点广播包 / 探测背书包(链下 gossip 面)
|
|
14
|
+
*/
|
|
15
|
+
export { ProtocolError } from './errors';
|
|
16
|
+
export { CANONICALIZATION_VERSION, MAX_CANONICAL_DEPTH, CanonicalizationError, canonicalize, compareByCodePoint, } from './canonical';
|
|
17
|
+
export { ENDPOINT_BUNDLE_HASH_LEN, ENDPOINT_BUNDLE_HASH_HEX_LEN, announcementHashHex, announcementSigningPayload, bundleHashFromHex, bundleHashToHex, endpointBundleCanonical, endpointBundleHash, endpointBundleHashHex, isBundleHashHex, normalizeBundleHashHex, } from './bundle-hash';
|
|
18
|
+
export { BECH32_PREFIX, DEFAULT_CHAIN_ID, DEFAULT_INDEXER_WS_PATH, DEFAULT_MAX_REGION_HINT_LEN, DEFAULT_USD_TO_MICRO_TCT_RATE, DENOM_TCT_DISPLAY, DENOM_UTCT, ENDPOINT_EVENT_TYPES, EndpointEventType, EndpointKind, ENDPOINT_KINDS, GOSSIP_PROTOCOL_VERSION, GOSSIP_TOPIC_ENDPOINTS, HD_PATH, INDEXER_HTTP_PORT_ENV, MAX_LATENCY_MS, MAX_WEIGHT_PER_DEVICE, MIN_INDEPENDENT_SOURCES_FOR_NEGATIVE, ON_CHAIN_POINTER_STATES, PLANNED_WS_TOPICS, PointerState, TCT_DECIMALS, UTCT_PER_TCT, WS_PORT_ENV, WS_PORT_MANIFEST_FILE, WS_PORT_RANGE, WS_QUERY_LIMITS, WS_QUERY_NAMES, WS_TOPICS, type WsQueryName, type WsTopic, } from './constants';
|
|
19
|
+
export { LICENSE_TYPE, MSG_TYPES, MSG_TYPE_URLS, PRODUCT_TYPE, getMsgType, getMsgTypeByProtoMessage, isKnownMsgType, type LicenseTypeName, type LicenseTypeValue, type MsgFieldSpec, type MsgTypeSpec, type ProductTypeName, type ProductTypeValue, type ProtoFieldKind, } from './registry';
|
|
20
|
+
export { WS_ERROR_CODES, extractTopics, validateClientMessage, validateQueryArgs, validateQueryRequest, validateServerMessage, validateSubscribeRequest, validateUnsubscribeRequest, type CatalogItem, type CatalogQueryArgs, type CatalogQueryData, type ChainEvent, type EndpointCandidate, type EndpointsQueryArgs, type HealthQueryData, type ProductQueryArgs, type ValidatedQueryRequest, type ValidatedSubscriptionRequest, type WsBlockEventMessage, type WsClientMessage, type WsErrorMessage, type WsErrorCode, type WsEventMessage, type WsOrderEventMessage, type WsPingRequest, type WsPongMessage, type WsProductEventMessage, type WsQueryArgs, type WsQueryArgsByName, type WsQueryRequest, type WsQueryResultMessage, type WsServerMessage, type WsSubscribeRequest, type WsSubscribedMessage, type WsTransactionEventMessage, type WsUnsubscribeRequest, type WsUnsubscribedMessage, type WsWelcomeMessage, } from './ws-protocol';
|
|
21
|
+
export { AnnouncementDecision, MAX_ANNOUNCEMENT_TTL_MS, MAX_ENDPOINTS_PER_ANNOUNCEMENT, MAX_REGION_LENGTH, isEndpointDescriptor, isLikelySellerAddress, shouldAcceptAnnouncement, validateEndpointAnnouncement, validateEndpointDescriptor, validateProbeReport, type AnnouncementAcceptance, type EndpointAnnouncement, type EndpointDescriptor, type ProbeReport, type WebRtcEndpointDescriptor, type WebTransportEndpointDescriptor, type WssEndpointDescriptor, } from './endpoint-protocol';
|
|
22
|
+
export { ApplymentState, PaymentFactStatus, SalesScene, SettlementCycleKind, SP_BACKEND_ROUTES, SP_COMMISSION_HARD_CAP_BP, SP_MSG_TYPE_URLS, SP_QUERY_ENDPOINTS, SpIndustry, SpStatus, WECHAT_APIS, type ApplymentForm, type ApplymentResult, type CommissionPolicy, type CommissionRate, type CourseExtension, type CreateOrderInput, type EcommerceExtension, type FenAmount, type IdentityRegistry, type IndustryExtensionMap, type IndustryGateway, type LocalLifeExtension, type MigrationSupport, type OnboardingChannel, type OrderRef, type OtherExtension, type PaymentRail, type PrivateDomainExtension, type ProfitsharingReceipt, type PspTxnId, type RefundPolicy, type ServiceProviderGateway, type ServiceProviderIdentity, type ServiceProviderParams, type SettlementPolicy, type SettlementRule, type SpMigrationPackage, type SubMchId, type SubscriptionExtension, type TctAddress, type TechServiceExtension, type UtctAmount, type VerifiedPayment, } from './sp-framework';
|
|
23
|
+
export { isFiniteNumber, isHexOfLength, isIntegerInRange, isLowerHexOfLength, isNonEmptyString, isPlainObject, isStringArray, isStringOfMaxLength, invalid, optional, valid, type Validation, } from './validation';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `@trustbase/protocol` —— TrustBase 跨侧唯一事实来源。
|
|
4
|
+
*
|
|
5
|
+
* 这里只有**类型 + 纯函数 + 常量**:零副作用、零 Node 内建依赖、同一份代码
|
|
6
|
+
* 在 Node 与浏览器里跑出同样结果。私钥、签名、网络、存储都不在本包
|
|
7
|
+
* (分别在 planned 的 `@trustbase/identity` / `@trustbase/chain-client` /
|
|
8
|
+
* `@trustbase/p2p` / `@trustbase/store`)。
|
|
9
|
+
*
|
|
10
|
+
* 四个子模块:
|
|
11
|
+
* - `canonical` / `bundle-hash` —— 规范化 JSON 与 `bundle_hash`(**红线,换算法=破坏兼容**)
|
|
12
|
+
* - `registry` —— 链消息 type URL 注册表(逐条核对 proto,带 `文件:行号` 出处)
|
|
13
|
+
* - `ws-protocol` —— 索引器 WS 查询协议(订阅 + 查询)
|
|
14
|
+
* - `endpoint-protocol` —— 端点广播包 / 探测背书包(链下 gossip 面)
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.PRODUCT_TYPE = exports.MSG_TYPE_URLS = exports.MSG_TYPES = exports.LICENSE_TYPE = exports.WS_TOPICS = exports.WS_QUERY_NAMES = exports.WS_QUERY_LIMITS = exports.WS_PORT_RANGE = exports.WS_PORT_MANIFEST_FILE = exports.WS_PORT_ENV = exports.UTCT_PER_TCT = exports.TCT_DECIMALS = exports.PointerState = exports.PLANNED_WS_TOPICS = exports.ON_CHAIN_POINTER_STATES = exports.MIN_INDEPENDENT_SOURCES_FOR_NEGATIVE = exports.MAX_WEIGHT_PER_DEVICE = exports.MAX_LATENCY_MS = exports.INDEXER_HTTP_PORT_ENV = exports.HD_PATH = exports.GOSSIP_TOPIC_ENDPOINTS = exports.GOSSIP_PROTOCOL_VERSION = exports.ENDPOINT_KINDS = exports.EndpointKind = exports.EndpointEventType = exports.ENDPOINT_EVENT_TYPES = exports.DENOM_UTCT = exports.DENOM_TCT_DISPLAY = exports.DEFAULT_USD_TO_MICRO_TCT_RATE = exports.DEFAULT_MAX_REGION_HINT_LEN = exports.DEFAULT_INDEXER_WS_PATH = exports.DEFAULT_CHAIN_ID = exports.BECH32_PREFIX = exports.normalizeBundleHashHex = exports.isBundleHashHex = exports.endpointBundleHashHex = exports.endpointBundleHash = exports.endpointBundleCanonical = exports.bundleHashToHex = exports.bundleHashFromHex = exports.announcementSigningPayload = exports.announcementHashHex = exports.ENDPOINT_BUNDLE_HASH_HEX_LEN = exports.ENDPOINT_BUNDLE_HASH_LEN = exports.compareByCodePoint = exports.canonicalize = exports.CanonicalizationError = exports.MAX_CANONICAL_DEPTH = exports.CANONICALIZATION_VERSION = exports.ProtocolError = void 0;
|
|
18
|
+
exports.valid = exports.optional = exports.invalid = exports.isStringOfMaxLength = exports.isStringArray = exports.isPlainObject = exports.isNonEmptyString = exports.isLowerHexOfLength = exports.isIntegerInRange = exports.isHexOfLength = exports.isFiniteNumber = exports.WECHAT_APIS = exports.SpStatus = exports.SpIndustry = exports.SP_QUERY_ENDPOINTS = exports.SP_MSG_TYPE_URLS = exports.SP_COMMISSION_HARD_CAP_BP = exports.SP_BACKEND_ROUTES = exports.SettlementCycleKind = exports.SalesScene = exports.PaymentFactStatus = exports.ApplymentState = exports.validateProbeReport = exports.validateEndpointDescriptor = exports.validateEndpointAnnouncement = exports.shouldAcceptAnnouncement = exports.isLikelySellerAddress = exports.isEndpointDescriptor = exports.MAX_REGION_LENGTH = exports.MAX_ENDPOINTS_PER_ANNOUNCEMENT = exports.MAX_ANNOUNCEMENT_TTL_MS = exports.AnnouncementDecision = exports.validateUnsubscribeRequest = exports.validateSubscribeRequest = exports.validateServerMessage = exports.validateQueryRequest = exports.validateQueryArgs = exports.validateClientMessage = exports.extractTopics = exports.WS_ERROR_CODES = exports.isKnownMsgType = exports.getMsgTypeByProtoMessage = exports.getMsgType = void 0;
|
|
19
|
+
var errors_1 = require("./errors");
|
|
20
|
+
Object.defineProperty(exports, "ProtocolError", { enumerable: true, get: function () { return errors_1.ProtocolError; } });
|
|
21
|
+
var canonical_1 = require("./canonical");
|
|
22
|
+
Object.defineProperty(exports, "CANONICALIZATION_VERSION", { enumerable: true, get: function () { return canonical_1.CANONICALIZATION_VERSION; } });
|
|
23
|
+
Object.defineProperty(exports, "MAX_CANONICAL_DEPTH", { enumerable: true, get: function () { return canonical_1.MAX_CANONICAL_DEPTH; } });
|
|
24
|
+
Object.defineProperty(exports, "CanonicalizationError", { enumerable: true, get: function () { return canonical_1.CanonicalizationError; } });
|
|
25
|
+
Object.defineProperty(exports, "canonicalize", { enumerable: true, get: function () { return canonical_1.canonicalize; } });
|
|
26
|
+
Object.defineProperty(exports, "compareByCodePoint", { enumerable: true, get: function () { return canonical_1.compareByCodePoint; } });
|
|
27
|
+
var bundle_hash_1 = require("./bundle-hash");
|
|
28
|
+
Object.defineProperty(exports, "ENDPOINT_BUNDLE_HASH_LEN", { enumerable: true, get: function () { return bundle_hash_1.ENDPOINT_BUNDLE_HASH_LEN; } });
|
|
29
|
+
Object.defineProperty(exports, "ENDPOINT_BUNDLE_HASH_HEX_LEN", { enumerable: true, get: function () { return bundle_hash_1.ENDPOINT_BUNDLE_HASH_HEX_LEN; } });
|
|
30
|
+
Object.defineProperty(exports, "announcementHashHex", { enumerable: true, get: function () { return bundle_hash_1.announcementHashHex; } });
|
|
31
|
+
Object.defineProperty(exports, "announcementSigningPayload", { enumerable: true, get: function () { return bundle_hash_1.announcementSigningPayload; } });
|
|
32
|
+
Object.defineProperty(exports, "bundleHashFromHex", { enumerable: true, get: function () { return bundle_hash_1.bundleHashFromHex; } });
|
|
33
|
+
Object.defineProperty(exports, "bundleHashToHex", { enumerable: true, get: function () { return bundle_hash_1.bundleHashToHex; } });
|
|
34
|
+
Object.defineProperty(exports, "endpointBundleCanonical", { enumerable: true, get: function () { return bundle_hash_1.endpointBundleCanonical; } });
|
|
35
|
+
Object.defineProperty(exports, "endpointBundleHash", { enumerable: true, get: function () { return bundle_hash_1.endpointBundleHash; } });
|
|
36
|
+
Object.defineProperty(exports, "endpointBundleHashHex", { enumerable: true, get: function () { return bundle_hash_1.endpointBundleHashHex; } });
|
|
37
|
+
Object.defineProperty(exports, "isBundleHashHex", { enumerable: true, get: function () { return bundle_hash_1.isBundleHashHex; } });
|
|
38
|
+
Object.defineProperty(exports, "normalizeBundleHashHex", { enumerable: true, get: function () { return bundle_hash_1.normalizeBundleHashHex; } });
|
|
39
|
+
var constants_1 = require("./constants");
|
|
40
|
+
Object.defineProperty(exports, "BECH32_PREFIX", { enumerable: true, get: function () { return constants_1.BECH32_PREFIX; } });
|
|
41
|
+
Object.defineProperty(exports, "DEFAULT_CHAIN_ID", { enumerable: true, get: function () { return constants_1.DEFAULT_CHAIN_ID; } });
|
|
42
|
+
Object.defineProperty(exports, "DEFAULT_INDEXER_WS_PATH", { enumerable: true, get: function () { return constants_1.DEFAULT_INDEXER_WS_PATH; } });
|
|
43
|
+
Object.defineProperty(exports, "DEFAULT_MAX_REGION_HINT_LEN", { enumerable: true, get: function () { return constants_1.DEFAULT_MAX_REGION_HINT_LEN; } });
|
|
44
|
+
Object.defineProperty(exports, "DEFAULT_USD_TO_MICRO_TCT_RATE", { enumerable: true, get: function () { return constants_1.DEFAULT_USD_TO_MICRO_TCT_RATE; } });
|
|
45
|
+
Object.defineProperty(exports, "DENOM_TCT_DISPLAY", { enumerable: true, get: function () { return constants_1.DENOM_TCT_DISPLAY; } });
|
|
46
|
+
Object.defineProperty(exports, "DENOM_UTCT", { enumerable: true, get: function () { return constants_1.DENOM_UTCT; } });
|
|
47
|
+
Object.defineProperty(exports, "ENDPOINT_EVENT_TYPES", { enumerable: true, get: function () { return constants_1.ENDPOINT_EVENT_TYPES; } });
|
|
48
|
+
Object.defineProperty(exports, "EndpointEventType", { enumerable: true, get: function () { return constants_1.EndpointEventType; } });
|
|
49
|
+
Object.defineProperty(exports, "EndpointKind", { enumerable: true, get: function () { return constants_1.EndpointKind; } });
|
|
50
|
+
Object.defineProperty(exports, "ENDPOINT_KINDS", { enumerable: true, get: function () { return constants_1.ENDPOINT_KINDS; } });
|
|
51
|
+
Object.defineProperty(exports, "GOSSIP_PROTOCOL_VERSION", { enumerable: true, get: function () { return constants_1.GOSSIP_PROTOCOL_VERSION; } });
|
|
52
|
+
Object.defineProperty(exports, "GOSSIP_TOPIC_ENDPOINTS", { enumerable: true, get: function () { return constants_1.GOSSIP_TOPIC_ENDPOINTS; } });
|
|
53
|
+
Object.defineProperty(exports, "HD_PATH", { enumerable: true, get: function () { return constants_1.HD_PATH; } });
|
|
54
|
+
Object.defineProperty(exports, "INDEXER_HTTP_PORT_ENV", { enumerable: true, get: function () { return constants_1.INDEXER_HTTP_PORT_ENV; } });
|
|
55
|
+
Object.defineProperty(exports, "MAX_LATENCY_MS", { enumerable: true, get: function () { return constants_1.MAX_LATENCY_MS; } });
|
|
56
|
+
Object.defineProperty(exports, "MAX_WEIGHT_PER_DEVICE", { enumerable: true, get: function () { return constants_1.MAX_WEIGHT_PER_DEVICE; } });
|
|
57
|
+
Object.defineProperty(exports, "MIN_INDEPENDENT_SOURCES_FOR_NEGATIVE", { enumerable: true, get: function () { return constants_1.MIN_INDEPENDENT_SOURCES_FOR_NEGATIVE; } });
|
|
58
|
+
Object.defineProperty(exports, "ON_CHAIN_POINTER_STATES", { enumerable: true, get: function () { return constants_1.ON_CHAIN_POINTER_STATES; } });
|
|
59
|
+
Object.defineProperty(exports, "PLANNED_WS_TOPICS", { enumerable: true, get: function () { return constants_1.PLANNED_WS_TOPICS; } });
|
|
60
|
+
Object.defineProperty(exports, "PointerState", { enumerable: true, get: function () { return constants_1.PointerState; } });
|
|
61
|
+
Object.defineProperty(exports, "TCT_DECIMALS", { enumerable: true, get: function () { return constants_1.TCT_DECIMALS; } });
|
|
62
|
+
Object.defineProperty(exports, "UTCT_PER_TCT", { enumerable: true, get: function () { return constants_1.UTCT_PER_TCT; } });
|
|
63
|
+
Object.defineProperty(exports, "WS_PORT_ENV", { enumerable: true, get: function () { return constants_1.WS_PORT_ENV; } });
|
|
64
|
+
Object.defineProperty(exports, "WS_PORT_MANIFEST_FILE", { enumerable: true, get: function () { return constants_1.WS_PORT_MANIFEST_FILE; } });
|
|
65
|
+
Object.defineProperty(exports, "WS_PORT_RANGE", { enumerable: true, get: function () { return constants_1.WS_PORT_RANGE; } });
|
|
66
|
+
Object.defineProperty(exports, "WS_QUERY_LIMITS", { enumerable: true, get: function () { return constants_1.WS_QUERY_LIMITS; } });
|
|
67
|
+
Object.defineProperty(exports, "WS_QUERY_NAMES", { enumerable: true, get: function () { return constants_1.WS_QUERY_NAMES; } });
|
|
68
|
+
Object.defineProperty(exports, "WS_TOPICS", { enumerable: true, get: function () { return constants_1.WS_TOPICS; } });
|
|
69
|
+
var registry_1 = require("./registry");
|
|
70
|
+
Object.defineProperty(exports, "LICENSE_TYPE", { enumerable: true, get: function () { return registry_1.LICENSE_TYPE; } });
|
|
71
|
+
Object.defineProperty(exports, "MSG_TYPES", { enumerable: true, get: function () { return registry_1.MSG_TYPES; } });
|
|
72
|
+
Object.defineProperty(exports, "MSG_TYPE_URLS", { enumerable: true, get: function () { return registry_1.MSG_TYPE_URLS; } });
|
|
73
|
+
Object.defineProperty(exports, "PRODUCT_TYPE", { enumerable: true, get: function () { return registry_1.PRODUCT_TYPE; } });
|
|
74
|
+
Object.defineProperty(exports, "getMsgType", { enumerable: true, get: function () { return registry_1.getMsgType; } });
|
|
75
|
+
Object.defineProperty(exports, "getMsgTypeByProtoMessage", { enumerable: true, get: function () { return registry_1.getMsgTypeByProtoMessage; } });
|
|
76
|
+
Object.defineProperty(exports, "isKnownMsgType", { enumerable: true, get: function () { return registry_1.isKnownMsgType; } });
|
|
77
|
+
var ws_protocol_1 = require("./ws-protocol");
|
|
78
|
+
Object.defineProperty(exports, "WS_ERROR_CODES", { enumerable: true, get: function () { return ws_protocol_1.WS_ERROR_CODES; } });
|
|
79
|
+
Object.defineProperty(exports, "extractTopics", { enumerable: true, get: function () { return ws_protocol_1.extractTopics; } });
|
|
80
|
+
Object.defineProperty(exports, "validateClientMessage", { enumerable: true, get: function () { return ws_protocol_1.validateClientMessage; } });
|
|
81
|
+
Object.defineProperty(exports, "validateQueryArgs", { enumerable: true, get: function () { return ws_protocol_1.validateQueryArgs; } });
|
|
82
|
+
Object.defineProperty(exports, "validateQueryRequest", { enumerable: true, get: function () { return ws_protocol_1.validateQueryRequest; } });
|
|
83
|
+
Object.defineProperty(exports, "validateServerMessage", { enumerable: true, get: function () { return ws_protocol_1.validateServerMessage; } });
|
|
84
|
+
Object.defineProperty(exports, "validateSubscribeRequest", { enumerable: true, get: function () { return ws_protocol_1.validateSubscribeRequest; } });
|
|
85
|
+
Object.defineProperty(exports, "validateUnsubscribeRequest", { enumerable: true, get: function () { return ws_protocol_1.validateUnsubscribeRequest; } });
|
|
86
|
+
var endpoint_protocol_1 = require("./endpoint-protocol");
|
|
87
|
+
Object.defineProperty(exports, "AnnouncementDecision", { enumerable: true, get: function () { return endpoint_protocol_1.AnnouncementDecision; } });
|
|
88
|
+
Object.defineProperty(exports, "MAX_ANNOUNCEMENT_TTL_MS", { enumerable: true, get: function () { return endpoint_protocol_1.MAX_ANNOUNCEMENT_TTL_MS; } });
|
|
89
|
+
Object.defineProperty(exports, "MAX_ENDPOINTS_PER_ANNOUNCEMENT", { enumerable: true, get: function () { return endpoint_protocol_1.MAX_ENDPOINTS_PER_ANNOUNCEMENT; } });
|
|
90
|
+
Object.defineProperty(exports, "MAX_REGION_LENGTH", { enumerable: true, get: function () { return endpoint_protocol_1.MAX_REGION_LENGTH; } });
|
|
91
|
+
Object.defineProperty(exports, "isEndpointDescriptor", { enumerable: true, get: function () { return endpoint_protocol_1.isEndpointDescriptor; } });
|
|
92
|
+
Object.defineProperty(exports, "isLikelySellerAddress", { enumerable: true, get: function () { return endpoint_protocol_1.isLikelySellerAddress; } });
|
|
93
|
+
Object.defineProperty(exports, "shouldAcceptAnnouncement", { enumerable: true, get: function () { return endpoint_protocol_1.shouldAcceptAnnouncement; } });
|
|
94
|
+
Object.defineProperty(exports, "validateEndpointAnnouncement", { enumerable: true, get: function () { return endpoint_protocol_1.validateEndpointAnnouncement; } });
|
|
95
|
+
Object.defineProperty(exports, "validateEndpointDescriptor", { enumerable: true, get: function () { return endpoint_protocol_1.validateEndpointDescriptor; } });
|
|
96
|
+
Object.defineProperty(exports, "validateProbeReport", { enumerable: true, get: function () { return endpoint_protocol_1.validateProbeReport; } });
|
|
97
|
+
var sp_framework_1 = require("./sp-framework");
|
|
98
|
+
Object.defineProperty(exports, "ApplymentState", { enumerable: true, get: function () { return sp_framework_1.ApplymentState; } });
|
|
99
|
+
Object.defineProperty(exports, "PaymentFactStatus", { enumerable: true, get: function () { return sp_framework_1.PaymentFactStatus; } });
|
|
100
|
+
Object.defineProperty(exports, "SalesScene", { enumerable: true, get: function () { return sp_framework_1.SalesScene; } });
|
|
101
|
+
Object.defineProperty(exports, "SettlementCycleKind", { enumerable: true, get: function () { return sp_framework_1.SettlementCycleKind; } });
|
|
102
|
+
Object.defineProperty(exports, "SP_BACKEND_ROUTES", { enumerable: true, get: function () { return sp_framework_1.SP_BACKEND_ROUTES; } });
|
|
103
|
+
Object.defineProperty(exports, "SP_COMMISSION_HARD_CAP_BP", { enumerable: true, get: function () { return sp_framework_1.SP_COMMISSION_HARD_CAP_BP; } });
|
|
104
|
+
Object.defineProperty(exports, "SP_MSG_TYPE_URLS", { enumerable: true, get: function () { return sp_framework_1.SP_MSG_TYPE_URLS; } });
|
|
105
|
+
Object.defineProperty(exports, "SP_QUERY_ENDPOINTS", { enumerable: true, get: function () { return sp_framework_1.SP_QUERY_ENDPOINTS; } });
|
|
106
|
+
Object.defineProperty(exports, "SpIndustry", { enumerable: true, get: function () { return sp_framework_1.SpIndustry; } });
|
|
107
|
+
Object.defineProperty(exports, "SpStatus", { enumerable: true, get: function () { return sp_framework_1.SpStatus; } });
|
|
108
|
+
Object.defineProperty(exports, "WECHAT_APIS", { enumerable: true, get: function () { return sp_framework_1.WECHAT_APIS; } });
|
|
109
|
+
var validation_1 = require("./validation");
|
|
110
|
+
Object.defineProperty(exports, "isFiniteNumber", { enumerable: true, get: function () { return validation_1.isFiniteNumber; } });
|
|
111
|
+
Object.defineProperty(exports, "isHexOfLength", { enumerable: true, get: function () { return validation_1.isHexOfLength; } });
|
|
112
|
+
Object.defineProperty(exports, "isIntegerInRange", { enumerable: true, get: function () { return validation_1.isIntegerInRange; } });
|
|
113
|
+
Object.defineProperty(exports, "isLowerHexOfLength", { enumerable: true, get: function () { return validation_1.isLowerHexOfLength; } });
|
|
114
|
+
Object.defineProperty(exports, "isNonEmptyString", { enumerable: true, get: function () { return validation_1.isNonEmptyString; } });
|
|
115
|
+
Object.defineProperty(exports, "isPlainObject", { enumerable: true, get: function () { return validation_1.isPlainObject; } });
|
|
116
|
+
Object.defineProperty(exports, "isStringArray", { enumerable: true, get: function () { return validation_1.isStringArray; } });
|
|
117
|
+
Object.defineProperty(exports, "isStringOfMaxLength", { enumerable: true, get: function () { return validation_1.isStringOfMaxLength; } });
|
|
118
|
+
Object.defineProperty(exports, "invalid", { enumerable: true, get: function () { return validation_1.invalid; } });
|
|
119
|
+
Object.defineProperty(exports, "optional", { enumerable: true, get: function () { return validation_1.optional; } });
|
|
120
|
+
Object.defineProperty(exports, "valid", { enumerable: true, get: function () { return validation_1.valid; } });
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|