@chunkd/source-http 10.0.0 → 10.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,51 +1,25 @@
1
- # Change Log
2
-
3
- All notable changes to this project will be documented in this file.
4
- See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
-
6
- # [8.4.0](https://github.com/blacha/chunkd/compare/v8.3.0...v8.4.0) (2022-06-21)
7
-
8
- **Note:** Version bump only for package @chunkd/source-http
9
-
10
-
11
-
12
-
13
-
14
- # [8.3.0](https://github.com/blacha/chunkd/compare/v8.2.0...v8.3.0) (2022-06-08)
15
-
16
-
17
- ### Features
18
-
19
- * **fs:** support non recursive file listing ([#370](https://github.com/blacha/chunkd/issues/370)) ([a2828fe](https://github.com/blacha/chunkd/commit/a2828fec18db247ef89fc7becd5a57ed78090290))
20
-
21
-
22
-
23
-
24
-
25
- # [8.2.0](https://github.com/blacha/chunkd/compare/v8.1.0...v8.2.0) (2022-05-11)
26
-
27
- **Note:** Version bump only for package @chunkd/source-http
28
-
29
-
1
+ # Changelog
30
2
 
3
+ ### Dependencies
31
4
 
5
+ * The following workspace dependencies were updated
6
+ * dependencies
7
+ * @chunkd/core bumped from ^10.1.0 to ^10.1.1
32
8
 
33
- # [8.1.0](https://github.com/blacha/chunkd/compare/v8.0.3...v8.1.0) (2022-02-21)
9
+ ## [10.1.0](https://github.com/blacha/chunkd/compare/source-http-v10.0.2...source-http-v10.1.0) (2023-04-27)
34
10
 
35
11
 
36
12
  ### Features
37
13
 
38
- * remove logger a tracking source can be used instead ([151dd08](https://github.com/blacha/chunkd/commit/151dd08e2052daa09ccda1f2df55adc95cdf126f))
39
-
40
-
41
-
14
+ * **source-http:** support etag matching if etags are returned ([f08bb9c](https://github.com/blacha/chunkd/commit/f08bb9c2ae894026155074161161182f78efa30b))
15
+ * **source-http:** use built in fetch with node>18 ([52529a3](https://github.com/blacha/chunkd/commit/52529a35fe72612915fac9c06893a871ffc4e392))
42
16
 
43
17
 
44
18
  ### Dependencies
45
19
 
46
20
  * The following workspace dependencies were updated
47
21
  * dependencies
48
- * @chunkd/core bumped from ^9.0.0 to ^9.0.1
22
+ * @chunkd/core bumped from ^10.1.1 to ^10.2.0
49
23
 
50
24
  ## [10.0.0](https://github.com/blacha/chunkd/compare/source-http-v9.1.0...source-http-v10.0.0) (2022-09-21)
51
25
 
package/README.md CHANGED
@@ -8,10 +8,16 @@ Load a chunks of a file from a URL Source using `fetch`
8
8
  ```javascript
9
9
  import { SourceHttp } from '@chunkd/source-http';
10
10
 
11
- const source= new SourceHttp('https://example.com/cog.tif');
11
+ const source = new SourceHttp('https://example.com/cog.tif');
12
12
 
13
13
  await source.loadBytes(0, 1024)
14
14
  ```
15
15
 
16
- #### Nodejs
17
- Nodejs does not come with a default `fetch` function, this package will use `node-fetch` when in used with nodejs
16
+ #### Nodejs <18
17
+ Node.js <18 does not come with a default `fetch` function, Users can specify a `fetch` like object
18
+
19
+ ```javascript
20
+ import {fetch} from 'node-fetch';
21
+
22
+ SourceHttp.fetch = fetch;
23
+ ```
@@ -1,9 +1,9 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
3
  import { FileInfo, FileSystem } from '@chunkd/core';
4
4
  import type { Readable } from 'stream';
5
5
  import { SourceHttp } from './http.source.js';
6
- export declare type FsError = {
6
+ export type FsError = {
7
7
  code: string;
8
8
  } & Error;
9
9
  export declare class FsHttp implements FileSystem<SourceHttp> {
@@ -1 +1 @@
1
- {"version":3,"file":"http.fs.d.ts","sourceRoot":"","sources":["../src/http.fs.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAkB,QAAQ,EAAE,UAAU,EAAY,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,oBAAY,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAAC;AAQ/C,qBAAa,MAAO,YAAW,UAAU,CAAC,UAAU,CAAC;IACnD,MAAM,CAAC,QAAQ,SAAU;IACzB,QAAQ,SAAmB;IAE3B,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,GAAG,EAAE,IAAI,MAAM;IAIvC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;IAI7B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;IAG9C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC;IAIpD,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAM7E,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ;CAGnC"}
1
+ {"version":3,"file":"http.fs.d.ts","sourceRoot":"","sources":["../src/http.fs.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAkB,QAAQ,EAAE,UAAU,EAAY,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAAC;AAQ/C,qBAAa,MAAO,YAAW,UAAU,CAAC,UAAU,CAAC;IACnD,MAAM,CAAC,QAAQ,SAAU;IACzB,QAAQ,SAAmB;IAE3B,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,GAAG,EAAE,IAAI,MAAM;IAIvC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU;IAI7B,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;IAG9C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC;IAIpD,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,QAAQ,GAAG;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IAM7E,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ;CAGnC"}
package/build/http.fs.js CHANGED
@@ -9,7 +9,7 @@ function getCompositeError(e, msg) {
9
9
  return new CompositeError(msg, 403, e);
10
10
  return new CompositeError(msg, 500, e);
11
11
  }
12
- export class FsHttp {
12
+ class FsHttp {
13
13
  constructor() {
14
14
  this.protocol = FsHttp.protocol;
15
15
  }
@@ -48,4 +48,5 @@ export class FsHttp {
48
48
  }
49
49
  }
50
50
  FsHttp.protocol = 'http';
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQXdCLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHOUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFVLEVBQUUsR0FBVztJQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sT0FBTyxNQUFNO0lBQW5CO1FBRUUsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUF3QzdCLENBQUM7SUF0Q0MsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFjO1FBQ3RCLE9BQU8sRUFBRSxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxNQUFNLENBQUMsUUFBZ0I7UUFDckIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQWdCO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFnQjtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFBRSxNQUFNLGlCQUFpQixDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxtQkFBbUIsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvRixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDakcsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBZ0I7UUFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUFFLE1BQU0saUJBQWlCLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLG1CQUFtQixRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQWdCO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBZ0I7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQWdCO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQzs7QUF4Q00sZUFBUSxHQUFHLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvc2l0ZUVycm9yLCBGaWxlSW5mbywgRmlsZVN5c3RlbSwgaXNSZWNvcmQgfSBmcm9tICdAY2h1bmtkL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBTb3VyY2VIdHRwIH0gZnJvbSAnLi9odHRwLnNvdXJjZS5qcyc7XG5cbmV4cG9ydCB0eXBlIEZzRXJyb3IgPSB7IGNvZGU6IHN0cmluZyB9ICYgRXJyb3I7XG5mdW5jdGlvbiBnZXRDb21wb3NpdGVFcnJvcihlOiB1bmtub3duLCBtc2c6IHN0cmluZyk6IENvbXBvc2l0ZUVycm9yIHtcbiAgaWYgKCFpc1JlY29yZChlKSkgcmV0dXJuIG5ldyBDb21wb3NpdGVFcnJvcihtc2csIDUwMCwgZSk7XG4gIGlmIChlLmNvZGUgPT09ICdFTk9FTlQnKSByZXR1cm4gbmV3IENvbXBvc2l0ZUVycm9yKG1zZywgNDA0LCBlKTtcbiAgaWYgKGUuY29kZSA9PT0gJ0VBQ0NFUycpIHJldHVybiBuZXcgQ29tcG9zaXRlRXJyb3IobXNnLCA0MDMsIGUpO1xuICByZXR1cm4gbmV3IENvbXBvc2l0ZUVycm9yKG1zZywgNTAwLCBlKTtcbn1cblxuZXhwb3J0IGNsYXNzIEZzSHR0cCBpbXBsZW1lbnRzIEZpbGVTeXN0ZW08U291cmNlSHR0cD4ge1xuICBzdGF0aWMgcHJvdG9jb2wgPSAnaHR0cCc7XG4gIHByb3RvY29sID0gRnNIdHRwLnByb3RvY29sO1xuXG4gIHN0YXRpYyBpcyhmczogRmlsZVN5c3RlbSk6IGZzIGlzIEZzSHR0cCB7XG4gICAgcmV0dXJuIGZzLnByb3RvY29sID09PSBGc0h0dHAucHJvdG9jb2w7XG4gIH1cblxuICBzb3VyY2UoZmlsZVBhdGg6IHN0cmluZyk6IFNvdXJjZUh0dHAge1xuICAgIHJldHVybiBuZXcgU291cmNlSHR0cChmaWxlUGF0aCk7XG4gIH1cblxuICBhc3luYyAqbGlzdChmaWxlUGF0aDogc3RyaW5nKTogQXN5bmNHZW5lcmF0b3I8c3RyaW5nPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gXCJsaXN0XCIgb24gJHtmaWxlUGF0aH1gKTtcbiAgfVxuICBhc3luYyAqZGV0YWlscyhmaWxlUGF0aDogc3RyaW5nKTogQXN5bmNHZW5lcmF0b3I8RmlsZUluZm8+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBcImRldGFpbHNcIiBvbiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgYXN5bmMgaGVhZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTwoRmlsZUluZm8gJiB7IGlzRGlyZWN0b3J5OiBib29sZWFuIH0pIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IFNvdXJjZUh0dHAuZmV0Y2goZmlsZVBhdGgsIHsgbWV0aG9kOiAnSEVBRCcgfSk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IGdldENvbXBvc2l0ZUVycm9yKG5ldyBFcnJvcihyZXMuc3RhdHVzVGV4dCksIGBGYWlsZWQgdG8gaGVhZDogJHtmaWxlUGF0aH1gKTtcbiAgICByZXR1cm4geyBwYXRoOiBmaWxlUGF0aCwgc2l6ZTogTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSksIGlzRGlyZWN0b3J5OiBmYWxzZSB9O1xuICB9XG5cbiAgYXN5bmMgcmVhZChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBTb3VyY2VIdHRwLmZldGNoKGZpbGVQYXRoLCB7IG1ldGhvZDogJ0dFVCcgfSk7XG4gICAgaWYgKCFyZXMub2spIHRocm93IGdldENvbXBvc2l0ZUVycm9yKG5ldyBFcnJvcihyZXMuc3RhdHVzVGV4dCksIGBGYWlsZWQgdG8gaGVhZDogJHtmaWxlUGF0aH1gKTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oYXdhaXQgcmVzLmFycmF5QnVmZmVyKCkpO1xuICB9XG5cbiAgYXN5bmMgd3JpdGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIFwid3JpdGVcIiBvbiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBcImRlbGV0ZVwiIG9uICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBzdHJlYW0oZmlsZVBhdGg6IHN0cmluZyk6IFJlYWRhYmxlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBcInN0cmVhbVwiIG9uICR7ZmlsZVBhdGh9YCk7XG4gIH1cbn1cbiJdfQ==
51
+ export { FsHttp };
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5mcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9odHRwLmZzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQXdCLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFHOUMsU0FBUyxpQkFBaUIsQ0FBQyxDQUFVLEVBQUUsR0FBVztJQUNoRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxjQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRSxPQUFPLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQWEsTUFBTTtJQUFuQjtRQUVFLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBd0M3QixDQUFDO0lBdENDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBYztRQUN0QixPQUFPLEVBQUUsQ0FBQyxRQUFRLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQWdCO1FBQ3JCLE9BQU8sSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFnQjtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBZ0I7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFnQjtRQUN6QixNQUFNLEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQUUsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsbUJBQW1CLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0YsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ2pHLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQWdCO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFBRSxNQUFNLGlCQUFpQixDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxtQkFBbUIsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMvRixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFnQjtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWdCO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFnQjtRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7O0FBeENNLGVBQVEsR0FBRyxNQUFNLEFBQVQsQ0FBVTtTQURkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb3NpdGVFcnJvciwgRmlsZUluZm8sIEZpbGVTeXN0ZW0sIGlzUmVjb3JkIH0gZnJvbSAnQGNodW5rZC9jb3JlJztcbmltcG9ydCB0eXBlIHsgUmVhZGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0IHsgU291cmNlSHR0cCB9IGZyb20gJy4vaHR0cC5zb3VyY2UuanMnO1xuXG5leHBvcnQgdHlwZSBGc0Vycm9yID0geyBjb2RlOiBzdHJpbmcgfSAmIEVycm9yO1xuZnVuY3Rpb24gZ2V0Q29tcG9zaXRlRXJyb3IoZTogdW5rbm93biwgbXNnOiBzdHJpbmcpOiBDb21wb3NpdGVFcnJvciB7XG4gIGlmICghaXNSZWNvcmQoZSkpIHJldHVybiBuZXcgQ29tcG9zaXRlRXJyb3IobXNnLCA1MDAsIGUpO1xuICBpZiAoZS5jb2RlID09PSAnRU5PRU5UJykgcmV0dXJuIG5ldyBDb21wb3NpdGVFcnJvcihtc2csIDQwNCwgZSk7XG4gIGlmIChlLmNvZGUgPT09ICdFQUNDRVMnKSByZXR1cm4gbmV3IENvbXBvc2l0ZUVycm9yKG1zZywgNDAzLCBlKTtcbiAgcmV0dXJuIG5ldyBDb21wb3NpdGVFcnJvcihtc2csIDUwMCwgZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBGc0h0dHAgaW1wbGVtZW50cyBGaWxlU3lzdGVtPFNvdXJjZUh0dHA+IHtcbiAgc3RhdGljIHByb3RvY29sID0gJ2h0dHAnO1xuICBwcm90b2NvbCA9IEZzSHR0cC5wcm90b2NvbDtcblxuICBzdGF0aWMgaXMoZnM6IEZpbGVTeXN0ZW0pOiBmcyBpcyBGc0h0dHAge1xuICAgIHJldHVybiBmcy5wcm90b2NvbCA9PT0gRnNIdHRwLnByb3RvY29sO1xuICB9XG5cbiAgc291cmNlKGZpbGVQYXRoOiBzdHJpbmcpOiBTb3VyY2VIdHRwIHtcbiAgICByZXR1cm4gbmV3IFNvdXJjZUh0dHAoZmlsZVBhdGgpO1xuICB9XG5cbiAgYXN5bmMgKmxpc3QoZmlsZVBhdGg6IHN0cmluZyk6IEFzeW5jR2VuZXJhdG9yPHN0cmluZz4ge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIFwibGlzdFwiIG9uICR7ZmlsZVBhdGh9YCk7XG4gIH1cbiAgYXN5bmMgKmRldGFpbHMoZmlsZVBhdGg6IHN0cmluZyk6IEFzeW5jR2VuZXJhdG9yPEZpbGVJbmZvPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gXCJkZXRhaWxzXCIgb24gJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGFzeW5jIGhlYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8KEZpbGVJbmZvICYgeyBpc0RpcmVjdG9yeTogYm9vbGVhbiB9KSB8IG51bGw+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBTb3VyY2VIdHRwLmZldGNoKGZpbGVQYXRoLCB7IG1ldGhvZDogJ0hFQUQnIH0pO1xuICAgIGlmICghcmVzLm9rKSB0aHJvdyBnZXRDb21wb3NpdGVFcnJvcihuZXcgRXJyb3IocmVzLnN0YXR1c1RleHQpLCBgRmFpbGVkIHRvIGhlYWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIHsgcGF0aDogZmlsZVBhdGgsIHNpemU6IE51bWJlcihyZXMuaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJykpLCBpc0RpcmVjdG9yeTogZmFsc2UgfTtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgU291cmNlSHR0cC5mZXRjaChmaWxlUGF0aCwgeyBtZXRob2Q6ICdHRVQnIH0pO1xuICAgIGlmICghcmVzLm9rKSB0aHJvdyBnZXRDb21wb3NpdGVFcnJvcihuZXcgRXJyb3IocmVzLnN0YXR1c1RleHQpLCBgRmFpbGVkIHRvIGhlYWQ6ICR7ZmlsZVBhdGh9YCk7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpKTtcbiAgfVxuXG4gIGFzeW5jIHdyaXRlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBcIndyaXRlXCIgb24gJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gXCJkZWxldGVcIiBvbiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgc3RyZWFtKGZpbGVQYXRoOiBzdHJpbmcpOiBSZWFkYWJsZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gXCJzdHJlYW1cIiBvbiAke2ZpbGVQYXRofWApO1xuICB9XG59XG4iXX0=
@@ -1,4 +1,4 @@
1
- import { ChunkSource, ChunkSourceBase } from '@chunkd/core';
1
+ import { ChunkSource, ChunkSourceBase, ChunkSourceMetadata } from '@chunkd/core';
2
2
  export interface FetchLikeOptions {
3
3
  method?: string;
4
4
  headers?: Record<string, string>;
@@ -12,7 +12,7 @@ export interface FetchLikeResponse {
12
12
  };
13
13
  arrayBuffer(): Promise<ArrayBuffer>;
14
14
  }
15
- export declare type FetchLike = (url: string, opts?: FetchLikeOptions) => Promise<FetchLikeResponse>;
15
+ export type FetchLike = (url: string, opts?: FetchLikeOptions) => Promise<FetchLikeResponse>;
16
16
  export declare class SourceHttp extends ChunkSourceBase {
17
17
  type: string;
18
18
  protocol: string;
@@ -21,7 +21,11 @@ export declare class SourceHttp extends ChunkSourceBase {
21
21
  uri: string;
22
22
  constructor(uri: string);
23
23
  static isSource(source: ChunkSource): source is SourceHttp;
24
- _size: Promise<number> | undefined;
24
+ metadata: ChunkSourceMetadata | null;
25
+ /** Load the ETag and content-range from the response */
26
+ parseResponse(response: FetchLikeResponse): ChunkSourceMetadata;
27
+ private _head;
28
+ head(): Promise<FetchLikeResponse>;
25
29
  get size(): Promise<number>;
26
30
  fetchBytes(offset: number, length?: number): Promise<ArrayBuffer>;
27
31
  static fetch: FetchLike;
@@ -1 +1 @@
1
- {"version":3,"file":"http.source.d.ts","sourceRoot":"","sources":["../src/http.source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AACD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC3C,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CACrC;AACD,oBAAY,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE7F,qBAAa,UAAW,SAAQ,eAAe;IAC7C,IAAI,SAAS;IACb,QAAQ,SAAU;IAElB,MAAM,CAAC,gBAAgB,SAAa;IACpC,SAAS,EAAE,MAAM,CAA+B;IAEhD,GAAG,EAAE,MAAM,CAAC;gBAEA,GAAG,EAAE,MAAM;IAKvB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,IAAI,UAAU;IAI1D,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IACnC,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAO1B;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBvE,MAAM,CAAC,KAAK,EAAE,SAAS,CAAyB;CACjD"}
1
+ {"version":3,"file":"http.source.d.ts","sourceRoot":"","sources":["../src/http.source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAA8B,MAAM,cAAc,CAAC;AAE7G,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AACD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC3C,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;CACrC;AACD,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE7F,qBAAa,UAAW,SAAQ,eAAe;IAC7C,IAAI,SAAS;IACb,QAAQ,SAAU;IAElB,MAAM,CAAC,gBAAgB,SAAa;IACpC,SAAS,EAAE,MAAM,CAA+B;IAEhD,GAAG,EAAE,MAAM,CAAC;gBAEA,GAAG,EAAE,MAAM;IAKvB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,IAAI,UAAU;IAI1D,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,wDAAwD;IACxD,aAAa,CAAC,QAAQ,EAAE,iBAAiB,GAAG,mBAAmB;IAQ/D,OAAO,CAAC,KAAK,CAAoC;IACjD,IAAI,IAAI,OAAO,CAAC,iBAAiB,CAAC;IASlC,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAG1B;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBvE,MAAM,CAAC,KAAK,EAAE,SAAS,CAAyB;CACjD"}
@@ -1,5 +1,5 @@
1
- import { ChunkSourceBase } from '@chunkd/core';
2
- export class SourceHttp extends ChunkSourceBase {
1
+ import { ChunkSourceBase, CompositeError } from '@chunkd/core';
2
+ class SourceHttp extends ChunkSourceBase {
3
3
  constructor(uri) {
4
4
  super();
5
5
  this.type = 'url';
@@ -10,30 +10,48 @@ export class SourceHttp extends ChunkSourceBase {
10
10
  static isSource(source) {
11
11
  return source.type === 'url';
12
12
  }
13
- get size() {
14
- if (this._size)
15
- return this._size;
16
- this._size = Promise.resolve().then(async () => {
17
- const res = await SourceHttp.fetch(this.uri, { method: 'HEAD' });
18
- return Number(res.headers.get('content-length'));
13
+ /** Load the ETag and content-range from the response */
14
+ parseResponse(response) {
15
+ var _a;
16
+ const metadata = {};
17
+ const contentRange = response.headers.get('content-range');
18
+ if (contentRange != null)
19
+ metadata.size = this.parseContentRange(contentRange);
20
+ metadata.etag = (_a = response.headers.get('etag')) !== null && _a !== void 0 ? _a : undefined;
21
+ return metadata;
22
+ }
23
+ head() {
24
+ if (this._head)
25
+ return this._head;
26
+ this._head = SourceHttp.fetch(this.uri, { method: 'HEAD' }).then((res) => {
27
+ this.metadata = this.parseResponse(res);
28
+ return res;
19
29
  });
20
- return this._size;
30
+ return this._head;
31
+ }
32
+ get size() {
33
+ var _a;
34
+ if ((_a = this.metadata) === null || _a === void 0 ? void 0 : _a.size)
35
+ return Promise.resolve(this.metadata.size);
36
+ return this.head().then(() => { var _a, _b; return (_b = (_a = this.metadata) === null || _a === void 0 ? void 0 : _a.size) !== null && _b !== void 0 ? _b : -1; });
21
37
  }
22
38
  async fetchBytes(offset, length) {
23
39
  const Range = this.toRange(offset, length);
24
40
  const headers = { Range };
25
41
  const response = await SourceHttp.fetch(this.uri, { headers });
26
42
  if (response.ok) {
27
- const contentRange = response.headers.get('content-range');
28
- if (this._size == null && contentRange != null) {
29
- this._size = Promise.resolve(this.parseContentRange(contentRange));
30
- }
43
+ const metadata = this.parseResponse(response);
44
+ if (this.metadata == null)
45
+ this.metadata = metadata;
46
+ else if (this.metadata.etag && this.metadata.etag !== metadata.etag)
47
+ throw new CompositeError(`ETag conflict ${this.uri} ${Range} expected: ${this.metadata.etag} got: ${metadata.etag}`, 409 /* ErrorCodes.Conflict */, null);
31
48
  return response.arrayBuffer();
32
49
  }
33
- throw new Error('Failed to fetch');
50
+ throw new CompositeError(`Failed to fetch ${this.uri} ${Range}`, response.status, response.statusText);
34
51
  }
35
52
  }
36
53
  SourceHttp.DefaultChunkSize = 32 * 1024;
37
54
  // Allow overwriting the fetcher used (eg testing/node-js)
38
55
  SourceHttp.fetch = (a, b) => fetch(a, b);
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaHR0cC5zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQWU1RCxNQUFNLE9BQU8sVUFBVyxTQUFRLGVBQWU7SUFTN0MsWUFBWSxHQUFXO1FBQ3JCLEtBQUssRUFBRSxDQUFDO1FBVFYsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLGFBQVEsR0FBRyxNQUFNLENBQUM7UUFHbEIsY0FBUyxHQUFXLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztRQU05QyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFtQjtRQUNqQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFHRCxJQUFJLElBQUk7UUFDTixJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtZQUM3QyxNQUFNLEdBQUcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsTUFBZTtRQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzFCLE1BQU0sUUFBUSxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUUvRCxJQUFJLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDZixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMzRCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzthQUNwRTtZQUNELE9BQU8sUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQy9CO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7O0FBdENNLDJCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUF3Q3BDLDBEQUEwRDtBQUNuRCxnQkFBSyxHQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENodW5rU291cmNlLCBDaHVua1NvdXJjZUJhc2UgfSBmcm9tICdAY2h1bmtkL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZldGNoTGlrZU9wdGlvbnMge1xuICBtZXRob2Q/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuZXhwb3J0IGludGVyZmFjZSBGZXRjaExpa2VSZXNwb25zZSB7XG4gIG9rOiBib29sZWFuO1xuICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gIHN0YXR1czogbnVtYmVyO1xuICBoZWFkZXJzOiB7IGdldChrOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIH07XG4gIGFycmF5QnVmZmVyKCk6IFByb21pc2U8QXJyYXlCdWZmZXI+O1xufVxuZXhwb3J0IHR5cGUgRmV0Y2hMaWtlID0gKHVybDogc3RyaW5nLCBvcHRzPzogRmV0Y2hMaWtlT3B0aW9ucykgPT4gUHJvbWlzZTxGZXRjaExpa2VSZXNwb25zZT47XG5cbmV4cG9ydCBjbGFzcyBTb3VyY2VIdHRwIGV4dGVuZHMgQ2h1bmtTb3VyY2VCYXNlIHtcbiAgdHlwZSA9ICd1cmwnO1xuICBwcm90b2NvbCA9ICdodHRwJztcblxuICBzdGF0aWMgRGVmYXVsdENodW5rU2l6ZSA9IDMyICogMTAyNDtcbiAgY2h1bmtTaXplOiBudW1iZXIgPSBTb3VyY2VIdHRwLkRlZmF1bHRDaHVua1NpemU7XG5cbiAgdXJpOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodXJpOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudXJpID0gdXJpO1xuICB9XG5cbiAgc3RhdGljIGlzU291cmNlKHNvdXJjZTogQ2h1bmtTb3VyY2UpOiBzb3VyY2UgaXMgU291cmNlSHR0cCB7XG4gICAgcmV0dXJuIHNvdXJjZS50eXBlID09PSAndXJsJztcbiAgfVxuXG4gIF9zaXplOiBQcm9taXNlPG51bWJlcj4gfCB1bmRlZmluZWQ7XG4gIGdldCBzaXplKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuX3NpemUpIHJldHVybiB0aGlzLl9zaXplO1xuICAgIHRoaXMuX3NpemUgPSBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IFNvdXJjZUh0dHAuZmV0Y2godGhpcy51cmksIHsgbWV0aG9kOiAnSEVBRCcgfSk7XG4gICAgICByZXR1cm4gTnVtYmVyKHJlcy5oZWFkZXJzLmdldCgnY29udGVudC1sZW5ndGgnKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBhc3luYyBmZXRjaEJ5dGVzKG9mZnNldDogbnVtYmVyLCBsZW5ndGg/OiBudW1iZXIpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgY29uc3QgUmFuZ2UgPSB0aGlzLnRvUmFuZ2Uob2Zmc2V0LCBsZW5ndGgpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7IFJhbmdlIH07XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBTb3VyY2VIdHRwLmZldGNoKHRoaXMudXJpLCB7IGhlYWRlcnMgfSk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGNvbnRlbnRSYW5nZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXJhbmdlJyk7XG4gICAgICBpZiAodGhpcy5fc2l6ZSA9PSBudWxsICYmIGNvbnRlbnRSYW5nZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3NpemUgPSBQcm9taXNlLnJlc29sdmUodGhpcy5wYXJzZUNvbnRlbnRSYW5nZShjb250ZW50UmFuZ2UpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZldGNoJyk7XG4gIH1cblxuICAvLyBBbGxvdyBvdmVyd3JpdGluZyB0aGUgZmV0Y2hlciB1c2VkIChlZyB0ZXN0aW5nL25vZGUtanMpXG4gIHN0YXRpYyBmZXRjaDogRmV0Y2hMaWtlID0gKGEsIGIpID0+IGZldGNoKGEsIGIpO1xufVxuIl19
56
+ export { SourceHttp };
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaHR0cC5zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFlLGVBQWUsRUFBdUIsY0FBYyxFQUFjLE1BQU0sY0FBYyxDQUFDO0FBZTdHLE1BQWEsVUFBVyxTQUFRLGVBQWU7SUFTN0MsWUFBWSxHQUFXO1FBQ3JCLEtBQUssRUFBRSxDQUFDO1FBVFYsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLGFBQVEsR0FBRyxNQUFNLENBQUM7UUFHbEIsY0FBUyxHQUFXLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztRQU05QyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFtQjtRQUNqQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFHRCx3REFBd0Q7SUFDeEQsYUFBYSxDQUFDLFFBQTJCOztRQUN2QyxNQUFNLFFBQVEsR0FBd0IsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNELElBQUksWUFBWSxJQUFJLElBQUk7WUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRSxRQUFRLENBQUMsSUFBSSxHQUFHLE1BQUEsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLG1DQUFJLFNBQVMsQ0FBQztRQUMxRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBR0QsSUFBSTtRQUNGLElBQUksSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxJQUFJOztRQUNOLElBQUksTUFBQSxJQUFJLENBQUMsUUFBUSwwQ0FBRSxJQUFJO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEUsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxlQUFDLE9BQUEsTUFBQSxNQUFBLElBQUksQ0FBQyxRQUFRLDBDQUFFLElBQUksbUNBQUksQ0FBQyxDQUFDLENBQUEsRUFBQSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBYyxFQUFFLE1BQWU7UUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUMxQixNQUFNLFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFL0QsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQ2YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSTtnQkFBRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztpQkFDL0MsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSTtnQkFDakUsTUFBTSxJQUFJLGNBQWMsQ0FDdEIsaUJBQWlCLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxjQUFjLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxTQUFTLFFBQVEsQ0FBQyxJQUFJLEVBQUUsaUNBRTFGLElBQUksQ0FDTCxDQUFDO1lBQ0osT0FBTyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDL0I7UUFFRCxNQUFNLElBQUksY0FBYyxDQUFDLG1CQUFtQixJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssRUFBRSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7O0FBekRNLDJCQUFnQixHQUFHLEVBQUUsR0FBRyxJQUFJLEFBQVosQ0FBYTtBQTJEcEMsMERBQTBEO0FBQ25ELGdCQUFLLEdBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxBQUFuQyxDQUFvQztTQWhFckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENodW5rU291cmNlLCBDaHVua1NvdXJjZUJhc2UsIENodW5rU291cmNlTWV0YWRhdGEsIENvbXBvc2l0ZUVycm9yLCBFcnJvckNvZGVzIH0gZnJvbSAnQGNodW5rZC9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBGZXRjaExpa2VPcHRpb25zIHtcbiAgbWV0aG9kPzogc3RyaW5nO1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hMaWtlUmVzcG9uc2Uge1xuICBvazogYm9vbGVhbjtcbiAgc3RhdHVzVGV4dDogc3RyaW5nO1xuICBzdGF0dXM6IG51bWJlcjtcbiAgaGVhZGVyczogeyBnZXQoazogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB9O1xuICBhcnJheUJ1ZmZlcigpOiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbn1cbmV4cG9ydCB0eXBlIEZldGNoTGlrZSA9ICh1cmw6IHN0cmluZywgb3B0cz86IEZldGNoTGlrZU9wdGlvbnMpID0+IFByb21pc2U8RmV0Y2hMaWtlUmVzcG9uc2U+O1xuXG5leHBvcnQgY2xhc3MgU291cmNlSHR0cCBleHRlbmRzIENodW5rU291cmNlQmFzZSB7XG4gIHR5cGUgPSAndXJsJztcbiAgcHJvdG9jb2wgPSAnaHR0cCc7XG5cbiAgc3RhdGljIERlZmF1bHRDaHVua1NpemUgPSAzMiAqIDEwMjQ7XG4gIGNodW5rU2l6ZTogbnVtYmVyID0gU291cmNlSHR0cC5EZWZhdWx0Q2h1bmtTaXplO1xuXG4gIHVyaTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHVyaTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnVyaSA9IHVyaTtcbiAgfVxuXG4gIHN0YXRpYyBpc1NvdXJjZShzb3VyY2U6IENodW5rU291cmNlKTogc291cmNlIGlzIFNvdXJjZUh0dHAge1xuICAgIHJldHVybiBzb3VyY2UudHlwZSA9PT0gJ3VybCc7XG4gIH1cblxuICBtZXRhZGF0YTogQ2h1bmtTb3VyY2VNZXRhZGF0YSB8IG51bGw7XG4gIC8qKiBMb2FkIHRoZSBFVGFnIGFuZCBjb250ZW50LXJhbmdlIGZyb20gdGhlIHJlc3BvbnNlICovXG4gIHBhcnNlUmVzcG9uc2UocmVzcG9uc2U6IEZldGNoTGlrZVJlc3BvbnNlKTogQ2h1bmtTb3VyY2VNZXRhZGF0YSB7XG4gICAgY29uc3QgbWV0YWRhdGE6IENodW5rU291cmNlTWV0YWRhdGEgPSB7fTtcbiAgICBjb25zdCBjb250ZW50UmFuZ2UgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC1yYW5nZScpO1xuICAgIGlmIChjb250ZW50UmFuZ2UgIT0gbnVsbCkgbWV0YWRhdGEuc2l6ZSA9IHRoaXMucGFyc2VDb250ZW50UmFuZ2UoY29udGVudFJhbmdlKTtcbiAgICBtZXRhZGF0YS5ldGFnID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2V0YWcnKSA/PyB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGVhZDogUHJvbWlzZTxGZXRjaExpa2VSZXNwb25zZT4gfCBudWxsO1xuICBoZWFkKCk6IFByb21pc2U8RmV0Y2hMaWtlUmVzcG9uc2U+IHtcbiAgICBpZiAodGhpcy5faGVhZCkgcmV0dXJuIHRoaXMuX2hlYWQ7XG4gICAgdGhpcy5faGVhZCA9IFNvdXJjZUh0dHAuZmV0Y2godGhpcy51cmksIHsgbWV0aG9kOiAnSEVBRCcgfSkudGhlbigocmVzKSA9PiB7XG4gICAgICB0aGlzLm1ldGFkYXRhID0gdGhpcy5wYXJzZVJlc3BvbnNlKHJlcyk7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9oZWFkO1xuICB9XG5cbiAgZ2V0IHNpemUoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5tZXRhZGF0YT8uc2l6ZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLm1ldGFkYXRhLnNpemUpO1xuICAgIHJldHVybiB0aGlzLmhlYWQoKS50aGVuKCgpID0+IHRoaXMubWV0YWRhdGE/LnNpemUgPz8gLTEpO1xuICB9XG5cbiAgYXN5bmMgZmV0Y2hCeXRlcyhvZmZzZXQ6IG51bWJlciwgbGVuZ3RoPzogbnVtYmVyKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4ge1xuICAgIGNvbnN0IFJhbmdlID0gdGhpcy50b1JhbmdlKG9mZnNldCwgbGVuZ3RoKTtcbiAgICBjb25zdCBoZWFkZXJzID0geyBSYW5nZSB9O1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgU291cmNlSHR0cC5mZXRjaCh0aGlzLnVyaSwgeyBoZWFkZXJzIH0pO1xuXG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMucGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG4gICAgICBpZiAodGhpcy5tZXRhZGF0YSA9PSBudWxsKSB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgICBlbHNlIGlmICh0aGlzLm1ldGFkYXRhLmV0YWcgJiYgdGhpcy5tZXRhZGF0YS5ldGFnICE9PSBtZXRhZGF0YS5ldGFnKVxuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRlRXJyb3IoXG4gICAgICAgICAgYEVUYWcgY29uZmxpY3QgJHt0aGlzLnVyaX0gJHtSYW5nZX0gZXhwZWN0ZWQ6ICR7dGhpcy5tZXRhZGF0YS5ldGFnfSBnb3Q6ICR7bWV0YWRhdGEuZXRhZ31gLFxuICAgICAgICAgIEVycm9yQ29kZXMuQ29uZmxpY3QsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBDb21wb3NpdGVFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dGhpcy51cml9ICR7UmFuZ2V9YCwgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgfVxuXG4gIC8vIEFsbG93IG92ZXJ3cml0aW5nIHRoZSBmZXRjaGVyIHVzZWQgKGVnIHRlc3Rpbmcvbm9kZS1qcylcbiAgc3RhdGljIGZldGNoOiBGZXRjaExpa2UgPSAoYSwgYikgPT4gZmV0Y2goYSwgYik7XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chunkd/source-http",
3
- "version": "10.0.0",
3
+ "version": "10.1.0",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
@@ -17,14 +17,10 @@
17
17
  "license": "MIT",
18
18
  "scripts": {},
19
19
  "dependencies": {
20
- "@chunkd/core": "^10.0.0",
21
- "node-fetch": "^3.1.0"
22
- },
23
- "devDependencies": {
24
- "@types/node-fetch": "^3.0.3"
20
+ "@chunkd/core": "^10.2.0"
25
21
  },
26
22
  "publishConfig": {
27
23
  "access": "public"
28
24
  },
29
- "gitHead": "56a55d967755d9f351355b2cef28898c3011062d"
25
+ "gitHead": "a674943243279cf005bdfd6452b30f2831fc4687"
30
26
  }
@@ -1,4 +1,4 @@
1
- import { ChunkSource, ChunkSourceBase } from '@chunkd/core';
1
+ import { ChunkSource, ChunkSourceBase, ChunkSourceMetadata, CompositeError, ErrorCodes } from '@chunkd/core';
2
2
 
3
3
  export interface FetchLikeOptions {
4
4
  method?: string;
@@ -31,14 +31,29 @@ export class SourceHttp extends ChunkSourceBase {
31
31
  return source.type === 'url';
32
32
  }
33
33
 
34
- _size: Promise<number> | undefined;
35
- get size(): Promise<number> {
36
- if (this._size) return this._size;
37
- this._size = Promise.resolve().then(async () => {
38
- const res = await SourceHttp.fetch(this.uri, { method: 'HEAD' });
39
- return Number(res.headers.get('content-length'));
34
+ metadata: ChunkSourceMetadata | null;
35
+ /** Load the ETag and content-range from the response */
36
+ parseResponse(response: FetchLikeResponse): ChunkSourceMetadata {
37
+ const metadata: ChunkSourceMetadata = {};
38
+ const contentRange = response.headers.get('content-range');
39
+ if (contentRange != null) metadata.size = this.parseContentRange(contentRange);
40
+ metadata.etag = response.headers.get('etag') ?? undefined;
41
+ return metadata;
42
+ }
43
+
44
+ private _head: Promise<FetchLikeResponse> | null;
45
+ head(): Promise<FetchLikeResponse> {
46
+ if (this._head) return this._head;
47
+ this._head = SourceHttp.fetch(this.uri, { method: 'HEAD' }).then((res) => {
48
+ this.metadata = this.parseResponse(res);
49
+ return res;
40
50
  });
41
- return this._size;
51
+ return this._head;
52
+ }
53
+
54
+ get size(): Promise<number> {
55
+ if (this.metadata?.size) return Promise.resolve(this.metadata.size);
56
+ return this.head().then(() => this.metadata?.size ?? -1);
42
57
  }
43
58
 
44
59
  async fetchBytes(offset: number, length?: number): Promise<ArrayBuffer> {
@@ -47,14 +62,18 @@ export class SourceHttp extends ChunkSourceBase {
47
62
  const response = await SourceHttp.fetch(this.uri, { headers });
48
63
 
49
64
  if (response.ok) {
50
- const contentRange = response.headers.get('content-range');
51
- if (this._size == null && contentRange != null) {
52
- this._size = Promise.resolve(this.parseContentRange(contentRange));
53
- }
65
+ const metadata = this.parseResponse(response);
66
+ if (this.metadata == null) this.metadata = metadata;
67
+ else if (this.metadata.etag && this.metadata.etag !== metadata.etag)
68
+ throw new CompositeError(
69
+ `ETag conflict ${this.uri} ${Range} expected: ${this.metadata.etag} got: ${metadata.etag}`,
70
+ ErrorCodes.Conflict,
71
+ null,
72
+ );
54
73
  return response.arrayBuffer();
55
74
  }
56
75
 
57
- throw new Error('Failed to fetch');
76
+ throw new CompositeError(`Failed to fetch ${this.uri} ${Range}`, response.status, response.statusText);
58
77
  }
59
78
 
60
79
  // Allow overwriting the fetcher used (eg testing/node-js)
@@ -1,3 +0,0 @@
1
- export { SourceHttp } from './http.source.js';
2
- export { FsHttp } from './http.fs.js';
3
- //# sourceMappingURL=index.node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.node.d.ts","sourceRoot":"","sources":["../src/index.node.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC"}
@@ -1,8 +0,0 @@
1
- // Assign fetch function for nodejs imports
2
- // This allows CogSourceUrl to be used without configuration inside nodejs environments
3
- import fetch from 'node-fetch';
4
- import { SourceHttp } from './http.source.js';
5
- SourceHttp.fetch = fetch;
6
- export { SourceHttp } from './http.source.js';
7
- export { FsHttp } from './http.fs.js';
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5ub2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJDQUEyQztBQUMzQyx1RkFBdUY7QUFDdkYsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU5QyxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQVksQ0FBQztBQUVoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFzc2lnbiBmZXRjaCBmdW5jdGlvbiBmb3Igbm9kZWpzIGltcG9ydHNcbi8vIFRoaXMgYWxsb3dzIENvZ1NvdXJjZVVybCB0byBiZSB1c2VkIHdpdGhvdXQgY29uZmlndXJhdGlvbiBpbnNpZGUgbm9kZWpzIGVudmlyb25tZW50c1xuaW1wb3J0IGZldGNoIGZyb20gJ25vZGUtZmV0Y2gnO1xuaW1wb3J0IHsgU291cmNlSHR0cCB9IGZyb20gJy4vaHR0cC5zb3VyY2UuanMnO1xuXG5Tb3VyY2VIdHRwLmZldGNoID0gZmV0Y2ggYXMgYW55O1xuXG5leHBvcnQgeyBTb3VyY2VIdHRwIH0gZnJvbSAnLi9odHRwLnNvdXJjZS5qcyc7XG5leHBvcnQgeyBGc0h0dHAgfSBmcm9tICcuL2h0dHAuZnMuanMnO1xuIl19
package/src/index.node.ts DELETED
@@ -1,9 +0,0 @@
1
- // Assign fetch function for nodejs imports
2
- // This allows CogSourceUrl to be used without configuration inside nodejs environments
3
- import fetch from 'node-fetch';
4
- import { SourceHttp } from './http.source.js';
5
-
6
- SourceHttp.fetch = fetch as any;
7
-
8
- export { SourceHttp } from './http.source.js';
9
- export { FsHttp } from './http.fs.js';