@helia/verified-fetch 1.2.0 → 1.2.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.
@@ -19,8 +19,6 @@ export declare class ByteRangeContext {
19
19
  setBody(body: SupportedBodyTypes): void;
20
20
  getBody(): SupportedBodyTypes;
21
21
  private getSlicedBody;
22
- private get isSuffixLengthRequest();
23
- private get isPrefixLengthRequest();
24
22
  /**
25
23
  * Sometimes, we need to set the fileSize explicitly because we can't calculate
26
24
  * the size of the body (e.g. for unixfs content where we call .stat).
@@ -1 +1 @@
1
- {"version":3,"file":"byte-range-context.d.ts","sourceRoot":"","sources":["../../../src/utils/byte-range-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAuChE,qBAAa,gBAAgB;IAgBW,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAf/D,SAAgB,cAAc,EAAE,OAAO,CAAA;IAEvC;;OAEG;IACH,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAoB;gBAEvB,MAAM,EAAE,eAAe,EAAmB,OAAO,CAAC,yBAAa;IAyBrE,OAAO,CAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAQxC,OAAO,IAAK,kBAAkB;IA2BrC,OAAO,CAAC,aAAa;IAgBrB,OAAO,KAAK,qBAAqB,GAEhC;IAED,OAAO,KAAK,qBAAqB,GAEhC;IAED;;;;;OAKG;IACI,WAAW,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI;IAOhD,WAAW,IAAK,MAAM,GAAG,IAAI,GAAG,SAAS;IAIhD,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,cAAc;IAYtB;;;OAGG;IACH,IAAW,mBAAmB,IAAK,OAAO,CA+BzC;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAK,MAAM,CAY3B;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAK,MAAM,GAAG,SAAS,CAEvC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;;;;;OAUG;IAEH,IAAW,uBAAuB,IAAK,MAAM,CAW5C;CACF"}
1
+ {"version":3,"file":"byte-range-context.d.ts","sourceRoot":"","sources":["../../../src/utils/byte-range-context.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAuChE,qBAAa,gBAAgB;IAgBW,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAf/D,SAAgB,cAAc,EAAE,OAAO,CAAA;IAEvC;;OAEG;IACH,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAe;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,QAAQ,CAAoB;gBAEvB,MAAM,EAAE,eAAe,EAAmB,OAAO,CAAC,yBAAa;IAyBrE,OAAO,CAAE,IAAI,EAAE,kBAAkB,GAAG,IAAI;IAQxC,OAAO,IAAK,kBAAkB;IA4BrC,OAAO,CAAC,aAAa;IAOrB;;;;;OAKG;IACI,WAAW,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI;IAOhD,WAAW,IAAK,MAAM,GAAG,IAAI,GAAG,SAAS;IAIhD,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,cAAc;IAetB;;;OAGG;IACH,IAAW,mBAAmB,IAAK,OAAO,CAmCzC;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAK,MAAM,CAE3B;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAK,MAAM,GAAG,SAAS,CASvC;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,gBAAgB;IAoBxB;;;;;;;;;;OAUG;IAEH,IAAW,uBAAuB,IAAK,MAAM,CAW5C;CACF"}
@@ -101,26 +101,13 @@ export class ByteRangeContext {
101
101
  this.log.error('returning unmodified body for valid range request');
102
102
  return body;
103
103
  }
104
+ // TODO: we should be able to use this.offset and this.length to slice the body
104
105
  getSlicedBody(body) {
105
- if (this.isPrefixLengthRequest) {
106
- this.log.trace('sliced body with byteStart %o', this.byteStart);
107
- return body.slice(this.offset);
108
- }
109
- if (this.isSuffixLengthRequest && this.length != null) {
110
- this.log.trace('sliced body with length %o', -this.length);
111
- return body.slice(-this.length);
112
- }
113
106
  const offset = this.byteStart ?? 0;
114
107
  const length = this.byteEnd == null ? undefined : this.byteEnd + 1;
115
108
  this.log.trace('returning body with offset %o and length %o', offset, length);
116
109
  return body.slice(offset, length);
117
110
  }
118
- get isSuffixLengthRequest() {
119
- return this.requestRangeStart == null && this.requestRangeEnd != null;
120
- }
121
- get isPrefixLengthRequest() {
122
- return this.requestRangeStart != null && this.requestRangeEnd == null;
123
- }
124
111
  /**
125
112
  * Sometimes, we need to set the fileSize explicitly because we can't calculate
126
113
  * the size of the body (e.g. for unixfs content where we call .stat).
@@ -141,7 +128,10 @@ export class ByteRangeContext {
141
128
  if (this.byteStart < 0) {
142
129
  return false;
143
130
  }
144
- if (this._fileSize != null && this.byteStart > this._fileSize) {
131
+ if (this._fileSize != null && this.byteStart >= this._fileSize) {
132
+ return false;
133
+ }
134
+ if (this.byteEnd != null && this.byteStart > this.byteEnd) {
145
135
  return false;
146
136
  }
147
137
  }
@@ -152,7 +142,10 @@ export class ByteRangeContext {
152
142
  if (this.byteEnd < 0) {
153
143
  return false;
154
144
  }
155
- if (this._fileSize != null && this.byteEnd > this._fileSize) {
145
+ if (this._fileSize != null && this.byteEnd >= this._fileSize) {
146
+ return false;
147
+ }
148
+ if (this.byteStart != null && this.byteEnd < this.byteStart) {
156
149
  return false;
157
150
  }
158
151
  }
@@ -193,6 +186,10 @@ export class ByteRangeContext {
193
186
  return false;
194
187
  }
195
188
  }
189
+ if (this.byteEnd == null && this.byteStart == null && this.byteSize == null) {
190
+ this.log.trace('invalid range request, could not calculate byteStart, byteEnd, or byteSize');
191
+ return false;
192
+ }
196
193
  return true;
197
194
  }
198
195
  /**
@@ -201,15 +198,6 @@ export class ByteRangeContext {
201
198
  * 2. slicing the body
202
199
  */
203
200
  get offset() {
204
- if (this.byteStart === 0) {
205
- return 0;
206
- }
207
- if (this.isPrefixLengthRequest || this.isSuffixLengthRequest) {
208
- if (this.byteStart != null) {
209
- // we have to subtract by 1 because the offset is inclusive
210
- return this.byteStart - 1;
211
- }
212
- }
213
201
  return this.byteStart ?? 0;
214
202
  }
215
203
  /**
@@ -218,7 +206,13 @@ export class ByteRangeContext {
218
206
  * 2. slicing the body
219
207
  */
220
208
  get length() {
221
- return this.byteSize ?? undefined;
209
+ if (this.byteEnd != null && this.byteStart != null && this.byteStart === this.byteEnd) {
210
+ return 1;
211
+ }
212
+ if (this.byteEnd != null) {
213
+ return this.byteEnd + 1;
214
+ }
215
+ return this.byteSize != null ? this.byteSize - 1 : undefined;
222
216
  }
223
217
  /**
224
218
  * Converts a range request header into helia/unixfs supported range options
@@ -242,11 +236,19 @@ export class ByteRangeContext {
242
236
  this.log.trace('requestRangeStart and requestRangeEnd are null');
243
237
  return;
244
238
  }
245
- const { start, end, byteSize } = calculateByteRangeIndexes(this.requestRangeStart ?? undefined, this.requestRangeEnd ?? undefined, this._fileSize ?? undefined);
246
- this.log.trace('set byteStart to %o, byteEnd to %o, byteSize to %o', start, end, byteSize);
247
- this.byteStart = start;
248
- this.byteEnd = end;
249
- this.byteSize = byteSize;
239
+ try {
240
+ const { start, end, byteSize } = calculateByteRangeIndexes(this.requestRangeStart ?? undefined, this.requestRangeEnd ?? undefined, this._fileSize ?? undefined);
241
+ this.log.trace('set byteStart to %o, byteEnd to %o, byteSize to %o', start, end, byteSize);
242
+ this.byteStart = start;
243
+ this.byteEnd = end;
244
+ this.byteSize = byteSize;
245
+ }
246
+ catch (e) {
247
+ this.log.error('error setting offset details: %o', e);
248
+ this.byteStart = undefined;
249
+ this.byteEnd = undefined;
250
+ this.byteSize = undefined;
251
+ }
250
252
  }
251
253
  /**
252
254
  * This function returns the value of the "content-range" header.
@@ -1 +1 @@
1
- {"version":3,"file":"byte-range-context.js","sourceRoot":"","sources":["../../../src/utils/byte-range-context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"byte-range-context.js","sourceRoot":"","sources":["../../../src/utils/byte-range-context.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"request-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/request-headers.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAE,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB/F;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBrK"}
1
+ {"version":3,"file":"request-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/request-headers.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAE,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB/F;AAED;;;;;GAKG;AAEH,wBAAgB,yBAAyB,CAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAoCrK"}
@@ -21,11 +21,21 @@ export function getHeader(headers, header) {
21
21
  * 2. the start index of the range. // inclusive
22
22
  * 3. the end index of the range. // inclusive
23
23
  */
24
+ // eslint-disable-next-line complexity
24
25
  export function calculateByteRangeIndexes(start, end, fileSize) {
26
+ if ((start ?? 0) > (end ?? Infinity)) {
27
+ throw new Error('Invalid range: Range-start index is greater than range-end index.');
28
+ }
29
+ if (start != null && (end ?? 0) >= (fileSize ?? Infinity)) {
30
+ throw new Error('Invalid range: Range-end index is greater than or equal to the size of the file.');
31
+ }
32
+ if (start == null && (end ?? 0) > (fileSize ?? Infinity)) {
33
+ throw new Error('Invalid range: Range-end index is greater than the size of the file.');
34
+ }
35
+ if (start != null && start < 0) {
36
+ throw new Error('Invalid range: Range-start index cannot be negative.');
37
+ }
25
38
  if (start != null && end != null) {
26
- if (start > end) {
27
- throw new Error('Invalid range');
28
- }
29
39
  return { byteSize: end - start + 1, start, end };
30
40
  }
31
41
  else if (start == null && end != null) {
@@ -33,18 +43,20 @@ export function calculateByteRangeIndexes(start, end, fileSize) {
33
43
  if (fileSize == null) {
34
44
  return { end };
35
45
  }
36
- const result = { byteSize: end, start: fileSize - end + 1, end: fileSize };
37
- return result;
46
+ if (end === fileSize) {
47
+ return { byteSize: fileSize, start: 0, end: fileSize - 1 };
48
+ }
49
+ return { byteSize: end, start: fileSize - end, end: fileSize - 1 };
38
50
  }
39
51
  else if (start != null && end == null) {
40
52
  if (fileSize == null) {
53
+ // we only have the start index, and no fileSize, so we can't return a valid range.
41
54
  return { start };
42
55
  }
43
- const byteSize = fileSize - start + 1;
44
- const end = fileSize;
56
+ const end = fileSize - 1;
57
+ const byteSize = fileSize - start;
45
58
  return { byteSize, start, end };
46
59
  }
47
- // both start and end are undefined
48
- return { byteSize: fileSize };
60
+ return { byteSize: fileSize, start: 0, end: fileSize != null ? fileSize - 1 : 0 };
49
61
  }
50
62
  //# sourceMappingURL=request-headers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-headers.js","sourceRoot":"","sources":["../../../src/utils/request-headers.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAE,OAAgC,EAAE,MAAc;IACzE,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAA;IACzC,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QACjF,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;IACpF,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAA;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAE,KAAyB,EAAE,GAAuB,EAAE,QAAiB;IAC9G,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACjC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;QAClC,CAAC;QAED,OAAO,EAAE,QAAQ,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IAClD,CAAC;SAAM,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACxC,8BAA8B;QAC9B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,EAAE,GAAG,EAAE,CAAA;QAChB,CAAC;QACD,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,GAAG,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;QAC1E,OAAO,MAAM,CAAA;IACf,CAAC;SAAM,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACxC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,EAAE,KAAK,EAAE,CAAA;QAClB,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAA;QACrC,MAAM,GAAG,GAAG,QAAQ,CAAA;QACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;IACjC,CAAC;IAED,mCAAmC;IACnC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;AAC/B,CAAC"}
1
+ {"version":3,"file":"request-headers.js","sourceRoot":"","sources":["../../../src/utils/request-headers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"response-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,CAyB7K"}
1
+ {"version":3,"file":"response-headers.d.ts","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAE,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,CAmC7K"}
@@ -6,19 +6,27 @@
6
6
  */
7
7
  export function getContentRangeHeader({ byteStart, byteEnd, byteSize }) {
8
8
  const total = byteSize ?? '*'; // if we don't know the total size, we should use *
9
+ if ((byteEnd ?? 0) >= (byteSize ?? Infinity)) {
10
+ throw new Error('Invalid range: Range-end index is greater than or equal to the size of the file.');
11
+ }
12
+ if ((byteStart ?? 0) >= (byteSize ?? Infinity)) {
13
+ throw new Error('Invalid range: Range-start index is greater than or equal to the size of the file.');
14
+ }
9
15
  if (byteStart != null && byteEnd == null) {
10
16
  // only byteStart in range
11
17
  if (byteSize == null) {
12
18
  return `bytes */${total}`;
13
19
  }
14
- return `bytes ${byteStart}-${byteSize}/${byteSize}`;
20
+ return `bytes ${byteStart}-${byteSize - 1}/${byteSize}`;
15
21
  }
16
22
  if (byteStart == null && byteEnd != null) {
17
23
  // only byteEnd in range
18
24
  if (byteSize == null) {
19
25
  return `bytes */${total}`;
20
26
  }
21
- return `bytes ${byteSize - byteEnd + 1}-${byteSize}/${byteSize}`;
27
+ const end = byteSize - 1;
28
+ const start = end - byteEnd + 1;
29
+ return `bytes ${start}-${end}/${byteSize}`;
22
30
  }
23
31
  if (byteStart == null && byteEnd == null) {
24
32
  // neither are provided, we can't return a valid range.
@@ -1 +1 @@
1
- {"version":3,"file":"response-headers.js","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA;;;;;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,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,IAAI,QAAQ,EAAE,CAAA;IACrD,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,OAAO,SAAS,QAAQ,GAAG,OAAO,GAAG,CAAC,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAA;IAClE,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"}
1
+ {"version":3,"file":"response-headers.js","sourceRoot":"","sources":["../../../src/utils/response-headers.ts"],"names":[],"mappings":"AAAA;;;;;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,KAAK,CAAC,kFAAkF,CAAC,CAAA;IACrG,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAA;IACvG,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/verified-fetch",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "A fetch-like API for obtaining verified & trustless IPFS content on the web",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/ipfs/helia-verified-fetch/tree/main/packages/verified-fetch#readme",
@@ -116,30 +116,14 @@ export class ByteRangeContext {
116
116
  return body
117
117
  }
118
118
 
119
+ // TODO: we should be able to use this.offset and this.length to slice the body
119
120
  private getSlicedBody <T extends SliceableBody>(body: T): SliceableBody {
120
- if (this.isPrefixLengthRequest) {
121
- this.log.trace('sliced body with byteStart %o', this.byteStart)
122
- return body.slice(this.offset) satisfies SliceableBody
123
- }
124
- if (this.isSuffixLengthRequest && this.length != null) {
125
- this.log.trace('sliced body with length %o', -this.length)
126
- return body.slice(-this.length) satisfies SliceableBody
127
- }
128
121
  const offset = this.byteStart ?? 0
129
122
  const length = this.byteEnd == null ? undefined : this.byteEnd + 1
130
123
  this.log.trace('returning body with offset %o and length %o', offset, length)
131
-
132
124
  return body.slice(offset, length) satisfies SliceableBody
133
125
  }
134
126
 
135
- private get isSuffixLengthRequest (): boolean {
136
- return this.requestRangeStart == null && this.requestRangeEnd != null
137
- }
138
-
139
- private get isPrefixLengthRequest (): boolean {
140
- return this.requestRangeStart != null && this.requestRangeEnd == null
141
- }
142
-
143
127
  /**
144
128
  * Sometimes, we need to set the fileSize explicitly because we can't calculate
145
129
  * the size of the body (e.g. for unixfs content where we call .stat).
@@ -162,7 +146,10 @@ export class ByteRangeContext {
162
146
  if (this.byteStart < 0) {
163
147
  return false
164
148
  }
165
- if (this._fileSize != null && this.byteStart > this._fileSize) {
149
+ if (this._fileSize != null && this.byteStart >= this._fileSize) {
150
+ return false
151
+ }
152
+ if (this.byteEnd != null && this.byteStart > this.byteEnd) {
166
153
  return false
167
154
  }
168
155
  }
@@ -174,7 +161,10 @@ export class ByteRangeContext {
174
161
  if (this.byteEnd < 0) {
175
162
  return false
176
163
  }
177
- if (this._fileSize != null && this.byteEnd > this._fileSize) {
164
+ if (this._fileSize != null && this.byteEnd >= this._fileSize) {
165
+ return false
166
+ }
167
+ if (this.byteStart != null && this.byteEnd < this.byteStart) {
178
168
  return false
179
169
  }
180
170
  }
@@ -214,6 +204,10 @@ export class ByteRangeContext {
214
204
  return false
215
205
  }
216
206
  }
207
+ if (this.byteEnd == null && this.byteStart == null && this.byteSize == null) {
208
+ this.log.trace('invalid range request, could not calculate byteStart, byteEnd, or byteSize')
209
+ return false
210
+ }
217
211
 
218
212
  return true
219
213
  }
@@ -224,16 +218,6 @@ export class ByteRangeContext {
224
218
  * 2. slicing the body
225
219
  */
226
220
  public get offset (): number {
227
- if (this.byteStart === 0) {
228
- return 0
229
- }
230
- if (this.isPrefixLengthRequest || this.isSuffixLengthRequest) {
231
- if (this.byteStart != null) {
232
- // we have to subtract by 1 because the offset is inclusive
233
- return this.byteStart - 1
234
- }
235
- }
236
-
237
221
  return this.byteStart ?? 0
238
222
  }
239
223
 
@@ -243,7 +227,14 @@ export class ByteRangeContext {
243
227
  * 2. slicing the body
244
228
  */
245
229
  public get length (): number | undefined {
246
- return this.byteSize ?? undefined
230
+ if (this.byteEnd != null && this.byteStart != null && this.byteStart === this.byteEnd) {
231
+ return 1
232
+ }
233
+ if (this.byteEnd != null) {
234
+ return this.byteEnd + 1
235
+ }
236
+
237
+ return this.byteSize != null ? this.byteSize - 1 : undefined
247
238
  }
248
239
 
249
240
  /**
@@ -269,11 +260,18 @@ export class ByteRangeContext {
269
260
  return
270
261
  }
271
262
 
272
- const { start, end, byteSize } = calculateByteRangeIndexes(this.requestRangeStart ?? undefined, this.requestRangeEnd ?? undefined, this._fileSize ?? undefined)
273
- this.log.trace('set byteStart to %o, byteEnd to %o, byteSize to %o', start, end, byteSize)
274
- this.byteStart = start
275
- this.byteEnd = end
276
- this.byteSize = byteSize
263
+ try {
264
+ const { start, end, byteSize } = calculateByteRangeIndexes(this.requestRangeStart ?? undefined, this.requestRangeEnd ?? undefined, this._fileSize ?? undefined)
265
+ this.log.trace('set byteStart to %o, byteEnd to %o, byteSize to %o', start, end, byteSize)
266
+ this.byteStart = start
267
+ this.byteEnd = end
268
+ this.byteSize = byteSize
269
+ } catch (e) {
270
+ this.log.error('error setting offset details: %o', e)
271
+ this.byteStart = undefined
272
+ this.byteEnd = undefined
273
+ this.byteSize = undefined
274
+ }
277
275
  }
278
276
 
279
277
  /**
@@ -23,29 +23,41 @@ export function getHeader (headers: HeadersInit | undefined, header: string): st
23
23
  * 2. the start index of the range. // inclusive
24
24
  * 3. the end index of the range. // inclusive
25
25
  */
26
+ // eslint-disable-next-line complexity
26
27
  export function calculateByteRangeIndexes (start: number | undefined, end: number | undefined, fileSize?: number): { byteSize?: number, start?: number, end?: number } {
27
- if (start != null && end != null) {
28
- if (start > end) {
29
- throw new Error('Invalid range')
30
- }
28
+ if ((start ?? 0) > (end ?? Infinity)) {
29
+ throw new Error('Invalid range: Range-start index is greater than range-end index.')
30
+ }
31
+ if (start != null && (end ?? 0) >= (fileSize ?? Infinity)) {
32
+ throw new Error('Invalid range: Range-end index is greater than or equal to the size of the file.')
33
+ }
34
+ if (start == null && (end ?? 0) > (fileSize ?? Infinity)) {
35
+ throw new Error('Invalid range: Range-end index is greater than the size of the file.')
36
+ }
37
+ if (start != null && start < 0) {
38
+ throw new Error('Invalid range: Range-start index cannot be negative.')
39
+ }
31
40
 
41
+ if (start != null && end != null) {
32
42
  return { byteSize: end - start + 1, start, end }
33
43
  } else if (start == null && end != null) {
34
44
  // suffix byte range requested
35
45
  if (fileSize == null) {
36
46
  return { end }
37
47
  }
38
- const result = { byteSize: end, start: fileSize - end + 1, end: fileSize }
39
- return result
48
+ if (end === fileSize) {
49
+ return { byteSize: fileSize, start: 0, end: fileSize - 1 }
50
+ }
51
+ return { byteSize: end, start: fileSize - end, end: fileSize - 1 }
40
52
  } else if (start != null && end == null) {
41
53
  if (fileSize == null) {
54
+ // we only have the start index, and no fileSize, so we can't return a valid range.
42
55
  return { start }
43
56
  }
44
- const byteSize = fileSize - start + 1
45
- const end = fileSize
57
+ const end = fileSize - 1
58
+ const byteSize = fileSize - start
46
59
  return { byteSize, start, end }
47
60
  }
48
61
 
49
- // both start and end are undefined
50
- return { byteSize: fileSize }
62
+ return { byteSize: fileSize, start: 0, end: fileSize != null ? fileSize - 1 : 0 }
51
63
  }
@@ -7,12 +7,19 @@
7
7
  export function getContentRangeHeader ({ byteStart, byteEnd, byteSize }: { byteStart: number | undefined, byteEnd: number | undefined, byteSize: number | undefined }): string {
8
8
  const total = byteSize ?? '*' // if we don't know the total size, we should use *
9
9
 
10
+ if ((byteEnd ?? 0) >= (byteSize ?? Infinity)) {
11
+ throw new Error('Invalid range: Range-end index is greater than or equal to the size of the file.')
12
+ }
13
+ if ((byteStart ?? 0) >= (byteSize ?? Infinity)) {
14
+ throw new Error('Invalid range: Range-start index is greater than or equal to the size of the file.')
15
+ }
16
+
10
17
  if (byteStart != null && byteEnd == null) {
11
18
  // only byteStart in range
12
19
  if (byteSize == null) {
13
20
  return `bytes */${total}`
14
21
  }
15
- return `bytes ${byteStart}-${byteSize}/${byteSize}`
22
+ return `bytes ${byteStart}-${byteSize - 1}/${byteSize}`
16
23
  }
17
24
 
18
25
  if (byteStart == null && byteEnd != null) {
@@ -20,7 +27,10 @@ export function getContentRangeHeader ({ byteStart, byteEnd, byteSize }: { byteS
20
27
  if (byteSize == null) {
21
28
  return `bytes */${total}`
22
29
  }
23
- return `bytes ${byteSize - byteEnd + 1}-${byteSize}/${byteSize}`
30
+ const end = byteSize - 1
31
+ const start = end - byteEnd + 1
32
+
33
+ return `bytes ${start}-${end}/${byteSize}`
24
34
  }
25
35
 
26
36
  if (byteStart == null && byteEnd == null) {