@diap/sdk 0.1.1 → 0.1.3
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/LICENSE +21 -21
- package/README.md +86 -86
- package/dist/agent-auth.d.ts +96 -0
- package/dist/agent-auth.d.ts.map +1 -0
- package/dist/agent-auth.js +343 -0
- package/dist/agent-auth.js.map +1 -0
- package/dist/agent-verification.d.ts +158 -0
- package/dist/agent-verification.d.ts.map +1 -0
- package/dist/agent-verification.js +237 -0
- package/dist/agent-verification.js.map +1 -0
- package/dist/config-manager.d.ts +156 -0
- package/dist/config-manager.d.ts.map +1 -0
- package/dist/config-manager.js +241 -0
- package/dist/config-manager.js.map +1 -0
- package/dist/did-builder.d.ts +62 -0
- package/dist/did-builder.d.ts.map +1 -0
- package/dist/did-builder.js +315 -0
- package/dist/did-builder.js.map +1 -0
- package/dist/did-cache.d.ts +133 -0
- package/dist/did-cache.d.ts.map +1 -0
- package/dist/did-cache.js +273 -0
- package/dist/did-cache.js.map +1 -0
- package/dist/identity-manager.d.ts +87 -0
- package/dist/identity-manager.d.ts.map +1 -0
- package/dist/identity-manager.js +196 -0
- package/dist/identity-manager.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/ipfs-bidirectional-verification.d.ts +201 -0
- package/dist/ipfs-bidirectional-verification.d.ts.map +1 -0
- package/dist/ipfs-bidirectional-verification.js +298 -0
- package/dist/ipfs-bidirectional-verification.js.map +1 -0
- package/dist/ipfs-client.d.ts +151 -0
- package/dist/ipfs-client.d.ts.map +1 -0
- package/dist/ipfs-client.js +623 -0
- package/dist/ipfs-client.js.map +1 -0
- package/dist/ipfs-node-manager.d.ts +136 -0
- package/dist/ipfs-node-manager.d.ts.map +1 -0
- package/dist/ipfs-node-manager.js +232 -0
- package/dist/ipfs-node-manager.js.map +1 -0
- package/dist/ipns-manager.d.ts +182 -0
- package/dist/ipns-manager.d.ts.map +1 -0
- package/dist/ipns-manager.js +268 -0
- package/dist/ipns-manager.js.map +1 -0
- package/dist/key-manager.d.ts +48 -0
- package/dist/key-manager.d.ts.map +1 -0
- package/dist/key-manager.js +231 -0
- package/dist/key-manager.js.map +1 -0
- package/dist/kubo-installer.d.ts +115 -0
- package/dist/kubo-installer.d.ts.map +1 -0
- package/dist/kubo-installer.js +205 -0
- package/dist/kubo-installer.js.map +1 -0
- package/dist/libp2p/encrypted-peer-id.d.ts +24 -0
- package/dist/libp2p/encrypted-peer-id.d.ts.map +1 -0
- package/dist/libp2p/encrypted-peer-id.js +134 -0
- package/dist/libp2p/encrypted-peer-id.js.map +1 -0
- package/dist/nonce-manager.d.ts +176 -0
- package/dist/nonce-manager.d.ts.map +1 -0
- package/dist/nonce-manager.js +382 -0
- package/dist/nonce-manager.js.map +1 -0
- package/dist/p2p/hyperswarm-communicator.d.ts +252 -0
- package/dist/p2p/hyperswarm-communicator.d.ts.map +1 -0
- package/dist/p2p/hyperswarm-communicator.js +469 -0
- package/dist/p2p/hyperswarm-communicator.js.map +1 -0
- package/dist/p2p/iroh-communicator.d.ts +216 -0
- package/dist/p2p/iroh-communicator.d.ts.map +1 -0
- package/dist/p2p/iroh-communicator.js +408 -0
- package/dist/p2p/iroh-communicator.js.map +1 -0
- package/dist/pubsub-authenticator.d.ts +246 -0
- package/dist/pubsub-authenticator.d.ts.map +1 -0
- package/dist/pubsub-authenticator.js +384 -0
- package/dist/pubsub-authenticator.js.map +1 -0
- package/dist/real-name-auth.d.ts +238 -0
- package/dist/real-name-auth.d.ts.map +1 -0
- package/dist/real-name-auth.js +259 -0
- package/dist/real-name-auth.js.map +1 -0
- package/dist/types/did.d.ts +76 -0
- package/dist/types/did.d.ts.map +1 -0
- package/dist/types/did.js +5 -0
- package/dist/types/did.js.map +1 -0
- package/dist/types/errors.d.ts +42 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +69 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/key.d.ts +43 -0
- package/dist/types/key.d.ts.map +1 -0
- package/dist/types/key.js +5 -0
- package/dist/types/key.js.map +1 -0
- package/dist/types/zkp.d.ts +80 -0
- package/dist/types/zkp.d.ts.map +1 -0
- package/dist/types/zkp.js +16 -0
- package/dist/types/zkp.js.map +1 -0
- package/dist/utils/crypto.d.ts +24 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +65 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/encoding.d.ts +36 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +80 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +37 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/zkp/key-generator.d.ts +56 -0
- package/dist/zkp/key-generator.d.ts.map +1 -0
- package/dist/zkp/key-generator.js +165 -0
- package/dist/zkp/key-generator.js.map +1 -0
- package/dist/zkp/simplified-backend.d.ts +23 -0
- package/dist/zkp/simplified-backend.d.ts.map +1 -0
- package/dist/zkp/simplified-backend.js +77 -0
- package/dist/zkp/simplified-backend.js.map +1 -0
- package/dist/zkp/snarkjs-backend.d.ts +150 -0
- package/dist/zkp/snarkjs-backend.d.ts.map +1 -0
- package/dist/zkp/snarkjs-backend.js +218 -0
- package/dist/zkp/snarkjs-backend.js.map +1 -0
- package/dist/zkp/universal-manager.d.ts +44 -0
- package/dist/zkp/universal-manager.d.ts.map +1 -0
- package/dist/zkp/universal-manager.js +181 -0
- package/dist/zkp/universal-manager.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DIAP TypeScript SDK - Nonce 管理器
|
|
3
|
+
* 生成和管理随机数,用于防重放攻击
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from './utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Nonce 管理器
|
|
8
|
+
*/
|
|
9
|
+
export class NonceManager {
|
|
10
|
+
/** 配置 */
|
|
11
|
+
config;
|
|
12
|
+
/** Nonce 缓存 */
|
|
13
|
+
nonceCache;
|
|
14
|
+
/** 已使用的 Nonce 集合(用于快速查找) */
|
|
15
|
+
usedNonces;
|
|
16
|
+
/** 清理间隔(毫秒) */
|
|
17
|
+
cleanupIntervalMs = 60000;
|
|
18
|
+
/**
|
|
19
|
+
* 创建 Nonce 管理器
|
|
20
|
+
*/
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = {
|
|
23
|
+
nonceLength: config?.nonceLength || 32,
|
|
24
|
+
ttlSeconds: config?.ttlSeconds || 300, // 5 分钟
|
|
25
|
+
maxUsageCount: config?.maxUsageCount || 1,
|
|
26
|
+
maxCacheSize: config?.maxCacheSize || 1000,
|
|
27
|
+
};
|
|
28
|
+
this.nonceCache = new Map();
|
|
29
|
+
this.usedNonces = new Set();
|
|
30
|
+
// 启动清理任务
|
|
31
|
+
this.startCleanupTask();
|
|
32
|
+
logger.info('✅ Nonce 管理器已创建');
|
|
33
|
+
logger.info(` Nonce 长度: ${this.config.nonceLength} 字节`);
|
|
34
|
+
logger.info(` TTL: ${this.config.ttlSeconds} 秒`);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 生成新的 Nonce(静态方法,格式: timestamp:uuid:random)
|
|
38
|
+
*/
|
|
39
|
+
static generateNonce() {
|
|
40
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
41
|
+
const uuid = crypto.randomUUID ? crypto.randomUUID() : NonceManager.generateFallbackUuid();
|
|
42
|
+
const random = Math.floor(Math.random() * 0xffffffffffff).toString(16);
|
|
43
|
+
return `${timestamp}:${uuid}:${random}`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 生成 fallback UUID
|
|
47
|
+
*/
|
|
48
|
+
static generateFallbackUuid() {
|
|
49
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
|
|
50
|
+
const r = (Math.random() * 16) | 0;
|
|
51
|
+
const v = c === 'x' ? r : (r & 0x3) | 0x8;
|
|
52
|
+
return v.toString(16);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 生成新的 Nonce
|
|
57
|
+
*/
|
|
58
|
+
generateNonce() {
|
|
59
|
+
const nonce = NonceManager.generateNonce();
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
const record = {
|
|
62
|
+
nonce,
|
|
63
|
+
createdAt: now,
|
|
64
|
+
expiresAt: now + this.config.ttlSeconds * 1000,
|
|
65
|
+
usedCount: 0,
|
|
66
|
+
isUsed: false,
|
|
67
|
+
};
|
|
68
|
+
// 检查缓存大小
|
|
69
|
+
if (this.nonceCache.size >= this.config.maxCacheSize) {
|
|
70
|
+
this.evictOldest();
|
|
71
|
+
}
|
|
72
|
+
this.nonceCache.set(nonce, record);
|
|
73
|
+
logger.debug(`🔢 生成 Nonce: ${nonce.substring(0, 8)}...`);
|
|
74
|
+
return nonce;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 验证并记录 Nonce(原子操作)
|
|
78
|
+
*
|
|
79
|
+
* @returns true - Nonce 有效且未被使用
|
|
80
|
+
* @returns false - Nonce 已被使用(重放攻击)
|
|
81
|
+
* @throws Nonce 格式错误或已过期
|
|
82
|
+
*/
|
|
83
|
+
verifyAndRecord(nonce, did) {
|
|
84
|
+
// 1. 解析 nonce 格式
|
|
85
|
+
const parts = nonce.split(':');
|
|
86
|
+
if (parts.length < 2) {
|
|
87
|
+
return { isValid: false, error: 'Nonce 格式错误' };
|
|
88
|
+
}
|
|
89
|
+
const timestamp = parseInt(parts[0], 10);
|
|
90
|
+
if (isNaN(timestamp)) {
|
|
91
|
+
return { isValid: false, error: '无法解析时间戳' };
|
|
92
|
+
}
|
|
93
|
+
// 2. 检查时间戳是否在有效期内
|
|
94
|
+
const now = Math.floor(Date.now() / 1000);
|
|
95
|
+
if (timestamp > now) {
|
|
96
|
+
return { isValid: false, error: 'Nonce 时间戳在未来' };
|
|
97
|
+
}
|
|
98
|
+
if (now - timestamp > this.config.ttlSeconds) {
|
|
99
|
+
return { isValid: false, error: `Nonce 已过期(超过${this.config.ttlSeconds}秒)` };
|
|
100
|
+
}
|
|
101
|
+
// 3. 检查是否已被使用
|
|
102
|
+
if (this.usedNonces.has(nonce)) {
|
|
103
|
+
logger.warn(`检测到重放攻击!Nonce 已被使用: ${nonce.substring(0, 8)}...`);
|
|
104
|
+
return { isValid: false, error: 'Nonce 已使用(重放攻击)' };
|
|
105
|
+
}
|
|
106
|
+
// 4. 记录 nonce
|
|
107
|
+
const nowMs = Date.now();
|
|
108
|
+
const record = {
|
|
109
|
+
nonce,
|
|
110
|
+
createdAt: nowMs - (now - timestamp) * 1000,
|
|
111
|
+
expiresAt: nowMs + (this.config.ttlSeconds - (now - timestamp)) * 1000,
|
|
112
|
+
usedCount: 1,
|
|
113
|
+
isUsed: true,
|
|
114
|
+
did,
|
|
115
|
+
};
|
|
116
|
+
this.nonceCache.set(nonce, record);
|
|
117
|
+
this.usedNonces.add(nonce);
|
|
118
|
+
logger.debug(`✓ Nonce 验证通过并已记录: ${nonce.substring(0, 8)}...`);
|
|
119
|
+
return { isValid: true };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 检查 Nonce 是否已被使用
|
|
123
|
+
*/
|
|
124
|
+
isUsed(nonce) {
|
|
125
|
+
return this.usedNonces.has(nonce);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 验证 Nonce
|
|
129
|
+
*/
|
|
130
|
+
validateNonce(nonce) {
|
|
131
|
+
const record = this.nonceCache.get(nonce);
|
|
132
|
+
// 检查是否存在
|
|
133
|
+
if (!record) {
|
|
134
|
+
// 也检查是否已使用
|
|
135
|
+
if (this.usedNonces.has(nonce)) {
|
|
136
|
+
return {
|
|
137
|
+
isValid: false,
|
|
138
|
+
error: 'Nonce 已使用',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
isValid: false,
|
|
143
|
+
error: 'Nonce 不存在',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
// 检查是否过期
|
|
147
|
+
if (Date.now() > record.expiresAt) {
|
|
148
|
+
this.nonceCache.delete(nonce);
|
|
149
|
+
return {
|
|
150
|
+
isValid: false,
|
|
151
|
+
error: 'Nonce 已过期',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// 检查使用次数
|
|
155
|
+
if (record.usedCount >= this.config.maxUsageCount) {
|
|
156
|
+
return {
|
|
157
|
+
isValid: false,
|
|
158
|
+
error: 'Nonce 使用次数已达上限',
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
isValid: true,
|
|
163
|
+
record,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* 使用 Nonce
|
|
168
|
+
*/
|
|
169
|
+
useNonce(nonce) {
|
|
170
|
+
const result = this.validateNonce(nonce);
|
|
171
|
+
if (!result.isValid) {
|
|
172
|
+
logger.warn(`❌ 无法使用 Nonce: ${result.error}`);
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
const record = result.record;
|
|
176
|
+
record.usedCount += 1;
|
|
177
|
+
if (record.usedCount >= this.config.maxUsageCount) {
|
|
178
|
+
record.isUsed = true;
|
|
179
|
+
this.usedNonces.add(nonce);
|
|
180
|
+
}
|
|
181
|
+
logger.debug(`✓ Nonce 已使用: ${nonce.substring(0, 8)}...`);
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 检查 Nonce 是否已使用
|
|
186
|
+
*/
|
|
187
|
+
isNonceUsed(nonce) {
|
|
188
|
+
const record = this.nonceCache.get(nonce);
|
|
189
|
+
return record ? record.isUsed : this.usedNonces.has(nonce);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 获取 Nonce 信息
|
|
193
|
+
*/
|
|
194
|
+
getNonceInfo(nonce) {
|
|
195
|
+
return this.nonceCache.get(nonce) || null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 创建验证请求(生成带时间戳的 Nonce)
|
|
199
|
+
*/
|
|
200
|
+
createVerificationRequest(clientId, action) {
|
|
201
|
+
const nonce = this.generateNonce();
|
|
202
|
+
const timestamp = Date.now();
|
|
203
|
+
// 创建签名(简化版本,实际应使用密钥签名)
|
|
204
|
+
const signature = this.createSignature(clientId, action, nonce, timestamp);
|
|
205
|
+
return {
|
|
206
|
+
nonce,
|
|
207
|
+
timestamp,
|
|
208
|
+
signature,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 验证请求(验证带时间戳的 Nonce)
|
|
213
|
+
*/
|
|
214
|
+
validateRequest(clientId, action, nonce, timestamp, signature) {
|
|
215
|
+
// 验证时间戳(允许 ±5 分钟误差)
|
|
216
|
+
const timeDiff = Math.abs(Date.now() - timestamp);
|
|
217
|
+
if (timeDiff > 5 * 60 * 1000) {
|
|
218
|
+
return {
|
|
219
|
+
isValid: false,
|
|
220
|
+
error: '请求时间戳无效',
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
// 验证 Nonce
|
|
224
|
+
const nonceResult = this.validateNonce(nonce);
|
|
225
|
+
if (!nonceResult.isValid) {
|
|
226
|
+
return nonceResult;
|
|
227
|
+
}
|
|
228
|
+
// 验证签名
|
|
229
|
+
const expectedSignature = this.createSignature(clientId, action, nonce, timestamp);
|
|
230
|
+
if (signature !== expectedSignature) {
|
|
231
|
+
return {
|
|
232
|
+
isValid: false,
|
|
233
|
+
error: '签名验证失败',
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
isValid: true,
|
|
238
|
+
record: nonceResult.record,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* 创建签名
|
|
243
|
+
*/
|
|
244
|
+
createSignature(clientId, action, nonce, timestamp) {
|
|
245
|
+
const data = `${clientId}:${action}:${nonce}:${timestamp}`;
|
|
246
|
+
return this.hashString(data);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* 哈希字符串
|
|
250
|
+
*/
|
|
251
|
+
hashString(data) {
|
|
252
|
+
let hash = 0;
|
|
253
|
+
for (let i = 0; i < data.length; i++) {
|
|
254
|
+
const char = data.charCodeAt(i);
|
|
255
|
+
hash = (hash << 5) - hash + char;
|
|
256
|
+
hash = hash & hash;
|
|
257
|
+
}
|
|
258
|
+
return Math.abs(hash).toString(16).padStart(16, '0');
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* 生成安全的随机字符串
|
|
262
|
+
*/
|
|
263
|
+
generateSecureRandomString(length) {
|
|
264
|
+
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
265
|
+
let result = '';
|
|
266
|
+
// 使用 crypto 获取随机字节
|
|
267
|
+
const randomBytes = new Uint8Array(length);
|
|
268
|
+
if (typeof globalThis.crypto !== 'undefined' && globalThis.crypto.getRandomValues) {
|
|
269
|
+
globalThis.crypto.getRandomValues(randomBytes);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
// 回退到 Math.random
|
|
273
|
+
for (let i = 0; i < length; i++) {
|
|
274
|
+
randomBytes[i] = Math.floor(Math.random() * 256);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
for (let i = 0; i < length; i++) {
|
|
278
|
+
result += chars[randomBytes[i] % chars.length];
|
|
279
|
+
}
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* 驱逐最旧的 Nonce
|
|
284
|
+
*/
|
|
285
|
+
evictOldest() {
|
|
286
|
+
let oldestNonce = null;
|
|
287
|
+
let oldestTime = Date.now();
|
|
288
|
+
for (const [nonce, record] of this.nonceCache.entries()) {
|
|
289
|
+
if (record.createdAt < oldestTime) {
|
|
290
|
+
oldestTime = record.createdAt;
|
|
291
|
+
oldestNonce = nonce;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (oldestNonce) {
|
|
295
|
+
this.nonceCache.delete(oldestNonce);
|
|
296
|
+
logger.debug(`驱逐最旧 Nonce: ${oldestNonce.substring(0, 8)}...`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* 清理过期 Nonce
|
|
301
|
+
*/
|
|
302
|
+
cleanupExpired() {
|
|
303
|
+
const now = Date.now();
|
|
304
|
+
let removed = 0;
|
|
305
|
+
for (const [nonce, record] of this.nonceCache.entries()) {
|
|
306
|
+
if (now > record.expiresAt) {
|
|
307
|
+
this.nonceCache.delete(nonce);
|
|
308
|
+
removed++;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (removed > 0) {
|
|
312
|
+
logger.debug(`🧹 清理了 ${removed} 个过期 Nonce`);
|
|
313
|
+
}
|
|
314
|
+
return removed;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* 启动清理任务
|
|
318
|
+
*/
|
|
319
|
+
startCleanupTask() {
|
|
320
|
+
setInterval(() => {
|
|
321
|
+
this.cleanupExpired();
|
|
322
|
+
}, this.cleanupIntervalMs);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* 获取缓存大小
|
|
326
|
+
*/
|
|
327
|
+
getCacheSize() {
|
|
328
|
+
return this.nonceCache.size;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* 获取已使用 Nonce 数量
|
|
332
|
+
*/
|
|
333
|
+
getUsedCount() {
|
|
334
|
+
return this.usedNonces.size;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* 清空所有 Nonce
|
|
338
|
+
*/
|
|
339
|
+
clear() {
|
|
340
|
+
this.nonceCache.clear();
|
|
341
|
+
this.usedNonces.clear();
|
|
342
|
+
logger.info('🧹 已清空所有 Nonce');
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* 获取统计信息
|
|
346
|
+
*/
|
|
347
|
+
getStats() {
|
|
348
|
+
const activeCount = Array.from(this.nonceCache.values()).filter((r) => !r.isUsed && Date.now() < r.expiresAt).length;
|
|
349
|
+
return {
|
|
350
|
+
cacheSize: this.nonceCache.size,
|
|
351
|
+
usedCount: this.usedNonces.size,
|
|
352
|
+
activeCount,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// ============================================================================
|
|
357
|
+
// 便捷函数
|
|
358
|
+
// ============================================================================
|
|
359
|
+
/**
|
|
360
|
+
* 创建 Nonce 管理器(便捷函数)
|
|
361
|
+
*/
|
|
362
|
+
export function createNonceManager(config) {
|
|
363
|
+
return new NonceManager(config);
|
|
364
|
+
}
|
|
365
|
+
// ============================================================================
|
|
366
|
+
// 全局单例
|
|
367
|
+
// ============================================================================
|
|
368
|
+
let globalNonceManager = null;
|
|
369
|
+
/**
|
|
370
|
+
* 获取全局 Nonce 管理器
|
|
371
|
+
*/
|
|
372
|
+
export function getGlobalNonceManager() {
|
|
373
|
+
if (!globalNonceManager) {
|
|
374
|
+
globalNonceManager = new NonceManager();
|
|
375
|
+
}
|
|
376
|
+
return globalNonceManager;
|
|
377
|
+
}
|
|
378
|
+
// ============================================================================
|
|
379
|
+
// 导出
|
|
380
|
+
// ============================================================================
|
|
381
|
+
// 注意: NonceRecord, NonceManagerConfig, NonceValidationResult 已在声明时导出
|
|
382
|
+
//# sourceMappingURL=nonce-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonce-manager.js","sourceRoot":"","sources":["../src/nonce-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DIAP TypeScript SDK - Hyperswarm P2P 通信器
|
|
3
|
+
*
|
|
4
|
+
* 使用 Hyperswarm 实现轻量级 P2P 网络
|
|
5
|
+
*
|
|
6
|
+
* 安装: npm install hyperswarm
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import Hyperswarm from 'hyperswarm';
|
|
11
|
+
*
|
|
12
|
+
* const swarm = new Hyperswarm();
|
|
13
|
+
* const topic = Buffer.alloc(32).fill('hello-world');
|
|
14
|
+
* swarm.join(topic, { server: true, client: true });
|
|
15
|
+
*
|
|
16
|
+
* swarm.on('connection', (conn, info) => {
|
|
17
|
+
* console.log('新连接:', info.publicKey.toString('hex'));
|
|
18
|
+
* conn.write('hello from TS!');
|
|
19
|
+
* conn.on('data', data => console.log('收到:', data.toString()));
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* P2P 消息类型
|
|
25
|
+
*/
|
|
26
|
+
export declare enum P2PMessageType {
|
|
27
|
+
/** 身份验证请求 */
|
|
28
|
+
AuthRequest = "auth_request",
|
|
29
|
+
/** 身份验证响应 */
|
|
30
|
+
AuthResponse = "auth_response",
|
|
31
|
+
/** 数据消息 */
|
|
32
|
+
Data = "data",
|
|
33
|
+
/** 心跳 */
|
|
34
|
+
Heartbeat = "heartbeat",
|
|
35
|
+
/** 自定义 */
|
|
36
|
+
Custom = "custom"
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Hyperswarm 配置
|
|
40
|
+
*/
|
|
41
|
+
export interface HyperswarmConfig {
|
|
42
|
+
/** 是否作为服务器 */
|
|
43
|
+
server?: boolean;
|
|
44
|
+
/** 是否作为客户端 */
|
|
45
|
+
client?: boolean;
|
|
46
|
+
/** 是否自动连接 */
|
|
47
|
+
autoConnect?: boolean;
|
|
48
|
+
/** 最大连接数 */
|
|
49
|
+
maxConnections?: number;
|
|
50
|
+
/** 种子节点 */
|
|
51
|
+
seed?: Buffer[];
|
|
52
|
+
/** 启用多路复用 */
|
|
53
|
+
multiplex?: boolean;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* P2P 连接信息
|
|
57
|
+
*/
|
|
58
|
+
export interface P2PConnection {
|
|
59
|
+
/** 连接 ID */
|
|
60
|
+
id: string;
|
|
61
|
+
/** 对方公钥 */
|
|
62
|
+
publicKey: string;
|
|
63
|
+
/** 是否是入站连接 */
|
|
64
|
+
isInbound: boolean;
|
|
65
|
+
/** 连接建立时间 */
|
|
66
|
+
connectedAt: number;
|
|
67
|
+
/** 最后活动时间 */
|
|
68
|
+
lastActivity: number;
|
|
69
|
+
/** 已发送字节数 */
|
|
70
|
+
bytesSent: number;
|
|
71
|
+
/** 已接收字节数 */
|
|
72
|
+
bytesReceived: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* P2P 节点地址
|
|
76
|
+
*/
|
|
77
|
+
export interface P2PNodeAddr {
|
|
78
|
+
/** 公钥(hex 编码) */
|
|
79
|
+
publicKey: string;
|
|
80
|
+
/** 主题列表 */
|
|
81
|
+
topics: string[];
|
|
82
|
+
/** 连接地址 */
|
|
83
|
+
relayAddresses?: string[];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* P2P 消息
|
|
87
|
+
*/
|
|
88
|
+
export interface P2PMessage {
|
|
89
|
+
/** 消息 ID */
|
|
90
|
+
id: string;
|
|
91
|
+
/** 消息类型 */
|
|
92
|
+
type: P2PMessageType;
|
|
93
|
+
/** 发送者公钥 */
|
|
94
|
+
fromPublicKey: string;
|
|
95
|
+
/** 接收者公钥(可选) */
|
|
96
|
+
toPublicKey?: string;
|
|
97
|
+
/** 消息内容 */
|
|
98
|
+
content: Uint8Array;
|
|
99
|
+
/** 时间戳 */
|
|
100
|
+
timestamp: number;
|
|
101
|
+
/** 签名 */
|
|
102
|
+
signature?: Uint8Array;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* P2P 消息签名数据
|
|
106
|
+
*/
|
|
107
|
+
export interface P2PMessageSignature {
|
|
108
|
+
/** 签名者公钥 */
|
|
109
|
+
signerPublicKey: string;
|
|
110
|
+
/** 消息哈希 */
|
|
111
|
+
messageHash: string;
|
|
112
|
+
/** 签名 */
|
|
113
|
+
signature: Uint8Array;
|
|
114
|
+
/** 时间戳 */
|
|
115
|
+
timestamp: number;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Hyperswarm P2P 通信器事件
|
|
119
|
+
*/
|
|
120
|
+
export interface HyperswarmEvents {
|
|
121
|
+
/** 新连接事件 */
|
|
122
|
+
connection: (conn: P2PConnection, info: {
|
|
123
|
+
publicKey: Buffer;
|
|
124
|
+
}) => void;
|
|
125
|
+
/** 错误事件 */
|
|
126
|
+
error: (error: Error) => void;
|
|
127
|
+
/** 主题加入事件 */
|
|
128
|
+
topic: (topic: Buffer) => void;
|
|
129
|
+
/** 消息事件 */
|
|
130
|
+
message: (message: P2PMessage, conn: P2PConnection) => void;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Hyperswarm P2P 通信器
|
|
134
|
+
*
|
|
135
|
+
* 基于 Hyperswarm 实现轻量级 P2P 网络
|
|
136
|
+
* 专注于快速节点发现和加密连接
|
|
137
|
+
*/
|
|
138
|
+
export declare class HyperswarmCommunicator {
|
|
139
|
+
private config;
|
|
140
|
+
private swarm;
|
|
141
|
+
private connections;
|
|
142
|
+
private topics;
|
|
143
|
+
private isRunning;
|
|
144
|
+
private eventHandlers;
|
|
145
|
+
private localPublicKey;
|
|
146
|
+
/**
|
|
147
|
+
* 创建 Hyperswarm P2P 通信器
|
|
148
|
+
*/
|
|
149
|
+
constructor(config?: HyperswarmConfig);
|
|
150
|
+
/**
|
|
151
|
+
* 启动 P2P 网络
|
|
152
|
+
*/
|
|
153
|
+
start(): Promise<void>;
|
|
154
|
+
/**
|
|
155
|
+
* 停止 P2P 网络
|
|
156
|
+
*/
|
|
157
|
+
stop(): Promise<void>;
|
|
158
|
+
/**
|
|
159
|
+
* 加入主题
|
|
160
|
+
* @param topic - 32 字节主题 Buffer
|
|
161
|
+
*/
|
|
162
|
+
joinTopic(topic: Buffer | string): Promise<void>;
|
|
163
|
+
/**
|
|
164
|
+
* 离开主题
|
|
165
|
+
*/
|
|
166
|
+
leaveTopic(topic: Buffer | string): Promise<void>;
|
|
167
|
+
/**
|
|
168
|
+
* 连接到节点
|
|
169
|
+
*/
|
|
170
|
+
connect(publicKey: Buffer | string): Promise<P2PConnection>;
|
|
171
|
+
/**
|
|
172
|
+
* 关闭连接
|
|
173
|
+
*/
|
|
174
|
+
closeConnection(connectionId: string): Promise<void>;
|
|
175
|
+
/**
|
|
176
|
+
* 发送消息到连接
|
|
177
|
+
*/
|
|
178
|
+
sendToConnection(connectionId: string, data: Uint8Array | string): Promise<void>;
|
|
179
|
+
/**
|
|
180
|
+
* 广播消息到所有连接
|
|
181
|
+
*/
|
|
182
|
+
broadcast(data: Uint8Array | string): Promise<void>;
|
|
183
|
+
/**
|
|
184
|
+
* 获取所有连接
|
|
185
|
+
*/
|
|
186
|
+
getConnections(): P2PConnection[];
|
|
187
|
+
/**
|
|
188
|
+
* 获取连接数
|
|
189
|
+
*/
|
|
190
|
+
getConnectionCount(): number;
|
|
191
|
+
/**
|
|
192
|
+
* 获取本地公钥
|
|
193
|
+
*/
|
|
194
|
+
getLocalPublicKey(): string | null;
|
|
195
|
+
/**
|
|
196
|
+
* 是否正在运行
|
|
197
|
+
*/
|
|
198
|
+
isActive(): boolean;
|
|
199
|
+
/**
|
|
200
|
+
* 获取配置
|
|
201
|
+
*/
|
|
202
|
+
getConfig(): HyperswarmConfig;
|
|
203
|
+
/**
|
|
204
|
+
* 注册事件处理器
|
|
205
|
+
*/
|
|
206
|
+
on<K extends keyof HyperswarmEvents>(event: K, handler: HyperswarmEvents[K]): void;
|
|
207
|
+
/**
|
|
208
|
+
* 移除事件处理器
|
|
209
|
+
*/
|
|
210
|
+
off<K extends keyof HyperswarmEvents>(event: K, handler: HyperswarmEvents[K]): void;
|
|
211
|
+
/**
|
|
212
|
+
* 触发事件
|
|
213
|
+
*/
|
|
214
|
+
private emit;
|
|
215
|
+
/**
|
|
216
|
+
* 设置连接处理器
|
|
217
|
+
*/
|
|
218
|
+
private setupConnectionHandlers;
|
|
219
|
+
/**
|
|
220
|
+
* 设置流处理器
|
|
221
|
+
*/
|
|
222
|
+
private setupStreamHandlers;
|
|
223
|
+
/**
|
|
224
|
+
* 生成唯一 ID
|
|
225
|
+
*/
|
|
226
|
+
private generateId;
|
|
227
|
+
/**
|
|
228
|
+
* 对消息内容进行签名
|
|
229
|
+
*/
|
|
230
|
+
signMessage(content: Uint8Array, privateKey: Uint8Array): Promise<Uint8Array>;
|
|
231
|
+
/**
|
|
232
|
+
* 验证消息签名
|
|
233
|
+
*/
|
|
234
|
+
verifyMessageSignature(content: Uint8Array, signature: Uint8Array, publicKey: Uint8Array): Promise<boolean>;
|
|
235
|
+
/**
|
|
236
|
+
* 创建签名消息
|
|
237
|
+
*/
|
|
238
|
+
createSignedMessage(type: P2PMessageType, content: Uint8Array, fromPublicKey: string, toPublicKey: string | undefined, privateKey: Uint8Array): Promise<P2PMessage>;
|
|
239
|
+
/**
|
|
240
|
+
* 验证并解析签名消息
|
|
241
|
+
*/
|
|
242
|
+
verifySignedMessage(message: P2PMessage, senderPublicKey: Uint8Array): Promise<boolean>;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* 创建 Hyperswarm P2P 通信器
|
|
246
|
+
*/
|
|
247
|
+
export declare function createHyperswarmCommunicator(config?: HyperswarmConfig): HyperswarmCommunicator;
|
|
248
|
+
/**
|
|
249
|
+
* 从主题字符串创建 32 字节 Buffer
|
|
250
|
+
*/
|
|
251
|
+
export declare function createTopic(topic: string): Buffer;
|
|
252
|
+
//# sourceMappingURL=hyperswarm-communicator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyperswarm-communicator.d.ts","sourceRoot":"","sources":["../../src/p2p/hyperswarm-communicator.ts"],"names":[],"mappings":"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"}
|