@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.
Files changed (127) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +86 -86
  3. package/dist/agent-auth.d.ts +96 -0
  4. package/dist/agent-auth.d.ts.map +1 -0
  5. package/dist/agent-auth.js +343 -0
  6. package/dist/agent-auth.js.map +1 -0
  7. package/dist/agent-verification.d.ts +158 -0
  8. package/dist/agent-verification.d.ts.map +1 -0
  9. package/dist/agent-verification.js +237 -0
  10. package/dist/agent-verification.js.map +1 -0
  11. package/dist/config-manager.d.ts +156 -0
  12. package/dist/config-manager.d.ts.map +1 -0
  13. package/dist/config-manager.js +241 -0
  14. package/dist/config-manager.js.map +1 -0
  15. package/dist/did-builder.d.ts +62 -0
  16. package/dist/did-builder.d.ts.map +1 -0
  17. package/dist/did-builder.js +315 -0
  18. package/dist/did-builder.js.map +1 -0
  19. package/dist/did-cache.d.ts +133 -0
  20. package/dist/did-cache.d.ts.map +1 -0
  21. package/dist/did-cache.js +273 -0
  22. package/dist/did-cache.js.map +1 -0
  23. package/dist/identity-manager.d.ts +87 -0
  24. package/dist/identity-manager.d.ts.map +1 -0
  25. package/dist/identity-manager.js +196 -0
  26. package/dist/identity-manager.js.map +1 -0
  27. package/dist/index.d.ts +43 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +52 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/ipfs-bidirectional-verification.d.ts +201 -0
  32. package/dist/ipfs-bidirectional-verification.d.ts.map +1 -0
  33. package/dist/ipfs-bidirectional-verification.js +298 -0
  34. package/dist/ipfs-bidirectional-verification.js.map +1 -0
  35. package/dist/ipfs-client.d.ts +151 -0
  36. package/dist/ipfs-client.d.ts.map +1 -0
  37. package/dist/ipfs-client.js +623 -0
  38. package/dist/ipfs-client.js.map +1 -0
  39. package/dist/ipfs-node-manager.d.ts +136 -0
  40. package/dist/ipfs-node-manager.d.ts.map +1 -0
  41. package/dist/ipfs-node-manager.js +232 -0
  42. package/dist/ipfs-node-manager.js.map +1 -0
  43. package/dist/ipns-manager.d.ts +182 -0
  44. package/dist/ipns-manager.d.ts.map +1 -0
  45. package/dist/ipns-manager.js +268 -0
  46. package/dist/ipns-manager.js.map +1 -0
  47. package/dist/key-manager.d.ts +48 -0
  48. package/dist/key-manager.d.ts.map +1 -0
  49. package/dist/key-manager.js +231 -0
  50. package/dist/key-manager.js.map +1 -0
  51. package/dist/kubo-installer.d.ts +115 -0
  52. package/dist/kubo-installer.d.ts.map +1 -0
  53. package/dist/kubo-installer.js +205 -0
  54. package/dist/kubo-installer.js.map +1 -0
  55. package/dist/libp2p/encrypted-peer-id.d.ts +24 -0
  56. package/dist/libp2p/encrypted-peer-id.d.ts.map +1 -0
  57. package/dist/libp2p/encrypted-peer-id.js +134 -0
  58. package/dist/libp2p/encrypted-peer-id.js.map +1 -0
  59. package/dist/nonce-manager.d.ts +176 -0
  60. package/dist/nonce-manager.d.ts.map +1 -0
  61. package/dist/nonce-manager.js +382 -0
  62. package/dist/nonce-manager.js.map +1 -0
  63. package/dist/p2p/hyperswarm-communicator.d.ts +252 -0
  64. package/dist/p2p/hyperswarm-communicator.d.ts.map +1 -0
  65. package/dist/p2p/hyperswarm-communicator.js +469 -0
  66. package/dist/p2p/hyperswarm-communicator.js.map +1 -0
  67. package/dist/p2p/iroh-communicator.d.ts +216 -0
  68. package/dist/p2p/iroh-communicator.d.ts.map +1 -0
  69. package/dist/p2p/iroh-communicator.js +408 -0
  70. package/dist/p2p/iroh-communicator.js.map +1 -0
  71. package/dist/pubsub-authenticator.d.ts +246 -0
  72. package/dist/pubsub-authenticator.d.ts.map +1 -0
  73. package/dist/pubsub-authenticator.js +384 -0
  74. package/dist/pubsub-authenticator.js.map +1 -0
  75. package/dist/real-name-auth.d.ts +238 -0
  76. package/dist/real-name-auth.d.ts.map +1 -0
  77. package/dist/real-name-auth.js +259 -0
  78. package/dist/real-name-auth.js.map +1 -0
  79. package/dist/types/did.d.ts +76 -0
  80. package/dist/types/did.d.ts.map +1 -0
  81. package/dist/types/did.js +5 -0
  82. package/dist/types/did.js.map +1 -0
  83. package/dist/types/errors.d.ts +42 -0
  84. package/dist/types/errors.d.ts.map +1 -0
  85. package/dist/types/errors.js +69 -0
  86. package/dist/types/errors.js.map +1 -0
  87. package/dist/types/index.d.ts +9 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +9 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/types/key.d.ts +43 -0
  92. package/dist/types/key.d.ts.map +1 -0
  93. package/dist/types/key.js +5 -0
  94. package/dist/types/key.js.map +1 -0
  95. package/dist/types/zkp.d.ts +80 -0
  96. package/dist/types/zkp.d.ts.map +1 -0
  97. package/dist/types/zkp.js +16 -0
  98. package/dist/types/zkp.js.map +1 -0
  99. package/dist/utils/crypto.d.ts +24 -0
  100. package/dist/utils/crypto.d.ts.map +1 -0
  101. package/dist/utils/crypto.js +65 -0
  102. package/dist/utils/crypto.js.map +1 -0
  103. package/dist/utils/encoding.d.ts +36 -0
  104. package/dist/utils/encoding.d.ts.map +1 -0
  105. package/dist/utils/encoding.js +80 -0
  106. package/dist/utils/encoding.js.map +1 -0
  107. package/dist/utils/logger.d.ts +24 -0
  108. package/dist/utils/logger.d.ts.map +1 -0
  109. package/dist/utils/logger.js +37 -0
  110. package/dist/utils/logger.js.map +1 -0
  111. package/dist/zkp/key-generator.d.ts +56 -0
  112. package/dist/zkp/key-generator.d.ts.map +1 -0
  113. package/dist/zkp/key-generator.js +165 -0
  114. package/dist/zkp/key-generator.js.map +1 -0
  115. package/dist/zkp/simplified-backend.d.ts +23 -0
  116. package/dist/zkp/simplified-backend.d.ts.map +1 -0
  117. package/dist/zkp/simplified-backend.js +77 -0
  118. package/dist/zkp/simplified-backend.js.map +1 -0
  119. package/dist/zkp/snarkjs-backend.d.ts +150 -0
  120. package/dist/zkp/snarkjs-backend.d.ts.map +1 -0
  121. package/dist/zkp/snarkjs-backend.js +218 -0
  122. package/dist/zkp/snarkjs-backend.js.map +1 -0
  123. package/dist/zkp/universal-manager.d.ts +44 -0
  124. package/dist/zkp/universal-manager.d.ts.map +1 -0
  125. package/dist/zkp/universal-manager.js +181 -0
  126. package/dist/zkp/universal-manager.js.map +1 -0
  127. package/package.json +2 -2
@@ -0,0 +1,623 @@
1
+ /**
2
+ * IPFS 客户端模块
3
+ * 基于 Rust SDK 的 HTTP API 实现
4
+ * 使用直接 HTTP 请求与 IPFS 节点交互
5
+ */
6
+ import { IPFSError } from './types/errors.js';
7
+ import { logger } from './utils/logger.js';
8
+ /**
9
+ * IPFS 客户端
10
+ * 基于 HTTP API 的轻量级实现
11
+ */
12
+ export class IpfsClient {
13
+ apiUrl = null;
14
+ gatewayUrl = null;
15
+ pinataConfig = null;
16
+ timeout;
17
+ publicGateways;
18
+ /**
19
+ * 创建新的 IPFS 客户端
20
+ */
21
+ constructor(apiUrl, gatewayUrl, pinataApiKey, pinataApiSecret, timeoutSeconds = 30) {
22
+ this.timeout = timeoutSeconds * 1000;
23
+ if (apiUrl && gatewayUrl) {
24
+ this.apiUrl = apiUrl;
25
+ this.gatewayUrl = gatewayUrl;
26
+ }
27
+ if (pinataApiKey && pinataApiSecret) {
28
+ this.pinataConfig = {
29
+ apiKey: pinataApiKey,
30
+ apiSecret: pinataApiSecret,
31
+ };
32
+ }
33
+ this.publicGateways = [
34
+ 'https://ipfs.io',
35
+ 'https://dweb.link',
36
+ 'https://cloudflare-ipfs.com',
37
+ ];
38
+ }
39
+ /**
40
+ * 创建仅使用公共网关的客户端
41
+ */
42
+ static async newPublicOnly(timeoutSeconds = 30) {
43
+ return new IpfsClient(null, null, null, null, timeoutSeconds);
44
+ }
45
+ /**
46
+ * 创建使用远程 IPFS 节点的客户端
47
+ */
48
+ static async newWithRemoteNode(apiUrl, gatewayUrl, timeoutSeconds = 30) {
49
+ return new IpfsClient(apiUrl, gatewayUrl, null, null, timeoutSeconds);
50
+ }
51
+ /**
52
+ * 创建使用 Pinata 的客户端
53
+ */
54
+ static async newWithPinata(apiKey, apiSecret, timeoutSeconds = 30) {
55
+ return new IpfsClient(null, null, apiKey, apiSecret, timeoutSeconds);
56
+ }
57
+ /**
58
+ * 上传内容到 IPFS
59
+ */
60
+ async upload(content, name = 'data') {
61
+ if (this.apiUrl) {
62
+ return this.uploadToRemoteApi(content, name);
63
+ }
64
+ if (this.pinataConfig) {
65
+ return this.uploadToPinata(content, name);
66
+ }
67
+ throw new IPFSError('未配置任何IPFS上传方式:缺少远程API或Pinata凭据');
68
+ }
69
+ /**
70
+ * 上传到远程 IPFS API
71
+ */
72
+ async uploadToRemoteApi(content, name) {
73
+ const formData = new FormData();
74
+ const blob = new Blob([content], { type: 'application/json' });
75
+ formData.append('file', blob, name);
76
+ const url = `${this.apiUrl}/api/v0/add?pin=true`;
77
+ try {
78
+ const response = await fetch(url, {
79
+ method: 'POST',
80
+ body: formData,
81
+ headers: {
82
+ 'User-Agent': 'diap-ts-sdk/0.2',
83
+ },
84
+ });
85
+ if (!response.ok) {
86
+ const errorText = await response.text();
87
+ throw new Error(`上传失败: ${response.status} - ${errorText}`);
88
+ }
89
+ const result = await response.json();
90
+ const cid = result.Hash;
91
+ if (!cid) {
92
+ throw new Error('响应中缺少Hash字段');
93
+ }
94
+ const size = result.Size ? parseInt(result.Size, 10) : content.length;
95
+ return {
96
+ cid,
97
+ size,
98
+ uploadedAt: new Date().toISOString(),
99
+ provider: 'remote_api',
100
+ };
101
+ }
102
+ catch (error) {
103
+ throw new IPFSError(`发送上传请求失败: ${url}`, { originalError: error });
104
+ }
105
+ }
106
+ /**
107
+ * 上传到 Pinata
108
+ */
109
+ async uploadToPinata(content, name) {
110
+ const url = 'https://api.pinata.cloud/pinning/pinJSONToIPFS';
111
+ let jsonContent;
112
+ try {
113
+ jsonContent = JSON.parse(content);
114
+ }
115
+ catch {
116
+ jsonContent = { data: content };
117
+ }
118
+ const body = {
119
+ pinataContent: jsonContent,
120
+ pinataMetadata: {
121
+ name,
122
+ keyvalues: {
123
+ type: 'did-document',
124
+ uploaded_by: 'diap-ts-sdk',
125
+ },
126
+ },
127
+ };
128
+ try {
129
+ const response = await fetch(url, {
130
+ method: 'POST',
131
+ headers: {
132
+ 'Content-Type': 'application/json',
133
+ pinata_api_key: this.pinataConfig.apiKey,
134
+ pinata_secret_api_key: this.pinataConfig.apiSecret,
135
+ },
136
+ body: JSON.stringify(body),
137
+ });
138
+ if (!response.ok) {
139
+ const errorText = await response.text();
140
+ throw new Error(`Pinata返回错误 ${response.status}: ${errorText}`);
141
+ }
142
+ const pinataResponse = await response.json();
143
+ return {
144
+ cid: pinataResponse.IpfsHash,
145
+ size: pinataResponse.PinSize,
146
+ uploadedAt: new Date().toISOString(),
147
+ provider: 'Pinata',
148
+ };
149
+ }
150
+ catch (error) {
151
+ throw new IPFSError('发送请求到Pinata失败', { originalError: error });
152
+ }
153
+ }
154
+ /**
155
+ * 从 IPFS 获取内容
156
+ */
157
+ async get(cid) {
158
+ logger.info(`🔍 开始从IPFS获取内容: ${cid}`);
159
+ if (this.gatewayUrl) {
160
+ logger.info(`尝试从配置网关获取: ${this.gatewayUrl}`);
161
+ try {
162
+ const content = await this.getFromGateway(this.gatewayUrl, cid);
163
+ logger.info(`✅ 成功从配置网关获取内容: ${cid}`);
164
+ return content;
165
+ }
166
+ catch (error) {
167
+ logger.warn(`❌ 从配置网关获取失败: ${error}`);
168
+ }
169
+ }
170
+ for (const gateway of this.publicGateways) {
171
+ try {
172
+ const content = await this.getFromGateway(gateway, cid);
173
+ return content;
174
+ }
175
+ catch (error) {
176
+ logger.warn(`从${gateway}获取失败: ${error}`);
177
+ continue;
178
+ }
179
+ }
180
+ throw new IPFSError('无法从任何网关获取内容', { cid });
181
+ }
182
+ /**
183
+ * 从指定网关获取内容
184
+ */
185
+ async getFromGateway(gatewayUrl, cid) {
186
+ const url = `${gatewayUrl}/ipfs/${cid}`;
187
+ const controller = new AbortController();
188
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
189
+ try {
190
+ const response = await fetch(url, {
191
+ signal: controller.signal,
192
+ headers: {
193
+ 'User-Agent': 'diap-ts-sdk/0.2',
194
+ },
195
+ });
196
+ clearTimeout(timeoutId);
197
+ if (!response.ok) {
198
+ throw new Error(`网关返回错误: ${response.status}`);
199
+ }
200
+ return await response.text();
201
+ }
202
+ catch (error) {
203
+ clearTimeout(timeoutId);
204
+ throw new IPFSError('发送请求失败', { originalError: error });
205
+ }
206
+ }
207
+ /**
208
+ * Pin 内容到远程 IPFS 节点
209
+ */
210
+ async pin(cid) {
211
+ if (!this.apiUrl) {
212
+ logger.warn('未配置远程IPFS节点,跳过pin操作');
213
+ return;
214
+ }
215
+ const url = `${this.apiUrl}/api/v0/pin/add?arg=${cid}`;
216
+ try {
217
+ const response = await fetch(url, {
218
+ method: 'POST',
219
+ headers: {
220
+ 'User-Agent': 'diap-ts-sdk/0.2',
221
+ },
222
+ });
223
+ if (!response.ok) {
224
+ throw new Error(`Pin失败: ${response.status}`);
225
+ }
226
+ logger.info(`成功pin内容: ${cid}`);
227
+ }
228
+ catch (error) {
229
+ throw new IPFSError('发送pin请求失败', { originalError: error, cid });
230
+ }
231
+ }
232
+ /**
233
+ * 确保 IPNS 密钥存在
234
+ */
235
+ async ensureKeyExists(keyName) {
236
+ if (!this.apiUrl) {
237
+ throw new IPFSError('未配置远程IPFS API,无法进行IPNS key管理');
238
+ }
239
+ const urlList = `${this.apiUrl}/api/v0/key/list`;
240
+ try {
241
+ const resp = await fetch(urlList, {
242
+ method: 'POST',
243
+ headers: {
244
+ 'User-Agent': 'diap-ts-sdk/0.2',
245
+ },
246
+ });
247
+ if (!resp.ok) {
248
+ throw new Error(`key/list失败: ${resp.status}`);
249
+ }
250
+ const v = await resp.json();
251
+ const keys = v.Keys || [];
252
+ const exists = keys.some((k) => k.Name === keyName);
253
+ if (exists) {
254
+ return keyName;
255
+ }
256
+ }
257
+ catch (error) {
258
+ throw new IPFSError('请求key/list失败', { originalError: error });
259
+ }
260
+ const urlGen = `${this.apiUrl}/api/v0/key/gen?arg=${encodeURIComponent(keyName)}&type=ed25519`;
261
+ try {
262
+ const respGen = await fetch(urlGen, {
263
+ method: 'POST',
264
+ headers: {
265
+ 'User-Agent': 'diap-ts-sdk/0.2',
266
+ },
267
+ });
268
+ if (!respGen.ok) {
269
+ const text = await respGen.text();
270
+ throw new Error(`key/gen失败: ${respGen.status} - ${text}`);
271
+ }
272
+ }
273
+ catch (error) {
274
+ throw new IPFSError('请求key/gen失败', { originalError: error });
275
+ }
276
+ return keyName;
277
+ }
278
+ /**
279
+ * 发布 IPNS 记录
280
+ */
281
+ async publishIpns(cid, keyName, lifetime = '8760h', ttl = '1h') {
282
+ if (!this.apiUrl) {
283
+ throw new IPFSError('未配置远程IPFS API,无法进行IPNS发布');
284
+ }
285
+ const argPath = `/ipfs/${cid}`;
286
+ const url = `${this.apiUrl}/api/v0/name/publish?arg=${encodeURIComponent(argPath)}&key=${encodeURIComponent(keyName)}&allow-offline=true&resolve=true&lifetime=${encodeURIComponent(lifetime)}&ttl=${encodeURIComponent(ttl)}`;
287
+ try {
288
+ const resp = await fetch(url, {
289
+ method: 'POST',
290
+ headers: {
291
+ 'User-Agent': 'diap-ts-sdk/0.2',
292
+ },
293
+ });
294
+ if (!resp.ok) {
295
+ const text = await resp.text();
296
+ throw new Error(`IPNS发布失败: ${resp.status} - ${text}`);
297
+ }
298
+ const v = await resp.json();
299
+ const name = v.Name || '';
300
+ const value = v.Value || '';
301
+ return {
302
+ name,
303
+ value,
304
+ publishedAt: new Date().toISOString(),
305
+ };
306
+ }
307
+ catch (error) {
308
+ throw new IPFSError('发送IPNS发布请求失败', { originalError: error, cid, keyName });
309
+ }
310
+ }
311
+ /**
312
+ * 便捷:上传后发布到 IPNS
313
+ */
314
+ async publishAfterUpload(cid, keyName, lifetime = '8760h', ttl = '1h') {
315
+ await this.ensureKeyExists(keyName);
316
+ return this.publishIpns(cid, keyName, lifetime, ttl);
317
+ }
318
+ /**
319
+ * 发布 IPNS 并同时 Pin 到多节点(确保内容可用性)
320
+ */
321
+ async publishAndPin(cid, keyName, lifetime = '8760h', ttl = '1h', pinNodes = []) {
322
+ logger.info(`📌 发布 IPNS 并 Pin 到 ${pinNodes.length} 个节点...`);
323
+ const ipnsResult = await this.publishAfterUploadDirect(cid, keyName, lifetime, ttl);
324
+ if (pinNodes.length > 0) {
325
+ const pinPromises = pinNodes.map(async (nodeUrl) => {
326
+ try {
327
+ const url = `${nodeUrl}/api/v0/pin/add?arg=${cid}`;
328
+ const resp = await fetch(url, {
329
+ method: 'POST',
330
+ headers: {
331
+ 'User-Agent': 'diap-ts-sdk/0.2',
332
+ },
333
+ });
334
+ if (resp.ok) {
335
+ logger.info(`✅ 已 Pin 到节点:${nodeUrl}`);
336
+ }
337
+ else {
338
+ logger.warn(`⚠️ 节点 ${nodeUrl} Pin 失败:${resp.status}`);
339
+ }
340
+ }
341
+ catch (error) {
342
+ logger.warn(`⚠️ 节点 ${nodeUrl} Pin 失败:${error}`);
343
+ }
344
+ });
345
+ await Promise.allSettled(pinPromises);
346
+ }
347
+ return ipnsResult;
348
+ }
349
+ /**
350
+ * 上传后直接发布到 IPNS DHT(allow-offline=false)
351
+ */
352
+ async publishAfterUploadDirect(cid, keyName, lifetime = '8760h', ttl = '1h') {
353
+ if (!this.apiUrl) {
354
+ throw new IPFSError('未配置远程IPFS API,无法进行IPNS发布');
355
+ }
356
+ await this.ensureKeyExists(keyName);
357
+ const argPath = `/ipfs/${cid}`;
358
+ const url = `${this.apiUrl}/api/v0/name/publish?arg=${encodeURIComponent(argPath)}&key=${encodeURIComponent(keyName)}&allow-offline=false&resolve=true&lifetime=${encodeURIComponent(lifetime)}&ttl=${encodeURIComponent(ttl)}`;
359
+ logger.info('📡 发布IPNS记录到DHT(allow-offline=false)...');
360
+ logger.info(' 要求: 节点必须在线并连接到DHT网络');
361
+ try {
362
+ const resp = await fetch(url, {
363
+ method: 'POST',
364
+ headers: {
365
+ 'User-Agent': 'diap-ts-sdk/0.2',
366
+ },
367
+ });
368
+ if (!resp.ok) {
369
+ const text = await resp.text();
370
+ if (text.includes('not connected to network') || text.includes('offline')) {
371
+ throw new IPFSError(`IPNS 发布失败: 节点未连接到DHT网络。\n提示: 1) 确保IPFS守护进程正在运行\n2) 检查节点是否可被其他节点访问\n3) 等待节点连接到足够的对等节点\n原始错误: ${resp.status} - ${text}`, { cid, keyName });
372
+ }
373
+ throw new Error(`IPNS 发布失败: ${resp.status} - ${text}`);
374
+ }
375
+ const v = await resp.json();
376
+ const name = v.Name || '';
377
+ const value = v.Value || '';
378
+ logger.info(`✅ IPNS记录已发布到DHT: /ipns/${name}`);
379
+ logger.info(' 记录将在DHT网络中传播,全球可访问');
380
+ return {
381
+ name,
382
+ value,
383
+ publishedAt: new Date().toISOString(),
384
+ };
385
+ }
386
+ catch (error) {
387
+ throw new IPFSError('发送 IPNS 发布请求失败', { originalError: error, cid, keyName });
388
+ }
389
+ }
390
+ /**
391
+ * 并行发布到多个 IPFS 节点(加速传播)
392
+ */
393
+ async publishToMultipleNodes(cid, keyName, nodes, lifetime = '8760h', ttl = '1h') {
394
+ logger.info(`🚀 并行发布到 ${nodes.length} 个节点...`);
395
+ const results = [];
396
+ const failures = [];
397
+ const publishPromises = nodes.map(async (nodeUrl) => {
398
+ try {
399
+ const argPath = `/ipfs/${cid}`;
400
+ const url = `${nodeUrl}/api/v0/name/publish?arg=${encodeURIComponent(argPath)}&key=${encodeURIComponent(keyName)}&allow-offline=false&resolve=true&lifetime=${encodeURIComponent(lifetime)}&ttl=${encodeURIComponent(ttl)}`;
401
+ const resp = await fetch(url, {
402
+ method: 'POST',
403
+ headers: {
404
+ 'User-Agent': 'diap-ts-sdk/0.2',
405
+ },
406
+ });
407
+ if (!resp.ok) {
408
+ const text = await resp.text();
409
+ throw new Error(`节点 ${nodeUrl} IPNS 发布失败:${resp.status} - ${text}`);
410
+ }
411
+ const v = await resp.json();
412
+ const name = v.Name || '';
413
+ const value = v.Value || '';
414
+ return {
415
+ name,
416
+ value,
417
+ publishedAt: new Date().toISOString(),
418
+ };
419
+ }
420
+ catch (error) {
421
+ throw { nodeUrl, error };
422
+ }
423
+ });
424
+ const settled = await Promise.allSettled(publishPromises);
425
+ for (const result of settled) {
426
+ if (result.status === 'fulfilled') {
427
+ results.push(result.value);
428
+ }
429
+ else {
430
+ const { nodeUrl, error } = result.reason;
431
+ logger.warn(`⚠️ 节点 ${nodeUrl} 发布失败: ${error}`);
432
+ failures.push({ node: nodeUrl, error });
433
+ }
434
+ }
435
+ if (failures.length > 0) {
436
+ logger.warn(`⚠️ ${failures.length}/${nodes.length} 节点发布失败`);
437
+ }
438
+ logger.info(`✅ ${results.length}/${nodes.length} 节点发布成功`);
439
+ return results;
440
+ }
441
+ /**
442
+ * 批量发布到多个 IPNS key(适用于多身份场景)
443
+ */
444
+ async batchPublishIpns(cid, keys, lifetime = '8760h') {
445
+ if (!this.apiUrl) {
446
+ throw new IPFSError('未配置远程 IPFS API');
447
+ }
448
+ logger.info(`🔑 批量发布到 ${keys.length} 个 IPNS key...`);
449
+ const results = [];
450
+ const publishPromises = keys.map(async (keyName) => {
451
+ const argPath = `/ipfs/${cid}`;
452
+ const url = `${this.apiUrl}/api/v0/name/publish?arg=${encodeURIComponent(argPath)}&key=${encodeURIComponent(keyName)}&allow-offline=false&resolve=true&lifetime=${encodeURIComponent(lifetime)}&ttl=1h`;
453
+ const resp = await fetch(url, {
454
+ method: 'POST',
455
+ headers: {
456
+ 'User-Agent': 'diap-ts-sdk/0.2',
457
+ },
458
+ });
459
+ if (!resp.ok) {
460
+ const text = await resp.text();
461
+ throw new Error(`Key ${keyName} IPNS 发布失败:${resp.status} - ${text}`);
462
+ }
463
+ const v = await resp.json();
464
+ return {
465
+ name: v.Name || '',
466
+ value: v.Value || '',
467
+ publishedAt: new Date().toISOString(),
468
+ };
469
+ });
470
+ const settled = await Promise.allSettled(publishPromises);
471
+ for (const result of settled) {
472
+ if (result.status === 'fulfilled') {
473
+ results.push(result.value);
474
+ }
475
+ }
476
+ logger.info(`✅ ${results.length}/${keys.length} key 发布成功`);
477
+ return results;
478
+ }
479
+ /**
480
+ * 广播 IPNS 记录到 DHT(加速传播)
481
+ */
482
+ async broadcastToDht(ipnsName) {
483
+ if (!this.apiUrl) {
484
+ throw new IPFSError('未配置远程 IPFS API');
485
+ }
486
+ const name = ipnsName.startsWith('/ipns/') ? ipnsName : `/ipns/${ipnsName}`;
487
+ const url = `${this.apiUrl}/api/v0/name/pubsub/pub?arg=${encodeURIComponent(name)}`;
488
+ logger.info(`📡 广播 IPNS 记录 ${ipnsName} 到 DHT...`);
489
+ try {
490
+ const resp = await fetch(url, {
491
+ method: 'POST',
492
+ headers: {
493
+ 'User-Agent': 'diap-ts-sdk/0.2',
494
+ },
495
+ });
496
+ if (resp.ok) {
497
+ logger.info('✅ IPNS 记录已广播到 DHT');
498
+ }
499
+ else {
500
+ const text = await resp.text();
501
+ logger.warn(`⚠️ DHT 广播失败:${resp.status} - ${text}`);
502
+ }
503
+ }
504
+ catch (error) {
505
+ logger.warn(`⚠️ DHT 广播失败:${error}`);
506
+ }
507
+ }
508
+ /**
509
+ * 预传播 CID 到多个节点(加速首次访问)
510
+ */
511
+ async prepropagateCid(cid, bootstrapNodes = []) {
512
+ logger.info(`📢 预传播 CID ${cid} 到 ${bootstrapNodes.length} 个节点...`);
513
+ const propagatePromises = bootstrapNodes.map(async (nodeUrl) => {
514
+ try {
515
+ const url = `${nodeUrl}/api/v0/pin/add?arg=${cid}&progress=false`;
516
+ const resp = await fetch(url, {
517
+ method: 'POST',
518
+ headers: {
519
+ 'User-Agent': 'diap-ts-sdk/0.2',
520
+ },
521
+ });
522
+ if (resp.ok) {
523
+ logger.debug(`✅ 节点 ${nodeUrl} 已缓存 CID ${cid}`);
524
+ }
525
+ else {
526
+ logger.warn(`⚠️ 节点 ${nodeUrl} 缓存失败:${resp.status}`);
527
+ }
528
+ }
529
+ catch (error) {
530
+ logger.warn(`⚠️ 节点 ${nodeUrl} 缓存失败:${error}`);
531
+ }
532
+ });
533
+ await Promise.allSettled(propagatePromises);
534
+ logger.info('✅ CID 预传播完成');
535
+ }
536
+ /**
537
+ * 解析 IPNS 名称为 CID
538
+ */
539
+ async resolveIpns(ipnsName) {
540
+ // 规范化名称
541
+ const name = ipnsName.startsWith('/ipns/') ? ipnsName.slice(6) : ipnsName;
542
+ // 优先使用远程 API
543
+ if (this.apiUrl) {
544
+ const url = `${this.apiUrl}/api/v0/name/resolve?arg=${encodeURIComponent(`/ipns/${name}`)}&recursive=true&nocache=true`;
545
+ try {
546
+ const resp = await fetch(url, {
547
+ method: 'POST',
548
+ headers: {
549
+ 'User-Agent': 'diap-ts-sdk/0.2',
550
+ },
551
+ });
552
+ if (!resp.ok) {
553
+ const text = await resp.text();
554
+ throw new IPFSError(`IPNS 解析失败: ${resp.status} - ${text}`, { ipnsName: name });
555
+ }
556
+ const v = await resp.json();
557
+ const path = v.Path;
558
+ if (!path) {
559
+ throw new IPFSError('IPNS 解析响应缺少 Path 字段', { ipnsName: name });
560
+ }
561
+ // 提取 CID
562
+ const cid = path.startsWith('/ipfs/') ? path.slice(6) : path;
563
+ return cid;
564
+ }
565
+ catch (error) {
566
+ throw new IPFSError('发送 IPNS 解析请求失败', { originalError: error, ipnsName: name });
567
+ }
568
+ }
569
+ // 未配置 API:尝试通过公共网关
570
+ for (const gateway of this.publicGateways) {
571
+ try {
572
+ const url = `${gateway}/ipns/${name}`;
573
+ // 使用不跟随重定向的 HEAD 请求
574
+ const controller = new AbortController();
575
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
576
+ const resp = await fetch(url, {
577
+ method: 'HEAD',
578
+ redirect: 'manual',
579
+ signal: controller.signal,
580
+ });
581
+ clearTimeout(timeoutId);
582
+ if (resp.status >= 300 && resp.status < 400) {
583
+ const location = resp.headers.get('Location');
584
+ if (location) {
585
+ if (location.startsWith('/ipfs/')) {
586
+ return location.slice(7).split('/')[0];
587
+ }
588
+ if (location.includes('/ipfs/')) {
589
+ const idx = location.indexOf('/ipfs/');
590
+ const cidPart = location.slice(idx + 7);
591
+ return cidPart.split(/[/?#]/)[0];
592
+ }
593
+ }
594
+ }
595
+ }
596
+ catch (error) {
597
+ logger.warn(`通过网关解析 IPNS 失败 (${gateway}): ${error}`);
598
+ continue;
599
+ }
600
+ }
601
+ throw new IPFSError('未配置远程 IPFS API,且无法通过任何网关解析 IPNS 名称', { ipnsName: name });
602
+ }
603
+ /**
604
+ * 获取 API URL
605
+ */
606
+ getApiUrl() {
607
+ return this.apiUrl;
608
+ }
609
+ /**
610
+ * 获取网关 URL
611
+ */
612
+ getGatewayUrl() {
613
+ return this.gatewayUrl;
614
+ }
615
+ /**
616
+ * 停止客户端
617
+ */
618
+ async stop() {
619
+ // HTTP 客户端不需要停止操作
620
+ logger.debug('IPFS client stopped');
621
+ }
622
+ }
623
+ //# sourceMappingURL=ipfs-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipfs-client.js","sourceRoot":"","sources":["../src/ipfs-client.ts"],"names":[],"mappings":"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"}