generic-filehandle2 2.0.18 → 2.1.4
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/blobFile.d.ts +1 -1
- package/dist/blobFile.js +5 -7
- package/dist/blobFile.js.map +1 -1
- package/dist/filehandle.d.ts +3 -11
- package/dist/index.d.ts +0 -1
- package/dist/localFile.d.ts +3 -3
- package/dist/localFile.js +1 -1
- package/dist/localFile.js.map +1 -1
- package/dist/remoteFile.d.ts +2 -1
- package/dist/remoteFile.js +20 -37
- package/dist/remoteFile.js.map +1 -1
- package/esm/blobFile.d.ts +1 -1
- package/esm/blobFile.js +5 -7
- package/esm/blobFile.js.map +1 -1
- package/esm/filehandle.d.ts +3 -11
- package/esm/index.d.ts +0 -1
- package/esm/localFile.d.ts +3 -3
- package/esm/localFile.js +1 -1
- package/esm/localFile.js.map +1 -1
- package/esm/remoteFile.d.ts +2 -1
- package/esm/remoteFile.js +20 -37
- package/esm/remoteFile.js.map +1 -1
- package/package.json +18 -14
- package/src/blobFile.ts +6 -8
- package/src/filehandle.ts +17 -11
- package/src/index.ts +0 -2
- package/src/localFile.ts +8 -3
- package/src/remoteFile.ts +27 -36
package/dist/blobFile.d.ts
CHANGED
package/dist/blobFile.js
CHANGED
|
@@ -16,9 +16,7 @@ class BlobFile {
|
|
|
16
16
|
if (!length) {
|
|
17
17
|
return new Uint8Array(0);
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
const end = start + length;
|
|
21
|
-
const slice = this.blob.slice(start, end);
|
|
19
|
+
const slice = this.blob.slice(position, position + length);
|
|
22
20
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
23
21
|
return slice.bytes
|
|
24
22
|
? slice.bytes()
|
|
@@ -39,11 +37,11 @@ class BlobFile {
|
|
|
39
37
|
: new Uint8Array(await this.blob.arrayBuffer());
|
|
40
38
|
}
|
|
41
39
|
}
|
|
42
|
-
|
|
43
|
-
return { size: this.blob.size };
|
|
40
|
+
stat() {
|
|
41
|
+
return Promise.resolve({ size: this.blob.size });
|
|
44
42
|
}
|
|
45
|
-
|
|
46
|
-
return;
|
|
43
|
+
close() {
|
|
44
|
+
return Promise.resolve();
|
|
47
45
|
}
|
|
48
46
|
}
|
|
49
47
|
exports.default = BlobFile;
|
package/dist/blobFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobFile.js","sourceRoot":"","sources":["../src/blobFile.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"blobFile.js","sourceRoot":"","sources":["../src/blobFile.ts"],"names":[],"mappings":";;AAOA;;;;;GAKG;AACH,MAAqB,QAAQ;IAG3B,YAAmB,IAAU;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEM,KAAK,CAAC,IAAI,CACf,MAAc,EACd,QAAQ,GAAG,CAAC;QAEZ,4EAA4E;QAC5E,sDAAsD;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAA;QAC1D,uEAAuE;QACvE,OAAO,KAAK,CAAC,KAAK;YAChB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;YACf,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;IAC/C,CAAC;IAYM,KAAK,CAAC,QAAQ,CACnB,OAA4C;QAE5C,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAA;QAC1E,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAA;QACtD,CAAC;aAAM,CAAC;YACN,uEAAuE;YACvE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;gBACpB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBACnB,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAEM,IAAI;QACT,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC;IAEM,KAAK;QACV,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;CACF;AAzDD,2BAyDC"}
|
package/dist/filehandle.d.ts
CHANGED
|
@@ -1,22 +1,14 @@
|
|
|
1
|
+
export type BufferEncoding = 'ascii' | 'utf8' | 'utf-8' | 'utf16le' | 'utf-16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex';
|
|
1
2
|
export type Fetcher = (input: RequestInfo, init?: RequestInit) => Promise<Response>;
|
|
2
3
|
export interface FilehandleOptions {
|
|
3
|
-
/**
|
|
4
|
-
* optional AbortSignal object for aborting the request
|
|
5
|
-
*/
|
|
6
4
|
signal?: AbortSignal;
|
|
7
|
-
headers?:
|
|
8
|
-
overrides?:
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
overrides?: Omit<RequestInit, 'headers'>;
|
|
9
7
|
encoding?: BufferEncoding;
|
|
10
|
-
/**
|
|
11
|
-
* fetch function to use for HTTP requests. defaults to environment's
|
|
12
|
-
* global fetch. if there is no global fetch, and a fetch function is not provided,
|
|
13
|
-
* throws an error.
|
|
14
|
-
*/
|
|
15
8
|
fetch?: Fetcher;
|
|
16
9
|
}
|
|
17
10
|
export interface Stats {
|
|
18
11
|
size: number;
|
|
19
|
-
[key: string]: any;
|
|
20
12
|
}
|
|
21
13
|
export interface GenericFilehandle {
|
|
22
14
|
read(length: number, position: number, opts?: FilehandleOptions): Promise<Uint8Array<ArrayBuffer>>;
|
package/dist/index.d.ts
CHANGED
package/dist/localFile.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { FilehandleOptions, GenericFilehandle } from './filehandle.ts';
|
|
1
|
+
import type { BufferEncoding, FilehandleOptions, GenericFilehandle, Stats } from './filehandle.ts';
|
|
2
2
|
export default class LocalFile implements GenericFilehandle {
|
|
3
3
|
private filename;
|
|
4
|
-
constructor(source: string
|
|
4
|
+
constructor(source: string);
|
|
5
5
|
read(length: number, position?: number): Promise<Uint8Array<ArrayBuffer>>;
|
|
6
6
|
readFile(): Promise<Uint8Array<ArrayBuffer>>;
|
|
7
7
|
readFile(options: BufferEncoding): Promise<string>;
|
|
@@ -14,6 +14,6 @@ export default class LocalFile implements GenericFilehandle {
|
|
|
14
14
|
readFile<T extends BufferEncoding>(options: Omit<FilehandleOptions, 'encoding'> & {
|
|
15
15
|
encoding: T;
|
|
16
16
|
}): T extends BufferEncoding ? Promise<string> : Promise<Uint8Array<ArrayBuffer>>;
|
|
17
|
-
stat(): Promise<
|
|
17
|
+
stat(): Promise<Stats>;
|
|
18
18
|
close(): Promise<void>;
|
|
19
19
|
}
|
package/dist/localFile.js
CHANGED
package/dist/localFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localFile.js","sourceRoot":"","sources":["../src/localFile.ts"],"names":[],"mappings":";;AAAA,0CAAkD;
|
|
1
|
+
{"version":3,"file":"localFile.js","sourceRoot":"","sources":["../src/localFile.ts"],"names":[],"mappings":";;AAAA,0CAAkD;AASlD,MAAqB,SAAS;IAG5B,YAAmB,MAAc;QAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAA;IACxB,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,QAAQ,GAAG,CAAC;QAC5C,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,EAAE,CAAA;QACN,IAAI,CAAC;YACH,EAAE,GAAG,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACnC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YACnD,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9C,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACP,sEAAsE;oBACtE,oDAAoD;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAiBM,KAAK,CAAC,QAAQ,CACnB,OAA4C;QAE5C,OAAO,IAAA,mBAAQ,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,OAAO,IAAA,eAAI,EAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5B,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,gBAAgB;IAClB,CAAC;CACF;AAzDD,4BAyDC"}
|
package/dist/remoteFile.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { FilehandleOptions, GenericFilehandle, Stats } from './filehandle.ts';
|
|
1
|
+
import type { BufferEncoding, FilehandleOptions, GenericFilehandle, Stats } from './filehandle.ts';
|
|
2
2
|
export default class RemoteFile implements GenericFilehandle {
|
|
3
3
|
protected url: string;
|
|
4
4
|
private _stat?;
|
|
5
5
|
private fetchImplementation;
|
|
6
|
+
private baseHeaders;
|
|
6
7
|
private baseOverrides;
|
|
7
8
|
constructor(source: string, opts?: FilehandleOptions);
|
|
8
9
|
fetch(input: RequestInfo, init: RequestInit | undefined): Promise<Response>;
|
package/dist/remoteFile.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
function getMessage(e) {
|
|
4
|
-
const r = typeof e === 'object' &&
|
|
4
|
+
const r = typeof e === 'object' &&
|
|
5
|
+
e !== null &&
|
|
6
|
+
'message' in e &&
|
|
7
|
+
typeof e.message === 'string'
|
|
5
8
|
? e.message
|
|
6
9
|
: `${e}`;
|
|
7
10
|
return r.replace(/\.$/, '');
|
|
8
11
|
}
|
|
9
12
|
class RemoteFile {
|
|
10
13
|
constructor(source, opts = {}) {
|
|
11
|
-
this.baseOverrides = {};
|
|
12
14
|
this.url = source;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
this.baseHeaders = opts.headers ?? {};
|
|
16
|
+
this.baseOverrides = opts.overrides ?? {};
|
|
17
|
+
this.fetchImplementation =
|
|
18
|
+
opts.fetch ??
|
|
19
|
+
((input, init) => globalThis.fetch(input, init));
|
|
18
20
|
}
|
|
19
21
|
async fetch(input, init) {
|
|
20
22
|
const wrapError = (e) => new Error(`${getMessage(e)} fetching ${input}`, { cause: e });
|
|
@@ -49,21 +51,15 @@ class RemoteFile {
|
|
|
49
51
|
if (length === 0) {
|
|
50
52
|
return new Uint8Array(0);
|
|
51
53
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
headers.range = `bytes=${position}-${position + length - 1}`;
|
|
55
|
-
}
|
|
56
|
-
else if (length === Infinity && position !== 0) {
|
|
57
|
-
headers.range = `bytes=${position}-`;
|
|
54
|
+
if (Number.isNaN(length) || Number.isNaN(position)) {
|
|
55
|
+
throw new TypeError(`read() called with NaN length or position (length=${length}, position=${position}). The index file may be corrupt.`);
|
|
58
56
|
}
|
|
57
|
+
const { headers = {}, signal, overrides = {} } = opts;
|
|
58
|
+
headers.range = `bytes=${position}-${position + length - 1}`;
|
|
59
59
|
const res = await this.fetch(this.url, {
|
|
60
60
|
...this.baseOverrides,
|
|
61
61
|
...overrides,
|
|
62
|
-
headers: {
|
|
63
|
-
...this.baseOverrides.headers,
|
|
64
|
-
...overrides.headers,
|
|
65
|
-
...headers,
|
|
66
|
-
},
|
|
62
|
+
headers: { ...this.baseHeaders, ...headers },
|
|
67
63
|
method: 'GET',
|
|
68
64
|
redirect: 'follow',
|
|
69
65
|
mode: 'cors',
|
|
@@ -75,7 +71,7 @@ class RemoteFile {
|
|
|
75
71
|
if ((res.status === 200 && position === 0) || res.status === 206) {
|
|
76
72
|
// try to parse out the size of the remote file
|
|
77
73
|
const contentRange = res.headers.get('content-range');
|
|
78
|
-
const sizeMatch = /\/(\d+)$/.exec(contentRange
|
|
74
|
+
const sizeMatch = /\/(\d+)$/.exec(contentRange ?? '');
|
|
79
75
|
if (sizeMatch?.[1]) {
|
|
80
76
|
this._stat = {
|
|
81
77
|
size: parseInt(sizeMatch[1], 10),
|
|
@@ -94,26 +90,13 @@ class RemoteFile {
|
|
|
94
90
|
: `HTTP ${res.status} fetching ${this.url}`);
|
|
95
91
|
}
|
|
96
92
|
async readFile(options = {}) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (typeof options === 'string') {
|
|
100
|
-
encoding = options;
|
|
101
|
-
opts = {};
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
encoding = options.encoding;
|
|
105
|
-
const { encoding: _, ...rest } = options;
|
|
106
|
-
opts = rest;
|
|
107
|
-
}
|
|
93
|
+
const encoding = typeof options === 'string' ? options : options.encoding;
|
|
94
|
+
const opts = typeof options === 'string' ? {} : options;
|
|
108
95
|
const { headers = {}, signal, overrides = {} } = opts;
|
|
109
96
|
const res = await this.fetch(this.url, {
|
|
110
97
|
...this.baseOverrides,
|
|
111
98
|
...overrides,
|
|
112
|
-
headers: {
|
|
113
|
-
...this.baseOverrides.headers,
|
|
114
|
-
...overrides.headers,
|
|
115
|
-
...headers,
|
|
116
|
-
},
|
|
99
|
+
headers: { ...this.baseHeaders, ...headers },
|
|
117
100
|
method: 'GET',
|
|
118
101
|
redirect: 'follow',
|
|
119
102
|
mode: 'cors',
|
|
@@ -143,8 +126,8 @@ class RemoteFile {
|
|
|
143
126
|
}
|
|
144
127
|
return this._stat;
|
|
145
128
|
}
|
|
146
|
-
|
|
147
|
-
return;
|
|
129
|
+
close() {
|
|
130
|
+
return Promise.resolve();
|
|
148
131
|
}
|
|
149
132
|
}
|
|
150
133
|
exports.default = RemoteFile;
|
package/dist/remoteFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remoteFile.js","sourceRoot":"","sources":["../src/remoteFile.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"remoteFile.js","sourceRoot":"","sources":["../src/remoteFile.ts"],"names":[],"mappings":"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"}
|
package/esm/blobFile.d.ts
CHANGED
package/esm/blobFile.js
CHANGED
|
@@ -14,9 +14,7 @@ export default class BlobFile {
|
|
|
14
14
|
if (!length) {
|
|
15
15
|
return new Uint8Array(0);
|
|
16
16
|
}
|
|
17
|
-
const
|
|
18
|
-
const end = start + length;
|
|
19
|
-
const slice = this.blob.slice(start, end);
|
|
17
|
+
const slice = this.blob.slice(position, position + length);
|
|
20
18
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
21
19
|
return slice.bytes
|
|
22
20
|
? slice.bytes()
|
|
@@ -37,11 +35,11 @@ export default class BlobFile {
|
|
|
37
35
|
: new Uint8Array(await this.blob.arrayBuffer());
|
|
38
36
|
}
|
|
39
37
|
}
|
|
40
|
-
|
|
41
|
-
return { size: this.blob.size };
|
|
38
|
+
stat() {
|
|
39
|
+
return Promise.resolve({ size: this.blob.size });
|
|
42
40
|
}
|
|
43
|
-
|
|
44
|
-
return;
|
|
41
|
+
close() {
|
|
42
|
+
return Promise.resolve();
|
|
45
43
|
}
|
|
46
44
|
}
|
|
47
45
|
//# sourceMappingURL=blobFile.js.map
|
package/esm/blobFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobFile.js","sourceRoot":"","sources":["../src/blobFile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"blobFile.js","sourceRoot":"","sources":["../src/blobFile.ts"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,QAAQ;IAG3B,YAAmB,IAAU;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEM,KAAK,CAAC,IAAI,CACf,MAAc,EACd,QAAQ,GAAG,CAAC;QAEZ,4EAA4E;QAC5E,sDAAsD;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAA;QAC1D,uEAAuE;QACvE,OAAO,KAAK,CAAC,KAAK;YAChB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE;YACf,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;IAC/C,CAAC;IAYM,KAAK,CAAC,QAAQ,CACnB,OAA4C;QAE5C,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAA;QAC1E,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACzB,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAA;QACtD,CAAC;aAAM,CAAC;YACN,uEAAuE;YACvE,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;gBACpB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBACnB,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;IAEM,IAAI;QACT,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IAClD,CAAC;IAEM,KAAK;QACV,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;CACF"}
|
package/esm/filehandle.d.ts
CHANGED
|
@@ -1,22 +1,14 @@
|
|
|
1
|
+
export type BufferEncoding = 'ascii' | 'utf8' | 'utf-8' | 'utf16le' | 'utf-16le' | 'ucs2' | 'ucs-2' | 'base64' | 'base64url' | 'latin1' | 'binary' | 'hex';
|
|
1
2
|
export type Fetcher = (input: RequestInfo, init?: RequestInit) => Promise<Response>;
|
|
2
3
|
export interface FilehandleOptions {
|
|
3
|
-
/**
|
|
4
|
-
* optional AbortSignal object for aborting the request
|
|
5
|
-
*/
|
|
6
4
|
signal?: AbortSignal;
|
|
7
|
-
headers?:
|
|
8
|
-
overrides?:
|
|
5
|
+
headers?: Record<string, string>;
|
|
6
|
+
overrides?: Omit<RequestInit, 'headers'>;
|
|
9
7
|
encoding?: BufferEncoding;
|
|
10
|
-
/**
|
|
11
|
-
* fetch function to use for HTTP requests. defaults to environment's
|
|
12
|
-
* global fetch. if there is no global fetch, and a fetch function is not provided,
|
|
13
|
-
* throws an error.
|
|
14
|
-
*/
|
|
15
8
|
fetch?: Fetcher;
|
|
16
9
|
}
|
|
17
10
|
export interface Stats {
|
|
18
11
|
size: number;
|
|
19
|
-
[key: string]: any;
|
|
20
12
|
}
|
|
21
13
|
export interface GenericFilehandle {
|
|
22
14
|
read(length: number, position: number, opts?: FilehandleOptions): Promise<Uint8Array<ArrayBuffer>>;
|
package/esm/index.d.ts
CHANGED
package/esm/localFile.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { FilehandleOptions, GenericFilehandle } from './filehandle.ts';
|
|
1
|
+
import type { BufferEncoding, FilehandleOptions, GenericFilehandle, Stats } from './filehandle.ts';
|
|
2
2
|
export default class LocalFile implements GenericFilehandle {
|
|
3
3
|
private filename;
|
|
4
|
-
constructor(source: string
|
|
4
|
+
constructor(source: string);
|
|
5
5
|
read(length: number, position?: number): Promise<Uint8Array<ArrayBuffer>>;
|
|
6
6
|
readFile(): Promise<Uint8Array<ArrayBuffer>>;
|
|
7
7
|
readFile(options: BufferEncoding): Promise<string>;
|
|
@@ -14,6 +14,6 @@ export default class LocalFile implements GenericFilehandle {
|
|
|
14
14
|
readFile<T extends BufferEncoding>(options: Omit<FilehandleOptions, 'encoding'> & {
|
|
15
15
|
encoding: T;
|
|
16
16
|
}): T extends BufferEncoding ? Promise<string> : Promise<Uint8Array<ArrayBuffer>>;
|
|
17
|
-
stat(): Promise<
|
|
17
|
+
stat(): Promise<Stats>;
|
|
18
18
|
close(): Promise<void>;
|
|
19
19
|
}
|
package/esm/localFile.js
CHANGED
package/esm/localFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localFile.js","sourceRoot":"","sources":["../src/localFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"localFile.js","sourceRoot":"","sources":["../src/localFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AASlD,MAAM,CAAC,OAAO,OAAO,SAAS;IAG5B,YAAmB,MAAc;QAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAA;IACxB,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,QAAQ,GAAG,CAAC;QAC5C,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;QAClC,IAAI,EAAE,CAAA;QACN,IAAI,CAAC;YACH,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACnC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YACnD,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;QAC9C,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA;gBAClB,CAAC;gBAAC,MAAM,CAAC;oBACP,sEAAsE;oBACtE,oDAAoD;gBACtD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAiBM,KAAK,CAAC,QAAQ,CACnB,OAA4C;QAE5C,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5B,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,gBAAgB;IAClB,CAAC;CACF"}
|
package/esm/remoteFile.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { FilehandleOptions, GenericFilehandle, Stats } from './filehandle.ts';
|
|
1
|
+
import type { BufferEncoding, FilehandleOptions, GenericFilehandle, Stats } from './filehandle.ts';
|
|
2
2
|
export default class RemoteFile implements GenericFilehandle {
|
|
3
3
|
protected url: string;
|
|
4
4
|
private _stat?;
|
|
5
5
|
private fetchImplementation;
|
|
6
|
+
private baseHeaders;
|
|
6
7
|
private baseOverrides;
|
|
7
8
|
constructor(source: string, opts?: FilehandleOptions);
|
|
8
9
|
fetch(input: RequestInfo, init: RequestInit | undefined): Promise<Response>;
|
package/esm/remoteFile.js
CHANGED
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
function getMessage(e) {
|
|
2
|
-
const r = typeof e === 'object' &&
|
|
2
|
+
const r = typeof e === 'object' &&
|
|
3
|
+
e !== null &&
|
|
4
|
+
'message' in e &&
|
|
5
|
+
typeof e.message === 'string'
|
|
3
6
|
? e.message
|
|
4
7
|
: `${e}`;
|
|
5
8
|
return r.replace(/\.$/, '');
|
|
6
9
|
}
|
|
7
10
|
export default class RemoteFile {
|
|
8
11
|
constructor(source, opts = {}) {
|
|
9
|
-
this.baseOverrides = {};
|
|
10
12
|
this.url = source;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
this.baseHeaders = opts.headers ?? {};
|
|
14
|
+
this.baseOverrides = opts.overrides ?? {};
|
|
15
|
+
this.fetchImplementation =
|
|
16
|
+
opts.fetch ??
|
|
17
|
+
((input, init) => globalThis.fetch(input, init));
|
|
16
18
|
}
|
|
17
19
|
async fetch(input, init) {
|
|
18
20
|
const wrapError = (e) => new Error(`${getMessage(e)} fetching ${input}`, { cause: e });
|
|
@@ -47,21 +49,15 @@ export default class RemoteFile {
|
|
|
47
49
|
if (length === 0) {
|
|
48
50
|
return new Uint8Array(0);
|
|
49
51
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
headers.range = `bytes=${position}-${position + length - 1}`;
|
|
53
|
-
}
|
|
54
|
-
else if (length === Infinity && position !== 0) {
|
|
55
|
-
headers.range = `bytes=${position}-`;
|
|
52
|
+
if (Number.isNaN(length) || Number.isNaN(position)) {
|
|
53
|
+
throw new TypeError(`read() called with NaN length or position (length=${length}, position=${position}). The index file may be corrupt.`);
|
|
56
54
|
}
|
|
55
|
+
const { headers = {}, signal, overrides = {} } = opts;
|
|
56
|
+
headers.range = `bytes=${position}-${position + length - 1}`;
|
|
57
57
|
const res = await this.fetch(this.url, {
|
|
58
58
|
...this.baseOverrides,
|
|
59
59
|
...overrides,
|
|
60
|
-
headers: {
|
|
61
|
-
...this.baseOverrides.headers,
|
|
62
|
-
...overrides.headers,
|
|
63
|
-
...headers,
|
|
64
|
-
},
|
|
60
|
+
headers: { ...this.baseHeaders, ...headers },
|
|
65
61
|
method: 'GET',
|
|
66
62
|
redirect: 'follow',
|
|
67
63
|
mode: 'cors',
|
|
@@ -73,7 +69,7 @@ export default class RemoteFile {
|
|
|
73
69
|
if ((res.status === 200 && position === 0) || res.status === 206) {
|
|
74
70
|
// try to parse out the size of the remote file
|
|
75
71
|
const contentRange = res.headers.get('content-range');
|
|
76
|
-
const sizeMatch = /\/(\d+)$/.exec(contentRange
|
|
72
|
+
const sizeMatch = /\/(\d+)$/.exec(contentRange ?? '');
|
|
77
73
|
if (sizeMatch?.[1]) {
|
|
78
74
|
this._stat = {
|
|
79
75
|
size: parseInt(sizeMatch[1], 10),
|
|
@@ -92,26 +88,13 @@ export default class RemoteFile {
|
|
|
92
88
|
: `HTTP ${res.status} fetching ${this.url}`);
|
|
93
89
|
}
|
|
94
90
|
async readFile(options = {}) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (typeof options === 'string') {
|
|
98
|
-
encoding = options;
|
|
99
|
-
opts = {};
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
encoding = options.encoding;
|
|
103
|
-
const { encoding: _, ...rest } = options;
|
|
104
|
-
opts = rest;
|
|
105
|
-
}
|
|
91
|
+
const encoding = typeof options === 'string' ? options : options.encoding;
|
|
92
|
+
const opts = typeof options === 'string' ? {} : options;
|
|
106
93
|
const { headers = {}, signal, overrides = {} } = opts;
|
|
107
94
|
const res = await this.fetch(this.url, {
|
|
108
95
|
...this.baseOverrides,
|
|
109
96
|
...overrides,
|
|
110
|
-
headers: {
|
|
111
|
-
...this.baseOverrides.headers,
|
|
112
|
-
...overrides.headers,
|
|
113
|
-
...headers,
|
|
114
|
-
},
|
|
97
|
+
headers: { ...this.baseHeaders, ...headers },
|
|
115
98
|
method: 'GET',
|
|
116
99
|
redirect: 'follow',
|
|
117
100
|
mode: 'cors',
|
|
@@ -141,8 +124,8 @@ export default class RemoteFile {
|
|
|
141
124
|
}
|
|
142
125
|
return this._stat;
|
|
143
126
|
}
|
|
144
|
-
|
|
145
|
-
return;
|
|
127
|
+
close() {
|
|
128
|
+
return Promise.resolve();
|
|
146
129
|
}
|
|
147
130
|
}
|
|
148
131
|
//# sourceMappingURL=remoteFile.js.map
|
package/esm/remoteFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remoteFile.js","sourceRoot":"","sources":["../src/remoteFile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"remoteFile.js","sourceRoot":"","sources":["../src/remoteFile.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "generic-filehandle2",
|
|
3
3
|
"description": "uniform interface for accessing binary data from local files, remote HTTP resources, and browser Blob data",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.1.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
@@ -14,7 +14,10 @@
|
|
|
14
14
|
"require": "./dist/index.js"
|
|
15
15
|
}
|
|
16
16
|
},
|
|
17
|
-
"repository":
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "https://github.com/GMOD/generic-filehandle2.git"
|
|
20
|
+
},
|
|
18
21
|
"license": "MIT",
|
|
19
22
|
"author": {
|
|
20
23
|
"name": "Colin Diesh",
|
|
@@ -32,12 +35,12 @@
|
|
|
32
35
|
"scripts": {
|
|
33
36
|
"test": "vitest",
|
|
34
37
|
"coverage": "yarn test --coverage",
|
|
35
|
-
"lint": "eslint --report-unused-disable-directives --max-warnings 0
|
|
38
|
+
"lint": "eslint --report-unused-disable-directives --max-warnings 0",
|
|
36
39
|
"clean": "rimraf dist esm",
|
|
37
40
|
"format": "prettier --write .",
|
|
38
41
|
"prebuild": "yarn clean",
|
|
39
42
|
"build:esm": "tsc --outDir esm",
|
|
40
|
-
"build:es5": "tsc --module commonjs --outDir dist",
|
|
43
|
+
"build:es5": "tsc --module commonjs --moduleResolution bundler --outDir dist",
|
|
41
44
|
"build": "yarn build:esm && yarn build:es5",
|
|
42
45
|
"postbuild:es5": "echo '{\"type\": \"commonjs\"}' > dist/package.json",
|
|
43
46
|
"preversion": "yarn lint && yarn test --run && yarn build",
|
|
@@ -50,19 +53,20 @@
|
|
|
50
53
|
"genomics"
|
|
51
54
|
],
|
|
52
55
|
"devDependencies": {
|
|
53
|
-
"@
|
|
56
|
+
"@eslint/js": "^10.0.1",
|
|
57
|
+
"@types/node": "^25.5.0",
|
|
54
58
|
"@types/range-parser": "^1.2.7",
|
|
55
|
-
"@vitest/coverage-v8": "^4.
|
|
56
|
-
"eslint": "^9.
|
|
57
|
-
"eslint-plugin-import": "^2.
|
|
58
|
-
"eslint-plugin-unicorn": "^
|
|
59
|
-
"prettier": "^3.
|
|
59
|
+
"@vitest/coverage-v8": "^4.1.2",
|
|
60
|
+
"eslint": "^9.39.4",
|
|
61
|
+
"eslint-plugin-import": "^2.32.0",
|
|
62
|
+
"eslint-plugin-unicorn": "^64.0.0",
|
|
63
|
+
"prettier": "^3.8.1",
|
|
60
64
|
"range-parser": "^1.2.1",
|
|
61
|
-
"rimraf": "^6.
|
|
65
|
+
"rimraf": "^6.1.3",
|
|
62
66
|
"standard-changelog": "^7.0.1",
|
|
63
|
-
"typescript": "^
|
|
64
|
-
"typescript-eslint": "^8.
|
|
65
|
-
"vitest": "^4.
|
|
67
|
+
"typescript": "^6.0.2",
|
|
68
|
+
"typescript-eslint": "^8.57.2",
|
|
69
|
+
"vitest": "^4.1.2"
|
|
66
70
|
},
|
|
67
71
|
"publishConfig": {
|
|
68
72
|
"access": "public"
|
package/src/blobFile.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
BufferEncoding,
|
|
2
3
|
FilehandleOptions,
|
|
3
4
|
GenericFilehandle,
|
|
4
5
|
Stats,
|
|
@@ -27,10 +28,7 @@ export default class BlobFile implements GenericFilehandle {
|
|
|
27
28
|
return new Uint8Array(0)
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
const
|
|
31
|
-
const end = start + length
|
|
32
|
-
|
|
33
|
-
const slice = this.blob.slice(start, end)
|
|
31
|
+
const slice = this.blob.slice(position, position + length)
|
|
34
32
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
35
33
|
return slice.bytes
|
|
36
34
|
? slice.bytes()
|
|
@@ -63,11 +61,11 @@ export default class BlobFile implements GenericFilehandle {
|
|
|
63
61
|
}
|
|
64
62
|
}
|
|
65
63
|
|
|
66
|
-
public
|
|
67
|
-
return { size: this.blob.size }
|
|
64
|
+
public stat(): Promise<Stats> {
|
|
65
|
+
return Promise.resolve({ size: this.blob.size })
|
|
68
66
|
}
|
|
69
67
|
|
|
70
|
-
public
|
|
71
|
-
return
|
|
68
|
+
public close(): Promise<void> {
|
|
69
|
+
return Promise.resolve()
|
|
72
70
|
}
|
|
73
71
|
}
|
package/src/filehandle.ts
CHANGED
|
@@ -1,27 +1,33 @@
|
|
|
1
|
+
// avoids needing to have @types/node as a dependency of the consuming code
|
|
2
|
+
export type BufferEncoding =
|
|
3
|
+
| 'ascii'
|
|
4
|
+
| 'utf8'
|
|
5
|
+
| 'utf-8'
|
|
6
|
+
| 'utf16le'
|
|
7
|
+
| 'utf-16le'
|
|
8
|
+
| 'ucs2'
|
|
9
|
+
| 'ucs-2'
|
|
10
|
+
| 'base64'
|
|
11
|
+
| 'base64url'
|
|
12
|
+
| 'latin1'
|
|
13
|
+
| 'binary'
|
|
14
|
+
| 'hex'
|
|
15
|
+
|
|
1
16
|
export type Fetcher = (
|
|
2
17
|
input: RequestInfo,
|
|
3
18
|
init?: RequestInit,
|
|
4
19
|
) => Promise<Response>
|
|
5
20
|
|
|
6
21
|
export interface FilehandleOptions {
|
|
7
|
-
/**
|
|
8
|
-
* optional AbortSignal object for aborting the request
|
|
9
|
-
*/
|
|
10
22
|
signal?: AbortSignal
|
|
11
|
-
headers?:
|
|
12
|
-
overrides?:
|
|
23
|
+
headers?: Record<string, string>
|
|
24
|
+
overrides?: Omit<RequestInit, 'headers'>
|
|
13
25
|
encoding?: BufferEncoding
|
|
14
|
-
/**
|
|
15
|
-
* fetch function to use for HTTP requests. defaults to environment's
|
|
16
|
-
* global fetch. if there is no global fetch, and a fetch function is not provided,
|
|
17
|
-
* throws an error.
|
|
18
|
-
*/
|
|
19
26
|
fetch?: Fetcher
|
|
20
27
|
}
|
|
21
28
|
|
|
22
29
|
export interface Stats {
|
|
23
30
|
size: number
|
|
24
|
-
[key: string]: any
|
|
25
31
|
}
|
|
26
32
|
|
|
27
33
|
export interface GenericFilehandle {
|
package/src/index.ts
CHANGED
package/src/localFile.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import { open, readFile, stat } from 'fs/promises'
|
|
2
2
|
|
|
3
|
-
import type {
|
|
3
|
+
import type {
|
|
4
|
+
BufferEncoding,
|
|
5
|
+
FilehandleOptions,
|
|
6
|
+
GenericFilehandle,
|
|
7
|
+
Stats,
|
|
8
|
+
} from './filehandle.ts'
|
|
4
9
|
|
|
5
10
|
export default class LocalFile implements GenericFilehandle {
|
|
6
11
|
private filename: string
|
|
7
12
|
|
|
8
|
-
public constructor(source: string
|
|
13
|
+
public constructor(source: string) {
|
|
9
14
|
this.filename = source
|
|
10
15
|
}
|
|
11
16
|
|
|
@@ -52,7 +57,7 @@ export default class LocalFile implements GenericFilehandle {
|
|
|
52
57
|
return readFile(this.filename, options)
|
|
53
58
|
}
|
|
54
59
|
|
|
55
|
-
public async stat() {
|
|
60
|
+
public async stat(): Promise<Stats> {
|
|
56
61
|
return stat(this.filename)
|
|
57
62
|
}
|
|
58
63
|
|
package/src/remoteFile.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type {
|
|
2
|
+
BufferEncoding,
|
|
2
3
|
Fetcher,
|
|
3
4
|
FilehandleOptions,
|
|
4
5
|
GenericFilehandle,
|
|
@@ -7,8 +8,11 @@ import type {
|
|
|
7
8
|
|
|
8
9
|
function getMessage(e: unknown) {
|
|
9
10
|
const r =
|
|
10
|
-
typeof e === 'object' &&
|
|
11
|
-
|
|
11
|
+
typeof e === 'object' &&
|
|
12
|
+
e !== null &&
|
|
13
|
+
'message' in e &&
|
|
14
|
+
typeof e.message === 'string'
|
|
15
|
+
? e.message
|
|
12
16
|
: `${e}`
|
|
13
17
|
return r.replace(/\.$/, '')
|
|
14
18
|
}
|
|
@@ -17,15 +21,17 @@ export default class RemoteFile implements GenericFilehandle {
|
|
|
17
21
|
protected url: string
|
|
18
22
|
private _stat?: Stats
|
|
19
23
|
private fetchImplementation: Fetcher
|
|
20
|
-
private
|
|
24
|
+
private baseHeaders: Record<string, string>
|
|
25
|
+
private baseOverrides: Omit<RequestInit, 'headers'>
|
|
21
26
|
|
|
22
27
|
public constructor(source: string, opts: FilehandleOptions = {}) {
|
|
23
28
|
this.url = source
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
this.baseHeaders = opts.headers ?? {}
|
|
30
|
+
this.baseOverrides = opts.overrides ?? {}
|
|
31
|
+
this.fetchImplementation =
|
|
32
|
+
opts.fetch ??
|
|
33
|
+
((input: RequestInfo, init?: RequestInit) =>
|
|
34
|
+
globalThis.fetch(input, init))
|
|
29
35
|
}
|
|
30
36
|
|
|
31
37
|
public async fetch(
|
|
@@ -70,20 +76,17 @@ export default class RemoteFile implements GenericFilehandle {
|
|
|
70
76
|
if (length === 0) {
|
|
71
77
|
return new Uint8Array(0)
|
|
72
78
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
headers.range = `bytes=${position}-`
|
|
79
|
+
if (Number.isNaN(length) || Number.isNaN(position)) {
|
|
80
|
+
throw new TypeError(
|
|
81
|
+
`read() called with NaN length or position (length=${length}, position=${position}). The index file may be corrupt.`,
|
|
82
|
+
)
|
|
78
83
|
}
|
|
84
|
+
const { headers = {}, signal, overrides = {} } = opts
|
|
85
|
+
headers.range = `bytes=${position}-${position + length - 1}`
|
|
79
86
|
const res = await this.fetch(this.url, {
|
|
80
87
|
...this.baseOverrides,
|
|
81
88
|
...overrides,
|
|
82
|
-
headers: {
|
|
83
|
-
...this.baseOverrides.headers,
|
|
84
|
-
...overrides.headers,
|
|
85
|
-
...headers,
|
|
86
|
-
},
|
|
89
|
+
headers: { ...this.baseHeaders, ...headers },
|
|
87
90
|
method: 'GET',
|
|
88
91
|
redirect: 'follow',
|
|
89
92
|
mode: 'cors',
|
|
@@ -97,7 +100,7 @@ export default class RemoteFile implements GenericFilehandle {
|
|
|
97
100
|
if ((res.status === 200 && position === 0) || res.status === 206) {
|
|
98
101
|
// try to parse out the size of the remote file
|
|
99
102
|
const contentRange = res.headers.get('content-range')
|
|
100
|
-
const sizeMatch = /\/(\d+)$/.exec(contentRange
|
|
103
|
+
const sizeMatch = /\/(\d+)$/.exec(contentRange ?? '')
|
|
101
104
|
if (sizeMatch?.[1]) {
|
|
102
105
|
this._stat = {
|
|
103
106
|
size: parseInt(sizeMatch[1], 10),
|
|
@@ -138,25 +141,13 @@ export default class RemoteFile implements GenericFilehandle {
|
|
|
138
141
|
public async readFile(
|
|
139
142
|
options: FilehandleOptions | BufferEncoding = {},
|
|
140
143
|
): Promise<Uint8Array<ArrayBuffer> | string> {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
if (typeof options === 'string') {
|
|
144
|
-
encoding = options
|
|
145
|
-
opts = {}
|
|
146
|
-
} else {
|
|
147
|
-
encoding = options.encoding
|
|
148
|
-
const { encoding: _, ...rest } = options
|
|
149
|
-
opts = rest
|
|
150
|
-
}
|
|
144
|
+
const encoding = typeof options === 'string' ? options : options.encoding
|
|
145
|
+
const opts = typeof options === 'string' ? {} : options
|
|
151
146
|
const { headers = {}, signal, overrides = {} } = opts
|
|
152
147
|
const res = await this.fetch(this.url, {
|
|
153
148
|
...this.baseOverrides,
|
|
154
149
|
...overrides,
|
|
155
|
-
headers: {
|
|
156
|
-
...this.baseOverrides.headers,
|
|
157
|
-
...overrides.headers,
|
|
158
|
-
...headers,
|
|
159
|
-
},
|
|
150
|
+
headers: { ...this.baseHeaders, ...headers },
|
|
160
151
|
method: 'GET',
|
|
161
152
|
redirect: 'follow',
|
|
162
153
|
mode: 'cors',
|
|
@@ -186,7 +177,7 @@ export default class RemoteFile implements GenericFilehandle {
|
|
|
186
177
|
return this._stat
|
|
187
178
|
}
|
|
188
179
|
|
|
189
|
-
public
|
|
190
|
-
return
|
|
180
|
+
public close(): Promise<void> {
|
|
181
|
+
return Promise.resolve()
|
|
191
182
|
}
|
|
192
183
|
}
|