@helia/verified-fetch 1.3.13 → 1.4.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/README.md +11 -6
- package/dist/index.min.js +18 -7
- package/dist/src/index.d.ts +86 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +20 -9
- package/dist/src/index.js.map +1 -1
- package/dist/src/utils/parse-url-string.d.ts +7 -0
- package/dist/src/utils/parse-url-string.d.ts.map +1 -1
- package/dist/src/utils/parse-url-string.js +1 -1
- package/dist/src/utils/parse-url-string.js.map +1 -1
- package/dist/src/utils/resource-to-cache-key.d.ts +15 -0
- package/dist/src/utils/resource-to-cache-key.d.ts.map +1 -0
- package/dist/src/utils/resource-to-cache-key.js +27 -0
- package/dist/src/utils/resource-to-cache-key.js.map +1 -0
- package/dist/src/verified-fetch.d.ts +4 -10
- package/dist/src/verified-fetch.d.ts.map +1 -1
- package/dist/src/verified-fetch.js +44 -14
- package/dist/src/verified-fetch.js.map +1 -1
- package/package.json +14 -14
- package/src/index.ts +101 -9
- package/src/utils/parse-url-string.ts +1 -1
- package/src/utils/resource-to-cache-key.ts +30 -0
- package/src/verified-fetch.ts +66 -26
package/dist/src/index.d.ts
CHANGED
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Browser-cache-friendly [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) objects are returned which should be instantly familiar to web developers.
|
|
13
13
|
*
|
|
14
|
+
* Learn more in the [announcement blog post](https://blog.ipfs.tech/verified-fetch/) and check out the [ready-to-run example](https://github.com/ipfs-examples/helia-examples/tree/main/examples/helia-browser-verified-fetch).
|
|
15
|
+
*
|
|
14
16
|
* You may use any supported resource argument to fetch content:
|
|
15
17
|
*
|
|
16
18
|
* - [CID](https://multiformats.github.io/js-multiformats/classes/cid.CID.html) instance
|
|
@@ -88,22 +90,25 @@
|
|
|
88
90
|
*
|
|
89
91
|
* The [helia](https://www.npmjs.com/package/helia) module is configured with a libp2p node that is suited for decentralized applications, alternatively [@helia/http](https://www.npmjs.com/package/@helia/http) is available which uses HTTP gateways for all network operations.
|
|
90
92
|
*
|
|
91
|
-
*
|
|
93
|
+
* You can see variations of Helia and js-libp2p configuration options at <https://helia.io/interfaces/helia.index.HeliaInit.html>.
|
|
92
94
|
*
|
|
93
95
|
* ```typescript
|
|
94
96
|
* import { trustlessGateway } from '@helia/block-brokers'
|
|
95
97
|
* import { createHeliaHTTP } from '@helia/http'
|
|
96
|
-
* import { delegatedHTTPRouting } from '@helia/routers'
|
|
98
|
+
* import { delegatedHTTPRouting, httpGatewayRouting } from '@helia/routers'
|
|
97
99
|
* import { createVerifiedFetch } from '@helia/verified-fetch'
|
|
98
100
|
*
|
|
99
101
|
* const fetch = await createVerifiedFetch(
|
|
100
102
|
* await createHeliaHTTP({
|
|
101
103
|
* blockBrokers: [
|
|
102
|
-
* trustlessGateway(
|
|
104
|
+
* trustlessGateway()
|
|
105
|
+
* ],
|
|
106
|
+
* routers: [
|
|
107
|
+
* delegatedHTTPRouting('http://delegated-ipfs.dev'),
|
|
108
|
+
* httpGatewayRouting({
|
|
103
109
|
* gateways: ['https://mygateway.example.net', 'https://trustless-gateway.link']
|
|
104
110
|
* })
|
|
105
|
-
* ]
|
|
106
|
-
* routers: ['http://delegated-ipfs.dev'].map((routerUrl) => delegatedHTTPRouting(routerUrl))
|
|
111
|
+
* ]
|
|
107
112
|
* })
|
|
108
113
|
* )
|
|
109
114
|
*
|
|
@@ -586,7 +591,7 @@
|
|
|
586
591
|
* 1. `TypeError` - If the resource argument is not a string, CID, or CID string.
|
|
587
592
|
* 2. `TypeError` - If the options argument is passed and not an object.
|
|
588
593
|
* 3. `TypeError` - If the options argument is passed and is malformed.
|
|
589
|
-
* 4. `AbortError` - If the content request is aborted due to user aborting provided AbortSignal.
|
|
594
|
+
* 4. `AbortError` - If the content request is aborted due to user aborting provided AbortSignal. Note that this is a `AbortError` from `@libp2p/interface` and not the standard `AbortError` from the Fetch API.
|
|
590
595
|
*/
|
|
591
596
|
import type { GetBlockProgressEvents, Helia } from '@helia/interface';
|
|
592
597
|
import type { ResolveDNSLinkProgressEvents } from '@helia/ipns';
|
|
@@ -632,6 +637,29 @@ export interface CreateVerifiedFetchInit {
|
|
|
632
637
|
* @default [dnsJsonOverHttps('https://cloudflare-dns.com/dns-query'),dnsJsonOverHttps('https://dns.google/resolve')]
|
|
633
638
|
*/
|
|
634
639
|
dnsResolvers?: DNSResolver[] | DNSResolvers;
|
|
640
|
+
/**
|
|
641
|
+
* By default we will not connect to any HTTP Gateways providers over local or
|
|
642
|
+
* loopback addresses, this is because they are typically running on remote
|
|
643
|
+
* peers that have published private addresses by mistate.
|
|
644
|
+
*
|
|
645
|
+
* Pass `true` here to connect to local Gateways as well, this may be useful
|
|
646
|
+
* in testing environments.
|
|
647
|
+
*
|
|
648
|
+
* @default false
|
|
649
|
+
*/
|
|
650
|
+
allowLocal?: boolean;
|
|
651
|
+
/**
|
|
652
|
+
* By default we will not connect to any gateways over HTTP addresses,
|
|
653
|
+
* requring HTTPS connections instead. This is because it will cause
|
|
654
|
+
* "mixed-content" errors to appear in the console when running in secure
|
|
655
|
+
* browser contexts.
|
|
656
|
+
*
|
|
657
|
+
* Pass `true` here to connect to insecure Gateways as well, this may be
|
|
658
|
+
* useful in testing environments.
|
|
659
|
+
*
|
|
660
|
+
* @default false
|
|
661
|
+
*/
|
|
662
|
+
allowInsecure?: boolean;
|
|
635
663
|
}
|
|
636
664
|
export interface CreateVerifiedFetchOptions {
|
|
637
665
|
/**
|
|
@@ -643,6 +671,20 @@ export interface CreateVerifiedFetchOptions {
|
|
|
643
671
|
* @default undefined
|
|
644
672
|
*/
|
|
645
673
|
contentTypeParser?: ContentTypeParser;
|
|
674
|
+
/**
|
|
675
|
+
* Blockstore sessions are cached for reuse with requests with the same
|
|
676
|
+
* base URL or CID. This parameter controls how many to cache. Once this limit
|
|
677
|
+
* is reached older/less used sessions will be evicted from the cache.
|
|
678
|
+
*
|
|
679
|
+
* @default 100
|
|
680
|
+
*/
|
|
681
|
+
sessionCacheSize?: number;
|
|
682
|
+
/**
|
|
683
|
+
* How long each blockstore session should stay in the cache for.
|
|
684
|
+
*
|
|
685
|
+
* @default 60000
|
|
686
|
+
*/
|
|
687
|
+
sessionTTLms?: number;
|
|
646
688
|
}
|
|
647
689
|
/**
|
|
648
690
|
* A ContentTypeParser attempts to return the mime type of a given file. It
|
|
@@ -667,6 +709,44 @@ export type VerifiedFetchProgressEvents = ProgressEvent<'verified-fetch:request:
|
|
|
667
709
|
* progress events.
|
|
668
710
|
*/
|
|
669
711
|
export interface VerifiedFetchInit extends RequestInit, ProgressOptions<BubbledProgressEvents | VerifiedFetchProgressEvents> {
|
|
712
|
+
/**
|
|
713
|
+
* If true, try to create a blockstore session - this can reduce overall
|
|
714
|
+
* network traffic by first querying for a set of peers that have the data we
|
|
715
|
+
* wish to retrieve. Subsequent requests for data using the session will only
|
|
716
|
+
* be sent to those peers, unless they don't have the data, in which case
|
|
717
|
+
* further peers will be added to the session.
|
|
718
|
+
*
|
|
719
|
+
* Sessions are cached based on the CID/IPNS name they attempt to access. That
|
|
720
|
+
* is, requests for `https://qmfoo.ipfs.localhost/bar.txt` and
|
|
721
|
+
* `https://qmfoo.ipfs.localhost/baz.txt` would use the same session, if this
|
|
722
|
+
* argument is true for both fetch requests.
|
|
723
|
+
*
|
|
724
|
+
* @default true
|
|
725
|
+
*/
|
|
726
|
+
session?: boolean;
|
|
727
|
+
/**
|
|
728
|
+
* By default we will not connect to any HTTP Gateways providers over local or
|
|
729
|
+
* loopback addresses, this is because they are typically running on remote
|
|
730
|
+
* peers that have published private addresses by mistate.
|
|
731
|
+
*
|
|
732
|
+
* Pass `true` here to connect to local Gateways as well, this may be useful
|
|
733
|
+
* in testing environments.
|
|
734
|
+
*
|
|
735
|
+
* @default false
|
|
736
|
+
*/
|
|
737
|
+
allowLocal?: boolean;
|
|
738
|
+
/**
|
|
739
|
+
* By default we will not connect to any gateways over HTTP addresses,
|
|
740
|
+
* requring HTTPS connections instead. This is because it will cause
|
|
741
|
+
* "mixed-content" errors to appear in the console when running in secure
|
|
742
|
+
* browser contexts.
|
|
743
|
+
*
|
|
744
|
+
* Pass `true` here to connect to insecure Gateways as well, this may be
|
|
745
|
+
* useful in testing environments.
|
|
746
|
+
*
|
|
747
|
+
* @default false
|
|
748
|
+
*/
|
|
749
|
+
allowInsecure?: boolean;
|
|
670
750
|
}
|
|
671
751
|
/**
|
|
672
752
|
* Create and return a Helia node
|
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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Browser-cache-friendly [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) objects are returned which should be instantly familiar to web developers.
|
|
13
13
|
*
|
|
14
|
+
* Learn more in the [announcement blog post](https://blog.ipfs.tech/verified-fetch/) and check out the [ready-to-run example](https://github.com/ipfs-examples/helia-examples/tree/main/examples/helia-browser-verified-fetch).
|
|
15
|
+
*
|
|
14
16
|
* You may use any supported resource argument to fetch content:
|
|
15
17
|
*
|
|
16
18
|
* - [CID](https://multiformats.github.io/js-multiformats/classes/cid.CID.html) instance
|
|
@@ -88,22 +90,25 @@
|
|
|
88
90
|
*
|
|
89
91
|
* The [helia](https://www.npmjs.com/package/helia) module is configured with a libp2p node that is suited for decentralized applications, alternatively [@helia/http](https://www.npmjs.com/package/@helia/http) is available which uses HTTP gateways for all network operations.
|
|
90
92
|
*
|
|
91
|
-
*
|
|
93
|
+
* You can see variations of Helia and js-libp2p configuration options at <https://helia.io/interfaces/helia.index.HeliaInit.html>.
|
|
92
94
|
*
|
|
93
95
|
* ```typescript
|
|
94
96
|
* import { trustlessGateway } from '@helia/block-brokers'
|
|
95
97
|
* import { createHeliaHTTP } from '@helia/http'
|
|
96
|
-
* import { delegatedHTTPRouting } from '@helia/routers'
|
|
98
|
+
* import { delegatedHTTPRouting, httpGatewayRouting } from '@helia/routers'
|
|
97
99
|
* import { createVerifiedFetch } from '@helia/verified-fetch'
|
|
98
100
|
*
|
|
99
101
|
* const fetch = await createVerifiedFetch(
|
|
100
102
|
* await createHeliaHTTP({
|
|
101
103
|
* blockBrokers: [
|
|
102
|
-
* trustlessGateway(
|
|
104
|
+
* trustlessGateway()
|
|
105
|
+
* ],
|
|
106
|
+
* routers: [
|
|
107
|
+
* delegatedHTTPRouting('http://delegated-ipfs.dev'),
|
|
108
|
+
* httpGatewayRouting({
|
|
103
109
|
* gateways: ['https://mygateway.example.net', 'https://trustless-gateway.link']
|
|
104
110
|
* })
|
|
105
|
-
* ]
|
|
106
|
-
* routers: ['http://delegated-ipfs.dev'].map((routerUrl) => delegatedHTTPRouting(routerUrl))
|
|
111
|
+
* ]
|
|
107
112
|
* })
|
|
108
113
|
* )
|
|
109
114
|
*
|
|
@@ -586,11 +591,11 @@
|
|
|
586
591
|
* 1. `TypeError` - If the resource argument is not a string, CID, or CID string.
|
|
587
592
|
* 2. `TypeError` - If the options argument is passed and not an object.
|
|
588
593
|
* 3. `TypeError` - If the options argument is passed and is malformed.
|
|
589
|
-
* 4. `AbortError` - If the content request is aborted due to user aborting provided AbortSignal.
|
|
594
|
+
* 4. `AbortError` - If the content request is aborted due to user aborting provided AbortSignal. Note that this is a `AbortError` from `@libp2p/interface` and not the standard `AbortError` from the Fetch API.
|
|
590
595
|
*/
|
|
591
596
|
import { trustlessGateway } from '@helia/block-brokers';
|
|
592
597
|
import { createHeliaHTTP } from '@helia/http';
|
|
593
|
-
import { delegatedHTTPRouting } from '@helia/routers';
|
|
598
|
+
import { delegatedHTTPRouting, httpGatewayRouting } from '@helia/routers';
|
|
594
599
|
import { dns } from '@multiformats/dns';
|
|
595
600
|
import { VerifiedFetch as VerifiedFetchClass } from './verified-fetch.js';
|
|
596
601
|
/**
|
|
@@ -601,10 +606,16 @@ export async function createVerifiedFetch(init, options) {
|
|
|
601
606
|
init = await createHeliaHTTP({
|
|
602
607
|
blockBrokers: [
|
|
603
608
|
trustlessGateway({
|
|
604
|
-
|
|
609
|
+
allowInsecure: init?.allowInsecure,
|
|
610
|
+
allowLocal: init?.allowLocal
|
|
611
|
+
})
|
|
612
|
+
],
|
|
613
|
+
routers: [
|
|
614
|
+
...(init?.routers ?? ['https://delegated-ipfs.dev']).map((routerUrl) => delegatedHTTPRouting(routerUrl)),
|
|
615
|
+
httpGatewayRouting({
|
|
616
|
+
gateways: init?.gateways ?? []
|
|
605
617
|
})
|
|
606
618
|
],
|
|
607
|
-
routers: (init?.routers ?? ['https://delegated-ipfs.dev']).map((routerUrl) => delegatedHTTPRouting(routerUrl)),
|
|
608
619
|
dns: createDns(init?.dnsResolvers)
|
|
609
620
|
});
|
|
610
621
|
}
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAklBG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAE,aAAa,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AA0LzE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAE,IAAsC,EAAE,OAAoC;IACrH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACnB,IAAI,GAAG,MAAM,eAAe,CAAC;YAC3B,YAAY,EAAE;gBACZ,gBAAgB,CAAC;oBACf,aAAa,EAAE,IAAI,EAAE,aAAa;oBAClC,UAAU,EAAE,IAAI,EAAE,UAAU;iBAC7B,CAAC;aACH;YACD,OAAO,EAAE;gBACP,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;gBACxG,kBAAkB,CAAC;oBACjB,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE;iBAC/B,CAAC;aACH;YACD,GAAG,EAAE,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC;SACnC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,qBAAqB,GAAG,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAA;IAC9E,KAAK,UAAU,aAAa,CAAE,QAAkB,EAAE,OAA2B;QAC3E,OAAO,qBAAqB,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACvD,CAAC;IACD,aAAa,CAAC,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAC3E,aAAa,CAAC,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAE7E,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE9C,SAAS,OAAO,CAAE,GAAQ;IACxB,0EAA0E;IAC1E,OAAO,GAAG,EAAE,UAAU,IAAI,IAAI;QAC5B,GAAG,EAAE,SAAS,IAAI,IAAI;QACtB,GAAG,EAAE,EAAE,IAAI,IAAI;QACf,GAAG,EAAE,IAAI,IAAI,IAAI;QACjB,GAAG,EAAE,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC;AAED,SAAS,SAAS,CAAE,SAAwC;IAC1D,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,OAAM;IACR,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC;YACT,SAAS,EAAE;gBACT,GAAG,EAAE,SAAS;aACf;SACF,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAA;AAC3B,CAAC"}
|
|
@@ -32,6 +32,13 @@ interface ParsedUrlStringResultsBase extends ResolveResult {
|
|
|
32
32
|
ttl?: number;
|
|
33
33
|
}
|
|
34
34
|
export type ParsedUrlStringResults = ParsedUrlStringResultsBase;
|
|
35
|
+
interface MatchUrlGroups {
|
|
36
|
+
protocol: 'ipfs' | 'ipns';
|
|
37
|
+
cidOrPeerIdOrDnsLink: string;
|
|
38
|
+
path?: string;
|
|
39
|
+
queryString?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function matchURLString(urlString: string): MatchUrlGroups;
|
|
35
42
|
/**
|
|
36
43
|
* A function that parses ipfs:// and ipns:// URLs, returning an object with easily recognizable properties.
|
|
37
44
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAwB,IAAI,EAAqB,iBAAiB,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACvK,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAItD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,eAAe,CAAA;CACxB;AACD,MAAM,WAAW,qBAAsB,SAAQ,eAAe,CAAC,qBAAqB,GAAG,iBAAiB,GAAG,4BAA4B,CAAC,EAAE,YAAY;CAErJ;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,0BAA2B,SAAQ,aAAa;IACxD,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,KAAK,EAAE,cAAc,CAAA;IAErB;;;;;;;OAOG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAwB,IAAI,EAAqB,iBAAiB,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACvK,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAItD,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,eAAe,CAAA;CACxB;AACD,MAAM,WAAW,qBAAsB,SAAQ,eAAe,CAAC,qBAAqB,GAAG,iBAAiB,GAAG,4BAA4B,CAAC,EAAE,YAAY;CAErJ;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,UAAU,0BAA2B,SAAQ,aAAa;IACxD,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,KAAK,EAAE,cAAc,CAAA;IAErB;;;;;;;OAOG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,CAAA;AAO/D,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAgBD,wBAAgB,cAAc,CAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAUjE;AAsDD;;;;;;;;GAQG;AAEH,wBAAsB,cAAc,CAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAoHxJ"}
|
|
@@ -20,7 +20,7 @@ function matchUrlGroupsGuard(groups) {
|
|
|
20
20
|
(path == null || typeof path === 'string') &&
|
|
21
21
|
(queryString == null || typeof queryString === 'string');
|
|
22
22
|
}
|
|
23
|
-
function matchURLString(urlString) {
|
|
23
|
+
export function matchURLString(urlString) {
|
|
24
24
|
for (const pattern of [URL_REGEX, PATH_REGEX, PATH_GATEWAY_REGEX, SUBDOMAIN_GATEWAY_REGEX]) {
|
|
25
25
|
const match = urlString.match(pattern);
|
|
26
26
|
if (matchUrlGroupsGuard(match?.groups)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-url-string.js","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAMhC,MAAM,SAAS,GAAG,IAAI,IAAI,CAA2C,IAAI,CAAC,CAAA;AAuC1E,MAAM,SAAS,GAAG,kGAAkG,CAAA;AACpH,MAAM,UAAU,GAAG,iGAAiG,CAAA;AACpH,MAAM,kBAAkB,GAAG,oHAAoH,CAAA;AAC/I,MAAM,uBAAuB,GAAG,oHAAoH,CAAA;AASpJ,SAAS,mBAAmB,CAAE,MAA6D;IACzF,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAA;IACjC,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,KAAK,CAAA;IAClC,MAAM,oBAAoB,GAAG,MAAM,EAAE,oBAAoB,CAAA;IACzD,IAAI,oBAAoB,IAAI,IAAI;QAAE,OAAO,KAAK,CAAA;IAC9C,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,CAAA;IACzB,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,CAAA;IAEvC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxC,OAAO,oBAAoB,KAAK,QAAQ;QACxC,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;QAC1C,CAAC,WAAW,IAAI,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAA;AAC5D,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"parse-url-string.js","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CID } from 'multiformats/cid';
|
|
2
|
+
/**
|
|
3
|
+
* Takes a resource and returns a session cache key as an IPFS or IPNS path with
|
|
4
|
+
* any trailing segments removed.
|
|
5
|
+
*
|
|
6
|
+
* E.g.
|
|
7
|
+
*
|
|
8
|
+
* - Qmfoo -> /ipfs/Qmfoo
|
|
9
|
+
* - https://Qmfoo.ipfs.gateway.org -> /ipfs/Qmfoo
|
|
10
|
+
* - https://gateway.org/ipfs/Qmfoo -> /ipfs/Qmfoo
|
|
11
|
+
* - https://gateway.org/ipfs/Qmfoo/bar.txt -> /ipfs/Qmfoo
|
|
12
|
+
* - etc
|
|
13
|
+
*/
|
|
14
|
+
export declare function resourceToSessionCacheKey(url: string | CID): string;
|
|
15
|
+
//# sourceMappingURL=resource-to-cache-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-to-cache-key.d.ts","sourceRoot":"","sources":["../../../src/utils/resource-to-cache-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAGtC;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAE,GAAG,EAAE,MAAM,GAAG,GAAG,GAAG,MAAM,CAcpE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CID } from 'multiformats/cid';
|
|
2
|
+
import { matchURLString } from './parse-url-string.js';
|
|
3
|
+
/**
|
|
4
|
+
* Takes a resource and returns a session cache key as an IPFS or IPNS path with
|
|
5
|
+
* any trailing segments removed.
|
|
6
|
+
*
|
|
7
|
+
* E.g.
|
|
8
|
+
*
|
|
9
|
+
* - Qmfoo -> /ipfs/Qmfoo
|
|
10
|
+
* - https://Qmfoo.ipfs.gateway.org -> /ipfs/Qmfoo
|
|
11
|
+
* - https://gateway.org/ipfs/Qmfoo -> /ipfs/Qmfoo
|
|
12
|
+
* - https://gateway.org/ipfs/Qmfoo/bar.txt -> /ipfs/Qmfoo
|
|
13
|
+
* - etc
|
|
14
|
+
*/
|
|
15
|
+
export function resourceToSessionCacheKey(url) {
|
|
16
|
+
const cid = CID.asCID(url);
|
|
17
|
+
if (cid != null) {
|
|
18
|
+
return `ipfs://${cid}`;
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
return `ipfs://${CID.parse(url.toString())}`;
|
|
22
|
+
}
|
|
23
|
+
catch { }
|
|
24
|
+
const { protocol, cidOrPeerIdOrDnsLink } = matchURLString(url.toString());
|
|
25
|
+
return `${protocol}://${cidOrPeerIdOrDnsLink}`;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=resource-to-cache-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-to-cache-key.js","sourceRoot":"","sources":["../../../src/utils/resource-to-cache-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,CAAE,GAAiB;IAC1D,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE1B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,UAAU,GAAG,EAAE,CAAA;IACxB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,UAAU,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAA;IAC9C,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEzE,OAAO,GAAG,QAAQ,MAAM,oBAAoB,EAAE,CAAA;AAChD,CAAC"}
|
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
import { type IPNS } from '@helia/ipns';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CreateVerifiedFetchOptions, Resource, VerifiedFetchInit as VerifiedFetchOptions } from './index.js';
|
|
3
3
|
import type { Helia } from '@helia/interface';
|
|
4
|
-
import type { DNSResolver } from '@multiformats/dns/resolvers';
|
|
5
4
|
interface VerifiedFetchComponents {
|
|
6
5
|
helia: Helia;
|
|
7
6
|
ipns?: IPNS;
|
|
8
7
|
}
|
|
9
|
-
/**
|
|
10
|
-
* Potential future options for the VerifiedFetch constructor.
|
|
11
|
-
*/
|
|
12
|
-
interface VerifiedFetchInit {
|
|
13
|
-
contentTypeParser?: ContentTypeParser;
|
|
14
|
-
dnsResolvers?: DNSResolver[];
|
|
15
|
-
}
|
|
16
8
|
export declare class VerifiedFetch {
|
|
17
9
|
private readonly helia;
|
|
18
10
|
private readonly ipns;
|
|
19
11
|
private readonly log;
|
|
20
12
|
private readonly contentTypeParser;
|
|
21
|
-
|
|
13
|
+
private readonly blockstoreSessions;
|
|
14
|
+
constructor({ helia, ipns }: VerifiedFetchComponents, init?: CreateVerifiedFetchOptions);
|
|
15
|
+
private getBlockstore;
|
|
22
16
|
/**
|
|
23
17
|
* Accepts an `ipns://...` URL as a string and returns a `Response` containing
|
|
24
18
|
* a raw IPNS record.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,IAAI,EAAE,MAAM,aAAa,CAAA;AA+B1D,OAAO,KAAK,EAAgC,0BAA0B,EAAE,QAAQ,EAAE,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAG/I,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,kBAAkB,CAAA;AAQhE,UAAU,uBAAuB;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ;AA0FD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqC;gBAE3D,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,uBAAuB,EAAE,IAAI,CAAC,EAAE,0BAA0B;IAexF,OAAO,CAAC,aAAa;IAerB;;;OAGG;YACW,gBAAgB;IAgC9B;;;OAGG;YACW,SAAS;IAWvB;;;OAGG;YACW,SAAS;YAcT,UAAU;YA2BV,aAAa;YA0Eb,WAAW;YAgHX,SAAS;YAiBT,cAAc;IA0B5B;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAO7B;IAED;;;;;;OAMG;IACG,KAAK,CAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgHhF;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAI7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -9,6 +9,7 @@ import { peerIdFromString } from '@libp2p/peer-id';
|
|
|
9
9
|
import { Key } from 'interface-datastore';
|
|
10
10
|
import { exporter } from 'ipfs-unixfs-exporter';
|
|
11
11
|
import toBrowserReadableStream from 'it-to-browser-readablestream';
|
|
12
|
+
import { LRUCache } from 'lru-cache';
|
|
12
13
|
import { code as jsonCode } from 'multiformats/codecs/json';
|
|
13
14
|
import { code as rawCode } from 'multiformats/codecs/raw';
|
|
14
15
|
import { identity } from 'multiformats/hashes/identity';
|
|
@@ -24,10 +25,13 @@ import { getResolvedAcceptHeader } from './utils/get-resolved-accept-header.js';
|
|
|
24
25
|
import { getStreamFromAsyncIterable } from './utils/get-stream-from-async-iterable.js';
|
|
25
26
|
import { tarStream } from './utils/get-tar-stream.js';
|
|
26
27
|
import { parseResource } from './utils/parse-resource.js';
|
|
28
|
+
import { resourceToSessionCacheKey } from './utils/resource-to-cache-key.js';
|
|
27
29
|
import { setCacheControlHeader } from './utils/response-headers.js';
|
|
28
30
|
import { badRequestResponse, movedPermanentlyResponse, notAcceptableResponse, notSupportedResponse, okResponse, badRangeResponse, okRangeResponse, badGatewayResponse, notFoundResponse } from './utils/responses.js';
|
|
29
31
|
import { selectOutputType } from './utils/select-output-type.js';
|
|
30
32
|
import { isObjectNode, walkPath } from './utils/walk-path.js';
|
|
33
|
+
const SESSION_CACHE_MAX_SIZE = 100;
|
|
34
|
+
const SESSION_CACHE_TTL_MS = 60 * 1000;
|
|
31
35
|
function convertOptions(options) {
|
|
32
36
|
if (options == null) {
|
|
33
37
|
return undefined;
|
|
@@ -80,13 +84,32 @@ export class VerifiedFetch {
|
|
|
80
84
|
ipns;
|
|
81
85
|
log;
|
|
82
86
|
contentTypeParser;
|
|
87
|
+
blockstoreSessions;
|
|
83
88
|
constructor({ helia, ipns }, init) {
|
|
84
89
|
this.helia = helia;
|
|
85
90
|
this.log = helia.logger.forComponent('helia:verified-fetch');
|
|
86
91
|
this.ipns = ipns ?? heliaIpns(helia);
|
|
87
92
|
this.contentTypeParser = init?.contentTypeParser;
|
|
93
|
+
this.blockstoreSessions = new LRUCache({
|
|
94
|
+
max: init?.sessionCacheSize ?? SESSION_CACHE_MAX_SIZE,
|
|
95
|
+
ttl: init?.sessionTTLms ?? SESSION_CACHE_TTL_MS,
|
|
96
|
+
dispose: (store) => {
|
|
97
|
+
store.close();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
88
100
|
this.log.trace('created VerifiedFetch instance');
|
|
89
101
|
}
|
|
102
|
+
getBlockstore(root, key, useSession, options) {
|
|
103
|
+
if (!useSession) {
|
|
104
|
+
return this.helia.blockstore;
|
|
105
|
+
}
|
|
106
|
+
let session = this.blockstoreSessions.get(key);
|
|
107
|
+
if (session == null) {
|
|
108
|
+
session = this.helia.blockstore.createSession(root, options);
|
|
109
|
+
this.blockstoreSessions.set(key, session);
|
|
110
|
+
}
|
|
111
|
+
return session;
|
|
112
|
+
}
|
|
90
113
|
/**
|
|
91
114
|
* Accepts an `ipns://...` URL as a string and returns a `Response` containing
|
|
92
115
|
* a raw IPNS record.
|
|
@@ -121,8 +144,9 @@ export class VerifiedFetch {
|
|
|
121
144
|
* Accepts a `CID` and returns a `Response` with a body stream that is a CAR
|
|
122
145
|
* of the `DAG` referenced by the `CID`.
|
|
123
146
|
*/
|
|
124
|
-
async handleCar({ resource, cid, options }) {
|
|
125
|
-
const
|
|
147
|
+
async handleCar({ resource, cid, session, cacheKey, options }) {
|
|
148
|
+
const blockstore = this.getBlockstore(cid, cacheKey, session, options);
|
|
149
|
+
const c = car({ blockstore, dagWalkers: this.helia.dagWalkers });
|
|
126
150
|
const stream = toBrowserReadableStream(c.stream(cid, options));
|
|
127
151
|
const response = okResponse(resource, stream);
|
|
128
152
|
response.headers.set('content-type', 'application/vnd.ipld.car; version=1');
|
|
@@ -132,18 +156,20 @@ export class VerifiedFetch {
|
|
|
132
156
|
* Accepts a UnixFS `CID` and returns a `.tar` file containing the file or
|
|
133
157
|
* directory structure referenced by the `CID`.
|
|
134
158
|
*/
|
|
135
|
-
async handleTar({ resource, cid, path, options }) {
|
|
159
|
+
async handleTar({ resource, cid, path, session, cacheKey, options }) {
|
|
136
160
|
if (cid.code !== dagPbCode && cid.code !== rawCode) {
|
|
137
161
|
return notAcceptableResponse('only UnixFS data can be returned in a TAR file');
|
|
138
162
|
}
|
|
139
|
-
const
|
|
163
|
+
const blockstore = this.getBlockstore(cid, cacheKey, session, options);
|
|
164
|
+
const stream = toBrowserReadableStream(tarStream(`/ipfs/${cid}/${path}`, blockstore, options));
|
|
140
165
|
const response = okResponse(resource, stream);
|
|
141
166
|
response.headers.set('content-type', 'application/x-tar');
|
|
142
167
|
return response;
|
|
143
168
|
}
|
|
144
|
-
async handleJson({ resource, cid, path, accept, options }) {
|
|
169
|
+
async handleJson({ resource, cid, path, accept, session, cacheKey, options }) {
|
|
145
170
|
this.log.trace('fetching %c/%s', cid, path);
|
|
146
|
-
const
|
|
171
|
+
const blockstore = this.getBlockstore(cid, cacheKey, session, options);
|
|
172
|
+
const block = await blockstore.get(cid, options);
|
|
147
173
|
let body;
|
|
148
174
|
if (accept === 'application/vnd.ipld.dag-cbor' || accept === 'application/cbor') {
|
|
149
175
|
try {
|
|
@@ -166,13 +192,14 @@ export class VerifiedFetch {
|
|
|
166
192
|
response.headers.set('content-type', accept ?? 'application/json');
|
|
167
193
|
return response;
|
|
168
194
|
}
|
|
169
|
-
async handleDagCbor({ resource, cid, path, accept, options }) {
|
|
195
|
+
async handleDagCbor({ resource, cid, path, accept, session, cacheKey, options }) {
|
|
170
196
|
this.log.trace('fetching %c/%s', cid, path);
|
|
171
197
|
let terminalElement;
|
|
172
198
|
let ipfsRoots;
|
|
199
|
+
const blockstore = this.getBlockstore(cid, cacheKey, session, options);
|
|
173
200
|
// need to walk path, if it exists, to get the terminal element
|
|
174
201
|
try {
|
|
175
|
-
const pathDetails = await walkPath(
|
|
202
|
+
const pathDetails = await walkPath(blockstore, `${cid.toString()}/${path}`, options);
|
|
176
203
|
ipfsRoots = pathDetails.ipfsRoots;
|
|
177
204
|
const potentialTerminalElement = pathDetails.terminalElement;
|
|
178
205
|
if (potentialTerminalElement == null) {
|
|
@@ -190,7 +217,7 @@ export class VerifiedFetch {
|
|
|
190
217
|
this.log.error('error walking path %s', path, err);
|
|
191
218
|
return badGatewayResponse(resource, 'Error walking path');
|
|
192
219
|
}
|
|
193
|
-
const block = terminalElement?.node ?? await
|
|
220
|
+
const block = terminalElement?.node ?? await blockstore.get(cid, options);
|
|
194
221
|
let body;
|
|
195
222
|
if (accept === 'application/octet-stream' || accept === 'application/vnd.ipld.dag-cbor' || accept === 'application/cbor') {
|
|
196
223
|
// skip decoding
|
|
@@ -232,13 +259,14 @@ export class VerifiedFetch {
|
|
|
232
259
|
}
|
|
233
260
|
return response;
|
|
234
261
|
}
|
|
235
|
-
async handleDagPb({ cid, path, resource, options }) {
|
|
262
|
+
async handleDagPb({ cid, path, resource, cacheKey, session, options }) {
|
|
236
263
|
let terminalElement;
|
|
237
264
|
let ipfsRoots;
|
|
238
265
|
let redirected = false;
|
|
239
266
|
const byteRangeContext = new ByteRangeContext(this.helia.logger, options?.headers);
|
|
267
|
+
const blockstore = this.getBlockstore(cid, cacheKey, session, options);
|
|
240
268
|
try {
|
|
241
|
-
const pathDetails = await walkPath(
|
|
269
|
+
const pathDetails = await walkPath(blockstore, `${cid.toString()}/${path}`, options);
|
|
242
270
|
ipfsRoots = pathDetails.ipfsRoots;
|
|
243
271
|
terminalElement = pathDetails.terminalElement;
|
|
244
272
|
}
|
|
@@ -332,9 +360,10 @@ export class VerifiedFetch {
|
|
|
332
360
|
return badGatewayResponse(resource.toString(), 'Unable to stream content');
|
|
333
361
|
}
|
|
334
362
|
}
|
|
335
|
-
async handleRaw({ resource, cid, path, options, accept }) {
|
|
363
|
+
async handleRaw({ resource, cid, path, session, cacheKey, options, accept }) {
|
|
336
364
|
const byteRangeContext = new ByteRangeContext(this.helia.logger, options?.headers);
|
|
337
|
-
const
|
|
365
|
+
const blockstore = this.getBlockstore(cid, cacheKey, session, options);
|
|
366
|
+
const result = await blockstore.get(cid, options);
|
|
338
367
|
byteRangeContext.setBody(result);
|
|
339
368
|
const response = okRangeResponse(resource, byteRangeContext.getBody(), { byteRangeContext, log: this.log }, {
|
|
340
369
|
redirected: false
|
|
@@ -422,7 +451,8 @@ export class VerifiedFetch {
|
|
|
422
451
|
}
|
|
423
452
|
let response;
|
|
424
453
|
let reqFormat;
|
|
425
|
-
const
|
|
454
|
+
const cacheKey = resourceToSessionCacheKey(resource);
|
|
455
|
+
const handlerArgs = { resource: resource.toString(), cid, path, accept, cacheKey, session: options?.session ?? true, options };
|
|
426
456
|
if (accept === 'application/vnd.ipfs.ipns-record') {
|
|
427
457
|
// the user requested a raw IPNS record
|
|
428
458
|
reqFormat = 'ipns-record';
|