@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.
@@ -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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"}
@@ -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
@@ -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
@@ -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"}
@@ -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",
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.2.0",
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
@@ -4,4 +4,5 @@
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'