edfcore 0.1.2 → 0.1.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/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/io/cached.d.ts.map +1 -1
- package/dist/io/cached.js +3 -3
- package/dist/io/cached.js.map +1 -1
- package/dist/io/http.d.ts.map +1 -1
- package/dist/io/http.js +95 -22
- package/dist/io/http.js.map +1 -1
- package/dist/io/source.d.ts +24 -1
- package/dist/io/source.d.ts.map +1 -1
- package/dist/io/source.js +34 -1
- package/dist/io/source.js.map +1 -1
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +24 -3
- package/dist/validate.js.map +1 -1
- package/package.json +1 -1
- package/src/constants.ts +1 -1
- package/src/io/cached.ts +9 -3
- package/src/io/http.ts +111 -24
- package/src/io/source.ts +41 -2
- package/src/validate.ts +28 -3
package/dist/constants.d.ts
CHANGED
|
@@ -109,5 +109,5 @@ export declare const SIGNAL_FIELD_BLOCK_OFFSETS: {
|
|
|
109
109
|
readonly reserved: 224;
|
|
110
110
|
};
|
|
111
111
|
/** Published package version. Kept in sync with package.json by a test. */
|
|
112
|
-
export declare const VERSION = "0.1.
|
|
112
|
+
export declare const VERSION = "0.1.3";
|
|
113
113
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.js
CHANGED
package/dist/io/cached.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cached.d.ts","sourceRoot":"","sources":["../../src/io/cached.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AAmBzE,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"cached.d.ts","sourceRoot":"","sources":["../../src/io/cached.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAe,MAAM,aAAa,CAAC;AAmBzE,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,UAAU,CAyGnF"}
|
package/dist/io/cached.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* Block boundaries are byte-aligned, not record-aligned: this module is format-independent by
|
|
15
15
|
* construction and has no access to a header, so there is no record size to align to.
|
|
16
16
|
*/
|
|
17
|
-
import { assertExactRead, assertReadRange, throwIfAborted } from './source.js';
|
|
17
|
+
import { assertExactRead, assertReadRange, requireFiniteOption, throwIfAborted } from './source.js';
|
|
18
18
|
const DEFAULT_BLOCK_BYTES = 1024 * 1024;
|
|
19
19
|
const DEFAULT_MAX_BYTES = 64 * 1024 * 1024;
|
|
20
20
|
/** Delegation with the contract still enforced, for configurations that cannot cache. */
|
|
@@ -31,8 +31,8 @@ function passThrough(source) {
|
|
|
31
31
|
}
|
|
32
32
|
export function cachedSource(source, options) {
|
|
33
33
|
const byteLength = source.byteLength;
|
|
34
|
-
const maxBytes = Math.max(0, Math.floor(options?.maxBytes
|
|
35
|
-
const requestedBlockBytes = Math.max(1, Math.floor(options?.blockBytes
|
|
34
|
+
const maxBytes = Math.max(0, Math.floor(requireFiniteOption(options?.maxBytes, 'maxBytes', DEFAULT_MAX_BYTES)));
|
|
35
|
+
const requestedBlockBytes = Math.max(1, Math.floor(requireFiniteOption(options?.blockBytes, 'blockBytes', DEFAULT_BLOCK_BYTES)));
|
|
36
36
|
// A block wider than the whole budget would evict itself on every insert, so the block is
|
|
37
37
|
// clamped to the budget rather than the cache being left in a state that can never hold one.
|
|
38
38
|
const blockBytes = Math.min(requestedBlockBytes, maxBytes);
|
package/dist/io/cached.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cached.js","sourceRoot":"","sources":["../../src/io/cached.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cached.js","sourceRoot":"","sources":["../../src/io/cached.ts"],"names":[],"mappings":"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"}
|
package/dist/io/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/io/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAEV,UAAU,EAGV,iBAAiB,EAElB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/io/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAEV,UAAU,EAGV,iBAAiB,EAElB,MAAM,aAAa,CAAC;AAkNrB,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EACvC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,UAAU,CAAC,CA+IrB"}
|
package/dist/io/http.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* without it. Three ways are tried, cheapest first, and failing to find one is fatal.
|
|
15
15
|
*/
|
|
16
16
|
import { EdfSourceError } from '../errors.js';
|
|
17
|
-
import { assertExactRead, assertReadRange,
|
|
17
|
+
import { assertExactRead, assertReadRange, requireFiniteOption, throwIfSignalAborted, } from './source.js';
|
|
18
18
|
/** Small enough to stay polite to a shared origin, large enough to hide latency. */
|
|
19
19
|
const DEFAULT_MAX_CONCURRENCY = 4;
|
|
20
20
|
const HTTP_PARTIAL_CONTENT = 206;
|
|
@@ -93,7 +93,7 @@ function resolveFetch(options) {
|
|
|
93
93
|
*
|
|
94
94
|
* It is attached only when it carries `addEventListener`, i.e. when it genuinely is an
|
|
95
95
|
* `AbortSignal`. The platform `fetch` throws a `TypeError` on anything else, and a caller who
|
|
96
|
-
* passed a bare `{ aborted }` shim is still served by the `
|
|
96
|
+
* passed a bare `{ aborted }` shim is still served by the `throwIfSignalAborted` polls around the
|
|
97
97
|
* request.
|
|
98
98
|
*/
|
|
99
99
|
function attachSignal(init, signal) {
|
|
@@ -119,6 +119,9 @@ function rangeIgnoredError(href, offset, length) {
|
|
|
119
119
|
}
|
|
120
120
|
async function resolveSource(fetchImpl, href, baseHeaders, options) {
|
|
121
121
|
const signal = options?.signal;
|
|
122
|
+
// Resolution issues its own HEAD and probe requests, so an already-aborted source signal has
|
|
123
|
+
// to be caught here too — otherwise httpSource() itself does network work after cancellation.
|
|
124
|
+
throwIfSignalAborted(signal);
|
|
122
125
|
const declared = options?.byteLength;
|
|
123
126
|
if (declared !== undefined) {
|
|
124
127
|
if (!Number.isSafeInteger(declared) || declared < 0) {
|
|
@@ -168,52 +171,122 @@ export async function httpSource(url, options) {
|
|
|
168
171
|
const href = hrefOf(url);
|
|
169
172
|
const fetchImpl = resolveFetch(options);
|
|
170
173
|
const baseHeaders = { ...options?.headers };
|
|
171
|
-
const gate = createGate(Math.max(1, Math.floor(options?.maxConcurrency
|
|
174
|
+
const gate = createGate(Math.max(1, Math.floor(requireFiniteOption(options?.maxConcurrency, 'maxConcurrency', DEFAULT_MAX_CONCURRENCY))));
|
|
172
175
|
const resolved = await resolveSource(fetchImpl, href, baseHeaders, options);
|
|
173
176
|
const byteLength = resolved.byteLength;
|
|
174
177
|
/** Set once, and only ever when the server ignored Range and the caller allowed it. */
|
|
175
178
|
let fullBody = resolved.body;
|
|
179
|
+
/**
|
|
180
|
+
* The one in-flight full download, so a server that ignores Range costs one transfer.
|
|
181
|
+
*
|
|
182
|
+
* Without it, every read that had already entered `fetchRange` issued its own GET, each
|
|
183
|
+
* buffering the whole resource — N concurrent block reads downloaded the file N times and held
|
|
184
|
+
* up to `maxConcurrency` copies at once. That turns a large remote recording into an
|
|
185
|
+
* out-of-memory crash rather than a slow read.
|
|
186
|
+
*/
|
|
187
|
+
let fullBodyInflight;
|
|
188
|
+
/**
|
|
189
|
+
* Settles once one request has revealed whether this server honours Range.
|
|
190
|
+
*
|
|
191
|
+
* Only used when `allowFullDownload` is on. Until the answer is known, a request is a gamble:
|
|
192
|
+
* if the server ignores Range it answers with the entire resource, and `maxConcurrency`
|
|
193
|
+
* requests issued in parallel each pay for a whole copy before any of them can warn the
|
|
194
|
+
* others. Sending the first one alone costs one round trip on the first read and bounds the
|
|
195
|
+
* worst case at a single transfer instead of `maxConcurrency` of them.
|
|
196
|
+
*/
|
|
197
|
+
let rangeSupportProbe;
|
|
176
198
|
async function fetchRange(offset, length, readOptions) {
|
|
177
199
|
const signal = readOptions?.signal ?? options?.signal;
|
|
178
200
|
// INCLUSIVE end: `bytes=0-0` is one byte, so the last addressed byte is offset+length-1.
|
|
179
201
|
const headers = { ...baseHeaders, Range: `bytes=${offset}-${offset + length - 1}` };
|
|
180
202
|
await gate.acquire();
|
|
181
203
|
try {
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
}
|
|
188
|
-
if (response.status === HTTP_OK) {
|
|
189
|
-
if (options?.allowFullDownload !== true)
|
|
190
|
-
throw rangeIgnoredError(href, offset, length);
|
|
191
|
-
const body = new Uint8Array(await response.arrayBuffer());
|
|
192
|
-
// A concurrent read may have won the race; either copy is the same resource, so keep
|
|
193
|
-
// whichever landed first and let this one be collected.
|
|
194
|
-
if (fullBody === undefined)
|
|
195
|
-
fullBody = body;
|
|
204
|
+
throwIfSignalAborted(signal);
|
|
205
|
+
// Waiting for a gate slot can take arbitrarily long, and in that time another read may
|
|
206
|
+
// have discovered that the server ignores Range. Re-checking here is what stops every
|
|
207
|
+
// queued read from repeating the download the first one already made.
|
|
208
|
+
if (fullBody !== undefined)
|
|
196
209
|
return sliceFullBody(fullBody, offset, length);
|
|
210
|
+
if (fullBodyInflight !== undefined) {
|
|
211
|
+
return sliceFullBody(await fullBodyInflight, offset, length);
|
|
212
|
+
}
|
|
213
|
+
let announceProbeDone;
|
|
214
|
+
if (options?.allowFullDownload === true) {
|
|
215
|
+
if (rangeSupportProbe === undefined) {
|
|
216
|
+
rangeSupportProbe = new Promise((resolve) => {
|
|
217
|
+
announceProbeDone = resolve;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
// Someone else is finding out. Their answer is ours too.
|
|
222
|
+
await rangeSupportProbe;
|
|
223
|
+
if (fullBody !== undefined)
|
|
224
|
+
return sliceFullBody(fullBody, offset, length);
|
|
225
|
+
if (fullBodyInflight !== undefined) {
|
|
226
|
+
return sliceFullBody(await fullBodyInflight, offset, length);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
return await issueRequest(offset, length, headers, signal);
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
announceProbeDone?.();
|
|
197
235
|
}
|
|
198
|
-
throw new EdfSourceError(`Reading bytes ${offset}..${offset + length - 1} of ${href} failed: the server ` +
|
|
199
|
-
`answered HTTP ${response.status}. Next: check the URL, its authentication headers ` +
|
|
200
|
-
'and whether a signed URL has expired.', { offset, requestedLength: length });
|
|
201
236
|
}
|
|
202
237
|
finally {
|
|
203
238
|
gate.release();
|
|
204
239
|
}
|
|
205
240
|
}
|
|
241
|
+
async function issueRequest(offset, length, headers, signal) {
|
|
242
|
+
const response = await request(fetchImpl, href, headers, 'GET', signal);
|
|
243
|
+
if (response.status === HTTP_PARTIAL_CONTENT) {
|
|
244
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
245
|
+
return assertExactRead(bytes, offset, length);
|
|
246
|
+
}
|
|
247
|
+
if (response.status === HTTP_OK) {
|
|
248
|
+
if (options?.allowFullDownload !== true)
|
|
249
|
+
throw rangeIgnoredError(href, offset, length);
|
|
250
|
+
if (fullBody !== undefined)
|
|
251
|
+
return sliceFullBody(fullBody, offset, length);
|
|
252
|
+
// A read that raced us to the same discovery already owns the transfer. Abandon this
|
|
253
|
+
// response body unread and take theirs — either copy is the same resource.
|
|
254
|
+
if (fullBodyInflight === undefined) {
|
|
255
|
+
fullBodyInflight = response
|
|
256
|
+
.arrayBuffer()
|
|
257
|
+
.then((buffer) => {
|
|
258
|
+
const body = new Uint8Array(buffer);
|
|
259
|
+
fullBody = body;
|
|
260
|
+
return body;
|
|
261
|
+
})
|
|
262
|
+
.catch((error) => {
|
|
263
|
+
// A failed transfer must not poison every later read with a rejected promise.
|
|
264
|
+
fullBodyInflight = undefined;
|
|
265
|
+
throw error;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return sliceFullBody(await fullBodyInflight, offset, length);
|
|
269
|
+
}
|
|
270
|
+
throw new EdfSourceError(`Reading bytes ${offset}..${offset + length - 1} of ${href} failed: the server ` +
|
|
271
|
+
`answered HTTP ${response.status}. Next: check the URL, its authentication headers ` +
|
|
272
|
+
'and whether a signed URL has expired.', { offset, requestedLength: length });
|
|
273
|
+
}
|
|
206
274
|
return {
|
|
207
275
|
byteLength,
|
|
208
276
|
async read(offset, length, readOptions) {
|
|
209
|
-
|
|
277
|
+
// The effective signal, not just the per-read one. A source-level signal is documented as
|
|
278
|
+
// "the default for every request", and honouring it only inside `attachSignal` meant it
|
|
279
|
+
// worked for a real AbortSignal and was a silent no-op for the published
|
|
280
|
+
// `AbortSignalLike` shim, which has no addEventListener to attach to.
|
|
281
|
+
const signal = readOptions?.signal ?? options?.signal;
|
|
282
|
+
throwIfSignalAborted(signal);
|
|
210
283
|
assertReadRange(offset, length, byteLength);
|
|
211
284
|
if (length === 0)
|
|
212
285
|
return new Uint8Array(0);
|
|
213
286
|
if (fullBody !== undefined)
|
|
214
287
|
return sliceFullBody(fullBody, offset, length);
|
|
215
288
|
const bytes = await fetchRange(offset, length, readOptions);
|
|
216
|
-
|
|
289
|
+
throwIfSignalAborted(signal);
|
|
217
290
|
return bytes;
|
|
218
291
|
},
|
|
219
292
|
};
|
package/dist/io/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/io/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAS9C,OAAO,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/io/http.ts"],"names":[],"mappings":"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"}
|
package/dist/io/source.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* from a truncated file, so without this guard the parser would confidently report the wrong
|
|
11
11
|
* cause for the wrong thing.
|
|
12
12
|
*/
|
|
13
|
-
import type { ReadOptions } from '../types.js';
|
|
13
|
+
import type { AbortSignalLike, ReadOptions } from '../types.js';
|
|
14
14
|
/**
|
|
15
15
|
* Enforces the exact-length contract and returns the value unchanged so it can wrap a read
|
|
16
16
|
* expression directly.
|
|
@@ -30,4 +30,27 @@ export declare function assertReadRange(offset: number, length: number, byteLeng
|
|
|
30
30
|
* on is `error.name === 'AbortError'`, so that is what this produces.
|
|
31
31
|
*/
|
|
32
32
|
export declare function throwIfAborted(options?: ReadOptions): void;
|
|
33
|
+
/**
|
|
34
|
+
* The same check against a signal that was resolved by the caller.
|
|
35
|
+
*
|
|
36
|
+
* A source can carry its own signal as well as the one passed per read, and the effective signal
|
|
37
|
+
* is `readOptions?.signal ?? sourceOptions?.signal`. That cannot be handed back to
|
|
38
|
+
* `throwIfAborted` as an object literal, because `exactOptionalPropertyTypes` refuses
|
|
39
|
+
* `{ signal: undefined }` where the property is declared optional.
|
|
40
|
+
*/
|
|
41
|
+
export declare function throwIfSignalAborted(signal?: AbortSignalLike): void;
|
|
42
|
+
/**
|
|
43
|
+
* A numeric source option, rejected rather than silently coerced when it is not a finite number.
|
|
44
|
+
*
|
|
45
|
+
* These options are typed `number`, which admits `NaN` and `Infinity`, and both arrive easily:
|
|
46
|
+
* `Number(process.env.EDFCORE_CACHE_MIB)`, `Number(searchParams.get('block'))` and any absent
|
|
47
|
+
* key in a JSON config all produce `NaN`. Left alone they do not fail loudly — `Math.max(1, NaN)`
|
|
48
|
+
* is `NaN` and every subsequent comparison against it is false, so guards written as
|
|
49
|
+
* `if (value < 1)` simply do not fire and the caller gets fabricated data or a read that never
|
|
50
|
+
* settles. Refusing at construction keeps the failure at the line that holds the bad value.
|
|
51
|
+
*
|
|
52
|
+
* A plain `RangeError`, not an `EdfError`: this is a bug in the calling code rather than a
|
|
53
|
+
* problem with the file, which is the same split `isEdfError` documents.
|
|
54
|
+
*/
|
|
55
|
+
export declare function requireFiniteOption(value: number | undefined, name: string, fallback: number): number;
|
|
33
56
|
//# sourceMappingURL=source.d.ts.map
|
package/dist/io/source.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAYhE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAYhG;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAuBxF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAE1D;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAKnE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,MAAM,CAQR"}
|
package/dist/io/source.js
CHANGED
|
@@ -63,10 +63,43 @@ export function assertReadRange(offset, length, byteLength) {
|
|
|
63
63
|
* on is `error.name === 'AbortError'`, so that is what this produces.
|
|
64
64
|
*/
|
|
65
65
|
export function throwIfAborted(options) {
|
|
66
|
-
|
|
66
|
+
throwIfSignalAborted(options?.signal);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The same check against a signal that was resolved by the caller.
|
|
70
|
+
*
|
|
71
|
+
* A source can carry its own signal as well as the one passed per read, and the effective signal
|
|
72
|
+
* is `readOptions?.signal ?? sourceOptions?.signal`. That cannot be handed back to
|
|
73
|
+
* `throwIfAborted` as an object literal, because `exactOptionalPropertyTypes` refuses
|
|
74
|
+
* `{ signal: undefined }` where the property is declared optional.
|
|
75
|
+
*/
|
|
76
|
+
export function throwIfSignalAborted(signal) {
|
|
77
|
+
if (signal?.aborted !== true)
|
|
67
78
|
return;
|
|
68
79
|
const error = new Error('The read was aborted through options.signal.');
|
|
69
80
|
error.name = 'AbortError';
|
|
70
81
|
throw error;
|
|
71
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* A numeric source option, rejected rather than silently coerced when it is not a finite number.
|
|
85
|
+
*
|
|
86
|
+
* These options are typed `number`, which admits `NaN` and `Infinity`, and both arrive easily:
|
|
87
|
+
* `Number(process.env.EDFCORE_CACHE_MIB)`, `Number(searchParams.get('block'))` and any absent
|
|
88
|
+
* key in a JSON config all produce `NaN`. Left alone they do not fail loudly — `Math.max(1, NaN)`
|
|
89
|
+
* is `NaN` and every subsequent comparison against it is false, so guards written as
|
|
90
|
+
* `if (value < 1)` simply do not fire and the caller gets fabricated data or a read that never
|
|
91
|
+
* settles. Refusing at construction keeps the failure at the line that holds the bad value.
|
|
92
|
+
*
|
|
93
|
+
* A plain `RangeError`, not an `EdfError`: this is a bug in the calling code rather than a
|
|
94
|
+
* problem with the file, which is the same split `isEdfError` documents.
|
|
95
|
+
*/
|
|
96
|
+
export function requireFiniteOption(value, name, fallback) {
|
|
97
|
+
if (value === undefined)
|
|
98
|
+
return fallback;
|
|
99
|
+
if (Number.isFinite(value))
|
|
100
|
+
return value;
|
|
101
|
+
throw new RangeError(`options.${name} must be a finite number, but was ${String(value)}. Next: check the ` +
|
|
102
|
+
'expression that produced it — Number() on an absent environment variable, query ' +
|
|
103
|
+
'parameter or config key yields NaN.');
|
|
104
|
+
}
|
|
72
105
|
//# sourceMappingURL=source.js.map
|
package/dist/io/source.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C;;;GAGG;AACH,SAAS,gBAAgB,CAAC,QAAiB;IACzC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,MAAM,GAAI,QAAiC,CAAC,MAAM,CAAC;IACzD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAoB,EAAE,MAAc,EAAE,MAAc;IAClF,MAAM,cAAc,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,cAAc,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IAC/C,MAAM,GAAG,GACP,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,GAAG,cAAc,QAAQ,CAAC;IAChG,MAAM,IAAI,cAAc,CACtB,0BAA0B,MAAM,YAAY,MAAM,mBAAmB,GAAG,iBAAiB;QACvF,gFAAgF;QAChF,oFAAoF;QACpF,6EAA6E,EAC/E,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,CACpD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,MAAc,EAAE,UAAkB;IAChF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,cAAc,CACtB,oCAAoC,MAAM,8CAA8C;YACtF,qFAAqF,EACvF,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,CACpC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,cAAc,CACtB,oCAAoC,MAAM,8CAA8C;YACtF,wCAAwC,EAC1C,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,CACpC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,GAAG,MAAM,GAAG,UAAU,EAAE,CAAC;QACjC,MAAM,IAAI,cAAc,CACtB,0BAA0B,MAAM,YAAY,MAAM,kBAAkB,MAAM,GAAG,MAAM,IAAI;YACrF,qBAAqB,UAAU,uDAAuD;YACtF,sEAAsE,EACxE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,CACpC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAqB;IAClD,
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"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"}
|
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAcH,OAAO,KAAK,EAEV,aAAa,EAEb,SAAS,EAET,YAAY,EAIZ,eAAe,EACf,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB;;;;;;GAMG;AACH,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAiSzF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,aAAa,EAAE,CAe1E;AA6MD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,gBAAgB,CAAC,CA+C3B"}
|
package/dist/validate.js
CHANGED
|
@@ -18,9 +18,10 @@
|
|
|
18
18
|
* 9, they can never be fatal, and a consumer's `switch` keeps its `default` branch.
|
|
19
19
|
*/
|
|
20
20
|
import { trimEdfField } from './bytes/latin1.js';
|
|
21
|
-
import { EDF_RECOMMENDED_MAX_RECORD_BYTES } from './constants.js';
|
|
21
|
+
import { DEFAULT_MAX_MATERIALIZE_BYTES, EDF_RECOMMENDED_MAX_RECORD_BYTES } from './constants.js';
|
|
22
22
|
import { decodeDigitalCounted } from './decode/digital.js';
|
|
23
23
|
import { createDiagnostic } from './diagnostics/collector.js';
|
|
24
|
+
import { EdfBudgetError } from './errors.js';
|
|
24
25
|
import { calendarDatesEqual, formatCalendarDate, isValidCalendarDate } from './header/dates.js';
|
|
25
26
|
import { signalFieldOffset } from './header/signals.js';
|
|
26
27
|
import { readRecordBytes } from './io/read.js';
|
|
@@ -30,6 +31,8 @@ import { buildSegmentation } from './time/segments.js';
|
|
|
30
31
|
import { assertMonotonicOnsetArray } from './time/timeline.js';
|
|
31
32
|
const LABEL_SPEC = 'EDF+ additional specification 9 (standard texts and labels)';
|
|
32
33
|
const TIMEKEEPING_SPEC = 'EDF+ specification 2.2.1 (time keeping of data records)';
|
|
34
|
+
/** The sample-scan scratch buffer is an `Int32Array`, so four bytes per sample. */
|
|
35
|
+
const BYTES_PER_SCRATCH_SAMPLE = 4;
|
|
33
36
|
/**
|
|
34
37
|
* The signal types EDF+ additional specification 9 names.
|
|
35
38
|
*
|
|
@@ -371,8 +374,17 @@ async function traverse(recording, options, scanSamples) {
|
|
|
371
374
|
}))
|
|
372
375
|
: [];
|
|
373
376
|
const chunkRecords = scanChunkRecords(header, options?.maxMaterializeBytes);
|
|
374
|
-
|
|
375
|
-
|
|
377
|
+
/*
|
|
378
|
+
* One scratch array for every signal and every chunk.
|
|
379
|
+
*
|
|
380
|
+
* This is normally bounded by the chunk's own byte size, because `scanChunkRecords` fits the
|
|
381
|
+
* chunk into a scan block. That bound fails for a single record larger than the whole block:
|
|
382
|
+
* the record count floors to 1 and the scratch size becomes `samplesPerRecord` unclamped, up
|
|
383
|
+
* to the 99,999,999 an 8-byte EDF field can hold — a 400 MB allocation reachable from one
|
|
384
|
+
* corrupted digit in a 512-byte file, made before any read, so no downstream check can catch
|
|
385
|
+
* it. Validation exists to be pointed at untrusted files, so it is exactly the caller who
|
|
386
|
+
* needs the budget honoured rather than a documented cap that only the read path respects.
|
|
387
|
+
*/
|
|
376
388
|
let scratch;
|
|
377
389
|
if (scanSamples) {
|
|
378
390
|
let maxSamplesPerRecord = 0;
|
|
@@ -382,6 +394,15 @@ async function traverse(recording, options, scanSamples) {
|
|
|
382
394
|
maxSamplesPerRecord = Math.max(maxSamplesPerRecord, signal.samplesPerRecord);
|
|
383
395
|
}
|
|
384
396
|
}
|
|
397
|
+
const scratchBytes = chunkRecords * maxSamplesPerRecord * BYTES_PER_SCRATCH_SAMPLE;
|
|
398
|
+
const budgetBytes = options?.maxMaterializeBytes ?? DEFAULT_MAX_MATERIALIZE_BYTES;
|
|
399
|
+
if (scratchBytes > budgetBytes) {
|
|
400
|
+
throw new EdfBudgetError(`Scanning samples needs a ${scratchBytes}-byte scratch buffer for ${chunkRecords} ` +
|
|
401
|
+
`record(s) of up to ${maxSamplesPerRecord} samples, above the ${budgetBytes}-byte ` +
|
|
402
|
+
'maxMaterializeBytes budget, so the scan was refused before anything was allocated. ' +
|
|
403
|
+
'Next: raise options.maxMaterializeBytes, or drop scanSamples and validate the ' +
|
|
404
|
+
'header alone.', { requiredBytes: scratchBytes, budgetBytes });
|
|
405
|
+
}
|
|
385
406
|
scratch = new Int32Array(chunkRecords * maxSamplesPerRecord);
|
|
386
407
|
}
|
|
387
408
|
let recordsScanned = 0;
|
package/dist/validate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/constants.ts
CHANGED
package/src/io/cached.ts
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
import type { ByteSource, CacheOptions, ReadOptions } from '../types.js';
|
|
19
|
-
import { assertExactRead, assertReadRange, throwIfAborted } from './source.js';
|
|
19
|
+
import { assertExactRead, assertReadRange, requireFiniteOption, throwIfAborted } from './source.js';
|
|
20
20
|
|
|
21
21
|
const DEFAULT_BLOCK_BYTES = 1024 * 1024;
|
|
22
22
|
const DEFAULT_MAX_BYTES = 64 * 1024 * 1024;
|
|
@@ -36,8 +36,14 @@ function passThrough(source: ByteSource): ByteSource {
|
|
|
36
36
|
|
|
37
37
|
export function cachedSource(source: ByteSource, options?: CacheOptions): ByteSource {
|
|
38
38
|
const byteLength = source.byteLength;
|
|
39
|
-
const maxBytes = Math.max(
|
|
40
|
-
|
|
39
|
+
const maxBytes = Math.max(
|
|
40
|
+
0,
|
|
41
|
+
Math.floor(requireFiniteOption(options?.maxBytes, 'maxBytes', DEFAULT_MAX_BYTES)),
|
|
42
|
+
);
|
|
43
|
+
const requestedBlockBytes = Math.max(
|
|
44
|
+
1,
|
|
45
|
+
Math.floor(requireFiniteOption(options?.blockBytes, 'blockBytes', DEFAULT_BLOCK_BYTES)),
|
|
46
|
+
);
|
|
41
47
|
// A block wider than the whole budget would evict itself on every insert, so the block is
|
|
42
48
|
// clamped to the budget rather than the cache being left in a state that can never hold one.
|
|
43
49
|
const blockBytes = Math.min(requestedBlockBytes, maxBytes);
|
package/src/io/http.ts
CHANGED
|
@@ -23,7 +23,12 @@ import type {
|
|
|
23
23
|
HttpSourceOptions,
|
|
24
24
|
ReadOptions,
|
|
25
25
|
} from '../types.js';
|
|
26
|
-
import {
|
|
26
|
+
import {
|
|
27
|
+
assertExactRead,
|
|
28
|
+
assertReadRange,
|
|
29
|
+
requireFiniteOption,
|
|
30
|
+
throwIfSignalAborted,
|
|
31
|
+
} from './source.js';
|
|
27
32
|
|
|
28
33
|
/** Small enough to stay polite to a shared origin, large enough to hide latency. */
|
|
29
34
|
const DEFAULT_MAX_CONCURRENCY = 4;
|
|
@@ -122,7 +127,7 @@ function resolveFetch(options: HttpSourceOptions | undefined): FetchLike {
|
|
|
122
127
|
*
|
|
123
128
|
* It is attached only when it carries `addEventListener`, i.e. when it genuinely is an
|
|
124
129
|
* `AbortSignal`. The platform `fetch` throws a `TypeError` on anything else, and a caller who
|
|
125
|
-
* passed a bare `{ aborted }` shim is still served by the `
|
|
130
|
+
* passed a bare `{ aborted }` shim is still served by the `throwIfSignalAborted` polls around the
|
|
126
131
|
* request.
|
|
127
132
|
*/
|
|
128
133
|
function attachSignal(init: RequestInitLike, signal: AbortSignalLike | undefined): void {
|
|
@@ -170,6 +175,9 @@ async function resolveSource(
|
|
|
170
175
|
options: HttpSourceOptions | undefined,
|
|
171
176
|
): Promise<ResolvedSource> {
|
|
172
177
|
const signal = options?.signal;
|
|
178
|
+
// Resolution issues its own HEAD and probe requests, so an already-aborted source signal has
|
|
179
|
+
// to be caught here too — otherwise httpSource() itself does network work after cancellation.
|
|
180
|
+
throwIfSignalAborted(signal);
|
|
173
181
|
|
|
174
182
|
const declared = options?.byteLength;
|
|
175
183
|
if (declared !== undefined) {
|
|
@@ -232,13 +240,37 @@ export async function httpSource(
|
|
|
232
240
|
const fetchImpl = resolveFetch(options);
|
|
233
241
|
const baseHeaders: Record<string, string> = { ...options?.headers };
|
|
234
242
|
const gate = createGate(
|
|
235
|
-
Math.max(
|
|
243
|
+
Math.max(
|
|
244
|
+
1,
|
|
245
|
+
Math.floor(
|
|
246
|
+
requireFiniteOption(options?.maxConcurrency, 'maxConcurrency', DEFAULT_MAX_CONCURRENCY),
|
|
247
|
+
),
|
|
248
|
+
),
|
|
236
249
|
);
|
|
237
250
|
|
|
238
251
|
const resolved = await resolveSource(fetchImpl, href, baseHeaders, options);
|
|
239
252
|
const byteLength = resolved.byteLength;
|
|
240
253
|
/** Set once, and only ever when the server ignored Range and the caller allowed it. */
|
|
241
254
|
let fullBody: Uint8Array | undefined = resolved.body;
|
|
255
|
+
/**
|
|
256
|
+
* The one in-flight full download, so a server that ignores Range costs one transfer.
|
|
257
|
+
*
|
|
258
|
+
* Without it, every read that had already entered `fetchRange` issued its own GET, each
|
|
259
|
+
* buffering the whole resource — N concurrent block reads downloaded the file N times and held
|
|
260
|
+
* up to `maxConcurrency` copies at once. That turns a large remote recording into an
|
|
261
|
+
* out-of-memory crash rather than a slow read.
|
|
262
|
+
*/
|
|
263
|
+
let fullBodyInflight: Promise<Uint8Array> | undefined;
|
|
264
|
+
/**
|
|
265
|
+
* Settles once one request has revealed whether this server honours Range.
|
|
266
|
+
*
|
|
267
|
+
* Only used when `allowFullDownload` is on. Until the answer is known, a request is a gamble:
|
|
268
|
+
* if the server ignores Range it answers with the entire resource, and `maxConcurrency`
|
|
269
|
+
* requests issued in parallel each pay for a whole copy before any of them can warn the
|
|
270
|
+
* others. Sending the first one alone costs one round trip on the first read and bounds the
|
|
271
|
+
* worst case at a single transfer instead of `maxConcurrency` of them.
|
|
272
|
+
*/
|
|
273
|
+
let rangeSupportProbe: Promise<void> | undefined;
|
|
242
274
|
|
|
243
275
|
async function fetchRange(
|
|
244
276
|
offset: number,
|
|
@@ -251,43 +283,98 @@ export async function httpSource(
|
|
|
251
283
|
|
|
252
284
|
await gate.acquire();
|
|
253
285
|
try {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
286
|
+
throwIfSignalAborted(signal);
|
|
287
|
+
// Waiting for a gate slot can take arbitrarily long, and in that time another read may
|
|
288
|
+
// have discovered that the server ignores Range. Re-checking here is what stops every
|
|
289
|
+
// queued read from repeating the download the first one already made.
|
|
290
|
+
if (fullBody !== undefined) return sliceFullBody(fullBody, offset, length);
|
|
291
|
+
if (fullBodyInflight !== undefined) {
|
|
292
|
+
return sliceFullBody(await fullBodyInflight, offset, length);
|
|
260
293
|
}
|
|
261
294
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
295
|
+
let announceProbeDone: (() => void) | undefined;
|
|
296
|
+
if (options?.allowFullDownload === true) {
|
|
297
|
+
if (rangeSupportProbe === undefined) {
|
|
298
|
+
rangeSupportProbe = new Promise<void>((resolve) => {
|
|
299
|
+
announceProbeDone = resolve;
|
|
300
|
+
});
|
|
301
|
+
} else {
|
|
302
|
+
// Someone else is finding out. Their answer is ours too.
|
|
303
|
+
await rangeSupportProbe;
|
|
304
|
+
if (fullBody !== undefined) return sliceFullBody(fullBody, offset, length);
|
|
305
|
+
if (fullBodyInflight !== undefined) {
|
|
306
|
+
return sliceFullBody(await fullBodyInflight, offset, length);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
269
309
|
}
|
|
270
310
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
);
|
|
311
|
+
try {
|
|
312
|
+
return await issueRequest(offset, length, headers, signal);
|
|
313
|
+
} finally {
|
|
314
|
+
announceProbeDone?.();
|
|
315
|
+
}
|
|
277
316
|
} finally {
|
|
278
317
|
gate.release();
|
|
279
318
|
}
|
|
280
319
|
}
|
|
281
320
|
|
|
321
|
+
async function issueRequest(
|
|
322
|
+
offset: number,
|
|
323
|
+
length: number,
|
|
324
|
+
headers: Record<string, string>,
|
|
325
|
+
signal: AbortSignalLike | undefined,
|
|
326
|
+
): Promise<Uint8Array> {
|
|
327
|
+
const response = await request(fetchImpl, href, headers, 'GET', signal);
|
|
328
|
+
|
|
329
|
+
if (response.status === HTTP_PARTIAL_CONTENT) {
|
|
330
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
331
|
+
return assertExactRead(bytes, offset, length);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (response.status === HTTP_OK) {
|
|
335
|
+
if (options?.allowFullDownload !== true) throw rangeIgnoredError(href, offset, length);
|
|
336
|
+
if (fullBody !== undefined) return sliceFullBody(fullBody, offset, length);
|
|
337
|
+
// A read that raced us to the same discovery already owns the transfer. Abandon this
|
|
338
|
+
// response body unread and take theirs — either copy is the same resource.
|
|
339
|
+
if (fullBodyInflight === undefined) {
|
|
340
|
+
fullBodyInflight = response
|
|
341
|
+
.arrayBuffer()
|
|
342
|
+
.then((buffer) => {
|
|
343
|
+
const body = new Uint8Array(buffer);
|
|
344
|
+
fullBody = body;
|
|
345
|
+
return body;
|
|
346
|
+
})
|
|
347
|
+
.catch((error: unknown) => {
|
|
348
|
+
// A failed transfer must not poison every later read with a rejected promise.
|
|
349
|
+
fullBodyInflight = undefined;
|
|
350
|
+
throw error;
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
return sliceFullBody(await fullBodyInflight, offset, length);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
throw new EdfSourceError(
|
|
357
|
+
`Reading bytes ${offset}..${offset + length - 1} of ${href} failed: the server ` +
|
|
358
|
+
`answered HTTP ${response.status}. Next: check the URL, its authentication headers ` +
|
|
359
|
+
'and whether a signed URL has expired.',
|
|
360
|
+
{ offset, requestedLength: length },
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
282
364
|
return {
|
|
283
365
|
byteLength,
|
|
284
366
|
async read(offset: number, length: number, readOptions?: ReadOptions): Promise<Uint8Array> {
|
|
285
|
-
|
|
367
|
+
// The effective signal, not just the per-read one. A source-level signal is documented as
|
|
368
|
+
// "the default for every request", and honouring it only inside `attachSignal` meant it
|
|
369
|
+
// worked for a real AbortSignal and was a silent no-op for the published
|
|
370
|
+
// `AbortSignalLike` shim, which has no addEventListener to attach to.
|
|
371
|
+
const signal = readOptions?.signal ?? options?.signal;
|
|
372
|
+
throwIfSignalAborted(signal);
|
|
286
373
|
assertReadRange(offset, length, byteLength);
|
|
287
374
|
if (length === 0) return new Uint8Array(0);
|
|
288
375
|
if (fullBody !== undefined) return sliceFullBody(fullBody, offset, length);
|
|
289
376
|
const bytes = await fetchRange(offset, length, readOptions);
|
|
290
|
-
|
|
377
|
+
throwIfSignalAborted(signal);
|
|
291
378
|
return bytes;
|
|
292
379
|
},
|
|
293
380
|
};
|
package/src/io/source.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import { EdfSourceError } from '../errors.js';
|
|
15
|
-
import type { ReadOptions } from '../types.js';
|
|
15
|
+
import type { AbortSignalLike, ReadOptions } from '../types.js';
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* A misbehaving source may resolve with something that is not a byte array at all, which is
|
|
@@ -80,8 +80,47 @@ export function assertReadRange(offset: number, length: number, byteLength: numb
|
|
|
80
80
|
* on is `error.name === 'AbortError'`, so that is what this produces.
|
|
81
81
|
*/
|
|
82
82
|
export function throwIfAborted(options?: ReadOptions): void {
|
|
83
|
-
|
|
83
|
+
throwIfSignalAborted(options?.signal);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The same check against a signal that was resolved by the caller.
|
|
88
|
+
*
|
|
89
|
+
* A source can carry its own signal as well as the one passed per read, and the effective signal
|
|
90
|
+
* is `readOptions?.signal ?? sourceOptions?.signal`. That cannot be handed back to
|
|
91
|
+
* `throwIfAborted` as an object literal, because `exactOptionalPropertyTypes` refuses
|
|
92
|
+
* `{ signal: undefined }` where the property is declared optional.
|
|
93
|
+
*/
|
|
94
|
+
export function throwIfSignalAborted(signal?: AbortSignalLike): void {
|
|
95
|
+
if (signal?.aborted !== true) return;
|
|
84
96
|
const error = new Error('The read was aborted through options.signal.');
|
|
85
97
|
error.name = 'AbortError';
|
|
86
98
|
throw error;
|
|
87
99
|
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* A numeric source option, rejected rather than silently coerced when it is not a finite number.
|
|
103
|
+
*
|
|
104
|
+
* These options are typed `number`, which admits `NaN` and `Infinity`, and both arrive easily:
|
|
105
|
+
* `Number(process.env.EDFCORE_CACHE_MIB)`, `Number(searchParams.get('block'))` and any absent
|
|
106
|
+
* key in a JSON config all produce `NaN`. Left alone they do not fail loudly — `Math.max(1, NaN)`
|
|
107
|
+
* is `NaN` and every subsequent comparison against it is false, so guards written as
|
|
108
|
+
* `if (value < 1)` simply do not fire and the caller gets fabricated data or a read that never
|
|
109
|
+
* settles. Refusing at construction keeps the failure at the line that holds the bad value.
|
|
110
|
+
*
|
|
111
|
+
* A plain `RangeError`, not an `EdfError`: this is a bug in the calling code rather than a
|
|
112
|
+
* problem with the file, which is the same split `isEdfError` documents.
|
|
113
|
+
*/
|
|
114
|
+
export function requireFiniteOption(
|
|
115
|
+
value: number | undefined,
|
|
116
|
+
name: string,
|
|
117
|
+
fallback: number,
|
|
118
|
+
): number {
|
|
119
|
+
if (value === undefined) return fallback;
|
|
120
|
+
if (Number.isFinite(value)) return value;
|
|
121
|
+
throw new RangeError(
|
|
122
|
+
`options.${name} must be a finite number, but was ${String(value)}. Next: check the ` +
|
|
123
|
+
'expression that produced it — Number() on an absent environment variable, query ' +
|
|
124
|
+
'parameter or config key yields NaN.',
|
|
125
|
+
);
|
|
126
|
+
}
|
package/src/validate.ts
CHANGED
|
@@ -19,9 +19,10 @@
|
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
21
|
import { trimEdfField } from './bytes/latin1.js';
|
|
22
|
-
import { EDF_RECOMMENDED_MAX_RECORD_BYTES } from './constants.js';
|
|
22
|
+
import { DEFAULT_MAX_MATERIALIZE_BYTES, EDF_RECOMMENDED_MAX_RECORD_BYTES } from './constants.js';
|
|
23
23
|
import { decodeDigitalCounted } from './decode/digital.js';
|
|
24
24
|
import { createDiagnostic } from './diagnostics/collector.js';
|
|
25
|
+
import { EdfBudgetError } from './errors.js';
|
|
25
26
|
import { calendarDatesEqual, formatCalendarDate, isValidCalendarDate } from './header/dates.js';
|
|
26
27
|
import { signalFieldOffset } from './header/signals.js';
|
|
27
28
|
import { readRecordBytes } from './io/read.js';
|
|
@@ -55,6 +56,9 @@ export type { ObservedSignalStats, ValidateOptions, ValidationReport } from './t
|
|
|
55
56
|
const LABEL_SPEC = 'EDF+ additional specification 9 (standard texts and labels)';
|
|
56
57
|
const TIMEKEEPING_SPEC = 'EDF+ specification 2.2.1 (time keeping of data records)';
|
|
57
58
|
|
|
59
|
+
/** The sample-scan scratch buffer is an `Int32Array`, so four bytes per sample. */
|
|
60
|
+
const BYTES_PER_SCRATCH_SAMPLE = 4;
|
|
61
|
+
|
|
58
62
|
/**
|
|
59
63
|
* The signal types EDF+ additional specification 9 names.
|
|
60
64
|
*
|
|
@@ -479,8 +483,17 @@ async function traverse(
|
|
|
479
483
|
: [];
|
|
480
484
|
|
|
481
485
|
const chunkRecords = scanChunkRecords(header, options?.maxMaterializeBytes);
|
|
482
|
-
|
|
483
|
-
|
|
486
|
+
/*
|
|
487
|
+
* One scratch array for every signal and every chunk.
|
|
488
|
+
*
|
|
489
|
+
* This is normally bounded by the chunk's own byte size, because `scanChunkRecords` fits the
|
|
490
|
+
* chunk into a scan block. That bound fails for a single record larger than the whole block:
|
|
491
|
+
* the record count floors to 1 and the scratch size becomes `samplesPerRecord` unclamped, up
|
|
492
|
+
* to the 99,999,999 an 8-byte EDF field can hold — a 400 MB allocation reachable from one
|
|
493
|
+
* corrupted digit in a 512-byte file, made before any read, so no downstream check can catch
|
|
494
|
+
* it. Validation exists to be pointed at untrusted files, so it is exactly the caller who
|
|
495
|
+
* needs the budget honoured rather than a documented cap that only the read path respects.
|
|
496
|
+
*/
|
|
484
497
|
let scratch: Int32Array | undefined;
|
|
485
498
|
if (scanSamples) {
|
|
486
499
|
let maxSamplesPerRecord = 0;
|
|
@@ -490,6 +503,18 @@ async function traverse(
|
|
|
490
503
|
maxSamplesPerRecord = Math.max(maxSamplesPerRecord, signal.samplesPerRecord);
|
|
491
504
|
}
|
|
492
505
|
}
|
|
506
|
+
const scratchBytes = chunkRecords * maxSamplesPerRecord * BYTES_PER_SCRATCH_SAMPLE;
|
|
507
|
+
const budgetBytes = options?.maxMaterializeBytes ?? DEFAULT_MAX_MATERIALIZE_BYTES;
|
|
508
|
+
if (scratchBytes > budgetBytes) {
|
|
509
|
+
throw new EdfBudgetError(
|
|
510
|
+
`Scanning samples needs a ${scratchBytes}-byte scratch buffer for ${chunkRecords} ` +
|
|
511
|
+
`record(s) of up to ${maxSamplesPerRecord} samples, above the ${budgetBytes}-byte ` +
|
|
512
|
+
'maxMaterializeBytes budget, so the scan was refused before anything was allocated. ' +
|
|
513
|
+
'Next: raise options.maxMaterializeBytes, or drop scanSamples and validate the ' +
|
|
514
|
+
'header alone.',
|
|
515
|
+
{ requiredBytes: scratchBytes, budgetBytes },
|
|
516
|
+
);
|
|
517
|
+
}
|
|
493
518
|
scratch = new Int32Array(chunkRecords * maxSamplesPerRecord);
|
|
494
519
|
}
|
|
495
520
|
|