@helia/verified-fetch 4.1.1 → 5.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.
Files changed (231) hide show
  1. package/README.md +6 -40
  2. package/dist/index.min.js +73 -534
  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 -1
  6. package/dist/src/constants.js +2 -0
  7. package/dist/src/constants.js.map +1 -1
  8. package/dist/src/index.d.ts +162 -68
  9. package/dist/src/index.d.ts.map +1 -1
  10. package/dist/src/index.js +7 -40
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/plugins/index.d.ts +0 -5
  13. package/dist/src/plugins/index.d.ts.map +1 -1
  14. package/dist/src/plugins/index.js +0 -4
  15. package/dist/src/plugins/index.js.map +1 -1
  16. package/dist/src/plugins/plugin-base.d.ts +8 -9
  17. package/dist/src/plugins/plugin-base.d.ts.map +1 -1
  18. package/dist/src/plugins/plugin-base.js +5 -6
  19. package/dist/src/plugins/plugin-base.js.map +1 -1
  20. package/dist/src/plugins/plugin-handle-car.d.ts +3 -3
  21. package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
  22. package/dist/src/plugins/plugin-handle-car.js +38 -39
  23. package/dist/src/plugins/plugin-handle-car.js.map +1 -1
  24. package/dist/src/plugins/plugin-handle-ipld.d.ts +12 -0
  25. package/dist/src/plugins/plugin-handle-ipld.d.ts.map +1 -0
  26. package/dist/src/plugins/plugin-handle-ipld.js +83 -0
  27. package/dist/src/plugins/plugin-handle-ipld.js.map +1 -0
  28. package/dist/src/plugins/plugin-handle-ipns-record.d.ts +3 -3
  29. package/dist/src/plugins/plugin-handle-ipns-record.d.ts.map +1 -1
  30. package/dist/src/plugins/plugin-handle-ipns-record.js +25 -34
  31. package/dist/src/plugins/plugin-handle-ipns-record.js.map +1 -1
  32. package/dist/src/plugins/plugin-handle-tar.d.ts +3 -3
  33. package/dist/src/plugins/plugin-handle-tar.d.ts.map +1 -1
  34. package/dist/src/plugins/plugin-handle-tar.js +20 -22
  35. package/dist/src/plugins/plugin-handle-tar.js.map +1 -1
  36. package/dist/src/plugins/plugin-handle-unixfs.d.ts +14 -0
  37. package/dist/src/plugins/plugin-handle-unixfs.d.ts.map +1 -0
  38. package/dist/src/plugins/plugin-handle-unixfs.js +180 -0
  39. package/dist/src/plugins/plugin-handle-unixfs.js.map +1 -0
  40. package/dist/src/plugins/types.d.ts +1 -77
  41. package/dist/src/plugins/types.d.ts.map +1 -1
  42. package/dist/src/url-resolver.d.ts +29 -11
  43. package/dist/src/url-resolver.d.ts.map +1 -1
  44. package/dist/src/url-resolver.js +152 -74
  45. package/dist/src/url-resolver.js.map +1 -1
  46. package/dist/src/utils/content-type-parser.d.ts.map +1 -1
  47. package/dist/src/utils/content-type-parser.js +4 -3
  48. package/dist/src/utils/content-type-parser.js.map +1 -1
  49. package/dist/src/utils/content-types.d.ts +26 -0
  50. package/dist/src/utils/content-types.d.ts.map +1 -0
  51. package/dist/src/utils/content-types.js +137 -0
  52. package/dist/src/utils/content-types.js.map +1 -0
  53. package/dist/src/utils/convert-output.d.ts +17 -0
  54. package/dist/src/utils/convert-output.d.ts.map +1 -0
  55. package/dist/src/utils/convert-output.js +176 -0
  56. package/dist/src/utils/convert-output.js.map +1 -0
  57. package/dist/src/utils/error-to-response.d.ts +3 -0
  58. package/dist/src/utils/error-to-response.d.ts.map +1 -0
  59. package/dist/src/utils/error-to-response.js +40 -0
  60. package/dist/src/utils/error-to-response.js.map +1 -0
  61. package/dist/src/utils/get-content-disposition-filename.d.ts +1 -1
  62. package/dist/src/utils/get-content-disposition-filename.d.ts.map +1 -1
  63. package/dist/src/utils/get-content-disposition-filename.js +4 -0
  64. package/dist/src/utils/get-content-disposition-filename.js.map +1 -1
  65. package/dist/src/utils/get-e-tag.d.ts +20 -15
  66. package/dist/src/utils/get-e-tag.d.ts.map +1 -1
  67. package/dist/src/utils/get-e-tag.js +8 -22
  68. package/dist/src/utils/get-e-tag.js.map +1 -1
  69. package/dist/src/utils/get-offset-and-length.d.ts +12 -2
  70. package/dist/src/utils/get-offset-and-length.d.ts.map +1 -1
  71. package/dist/src/utils/get-offset-and-length.js +63 -21
  72. package/dist/src/utils/get-offset-and-length.js.map +1 -1
  73. package/dist/src/utils/get-range-header.d.ts +22 -0
  74. package/dist/src/utils/get-range-header.d.ts.map +1 -0
  75. package/dist/src/utils/get-range-header.js +69 -0
  76. package/dist/src/utils/get-range-header.js.map +1 -0
  77. package/dist/src/utils/parse-url-string.d.ts +2 -1
  78. package/dist/src/utils/parse-url-string.d.ts.map +1 -1
  79. package/dist/src/utils/parse-url-string.js +46 -71
  80. package/dist/src/utils/parse-url-string.js.map +1 -1
  81. package/dist/src/utils/resource-to-cache-key.d.ts +3 -3
  82. package/dist/src/utils/resource-to-cache-key.js +5 -5
  83. package/dist/src/utils/resource-to-cache-key.js.map +1 -1
  84. package/dist/src/utils/response-headers.d.ts +4 -14
  85. package/dist/src/utils/response-headers.d.ts.map +1 -1
  86. package/dist/src/utils/response-headers.js +36 -36
  87. package/dist/src/utils/response-headers.js.map +1 -1
  88. package/dist/src/utils/responses.d.ts +30 -11
  89. package/dist/src/utils/responses.d.ts.map +1 -1
  90. package/dist/src/utils/responses.js +146 -39
  91. package/dist/src/utils/responses.js.map +1 -1
  92. package/dist/src/verified-fetch.d.ts +16 -15
  93. package/dist/src/verified-fetch.d.ts.map +1 -1
  94. package/dist/src/verified-fetch.js +302 -238
  95. package/dist/src/verified-fetch.js.map +1 -1
  96. package/dist/typedoc-urls.json +64 -45
  97. package/package.json +4 -3
  98. package/src/constants.ts +3 -0
  99. package/src/index.ts +199 -68
  100. package/src/plugins/index.ts +0 -6
  101. package/src/plugins/plugin-base.ts +8 -10
  102. package/src/plugins/plugin-handle-car.ts +48 -46
  103. package/src/plugins/plugin-handle-ipld.ts +93 -0
  104. package/src/plugins/plugin-handle-ipns-record.ts +31 -41
  105. package/src/plugins/plugin-handle-tar.ts +25 -29
  106. package/src/plugins/plugin-handle-unixfs.ts +217 -0
  107. package/src/plugins/types.ts +0 -86
  108. package/src/url-resolver.ts +197 -83
  109. package/src/utils/content-type-parser.ts +4 -3
  110. package/src/utils/content-types.ts +159 -0
  111. package/src/utils/convert-output.ts +187 -0
  112. package/src/utils/error-to-response.ts +49 -0
  113. package/src/utils/get-content-disposition-filename.ts +7 -1
  114. package/src/utils/get-e-tag.ts +26 -35
  115. package/src/utils/get-offset-and-length.ts +75 -21
  116. package/src/utils/get-range-header.ts +107 -0
  117. package/src/utils/parse-url-string.ts +51 -80
  118. package/src/utils/resource-to-cache-key.ts +5 -5
  119. package/src/utils/response-headers.ts +40 -41
  120. package/src/utils/responses.ts +186 -45
  121. package/src/verified-fetch.ts +353 -270
  122. package/dist/src/plugins/plugin-handle-byte-range-context.d.ts +0 -14
  123. package/dist/src/plugins/plugin-handle-byte-range-context.d.ts.map +0 -1
  124. package/dist/src/plugins/plugin-handle-byte-range-context.js +0 -25
  125. package/dist/src/plugins/plugin-handle-byte-range-context.js.map +0 -1
  126. package/dist/src/plugins/plugin-handle-cbor.d.ts +0 -17
  127. package/dist/src/plugins/plugin-handle-cbor.d.ts.map +0 -1
  128. package/dist/src/plugins/plugin-handle-cbor.js +0 -94
  129. package/dist/src/plugins/plugin-handle-cbor.js.map +0 -1
  130. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts +0 -27
  131. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.d.ts.map +0 -1
  132. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js +0 -279
  133. package/dist/src/plugins/plugin-handle-dag-cbor-html-preview.js.map +0 -1
  134. package/dist/src/plugins/plugin-handle-dag-cbor.d.ts +0 -17
  135. package/dist/src/plugins/plugin-handle-dag-cbor.d.ts.map +0 -1
  136. package/dist/src/plugins/plugin-handle-dag-cbor.js +0 -66
  137. package/dist/src/plugins/plugin-handle-dag-cbor.js.map +0 -1
  138. package/dist/src/plugins/plugin-handle-dag-pb.d.ts +0 -17
  139. package/dist/src/plugins/plugin-handle-dag-pb.d.ts.map +0 -1
  140. package/dist/src/plugins/plugin-handle-dag-pb.js +0 -209
  141. package/dist/src/plugins/plugin-handle-dag-pb.js.map +0 -1
  142. package/dist/src/plugins/plugin-handle-dag-walk.d.ts +0 -21
  143. package/dist/src/plugins/plugin-handle-dag-walk.d.ts.map +0 -1
  144. package/dist/src/plugins/plugin-handle-dag-walk.js +0 -95
  145. package/dist/src/plugins/plugin-handle-dag-walk.js.map +0 -1
  146. package/dist/src/plugins/plugin-handle-dir-index-html.d.ts +0 -10
  147. package/dist/src/plugins/plugin-handle-dir-index-html.d.ts.map +0 -1
  148. package/dist/src/plugins/plugin-handle-dir-index-html.js +0 -59
  149. package/dist/src/plugins/plugin-handle-dir-index-html.js.map +0 -1
  150. package/dist/src/plugins/plugin-handle-json.d.ts +0 -12
  151. package/dist/src/plugins/plugin-handle-json.d.ts.map +0 -1
  152. package/dist/src/plugins/plugin-handle-json.js +0 -73
  153. package/dist/src/plugins/plugin-handle-json.js.map +0 -1
  154. package/dist/src/plugins/plugin-handle-raw.d.ts +0 -9
  155. package/dist/src/plugins/plugin-handle-raw.d.ts.map +0 -1
  156. package/dist/src/plugins/plugin-handle-raw.js +0 -92
  157. package/dist/src/plugins/plugin-handle-raw.js.map +0 -1
  158. package/dist/src/plugins/plugins.d.ts +0 -6
  159. package/dist/src/plugins/plugins.d.ts.map +0 -1
  160. package/dist/src/plugins/plugins.js +0 -6
  161. package/dist/src/plugins/plugins.js.map +0 -1
  162. package/dist/src/utils/byte-range-context.d.ts +0 -103
  163. package/dist/src/utils/byte-range-context.d.ts.map +0 -1
  164. package/dist/src/utils/byte-range-context.js +0 -504
  165. package/dist/src/utils/byte-range-context.js.map +0 -1
  166. package/dist/src/utils/dag-cbor-to-safe-json.d.ts +0 -15
  167. package/dist/src/utils/dag-cbor-to-safe-json.d.ts.map +0 -1
  168. package/dist/src/utils/dag-cbor-to-safe-json.js +0 -54
  169. package/dist/src/utils/dag-cbor-to-safe-json.js.map +0 -1
  170. package/dist/src/utils/dir-index-html.d.ts +0 -19
  171. package/dist/src/utils/dir-index-html.d.ts.map +0 -1
  172. package/dist/src/utils/dir-index-html.js +0 -438
  173. package/dist/src/utils/dir-index-html.js.map +0 -1
  174. package/dist/src/utils/get-peer-id-from-string.d.ts +0 -3
  175. package/dist/src/utils/get-peer-id-from-string.d.ts.map +0 -1
  176. package/dist/src/utils/get-peer-id-from-string.js +0 -10
  177. package/dist/src/utils/get-peer-id-from-string.js.map +0 -1
  178. package/dist/src/utils/get-resolved-accept-header.d.ts +0 -9
  179. package/dist/src/utils/get-resolved-accept-header.d.ts.map +0 -1
  180. package/dist/src/utils/get-resolved-accept-header.js +0 -27
  181. package/dist/src/utils/get-resolved-accept-header.js.map +0 -1
  182. package/dist/src/utils/get-stream-from-async-iterable.d.ts +0 -9
  183. package/dist/src/utils/get-stream-from-async-iterable.d.ts.map +0 -1
  184. package/dist/src/utils/get-stream-from-async-iterable.js +0 -43
  185. package/dist/src/utils/get-stream-from-async-iterable.js.map +0 -1
  186. package/dist/src/utils/handle-redirects.d.ts +0 -16
  187. package/dist/src/utils/handle-redirects.d.ts.map +0 -1
  188. package/dist/src/utils/handle-redirects.js +0 -84
  189. package/dist/src/utils/handle-redirects.js.map +0 -1
  190. package/dist/src/utils/is-accept-explicit.d.ts +0 -15
  191. package/dist/src/utils/is-accept-explicit.d.ts.map +0 -1
  192. package/dist/src/utils/is-accept-explicit.js +0 -26
  193. package/dist/src/utils/is-accept-explicit.js.map +0 -1
  194. package/dist/src/utils/request-headers.d.ts +0 -13
  195. package/dist/src/utils/request-headers.d.ts.map +0 -1
  196. package/dist/src/utils/request-headers.js +0 -63
  197. package/dist/src/utils/request-headers.js.map +0 -1
  198. package/dist/src/utils/select-output-type.d.ts +0 -17
  199. package/dist/src/utils/select-output-type.d.ts.map +0 -1
  200. package/dist/src/utils/select-output-type.js +0 -153
  201. package/dist/src/utils/select-output-type.js.map +0 -1
  202. package/dist/src/utils/tlru.d.ts +0 -15
  203. package/dist/src/utils/tlru.d.ts.map +0 -1
  204. package/dist/src/utils/tlru.js +0 -34
  205. package/dist/src/utils/tlru.js.map +0 -1
  206. package/dist/src/utils/walk-path.d.ts +0 -27
  207. package/dist/src/utils/walk-path.d.ts.map +0 -1
  208. package/dist/src/utils/walk-path.js +0 -45
  209. package/dist/src/utils/walk-path.js.map +0 -1
  210. package/src/plugins/plugin-handle-byte-range-context.ts +0 -30
  211. package/src/plugins/plugin-handle-cbor.ts +0 -107
  212. package/src/plugins/plugin-handle-dag-cbor-html-preview.ts +0 -295
  213. package/src/plugins/plugin-handle-dag-cbor.ts +0 -83
  214. package/src/plugins/plugin-handle-dag-pb.ts +0 -248
  215. package/src/plugins/plugin-handle-dag-walk.ts +0 -110
  216. package/src/plugins/plugin-handle-dir-index-html.ts +0 -72
  217. package/src/plugins/plugin-handle-json.ts +0 -80
  218. package/src/plugins/plugin-handle-raw.ts +0 -110
  219. package/src/plugins/plugins.ts +0 -5
  220. package/src/utils/byte-range-context.ts +0 -597
  221. package/src/utils/dag-cbor-to-safe-json.ts +0 -63
  222. package/src/utils/dir-index-html.ts +0 -505
  223. package/src/utils/get-peer-id-from-string.ts +0 -12
  224. package/src/utils/get-resolved-accept-header.ts +0 -42
  225. package/src/utils/get-stream-from-async-iterable.ts +0 -49
  226. package/src/utils/handle-redirects.ts +0 -109
  227. package/src/utils/is-accept-explicit.ts +0 -38
  228. package/src/utils/request-headers.ts +0 -65
  229. package/src/utils/select-output-type.ts +0 -175
  230. package/src/utils/tlru.ts +0 -42
  231. package/src/utils/walk-path.ts +0 -69
@@ -12,7 +12,7 @@ export function setCacheControlHeader({ ttl, protocol, response }) {
12
12
  return;
13
13
  }
14
14
  let headerValue;
15
- if (protocol === 'ipfs') {
15
+ if (protocol === 'ipfs:') {
16
16
  headerValue = 'public, max-age=29030400, immutable';
17
17
  }
18
18
  else if (ttl == null) {
@@ -29,52 +29,52 @@ export function setCacheControlHeader({ ttl, protocol, response }) {
29
29
  response.headers.set('cache-control', headerValue);
30
30
  }
31
31
  /**
32
- * This function returns the value of the `Content-Range` header for a given range.
32
+ * This function returns the value of the `Content-Range` header for a given
33
+ * range.
34
+ *
33
35
  * If you know the total size of the body, pass it as `byteSize`
34
36
  *
35
37
  * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Range
36
38
  */
37
- export function getContentRangeHeader({ byteStart, byteEnd, byteSize }) {
38
- const total = byteSize ?? '*'; // if we don't know the total size, we should use *
39
- if ((byteEnd ?? 0) >= (byteSize ?? Infinity)) {
39
+ export function getContentRangeHeader(byteSize, byteStart, byteEnd) {
40
+ if (byteStart != null) {
41
+ byteStart = BigInt(byteStart);
42
+ }
43
+ if (byteEnd != null) {
44
+ byteEnd = BigInt(byteEnd);
45
+ }
46
+ // if we don't know the total size, we should use *
47
+ const total = BigInt(byteSize);
48
+ // validate start/end are not outside total size
49
+ if ((byteEnd ?? 0n) >= total) {
40
50
  throw new InvalidRangeError('Invalid range: Range-end index is greater than or equal to the size of the file.');
41
51
  }
42
- if ((byteStart ?? 0) >= (byteSize ?? Infinity)) {
52
+ if ((byteStart ?? 0n) >= total) {
43
53
  throw new InvalidRangeError('Invalid range: Range-start index is greater than or equal to the size of the file.');
44
54
  }
45
- if (byteStart != null && byteEnd == null) {
46
- // only byteStart in range
47
- if (byteSize == null) {
48
- return `bytes */${total}`;
55
+ let range = '*';
56
+ if (byteStart == null) {
57
+ if (byteEnd != null) {
58
+ if (byteEnd < 0n) {
59
+ range = `${total + byteEnd}-${total - 1n}`;
60
+ }
61
+ else {
62
+ range = `0-${byteEnd}`;
63
+ }
49
64
  }
50
- return `bytes ${byteStart}-${byteSize - 1}/${byteSize}`;
51
65
  }
52
- if (byteStart == null && byteEnd != null) {
53
- // only byteEnd in range
54
- if (byteSize == null) {
55
- return `bytes */${total}`;
66
+ else {
67
+ if (byteEnd == null) {
68
+ let end = '*';
69
+ if (byteSize != null) {
70
+ end = `${total - 1n}`;
71
+ }
72
+ range = `${byteStart}-${end}`;
73
+ }
74
+ else {
75
+ range = `${byteStart}-${byteEnd}`;
56
76
  }
57
- const end = byteSize - 1;
58
- const start = end - byteEnd + 1;
59
- return `bytes ${start}-${end}/${byteSize}`;
60
- }
61
- if (byteStart == null && byteEnd == null) {
62
- // neither are provided, we can't return a valid range.
63
- return `bytes */${total}`;
64
- }
65
- return `bytes ${byteStart}-${byteEnd}/${total}`;
66
- }
67
- /**
68
- * Sets the `X-Ipfs-Roots` header on the response if it exists.
69
- *
70
- * @see https://specs.ipfs.tech/http-gateways/path-gateway/#x-ipfs-roots-response-header
71
- */
72
- export function setIpfsRoots(response, ipfsRoots) {
73
- if (ipfsRoots != null) {
74
- response.headers.set('X-Ipfs-Roots', getIpfsRoots(ipfsRoots));
75
77
  }
76
- }
77
- export function getIpfsRoots(ipfsRoots) {
78
- return ipfsRoots.map(cid => cid.toV1().toString()).join(',');
78
+ return `bytes ${range}/${total}`;
79
79
  }
80
80
  //# sourceMappingURL=response-headers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"response-headers.js","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAchD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAA6B;IAC3F,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1C,uDAAuD;QACvD,OAAM;IACR,CAAC;IACD,IAAI,WAAmB,CAAA;IACvB,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,WAAW,GAAG,qCAAqC,CAAA;IACrD,CAAC;SAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB;;;;WAIG;QACH,WAAW,GAAG,qBAAqB,CAAA;IACrC,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,mBAAmB,GAAG,EAAE,CAAA;IACxC,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAgG;IACnK,MAAM,KAAK,GAAG,QAAQ,IAAI,GAAG,CAAA,CAAC,mDAAmD;IAEjF,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,iBAAiB,CAAC,kFAAkF,CAAC,CAAA;IACjH,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,iBAAiB,CAAC,oFAAoF,CAAC,CAAA;IACnH,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,0BAA0B;QAC1B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,OAAO,SAAS,SAAS,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAA;IACzD,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,wBAAwB;QACxB,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,WAAW,KAAK,EAAE,CAAA;QAC3B,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAA;QACxB,MAAM,KAAK,GAAG,GAAG,GAAG,OAAO,GAAG,CAAC,CAAA;QAE/B,OAAO,SAAS,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC5C,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACzC,uDAAuD;QACvD,OAAO,WAAW,KAAK,EAAE,CAAA;IAC3B,CAAC;IAED,OAAO,SAAS,SAAS,IAAI,OAAO,IAAI,KAAK,EAAE,CAAA;AACjD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAE,QAAkB,EAAE,SAAiB;IACjE,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,SAAgB;IAC5C,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC9D,CAAC"}
1
+ {"version":3,"file":"response-headers.js","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAahD;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAA6B;IAC3F,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1C,uDAAuD;QACvD,OAAM;IACR,CAAC;IAED,IAAI,WAAmB,CAAA;IAEvB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,WAAW,GAAG,qCAAqC,CAAA;IACrD,CAAC;SAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB;;;;WAIG;QACH,WAAW,GAAG,qBAAqB,CAAA;IACrC,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,mBAAmB,GAAG,EAAE,CAAA;IACxC,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC,CAAA;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAE,QAAkC,EAAE,SAAoC,EAAE,OAAkC;IACjJ,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;IAED,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;IAC3B,CAAC;IAED,mDAAmD;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;IAE9B,gDAAgD;IAChD,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,iBAAiB,CAAC,kFAAkF,CAAC,CAAA;IACjH,CAAC;IAED,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,iBAAiB,CAAC,oFAAoF,CAAC,CAAA;IACnH,CAAC;IAED,IAAI,KAAK,GAAG,GAAG,CAAA;IAEf,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;gBACjB,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,EAAE,EAAE,CAAA;YAC5C,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,KAAK,OAAO,EAAE,CAAA;YACxB,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,IAAI,GAAG,GAAG,GAAG,CAAA;YAEb,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,EAAE,CAAA;YACvB,CAAC;YAED,KAAK,GAAG,GAAG,SAAS,IAAI,GAAG,EAAE,CAAA;QAC/B,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,GAAG,SAAS,IAAI,OAAO,EAAE,CAAA;QACnC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,KAAK,IAAI,KAAK,EAAE,CAAA;AAClC,CAAC"}
@@ -1,28 +1,47 @@
1
- import type { ByteRangeContext } from './byte-range-context.js';
2
- import type { SupportedBodyTypes } from '../index.js';
3
- import type { Logger } from '@libp2p/interface';
1
+ import type { SupportedBodyTypes, ContentType } from '../index.js';
2
+ import type { RangeHeader } from './get-range-header.ts';
4
3
  export interface ResponseOptions extends ResponseInit {
5
4
  redirected?: boolean;
6
5
  }
7
6
  export declare function okResponse(url: string, body?: SupportedBodyTypes, init?: ResponseOptions): Response;
8
7
  export declare function internalServerErrorResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
8
+ /**
9
+ * A 504 Gateway Timeout for when a request made to an upstream server timed out
10
+ */
11
+ export declare function gatewayTimeoutResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
12
+ /**
13
+ * A 502 Bad Gateway is for when an invalid response was received from an
14
+ * upstream server.
15
+ */
9
16
  export declare function badGatewayResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
10
17
  export declare function notImplementedResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
11
- export declare function notAcceptableResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
18
+ export declare function notAcceptableResponse(url: string | URL, acceptable: ContentType[], init?: ResponseInit): Response;
12
19
  export declare function notFoundResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
13
20
  export declare function badRequestResponse(url: string, errors: Error | Error[], init?: ResponseInit): Response;
14
21
  export declare function movedPermanentlyResponse(url: string, location: string, init?: ResponseInit): Response;
15
- interface RangeOptions {
16
- byteRangeContext: ByteRangeContext;
17
- log?: Logger;
22
+ export interface PartialContent {
23
+ /**
24
+ * Yield data from the content starting at `start` (or 0) inclusive and ending
25
+ * at `end` exclusive
26
+ */
27
+ (offset: number, length: number): AsyncGenerator<Uint8Array>;
18
28
  }
19
- export declare function okRangeResponse(url: string, body: SupportedBodyTypes, { byteRangeContext, log }: RangeOptions, init?: ResponseOptions): Response;
29
+ export declare function partialContentResponse(url: string, getSlice: PartialContent, range: RangeHeader, documentSize: number | bigint, init?: ResponseOptions): Response;
20
30
  /**
21
- * We likely need to catch errors handled by upstream helia libraries if range-request throws an error. Some examples:
31
+ * We likely need to catch errors handled by upstream helia libraries if
32
+ * range-request throws an error. Some examples:
33
+ *
22
34
  * - The range is out of bounds
23
35
  * - The range is invalid
24
36
  * - The range is not supported for the given type
25
37
  */
26
- export declare function badRangeResponse(url: string, body?: SupportedBodyTypes, init?: ResponseInit): Response;
27
- export {};
38
+ export declare function notSatisfiableResponse(url: string, documentSize?: number | bigint | string, init?: ResponseInit): Response;
39
+ /**
40
+ * Error to indicate that request was formally correct, but Gateway is unable to
41
+ * return requested data under the additional (usually cache-related) conditions
42
+ * sent by the client.
43
+ *
44
+ * @see https://specs.ipfs.tech/http-gateways/path-gateway/#412-precondition-failed
45
+ */
46
+ export declare function preconditionFailedResponse(url: string, init?: ResponseInit): Response;
28
47
  //# sourceMappingURL=responses.d.ts.map
@@ -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;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"}
1
+ {"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,KAAK,EAAS,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAkC/D,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;;GAEG;AACH,wBAAgB,sBAAsB,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAW7G;AAED;;;GAGG;AACH,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,GAAG,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAiBlH;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,CAgCvG;AAED,wBAAgB,wBAAwB,CAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAetG;AAED,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;CAC7D;AAED,wBAAgB,sBAAsB,CAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,eAAe,GAAG,QAAQ,CAmBlK;AAoGD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAE,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CAkB3H;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,QAAQ,CActF"}
@@ -1,3 +1,7 @@
1
+ import itToBrowserReadableStream from 'it-to-browser-readablestream';
2
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
3
+ import { rangeToOffsetAndLength } from "./get-offset-and-length.js";
4
+ import { getContentRangeHeader } from "./response-headers.js";
1
5
  function setField(response, name, value) {
2
6
  Object.defineProperty(response, name, {
3
7
  enumerable: true,
@@ -7,14 +11,19 @@ function setField(response, name, value) {
7
11
  });
8
12
  }
9
13
  function setType(response, value) {
10
- setField(response, 'type', value);
14
+ if (response.type !== value) {
15
+ setField(response, 'type', value);
16
+ }
11
17
  }
12
18
  function setUrl(response, value) {
19
+ value = value.toString();
13
20
  const fragmentStart = value.indexOf('#');
14
21
  if (fragmentStart > -1) {
15
22
  value = value.substring(0, fragmentStart);
16
23
  }
17
- setField(response, 'url', value);
24
+ if (response.url !== value) {
25
+ setField(response, 'url', value);
26
+ }
18
27
  }
19
28
  function setRedirected(response) {
20
29
  setField(response, 'redirected', true);
@@ -43,6 +52,23 @@ export function internalServerErrorResponse(url, body, init) {
43
52
  setUrl(response, url);
44
53
  return response;
45
54
  }
55
+ /**
56
+ * A 504 Gateway Timeout for when a request made to an upstream server timed out
57
+ */
58
+ export function gatewayTimeoutResponse(url, body, init) {
59
+ const response = new Response(body, {
60
+ ...(init ?? {}),
61
+ status: 504,
62
+ statusText: 'Gateway Timeout'
63
+ });
64
+ setType(response, 'basic');
65
+ setUrl(response, url);
66
+ return response;
67
+ }
68
+ /**
69
+ * A 502 Bad Gateway is for when an invalid response was received from an
70
+ * upstream server.
71
+ */
46
72
  export function badGatewayResponse(url, body, init) {
47
73
  const response = new Response(body, {
48
74
  ...(init ?? {}),
@@ -64,11 +90,16 @@ export function notImplementedResponse(url, body, init) {
64
90
  setUrl(response, url);
65
91
  return response;
66
92
  }
67
- export function notAcceptableResponse(url, body, init) {
68
- const response = new Response(body, {
93
+ export function notAcceptableResponse(url, acceptable, init) {
94
+ const headers = new Headers(init?.headers);
95
+ headers.set('content-type', 'application/json');
96
+ const response = new Response(JSON.stringify({
97
+ acceptable: acceptable.map(contentType => contentType.mediaType)
98
+ }), {
69
99
  ...(init ?? {}),
70
100
  status: 406,
71
- statusText: 'Not Acceptable'
101
+ statusText: 'Not Acceptable',
102
+ headers
72
103
  });
73
104
  setType(response, 'basic');
74
105
  setUrl(response, url);
@@ -130,59 +161,135 @@ export function movedPermanentlyResponse(url, location, init) {
130
161
  setUrl(response, url);
131
162
  return response;
132
163
  }
133
- export function okRangeResponse(url, body, { byteRangeContext, log }, init) {
134
- if (!byteRangeContext.isRangeRequest) {
135
- return okResponse(url, body, init);
164
+ export function partialContentResponse(url, getSlice, range, documentSize, init) {
165
+ let response;
166
+ if (range.ranges.length === 1) {
167
+ response = singleRangeResponse(url, getSlice, range.ranges[0], documentSize, init);
136
168
  }
137
- if (!byteRangeContext.isValidRangeRequest) {
138
- return badRangeResponse(url, body, init);
169
+ else if (range.ranges.length > 1) {
170
+ response = multiRangeResponse(url, getSlice, range, documentSize, init);
139
171
  }
140
- let response;
172
+ else {
173
+ return notSatisfiableResponse(url, documentSize);
174
+ }
175
+ if (init?.redirected === true) {
176
+ setRedirected(response);
177
+ }
178
+ setType(response, 'basic');
179
+ setUrl(response, url);
180
+ return response;
181
+ }
182
+ function singleRangeResponse(url, getSlice, range, documentSize, init) {
141
183
  try {
142
- // Create headers object with any initial headers from init
184
+ // create headers object with any initial headers from init
143
185
  const headers = new Headers(init?.headers);
144
- // For multipart responses, we should use the content-type header instead of content-range
145
- const multipartContentType = byteRangeContext.getContentType();
146
- if (multipartContentType != null) {
147
- headers.set('content-type', multipartContentType);
148
- }
149
- else {
150
- if (byteRangeContext.isMultiRangeRequest) {
151
- headers.set('content-type', 'multipart/byteranges');
152
- }
153
- else {
154
- headers.set('content-range', byteRangeContext.contentRangeHeaderValue);
155
- }
156
- }
157
- response = new Response(body, {
186
+ const { offset, length } = rangeToOffsetAndLength(documentSize, range.start, range.end);
187
+ headers.set('content-length', `${length}`);
188
+ // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Range
189
+ headers.set('content-range', getContentRangeHeader(documentSize, range.start, range.end));
190
+ const stream = itToBrowserReadableStream(getSlice(offset, length));
191
+ return new Response(stream, {
158
192
  ...(init ?? {}),
159
193
  status: 206,
160
194
  statusText: 'Partial Content',
161
195
  headers
162
196
  });
163
197
  }
164
- catch (e) {
165
- log?.error('failed to create range response', e);
166
- return badRangeResponse(url, body, init);
198
+ catch (err) {
199
+ if (err.name === 'InvalidRangeError') {
200
+ return notSatisfiableResponse(url, documentSize, init);
201
+ }
202
+ return internalServerErrorResponse(url, '', init);
167
203
  }
168
- if (init?.redirected === true) {
169
- setRedirected(response);
204
+ }
205
+ /**
206
+ * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Range_requests
207
+ */
208
+ function multiRangeResponse(url, getSlice, range, documentSize, init) {
209
+ // create headers object with any initial headers from init
210
+ const headers = new Headers(init?.headers);
211
+ const contentType = headers.get('content-type');
212
+ if (contentType == null) {
213
+ throw new Error('Content-Type header must be set');
170
214
  }
171
- setType(response, 'basic');
172
- setUrl(response, url);
173
- return response;
215
+ headers.delete('content-type');
216
+ let contentLength = 0n;
217
+ // calculate content range based on range headers
218
+ const rangeHeaders = range.ranges.map(({ start, end }) => {
219
+ const header = uint8ArrayFromString([
220
+ `--${range.multipartBoundary}`,
221
+ // content-type of multipart part
222
+ `Content-Type: ${contentType}`,
223
+ // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Range
224
+ `Content-Range: ${getContentRangeHeader(documentSize, start, end)}`,
225
+ '',
226
+ ''
227
+ ].join('\r\n'));
228
+ contentLength += BigInt(header.byteLength) + (BigInt(end ?? documentSize) - BigInt(start ?? 0));
229
+ return header;
230
+ });
231
+ const trailer = uint8ArrayFromString([
232
+ `--${range.multipartBoundary}--`,
233
+ ''
234
+ ].join('\r\n'));
235
+ contentLength += BigInt(trailer.byteLength);
236
+ // content length is the expected length of all multipart parts
237
+ headers.set('content-length', `${contentLength}`);
238
+ // content type of response is multipart
239
+ headers.set('content-type', `multipart/byteranges; boundary=${range.multipartBoundary}`);
240
+ const stream = itToBrowserReadableStream(async function* () {
241
+ for (let i = 0; i < rangeHeaders.length; i++) {
242
+ yield rangeHeaders[i];
243
+ const { offset, length } = rangeToOffsetAndLength(documentSize, range.ranges[i].start, range.ranges[i].end);
244
+ yield* getSlice(offset, length);
245
+ yield uint8ArrayFromString('\r\n');
246
+ }
247
+ yield trailer;
248
+ }());
249
+ return new Response(stream, {
250
+ ...(init ?? {}),
251
+ status: 206,
252
+ statusText: 'Partial Content',
253
+ headers
254
+ });
174
255
  }
175
256
  /**
176
- * We likely need to catch errors handled by upstream helia libraries if range-request throws an error. Some examples:
257
+ * We likely need to catch errors handled by upstream helia libraries if
258
+ * range-request throws an error. Some examples:
259
+ *
177
260
  * - The range is out of bounds
178
261
  * - The range is invalid
179
262
  * - The range is not supported for the given type
180
263
  */
181
- export function badRangeResponse(url, body, init) {
182
- const response = new Response(body, {
183
- ...(init ?? {}),
264
+ export function notSatisfiableResponse(url, documentSize, init) {
265
+ const headers = new Headers(init?.headers);
266
+ if (documentSize != null) {
267
+ headers.set('content-range', `bytes */${documentSize}`);
268
+ }
269
+ const response = new Response('Range Not Satisfiable', {
270
+ ...init,
271
+ headers,
184
272
  status: 416,
185
- statusText: 'Requested Range Not Satisfiable'
273
+ statusText: 'Range Not Satisfiable'
274
+ });
275
+ setType(response, 'basic');
276
+ setUrl(response, url);
277
+ return response;
278
+ }
279
+ /**
280
+ * Error to indicate that request was formally correct, but Gateway is unable to
281
+ * return requested data under the additional (usually cache-related) conditions
282
+ * sent by the client.
283
+ *
284
+ * @see https://specs.ipfs.tech/http-gateways/path-gateway/#412-precondition-failed
285
+ */
286
+ export function preconditionFailedResponse(url, init) {
287
+ const headers = new Headers(init?.headers);
288
+ const response = new Response('Precondition Failed', {
289
+ ...init,
290
+ headers,
291
+ status: 412,
292
+ statusText: 'Precondition Failed'
186
293
  });
187
294
  setType(response, 'basic');
188
295
  setUrl(response, url);
@@ -1 +1 @@
1
- {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"responses.js","sourceRoot":"","sources":["../../../src/utils/responses.ts"],"names":[],"mappings":"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"}
@@ -6,30 +6,31 @@ export declare class VerifiedFetch {
6
6
  private readonly dnsLink;
7
7
  private readonly log;
8
8
  private readonly contentTypeParser;
9
- private readonly blockstoreSessions;
10
9
  private readonly withServerTiming;
11
10
  private readonly plugins;
11
+ private readonly urlResolver;
12
12
  constructor(helia: Helia, init?: CreateVerifiedFetchOptions);
13
- private getBlockstore;
14
13
  /**
15
- * The last place a Response touches in verified-fetch before being returned to the user. This is where we add the
16
- * Server-Timing header to the response if it has been collected. It should be used for any final processing of the
17
- * response before it is returned to the user.
14
+ * Load a resource from the IPFS network and ensure the retrieved data is the
15
+ * data that was expected to be loaded.
16
+ *
17
+ * Like [fetch](https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch)
18
+ * but verified.
18
19
  */
19
- private handleFinalResponse;
20
+ fetch(resource: Resource, opts?: VerifiedFetchOptions): Promise<Response>;
20
21
  /**
21
- * Runs plugins in a loop. After each plugin that returns `null` (partial/no final),
22
- * we re-check `canHandle()` for all plugins in the next iteration if the context changed.
22
+ * Returns a prioritized list of acceptable content types for the response
23
+ * based on the CID and a passed `Accept` header
23
24
  */
24
- private runPluginPipeline;
25
+ private getAcceptHeader;
25
26
  /**
26
- * We're starting to get to the point where we need a queue or pipeline of
27
- * operations to perform and a single place to handle errors.
28
- *
29
- * TODO: move operations called by fetch to a queue of operations where we can
30
- * always exit early (and cleanly) if a given signal is aborted
27
+ * The last place a Response touches in verified-fetch before being returned
28
+ * to the user. This is where we add the Server-Timing header to the response
29
+ * if it has been collected. It should be used for any final processing of the
30
+ * response before it is returned to the user.
31
31
  */
32
- fetch(resource: Resource, opts?: VerifiedFetchOptions): Promise<Response>;
32
+ private handleFinalResponse;
33
+ private runPluginPipeline;
33
34
  /**
34
35
  * Start the Helia instance
35
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AA4BA,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;IAqDhE,OAAO,CAAC,aAAa;IAgBrB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAoG3B;;;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
+ {"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAA8C,0BAA0B,EAAoB,QAAQ,EAAkB,iBAAiB,IAAI,oBAAoB,EAAqD,MAAM,YAAY,CAAA;AAElP,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAiD7C,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,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAE5B,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,0BAA+B;IA8ChE;;;;;;OAMG;IACG,KAAK,CAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA4GhF;;;OAGG;IACH,OAAO,CAAC,eAAe;IA8HvB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;YA0Db,iBAAiB;IA0E/B;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAI7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B"}