@claude-flow/cli 3.0.0-alpha.170 → 3.0.0-alpha.171
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
CHANGED
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
[](https://opensource.org/licenses/MIT)
|
|
17
17
|
[](https://www.npmjs.com/package/ruvector)
|
|
18
18
|
[](https://www.npmjs.com/package/agentic-flow)
|
|
19
|
+
[](https://www.reddit.com/r/aipromptprogramming/)
|
|
20
|
+
[](https://x.com/ruv)
|
|
21
|
+
[](https://www.linkedin.com/in/reuvencohen/)
|
|
22
|
+
[](https://www.youtube.com/@ReuvenCohen)
|
|
23
|
+
[](https://crates.io/users/ruvnet)
|
|
19
24
|
|
|
20
25
|
**Production-ready multi-agent AI orchestration for Claude Code**
|
|
21
26
|
|
|
@@ -148,8 +153,8 @@ npx claude-flow@v3alpha hooks intelligence --status
|
|
|
148
153
|
|
|
149
154
|
### Get Started Fast
|
|
150
155
|
|
|
151
|
-
```
|
|
152
|
-
npx claude-flow@
|
|
156
|
+
```
|
|
157
|
+
npx claude-flow@latest init
|
|
153
158
|
```
|
|
154
159
|
|
|
155
160
|
---
|
|
@@ -453,20 +458,20 @@ Add claude-flow as an MCP server for seamless integration:
|
|
|
453
458
|
|
|
454
459
|
```bash
|
|
455
460
|
# Add claude-flow MCP server to Claude Code
|
|
456
|
-
claude mcp add claude-flow -- npx -y claude-flow@
|
|
461
|
+
claude mcp add claude-flow -- npx -y claude-flow@latest mcp start
|
|
457
462
|
|
|
458
463
|
# Verify installation
|
|
459
464
|
claude mcp list
|
|
460
465
|
```
|
|
461
466
|
|
|
462
|
-
Once added, Claude Code can use all 175+ claude-flow tools directly:
|
|
467
|
+
Once added, Claude Code can use all 175+ claude-flow MCP tools directly:
|
|
463
468
|
- `swarm_init` - Initialize agent swarms
|
|
464
469
|
- `agent_spawn` - Spawn specialized agents
|
|
465
470
|
- `memory_search` - Search patterns with HNSW (150x faster)
|
|
466
471
|
- `hooks_route` - Intelligent task routing
|
|
467
472
|
- And 170+ more tools...
|
|
468
473
|
|
|
469
|
-
|
|
474
|
+
<details>
|
|
470
475
|
<summary>🆚 <strong>Why Claude-Flow v3?</strong></summary>
|
|
471
476
|
|
|
472
477
|
Claude-Flow v3 introduces **self-learning neural capabilities** that no other agent orchestration framework offers. While competitors require manual agent configuration and static routing, Claude-Flow learns from every task execution, prevents catastrophic forgetting of successful patterns, and intelligently routes work to specialized experts.
|
|
@@ -525,6 +530,8 @@ Claude-Flow v3 introduces **self-learning neural capabilities** that no other ag
|
|
|
525
530
|
|
|
526
531
|
<sub>*Comparison updated January 23, 2026*</sub>
|
|
527
532
|
|
|
533
|
+
</details>
|
|
534
|
+
|
|
528
535
|
<details>
|
|
529
536
|
<summary>🚀 <strong>Key Differentiators</strong> — Self-learning, memory optimization, fault tolerance</summary>
|
|
530
537
|
|
|
@@ -1,31 +1,109 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* IPFS Client Module
|
|
3
3
|
* Low-level IPFS operations for discovery and fetching
|
|
4
|
+
*
|
|
5
|
+
* Supports multiple gateways with automatic fallback:
|
|
6
|
+
* - Pinata (recommended for pinned content)
|
|
7
|
+
* - Cloudflare IPFS
|
|
8
|
+
* - Protocol Labs ipfs.io
|
|
9
|
+
* - dweb.link (LibP2P)
|
|
4
10
|
*/
|
|
5
11
|
/**
|
|
6
|
-
*
|
|
7
|
-
* In production: Use ipfs-http-client or similar
|
|
12
|
+
* Available IPFS gateways in priority order
|
|
8
13
|
*/
|
|
9
|
-
export declare
|
|
14
|
+
export declare const IPFS_GATEWAYS: string[];
|
|
10
15
|
/**
|
|
11
|
-
*
|
|
12
|
-
* In production: Use ipfs-http-client or gateway fetch
|
|
16
|
+
* IPNS resolvers
|
|
13
17
|
*/
|
|
14
|
-
export declare
|
|
18
|
+
export declare const IPNS_RESOLVERS: string[];
|
|
15
19
|
/**
|
|
16
|
-
*
|
|
20
|
+
* Gateway configuration
|
|
21
|
+
*/
|
|
22
|
+
export interface GatewayConfig {
|
|
23
|
+
url: string;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
headers?: Record<string, string>;
|
|
26
|
+
priority?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Fetch result with metadata
|
|
30
|
+
*/
|
|
31
|
+
export interface FetchResult<T> {
|
|
32
|
+
data: T;
|
|
33
|
+
gateway: string;
|
|
34
|
+
cid: string;
|
|
35
|
+
cached: boolean;
|
|
36
|
+
latencyMs: number;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resolve IPNS name to CID with fallback across multiple gateways
|
|
40
|
+
*
|
|
41
|
+
* @param ipnsName - IPNS key or DNSLink domain
|
|
42
|
+
* @param preferredGateway - Optional preferred gateway to try first
|
|
43
|
+
* @returns CID string or null if resolution fails
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveIPNS(ipnsName: string, preferredGateway?: string): Promise<string | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Fetch content from IPFS by CID with fallback across multiple gateways
|
|
48
|
+
*
|
|
49
|
+
* @param cid - Content Identifier
|
|
50
|
+
* @param preferredGateway - Optional preferred gateway to try first
|
|
51
|
+
* @returns Parsed JSON content or null if fetch fails
|
|
52
|
+
*/
|
|
53
|
+
export declare function fetchFromIPFS<T>(cid: string, preferredGateway?: string): Promise<T | null>;
|
|
54
|
+
/**
|
|
55
|
+
* Fetch with full result metadata
|
|
56
|
+
*/
|
|
57
|
+
export declare function fetchFromIPFSWithMetadata<T>(cid: string, preferredGateway?: string): Promise<FetchResult<T> | null>;
|
|
58
|
+
/**
|
|
59
|
+
* Check if CID is pinned/available on a gateway
|
|
17
60
|
*/
|
|
18
61
|
export declare function isPinned(cid: string, gateway?: string): Promise<boolean>;
|
|
62
|
+
/**
|
|
63
|
+
* Check availability across multiple gateways
|
|
64
|
+
*/
|
|
65
|
+
export declare function checkAvailability(cid: string): Promise<{
|
|
66
|
+
available: boolean;
|
|
67
|
+
gateways: Array<{
|
|
68
|
+
url: string;
|
|
69
|
+
available: boolean;
|
|
70
|
+
latencyMs: number;
|
|
71
|
+
}>;
|
|
72
|
+
}>;
|
|
19
73
|
/**
|
|
20
74
|
* Get IPFS gateway URL for a CID
|
|
21
75
|
*/
|
|
22
76
|
export declare function getGatewayUrl(cid: string, gateway?: string): string;
|
|
23
77
|
/**
|
|
24
|
-
*
|
|
78
|
+
* Get multiple gateway URLs for redundancy
|
|
79
|
+
*/
|
|
80
|
+
export declare function getGatewayUrls(cid: string): string[];
|
|
81
|
+
/**
|
|
82
|
+
* Validate CID format (CIDv0 and CIDv1)
|
|
25
83
|
*/
|
|
26
84
|
export declare function isValidCID(cid: string): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Validate IPNS name format
|
|
87
|
+
*/
|
|
88
|
+
export declare function isValidIPNS(ipnsName: string): boolean;
|
|
27
89
|
/**
|
|
28
90
|
* Generate content hash for verification
|
|
29
91
|
*/
|
|
30
|
-
export declare function hashContent(content: Buffer): string;
|
|
92
|
+
export declare function hashContent(content: Buffer | string): string;
|
|
93
|
+
/**
|
|
94
|
+
* Verify Ed25519 signature (async import to avoid bundling issues)
|
|
95
|
+
*/
|
|
96
|
+
export declare function verifyEd25519Signature(message: string, signature: string, publicKey: string): Promise<boolean>;
|
|
97
|
+
/**
|
|
98
|
+
* Parse CID to extract metadata
|
|
99
|
+
*/
|
|
100
|
+
export declare function parseCID(cid: string): {
|
|
101
|
+
version: 0 | 1;
|
|
102
|
+
codec: string;
|
|
103
|
+
hash: string;
|
|
104
|
+
} | null;
|
|
105
|
+
/**
|
|
106
|
+
* Format bytes to human readable
|
|
107
|
+
*/
|
|
108
|
+
export declare function formatBytes(bytes: number): string;
|
|
31
109
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;GAEG;AACH,eAAO,MAAM,aAAa,UAMzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,UAI1B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC;IACR,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2DxB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CA0CnB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAC/C,GAAG,EAAE,MAAM,EACX,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAqChC;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAA0B,GAClC,OAAO,CAAC,OAAO,CAAC,CAUlB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5D,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE,CAAC,CA4BD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAA0B,GAAG,MAAM,CAEtF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAEpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAI/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAG5D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IACrC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAmBP;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMjD"}
|
|
@@ -1,55 +1,217 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* IPFS Client Module
|
|
3
3
|
* Low-level IPFS operations for discovery and fetching
|
|
4
|
+
*
|
|
5
|
+
* Supports multiple gateways with automatic fallback:
|
|
6
|
+
* - Pinata (recommended for pinned content)
|
|
7
|
+
* - Cloudflare IPFS
|
|
8
|
+
* - Protocol Labs ipfs.io
|
|
9
|
+
* - dweb.link (LibP2P)
|
|
4
10
|
*/
|
|
5
11
|
import * as crypto from 'crypto';
|
|
6
12
|
/**
|
|
7
|
-
*
|
|
8
|
-
* In production: Use ipfs-http-client or similar
|
|
13
|
+
* Available IPFS gateways in priority order
|
|
9
14
|
*/
|
|
10
|
-
export
|
|
15
|
+
export const IPFS_GATEWAYS = [
|
|
16
|
+
'https://gateway.pinata.cloud',
|
|
17
|
+
'https://cloudflare-ipfs.com',
|
|
18
|
+
'https://ipfs.io',
|
|
19
|
+
'https://dweb.link',
|
|
20
|
+
'https://w3s.link', // web3.storage gateway
|
|
21
|
+
];
|
|
22
|
+
/**
|
|
23
|
+
* IPNS resolvers
|
|
24
|
+
*/
|
|
25
|
+
export const IPNS_RESOLVERS = [
|
|
26
|
+
'https://gateway.pinata.cloud',
|
|
27
|
+
'https://dweb.link',
|
|
28
|
+
'https://ipfs.io',
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Resolve IPNS name to CID with fallback across multiple gateways
|
|
32
|
+
*
|
|
33
|
+
* @param ipnsName - IPNS key or DNSLink domain
|
|
34
|
+
* @param preferredGateway - Optional preferred gateway to try first
|
|
35
|
+
* @returns CID string or null if resolution fails
|
|
36
|
+
*/
|
|
37
|
+
export async function resolveIPNS(ipnsName, preferredGateway) {
|
|
38
|
+
const resolvers = preferredGateway
|
|
39
|
+
? [preferredGateway, ...IPNS_RESOLVERS.filter(r => r !== preferredGateway)]
|
|
40
|
+
: IPNS_RESOLVERS;
|
|
11
41
|
console.log(`[IPFS] Resolving IPNS: ${ipnsName}`);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
42
|
+
for (const gateway of resolvers) {
|
|
43
|
+
try {
|
|
44
|
+
const startTime = Date.now();
|
|
45
|
+
let cid = null;
|
|
46
|
+
// Method 1: DNSLink resolution for domain names
|
|
47
|
+
if (ipnsName.includes('.')) {
|
|
48
|
+
const response = await fetch(`${gateway}/api/v0/name/resolve?arg=/ipns/${ipnsName}`, {
|
|
49
|
+
signal: AbortSignal.timeout(10000),
|
|
50
|
+
headers: { 'Accept': 'application/json' },
|
|
51
|
+
});
|
|
52
|
+
if (response.ok) {
|
|
53
|
+
const data = await response.json();
|
|
54
|
+
cid = data.Path?.replace('/ipfs/', '') || null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Method 2: Direct IPNS key resolution via gateway redirect
|
|
58
|
+
if (!cid) {
|
|
59
|
+
const response = await fetch(`${gateway}/ipns/${ipnsName}`, {
|
|
60
|
+
method: 'HEAD',
|
|
61
|
+
signal: AbortSignal.timeout(10000),
|
|
62
|
+
redirect: 'follow',
|
|
63
|
+
});
|
|
64
|
+
if (response.ok) {
|
|
65
|
+
// Extract CID from the final URL after redirects
|
|
66
|
+
const finalUrl = response.url;
|
|
67
|
+
const cidMatch = finalUrl.match(/\/ipfs\/([a-zA-Z0-9]+)/);
|
|
68
|
+
if (cidMatch) {
|
|
69
|
+
cid = cidMatch[1];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (cid) {
|
|
74
|
+
const latency = Date.now() - startTime;
|
|
75
|
+
console.log(`[IPFS] Resolved ${ipnsName} -> ${cid} via ${gateway} (${latency}ms)`);
|
|
76
|
+
return cid;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
81
|
+
console.warn(`[IPFS] Gateway ${gateway} failed: ${errorMsg}`);
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
24
84
|
}
|
|
85
|
+
console.warn(`[IPFS] IPNS resolution failed for ${ipnsName} on all gateways`);
|
|
86
|
+
return null;
|
|
25
87
|
}
|
|
26
88
|
/**
|
|
27
|
-
* Fetch content from IPFS by CID
|
|
28
|
-
*
|
|
89
|
+
* Fetch content from IPFS by CID with fallback across multiple gateways
|
|
90
|
+
*
|
|
91
|
+
* @param cid - Content Identifier
|
|
92
|
+
* @param preferredGateway - Optional preferred gateway to try first
|
|
93
|
+
* @returns Parsed JSON content or null if fetch fails
|
|
29
94
|
*/
|
|
30
|
-
export async function fetchFromIPFS(cid,
|
|
95
|
+
export async function fetchFromIPFS(cid, preferredGateway) {
|
|
96
|
+
const gateways = preferredGateway
|
|
97
|
+
? [preferredGateway, ...IPFS_GATEWAYS.filter(g => g !== preferredGateway)]
|
|
98
|
+
: IPFS_GATEWAYS;
|
|
31
99
|
console.log(`[IPFS] Fetching CID: ${cid}`);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
100
|
+
for (const gateway of gateways) {
|
|
101
|
+
try {
|
|
102
|
+
const startTime = Date.now();
|
|
103
|
+
const url = `${gateway}/ipfs/${cid}`;
|
|
104
|
+
const response = await fetch(url, {
|
|
105
|
+
signal: AbortSignal.timeout(30000),
|
|
106
|
+
headers: {
|
|
107
|
+
'Accept': 'application/json',
|
|
108
|
+
'Cache-Control': 'max-age=3600',
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
if (response.ok) {
|
|
112
|
+
const data = await response.json();
|
|
113
|
+
const latency = Date.now() - startTime;
|
|
114
|
+
console.log(`[IPFS] Fetched ${cid} from ${gateway} (${latency}ms)`);
|
|
115
|
+
return data;
|
|
116
|
+
}
|
|
117
|
+
// Handle specific error codes
|
|
118
|
+
if (response.status === 504) {
|
|
119
|
+
console.warn(`[IPFS] Gateway timeout on ${gateway}, trying next...`);
|
|
120
|
+
}
|
|
121
|
+
else if (response.status === 429) {
|
|
122
|
+
console.warn(`[IPFS] Rate limited on ${gateway}, trying next...`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
127
|
+
console.warn(`[IPFS] Gateway ${gateway} failed: ${errorMsg}`);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
41
130
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
131
|
+
console.warn(`[IPFS] Fetch failed for ${cid} on all gateways`);
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Fetch with full result metadata
|
|
136
|
+
*/
|
|
137
|
+
export async function fetchFromIPFSWithMetadata(cid, preferredGateway) {
|
|
138
|
+
const gateways = preferredGateway
|
|
139
|
+
? [preferredGateway, ...IPFS_GATEWAYS.filter(g => g !== preferredGateway)]
|
|
140
|
+
: IPFS_GATEWAYS;
|
|
141
|
+
for (const gateway of gateways) {
|
|
142
|
+
try {
|
|
143
|
+
const startTime = Date.now();
|
|
144
|
+
const url = `${gateway}/ipfs/${cid}`;
|
|
145
|
+
const response = await fetch(url, {
|
|
146
|
+
signal: AbortSignal.timeout(30000),
|
|
147
|
+
headers: {
|
|
148
|
+
'Accept': 'application/json',
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
if (response.ok) {
|
|
152
|
+
const data = await response.json();
|
|
153
|
+
const latencyMs = Date.now() - startTime;
|
|
154
|
+
const cached = response.headers.get('X-Cache')?.includes('HIT') ||
|
|
155
|
+
response.headers.get('CF-Cache-Status') === 'HIT';
|
|
156
|
+
return {
|
|
157
|
+
data,
|
|
158
|
+
gateway,
|
|
159
|
+
cid,
|
|
160
|
+
cached,
|
|
161
|
+
latencyMs,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
45
168
|
}
|
|
169
|
+
return null;
|
|
46
170
|
}
|
|
47
171
|
/**
|
|
48
|
-
* Check if CID is pinned
|
|
172
|
+
* Check if CID is pinned/available on a gateway
|
|
49
173
|
*/
|
|
50
174
|
export async function isPinned(cid, gateway = 'https://ipfs.io') {
|
|
51
|
-
|
|
52
|
-
|
|
175
|
+
try {
|
|
176
|
+
const response = await fetch(`${gateway}/ipfs/${cid}`, {
|
|
177
|
+
method: 'HEAD',
|
|
178
|
+
signal: AbortSignal.timeout(5000),
|
|
179
|
+
});
|
|
180
|
+
return response.ok;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Check availability across multiple gateways
|
|
188
|
+
*/
|
|
189
|
+
export async function checkAvailability(cid) {
|
|
190
|
+
const results = await Promise.all(IPFS_GATEWAYS.map(async (gateway) => {
|
|
191
|
+
const startTime = Date.now();
|
|
192
|
+
try {
|
|
193
|
+
const response = await fetch(`${gateway}/ipfs/${cid}`, {
|
|
194
|
+
method: 'HEAD',
|
|
195
|
+
signal: AbortSignal.timeout(5000),
|
|
196
|
+
});
|
|
197
|
+
return {
|
|
198
|
+
url: gateway,
|
|
199
|
+
available: response.ok,
|
|
200
|
+
latencyMs: Date.now() - startTime,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return {
|
|
205
|
+
url: gateway,
|
|
206
|
+
available: false,
|
|
207
|
+
latencyMs: Date.now() - startTime,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}));
|
|
211
|
+
return {
|
|
212
|
+
available: results.some(r => r.available),
|
|
213
|
+
gateways: results,
|
|
214
|
+
};
|
|
53
215
|
}
|
|
54
216
|
/**
|
|
55
217
|
* Get IPFS gateway URL for a CID
|
|
@@ -58,17 +220,80 @@ export function getGatewayUrl(cid, gateway = 'https://ipfs.io') {
|
|
|
58
220
|
return `${gateway}/ipfs/${cid}`;
|
|
59
221
|
}
|
|
60
222
|
/**
|
|
61
|
-
*
|
|
223
|
+
* Get multiple gateway URLs for redundancy
|
|
224
|
+
*/
|
|
225
|
+
export function getGatewayUrls(cid) {
|
|
226
|
+
return IPFS_GATEWAYS.map(gateway => `${gateway}/ipfs/${cid}`);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Validate CID format (CIDv0 and CIDv1)
|
|
62
230
|
*/
|
|
63
231
|
export function isValidCID(cid) {
|
|
64
|
-
// CIDv0 starts with 'Qm' and is 46 characters
|
|
65
|
-
// CIDv1 starts with 'b' (base32)
|
|
66
|
-
return /^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[a-z2-7]{58,})
|
|
232
|
+
// CIDv0 starts with 'Qm' and is 46 characters (base58btc)
|
|
233
|
+
// CIDv1 starts with 'b' (base32) or 'z' (base58btc) or 'f' (base16)
|
|
234
|
+
return /^(Qm[1-9A-HJ-NP-Za-km-z]{44}|b[a-z2-7]{58,}|z[1-9A-HJ-NP-Za-km-z]{48,}|f[0-9a-f]{50,})$/i.test(cid);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Validate IPNS name format
|
|
238
|
+
*/
|
|
239
|
+
export function isValidIPNS(ipnsName) {
|
|
240
|
+
// IPNS key format (k51...) or DNSLink domain
|
|
241
|
+
return /^(k51[a-z0-9]{59,}|[a-z0-9.-]+\.[a-z]{2,})$/i.test(ipnsName);
|
|
67
242
|
}
|
|
68
243
|
/**
|
|
69
244
|
* Generate content hash for verification
|
|
70
245
|
*/
|
|
71
246
|
export function hashContent(content) {
|
|
72
|
-
|
|
247
|
+
const buffer = typeof content === 'string' ? Buffer.from(content) : content;
|
|
248
|
+
return crypto.createHash('sha256').update(buffer).digest('hex');
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Verify Ed25519 signature (async import to avoid bundling issues)
|
|
252
|
+
*/
|
|
253
|
+
export async function verifyEd25519Signature(message, signature, publicKey) {
|
|
254
|
+
try {
|
|
255
|
+
// Dynamic import to avoid bundling @noble/ed25519 if not used
|
|
256
|
+
const ed = await import('@noble/ed25519');
|
|
257
|
+
// Handle prefixed public key (e.g., "ed25519:abc123...")
|
|
258
|
+
const pubKeyHex = publicKey.replace(/^ed25519:/, '');
|
|
259
|
+
const isValid = await ed.verifyAsync(Buffer.from(signature, 'hex'), new TextEncoder().encode(message), Buffer.from(pubKeyHex, 'hex'));
|
|
260
|
+
return isValid;
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
console.warn('[IPFS] Signature verification failed:', error);
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Parse CID to extract metadata
|
|
269
|
+
*/
|
|
270
|
+
export function parseCID(cid) {
|
|
271
|
+
if (!isValidCID(cid)) {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
if (cid.startsWith('Qm')) {
|
|
275
|
+
return {
|
|
276
|
+
version: 0,
|
|
277
|
+
codec: 'dag-pb',
|
|
278
|
+
hash: cid,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
// CIDv1 - simplified parsing
|
|
282
|
+
return {
|
|
283
|
+
version: 1,
|
|
284
|
+
codec: 'dag-cbor', // Most common for JSON
|
|
285
|
+
hash: cid,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Format bytes to human readable
|
|
290
|
+
*/
|
|
291
|
+
export function formatBytes(bytes) {
|
|
292
|
+
if (bytes === 0)
|
|
293
|
+
return '0 B';
|
|
294
|
+
const k = 1024;
|
|
295
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
296
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
297
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
|
|
73
298
|
}
|
|
74
299
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/transfer/ipfs/client.ts"],"names":[],"mappings":"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"}
|