@helia/verified-fetch 3.2.2 → 4.0.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 +5 -5
- package/dist/index.min.js +81 -71
- package/dist/index.min.js.map +4 -4
- package/dist/src/constants.d.ts +2 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +2 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/index.d.ts +57 -13
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -6
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-car.js +37 -27
- package/dist/src/plugins/plugin-handle-car.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts +1 -1
- 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 +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-cbor.js +5 -5
- package/dist/src/plugins/plugin-handle-dag-cbor.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-pb.js +12 -12
- package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-walk.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-dag-walk.js +5 -4
- package/dist/src/plugins/plugin-handle-dag-walk.js.map +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-ipns-record.js +13 -19
- 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 +5 -4
- 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 +18 -5
- package/dist/src/plugins/plugin-handle-raw.js.map +1 -1
- package/dist/src/plugins/plugin-handle-tar.js +1 -1
- package/dist/src/plugins/plugin-handle-tar.js.map +1 -1
- package/dist/src/plugins/types.d.ts +10 -8
- package/dist/src/plugins/types.d.ts.map +1 -1
- package/dist/src/url-resolver.d.ts +21 -0
- package/dist/src/url-resolver.d.ts.map +1 -0
- package/dist/src/url-resolver.js +118 -0
- package/dist/src/url-resolver.js.map +1 -0
- package/dist/src/utils/byte-range-context.d.ts +1 -1
- package/dist/src/utils/content-type-parser.d.ts.map +1 -1
- package/dist/src/utils/content-type-parser.js +3 -0
- package/dist/src/utils/content-type-parser.js.map +1 -1
- package/dist/src/utils/get-content-type.d.ts +3 -3
- 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-e-tag.d.ts +1 -1
- package/dist/src/utils/get-offset-and-length.d.ts +6 -0
- package/dist/src/utils/get-offset-and-length.d.ts.map +1 -0
- package/dist/src/utils/get-offset-and-length.js +46 -0
- package/dist/src/utils/get-offset-and-length.js.map +1 -0
- package/dist/src/utils/get-resolved-accept-header.d.ts +2 -2
- package/dist/src/utils/get-resolved-accept-header.d.ts.map +1 -1
- package/dist/src/utils/handle-redirects.d.ts.map +1 -1
- package/dist/src/utils/handle-redirects.js +3 -3
- package/dist/src/utils/handle-redirects.js.map +1 -1
- package/dist/src/utils/ipfs-path-to-string.d.ts +6 -0
- package/dist/src/utils/ipfs-path-to-string.d.ts.map +1 -0
- package/dist/src/utils/ipfs-path-to-string.js +10 -0
- package/dist/src/utils/ipfs-path-to-string.js.map +1 -0
- package/dist/src/utils/is-accept-explicit.d.ts +6 -4
- package/dist/src/utils/is-accept-explicit.d.ts.map +1 -1
- package/dist/src/utils/is-accept-explicit.js +7 -4
- package/dist/src/utils/is-accept-explicit.js.map +1 -1
- package/dist/src/utils/parse-url-string.d.ts +1 -55
- package/dist/src/utils/parse-url-string.d.ts.map +1 -1
- package/dist/src/utils/parse-url-string.js +16 -217
- package/dist/src/utils/parse-url-string.js.map +1 -1
- package/dist/src/utils/response-headers.d.ts +1 -1
- package/dist/src/utils/response-headers.d.ts.map +1 -1
- package/dist/src/utils/responses.d.ts +1 -1
- package/dist/src/utils/select-output-type.d.ts +6 -2
- package/dist/src/utils/select-output-type.d.ts.map +1 -1
- package/dist/src/utils/select-output-type.js +28 -37
- package/dist/src/utils/select-output-type.js.map +1 -1
- package/dist/src/utils/server-timing.d.ts +5 -11
- package/dist/src/utils/server-timing.d.ts.map +1 -1
- package/dist/src/utils/server-timing.js +17 -15
- package/dist/src/utils/server-timing.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 +3 -10
- package/dist/src/verified-fetch.d.ts.map +1 -1
- package/dist/src/verified-fetch.js +68 -57
- package/dist/src/verified-fetch.js.map +1 -1
- package/dist/typedoc-urls.json +13 -2
- package/package.json +35 -36
- package/src/constants.ts +1 -0
- package/src/index.ts +73 -22
- package/src/plugins/plugin-handle-car.ts +54 -30
- package/src/plugins/plugin-handle-dag-cbor-html-preview.ts +2 -2
- package/src/plugins/plugin-handle-dag-cbor.ts +5 -5
- package/src/plugins/plugin-handle-dag-pb.ts +12 -12
- package/src/plugins/plugin-handle-dag-walk.ts +5 -4
- package/src/plugins/plugin-handle-ipns-record.ts +16 -19
- package/src/plugins/plugin-handle-json.ts +5 -4
- package/src/plugins/plugin-handle-raw.ts +21 -6
- package/src/plugins/plugin-handle-tar.ts +1 -1
- package/src/plugins/types.ts +12 -8
- package/src/url-resolver.ts +159 -0
- package/src/utils/byte-range-context.ts +1 -1
- package/src/utils/content-type-parser.ts +3 -0
- package/src/utils/get-content-type.ts +5 -4
- package/src/utils/get-e-tag.ts +1 -1
- package/src/utils/get-offset-and-length.ts +54 -0
- package/src/utils/get-resolved-accept-header.ts +2 -2
- package/src/utils/handle-redirects.ts +10 -3
- package/src/utils/ipfs-path-to-string.ts +9 -0
- package/src/utils/is-accept-explicit.ts +14 -7
- package/src/utils/parse-url-string.ts +20 -286
- package/src/utils/response-headers.ts +1 -1
- package/src/utils/responses.ts +1 -1
- package/src/utils/select-output-type.ts +38 -44
- package/src/utils/server-timing.ts +17 -30
- package/src/utils/walk-path.ts +1 -1
- package/src/verified-fetch.ts +78 -69
- package/dist/src/types.d.ts +0 -16
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -2
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils/parse-resource.d.ts +0 -18
- package/dist/src/utils/parse-resource.d.ts.map +0 -1
- package/dist/src/utils/parse-resource.js +0 -27
- package/dist/src/utils/parse-resource.js.map +0 -1
- package/src/types.ts +0 -17
- package/src/utils/parse-resource.ts +0 -42
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type-parser.js","sourceRoot":"","sources":["../../../src/utils/content-type-parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-type-parser.js","sourceRoot":"","sources":["../../../src/utils/content-type-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { ContentTypeParser } from '../
|
|
1
|
+
import type { ContentTypeParser } from '../index.js';
|
|
2
2
|
import type { Logger } from '@libp2p/interface';
|
|
3
3
|
export interface GetContentTypeOptions {
|
|
4
4
|
bytes: Uint8Array;
|
|
5
|
-
path
|
|
5
|
+
path?: string;
|
|
6
6
|
defaultContentType?: string;
|
|
7
|
-
contentTypeParser
|
|
7
|
+
contentTypeParser?: ContentTypeParser;
|
|
8
8
|
log: Logger;
|
|
9
9
|
/**
|
|
10
10
|
* This should be set to the `filename` query parameter for the given request.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-content-type.d.ts","sourceRoot":"","sources":["../../../src/utils/get-content-type.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,UAAU,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"get-content-type.d.ts","sourceRoot":"","sources":["../../../src/utils/get-content-type.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,UAAU,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC,GAAG,EAAE,MAAM,CAAA;IAEX;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,cAAc,CAAE,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,kBAA+C,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmC/L"}
|
|
@@ -6,7 +6,7 @@ export async function getContentType({ bytes, path, contentTypeParser, log, defa
|
|
|
6
6
|
try {
|
|
7
7
|
let fileName;
|
|
8
8
|
if (filenameParam == null) {
|
|
9
|
-
fileName = path
|
|
9
|
+
fileName = path?.split('/').pop()?.trim();
|
|
10
10
|
fileName = (fileName === '' || fileName?.split('.').length === 1) ? undefined : fileName;
|
|
11
11
|
}
|
|
12
12
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-content-type.js","sourceRoot":"","sources":["../../../src/utils/get-content-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAmB5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAE,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,kBAAkB,GAAG,0BAA0B,EAAE,QAAQ,EAAE,aAAa,EAAyB;IAC5K,IAAI,WAA+B,CAAA;IAEnC,IAAI,iBAAiB,IAAI,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,QAAQ,CAAA;YACZ,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;gBAC1B,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"get-content-type.js","sourceRoot":"","sources":["../../../src/utils/get-content-type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAmB5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAE,EAAE,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,kBAAkB,GAAG,0BAA0B,EAAE,QAAQ,EAAE,aAAa,EAAyB;IAC5K,IAAI,WAA+B,CAAA;IAEnC,IAAI,iBAAiB,IAAI,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,QAAQ,CAAA;YACZ,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;gBAC1B,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAA;gBACzC,QAAQ,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;YAC1F,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,aAAa,CAAA;YAC1B,CAAC;YACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAEjD,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAA;gBAE3B,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,WAAW,GAAG,MAAM,CAAA;gBACtB,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC1B,WAAW,GAAG,MAAM,CAAA;YACtB,CAAC;YACD,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAA;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;QACpC,wIAAwI;QACxI,WAAW,GAAG,kBAAkB,CAAA;IAClC,CAAC;IAED,OAAO,WAAW,IAAI,kBAAkB,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-offset-and-length.d.ts","sourceRoot":"","sources":["../../../src/utils/get-offset-and-length.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEvD,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAmDhH"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function getOffsetAndLength(entry, entityBytes) {
|
|
2
|
+
if (entityBytes == null) {
|
|
3
|
+
return {
|
|
4
|
+
offset: 0,
|
|
5
|
+
length: Infinity
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
const parts = entityBytes.split(':');
|
|
9
|
+
const start = parseInt(parts[0], 10);
|
|
10
|
+
const end = parts[1] === '*' ? Infinity : parseInt(parts[1], 10);
|
|
11
|
+
if (isNaN(start) || isNaN(end)) {
|
|
12
|
+
throw new Error('Could not parse entity-bytes');
|
|
13
|
+
}
|
|
14
|
+
const entrySize = Number(entry.size);
|
|
15
|
+
if (start >= 0) {
|
|
16
|
+
if (end >= 0) {
|
|
17
|
+
return {
|
|
18
|
+
offset: start,
|
|
19
|
+
length: end - start
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return {
|
|
24
|
+
offset: start,
|
|
25
|
+
length: (entrySize - start) + end
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// start < 0
|
|
30
|
+
let offset = entrySize + start;
|
|
31
|
+
if (Math.abs(start) > entrySize) {
|
|
32
|
+
offset = 0;
|
|
33
|
+
}
|
|
34
|
+
if (end >= 0) {
|
|
35
|
+
return {
|
|
36
|
+
offset,
|
|
37
|
+
length: (entrySize - offset) + end
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// end < 0
|
|
41
|
+
return {
|
|
42
|
+
offset,
|
|
43
|
+
length: (entrySize - offset) + end
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=get-offset-and-length.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-offset-and-length.js","sourceRoot":"","sources":["../../../src/utils/get-offset-and-length.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,kBAAkB,CAAE,KAAkB,EAAE,WAAoB;IAC1E,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,QAAQ;SACjB,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEhE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAEpC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,GAAG,GAAG,KAAK;aACpB,CAAA;QACH,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG;aAClC,CAAA;QACH,CAAC;IACH,CAAC;IAED,YAAY;IACZ,IAAI,MAAM,GAAG,SAAS,GAAG,KAAK,CAAA;IAE9B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,SAAS,EAAE,CAAC;QAChC,MAAM,GAAG,CAAC,CAAA;IACZ,CAAC;IAED,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACb,OAAO;YACL,MAAM;YACN,MAAM,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,GAAG;SACnC,CAAA;IACH,CAAC;IAED,UAAU;IACV,OAAO;QACL,MAAM;QACN,MAAM,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,GAAG;KACnC,CAAA;AACH,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { UrlQuery } from '../index.ts';
|
|
2
2
|
import type { ComponentLogger } from '@libp2p/interface';
|
|
3
3
|
export interface ResolvedAcceptHeaderOptions {
|
|
4
|
-
query?:
|
|
4
|
+
query?: UrlQuery;
|
|
5
5
|
headers?: RequestInit['headers'];
|
|
6
6
|
logger: ComponentLogger;
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-resolved-accept-header.d.ts","sourceRoot":"","sources":["../../../src/utils/get-resolved-accept-header.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"get-resolved-accept-header.d.ts","sourceRoot":"","sources":["../../../src/utils/get-resolved-accept-header.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IAChC,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,wBAAgB,uBAAuB,CAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,2BAA2B,GAAG,MAAM,GAAG,SAAS,CA8BpH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-redirects.d.ts","sourceRoot":"","sources":["../../../src/utils/handle-redirects.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,UAAU,mBAAmB;IAC3B,GAAG,EAAE,GAAG,CAAA;IACR,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAA;IAC1D,MAAM,EAAE,eAAe,CAAA;IAEvB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAChC;AAWD,wBAAsB,mBAAmB,CAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAwB,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"handle-redirects.d.ts","sourceRoot":"","sources":["../../../src/utils/handle-redirects.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,UAAU,mBAAmB;IAC3B,GAAG,EAAE,GAAG,CAAA;IACR,QAAQ,EAAE,QAAQ,CAAA;IAClB,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,YAAY,CAAA;IAC1D,MAAM,EAAE,eAAe,CAAA;IAEvB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAChC;AAWD,wBAAsB,mBAAmB,CAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAwB,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAgFtJ"}
|
|
@@ -23,8 +23,8 @@ export async function getRedirectResponse({ resource, options, logger, cid, fetc
|
|
|
23
23
|
return null;
|
|
24
24
|
}
|
|
25
25
|
log.trace('checking for redirect info');
|
|
26
|
-
// if x-forwarded-host is passed, we need to set the location header to the
|
|
27
|
-
// so that the browser can redirect to the correct subdomain
|
|
26
|
+
// if x-forwarded-host is passed, we need to set the location header to the
|
|
27
|
+
// subdomain so that the browser can redirect to the correct subdomain
|
|
28
28
|
try {
|
|
29
29
|
const urlParts = matchURLString(resource);
|
|
30
30
|
const reqUrl = new URL(resource);
|
|
@@ -66,7 +66,7 @@ export async function getRedirectResponse({ resource, options, logger, cid, fetc
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
catch (err) {
|
|
69
|
-
log('subdomain not supported', err);
|
|
69
|
+
log('subdomain not supported - %e', err);
|
|
70
70
|
if (pathUrl.href === reqUrl.href) {
|
|
71
71
|
log('path url is the same as the request url, not setting location header');
|
|
72
72
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handle-redirects.js","sourceRoot":"","sources":["../../../src/utils/handle-redirects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAiBzD,SAAS,qBAAqB,CAAE,IAAY;IAC1C,iEAAiE;IACjE,IAAI,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAA;AAC/C,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAAG,UAAU,CAAC,KAAK,EAAuB;IAC1H,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,4CAA4C,CAAC,CAAA;IAE7E,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAC5H,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC7C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"handle-redirects.js","sourceRoot":"","sources":["../../../src/utils/handle-redirects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipfs-path-to-string.d.ts","sourceRoot":"","sources":["../../../src/utils/ipfs-path-to-string.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAItD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Joins an array of strings as an IPFS path and URI encodes individual
|
|
3
|
+
* components
|
|
4
|
+
*/
|
|
5
|
+
export function uriEncodeIPFSPath(str) {
|
|
6
|
+
return str.split('/')
|
|
7
|
+
.map(p => encodeURIComponent(p))
|
|
8
|
+
.join('/');
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ipfs-path-to-string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipfs-path-to-string.js","sourceRoot":"","sources":["../../../src/utils/ipfs-path-to-string.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAE,GAAW;IAC5C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;SAC/B,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { UrlQuery } from '../index.ts';
|
|
2
2
|
export interface IsAcceptExplicitOptions {
|
|
3
|
-
query?:
|
|
3
|
+
query?: UrlQuery;
|
|
4
4
|
headers: Headers;
|
|
5
5
|
}
|
|
6
6
|
export declare function isExplicitAcceptHeader(headers: Headers): boolean;
|
|
7
|
-
export declare function isExplicitFormatQuery(query?:
|
|
7
|
+
export declare function isExplicitFormatQuery(query?: UrlQuery): boolean;
|
|
8
8
|
/**
|
|
9
|
-
* The user can provide an explicit `accept` header in the request headers or a
|
|
9
|
+
* The user can provide an explicit `accept` header in the request headers or a
|
|
10
|
+
* `format` query parameter in the URL.
|
|
11
|
+
*
|
|
10
12
|
* If either of these are provided, this function returns true.
|
|
11
13
|
*/
|
|
12
14
|
export declare function isExplicitIpldAcceptRequest({ query, headers }: IsAcceptExplicitOptions): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-accept-explicit.d.ts","sourceRoot":"","sources":["../../../src/utils/is-accept-explicit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"is-accept-explicit.d.ts","sourceRoot":"","sources":["../../../src/utils/is-accept-explicit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,sBAAsB,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CASjE;AAED,wBAAgB,qBAAqB,CAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAQhE;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAEjG"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { FORMAT_TO_MIME_TYPE } from './select-output-type.js';
|
|
2
2
|
export function isExplicitAcceptHeader(headers) {
|
|
3
3
|
const incomingAcceptHeader = headers.get('accept');
|
|
4
|
-
if (incomingAcceptHeader
|
|
5
|
-
return
|
|
4
|
+
if (incomingAcceptHeader == null) {
|
|
5
|
+
return false;
|
|
6
6
|
}
|
|
7
|
-
return
|
|
7
|
+
return Object.values(FORMAT_TO_MIME_TYPE)
|
|
8
|
+
.some(mimeType => incomingAcceptHeader.includes(mimeType));
|
|
8
9
|
}
|
|
9
10
|
export function isExplicitFormatQuery(query) {
|
|
10
11
|
const formatQuery = query?.format;
|
|
@@ -14,7 +15,9 @@ export function isExplicitFormatQuery(query) {
|
|
|
14
15
|
return false;
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
17
|
-
* The user can provide an explicit `accept` header in the request headers or a
|
|
18
|
+
* The user can provide an explicit `accept` header in the request headers or a
|
|
19
|
+
* `format` query parameter in the URL.
|
|
20
|
+
*
|
|
18
21
|
* If either of these are provided, this function returns true.
|
|
19
22
|
*/
|
|
20
23
|
export function isExplicitIpldAcceptRequest({ query, headers }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-accept-explicit.js","sourceRoot":"","sources":["../../../src/utils/is-accept-explicit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAQ7D,MAAM,UAAU,sBAAsB,CAAE,OAAgB;IACtD,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"is-accept-explicit.js","sourceRoot":"","sources":["../../../src/utils/is-accept-explicit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAQ7D,MAAM,UAAU,sBAAsB,CAAE,OAAgB;IACtD,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAElD,IAAI,oBAAoB,IAAI,IAAI,EAAE,CAAC;QACjC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC;SACtC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAE,KAAgB;IACrD,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,CAAA;IAEjC,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAE,EAAE,KAAK,EAAE,OAAO,EAA2B;IACtF,OAAO,sBAAsB,CAAC,OAAO,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAA;AACxE,CAAC"}
|
|
@@ -1,63 +1,9 @@
|
|
|
1
|
-
import { TLRU } from './tlru.js';
|
|
2
|
-
import type { ServerTimingResult } from './server-timing.js';
|
|
3
|
-
import type { RequestFormatShorthand } from '../types.js';
|
|
4
|
-
import type { DNSLinkResolveResult, IPNS, IPNSResolveResult, IPNSRoutingEvents, ResolveDNSLinkProgressEvents, ResolveProgressEvents, ResolveResult } from '@helia/ipns';
|
|
5
|
-
import type { AbortOptions, ComponentLogger } from '@libp2p/interface';
|
|
6
|
-
import type { ProgressOptions } from 'progress-events';
|
|
7
|
-
export declare const ipnsCache: TLRU<DNSLinkResolveResult | IPNSResolveResult>;
|
|
8
|
-
export interface ParseUrlStringInput {
|
|
9
|
-
urlString: string;
|
|
10
|
-
ipns: IPNS;
|
|
11
|
-
logger: ComponentLogger;
|
|
12
|
-
withServerTiming?: boolean;
|
|
13
|
-
}
|
|
14
|
-
export interface ParseUrlStringOptions extends ProgressOptions<ResolveProgressEvents | IPNSRoutingEvents | ResolveDNSLinkProgressEvents>, AbortOptions {
|
|
15
|
-
}
|
|
16
|
-
export interface ParsedUrlQuery extends Record<string, string | unknown> {
|
|
17
|
-
format?: RequestFormatShorthand;
|
|
18
|
-
download?: boolean;
|
|
19
|
-
filename?: string;
|
|
20
|
-
'dag-scope'?: string;
|
|
21
|
-
}
|
|
22
|
-
export interface ParsedUrlStringResults extends ResolveResult {
|
|
23
|
-
protocol: 'ipfs' | 'ipns';
|
|
24
|
-
query: ParsedUrlQuery;
|
|
25
|
-
/**
|
|
26
|
-
* The value for the IPFS gateway spec compliant header `X-Ipfs-Path` on the
|
|
27
|
-
* response.
|
|
28
|
-
* The value of this header should be the original requested content path,
|
|
29
|
-
* prior to any path resolution or traversal.
|
|
30
|
-
*
|
|
31
|
-
* @see https://specs.ipfs.tech/http-gateways/path-gateway/#x-ipfs-path-response-header
|
|
32
|
-
*/
|
|
33
|
-
ipfsPath: string;
|
|
34
|
-
/**
|
|
35
|
-
* seconds as a number
|
|
36
|
-
*/
|
|
37
|
-
ttl?: number;
|
|
38
|
-
/**
|
|
39
|
-
* serverTiming items
|
|
40
|
-
*/
|
|
41
|
-
serverTimings: Array<ServerTimingResult<any>>;
|
|
42
|
-
}
|
|
43
1
|
interface MatchUrlGroups {
|
|
44
2
|
protocol: 'ipfs' | 'ipns';
|
|
45
3
|
cidOrPeerIdOrDnsLink: string;
|
|
46
4
|
path?: string;
|
|
47
|
-
|
|
5
|
+
query?: string;
|
|
48
6
|
}
|
|
49
7
|
export declare function matchURLString(urlString: string): MatchUrlGroups;
|
|
50
|
-
/**
|
|
51
|
-
* A function that parses ipfs:// and ipns:// URLs, returning an object with easily recognizable properties.
|
|
52
|
-
*
|
|
53
|
-
* After determining the protocol successfully, we process the cidOrPeerIdOrDnsLink:
|
|
54
|
-
* - If it's ipfs, it parses the CID or throws Error[]
|
|
55
|
-
* - If it's ipns, it attempts to resolve the PeerId and then the DNSLink. If both fail, Error[] is thrown.
|
|
56
|
-
*
|
|
57
|
-
* @todo we need to break out each step of this function (cid parsing, ipns resolving, dnslink resolving) into separate functions and then remove the eslint-disable comment
|
|
58
|
-
*
|
|
59
|
-
* @throws {Error[]}
|
|
60
|
-
*/
|
|
61
|
-
export declare function parseUrlString({ urlString, ipns, logger, withServerTiming }: ParseUrlStringInput, options?: ParseUrlStringOptions): Promise<ParsedUrlStringResults>;
|
|
62
8
|
export {};
|
|
63
9
|
//# 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":"AAKA,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAiBD,wBAAgB,cAAc,CAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAqBjE"}
|
|
@@ -1,13 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { TLRU } from './tlru.js';
|
|
6
|
-
export const ipnsCache = new TLRU(1000);
|
|
7
|
-
const URL_REGEX = /^(?<protocol>ip[fn]s):\/\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<queryString>.*)$/;
|
|
8
|
-
const PATH_REGEX = /^\/(?<protocol>ip[fn]s)\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<queryString>.*)$/;
|
|
9
|
-
const PATH_GATEWAY_REGEX = /^https?:\/\/(.*[^/])\/(?<protocol>ip[fn]s)\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<queryString>.*)$/;
|
|
10
|
-
const SUBDOMAIN_GATEWAY_REGEX = /^https?:\/\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\.(?<protocol>ip[fn]s)\.([^/?]+)\/?(?<path>[^?]*)\??(?<queryString>.*)$/;
|
|
1
|
+
const URL_REGEX = /^(?<protocol>ip[fn]s):\/\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<query>.*)$/;
|
|
2
|
+
const PATH_REGEX = /^\/(?<protocol>ip[fn]s)\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<query>.*)$/;
|
|
3
|
+
const PATH_GATEWAY_REGEX = /^https?:\/\/(.*[^/])\/(?<protocol>ip[fn]s)\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<query>.*)$/;
|
|
4
|
+
const SUBDOMAIN_GATEWAY_REGEX = /^https?:\/\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\.(?<protocol>ip[fn]s)\.([^/?]+)\/?(?<path>[^?]*)\??(?<query>.*)$/;
|
|
11
5
|
function matchUrlGroupsGuard(groups) {
|
|
12
6
|
const protocol = groups?.protocol;
|
|
13
7
|
if (protocol == null) {
|
|
@@ -18,44 +12,30 @@ function matchUrlGroupsGuard(groups) {
|
|
|
18
12
|
return false;
|
|
19
13
|
}
|
|
20
14
|
const path = groups?.path;
|
|
21
|
-
const
|
|
15
|
+
const query = groups?.query;
|
|
22
16
|
return ['ipns', 'ipfs'].includes(protocol) &&
|
|
23
17
|
typeof cidOrPeerIdOrDnsLink === 'string' &&
|
|
24
18
|
(path == null || typeof path === 'string') &&
|
|
25
|
-
(
|
|
19
|
+
(query == null || typeof query === 'string');
|
|
26
20
|
}
|
|
21
|
+
// TODO: can this be replaced with `new URL`?
|
|
27
22
|
export function matchURLString(urlString) {
|
|
28
23
|
for (const pattern of [SUBDOMAIN_GATEWAY_REGEX, URL_REGEX, PATH_GATEWAY_REGEX, PATH_REGEX]) {
|
|
29
24
|
const match = urlString.match(pattern);
|
|
30
25
|
if (matchUrlGroupsGuard(match?.groups)) {
|
|
31
|
-
|
|
26
|
+
const groups = match.groups;
|
|
27
|
+
if (groups.path != null) {
|
|
28
|
+
groups.path = decodeURIComponent(groups.path);
|
|
29
|
+
}
|
|
30
|
+
// decode inline dnslink domain if present
|
|
31
|
+
if (pattern === SUBDOMAIN_GATEWAY_REGEX && groups.protocol === 'ipns' && isInlinedDnsLink(groups.cidOrPeerIdOrDnsLink)) {
|
|
32
|
+
groups.cidOrPeerIdOrDnsLink = dnsLinkLabelDecoder(groups.cidOrPeerIdOrDnsLink);
|
|
33
|
+
}
|
|
34
|
+
return groups;
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
37
|
throw new TypeError(`Invalid URL: ${urlString}, please use ipfs://, ipns://, or gateway URLs only`);
|
|
35
38
|
}
|
|
36
|
-
/**
|
|
37
|
-
* determines the TTL for the resolved resource that will be used for the `Cache-Control` header's `max-age` directive.
|
|
38
|
-
* max-age is in seconds
|
|
39
|
-
*
|
|
40
|
-
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#response_directives
|
|
41
|
-
*
|
|
42
|
-
* If we have ipnsTtlNs, it will be a BigInt representing "nanoseconds". We need to convert it back to seconds.
|
|
43
|
-
*
|
|
44
|
-
* For more TTL nuances:
|
|
45
|
-
*
|
|
46
|
-
* @see https://github.com/ipfs/js-ipns/blob/16e0e10682fa9a663e0bb493a44d3e99a5200944/src/index.ts#L200
|
|
47
|
-
* @see https://github.com/ipfs/js-ipns/pull/308
|
|
48
|
-
* @returns the ttl in seconds
|
|
49
|
-
*/
|
|
50
|
-
function calculateTtl(resolveResult) {
|
|
51
|
-
if (resolveResult == null) {
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
const dnsLinkTtl = resolveResult.answer?.TTL;
|
|
55
|
-
const ipnsTtlNs = resolveResult.record?.ttl;
|
|
56
|
-
const ipnsTtl = ipnsTtlNs != null ? Number(ipnsTtlNs / BigInt(1e9)) : undefined;
|
|
57
|
-
return dnsLinkTtl ?? ipnsTtl;
|
|
58
|
-
}
|
|
59
39
|
/**
|
|
60
40
|
* For DNSLink see https://specs.ipfs.tech/http-gateways/subdomain-gateway/#host-request-header
|
|
61
41
|
* DNSLink names include . which means they must be inlined into a single DNS label to provide unique origin and work with wildcard TLS certificates.
|
|
@@ -80,185 +60,4 @@ function isInlinedDnsLink(label) {
|
|
|
80
60
|
function dnsLinkLabelDecoder(linkLabel) {
|
|
81
61
|
return linkLabel.replace(/--/g, '%').replace(/-/g, '.').replace(/%/g, '-');
|
|
82
62
|
}
|
|
83
|
-
/**
|
|
84
|
-
* A function that parses ipfs:// and ipns:// URLs, returning an object with easily recognizable properties.
|
|
85
|
-
*
|
|
86
|
-
* After determining the protocol successfully, we process the cidOrPeerIdOrDnsLink:
|
|
87
|
-
* - If it's ipfs, it parses the CID or throws Error[]
|
|
88
|
-
* - If it's ipns, it attempts to resolve the PeerId and then the DNSLink. If both fail, Error[] is thrown.
|
|
89
|
-
*
|
|
90
|
-
* @todo we need to break out each step of this function (cid parsing, ipns resolving, dnslink resolving) into separate functions and then remove the eslint-disable comment
|
|
91
|
-
*
|
|
92
|
-
* @throws {Error[]}
|
|
93
|
-
*/
|
|
94
|
-
// eslint-disable-next-line complexity
|
|
95
|
-
export async function parseUrlString({ urlString, ipns, logger, withServerTiming = false }, options) {
|
|
96
|
-
const log = logger.forComponent('helia:verified-fetch:parse-url-string');
|
|
97
|
-
const { protocol, cidOrPeerIdOrDnsLink, path: urlPath, queryString } = matchURLString(urlString);
|
|
98
|
-
let cid;
|
|
99
|
-
let resolvedPath;
|
|
100
|
-
const errors = [];
|
|
101
|
-
let resolveResult;
|
|
102
|
-
const serverTimings = [];
|
|
103
|
-
if (protocol === 'ipfs') {
|
|
104
|
-
try {
|
|
105
|
-
cid = CID.parse(cidOrPeerIdOrDnsLink);
|
|
106
|
-
/**
|
|
107
|
-
* no ttl set. @link {setCacheControlHeader}
|
|
108
|
-
*/
|
|
109
|
-
}
|
|
110
|
-
catch (err) {
|
|
111
|
-
log.error(err);
|
|
112
|
-
errors.push(new TypeError('Invalid CID for ipfs://<cid> URL'));
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
// protocol is ipns
|
|
117
|
-
resolveResult = ipnsCache.get(cidOrPeerIdOrDnsLink);
|
|
118
|
-
if (resolveResult != null) {
|
|
119
|
-
cid = resolveResult.cid;
|
|
120
|
-
resolvedPath = resolveResult.path;
|
|
121
|
-
log.trace('resolved %s to %c from cache', cidOrPeerIdOrDnsLink, cid);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
log.trace('Attempting to resolve PeerId for %s', cidOrPeerIdOrDnsLink);
|
|
125
|
-
let peerId;
|
|
126
|
-
try {
|
|
127
|
-
// try resolving as an IPNS name
|
|
128
|
-
peerId = getPeerIdFromString(cidOrPeerIdOrDnsLink);
|
|
129
|
-
const pubKey = peerId?.publicKey;
|
|
130
|
-
if (pubKey == null) {
|
|
131
|
-
throw new TypeError('cidOrPeerIdOrDnsLink contains no public key');
|
|
132
|
-
}
|
|
133
|
-
if (withServerTiming) {
|
|
134
|
-
const resolveIpns = async () => {
|
|
135
|
-
return ipns.resolve(pubKey, options);
|
|
136
|
-
};
|
|
137
|
-
const resolveResultWithServerTiming = await serverTiming('ipns.resolve', `Resolve IPNS name ${cidOrPeerIdOrDnsLink}`, resolveIpns);
|
|
138
|
-
serverTimings.push(resolveResultWithServerTiming);
|
|
139
|
-
// eslint-disable-next-line max-depth
|
|
140
|
-
if (resolveResultWithServerTiming.error != null) {
|
|
141
|
-
throw resolveResultWithServerTiming.error;
|
|
142
|
-
}
|
|
143
|
-
resolveResult = resolveResultWithServerTiming.result;
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
resolveResult = await ipns.resolve(pubKey, options);
|
|
147
|
-
}
|
|
148
|
-
cid = resolveResult?.cid;
|
|
149
|
-
resolvedPath = resolveResult?.path;
|
|
150
|
-
log.trace('resolved %s to %c', cidOrPeerIdOrDnsLink, cid);
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
if (options?.signal?.aborted) {
|
|
154
|
-
throw new AbortError(options?.signal?.reason);
|
|
155
|
-
}
|
|
156
|
-
if (peerId == null) {
|
|
157
|
-
log.error('could not parse PeerId string "%s"', cidOrPeerIdOrDnsLink, err);
|
|
158
|
-
errors.push(new TypeError(`Could not parse PeerId in ipns url "${cidOrPeerIdOrDnsLink}", ${err.message}`));
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
log.error('could not resolve PeerId %c', peerId, err);
|
|
162
|
-
errors.push(new TypeError(`Could not resolve PeerId "${cidOrPeerIdOrDnsLink}": ${err.message}`));
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
if (cid == null) {
|
|
166
|
-
// cid is still null, try resolving as a DNSLink
|
|
167
|
-
let decodedDnsLinkLabel = cidOrPeerIdOrDnsLink;
|
|
168
|
-
if (isInlinedDnsLink(cidOrPeerIdOrDnsLink)) {
|
|
169
|
-
decodedDnsLinkLabel = dnsLinkLabelDecoder(cidOrPeerIdOrDnsLink);
|
|
170
|
-
log.trace('decoded dnslink from "%s" to "%s"', cidOrPeerIdOrDnsLink, decodedDnsLinkLabel);
|
|
171
|
-
}
|
|
172
|
-
log.trace('Attempting to resolve DNSLink for %s', decodedDnsLinkLabel);
|
|
173
|
-
try {
|
|
174
|
-
// eslint-disable-next-line max-depth
|
|
175
|
-
if (withServerTiming) {
|
|
176
|
-
const resolveResultWithServerTiming = await serverTiming('ipns.resolveDNSLink', `Resolve DNSLink ${decodedDnsLinkLabel}`, ipns.resolveDNSLink.bind(ipns, decodedDnsLinkLabel, options));
|
|
177
|
-
serverTimings.push(resolveResultWithServerTiming);
|
|
178
|
-
// eslint-disable-next-line max-depth
|
|
179
|
-
if (resolveResultWithServerTiming.error != null) {
|
|
180
|
-
throw resolveResultWithServerTiming.error;
|
|
181
|
-
}
|
|
182
|
-
resolveResult = resolveResultWithServerTiming.result;
|
|
183
|
-
}
|
|
184
|
-
else {
|
|
185
|
-
resolveResult = await ipns.resolveDNSLink(decodedDnsLinkLabel, options);
|
|
186
|
-
}
|
|
187
|
-
cid = resolveResult?.cid;
|
|
188
|
-
resolvedPath = resolveResult?.path;
|
|
189
|
-
log.trace('resolved %s to %c', decodedDnsLinkLabel, cid);
|
|
190
|
-
}
|
|
191
|
-
catch (err) {
|
|
192
|
-
// eslint-disable-next-line max-depth
|
|
193
|
-
if (options?.signal?.aborted) {
|
|
194
|
-
throw new AbortError(options?.signal?.reason);
|
|
195
|
-
}
|
|
196
|
-
log.error('could not resolve DnsLink for "%s"', cidOrPeerIdOrDnsLink, err);
|
|
197
|
-
errors.push(err);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
if (cid == null) {
|
|
203
|
-
if (errors.length === 1) {
|
|
204
|
-
throw errors[0];
|
|
205
|
-
}
|
|
206
|
-
errors.push(new Error(`Invalid resource. Cannot determine CID from URL "${urlString}".`));
|
|
207
|
-
// eslint-disable-next-line @typescript-eslint/only-throw-error
|
|
208
|
-
throw errors;
|
|
209
|
-
}
|
|
210
|
-
let ttl = calculateTtl(resolveResult);
|
|
211
|
-
if (resolveResult != null) {
|
|
212
|
-
// use the ttl for the resolved resource for the cache, but fallback to 2 minutes if not available
|
|
213
|
-
ttl = ttl ?? 60 * 2;
|
|
214
|
-
log.trace('caching %s resolved to %s with TTL: %s', cidOrPeerIdOrDnsLink, cid, ttl);
|
|
215
|
-
// convert ttl from seconds to ms for the cache
|
|
216
|
-
ipnsCache.set(cidOrPeerIdOrDnsLink, resolveResult, ttl * 1000);
|
|
217
|
-
}
|
|
218
|
-
// parse query string
|
|
219
|
-
const query = {};
|
|
220
|
-
if (queryString != null && queryString.length > 0) {
|
|
221
|
-
const queryParts = queryString.split('&');
|
|
222
|
-
for (const part of queryParts) {
|
|
223
|
-
const [key, value] = part.split('=');
|
|
224
|
-
query[key] = decodeURIComponent(value);
|
|
225
|
-
}
|
|
226
|
-
if (query.download != null) {
|
|
227
|
-
query.download = query.download === 'true';
|
|
228
|
-
}
|
|
229
|
-
if (query.filename != null) {
|
|
230
|
-
query.filename = query.filename.toString();
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return {
|
|
234
|
-
protocol,
|
|
235
|
-
cid,
|
|
236
|
-
path: joinPaths(resolvedPath, urlPath ?? ''),
|
|
237
|
-
query,
|
|
238
|
-
ttl,
|
|
239
|
-
ipfsPath: `/${protocol}/${cidOrPeerIdOrDnsLink}${urlPath != null && urlPath !== '' ? `/${urlPath}` : ''}`,
|
|
240
|
-
serverTimings
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* join the path from resolve result & given path.
|
|
245
|
-
* e.g. /ipns/<peerId>/ that is resolved to /ipfs/<cid>/<path1>, when requested as /ipns/<peerId>/<path2>, should be
|
|
246
|
-
* resolved to /ipfs/<cid>/<path1>/<path2>
|
|
247
|
-
*/
|
|
248
|
-
function joinPaths(resolvedPath, urlPath) {
|
|
249
|
-
let path = '';
|
|
250
|
-
if (resolvedPath != null) {
|
|
251
|
-
path += resolvedPath;
|
|
252
|
-
}
|
|
253
|
-
if (urlPath.length > 0) {
|
|
254
|
-
path = `${path.length > 0 ? `${path}/` : path}${urlPath}`;
|
|
255
|
-
}
|
|
256
|
-
// replace duplicate forward slashes
|
|
257
|
-
path = path.replace(/\/(\/)+/g, '/');
|
|
258
|
-
// strip trailing forward slash if present
|
|
259
|
-
if (path.startsWith('/')) {
|
|
260
|
-
path = path.substring(1);
|
|
261
|
-
}
|
|
262
|
-
return path.split('/').map(decodeURIComponent).join('/');
|
|
263
|
-
}
|
|
264
63
|
//# sourceMappingURL=parse-url-string.js.map
|