@chunkd/source-http 10.1.2 → 11.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -9
- package/build/{__test__ → src/__test__}/source.http.test.d.ts +0 -1
- package/build/src/__test__/source.http.test.js +97 -0
- package/build/src/__test__/source.http.test.js.map +1 -0
- package/build/src/index.d.ts +32 -0
- package/build/src/index.js +70 -0
- package/build/src/index.js.map +1 -0
- package/package.json +15 -7
- package/CHANGELOG.md +0 -504
- package/build/__test__/source.http.test.d.ts.map +0 -1
- package/build/__test__/source.http.test.js +0 -85
- package/build/http.fs.d.ts +0 -24
- package/build/http.fs.d.ts.map +0 -1
- package/build/http.fs.js +0 -51
- package/build/http.source.d.ts +0 -33
- package/build/http.source.d.ts.map +0 -1
- package/build/http.source.js +0 -56
- package/build/index.d.ts +0 -3
- package/build/index.d.ts.map +0 -1
- package/build/index.js +0 -3
- package/src/__test__/source.http.test.ts +0 -104
- package/src/http.fs.ts +0 -55
- package/src/http.source.ts +0 -81
- package/src/index.ts +0 -2
- package/tsconfig.json +0 -10
package/README.md
CHANGED
|
@@ -1,23 +1,39 @@
|
|
|
1
|
-
# @chunkd/source-
|
|
1
|
+
# @chunkd/source-http
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
Load a chunks of a file from a URL Source using `fetch`
|
|
3
|
+
Load a chunks of a file from a HTTP(s) Source using `fetch`
|
|
5
4
|
|
|
6
5
|
## Usage
|
|
7
6
|
|
|
8
|
-
```
|
|
7
|
+
```typescript
|
|
9
8
|
import { SourceHttp } from '@chunkd/source-http';
|
|
10
9
|
|
|
11
|
-
const source = new SourceHttp('https://example.com/cog.tif');
|
|
10
|
+
const source = new SourceHttp(new URL('https://example.com/cog.tif'));
|
|
11
|
+
|
|
12
|
+
const firstBuffer = await source.fetchBytes(0, 1024); // Load the first 1KB from the source
|
|
13
|
+
const lastBuffer = await source.fetchBytes(-1024); // load the last 1KB from the source
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
const size = source.metadata?.size; // File size if metadata has been fetched
|
|
14
16
|
```
|
|
15
17
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
### Relative URLs
|
|
19
|
+
|
|
20
|
+
for relative urls, use `document.baseURI`
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
const source = new SourceHttp(new URL('../cog.tif', document.baseURI));
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Advanced Usage
|
|
27
|
+
|
|
28
|
+
For caching, block alignment and fetch grouping see [@chunkd/middleware](https://www.npmjs.com/package/@chunkd/middleware) and [@chunkd/fs](https://www.npmjs.com/package/@chunkd/fs)
|
|
29
|
+
|
|
30
|
+
## Nodejs <18
|
|
31
|
+
|
|
32
|
+
Node.js <18 does not come with a default `fetch` function, a `fetch` method must be provided before being able to be used.
|
|
18
33
|
|
|
19
34
|
```javascript
|
|
20
|
-
import {
|
|
35
|
+
import { SourceHttp } from '@chunkd/source-http';
|
|
36
|
+
import { fetch } from 'node-fetch';
|
|
21
37
|
|
|
22
38
|
SourceHttp.fetch = fetch;
|
|
23
39
|
```
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { after, afterEach, before, beforeEach, describe, it } from 'node:test';
|
|
3
|
+
import { SourceHttp } from '../index.js';
|
|
4
|
+
describe('SourceHttp', () => {
|
|
5
|
+
let source;
|
|
6
|
+
let ranges;
|
|
7
|
+
before(() => {
|
|
8
|
+
// Fake fetch that returns the number of the byte that was requested
|
|
9
|
+
SourceHttp.fetch = (_, obj) => {
|
|
10
|
+
const rangeHeader = obj?.headers?.Range;
|
|
11
|
+
if (rangeHeader == null)
|
|
12
|
+
throw new Error('No headers');
|
|
13
|
+
const [startByte, endByte] = rangeHeader
|
|
14
|
+
.split('=')[1]
|
|
15
|
+
.split('-')
|
|
16
|
+
.map((i) => parseInt(i, 10));
|
|
17
|
+
const bytes = [];
|
|
18
|
+
ranges.push(rangeHeader);
|
|
19
|
+
for (let i = startByte; i < endByte; i++) {
|
|
20
|
+
bytes.push(i);
|
|
21
|
+
}
|
|
22
|
+
const buffer = new Uint8Array(bytes).buffer;
|
|
23
|
+
const arrayBuffer = () => Promise.resolve(buffer);
|
|
24
|
+
return Promise.resolve({ arrayBuffer, ok: true, headers: new Map() });
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
after(() => {
|
|
28
|
+
SourceHttp.fetch = fetch;
|
|
29
|
+
});
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
source = new SourceHttp(new URL('https://foo'));
|
|
32
|
+
ranges = [];
|
|
33
|
+
});
|
|
34
|
+
it('should fetch part of the file', async () => {
|
|
35
|
+
await source.fetch(0, 1024);
|
|
36
|
+
assert.equal(ranges[0], 'bytes=0-1023');
|
|
37
|
+
});
|
|
38
|
+
it('should fetch part of the file multiple times', async () => {
|
|
39
|
+
await source.fetch(0, 1024);
|
|
40
|
+
assert.equal(ranges[0], 'bytes=0-1023');
|
|
41
|
+
await source.fetch(0, 1024);
|
|
42
|
+
assert.equal(ranges[1], 'bytes=0-1023');
|
|
43
|
+
});
|
|
44
|
+
it('should fetch negative parts', async () => {
|
|
45
|
+
await source.fetch(-1024);
|
|
46
|
+
assert.equal(ranges[0], 'bytes=-1024');
|
|
47
|
+
});
|
|
48
|
+
it('should fetch at offsets parts', async () => {
|
|
49
|
+
await source.fetch(1024, 1024);
|
|
50
|
+
assert.equal(ranges[0], 'bytes=1024-2047');
|
|
51
|
+
});
|
|
52
|
+
it('should support string URLs', () => {
|
|
53
|
+
const source = new SourceHttp('https://foo.com/bar');
|
|
54
|
+
assert.equal(source.url.href, 'https://foo.com/bar');
|
|
55
|
+
});
|
|
56
|
+
// Should these throw if import.meta.url is not a http?
|
|
57
|
+
describe('import.meta.url', () => {
|
|
58
|
+
it('should support "/"', () => {
|
|
59
|
+
const source = new SourceHttp('/bar.txt');
|
|
60
|
+
// Windows will report `file://D:/bar.txt` linux `file:///bar.txt`
|
|
61
|
+
const baseUrl = new URL('/', import.meta.url);
|
|
62
|
+
assert.equal(source.url.href, baseUrl.href + 'bar.txt');
|
|
63
|
+
});
|
|
64
|
+
it('should support "./', () => {
|
|
65
|
+
const source = new SourceHttp('./bar.txt');
|
|
66
|
+
assert.equal(source.url.protocol, 'file:');
|
|
67
|
+
assert.ok(source.url.href.endsWith('/src/bar.txt'));
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('document.baseURI', () => {
|
|
71
|
+
let oldDoc;
|
|
72
|
+
beforeEach(() => {
|
|
73
|
+
oldDoc = global.document;
|
|
74
|
+
global.document = { baseURI: 'https://example.com/foo/index.html' };
|
|
75
|
+
});
|
|
76
|
+
afterEach(() => {
|
|
77
|
+
global.document = oldDoc;
|
|
78
|
+
});
|
|
79
|
+
it('should use support "/" ', () => {
|
|
80
|
+
const source = new SourceHttp('/bar.txt');
|
|
81
|
+
assert.equal(source.url.href, 'https://example.com/bar.txt');
|
|
82
|
+
});
|
|
83
|
+
it('should support ".."', () => {
|
|
84
|
+
const sourceRelUp = new SourceHttp('../bar.txt');
|
|
85
|
+
assert.equal(sourceRelUp.url.href, 'https://example.com/bar.txt');
|
|
86
|
+
});
|
|
87
|
+
it('should support "./"', () => {
|
|
88
|
+
const sourceRelUp = new SourceHttp('./bar.txt');
|
|
89
|
+
assert.equal(sourceRelUp.url.href, 'https://example.com/foo/bar.txt');
|
|
90
|
+
});
|
|
91
|
+
it('should should support "../../../"', () => {
|
|
92
|
+
const sourceRelUp = new SourceHttp('../../../bar.txt');
|
|
93
|
+
assert.equal(sourceRelUp.url.href, 'https://example.com/bar.txt');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=source.http.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.http.test.js","sourceRoot":"","sources":["../../../src/__test__/source.http.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Source, SourceMetadata } from '@chunkd/source';
|
|
2
|
+
/** Minimal typings for fetch */
|
|
3
|
+
export interface FetchLikeOptions {
|
|
4
|
+
method?: string;
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export interface FetchLikeResponse {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
statusText: string;
|
|
10
|
+
status: number;
|
|
11
|
+
headers: {
|
|
12
|
+
get(k: string): string | null;
|
|
13
|
+
};
|
|
14
|
+
body: unknown;
|
|
15
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
16
|
+
}
|
|
17
|
+
export type FetchLike = (url: string | URL, opts?: FetchLikeOptions) => Promise<FetchLikeResponse>;
|
|
18
|
+
/** Load the ETag and content-range from the response */
|
|
19
|
+
export declare function getMetadataFromResponse(response: FetchLikeResponse): SourceMetadata;
|
|
20
|
+
export declare class SourceHttp implements Source {
|
|
21
|
+
type: string;
|
|
22
|
+
url: URL;
|
|
23
|
+
constructor(url: URL | string);
|
|
24
|
+
/** Attempt to parse a relative string into a URL */
|
|
25
|
+
static tryUrl(s: string): URL;
|
|
26
|
+
/** Optional metadata, only populated if a .head() or .fetchBytes() has already been returned */
|
|
27
|
+
metadata?: SourceMetadata;
|
|
28
|
+
private _head?;
|
|
29
|
+
head(): Promise<SourceMetadata>;
|
|
30
|
+
fetch(offset: number, length?: number): Promise<ArrayBuffer>;
|
|
31
|
+
static fetch: FetchLike;
|
|
32
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { ContentRange, SourceError } from '@chunkd/source';
|
|
2
|
+
/** Load the ETag and content-range from the response */
|
|
3
|
+
export function getMetadataFromResponse(response) {
|
|
4
|
+
const metadata = { size: -1 };
|
|
5
|
+
const contentRange = response.headers.get('content-range');
|
|
6
|
+
if (contentRange != null)
|
|
7
|
+
metadata.size = ContentRange.parseSize(contentRange);
|
|
8
|
+
metadata.eTag = response.headers.get('etag') ?? undefined;
|
|
9
|
+
metadata.contentType = response.headers.get('content-type') ?? undefined;
|
|
10
|
+
metadata.contentDisposition = response.headers.get('content-disposition') ?? undefined;
|
|
11
|
+
return metadata;
|
|
12
|
+
}
|
|
13
|
+
export class SourceHttp {
|
|
14
|
+
constructor(url) {
|
|
15
|
+
this.type = 'http';
|
|
16
|
+
this.url = typeof url === 'string' ? SourceHttp.tryUrl(url) : url;
|
|
17
|
+
}
|
|
18
|
+
/** Attempt to parse a relative string into a URL */
|
|
19
|
+
static tryUrl(s) {
|
|
20
|
+
try {
|
|
21
|
+
return new URL(s);
|
|
22
|
+
}
|
|
23
|
+
catch (_e) {
|
|
24
|
+
if (typeof document !== 'undefined')
|
|
25
|
+
return new URL(s, document.baseURI);
|
|
26
|
+
// Should these throw if import.meta.url is not a http?
|
|
27
|
+
return new URL(s, import.meta.url);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
head() {
|
|
31
|
+
if (this._head)
|
|
32
|
+
return this._head;
|
|
33
|
+
this._head = SourceHttp.fetch(this.url, { method: 'HEAD' }).then((res) => {
|
|
34
|
+
if (!res.ok) {
|
|
35
|
+
delete this._head;
|
|
36
|
+
throw new Error(`Failed to HEAD ${this.url}`, { cause: { statusCode: res.status, msg: res.statusText } });
|
|
37
|
+
}
|
|
38
|
+
this.metadata = getMetadataFromResponse(res);
|
|
39
|
+
return this.metadata;
|
|
40
|
+
});
|
|
41
|
+
return this._head;
|
|
42
|
+
}
|
|
43
|
+
async fetch(offset, length) {
|
|
44
|
+
try {
|
|
45
|
+
const Range = ContentRange.toRange(offset, length);
|
|
46
|
+
const headers = { Range };
|
|
47
|
+
const response = await SourceHttp.fetch(this.url, { headers });
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new SourceError(`Failed to fetch ${this.url} ${Range}`, response.status, this, new Error(response.statusText));
|
|
50
|
+
}
|
|
51
|
+
const metadata = getMetadataFromResponse(response);
|
|
52
|
+
if (this.metadata == null) {
|
|
53
|
+
this.metadata = metadata;
|
|
54
|
+
}
|
|
55
|
+
else if (this.metadata.eTag && this.metadata.eTag !== metadata.eTag) {
|
|
56
|
+
// ETag has changed since the last read!
|
|
57
|
+
throw new SourceError(`ETag conflict ${this.url} ${Range} expected: ${this.metadata.eTag} got: ${metadata.eTag}`, 409, this);
|
|
58
|
+
}
|
|
59
|
+
return response.arrayBuffer();
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
if (SourceError.is(e) && e.source === this)
|
|
63
|
+
throw e;
|
|
64
|
+
throw new SourceError(`Failed to fetch: ${this.url}`, 500, this, e);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Allow overwriting the fetcher used (eg testing/node-js)
|
|
69
|
+
SourceHttp.fetch = (a, b) => fetch(a, b);
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chunkd/source-http",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "11.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"engines": {
|
|
6
|
-
"node": ">=
|
|
6
|
+
"node": ">=18.0.0"
|
|
7
7
|
},
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
10
10
|
"url": "https://github.com/blacha/chunkd.git",
|
|
11
11
|
"directory": "packages/source-http"
|
|
12
12
|
},
|
|
13
|
-
"main": "./build/index.js",
|
|
14
|
-
"types": "./build/index.d.ts",
|
|
13
|
+
"main": "./build/src/index.js",
|
|
14
|
+
"types": "./build/src/index.d.ts",
|
|
15
15
|
"author": "Blayne Chard",
|
|
16
16
|
"license": "MIT",
|
|
17
|
-
"scripts": {
|
|
17
|
+
"scripts": {
|
|
18
|
+
"test": "node --test"
|
|
19
|
+
},
|
|
18
20
|
"dependencies": {
|
|
19
|
-
"@chunkd/
|
|
21
|
+
"@chunkd/source": "^11.0.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^18.16.19"
|
|
20
25
|
},
|
|
21
26
|
"publishConfig": {
|
|
22
27
|
"access": "public"
|
|
23
28
|
},
|
|
24
|
-
"
|
|
29
|
+
"files": [
|
|
30
|
+
"build/src"
|
|
31
|
+
],
|
|
32
|
+
"gitHead": "83869d7cce2dc49011b136d28cb83f023b4443e6"
|
|
25
33
|
}
|