@loaders.gl/loader-utils 4.0.0-beta.2 → 4.0.0-beta.3
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/dist/index.cjs +1252 -0
- package/dist/index.d.ts +7 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/{esm/json-loader.js → json-loader.js} +1 -1
- package/dist/json-loader.js.map +1 -0
- package/dist/lib/binary-utils/array-buffer-utils.js.map +1 -0
- package/dist/{esm/lib → lib}/binary-utils/dataview-copy-utils.js +1 -1
- package/dist/lib/binary-utils/dataview-copy-utils.js.map +1 -0
- package/dist/lib/binary-utils/get-first-characters.js.map +1 -0
- package/dist/{esm/lib → lib}/binary-utils/memory-conversion-utils.js +1 -1
- package/dist/lib/binary-utils/memory-conversion-utils.js.map +1 -0
- package/dist/{esm/lib → lib}/binary-utils/memory-copy-utils.js +1 -1
- package/dist/lib/binary-utils/memory-copy-utils.js.map +1 -0
- package/dist/lib/env-utils/assert.js.map +1 -0
- package/dist/lib/env-utils/globals.js.map +1 -0
- package/dist/lib/file-provider/data-view-file.d.ts +4 -1
- package/dist/lib/file-provider/data-view-file.d.ts.map +1 -1
- package/dist/{esm/lib → lib}/file-provider/data-view-file.js +1 -2
- package/dist/lib/file-provider/data-view-file.js.map +1 -0
- package/dist/lib/file-provider/file-handle-file.d.ts +12 -19
- package/dist/lib/file-provider/file-handle-file.d.ts.map +1 -1
- package/dist/lib/file-provider/file-handle-file.js +56 -0
- package/dist/lib/file-provider/file-handle-file.js.map +1 -0
- package/dist/lib/file-provider/file-provider.d.ts +1 -0
- package/dist/lib/file-provider/file-provider.d.ts.map +1 -1
- package/dist/lib/file-provider/file-provider.js.map +1 -0
- package/dist/lib/files/blob-file.d.ts +16 -0
- package/dist/lib/files/blob-file.d.ts.map +1 -0
- package/dist/lib/files/blob-file.js +25 -0
- package/dist/lib/files/blob-file.js.map +1 -0
- package/dist/lib/files/file.d.ts +33 -0
- package/dist/lib/files/file.d.ts.map +1 -0
- package/dist/lib/files/file.js +2 -0
- package/dist/lib/files/file.js.map +1 -0
- package/dist/lib/files/http-file.d.ts +21 -0
- package/dist/lib/files/http-file.d.ts.map +1 -0
- package/dist/lib/files/http-file.js +79 -0
- package/dist/lib/files/http-file.js.map +1 -0
- package/dist/lib/files/node-file-facade.d.ts +18 -0
- package/dist/lib/files/node-file-facade.d.ts.map +1 -0
- package/dist/lib/files/node-file-facade.js +29 -0
- package/dist/lib/files/node-file-facade.js.map +1 -0
- package/dist/lib/files/sources.d.ts +1 -0
- package/dist/lib/files/sources.d.ts.map +1 -0
- package/dist/lib/files/sources.js +2 -0
- package/dist/lib/files/sources.js.map +1 -0
- package/dist/lib/filesystems/filesystem.d.ts +18 -65
- package/dist/lib/filesystems/filesystem.d.ts.map +1 -1
- package/dist/lib/filesystems/filesystem.js.map +1 -0
- package/dist/lib/filesystems/node-filesystem-facade.d.ts +23 -0
- package/dist/lib/filesystems/node-filesystem-facade.d.ts.map +1 -0
- package/dist/lib/filesystems/node-filesystem-facade.js +37 -0
- package/dist/lib/filesystems/node-filesystem-facade.js.map +1 -0
- package/dist/{esm/lib → lib}/iterators/async-iteration.js +1 -1
- package/dist/lib/iterators/async-iteration.js.map +1 -0
- package/dist/lib/iterators/text-iterators.js.map +1 -0
- package/dist/lib/node/buffer.browser.d.ts +1 -1
- package/dist/lib/node/buffer.browser.d.ts.map +1 -1
- package/dist/lib/node/buffer.browser.js.map +1 -0
- package/dist/lib/node/buffer.d.ts +1 -1
- package/dist/lib/node/buffer.d.ts.map +1 -1
- package/dist/lib/node/buffer.js.map +1 -0
- package/dist/lib/node/fs.browser.js.map +1 -0
- package/dist/lib/node/promisify.js.map +1 -0
- package/dist/lib/node/stream.browser.js.map +1 -0
- package/dist/lib/node/stream.js.map +1 -0
- package/dist/lib/option-utils/merge-loader-options.js.map +1 -0
- package/dist/lib/parser-utils/parse-json.js +9 -0
- package/dist/lib/parser-utils/parse-json.js.map +1 -0
- package/dist/{esm/lib → lib}/path-utils/file-aliases.js +1 -1
- package/dist/lib/path-utils/file-aliases.js.map +1 -0
- package/dist/lib/path-utils/get-cwd.js.map +1 -0
- package/dist/{esm/lib → lib}/path-utils/path.js +6 -6
- package/dist/lib/path-utils/path.js.map +1 -0
- package/dist/{esm/lib → lib}/request-utils/request-scheduler.js +6 -7
- package/dist/lib/request-utils/request-scheduler.js.map +1 -0
- package/dist/{esm/lib → lib}/sources/data-source.js +4 -5
- package/dist/lib/sources/data-source.js.map +1 -0
- package/dist/lib/sources/image-source.js +5 -0
- package/dist/lib/sources/image-source.js.map +1 -0
- package/dist/lib/sources/image-tile-source.js.map +1 -0
- package/dist/lib/sources/tile-source.js.map +1 -0
- package/dist/lib/sources/utils/image-type.js.map +1 -0
- package/dist/lib/sources/utils/utils.js.map +1 -0
- package/dist/lib/sources/vector-tile-source.js.map +1 -0
- package/dist/{esm/lib → lib}/worker-loader-utils/create-loader-worker.js +1 -1
- package/dist/lib/worker-loader-utils/create-loader-worker.js.map +1 -0
- package/dist/{esm/lib → lib}/worker-loader-utils/encode-with-worker.js +1 -1
- package/dist/lib/worker-loader-utils/encode-with-worker.js.map +1 -0
- package/dist/{esm/lib → lib}/worker-loader-utils/parse-with-worker.js +1 -1
- package/dist/lib/worker-loader-utils/parse-with-worker.js.map +1 -0
- package/dist/loader-types.js.map +1 -0
- package/dist/service-types.js.map +1 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -0
- package/dist/workers/json-worker.js +4 -0
- package/dist/workers/json-worker.js.map +1 -0
- package/dist/writer-types.js.map +1 -0
- package/package.json +13 -5
- package/src/index.ts +10 -15
- package/src/lib/file-provider/data-view-file.ts +4 -2
- package/src/lib/file-provider/file-handle-file.ts +28 -44
- package/src/lib/file-provider/file-provider.ts +1 -0
- package/src/lib/files/blob-file.ts +32 -0
- package/src/lib/files/file.ts +37 -0
- package/src/lib/files/http-file.ts +120 -0
- package/src/lib/files/node-file-facade.ts +39 -0
- package/src/lib/files/sources.ts +150 -0
- package/src/lib/filesystems/filesystem.ts +19 -68
- package/src/lib/filesystems/node-filesystem-facade.ts +63 -0
- package/src/lib/node/buffer.browser.ts +1 -1
- package/src/lib/node/buffer.ts +1 -1
- package/src/types.ts +0 -4
- package/dist/es5/index.js +0 -389
- package/dist/es5/index.js.map +0 -1
- package/dist/es5/json-loader.js +0 -44
- package/dist/es5/json-loader.js.map +0 -1
- package/dist/es5/lib/binary-utils/array-buffer-utils.js +0 -80
- package/dist/es5/lib/binary-utils/array-buffer-utils.js.map +0 -1
- package/dist/es5/lib/binary-utils/dataview-copy-utils.js +0 -58
- package/dist/es5/lib/binary-utils/dataview-copy-utils.js.map +0 -1
- package/dist/es5/lib/binary-utils/get-first-characters.js +0 -31
- package/dist/es5/lib/binary-utils/get-first-characters.js.map +0 -1
- package/dist/es5/lib/binary-utils/memory-conversion-utils.js +0 -44
- package/dist/es5/lib/binary-utils/memory-conversion-utils.js.map +0 -1
- package/dist/es5/lib/binary-utils/memory-copy-utils.js +0 -34
- package/dist/es5/lib/binary-utils/memory-copy-utils.js.map +0 -1
- package/dist/es5/lib/env-utils/assert.js +0 -12
- package/dist/es5/lib/env-utils/assert.js.map +0 -1
- package/dist/es5/lib/env-utils/globals.js +0 -30
- package/dist/es5/lib/env-utils/globals.js.map +0 -1
- package/dist/es5/lib/file-provider/data-view-file.js +0 -146
- package/dist/es5/lib/file-provider/data-view-file.js.map +0 -1
- package/dist/es5/lib/file-provider/file-handle-file.js +0 -236
- package/dist/es5/lib/file-provider/file-handle-file.js.map +0 -1
- package/dist/es5/lib/file-provider/file-handle.js +0 -98
- package/dist/es5/lib/file-provider/file-handle.js.map +0 -1
- package/dist/es5/lib/file-provider/file-provider.js +0 -11
- package/dist/es5/lib/file-provider/file-provider.js.map +0 -1
- package/dist/es5/lib/filesystems/filesystem.js +0 -2
- package/dist/es5/lib/filesystems/filesystem.js.map +0 -1
- package/dist/es5/lib/filesystems/node-filesystem.js +0 -176
- package/dist/es5/lib/filesystems/node-filesystem.js.map +0 -1
- package/dist/es5/lib/filesystems/readable-file.js +0 -91
- package/dist/es5/lib/filesystems/readable-file.js.map +0 -1
- package/dist/es5/lib/filesystems/writable-file.js +0 -82
- package/dist/es5/lib/filesystems/writable-file.js.map +0 -1
- package/dist/es5/lib/iterators/async-iteration.js +0 -190
- package/dist/es5/lib/iterators/async-iteration.js.map +0 -1
- package/dist/es5/lib/iterators/text-iterators.js +0 -305
- package/dist/es5/lib/iterators/text-iterators.js.map +0 -1
- package/dist/es5/lib/node/buffer.browser.js +0 -14
- package/dist/es5/lib/node/buffer.browser.js.map +0 -1
- package/dist/es5/lib/node/buffer.js +0 -27
- package/dist/es5/lib/node/buffer.js.map +0 -1
- package/dist/es5/lib/node/fs.browser.js +0 -9
- package/dist/es5/lib/node/fs.browser.js.map +0 -1
- package/dist/es5/lib/node/fs.js +0 -82
- package/dist/es5/lib/node/fs.js.map +0 -1
- package/dist/es5/lib/node/promisify.js +0 -36
- package/dist/es5/lib/node/promisify.js.map +0 -1
- package/dist/es5/lib/node/stream.browser.js +0 -9
- package/dist/es5/lib/node/stream.browser.js.map +0 -1
- package/dist/es5/lib/node/stream.js +0 -15
- package/dist/es5/lib/node/stream.js.map +0 -1
- package/dist/es5/lib/option-utils/merge-loader-options.js +0 -30
- package/dist/es5/lib/option-utils/merge-loader-options.js.map +0 -1
- package/dist/es5/lib/parser-utils/parse-json.js +0 -15
- package/dist/es5/lib/parser-utils/parse-json.js.map +0 -1
- package/dist/es5/lib/path-utils/file-aliases.js +0 -33
- package/dist/es5/lib/path-utils/file-aliases.js.map +0 -1
- package/dist/es5/lib/path-utils/get-cwd.js +0 -15
- package/dist/es5/lib/path-utils/get-cwd.js.map +0 -1
- package/dist/es5/lib/path-utils/path.js +0 -136
- package/dist/es5/lib/path-utils/path.js.map +0 -1
- package/dist/es5/lib/request-utils/request-scheduler.js +0 -150
- package/dist/es5/lib/request-utils/request-scheduler.js.map +0 -1
- package/dist/es5/lib/sources/data-source.js +0 -67
- package/dist/es5/lib/sources/data-source.js.map +0 -1
- package/dist/es5/lib/sources/image-source.js +0 -31
- package/dist/es5/lib/sources/image-source.js.map +0 -1
- package/dist/es5/lib/sources/image-tile-source.js +0 -2
- package/dist/es5/lib/sources/image-tile-source.js.map +0 -1
- package/dist/es5/lib/sources/tile-source.js +0 -2
- package/dist/es5/lib/sources/tile-source.js.map +0 -1
- package/dist/es5/lib/sources/utils/image-type.js +0 -2
- package/dist/es5/lib/sources/utils/image-type.js.map +0 -1
- package/dist/es5/lib/sources/utils/utils.js +0 -36
- package/dist/es5/lib/sources/utils/utils.js.map +0 -1
- package/dist/es5/lib/sources/vector-tile-source.js +0 -2
- package/dist/es5/lib/sources/vector-tile-source.js.map +0 -1
- package/dist/es5/lib/worker-loader-utils/create-loader-worker.js +0 -142
- package/dist/es5/lib/worker-loader-utils/create-loader-worker.js.map +0 -1
- package/dist/es5/lib/worker-loader-utils/encode-with-worker.js +0 -18
- package/dist/es5/lib/worker-loader-utils/encode-with-worker.js.map +0 -1
- package/dist/es5/lib/worker-loader-utils/parse-with-worker.js +0 -115
- package/dist/es5/lib/worker-loader-utils/parse-with-worker.js.map +0 -1
- package/dist/es5/loader-types.js +0 -58
- package/dist/es5/loader-types.js.map +0 -1
- package/dist/es5/service-types.js +0 -2
- package/dist/es5/service-types.js.map +0 -1
- package/dist/es5/types.js +0 -2
- package/dist/es5/types.js.map +0 -1
- package/dist/es5/workers/json-worker.js +0 -6
- package/dist/es5/workers/json-worker.js.map +0 -1
- package/dist/es5/writer-types.js +0 -2
- package/dist/es5/writer-types.js.map +0 -1
- package/dist/esm/index.js +0 -36
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/json-loader.js.map +0 -1
- package/dist/esm/lib/binary-utils/array-buffer-utils.js.map +0 -1
- package/dist/esm/lib/binary-utils/dataview-copy-utils.js.map +0 -1
- package/dist/esm/lib/binary-utils/get-first-characters.js.map +0 -1
- package/dist/esm/lib/binary-utils/memory-conversion-utils.js.map +0 -1
- package/dist/esm/lib/binary-utils/memory-copy-utils.js.map +0 -1
- package/dist/esm/lib/env-utils/assert.js.map +0 -1
- package/dist/esm/lib/env-utils/globals.js.map +0 -1
- package/dist/esm/lib/file-provider/data-view-file.js.map +0 -1
- package/dist/esm/lib/file-provider/file-handle-file.js +0 -59
- package/dist/esm/lib/file-provider/file-handle-file.js.map +0 -1
- package/dist/esm/lib/file-provider/file-handle.js +0 -33
- package/dist/esm/lib/file-provider/file-handle.js.map +0 -1
- package/dist/esm/lib/file-provider/file-provider.js.map +0 -1
- package/dist/esm/lib/filesystems/filesystem.js.map +0 -1
- package/dist/esm/lib/filesystems/node-filesystem.js +0 -46
- package/dist/esm/lib/filesystems/node-filesystem.js.map +0 -1
- package/dist/esm/lib/filesystems/readable-file.js +0 -20
- package/dist/esm/lib/filesystems/readable-file.js.map +0 -1
- package/dist/esm/lib/filesystems/writable-file.js +0 -20
- package/dist/esm/lib/filesystems/writable-file.js.map +0 -1
- package/dist/esm/lib/iterators/async-iteration.js.map +0 -1
- package/dist/esm/lib/iterators/text-iterators.js.map +0 -1
- package/dist/esm/lib/node/buffer.browser.js.map +0 -1
- package/dist/esm/lib/node/buffer.js.map +0 -1
- package/dist/esm/lib/node/fs.browser.js.map +0 -1
- package/dist/esm/lib/node/fs.js +0 -29
- package/dist/esm/lib/node/fs.js.map +0 -1
- package/dist/esm/lib/node/promisify.js.map +0 -1
- package/dist/esm/lib/node/stream.browser.js.map +0 -1
- package/dist/esm/lib/node/stream.js.map +0 -1
- package/dist/esm/lib/option-utils/merge-loader-options.js.map +0 -1
- package/dist/esm/lib/parser-utils/parse-json.js +0 -9
- package/dist/esm/lib/parser-utils/parse-json.js.map +0 -1
- package/dist/esm/lib/path-utils/file-aliases.js.map +0 -1
- package/dist/esm/lib/path-utils/get-cwd.js.map +0 -1
- package/dist/esm/lib/path-utils/path.js.map +0 -1
- package/dist/esm/lib/request-utils/request-scheduler.js.map +0 -1
- package/dist/esm/lib/sources/data-source.js.map +0 -1
- package/dist/esm/lib/sources/image-source.js +0 -6
- package/dist/esm/lib/sources/image-source.js.map +0 -1
- package/dist/esm/lib/sources/image-tile-source.js.map +0 -1
- package/dist/esm/lib/sources/tile-source.js.map +0 -1
- package/dist/esm/lib/sources/utils/image-type.js.map +0 -1
- package/dist/esm/lib/sources/utils/utils.js.map +0 -1
- package/dist/esm/lib/sources/vector-tile-source.js.map +0 -1
- package/dist/esm/lib/worker-loader-utils/create-loader-worker.js.map +0 -1
- package/dist/esm/lib/worker-loader-utils/encode-with-worker.js.map +0 -1
- package/dist/esm/lib/worker-loader-utils/parse-with-worker.js.map +0 -1
- package/dist/esm/loader-types.js.map +0 -1
- package/dist/esm/service-types.js.map +0 -1
- package/dist/esm/types.js.map +0 -1
- package/dist/esm/workers/json-worker.js +0 -4
- package/dist/esm/workers/json-worker.js.map +0 -1
- package/dist/esm/writer-types.js.map +0 -1
- package/dist/lib/file-provider/file-handle.d.ts +0 -40
- package/dist/lib/file-provider/file-handle.d.ts.map +0 -1
- package/dist/lib/filesystems/node-filesystem.d.ts +0 -39
- package/dist/lib/filesystems/node-filesystem.d.ts.map +0 -1
- package/dist/lib/filesystems/readable-file.d.ts +0 -10
- package/dist/lib/filesystems/readable-file.d.ts.map +0 -1
- package/dist/lib/filesystems/writable-file.d.ts +0 -18
- package/dist/lib/filesystems/writable-file.d.ts.map +0 -1
- package/dist/lib/node/fs.d.ts +0 -30
- package/dist/lib/node/fs.d.ts.map +0 -1
- package/src/lib/file-provider/file-handle.ts +0 -79
- package/src/lib/filesystems/node-filesystem.ts +0 -67
- package/src/lib/filesystems/readable-file.ts +0 -30
- package/src/lib/filesystems/writable-file.ts +0 -44
- package/src/lib/node/fs.ts +0 -49
- /package/dist/{esm/lib → lib}/binary-utils/array-buffer-utils.js +0 -0
- /package/dist/{esm/lib → lib}/binary-utils/get-first-characters.js +0 -0
- /package/dist/{esm/lib → lib}/env-utils/assert.js +0 -0
- /package/dist/{esm/lib → lib}/env-utils/globals.js +0 -0
- /package/dist/{esm/lib → lib}/file-provider/file-provider.js +0 -0
- /package/dist/{esm/lib → lib}/filesystems/filesystem.js +0 -0
- /package/dist/{esm/lib → lib}/iterators/text-iterators.js +0 -0
- /package/dist/{esm/lib → lib}/node/buffer.browser.js +0 -0
- /package/dist/{esm/lib → lib}/node/buffer.js +0 -0
- /package/dist/{esm/lib → lib}/node/fs.browser.js +0 -0
- /package/dist/{esm/lib → lib}/node/promisify.js +0 -0
- /package/dist/{esm/lib → lib}/node/stream.browser.js +0 -0
- /package/dist/{esm/lib → lib}/node/stream.js +0 -0
- /package/dist/{esm/lib → lib}/option-utils/merge-loader-options.js +0 -0
- /package/dist/{esm/lib → lib}/path-utils/get-cwd.js +0 -0
- /package/dist/{esm/lib → lib}/sources/image-tile-source.js +0 -0
- /package/dist/{esm/lib → lib}/sources/tile-source.js +0 -0
- /package/dist/{esm/lib → lib}/sources/utils/image-type.js +0 -0
- /package/dist/{esm/lib → lib}/sources/utils/utils.js +0 -0
- /package/dist/{esm/lib → lib}/sources/vector-tile-source.js +0 -0
- /package/dist/{esm/loader-types.js → loader-types.js} +0 -0
- /package/dist/{esm/service-types.js → service-types.js} +0 -0
- /package/dist/{esm/types.js → types.js} +0 -0
- /package/dist/{esm/writer-types.js → writer-types.js} +0 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
3
|
+
import {ReadableFile, Stat} from './file';
|
|
4
|
+
|
|
5
|
+
export class HttpFile implements ReadableFile {
|
|
6
|
+
readonly handle: string;
|
|
7
|
+
readonly size: number = 0;
|
|
8
|
+
readonly bigsize: bigint = 0n;
|
|
9
|
+
readonly url: string;
|
|
10
|
+
|
|
11
|
+
constructor(url: string) {
|
|
12
|
+
this.handle = url;
|
|
13
|
+
this.url = url;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async close(): Promise<void> {}
|
|
17
|
+
|
|
18
|
+
async stat(): Promise<Stat> {
|
|
19
|
+
const response = await fetch(this.handle, {method: 'HEAD'});
|
|
20
|
+
if (!response.ok) {
|
|
21
|
+
throw new Error(`Failed to fetch HEAD ${this.handle}`);
|
|
22
|
+
}
|
|
23
|
+
const size = parseInt(response.headers.get('Content-Length') || '0');
|
|
24
|
+
return {
|
|
25
|
+
size,
|
|
26
|
+
bigsize: BigInt(size),
|
|
27
|
+
isDirectory: false
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async read(offset: number | bigint, length: number): Promise<ArrayBuffer> {
|
|
32
|
+
const response = await this.fetchRange(offset, length);
|
|
33
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
34
|
+
return arrayBuffer;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @param offset
|
|
40
|
+
* @param length
|
|
41
|
+
* @param signal
|
|
42
|
+
* @returns
|
|
43
|
+
* @see https://github.com/protomaps/PMTiles
|
|
44
|
+
*/
|
|
45
|
+
// eslint-disable-next-line complexity
|
|
46
|
+
async fetchRange(
|
|
47
|
+
offset: number | bigint,
|
|
48
|
+
length: number,
|
|
49
|
+
signal?: AbortSignal
|
|
50
|
+
): Promise<Response> {
|
|
51
|
+
const nOffset = Number(offset);
|
|
52
|
+
const nLength = Number(length);
|
|
53
|
+
|
|
54
|
+
let controller: AbortController | undefined;
|
|
55
|
+
if (!signal) {
|
|
56
|
+
// ToDO why is it so important to abort in case 200?
|
|
57
|
+
// TODO check this works or assert 206
|
|
58
|
+
controller = new AbortController();
|
|
59
|
+
signal = controller.signal;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const url = this.handle;
|
|
63
|
+
let response = await fetch(url, {
|
|
64
|
+
signal,
|
|
65
|
+
headers: {Range: `bytes=${nOffset}-${nOffset + nLength - 1}`}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
switch (response.status) {
|
|
69
|
+
case 206: // Partial Content success
|
|
70
|
+
// This is the expected success code for a range request
|
|
71
|
+
break;
|
|
72
|
+
|
|
73
|
+
case 200:
|
|
74
|
+
// some well-behaved backends, e.g. DigitalOcean CDN, respond with 200 instead of 206
|
|
75
|
+
// but we also need to detect no support for Byte Serving which is returning the whole file
|
|
76
|
+
const contentLength = response.headers.get('Content-Length');
|
|
77
|
+
if (!contentLength || Number(contentLength) > length) {
|
|
78
|
+
if (controller) {
|
|
79
|
+
controller.abort();
|
|
80
|
+
}
|
|
81
|
+
throw Error(
|
|
82
|
+
'content-length header missing or exceeding request. Server must support HTTP Byte Serving.'
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// @eslint-disable-next-line no-fallthrough
|
|
87
|
+
case 416: // "Range Not Satisfiable"
|
|
88
|
+
// some HTTP servers don't accept ranges beyond the end of the resource.
|
|
89
|
+
// Retry with the exact length
|
|
90
|
+
// TODO: can return 416 with offset > 0 if content changed, which will have a blank etag.
|
|
91
|
+
// See https://github.com/protomaps/PMTiles/issues/90
|
|
92
|
+
if (offset === 0) {
|
|
93
|
+
const contentRange = response.headers.get('Content-Range');
|
|
94
|
+
if (!contentRange || !contentRange.startsWith('bytes *')) {
|
|
95
|
+
throw Error('Missing content-length on 416 response');
|
|
96
|
+
}
|
|
97
|
+
const actualLength = Number(contentRange.substr(8));
|
|
98
|
+
response = await fetch(this.url, {
|
|
99
|
+
signal,
|
|
100
|
+
headers: {Range: `bytes=0-${actualLength - 1}`}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
|
|
105
|
+
default:
|
|
106
|
+
if (response.status >= 300) {
|
|
107
|
+
throw Error(`Bad response code: ${response.status}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return response;
|
|
112
|
+
// const data = await response.arrayBuffer();
|
|
113
|
+
// return {
|
|
114
|
+
// data,
|
|
115
|
+
// etag: response.headers.get('ETag') || undefined,
|
|
116
|
+
// cacheControl: response.headers.get('Cache-Control') || undefined,
|
|
117
|
+
// expires: response.headers.get('Expires') || undefined
|
|
118
|
+
// };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
3
|
+
import {isBrowser} from '../env-utils/globals';
|
|
4
|
+
import {ReadableFile, WritableFile, Stat} from './file';
|
|
5
|
+
|
|
6
|
+
const NOT_IMPLEMENTED = new Error('Not implemented');
|
|
7
|
+
|
|
8
|
+
/** This class is a facade that gets replaced with an actual NodeFile instance */
|
|
9
|
+
export class NodeFileFacade implements ReadableFile, WritableFile {
|
|
10
|
+
handle: unknown;
|
|
11
|
+
size: number = 0;
|
|
12
|
+
bigsize: bigint = 0n;
|
|
13
|
+
url: string = '';
|
|
14
|
+
|
|
15
|
+
constructor(url: string, flags?: 'r' | 'w' | 'wx', mode?: number) {
|
|
16
|
+
// Return the actual implementation instance
|
|
17
|
+
if (globalThis.loaders?.NodeFile) {
|
|
18
|
+
return new globalThis.loaders.NodeFile(url, flags, mode);
|
|
19
|
+
}
|
|
20
|
+
if (isBrowser) {
|
|
21
|
+
throw new Error('Can\'t instantiate NodeFile in browser.');
|
|
22
|
+
}
|
|
23
|
+
throw new Error('Can\'t instantiate NodeFile. Make sure to import @loaders.gl/polyfills first.');
|
|
24
|
+
}
|
|
25
|
+
/** Read data */
|
|
26
|
+
async read(start?: number | bigint, end?: number | bigint): Promise<ArrayBuffer> {
|
|
27
|
+
throw NOT_IMPLEMENTED;
|
|
28
|
+
}
|
|
29
|
+
/** Write to file. The number of bytes written will be returned */
|
|
30
|
+
async write(arrayBuffer: ArrayBuffer, offset?: number | bigint, length?: number | bigint): Promise<number> {
|
|
31
|
+
throw NOT_IMPLEMENTED;
|
|
32
|
+
}
|
|
33
|
+
/** Get information about file */
|
|
34
|
+
async stat(): Promise<Stat> {
|
|
35
|
+
throw NOT_IMPLEMENTED;
|
|
36
|
+
}
|
|
37
|
+
/** Close the file */
|
|
38
|
+
async close(): Promise<void> {}
|
|
39
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/*
|
|
2
|
+
import {fetchFile} from '@loaders.gl/core';
|
|
3
|
+
|
|
4
|
+
import {Source as PMTilesSource, RangeResponse} from 'pmtiles';
|
|
5
|
+
|
|
6
|
+
/** @note "source" here is a PMTiles library type, referring to *
|
|
7
|
+
export function makeSource(data: string | Blob, fetch?) {
|
|
8
|
+
if (typeof data === 'string') {
|
|
9
|
+
return new FetchSource(data, fetch);
|
|
10
|
+
}
|
|
11
|
+
if (data instanceof Blob) {
|
|
12
|
+
const url = '';
|
|
13
|
+
return new BlobSource(data, url);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class BlobSource implements PMTilesSource {
|
|
18
|
+
blob: Blob;
|
|
19
|
+
key: string;
|
|
20
|
+
|
|
21
|
+
constructor(blob: Blob, key: string) {
|
|
22
|
+
this.blob = blob;
|
|
23
|
+
this.key = key;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// TODO - how is this used?
|
|
27
|
+
getKey() {
|
|
28
|
+
return this.blob.url || '';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async getBytes(offset: number, length: number, signal?: AbortSignal): Promise<RangeResponse> {
|
|
32
|
+
const data = await this.blob.arrayBuffer();
|
|
33
|
+
return {
|
|
34
|
+
data
|
|
35
|
+
// etag: response.headers.get('ETag') || undefined,
|
|
36
|
+
// cacheControl: response.headers.get('Cache-Control') || undefined,
|
|
37
|
+
// expires: response.headers.get('Expires') || undefined
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class FetchSource implements PMTilesSource {
|
|
43
|
+
url: string;
|
|
44
|
+
fetch;
|
|
45
|
+
|
|
46
|
+
constructor(url: string, fetch = fetchFile) {
|
|
47
|
+
this.url = url;
|
|
48
|
+
this.fetch = fetch;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// TODO - how is this used?
|
|
52
|
+
getKey() {
|
|
53
|
+
return this.url;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async getBytes(offset: number, length: number, signal?: AbortSignal): Promise<RangeResponse> {
|
|
57
|
+
let controller;
|
|
58
|
+
if (!signal) {
|
|
59
|
+
// ToDO why is it so important to abort in case 200?
|
|
60
|
+
// TODO check this works or assert 206
|
|
61
|
+
controller = new AbortController();
|
|
62
|
+
signal = controller.signal;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
let response = await fetch(this.url, {
|
|
66
|
+
signal,
|
|
67
|
+
headers: {Range: `bytes=${offset}-${offset + length - 1}`}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
switch (response.status) {
|
|
71
|
+
case 206: // Partial Content success
|
|
72
|
+
// This is the expected success code for a range request
|
|
73
|
+
break;
|
|
74
|
+
|
|
75
|
+
case 200:
|
|
76
|
+
// some well-behaved backends, e.g. DigitalOcean CDN, respond with 200 instead of 206
|
|
77
|
+
// but we also need to detect no support for Byte Serving which is returning the whole file
|
|
78
|
+
const content_length = response.headers.get('Content-Length');
|
|
79
|
+
if (!content_length || Number(content_length) > length) {
|
|
80
|
+
if (controller) {
|
|
81
|
+
controller.abort();
|
|
82
|
+
}
|
|
83
|
+
throw Error(
|
|
84
|
+
'content-length header missing or exceeding request. Server must support HTTP Byte Serving.'
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
case 416: // "Range Not Satisfiable"
|
|
89
|
+
// some HTTP servers don't accept ranges beyond the end of the resource.
|
|
90
|
+
// Retry with the exact length
|
|
91
|
+
// TODO: can return 416 with offset > 0 if content changed, which will have a blank etag.
|
|
92
|
+
// See https://github.com/protomaps/PMTiles/issues/90
|
|
93
|
+
if (offset === 0) {
|
|
94
|
+
const content_range = response.headers.get('Content-Range');
|
|
95
|
+
if (!content_range || !content_range.startsWith('bytes *')) {
|
|
96
|
+
throw Error('Missing content-length on 416 response');
|
|
97
|
+
}
|
|
98
|
+
const actual_length = Number(content_range.substr(8));
|
|
99
|
+
response = await fetch(this.url, {
|
|
100
|
+
signal,
|
|
101
|
+
headers: {Range: `bytes=0-${actual_length - 1}`}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
|
|
106
|
+
default:
|
|
107
|
+
if (response.status >= 300) {
|
|
108
|
+
throw Error(`Bad response code: ${response.status}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const data = await response.arrayBuffer();
|
|
113
|
+
return {
|
|
114
|
+
data,
|
|
115
|
+
etag: response.headers.get('ETag') || undefined,
|
|
116
|
+
cacheControl: response.headers.get('Cache-Control') || undefined,
|
|
117
|
+
expires: response.headers.get('Expires') || undefined
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
class TestNodeFileSource implements Source {
|
|
124
|
+
buffer: ArrayBuffer;
|
|
125
|
+
path: string;
|
|
126
|
+
key: string;
|
|
127
|
+
etag?: string;
|
|
128
|
+
|
|
129
|
+
constructor(path: string, key: string) {
|
|
130
|
+
this.path = path;
|
|
131
|
+
this.buffer = fs.readFileSync(path);
|
|
132
|
+
this.key = key;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
getKey() {
|
|
136
|
+
return this.key;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
replaceData(path: string) {
|
|
140
|
+
this.path = path;
|
|
141
|
+
this.buffer = fs.readFileSync(path);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async getBytes(offset: number, length: number): Promise<RangeResponse> {
|
|
145
|
+
const slice = new Uint8Array(this.buffer.slice(offset, offset + length))
|
|
146
|
+
.buffer;
|
|
147
|
+
return { data: slice, etag: this.etag };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
*/
|
|
@@ -1,87 +1,38 @@
|
|
|
1
1
|
// loaders.gl, MIT license
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export type Stat = {
|
|
6
|
-
size: number;
|
|
7
|
-
isDirectory: () => boolean;
|
|
8
|
-
};
|
|
3
|
+
import {ReadableFile, WritableFile} from '../files/file';
|
|
9
4
|
|
|
10
5
|
/**
|
|
11
6
|
* A FileSystem interface can encapsulate various file sources,
|
|
12
|
-
* a FileList, a ZipFile, a GoogleDrive etc.
|
|
7
|
+
* a FileList, a Node.js filesystem, a ZipFile, a GoogleDrive etc.
|
|
13
8
|
*/
|
|
14
9
|
export interface FileSystem {
|
|
15
|
-
/**
|
|
16
|
-
* Return a list of file names
|
|
17
|
-
* @param dirname directory name. file system root directory if omitted
|
|
18
|
-
*/
|
|
10
|
+
/** Return a list of file names in a "directory" */
|
|
19
11
|
readdir(dirname?: string, options?: {recursive?: boolean}): Promise<string[]>;
|
|
20
12
|
|
|
21
|
-
/**
|
|
22
|
-
* Gets information from a local file from the filesystem
|
|
23
|
-
* @param filename file name to stat
|
|
24
|
-
* @param options currently unused
|
|
25
|
-
* @throws if filename is not in local filesystem
|
|
26
|
-
*/
|
|
13
|
+
/** Gets information from a local file from the filesystem */
|
|
27
14
|
stat(filename: string, options?: object): Promise<{size: number}>;
|
|
28
15
|
|
|
29
|
-
/**
|
|
30
|
-
|
|
31
|
-
* @param filename
|
|
32
|
-
* @param options
|
|
33
|
-
*/
|
|
34
|
-
fetch(filename: RequestInfo, options?: RequestInit): Promise<Response>;
|
|
35
|
-
}
|
|
16
|
+
/** Removes a file from the file system */
|
|
17
|
+
unlink?(path: string): Promise<void>;
|
|
36
18
|
|
|
37
|
-
/**
|
|
38
|
-
|
|
39
|
-
*/
|
|
40
|
-
export interface RandomAccessReadFileSystem extends FileSystem {
|
|
41
|
-
open(path: string, flags: unknown, mode?: unknown): Promise<any>;
|
|
42
|
-
close(fd: unknown): Promise<void>;
|
|
43
|
-
fstat(fd: unknown): Promise<Stat>;
|
|
44
|
-
read(fd: any, options?: ReadOptions): Promise<{bytesRead: number; buffer: Uint8Array}>;
|
|
45
|
-
// read(
|
|
46
|
-
// fd: any,
|
|
47
|
-
// buffer: ArrayBuffer | ArrayBufferView,
|
|
48
|
-
// offset?: number,
|
|
49
|
-
// length?: number,
|
|
50
|
-
// position?: number
|
|
51
|
-
// ): Promise<{bytesRead: number; buffer: ArrayBuffer}>;
|
|
19
|
+
/** Fetches the full contents of a file from the filesystem (or a URL) */
|
|
20
|
+
fetch(path: string, options?: RequestInit): Promise<Response>;
|
|
52
21
|
}
|
|
53
22
|
|
|
54
23
|
/**
|
|
55
|
-
* A
|
|
56
|
-
|
|
57
|
-
export interface
|
|
58
|
-
/**
|
|
59
|
-
|
|
60
|
-
* @param dirname directory name. file system root directory if omitted
|
|
61
|
-
*
|
|
62
|
-
readdir(dirname?: string, options?: {recursive?: boolean}): Promise<string[]>;
|
|
24
|
+
* A random access file system, open readable and/or writable files
|
|
25
|
+
*/
|
|
26
|
+
export interface RandomAccessFileSystem extends FileSystem {
|
|
27
|
+
/** Can open readable files */
|
|
28
|
+
readonly readable: boolean;
|
|
63
29
|
|
|
64
|
-
/**
|
|
65
|
-
|
|
66
|
-
* @param filename file name to stat
|
|
67
|
-
* @param options currently unused
|
|
68
|
-
* @throws if filename is not in local filesystem
|
|
69
|
-
*
|
|
70
|
-
stat(filename: string, options?: object): Promise<{size: number}>;
|
|
30
|
+
/** Can open writable files */
|
|
31
|
+
readonly writable: boolean;
|
|
71
32
|
|
|
72
|
-
/**
|
|
73
|
-
|
|
74
|
-
* @param filename
|
|
75
|
-
* @param options
|
|
76
|
-
*
|
|
77
|
-
fetch(filename: string, options?: object): Promise<Response>;
|
|
78
|
-
}
|
|
33
|
+
/** Open a readable file */
|
|
34
|
+
openReadableFile(path: string, flags?: 'r'): Promise<ReadableFile>;
|
|
79
35
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
open(path: string, flags: string | number, mode?: any): Promise<any>;
|
|
83
|
-
close(fd: any): Promise<void>;
|
|
84
|
-
fstat(fd: any): Promise<object>;
|
|
85
|
-
read(fd: any, options?: ReadOptions): Promise<{bytesRead: number; buffer: Buffer}>;
|
|
36
|
+
/** Open a writable file */
|
|
37
|
+
openWritableFile(path: string, flags?: 'w' | 'wx', mode?: number): Promise<WritableFile>;
|
|
86
38
|
}
|
|
87
|
-
*/
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
3
|
+
import {isBrowser} from '../env-utils/globals';
|
|
4
|
+
import {Stat} from '../files/file';
|
|
5
|
+
import {NodeFileFacade as NodeFile} from '../files/node-file-facade';
|
|
6
|
+
import {RandomAccessFileSystem} from './filesystem';
|
|
7
|
+
|
|
8
|
+
const NOT_IMPLEMENTED = new Error('Not implemented');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* FileSystem pass-through for Node.js
|
|
12
|
+
* Compatible with BrowserFileSystem.
|
|
13
|
+
* @note Dummy implementation, not used (constructor returns a real NodeFileSystem instance)
|
|
14
|
+
* @param options
|
|
15
|
+
*/
|
|
16
|
+
export class NodeFileSystemFacade implements RandomAccessFileSystem {
|
|
17
|
+
// implements FileSystem
|
|
18
|
+
constructor(options: {[key: string]: any}) {
|
|
19
|
+
if (globalThis.loaders?.NodeFileSystem) {
|
|
20
|
+
return new globalThis.loaders.NodeFileSystem(options);
|
|
21
|
+
}
|
|
22
|
+
if (isBrowser) {
|
|
23
|
+
throw new Error('Can\'t instantiate NodeFileSystem in browser.');
|
|
24
|
+
}
|
|
25
|
+
throw new Error(
|
|
26
|
+
'Can\'t instantiate NodeFileSystem. Make sure to import @loaders.gl/polyfills first.'
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// DUMMY IMPLEMENTATION, not used (constructor returns a real NodeFileSystem instance)
|
|
31
|
+
|
|
32
|
+
// implements RandomAccessReadFileSystem
|
|
33
|
+
|
|
34
|
+
readonly readable = true;
|
|
35
|
+
readonly writable = true;
|
|
36
|
+
|
|
37
|
+
async openReadableFile(path: string, flags): Promise<NodeFile> {
|
|
38
|
+
throw NOT_IMPLEMENTED;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// implements RandomAccessWriteFileSystem
|
|
42
|
+
async openWritableFile(path: string, flags, mode): Promise<NodeFile> {
|
|
43
|
+
throw NOT_IMPLEMENTED;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Implements file system
|
|
47
|
+
|
|
48
|
+
async readdir(dirname = '.', options?: {}): Promise<string[]> {
|
|
49
|
+
throw NOT_IMPLEMENTED;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async stat(path: string, options?: {}): Promise<Stat> {
|
|
53
|
+
throw NOT_IMPLEMENTED;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async unlink(path: string): Promise<void> {
|
|
57
|
+
throw NOT_IMPLEMENTED;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async fetch(path: RequestInfo, options?: RequestInit): Promise<Response> {
|
|
61
|
+
throw NOT_IMPLEMENTED;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -15,6 +15,6 @@ export function toArrayBuffer(buffer) {
|
|
|
15
15
|
/**
|
|
16
16
|
* Convert (copy) ArrayBuffer to Buffer
|
|
17
17
|
*/
|
|
18
|
-
export function toBuffer(binaryData: ArrayBuffer |
|
|
18
|
+
export function toBuffer(binaryData: ArrayBuffer | Buffer): Buffer {
|
|
19
19
|
throw new Error('Buffer not supported in browser');
|
|
20
20
|
}
|
package/src/lib/node/buffer.ts
CHANGED
|
@@ -20,7 +20,7 @@ export function toArrayBuffer(buffer) {
|
|
|
20
20
|
/**
|
|
21
21
|
* Convert (copy) ArrayBuffer to Buffer
|
|
22
22
|
*/
|
|
23
|
-
export function toBuffer(binaryData: ArrayBuffer |
|
|
23
|
+
export function toBuffer(binaryData: ArrayBuffer | Buffer): Buffer {
|
|
24
24
|
if (Buffer.isBuffer(binaryData)) {
|
|
25
25
|
return binaryData;
|
|
26
26
|
}
|
package/src/types.ts
CHANGED
|
@@ -7,8 +7,6 @@ export type TypedIntArray =
|
|
|
7
7
|
| Int16Array
|
|
8
8
|
| Uint16Array
|
|
9
9
|
| Int32Array
|
|
10
|
-
| Uint32Array
|
|
11
|
-
| Int32Array
|
|
12
10
|
| Uint32Array;
|
|
13
11
|
|
|
14
12
|
export type TypedFloatArray = Uint16Array | Float32Array | Float64Array;
|
|
@@ -24,8 +22,6 @@ export type TypedArrayConstructor =
|
|
|
24
22
|
| Uint16ArrayConstructor
|
|
25
23
|
| Int32ArrayConstructor
|
|
26
24
|
| Uint32ArrayConstructor
|
|
27
|
-
| Int32ArrayConstructor
|
|
28
|
-
| Uint32ArrayConstructor
|
|
29
25
|
| Float32ArrayConstructor
|
|
30
26
|
| Float64ArrayConstructor;
|
|
31
27
|
|