@helia/routers 1.0.3 → 1.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/dist/index.min.js +15 -4
- package/dist/src/http-gateway-routing.d.ts +10 -0
- package/dist/src/http-gateway-routing.d.ts.map +1 -0
- package/dist/src/http-gateway-routing.js +76 -0
- package/dist/src/http-gateway-routing.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/typedoc-urls.json +1 -0
- package/package.json +4 -2
- package/src/http-gateway-routing.ts +101 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Routing } from '@helia/interface';
|
|
2
|
+
export declare const DEFAULT_TRUSTLESS_GATEWAYS: string[];
|
|
3
|
+
export interface HTTPGatwayRouterInit {
|
|
4
|
+
gateways?: Array<URL | string>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Returns a static list of HTTP Gateways as providers
|
|
8
|
+
*/
|
|
9
|
+
export declare function httpGatewayRouting(init?: HTTPGatwayRouterInit): Partial<Routing>;
|
|
10
|
+
//# sourceMappingURL=http-gateway-routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-gateway-routing.d.ts","sourceRoot":"","sources":["../../src/http-gateway-routing.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAY,OAAO,EAAkB,MAAM,kBAAkB,CAAA;AAIzE,eAAO,MAAM,0BAA0B,UAMtC,CAAA;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,CAAA;CAC/B;AA2ED;;GAEG;AACH,wBAAgB,kBAAkB,CAAE,IAAI,GAAE,oBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,CAErF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { peerIdSymbol } from '@libp2p/interface';
|
|
2
|
+
import { uriToMultiaddr } from '@multiformats/uri-to-multiaddr';
|
|
3
|
+
import { CID } from 'multiformats/cid';
|
|
4
|
+
import { identity } from 'multiformats/hashes/identity';
|
|
5
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
6
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
7
|
+
export const DEFAULT_TRUSTLESS_GATEWAYS = [
|
|
8
|
+
// 2023-10-03: IPNS, Origin, and Block/CAR support from https://ipfs-public-gateway-checker.on.fleek.co/
|
|
9
|
+
'https://trustless-gateway.link',
|
|
10
|
+
// 2023-10-03: IPNS, Origin, and Block/CAR support from https://ipfs-public-gateway-checker.on.fleek.co/
|
|
11
|
+
'https://4everland.io'
|
|
12
|
+
];
|
|
13
|
+
// these values are from https://github.com/multiformats/multicodec/blob/master/table.csv
|
|
14
|
+
const TRANSPORT_IPFS_GATEWAY_HTTP_CODE = 0x0920;
|
|
15
|
+
const inspect = Symbol.for('nodejs.util.inspect.custom');
|
|
16
|
+
class URLPeerId {
|
|
17
|
+
type = 'url';
|
|
18
|
+
multihash;
|
|
19
|
+
privateKey;
|
|
20
|
+
publicKey;
|
|
21
|
+
url;
|
|
22
|
+
constructor(url) {
|
|
23
|
+
this.url = url.toString();
|
|
24
|
+
this.multihash = identity.digest(uint8ArrayFromString(this.url));
|
|
25
|
+
}
|
|
26
|
+
[inspect]() {
|
|
27
|
+
return `PeerId(${this.url})`;
|
|
28
|
+
}
|
|
29
|
+
[peerIdSymbol] = true;
|
|
30
|
+
toString() {
|
|
31
|
+
return this.toCID().toString();
|
|
32
|
+
}
|
|
33
|
+
toCID() {
|
|
34
|
+
return CID.createV1(TRANSPORT_IPFS_GATEWAY_HTTP_CODE, this.multihash);
|
|
35
|
+
}
|
|
36
|
+
toBytes() {
|
|
37
|
+
return this.toCID().bytes;
|
|
38
|
+
}
|
|
39
|
+
equals(other) {
|
|
40
|
+
if (other == null) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
if (other instanceof Uint8Array) {
|
|
44
|
+
other = uint8ArrayToString(other);
|
|
45
|
+
}
|
|
46
|
+
return other.toString() === this.toString();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function toPeerInfo(url) {
|
|
50
|
+
url = url.toString();
|
|
51
|
+
return {
|
|
52
|
+
id: new URLPeerId(new URL(url)),
|
|
53
|
+
multiaddrs: [
|
|
54
|
+
uriToMultiaddr(url)
|
|
55
|
+
]
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
class HTTPGatwayRouter {
|
|
59
|
+
gateways;
|
|
60
|
+
constructor(init = {}) {
|
|
61
|
+
this.gateways = (init.gateways ?? DEFAULT_TRUSTLESS_GATEWAYS).map(url => toPeerInfo(url));
|
|
62
|
+
}
|
|
63
|
+
async *findProviders(cid, options) {
|
|
64
|
+
yield* this.gateways.toSorted(() => Math.random() > 0.5 ? 1 : -1).map(info => ({
|
|
65
|
+
...info,
|
|
66
|
+
protocols: ['transport-ipfs-gateway-http']
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns a static list of HTTP Gateways as providers
|
|
72
|
+
*/
|
|
73
|
+
export function httpGatewayRouting(init = {}) {
|
|
74
|
+
return new HTTPGatwayRouter(init);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=http-gateway-routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-gateway-routing.js","sourceRoot":"","sources":["../../src/http-gateway-routing.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -4,5 +4,6 @@
|
|
|
4
4
|
* Abstraction layer over different content and peer routing mechanisms.
|
|
5
5
|
*/
|
|
6
6
|
export { delegatedHTTPRouting } from './delegated-http-routing.js';
|
|
7
|
+
export { httpGatewayRouting } from './http-gateway-routing.js';
|
|
7
8
|
export { libp2pRouting } from './libp2p-routing.js';
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
package/dist/src/index.js
CHANGED
|
@@ -4,5 +4,6 @@
|
|
|
4
4
|
* Abstraction layer over different content and peer routing mechanisms.
|
|
5
5
|
*/
|
|
6
6
|
export { delegatedHTTPRouting } from './delegated-http-routing.js';
|
|
7
|
+
export { httpGatewayRouting } from './http-gateway-routing.js';
|
|
7
8
|
export { libp2pRouting } from './libp2p-routing.js';
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
package/dist/typedoc-urls.json
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"delegatedHTTPRouting": "https://ipfs.github.io/helia/functions/_helia_routers.delegatedHTTPRouting.html",
|
|
3
|
+
"httpGatewayRouting": "https://ipfs.github.io/helia/functions/_helia_routers.httpGatewayRouting.html",
|
|
3
4
|
"libp2pRouting": "https://ipfs.github.io/helia/functions/_helia_routers.libp2pRouting.html"
|
|
4
5
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/routers",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Routers for Helia",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/ipfs/helia/tree/main/packages/routers#readme",
|
|
@@ -54,8 +54,9 @@
|
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
56
|
"@helia/delegated-routing-v1-http-api-client": "^3.0.0",
|
|
57
|
-
"@helia/interface": "^4.
|
|
57
|
+
"@helia/interface": "^4.3.0",
|
|
58
58
|
"@libp2p/interface": "^1.1.4",
|
|
59
|
+
"@multiformats/uri-to-multiaddr": "^8.0.0",
|
|
59
60
|
"ipns": "^9.0.0",
|
|
60
61
|
"it-first": "^3.0.4",
|
|
61
62
|
"it-map": "^3.0.5",
|
|
@@ -66,6 +67,7 @@
|
|
|
66
67
|
"@libp2p/peer-id": "^4.0.7",
|
|
67
68
|
"@libp2p/peer-id-factory": "^4.0.7",
|
|
68
69
|
"aegir": "^42.2.5",
|
|
70
|
+
"it-all": "^3.0.4",
|
|
69
71
|
"it-drain": "^3.0.5",
|
|
70
72
|
"sinon-ts": "^2.0.0"
|
|
71
73
|
},
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { peerIdSymbol } from '@libp2p/interface'
|
|
2
|
+
import { uriToMultiaddr } from '@multiformats/uri-to-multiaddr'
|
|
3
|
+
import { CID } from 'multiformats/cid'
|
|
4
|
+
import { identity } from 'multiformats/hashes/identity'
|
|
5
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
|
|
6
|
+
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
7
|
+
import type { Provider, Routing, RoutingOptions } from '@helia/interface'
|
|
8
|
+
import type { PeerId, PeerInfo } from '@libp2p/interface'
|
|
9
|
+
import type { MultihashDigest, Version } from 'multiformats'
|
|
10
|
+
|
|
11
|
+
export const DEFAULT_TRUSTLESS_GATEWAYS = [
|
|
12
|
+
// 2023-10-03: IPNS, Origin, and Block/CAR support from https://ipfs-public-gateway-checker.on.fleek.co/
|
|
13
|
+
'https://trustless-gateway.link',
|
|
14
|
+
|
|
15
|
+
// 2023-10-03: IPNS, Origin, and Block/CAR support from https://ipfs-public-gateway-checker.on.fleek.co/
|
|
16
|
+
'https://4everland.io'
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
export interface HTTPGatwayRouterInit {
|
|
20
|
+
gateways?: Array<URL | string>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// these values are from https://github.com/multiformats/multicodec/blob/master/table.csv
|
|
24
|
+
const TRANSPORT_IPFS_GATEWAY_HTTP_CODE = 0x0920
|
|
25
|
+
const inspect = Symbol.for('nodejs.util.inspect.custom')
|
|
26
|
+
|
|
27
|
+
class URLPeerId implements PeerId {
|
|
28
|
+
readonly type = 'url'
|
|
29
|
+
readonly multihash: MultihashDigest
|
|
30
|
+
readonly privateKey?: Uint8Array
|
|
31
|
+
readonly publicKey?: Uint8Array
|
|
32
|
+
readonly url: string
|
|
33
|
+
|
|
34
|
+
constructor (url: URL) {
|
|
35
|
+
this.url = url.toString()
|
|
36
|
+
this.multihash = identity.digest(uint8ArrayFromString(this.url))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
[inspect] (): string {
|
|
40
|
+
return `PeerId(${this.url})`
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
readonly [peerIdSymbol] = true
|
|
44
|
+
|
|
45
|
+
toString (): string {
|
|
46
|
+
return this.toCID().toString()
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
toCID (): CID {
|
|
50
|
+
return CID.createV1(TRANSPORT_IPFS_GATEWAY_HTTP_CODE, this.multihash)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
toBytes (): Uint8Array {
|
|
54
|
+
return this.toCID().bytes
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
equals (other?: PeerId | Uint8Array | string): boolean {
|
|
58
|
+
if (other == null) {
|
|
59
|
+
return false
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (other instanceof Uint8Array) {
|
|
63
|
+
other = uint8ArrayToString(other)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return other.toString() === this.toString()
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function toPeerInfo (url: string | URL): PeerInfo {
|
|
71
|
+
url = url.toString()
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
id: new URLPeerId(new URL(url)),
|
|
75
|
+
multiaddrs: [
|
|
76
|
+
uriToMultiaddr(url)
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
class HTTPGatwayRouter implements Partial<Routing> {
|
|
82
|
+
private readonly gateways: PeerInfo[]
|
|
83
|
+
|
|
84
|
+
constructor (init: HTTPGatwayRouterInit = {}) {
|
|
85
|
+
this.gateways = (init.gateways ?? DEFAULT_TRUSTLESS_GATEWAYS).map(url => toPeerInfo(url))
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async * findProviders (cid: CID<unknown, number, number, Version>, options?: RoutingOptions | undefined): AsyncIterable<Provider> {
|
|
89
|
+
yield * this.gateways.toSorted(() => Math.random() > 0.5 ? 1 : -1).map(info => ({
|
|
90
|
+
...info,
|
|
91
|
+
protocols: ['transport-ipfs-gateway-http']
|
|
92
|
+
}))
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Returns a static list of HTTP Gateways as providers
|
|
98
|
+
*/
|
|
99
|
+
export function httpGatewayRouting (init: HTTPGatwayRouterInit = {}): Partial<Routing> {
|
|
100
|
+
return new HTTPGatwayRouter(init)
|
|
101
|
+
}
|
package/src/index.ts
CHANGED