@helia/verified-fetch 4.0.0 → 4.0.2
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 +7 -49
- package/dist/index.min.js +56 -51
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +12 -52
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +8 -50
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugins/index.d.ts +0 -1
- package/dist/src/plugins/index.d.ts.map +1 -1
- package/dist/src/plugins/index.js +0 -1
- package/dist/src/plugins/index.js.map +1 -1
- package/dist/src/plugins/plugin-base.d.ts.map +1 -1
- package/dist/src/plugins/plugin-base.js +3 -2
- package/dist/src/plugins/plugin-base.js.map +1 -1
- package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-car.js +0 -1
- package/dist/src/plugins/plugin-handle-car.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts +3 -3
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js +5 -6
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor.js +0 -1
- package/dist/src/plugins/plugin-handle-dag-cbor.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-pb.js +34 -39
- package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-walk.d.ts +8 -4
- package/dist/src/plugins/plugin-handle-dag-walk.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-walk.js +8 -5
- package/dist/src/plugins/plugin-handle-dag-walk.js.map +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.js +4 -6
- package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -1
- package/dist/src/plugins/plugin-handle-json.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-json.js +0 -1
- package/dist/src/plugins/plugin-handle-json.js.map +1 -1
- package/dist/src/plugins/plugin-handle-raw.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-raw.js +4 -8
- package/dist/src/plugins/plugin-handle-raw.js.map +1 -1
- package/dist/src/plugins/plugin-handle-tar.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-tar.js +0 -1
- package/dist/src/plugins/plugin-handle-tar.js.map +1 -1
- package/dist/src/plugins/types.d.ts +6 -11
- package/dist/src/plugins/types.d.ts.map +1 -1
- package/dist/src/url-resolver.d.ts +4 -3
- package/dist/src/url-resolver.d.ts.map +1 -1
- package/dist/src/url-resolver.js +35 -47
- package/dist/src/url-resolver.js.map +1 -1
- package/dist/src/utils/byte-range-context.d.ts +2 -2
- package/dist/src/utils/byte-range-context.d.ts.map +1 -1
- package/dist/src/utils/byte-range-context.js +1 -1
- package/dist/src/utils/byte-range-context.js.map +1 -1
- package/dist/src/utils/content-type-parser.d.ts.map +1 -1
- package/dist/src/utils/content-type-parser.js +0 -10
- package/dist/src/utils/content-type-parser.js.map +1 -1
- package/dist/src/utils/dnslink-label.d.ts +26 -0
- package/dist/src/utils/dnslink-label.d.ts.map +1 -0
- package/dist/src/utils/dnslink-label.js +35 -0
- package/dist/src/utils/dnslink-label.js.map +1 -0
- package/dist/src/utils/error-to-object.d.ts +6 -0
- package/dist/src/utils/error-to-object.d.ts.map +1 -0
- package/dist/src/utils/error-to-object.js +20 -0
- package/dist/src/utils/error-to-object.js.map +1 -0
- package/dist/src/utils/get-content-type.d.ts +1 -1
- package/dist/src/utils/get-content-type.d.ts.map +1 -1
- package/dist/src/utils/get-content-type.js +1 -1
- package/dist/src/utils/get-content-type.js.map +1 -1
- package/dist/src/utils/get-stream-from-async-iterable.d.ts +1 -2
- package/dist/src/utils/get-stream-from-async-iterable.d.ts.map +1 -1
- package/dist/src/utils/get-stream-from-async-iterable.js +1 -3
- package/dist/src/utils/get-stream-from-async-iterable.js.map +1 -1
- package/dist/src/utils/handle-redirects.js +2 -2
- package/dist/src/utils/ipfs-path-to-url.d.ts +16 -0
- package/dist/src/utils/ipfs-path-to-url.d.ts.map +1 -0
- package/dist/src/utils/ipfs-path-to-url.js +45 -0
- package/dist/src/utils/ipfs-path-to-url.js.map +1 -0
- package/dist/src/utils/parse-url-string.d.ts +18 -5
- package/dist/src/utils/parse-url-string.d.ts.map +1 -1
- package/dist/src/utils/parse-url-string.js +126 -44
- package/dist/src/utils/parse-url-string.js.map +1 -1
- package/dist/src/utils/resource-to-cache-key.js +2 -2
- package/dist/src/utils/responses.d.ts +2 -1
- package/dist/src/utils/responses.d.ts.map +1 -1
- package/dist/src/utils/responses.js +16 -1
- package/dist/src/utils/responses.js.map +1 -1
- package/dist/src/utils/walk-path.js +1 -1
- package/dist/src/utils/walk-path.js.map +1 -1
- package/dist/src/verified-fetch.d.ts.map +1 -1
- package/dist/src/verified-fetch.js +36 -28
- package/dist/src/verified-fetch.js.map +1 -1
- package/dist/typedoc-urls.json +0 -2
- package/package.json +10 -10
- package/src/index.ts +12 -52
- package/src/plugins/index.ts +0 -1
- package/src/plugins/plugin-base.ts +3 -2
- package/src/plugins/plugin-handle-car.ts +0 -2
- package/src/plugins/plugin-handle-dag-cbor-html-preview.ts +10 -9
- package/src/plugins/plugin-handle-dag-cbor.ts +3 -1
- package/src/plugins/plugin-handle-dag-pb.ts +49 -37
- package/src/plugins/plugin-handle-dag-walk.ts +10 -5
- package/src/plugins/plugin-handle-ipns-record.ts +6 -6
- package/src/plugins/plugin-handle-json.ts +1 -1
- package/src/plugins/plugin-handle-raw.ts +7 -8
- package/src/plugins/plugin-handle-tar.ts +2 -1
- package/src/plugins/types.ts +7 -12
- package/src/url-resolver.ts +37 -56
- package/src/utils/byte-range-context.ts +3 -3
- package/src/utils/content-type-parser.ts +5 -11
- package/src/utils/dnslink-label.ts +38 -0
- package/src/utils/error-to-object.ts +22 -0
- package/src/utils/get-content-type.ts +2 -2
- package/src/utils/get-stream-from-async-iterable.ts +1 -4
- package/src/utils/handle-redirects.ts +2 -2
- package/src/utils/ipfs-path-to-url.ts +54 -0
- package/src/utils/parse-url-string.ts +166 -49
- package/src/utils/resource-to-cache-key.ts +2 -2
- package/src/utils/responses.ts +21 -1
- package/src/utils/walk-path.ts +1 -1
- package/src/verified-fetch.ts +46 -28
- package/dist/src/plugins/errors.d.ts +0 -25
- package/dist/src/plugins/errors.d.ts.map +0 -1
- package/dist/src/plugins/errors.js +0 -33
- package/dist/src/plugins/errors.js.map +0 -1
- package/src/plugins/errors.ts +0 -37
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { InvalidParametersError } from '@libp2p/interface';
|
|
2
|
+
/**
|
|
3
|
+
* Turns an IPFS or IPNS path into a HTTP URL. Path gateway syntax is used to
|
|
4
|
+
* preserve any case sensitivity
|
|
5
|
+
*
|
|
6
|
+
* - `/ipfs/cid` -> `https://example.org/ipfs/cid`
|
|
7
|
+
* - `/ipns/name` -> `https://example.org/ipns/name`
|
|
8
|
+
*/
|
|
9
|
+
export function ipfsPathToUrl(path) {
|
|
10
|
+
if (!path.startsWith('/ipfs/') && !path.startsWith('/ipns/')) {
|
|
11
|
+
throw new InvalidParametersError(`Path ${path} did not start with /ipfs/ or /ipns/`);
|
|
12
|
+
}
|
|
13
|
+
// trim fragment
|
|
14
|
+
const fragmentIndex = path.indexOf('#');
|
|
15
|
+
let fragment = '';
|
|
16
|
+
if (fragmentIndex > -1) {
|
|
17
|
+
fragment = path.substring(fragmentIndex);
|
|
18
|
+
path = path.substring(0, fragmentIndex);
|
|
19
|
+
}
|
|
20
|
+
// trim query
|
|
21
|
+
const queryIndex = path.indexOf('?');
|
|
22
|
+
let query = '';
|
|
23
|
+
if (queryIndex > -1) {
|
|
24
|
+
query = path.substring(queryIndex);
|
|
25
|
+
path = path.substring(0, queryIndex);
|
|
26
|
+
}
|
|
27
|
+
const type = path.substring(1, 5);
|
|
28
|
+
const rest = path.substring(6);
|
|
29
|
+
return `https://example.org/${type}/${rest}${query}${fragment}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Turns an IPFS or IPNS URL into a HTTP URL. Path gateway syntax is used to
|
|
33
|
+
* preserve and case sensitivity
|
|
34
|
+
*
|
|
35
|
+
* `ipfs://cid` -> `https://example.org/ipfs/cid`
|
|
36
|
+
*/
|
|
37
|
+
export function ipfsUrlToUrl(url) {
|
|
38
|
+
if (!url.startsWith('ipfs://') && !url.startsWith('ipns://')) {
|
|
39
|
+
throw new InvalidParametersError(`URL ${url} did not start with ipfs:// or ipns://`);
|
|
40
|
+
}
|
|
41
|
+
const type = url.substring(0, 4);
|
|
42
|
+
const rest = url.substring(7);
|
|
43
|
+
return `https://example.org/${type}/${rest}`;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=ipfs-path-to-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipfs-path-to-url.js","sourceRoot":"","sources":["../../../src/utils/ipfs-path-to-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAE,IAAY;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,sBAAsB,CAAC,QAAQ,IAAI,sCAAsC,CAAC,CAAA;IACtF,CAAC;IAED,gBAAgB;IAChB,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACvC,IAAI,QAAQ,GAAG,EAAE,CAAA;IAEjB,IAAI,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;QACvB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;QACxC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;IACzC,CAAC;IAED,aAAa;IACb,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACpC,IAAI,KAAK,GAAG,EAAE,CAAA;IAEd,IAAI,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;QACpB,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAClC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;IACtC,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAE9B,OAAO,uBAAuB,IAAI,IAAI,IAAI,GAAG,KAAK,GAAG,QAAQ,EAAE,CAAA;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAE,GAAW;IACvC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,sBAAsB,CAAC,OAAO,GAAG,wCAAwC,CAAC,CAAA;IACtF,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAE7B,OAAO,uBAAuB,IAAI,IAAI,IAAI,EAAE,CAAA;AAC9C,CAAC"}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
-
interface
|
|
1
|
+
export interface ParsedURL {
|
|
2
|
+
url: URL;
|
|
2
3
|
protocol: 'ipfs' | 'ipns';
|
|
3
4
|
cidOrPeerIdOrDnsLink: string;
|
|
4
|
-
path
|
|
5
|
-
query
|
|
5
|
+
path: string[];
|
|
6
|
+
query: Record<string, any>;
|
|
7
|
+
fragment: string;
|
|
6
8
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Accepts the following url strings:
|
|
11
|
+
*
|
|
12
|
+
* - /ipfs/Qmfoo/path
|
|
13
|
+
* - /ipns/Qmfoo/path
|
|
14
|
+
* - ipfs://cid/path
|
|
15
|
+
* - ipns://name/path
|
|
16
|
+
* - http://cid.ipfs.example.com/path
|
|
17
|
+
* - http://name.ipns.example.com/path
|
|
18
|
+
* - http://example.com/ipfs/cid/path
|
|
19
|
+
* - http://example.com/ipns/name/path
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseURLString(urlString: string): ParsedURL;
|
|
9
22
|
//# sourceMappingURL=parse-url-string.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,GAAG,CAAC;IACT,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;CACjB;AAqED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CA8E5D"}
|
|
@@ -1,63 +1,145 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const SUBDOMAIN_GATEWAY_REGEX = /^
|
|
5
|
-
function
|
|
1
|
+
import { InvalidParametersError } from '@libp2p/interface';
|
|
2
|
+
import { decodeDNSLinkLabel, isInlinedDnsLink } from "./dnslink-label.js";
|
|
3
|
+
import { ipfsPathToUrl, ipfsUrlToUrl } from "./ipfs-path-to-url.js";
|
|
4
|
+
const SUBDOMAIN_GATEWAY_REGEX = /^(?<cidOrPeerIdOrDnsLink>[^/?]+)\.(?<protocol>ip[fn]s)\.([^/?]+)$/;
|
|
5
|
+
function matchSubdomainGroupsGuard(groups) {
|
|
6
6
|
const protocol = groups?.protocol;
|
|
7
|
-
if (protocol
|
|
7
|
+
if (protocol !== 'ipfs' && protocol !== 'ipns') {
|
|
8
8
|
return false;
|
|
9
9
|
}
|
|
10
10
|
const cidOrPeerIdOrDnsLink = groups?.cidOrPeerIdOrDnsLink;
|
|
11
11
|
if (cidOrPeerIdOrDnsLink == null) {
|
|
12
12
|
return false;
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
const query = groups?.query;
|
|
16
|
-
return ['ipns', 'ipfs'].includes(protocol) &&
|
|
17
|
-
typeof cidOrPeerIdOrDnsLink === 'string' &&
|
|
18
|
-
(path == null || typeof path === 'string') &&
|
|
19
|
-
(query == null || typeof query === 'string');
|
|
14
|
+
return true;
|
|
20
15
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
return groups;
|
|
16
|
+
function toQuery(query) {
|
|
17
|
+
if (query == null) {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
const output = {};
|
|
21
|
+
for (const [key, value] of query.entries()) {
|
|
22
|
+
output[key] = value;
|
|
23
|
+
if (value === 'true') {
|
|
24
|
+
output[key] = true;
|
|
25
|
+
}
|
|
26
|
+
if (value === 'false') {
|
|
27
|
+
output[key] = false;
|
|
35
28
|
}
|
|
36
29
|
}
|
|
37
|
-
|
|
30
|
+
return output;
|
|
31
|
+
}
|
|
32
|
+
function stripLeadingHash(pathname) {
|
|
33
|
+
return stripLeading(pathname, '#');
|
|
34
|
+
}
|
|
35
|
+
function stripLeading(str, char) {
|
|
36
|
+
while (str.startsWith(char)) {
|
|
37
|
+
str = str.substring(1);
|
|
38
|
+
}
|
|
39
|
+
return str;
|
|
38
40
|
}
|
|
39
41
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
|
|
43
|
-
// DNS label can have up to 63 characters, consisting of alphanumeric
|
|
44
|
-
// characters or hyphens -, but it must not start or end with a hyphen.
|
|
45
|
-
const dnsLabelRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?$/;
|
|
46
|
-
/**
|
|
47
|
-
* Checks if label looks like inlined DNSLink.
|
|
48
|
-
* (https://specs.ipfs.tech/http-gateways/subdomain-gateway/#host-request-header)
|
|
42
|
+
* If the caller has passed a case-sensitive identifier (like a base58btc
|
|
43
|
+
* encoded CID or PeerId) in a case-insensitive location (like a subdomain),
|
|
44
|
+
* be nice and return the original identifier from the passed string
|
|
49
45
|
*/
|
|
50
|
-
function
|
|
51
|
-
|
|
46
|
+
function findOriginalCidOrPeer(needle, haystack) {
|
|
47
|
+
const start = haystack.toLowerCase().indexOf(needle);
|
|
48
|
+
if (start === -1) {
|
|
49
|
+
return needle;
|
|
50
|
+
}
|
|
51
|
+
return haystack.substring(start, start + needle.length);
|
|
52
|
+
}
|
|
53
|
+
function toUrl(urlString) {
|
|
54
|
+
// turn IPFS/IPNS path into gateway URL string
|
|
55
|
+
if (urlString.startsWith('/ipfs/') || urlString.startsWith('/ipns/')) {
|
|
56
|
+
urlString = ipfsPathToUrl(urlString);
|
|
57
|
+
}
|
|
58
|
+
// turn IPFS/IPNS URL into gateway URL string
|
|
59
|
+
if (urlString.startsWith('ipfs://') || urlString.startsWith('ipns://')) {
|
|
60
|
+
urlString = ipfsUrlToUrl(urlString);
|
|
61
|
+
}
|
|
62
|
+
if (urlString.startsWith('http://') || urlString.startsWith('https://')) {
|
|
63
|
+
return new URL(urlString);
|
|
64
|
+
}
|
|
65
|
+
throw new InvalidParametersError(`Invalid URL: ${urlString}`);
|
|
52
66
|
}
|
|
53
67
|
/**
|
|
54
|
-
*
|
|
55
|
-
* - Every standalone - is replaced with .
|
|
56
|
-
* - Every remaining -- is replaced with -
|
|
68
|
+
* Accepts the following url strings:
|
|
57
69
|
*
|
|
58
|
-
*
|
|
70
|
+
* - /ipfs/Qmfoo/path
|
|
71
|
+
* - /ipns/Qmfoo/path
|
|
72
|
+
* - ipfs://cid/path
|
|
73
|
+
* - ipns://name/path
|
|
74
|
+
* - http://cid.ipfs.example.com/path
|
|
75
|
+
* - http://name.ipns.example.com/path
|
|
76
|
+
* - http://example.com/ipfs/cid/path
|
|
77
|
+
* - http://example.com/ipns/name/path
|
|
59
78
|
*/
|
|
60
|
-
function
|
|
61
|
-
|
|
79
|
+
export function parseURLString(urlString) {
|
|
80
|
+
// validate url
|
|
81
|
+
const url = toUrl(urlString);
|
|
82
|
+
// test for subdomain gateway URL
|
|
83
|
+
const subdomainMatch = url.hostname.match(SUBDOMAIN_GATEWAY_REGEX);
|
|
84
|
+
if (matchSubdomainGroupsGuard(subdomainMatch?.groups)) {
|
|
85
|
+
const groups = subdomainMatch.groups;
|
|
86
|
+
if (groups.protocol === 'ipns' && isInlinedDnsLink(groups.cidOrPeerIdOrDnsLink)) {
|
|
87
|
+
// decode inline dnslink domain if present
|
|
88
|
+
groups.cidOrPeerIdOrDnsLink = decodeDNSLinkLabel(groups.cidOrPeerIdOrDnsLink);
|
|
89
|
+
}
|
|
90
|
+
const cidOrPeerIdOrDnsLink = findOriginalCidOrPeer(groups.cidOrPeerIdOrDnsLink, urlString);
|
|
91
|
+
// parse url as not http(s):// - this is necessary because URL makes
|
|
92
|
+
// `.pathname` default to `/` for http URLs, even if no trailing slash was
|
|
93
|
+
// present in the string URL and we need to be able to round-trip the user's
|
|
94
|
+
// input while also maintaining a sane canonical URL for the resource. Phew.
|
|
95
|
+
const wat = new URL(`not-${urlString}`);
|
|
96
|
+
return {
|
|
97
|
+
url: new URL(`${groups.protocol}://${cidOrPeerIdOrDnsLink}${wat.pathname}${url.search}${url.hash}`),
|
|
98
|
+
protocol: groups.protocol,
|
|
99
|
+
cidOrPeerIdOrDnsLink,
|
|
100
|
+
path: url.pathname.split('/')
|
|
101
|
+
.filter(str => str !== '')
|
|
102
|
+
.map(str => decodeURIComponent(str)),
|
|
103
|
+
query: toQuery(url.searchParams),
|
|
104
|
+
fragment: stripLeadingHash(url.hash)
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// test for IPFS path gateway URL
|
|
108
|
+
if (url.pathname.startsWith('/ipfs/')) {
|
|
109
|
+
const parts = url.pathname.substring(6).split('/');
|
|
110
|
+
const cid = parts.shift();
|
|
111
|
+
if (cid == null) {
|
|
112
|
+
throw new InvalidParametersError(`Path gateway URL ${urlString} had no CID`);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
url: new URL(`ipfs://${cid}${url.pathname.replace(`/ipfs/${cid}`, '')}${url.search}${url.hash}`),
|
|
116
|
+
protocol: 'ipfs',
|
|
117
|
+
cidOrPeerIdOrDnsLink: cid,
|
|
118
|
+
path: parts
|
|
119
|
+
.filter(str => str !== '')
|
|
120
|
+
.map(str => decodeURIComponent(str)),
|
|
121
|
+
query: toQuery(url.searchParams),
|
|
122
|
+
fragment: stripLeadingHash(url.hash)
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
// test for IPNS path gateway URL
|
|
126
|
+
if (url.pathname.startsWith('/ipns/')) {
|
|
127
|
+
const parts = url.pathname.substring(6).split('/');
|
|
128
|
+
const name = parts.shift();
|
|
129
|
+
if (name == null) {
|
|
130
|
+
throw new InvalidParametersError(`Path gateway URL ${urlString} had no name`);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
url: new URL(`ipns://${name}${url.pathname.replace(`/ipns/${name}`, '')}${url.search}${url.hash}`),
|
|
134
|
+
protocol: 'ipns',
|
|
135
|
+
cidOrPeerIdOrDnsLink: name,
|
|
136
|
+
path: parts
|
|
137
|
+
.filter(str => str !== '')
|
|
138
|
+
.map(str => decodeURIComponent(str)),
|
|
139
|
+
query: toQuery(url.searchParams),
|
|
140
|
+
fragment: stripLeadingHash(url.hash)
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
throw new TypeError(`Invalid URL: ${urlString}, please use ipfs://, ipns://, or gateway URLs only`);
|
|
62
144
|
}
|
|
63
145
|
//# sourceMappingURL=parse-url-string.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-url-string.js","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"parse-url-string.js","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CID } from 'multiformats/cid';
|
|
2
|
-
import {
|
|
2
|
+
import { parseURLString } from './parse-url-string.js';
|
|
3
3
|
/**
|
|
4
4
|
* Takes a resource and returns a session cache key as an IPFS or IPNS path with
|
|
5
5
|
* any trailing segments removed.
|
|
@@ -21,7 +21,7 @@ export function resourceToSessionCacheKey(url) {
|
|
|
21
21
|
return `ipfs://${CID.parse(url.toString())}`;
|
|
22
22
|
}
|
|
23
23
|
catch { }
|
|
24
|
-
const { protocol, cidOrPeerIdOrDnsLink } =
|
|
24
|
+
const { protocol, cidOrPeerIdOrDnsLink } = parseURLString(url.toString());
|
|
25
25
|
return `${protocol}://${cidOrPeerIdOrDnsLink}`;
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=resource-to-cache-key.js.map
|
|
@@ -5,8 +5,9 @@ export interface ResponseOptions extends ResponseInit {
|
|
|
5
5
|
redirected?: boolean;
|
|
6
6
|
}
|
|
7
7
|
export declare function okResponse(url: string, body?: SupportedBodyTypes, init?: ResponseOptions): Response;
|
|
8
|
+
export declare function internalServerErrorResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
|
|
8
9
|
export declare function badGatewayResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
|
|
9
|
-
export declare function
|
|
10
|
+
export declare function notImplementedResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
|
|
10
11
|
export declare function notAcceptableResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
|
|
11
12
|
export declare function notFoundResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
|
|
12
13
|
export declare function badRequestResponse(url: string, errors: Error | Error[], init?: ResponseInit): Response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AA6B/C,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAgB,UAAU,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,CAepG;AAED,wBAAgB,2BAA2B,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAYlH;AAED,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWzG;AAED,wBAAgB,sBAAsB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAY7G;AAED,wBAAgB,qBAAqB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAW5G;AAED,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWvG;AAMD,wBAAgB,kBAAkB,CAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CA+BvG;AAED,wBAAgB,wBAAwB,CAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAetG;AAED,UAAU,YAAY;IACpB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,CA8CjJ;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAWvG"}
|
|
@@ -10,6 +10,10 @@ function setType(response, value) {
|
|
|
10
10
|
setField(response, 'type', value);
|
|
11
11
|
}
|
|
12
12
|
function setUrl(response, value) {
|
|
13
|
+
const fragmentStart = value.indexOf('#');
|
|
14
|
+
if (fragmentStart > -1) {
|
|
15
|
+
value = value.substring(0, fragmentStart);
|
|
16
|
+
}
|
|
13
17
|
setField(response, 'url', value);
|
|
14
18
|
}
|
|
15
19
|
function setRedirected(response) {
|
|
@@ -28,6 +32,17 @@ export function okResponse(url, body, init) {
|
|
|
28
32
|
setUrl(response, url);
|
|
29
33
|
return response;
|
|
30
34
|
}
|
|
35
|
+
export function internalServerErrorResponse(url, body, init) {
|
|
36
|
+
const response = new Response(body, {
|
|
37
|
+
...(init ?? {}),
|
|
38
|
+
status: 500,
|
|
39
|
+
statusText: 'Internal Server Error'
|
|
40
|
+
});
|
|
41
|
+
response.headers.set('X-Content-Type-Options', 'nosniff'); // see https://specs.ipfs.tech/http-gateways/path-gateway/#x-content-type-options-response-header
|
|
42
|
+
setType(response, 'basic');
|
|
43
|
+
setUrl(response, url);
|
|
44
|
+
return response;
|
|
45
|
+
}
|
|
31
46
|
export function badGatewayResponse(url, body, init) {
|
|
32
47
|
const response = new Response(body, {
|
|
33
48
|
...(init ?? {}),
|
|
@@ -38,7 +53,7 @@ export function badGatewayResponse(url, body, init) {
|
|
|
38
53
|
setUrl(response, url);
|
|
39
54
|
return response;
|
|
40
55
|
}
|
|
41
|
-
export function
|
|
56
|
+
export function notImplementedResponse(url, body, init) {
|
|
42
57
|
const response = new Response(body, {
|
|
43
58
|
...(init ?? {}),
|
|
44
59
|
status: 501,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"AAIA,SAAS,QAAQ,CAAE,QAAkB,EAAE,IAAY,EAAE,KAAuB;IAC1E,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE;QACpC,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,KAAK;QACnB,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;QACb,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;KACjB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,OAAO,CAAE,QAAkB,EAAE,KAA+D;IACnG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AACnC,CAAC;AAED,SAAS,MAAM,CAAE,QAAkB,EAAE,KAAa;IAChD,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,aAAa,CAAE,QAAkB;IACxC,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;AACxC,CAAC;AAMD,MAAM,UAAU,UAAU,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAsB;IACxF,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,IAAI;KACjB,CAAC,CAAA;IAEF,IAAI,IAAI,EAAE,UAAU,KAAK,IAAI,EAAE,CAAC;QAC9B,aAAa,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC;IAED,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAE,GAAW,EAAE,IAAyB,EAAE,IAAmB;IAC7F,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,aAAa;KAC1B,CAAC,CAAA;IAEF,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC1B,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAErB,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ export function isObjectNode(node) {
|
|
|
29
29
|
*/
|
|
30
30
|
export async function handlePathWalking({ cid, path, resource, options, blockstore, log }) {
|
|
31
31
|
try {
|
|
32
|
-
return await walkPath(blockstore, `${cid
|
|
32
|
+
return await walkPath(blockstore, `${cid}/${path.join('/')}`, options);
|
|
33
33
|
}
|
|
34
34
|
catch (err) {
|
|
35
35
|
if (options?.signal?.aborted) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walk-path.js","sourceRoot":"","sources":["../../../src/utils/walk-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAmBrE,KAAK,UAAU,QAAQ,CAAE,UAA2B,EAAE,IAAY,EAAE,OAA2B;IAC7F,MAAM,SAAS,GAAU,EAAE,CAAA;IAC3B,IAAI,eAAwC,CAAA;IAE5C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzB,eAAe,GAAG,KAAK,CAAA;IACzB,CAAC;IAED,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,SAAS;QACT,eAAe;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,IAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAA2D;IACjJ,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"walk-path.js","sourceRoot":"","sources":["../../../src/utils/walk-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAmBrE,KAAK,UAAU,QAAQ,CAAE,UAA2B,EAAE,IAAY,EAAE,OAA2B;IAC7F,MAAM,SAAS,GAAU,EAAE,CAAA;IAC3B,IAAI,eAAwC,CAAA;IAE5C,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzB,eAAe,GAAG,KAAK,CAAA;IACzB,CAAC;IAED,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,iBAAiB,CAAC,2BAA2B,CAAC,CAAA;IAC1D,CAAC;IAED,OAAO;QACL,SAAS;QACT,eAAe;KAChB,CAAA;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,IAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAA;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAA2D;IACjJ,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,UAAU,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACxE,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC/C,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,yBAAyB,EAAE,eAAe,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnF,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QACpD,OAAO,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAgC,0BAA0B,EAAoB,QAAQ,EAAkB,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAIjL,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,kBAAkB,CAAA;AA2BhE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqC;IACxE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAEvC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,0BAA+B;
|
|
1
|
+
{"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAgC,0BAA0B,EAAoB,QAAQ,EAAkB,iBAAiB,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAIjL,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,kBAAkB,CAAA;AA2BhE,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqC;IACxE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAEvC,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,0BAA+B;IAoDhE,OAAO,CAAC,aAAa;IAgBrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA2F3B;;;OAGG;YACW,iBAAiB;IAiG/B;;;;;;OAMG;IACG,KAAK,CAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+EhF;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAI7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { dnsLink } from '@helia/dnslink';
|
|
2
2
|
import { ipnsResolver } from '@helia/ipns';
|
|
3
3
|
import { AbortError } from '@libp2p/interface';
|
|
4
|
-
import { prefixLogger } from '@libp2p/logger';
|
|
5
4
|
import { CustomProgressEvent } from 'progress-events';
|
|
6
5
|
import QuickLRU from 'quick-lru';
|
|
7
6
|
import { ByteRangeContextPlugin } from './plugins/plugin-handle-byte-range-context.js';
|
|
@@ -15,6 +14,7 @@ import { RawPlugin } from './plugins/plugin-handle-raw.js';
|
|
|
15
14
|
import { TarPlugin } from './plugins/plugin-handle-tar.js';
|
|
16
15
|
import { URLResolver } from "./url-resolver.js";
|
|
17
16
|
import { contentTypeParser } from './utils/content-type-parser.js';
|
|
17
|
+
import { errorToObject } from "./utils/error-to-object.js";
|
|
18
18
|
import { getContentDispositionFilename } from './utils/get-content-disposition-filename.js';
|
|
19
19
|
import { getETag } from './utils/get-e-tag.js';
|
|
20
20
|
import { getResolvedAcceptHeader } from './utils/get-resolved-accept-header.js';
|
|
@@ -22,7 +22,7 @@ import { getRedirectResponse } from './utils/handle-redirects.js';
|
|
|
22
22
|
import { uriEncodeIPFSPath } from "./utils/ipfs-path-to-string.js";
|
|
23
23
|
import { resourceToSessionCacheKey } from './utils/resource-to-cache-key.js';
|
|
24
24
|
import { setCacheControlHeader } from './utils/response-headers.js';
|
|
25
|
-
import { badRequestResponse, notAcceptableResponse,
|
|
25
|
+
import { badRequestResponse, notAcceptableResponse, internalServerErrorResponse, notImplementedResponse } from './utils/responses.js';
|
|
26
26
|
import { selectOutputType } from './utils/select-output-type.js';
|
|
27
27
|
import { ServerTiming } from './utils/server-timing.js';
|
|
28
28
|
const SESSION_CACHE_MAX_SIZE = 100;
|
|
@@ -68,7 +68,7 @@ export class VerifiedFetch {
|
|
|
68
68
|
this.withServerTiming = init?.withServerTiming ?? false;
|
|
69
69
|
const pluginOptions = {
|
|
70
70
|
...init,
|
|
71
|
-
logger:
|
|
71
|
+
logger: helia.logger.forComponent('verified-fetch'),
|
|
72
72
|
getBlockstore: (cid, resource, useSession, options) => this.getBlockstore(cid, resource, useSession, options),
|
|
73
73
|
helia,
|
|
74
74
|
contentTypeParser: this.contentTypeParser,
|
|
@@ -97,7 +97,6 @@ export class VerifiedFetch {
|
|
|
97
97
|
else {
|
|
98
98
|
this.plugins = defaultPlugins;
|
|
99
99
|
}
|
|
100
|
-
this.log.trace('created VerifiedFetch instance');
|
|
101
100
|
}
|
|
102
101
|
getBlockstore(root, resource, useSession = true, options = {}) {
|
|
103
102
|
const key = resourceToSessionCacheKey(resource);
|
|
@@ -132,30 +131,23 @@ export class VerifiedFetch {
|
|
|
132
131
|
}
|
|
133
132
|
// set Content-Disposition header
|
|
134
133
|
let contentDisposition;
|
|
135
|
-
this.log.trace('checking for content disposition');
|
|
136
134
|
// force download if requested
|
|
137
135
|
if (context?.query?.download === true) {
|
|
136
|
+
this.log.trace('download requested');
|
|
138
137
|
contentDisposition = 'attachment';
|
|
139
138
|
}
|
|
140
|
-
else {
|
|
141
|
-
this.log.trace('download not requested');
|
|
142
|
-
}
|
|
143
139
|
// override filename if requested
|
|
144
140
|
if (context?.query?.filename != null) {
|
|
141
|
+
this.log.trace('specific filename requested');
|
|
145
142
|
if (contentDisposition == null) {
|
|
146
143
|
contentDisposition = 'inline';
|
|
147
144
|
}
|
|
148
145
|
contentDisposition = `${contentDisposition}; ${getContentDispositionFilename(context.query.filename)}`;
|
|
149
146
|
}
|
|
150
|
-
else {
|
|
151
|
-
this.log.trace('no filename specified in query');
|
|
152
|
-
}
|
|
153
147
|
if (contentDisposition != null) {
|
|
148
|
+
this.log.trace('content disposition %s', contentDisposition);
|
|
154
149
|
response.headers.set('Content-Disposition', contentDisposition);
|
|
155
150
|
}
|
|
156
|
-
else {
|
|
157
|
-
this.log.trace('no content disposition specified');
|
|
158
|
-
}
|
|
159
151
|
if (context?.cid != null && response.headers.get('etag') == null) {
|
|
160
152
|
response.headers.set('etag', getETag({
|
|
161
153
|
cid: context.pathDetails?.terminalElement.cid ?? context.cid,
|
|
@@ -211,28 +203,30 @@ export class VerifiedFetch {
|
|
|
211
203
|
while (passCount < maxPasses) {
|
|
212
204
|
this.log(`starting pipeline pass #${passCount + 1}`);
|
|
213
205
|
passCount++;
|
|
206
|
+
this.log.trace('checking which plugins can handle %c%s with accept %o', context.cid, context.path != null ? `/${context.path}` : '', context.accept);
|
|
214
207
|
// gather plugins that say they can handle the *current* context, but haven't been used yet
|
|
215
208
|
const readyPlugins = this.plugins.filter(p => !pluginsUsed.has(p.id)).filter(p => p.canHandle(context));
|
|
216
209
|
if (readyPlugins.length === 0) {
|
|
217
|
-
this.log.trace('no plugins can handle the current context
|
|
210
|
+
this.log.trace('no plugins can handle the current context, checking by CID code');
|
|
218
211
|
const plugins = this.plugins.filter(p => p.codes.includes(context.cid.code));
|
|
219
212
|
if (plugins.length > 0) {
|
|
220
213
|
readyPlugins.push(...plugins);
|
|
221
214
|
}
|
|
222
215
|
else {
|
|
223
|
-
this.log.trace('no plugins found that can handle request by CID code; exiting pipeline
|
|
216
|
+
this.log.trace('no plugins found that can handle request by CID code; exiting pipeline');
|
|
224
217
|
break;
|
|
225
218
|
}
|
|
226
219
|
}
|
|
227
|
-
this.log.trace('plugins ready to handle request: ', readyPlugins.map(p => p.id).join(', '));
|
|
220
|
+
this.log.trace('plugins ready to handle request: %s', readyPlugins.map(p => p.id).join(', '));
|
|
228
221
|
// track if any plugin changed the context or returned a response
|
|
229
222
|
let contextChanged = false;
|
|
230
223
|
let pluginHandled = false;
|
|
231
224
|
for (const plugin of readyPlugins) {
|
|
232
225
|
try {
|
|
233
|
-
this.log
|
|
226
|
+
this.log('invoking plugin: %s', plugin.id);
|
|
234
227
|
pluginsUsed.add(plugin.id);
|
|
235
228
|
const maybeResponse = await plugin.handle(context);
|
|
229
|
+
this.log('plugin response %s %o', plugin.id, maybeResponse);
|
|
236
230
|
if (maybeResponse != null) {
|
|
237
231
|
// if a plugin returns a final Response, short-circuit
|
|
238
232
|
finalResponse = maybeResponse;
|
|
@@ -244,12 +238,14 @@ export class VerifiedFetch {
|
|
|
244
238
|
if (context.options?.signal?.aborted) {
|
|
245
239
|
throw new AbortError(context.options?.signal?.reason);
|
|
246
240
|
}
|
|
247
|
-
this.log.error('error in plugin %s - %e', plugin.
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
241
|
+
this.log.error('error in plugin %s - %e', plugin.id, err);
|
|
242
|
+
return internalServerErrorResponse(context.resource, JSON.stringify({
|
|
243
|
+
error: errorToObject(err)
|
|
244
|
+
}), {
|
|
245
|
+
headers: {
|
|
246
|
+
'content-type': 'application/json'
|
|
247
|
+
}
|
|
248
|
+
});
|
|
253
249
|
}
|
|
254
250
|
finally {
|
|
255
251
|
// on each plugin call, check for changes in the context
|
|
@@ -272,7 +268,13 @@ export class VerifiedFetch {
|
|
|
272
268
|
break;
|
|
273
269
|
}
|
|
274
270
|
}
|
|
275
|
-
return finalResponse
|
|
271
|
+
return finalResponse ?? notImplementedResponse(context.resource, JSON.stringify({
|
|
272
|
+
error: errorToObject(new Error('No verified fetch plugin could handle the request'))
|
|
273
|
+
}), {
|
|
274
|
+
headers: {
|
|
275
|
+
'content-type': 'application/json'
|
|
276
|
+
}
|
|
277
|
+
});
|
|
276
278
|
}
|
|
277
279
|
/**
|
|
278
280
|
* We're starting to get to the point where we need a queue or pipeline of
|
|
@@ -308,7 +310,7 @@ export class VerifiedFetch {
|
|
|
308
310
|
options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:resolve', { cid: parsedResult.cid, path: parsedResult.path }));
|
|
309
311
|
const acceptHeader = getResolvedAcceptHeader({ query: parsedResult.query, headers: options?.headers, logger: this.helia.logger });
|
|
310
312
|
const accept = selectOutputType(parsedResult.cid, acceptHeader);
|
|
311
|
-
this.log('
|
|
313
|
+
this.log('accept %o', accept);
|
|
312
314
|
if (acceptHeader != null && accept == null) {
|
|
313
315
|
this.log.error('could not fulfil request based on accept header');
|
|
314
316
|
return this.handleFinalResponse(notAcceptableResponse(resource.toString()));
|
|
@@ -332,8 +334,14 @@ export class VerifiedFetch {
|
|
|
332
334
|
};
|
|
333
335
|
this.log.trace('finding handler for cid code "%s" and response content type "%s"', parsedResult.cid.code, responseContentType);
|
|
334
336
|
const response = await this.runPluginPipeline(context);
|
|
335
|
-
options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', {
|
|
336
|
-
|
|
337
|
+
options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', {
|
|
338
|
+
cid: parsedResult.cid,
|
|
339
|
+
path: parsedResult.path
|
|
340
|
+
}));
|
|
341
|
+
if (response == null) {
|
|
342
|
+
this.log.error('no plugin could handle request for %s', resource);
|
|
343
|
+
}
|
|
344
|
+
return this.handleFinalResponse(response, context);
|
|
337
345
|
}
|
|
338
346
|
/**
|
|
339
347
|
* Start the Helia instance
|