@helia/verified-fetch 3.2.3 → 4.0.1

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.
Files changed (165) hide show
  1. package/README.md +10 -52
  2. package/dist/index.min.js +86 -71
  3. package/dist/index.min.js.map +4 -4
  4. package/dist/src/constants.d.ts +2 -0
  5. package/dist/src/constants.d.ts.map +1 -0
  6. package/dist/src/constants.js +2 -0
  7. package/dist/src/constants.js.map +1 -0
  8. package/dist/src/index.d.ts +63 -61
  9. package/dist/src/index.d.ts.map +1 -1
  10. package/dist/src/index.js +12 -54
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/plugins/index.d.ts +0 -1
  13. package/dist/src/plugins/index.d.ts.map +1 -1
  14. package/dist/src/plugins/index.js +0 -1
  15. package/dist/src/plugins/index.js.map +1 -1
  16. package/dist/src/plugins/plugin-base.d.ts.map +1 -1
  17. package/dist/src/plugins/plugin-base.js +3 -2
  18. package/dist/src/plugins/plugin-base.js.map +1 -1
  19. package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
  20. package/dist/src/plugins/plugin-handle-car.js +37 -28
  21. package/dist/src/plugins/plugin-handle-car.js.map +1 -1
  22. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts +1 -1
  23. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts.map +1 -1
  24. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js +1 -2
  25. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js.map +1 -1
  26. package/dist/src/plugins/plugin-handle-dag-cbor.d.ts.map +1 -1
  27. package/dist/src/plugins/plugin-handle-dag-cbor.js +5 -6
  28. package/dist/src/plugins/plugin-handle-dag-cbor.js.map +1 -1
  29. package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +1 -1
  30. package/dist/src/plugins/plugin-handle-dag-pb.js +24 -27
  31. package/dist/src/plugins/plugin-handle-dag-pb.js.map +1 -1
  32. package/dist/src/plugins/plugin-handle-dag-walk.d.ts +8 -4
  33. package/dist/src/plugins/plugin-handle-dag-walk.d.ts.map +1 -1
  34. package/dist/src/plugins/plugin-handle-dag-walk.js +13 -9
  35. package/dist/src/plugins/plugin-handle-dag-walk.js.map +1 -1
  36. package/dist/src/plugins/plugin-handle-ipns-record.d.ts +1 -1
  37. package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
  38. package/dist/src/plugins/plugin-handle-ipns-record.js +16 -24
  39. package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -1
  40. package/dist/src/plugins/plugin-handle-json.d.ts.map +1 -1
  41. package/dist/src/plugins/plugin-handle-json.js +5 -5
  42. package/dist/src/plugins/plugin-handle-json.js.map +1 -1
  43. package/dist/src/plugins/plugin-handle-raw.d.ts.map +1 -1
  44. package/dist/src/plugins/plugin-handle-raw.js +21 -12
  45. package/dist/src/plugins/plugin-handle-raw.js.map +1 -1
  46. package/dist/src/plugins/plugin-handle-tar.d.ts.map +1 -1
  47. package/dist/src/plugins/plugin-handle-tar.js +1 -2
  48. package/dist/src/plugins/plugin-handle-tar.js.map +1 -1
  49. package/dist/src/plugins/types.d.ts +15 -15
  50. package/dist/src/plugins/types.d.ts.map +1 -1
  51. package/dist/src/url-resolver.d.ts +21 -0
  52. package/dist/src/url-resolver.d.ts.map +1 -0
  53. package/dist/src/url-resolver.js +118 -0
  54. package/dist/src/url-resolver.js.map +1 -0
  55. package/dist/src/utils/byte-range-context.d.ts +3 -3
  56. package/dist/src/utils/byte-range-context.d.ts.map +1 -1
  57. package/dist/src/utils/byte-range-context.js +1 -1
  58. package/dist/src/utils/byte-range-context.js.map +1 -1
  59. package/dist/src/utils/content-type-parser.d.ts.map +1 -1
  60. package/dist/src/utils/content-type-parser.js +0 -10
  61. package/dist/src/utils/content-type-parser.js.map +1 -1
  62. package/dist/src/utils/error-to-object.d.ts +6 -0
  63. package/dist/src/utils/error-to-object.d.ts.map +1 -0
  64. package/dist/src/utils/error-to-object.js +20 -0
  65. package/dist/src/utils/error-to-object.js.map +1 -0
  66. package/dist/src/utils/get-content-type.d.ts +3 -3
  67. package/dist/src/utils/get-content-type.d.ts.map +1 -1
  68. package/dist/src/utils/get-content-type.js +1 -1
  69. package/dist/src/utils/get-content-type.js.map +1 -1
  70. package/dist/src/utils/get-e-tag.d.ts +1 -1
  71. package/dist/src/utils/get-offset-and-length.d.ts +6 -0
  72. package/dist/src/utils/get-offset-and-length.d.ts.map +1 -0
  73. package/dist/src/utils/get-offset-and-length.js +46 -0
  74. package/dist/src/utils/get-offset-and-length.js.map +1 -0
  75. package/dist/src/utils/get-resolved-accept-header.d.ts +2 -2
  76. package/dist/src/utils/get-resolved-accept-header.d.ts.map +1 -1
  77. package/dist/src/utils/get-stream-from-async-iterable.d.ts +2 -2
  78. package/dist/src/utils/get-stream-from-async-iterable.d.ts.map +1 -1
  79. package/dist/src/utils/get-stream-from-async-iterable.js +2 -2
  80. package/dist/src/utils/get-stream-from-async-iterable.js.map +1 -1
  81. package/dist/src/utils/handle-redirects.d.ts.map +1 -1
  82. package/dist/src/utils/handle-redirects.js +3 -3
  83. package/dist/src/utils/handle-redirects.js.map +1 -1
  84. package/dist/src/utils/ipfs-path-to-string.d.ts +6 -0
  85. package/dist/src/utils/ipfs-path-to-string.d.ts.map +1 -0
  86. package/dist/src/utils/ipfs-path-to-string.js +10 -0
  87. package/dist/src/utils/ipfs-path-to-string.js.map +1 -0
  88. package/dist/src/utils/is-accept-explicit.d.ts +6 -4
  89. package/dist/src/utils/is-accept-explicit.d.ts.map +1 -1
  90. package/dist/src/utils/is-accept-explicit.js +7 -4
  91. package/dist/src/utils/is-accept-explicit.js.map +1 -1
  92. package/dist/src/utils/parse-url-string.d.ts +1 -55
  93. package/dist/src/utils/parse-url-string.d.ts.map +1 -1
  94. package/dist/src/utils/parse-url-string.js +16 -217
  95. package/dist/src/utils/parse-url-string.js.map +1 -1
  96. package/dist/src/utils/response-headers.d.ts +1 -1
  97. package/dist/src/utils/response-headers.d.ts.map +1 -1
  98. package/dist/src/utils/responses.d.ts +3 -2
  99. package/dist/src/utils/responses.d.ts.map +1 -1
  100. package/dist/src/utils/responses.js +12 -1
  101. package/dist/src/utils/responses.js.map +1 -1
  102. package/dist/src/utils/select-output-type.d.ts +6 -2
  103. package/dist/src/utils/select-output-type.d.ts.map +1 -1
  104. package/dist/src/utils/select-output-type.js +28 -37
  105. package/dist/src/utils/select-output-type.js.map +1 -1
  106. package/dist/src/utils/server-timing.d.ts +5 -11
  107. package/dist/src/utils/server-timing.d.ts.map +1 -1
  108. package/dist/src/utils/server-timing.js +17 -15
  109. package/dist/src/utils/server-timing.js.map +1 -1
  110. package/dist/src/utils/walk-path.js +2 -2
  111. package/dist/src/utils/walk-path.js.map +1 -1
  112. package/dist/src/verified-fetch.d.ts +3 -10
  113. package/dist/src/verified-fetch.d.ts.map +1 -1
  114. package/dist/src/verified-fetch.js +99 -80
  115. package/dist/src/verified-fetch.js.map +1 -1
  116. package/dist/typedoc-urls.json +13 -4
  117. package/package.json +35 -36
  118. package/src/constants.ts +1 -0
  119. package/src/index.ts +79 -70
  120. package/src/plugins/index.ts +0 -1
  121. package/src/plugins/plugin-base.ts +3 -2
  122. package/src/plugins/plugin-handle-car.ts +53 -31
  123. package/src/plugins/plugin-handle-dag-cbor-html-preview.ts +4 -3
  124. package/src/plugins/plugin-handle-dag-cbor.ts +8 -6
  125. package/src/plugins/plugin-handle-dag-pb.ts +34 -26
  126. package/src/plugins/plugin-handle-dag-walk.ts +15 -9
  127. package/src/plugins/plugin-handle-ipns-record.ts +21 -24
  128. package/src/plugins/plugin-handle-json.ts +6 -5
  129. package/src/plugins/plugin-handle-raw.ts +27 -13
  130. package/src/plugins/plugin-handle-tar.ts +3 -2
  131. package/src/plugins/types.ts +18 -16
  132. package/src/url-resolver.ts +159 -0
  133. package/src/utils/byte-range-context.ts +4 -4
  134. package/src/utils/content-type-parser.ts +5 -11
  135. package/src/utils/error-to-object.ts +22 -0
  136. package/src/utils/get-content-type.ts +5 -4
  137. package/src/utils/get-e-tag.ts +1 -1
  138. package/src/utils/get-offset-and-length.ts +54 -0
  139. package/src/utils/get-resolved-accept-header.ts +2 -2
  140. package/src/utils/get-stream-from-async-iterable.ts +4 -4
  141. package/src/utils/handle-redirects.ts +10 -3
  142. package/src/utils/ipfs-path-to-string.ts +9 -0
  143. package/src/utils/is-accept-explicit.ts +14 -7
  144. package/src/utils/parse-url-string.ts +20 -286
  145. package/src/utils/response-headers.ts +1 -1
  146. package/src/utils/responses.ts +16 -2
  147. package/src/utils/select-output-type.ts +38 -44
  148. package/src/utils/server-timing.ts +17 -30
  149. package/src/utils/walk-path.ts +2 -2
  150. package/src/verified-fetch.ts +119 -92
  151. package/dist/src/plugins/errors.d.ts +0 -25
  152. package/dist/src/plugins/errors.d.ts.map +0 -1
  153. package/dist/src/plugins/errors.js +0 -33
  154. package/dist/src/plugins/errors.js.map +0 -1
  155. package/dist/src/types.d.ts +0 -16
  156. package/dist/src/types.d.ts.map +0 -1
  157. package/dist/src/types.js +0 -2
  158. package/dist/src/types.js.map +0 -1
  159. package/dist/src/utils/parse-resource.d.ts +0 -18
  160. package/dist/src/utils/parse-resource.d.ts.map +0 -1
  161. package/dist/src/utils/parse-resource.js +0 -27
  162. package/dist/src/utils/parse-resource.js.map +0 -1
  163. package/src/plugins/errors.ts +0 -37
  164. package/src/types.ts +0 -17
  165. package/src/utils/parse-resource.ts +0 -42
@@ -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;IACZ,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAA;IAChD,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,CAkC/L"}
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.split('/').pop()?.trim();
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,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAA;gBACxC,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;IACD,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;QACpC,wIAAwI;QACxI,WAAW,GAAG,kBAAkB,CAAA;IAClC,CAAC;IAED,OAAO,WAAW,IAAI,kBAAkB,CAAA;AAC1C,CAAC"}
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"}
@@ -1,4 +1,4 @@
1
- import type { RequestFormatShorthand } from '../types.js';
1
+ import type { RequestFormatShorthand } from '../index.js';
2
2
  import type { CID } from 'multiformats/cid';
3
3
  interface GetETagArg {
4
4
  cid: CID;
@@ -0,0 +1,6 @@
1
+ import type { UnixFSEntry } from 'ipfs-unixfs-exporter';
2
+ export declare function getOffsetAndLength(entry: UnixFSEntry, entityBytes?: string): {
3
+ offset: number;
4
+ length: number;
5
+ };
6
+ //# sourceMappingURL=get-offset-and-length.d.ts.map
@@ -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 { ParsedUrlStringResults } from './parse-url-string.js';
1
+ import type { UrlQuery } from '../index.ts';
2
2
  import type { ComponentLogger } from '@libp2p/interface';
3
3
  export interface ResolvedAcceptHeaderOptions {
4
- query?: ParsedUrlStringResults['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,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAA;IACvC,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
+ {"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,9 +1,9 @@
1
1
  import type { VerifiedFetchInit } from '../index.js';
2
- import type { ComponentLogger } from '@libp2p/interface';
2
+ import type { Logger } from '@libp2p/interface';
3
3
  /**
4
4
  * Converts an async iterator of Uint8Array bytes to a stream and returns the first chunk of bytes
5
5
  */
6
- export declare function getStreamFromAsyncIterable(iterator: AsyncIterable<Uint8Array>, path: string, logger: ComponentLogger, options?: Pick<VerifiedFetchInit, 'onProgress' | 'signal'>): Promise<{
6
+ export declare function getStreamFromAsyncIterable(iterator: AsyncIterable<Uint8Array>, path: string, logger: Logger, options?: Pick<VerifiedFetchInit, 'onProgress' | 'signal'>): Promise<{
7
7
  stream: ReadableStream<Uint8Array>;
8
8
  firstChunk: Uint8Array;
9
9
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"get-stream-from-async-iterable.d.ts","sourceRoot":"","sources":["../../../src/utils/get-stream-from-async-iterable.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD;;GAEG;AACH,wBAAsB,0BAA0B,CAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC,CA0CjQ"}
1
+ {"version":3,"file":"get-stream-from-async-iterable.d.ts","sourceRoot":"","sources":["../../../src/utils/get-stream-from-async-iterable.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;GAEG;AACH,wBAAsB,0BAA0B,CAAE,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC,CA0CxP"}
@@ -5,11 +5,11 @@ import { NoContentError } from '../errors.js';
5
5
  * Converts an async iterator of Uint8Array bytes to a stream and returns the first chunk of bytes
6
6
  */
7
7
  export async function getStreamFromAsyncIterable(iterator, path, logger, options) {
8
- const log = logger.forComponent('helia:verified-fetch:get-stream-from-async-iterable');
8
+ const log = logger.newScope('get-stream-from-async-iterable');
9
9
  const reader = iterator[Symbol.asyncIterator]();
10
10
  const { value: firstChunk, done } = await reader.next();
11
11
  if (done === true) {
12
- log.error('no content found for path', path);
12
+ log.error('no content found for path "%s"', path);
13
13
  throw new NoContentError();
14
14
  }
15
15
  const stream = new ReadableStream({
@@ -1 +1 @@
1
- {"version":3,"file":"get-stream-from-async-iterable.js","sourceRoot":"","sources":["../../../src/utils/get-stream-from-async-iterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAI7C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAE,QAAmC,EAAE,IAAY,EAAE,MAAuB,EAAE,OAA0D;IACtL,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,qDAAqD,CAAC,CAAA;IACtF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC/C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;IAEvD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAA;QAC5C,MAAM,IAAI,cAAc,EAAE,CAAA;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,KAAK,CAAC,KAAK,CAAE,UAAU;YACrB,yCAAyC;YACzC,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAO,uCAAuC,CAAC,CAAC,CAAA;YAC7F,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAChC,CAAC;QACD,KAAK,CAAC,IAAI,CAAE,UAAU;YACpB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC7B,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,wBAAwB,CAAC,CAAC,CAAA;gBACnF,UAAU,CAAC,KAAK,EAAE,CAAA;gBAClB,OAAM;YACR,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAClB,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAO,uCAAuC,CAAC,CAAC,CAAA;oBAC7F,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC3B,CAAC;gBACD,UAAU,CAAC,KAAK,EAAE,CAAA;gBAClB,OAAM;YACR,CAAC;YAED,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAO,uCAAuC,CAAC,CAAC,CAAA;YAC7F,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;KACF,CAAC,CAAA;IAEF,OAAO;QACL,MAAM;QACN,UAAU;KACX,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"get-stream-from-async-iterable.js","sourceRoot":"","sources":["../../../src/utils/get-stream-from-async-iterable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAI7C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAE,QAAmC,EAAE,IAAY,EAAE,MAAc,EAAE,OAA0D;IAC7K,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAA;IAC7D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAA;IAC/C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;IAEvD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,IAAI,CAAC,CAAA;QACjD,MAAM,IAAI,cAAc,EAAE,CAAA;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC;QAChC,KAAK,CAAC,KAAK,CAAE,UAAU;YACrB,yCAAyC;YACzC,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAO,uCAAuC,CAAC,CAAC,CAAA;YAC7F,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QAChC,CAAC;QACD,KAAK,CAAC,IAAI,CAAE,UAAU;YACpB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YAC3C,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC7B,UAAU,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,wBAAwB,CAAC,CAAC,CAAA;gBACnF,UAAU,CAAC,KAAK,EAAE,CAAA;gBAClB,OAAM;YACR,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAClB,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAO,uCAAuC,CAAC,CAAC,CAAA;oBAC7F,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC3B,CAAC;gBACD,UAAU,CAAC,KAAK,EAAE,CAAA;gBAClB,OAAM;YACR,CAAC;YAED,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAO,uCAAuC,CAAC,CAAC,CAAA;YAC7F,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;KACF,CAAC,CAAA;IAEF,OAAO;QACL,MAAM;QACN,UAAU;KACX,CAAA;AACH,CAAC"}
@@ -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,CAyEtJ"}
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 subdomain
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":"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"}
1
+ {"version":3,"file":"handle-redirects.js","sourceRoot":"","sources":["../../../src/utils/handle-redirects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Joins an array of strings as an IPFS path and URI encodes individual
3
+ * components
4
+ */
5
+ export declare function uriEncodeIPFSPath(str: string): string;
6
+ //# sourceMappingURL=ipfs-path-to-string.d.ts.map
@@ -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 { ParsedUrlStringResults } from './parse-url-string.js';
1
+ import type { UrlQuery } from '../index.ts';
2
2
  export interface IsAcceptExplicitOptions {
3
- query?: ParsedUrlStringResults['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?: ParsedUrlStringResults['query']): boolean;
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 `format` query parameter in the URL.
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,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAEnE,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,sBAAsB,CAAC,OAAO,CAAC,CAAA;IACvC,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,sBAAsB,CAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAMjE;AAED,wBAAgB,qBAAqB,CAAE,KAAK,CAAC,EAAE,sBAAsB,CAAC,OAAO,CAAC,GAAG,OAAO,CAMvF;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,uBAAuB,GAAG,OAAO,CAEjG"}
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 != null && Object.values(FORMAT_TO_MIME_TYPE).includes(incomingAcceptHeader)) {
5
- return true;
4
+ if (incomingAcceptHeader == null) {
5
+ return false;
6
6
  }
7
- return false;
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 `format` query parameter in the URL.
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;IAClD,IAAI,oBAAoB,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtG,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAE,KAAuC;IAC5E,MAAM,WAAW,GAAG,KAAK,EAAE,MAAM,CAAA;IACjC,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAClF,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;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
+ {"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
- queryString?: string;
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":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACvK,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,eAAO,MAAM,SAAS,gDAA2D,CAAA;AAEjF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;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;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,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;IAEZ;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA;CAC9C;AAOD,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;;;;;;;;;;GAUG;AAEH,wBAAsB,cAAc,CAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAwB,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA8JlL"}
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
- import { AbortError } from '@libp2p/interface';
2
- import { CID } from 'multiformats/cid';
3
- import { getPeerIdFromString } from './get-peer-id-from-string.js';
4
- import { serverTiming } from './server-timing.js';
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 queryString = groups?.queryString;
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
- (queryString == null || typeof queryString === 'string');
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
- return match.groups;
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