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.
@@ -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.2";
112
+ export declare const VERSION = "0.1.3";
113
113
  //# sourceMappingURL=constants.d.ts.map
package/dist/constants.js CHANGED
@@ -79,5 +79,5 @@ export const SIGNAL_FIELD_BLOCK_OFFSETS = {
79
79
  reserved: 224,
80
80
  };
81
81
  /** Published package version. Kept in sync with package.json by a test. */
82
- export const VERSION = '0.1.2';
82
+ export const VERSION = '0.1.3';
83
83
  //# sourceMappingURL=constants.js.map
@@ -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,CAmGnF"}
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 ?? DEFAULT_MAX_BYTES));
35
- const requestedBlockBytes = Math.max(1, Math.floor(options?.blockBytes ?? DEFAULT_BLOCK_BYTES));
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);
@@ -1 +1 @@
1
- {"version":3,"file":"cached.js","sourceRoot":"","sources":["../../src/io/cached.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cached.js","sourceRoot":"","sources":["../../src/io/cached.ts"],"names":[],"mappings":"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"}
@@ -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;AA0MrB,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,CAgErB"}
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, throwIfAborted } from './source.js';
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 `throwIfAborted` polls around 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 ?? DEFAULT_MAX_CONCURRENCY)));
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
- throwIfAborted(readOptions);
183
- const response = await request(fetchImpl, href, headers, 'GET', signal);
184
- if (response.status === HTTP_PARTIAL_CONTENT) {
185
- const bytes = new Uint8Array(await response.arrayBuffer());
186
- return assertExactRead(bytes, offset, length);
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
- throwIfAborted(readOptions);
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
- throwIfAborted(readOptions);
289
+ throwIfSignalAborted(signal);
217
290
  return bytes;
218
291
  },
219
292
  };
@@ -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,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/E,oFAAoF;AACpF,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAElC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,OAAO,GAAG,GAAG,CAAC;AAcpB,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,OAAO;QACL,KAAK,CAAC,OAAO;YACX,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC,CAAC,CAAC;YACH,uFAAuF;QACzF,CAAC;QACD,OAAO;YACL,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,QAA0B,EAAE,IAAY;IACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAmB;IAClD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,oFAAoF;AACpF,SAAS,qBAAqB,CAAC,KAAoB;IACjD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,SAAS,CAAC,MAAc;IAC/B,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG,CAAC;AACvC,CAAC;AAED,SAAS,MAAM,CAAC,GAAuC;IACrD,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CAAC,OAAsC;IAC1D,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK,CAAC;IAChC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,0FAA0F;IAC1F,MAAM,OAAO,GAAI,UAAoC,CAAC,KAAK,CAAC;IAC5D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IAC1C,MAAM,IAAI,cAAc,CACtB,4FAA4F;QAC1F,uFAAuF;QACvF,YAAY,EACd,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAClC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,YAAY,CAAC,IAAqB,EAAE,MAAmC;IAC9E,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO;IACjC,IAAI,OAAQ,MAAyC,CAAC,gBAAgB,KAAK,UAAU;QAAE,OAAO;IAC7F,IAA6B,CAAC,MAAM,GAAG,MAAM,CAAC;AACjD,CAAC;AAED,SAAS,OAAO,CACd,SAAoB,EACpB,IAAY,EACZ,OAA+B,EAC/B,MAAsB,EACtB,MAAmC;IAEnC,MAAM,IAAI,GAAoB,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClD,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3B,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,MAAc,EAAE,MAAc;IACrE,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC;IACrC,OAAO,IAAI,cAAc,CACvB,uBAAuB,OAAO,kBAAkB,oBAAoB,uBAAuB;QACzF,eAAe,MAAM,IAAI,QAAQ,OAAO,IAAI,0CAA0C;QACtF,sFAAsF;QACtF,uFAAuF;QACvF,qFAAqF;QACrF,SAAS,EACX,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,CACpC,CAAC;AACJ,CAAC;AASD,KAAK,UAAU,aAAa,CAC1B,SAAoB,EACpB,IAAY,EACZ,WAAmC,EACnC,OAAsC;IAEtC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAE/B,MAAM,QAAQ,GAAG,OAAO,EAAE,UAAU,CAAC;IACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,cAAc,CACtB,6CAA6C,QAAQ,gCAAgC;gBACnF,+EAA+E;gBAC/E,uBAAuB,EACzB,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAClC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACnD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACzE,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;YACzE,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC3E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yFAAyF;QACzF,kDAAkD;IACpD,CAAC;IAED,MAAM,YAAY,GAAG,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAE1E,IAAI,KAAK,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,qBAAqB,CAAC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC;QACtE,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACzE,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACpC,uFAAuF;QACvF,mEAAmE;QACnE,IAAI,OAAO,EAAE,iBAAiB,KAAK,IAAI;YAAE,MAAM,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/C,CAAC;SAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,cAAc,CACtB,+BAA+B,IAAI,8BAA8B,KAAK,CAAC,MAAM,QAAQ;YACnF,mFAAmF,EACrF,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAClC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,cAAc,CACtB,gDAAgD,IAAI,4BAA4B;QAC9E,0FAA0F;QAC1F,0FAA0F;QAC1F,8DAA8D,EAChE,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAClC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAuC,EACvC,OAA2B;IAE3B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,WAAW,GAA2B,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;IACpE,MAAM,IAAI,GAAG,UAAU,CACrB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,IAAI,uBAAuB,CAAC,CAAC,CAC5E,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;IACvC,uFAAuF;IACvF,IAAI,QAAQ,GAA2B,QAAQ,CAAC,IAAI,CAAC;IAErD,KAAK,UAAU,UAAU,CACvB,MAAc,EACd,MAAc,EACd,WAAoC;QAEpC,MAAM,MAAM,GAAG,WAAW,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,CAAC;QACtD,yFAAyF;QACzF,MAAM,OAAO,GAAG,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,SAAS,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;QAEpF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,cAAc,CAAC,WAAW,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAExE,IAAI,QAAQ,CAAC,MAAM,KAAK,oBAAoB,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC3D,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAChC,IAAI,OAAO,EAAE,iBAAiB,KAAK,IAAI;oBAAE,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBACvF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1D,qFAAqF;gBACrF,wDAAwD;gBACxD,IAAI,QAAQ,KAAK,SAAS;oBAAE,QAAQ,GAAG,IAAI,CAAC;gBAC5C,OAAO,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;YAED,MAAM,IAAI,cAAc,CACtB,iBAAiB,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,IAAI,sBAAsB;gBAC9E,iBAAiB,QAAQ,CAAC,MAAM,oDAAoD;gBACpF,uCAAuC,EACzC,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,CACpC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO;QACL,UAAU;QACV,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,MAAc,EAAE,WAAyB;YAClE,cAAc,CAAC,WAAW,CAAC,CAAC;YAC5B,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAC5C,IAAI,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,QAAQ,KAAK,SAAS;gBAAE,OAAO,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC3E,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YAC5D,cAAc,CAAC,WAAW,CAAC,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,SAAS,aAAa,CAAC,IAAgB,EAAE,MAAc,EAAE,MAAc;IACrE,OAAO,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9E,CAAC"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/io/http.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -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;AAY/C;;;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,CAK1D"}
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
- if (options?.signal?.aborted !== true)
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
@@ -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,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO;IAC9C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,MAAM,KAAK,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAaH,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;AA8RzF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,aAAa,EAAE,CAe1E;AAwLD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,gBAAgB,CAAC,CA+C3B"}
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
- // One scratch array for every signal and every chunk. Bounded by chunkRecords *
375
- // max(samplesPerRecord) * 4 bytes, which is at most twice the chunk's own byte size.
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;
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,6BAA6B,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAwB/D,MAAM,UAAU,GAAG,6DAA6D,CAAC;AACjF,MAAM,gBAAgB,GAAG,yDAAyD,CAAC;AAEnF,mFAAmF;AACnF,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC;IACxD,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,IAAI;IACJ,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;CACR,CAAC,CAAC;AAEH,oEAAoE;AACpE,MAAM,qBAAqB,GAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE5E,sFAAsF;AACtF,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;AAEjG,SAAS,WAAW,CAAC,MAAiB,EAAE,MAAiB;IACvD,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,eAAe,CAAC,MAAiB,EAAE,IAAqB;IAC/D,IAAI,MAAM,CAAC,gBAAgB,IAAI,gCAAgC;QAAE,OAAO;IACxE,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;QACf,IAAI,EAAE,+BAA+B;QACrC,OAAO,EACL,oBAAoB,MAAM,CAAC,gBAAgB,oBAAoB;YAC/D,GAAG,gCAAgC,sDAAsD;YACzF,yFAAyF;YACzF,sFAAsF;YACtF,kDAAkD;QACpD,KAAK,EAAE,kBAAkB;QACzB,QAAQ,EAAE,WAAW,gCAAgC,QAAQ;QAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,gBAAgB,QAAQ;QAC1C,aAAa,EAAE,iCAAiC;KACjD,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAiB,EAAE,MAAiB,EAAE,IAAqB;IACvF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,SAAS,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9F,OAAO;IACT,CAAC;IACD,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;QACf,IAAI,EAAE,gCAAgC;QACtC,OAAO,EACL,UAAU,MAAM,CAAC,KAAK,gBAAgB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB;YACvF,4EAA4E;YAC5E,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,UAAU,gCAAgC;YACtF,yFAAyF;YACzF,sCAAsC;QACxC,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;QACvC,UAAU,EAAE,EAAE;QACd,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK;QACrB,QAAQ,EAAE,sCAAsC;QAChD,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,WAAW,EAAE,MAAM,CAAC,KAAK;QACzB,aAAa,EAAE,UAAU;KAC1B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAiB,EAAE,MAAiB,EAAE,IAAqB;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACxC,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CACjE,CAAC;IACF,IAAI,UAAU;QAAE,OAAO;IAEvB,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;QACf,IAAI,EAAE,4BAA4B;QAClC,OAAO,EACL,oCAAoC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;YACxF,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4CAA4C;YACnE,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,4CAA4C;YAC9E,GAAG,UAAU,2EAA2E;YACxF,kEAAkE;QACpE,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,iBAAiB,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QAClF,UAAU,EAAE,EAAE;QACd,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY;QAC5B,QAAQ,EAAE,gCAAgC;QAC1C,MAAM,EAAE,IAAI;QACZ,WAAW,EAAE,MAAM,CAAC,KAAK;QACzB,aAAa,EAAE,UAAU;KAC1B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAiB,EAAE,MAAiB,EAAE,IAAqB;IAClF,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO;IAC7C,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;QACf,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EACL,iCAAiC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO;YACrF,iFAAiF;YACjF,eAAe,UAAU,8DAA8D;YACvF,2DAA2D;QAC7D,KAAK,EAAE,gBAAgB;QACvB,UAAU,EAAE,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;QACpF,UAAU,EAAE,EAAE;QACd,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,cAAc;QAC9B,QAAQ,EAAE,mDAAmD;QAC7D,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,MAAM,CAAC,KAAK;QACzB,aAAa,EAAE,UAAU;KAC1B,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAiB,EAAE,IAAqB;IACnE,0FAA0F;IAC1F,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO;IAE1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;YACf,IAAI,EAAE,0BAA0B;YAChC,OAAO,EACL,mCAAmC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI;gBACvF,sFAAsF;gBACtF,gFAAgF;gBAChF,uFAAuF;gBACvF,kFAAkF;YACpF,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG;YACvB,QAAQ,EAAE,2CAA2C;YACrD,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;YACxC,aAAa,EAAE,gEAAgE;SAChF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;YACf,IAAI,EAAE,4BAA4B;YAClC,OAAO,EACL,oCAAoC;gBACpC,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,8BAA8B;gBACnF,kFAAkF;gBAClF,wFAAwF;gBACxF,wFAAwF;gBACxF,oEAAoE;YACtE,KAAK,EAAE,aAAa;YACpB,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG;YACzB,QAAQ,EAAE,iFAAiF;YAC3F,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;YAC1C,aAAa,EAAE,kEAAkE;SAClF,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,SAAS,YAAY,CAAC,CAAkB,EAAE,CAAkB;IAC1D,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;IAC9C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;IAClD,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AACvB,CAAC;AAED,SAAS,UAAU,CAAC,MAAiB,EAAE,IAAqB;IAC1D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAEtC,IAAI,SAAS,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;YACf,IAAI,EAAE,kBAAkB;YACxB,OAAO,EACL,0BAA0B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,WAAW;gBACvF,kFAAkF;gBAClF,8EAA8E;gBAC9E,8EAA8E;gBAC9E,gEAAgE;YAClE,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,CAAC;YACb,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS;YACzB,QAAQ,EAAE,mEAAmE;YAC7E,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAC1C,aAAa,EAAE,gDAAgD;SAChE,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;IACxC,MAAM,eAAe,GAAG,SAAS,CAAC,eAAe,CAAC;IAClD,IACE,UAAU,KAAK,SAAS;QACxB,eAAe,KAAK,SAAS;QAC7B,CAAC,kBAAkB,CAAC,UAAU,EAAE,eAAe,CAAC,EAChD,CAAC;QACD,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;YACf,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EACL,mCAAmC,kBAAkB,CAAC,UAAU,CAAC,qBAAqB;gBACtF,iCAAiC,kBAAkB,CAAC,eAAe,CAAC,oBAAoB;gBACxF,iFAAiF;gBACjF,mFAAmF;gBACnF,sCAAsC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ;YACpF,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,CAAC;YACb,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS;YACzB,QAAQ,EAAE,kBAAkB,CAAC,eAAe,CAAC;YAC7C,MAAM,EAAE,kBAAkB,CAAC,UAAU,CAAC;YACtC,aAAa,EAAE,kEAAkE;SAClF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC;IACxC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;YACf,IAAI,EAAE,kBAAkB;YACxB,OAAO,EACL,kCAAkC,kBAAkB,CAAC,QAAQ,CAAC,uBAAuB;gBACrF,oFAAoF;gBACpF,uFAAuF;gBACvF,8DAA8D;YAChE,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE,GAAG;YACf,UAAU,EAAE,CAAC;YACb,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS;YACzB,QAAQ,EAAE,0BAA0B;YACpC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC;YACpC,aAAa,EAAE,gDAAgD;SAChE,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACpC,IAAI,SAAS,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/F,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;YACf,IAAI,EAAE,kBAAkB;YACxB,OAAO,EACL,yBAAyB,kBAAkB,CAAC,SAAS,CAAC,gCAAgC;gBACtF,QAAQ,kBAAkB,CAAC,QAAQ,CAAC,oDAAoD;gBACxF,mFAAmF;gBACnF,+EAA+E;gBAC/E,wCAAwC;YAC1C,KAAK,EAAE,WAAW;YAClB,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,EAAE;YACd,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG;YACvB,QAAQ,EAAE,4BAA4B,kBAAkB,CAAC,QAAQ,CAAC,EAAE;YACpE,MAAM,EAAE,kBAAkB,CAAC,SAAS,CAAC;YACrC,aAAa,EAAE,gEAAgE;SAChF,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,WAAW,GAAoB,EAAE,CAAC;IAExC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACrC,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAClD,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/C,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/C,CAAC;IACD,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAWD,SAAS,aAAa,CAAC,WAA6B;IAClD,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,KAAK,CAAC,CAAC;IAC5C,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,+EAA+E;QAC/E,6FAA6F;QAC7F,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG;QAC/C,kBAAkB,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG;QAC/C,sBAAsB,EAAE,WAAW,CAAC,sBAAsB;QAC1D,WAAW,EAAE,WAAW,CAAC,WAAW;KACrC,CAAC;AACJ,CAAC;AAED,2EAA2E;AAC3E,SAAS,WAAW,CAClB,KAAiC,EACjC,WAAmB;IAEnB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CACtB,MAAiB,EACjB,YAAoB,EACpB,IAAuB,EACvB,IAAqB;IAErB,IAAI,MAAM,CAAC,UAAU,KAAK,YAAY,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;YACf,IAAI,EAAE,kCAAkC;YACxC,OAAO,EACL,iFAAiF;gBACjF,GAAG,YAAY,2BAA2B,IAAI,CAAC,MAAM,mCAAmC;gBACxF,sFAAsF;gBACtF,wFAAwF;gBACxF,uFAAuF;gBACvF,qCAAqC;YACvC,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE,sBAAsB;YAChC,MAAM,EAAE,GAAG,YAAY,WAAW;YAClC,aAAa,EAAE,gBAAgB;SAChC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,eAAe,IAAI,CAAC;YAAE,SAAS;QACvC,IAAI,CAAC,IAAI,CACP,gBAAgB,CAAC;YACf,IAAI,EAAE,gCAAgC;YACtC,OAAO,EACL,WAAW,GAAG,CAAC,iBAAiB,cAAc,GAAG,CAAC,UAAU,qBAAqB;gBACjF,GAAG,GAAG,CAAC,kBAAkB,YAAY,GAAG,CAAC,YAAY,kCAAkC;gBACvF,WAAW,CAAC,GAAG,CAAC,eAAe,uDAAuD;gBACtF,sFAAsF;gBACtF,qFAAqF;gBACrF,6DAA6D;YAC/D,KAAK,EAAE,iBAAiB;YACxB,QAAQ,EAAE,uBAAuB,GAAG,CAAC,YAAY,IAAI;YACrD,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,IAAI;YAC7B,aAAa,EAAE,gBAAgB;SAChC,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAUD;;;;;;;;;;GAUG;AACH,KAAK,UAAU,QAAQ,CACrB,SAAuB,EACvB,OAAoC,EACpC,WAAoB;IAEpB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAoB,EAAE,CAAC;IAExC,MAAM,YAAY,GAAuB,WAAW;QAClD,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC7C,WAAW;YACX,GAAG,EAAE,MAAM,CAAC,iBAAiB;YAC7B,GAAG,EAAE,MAAM,CAAC,iBAAiB;YAC7B,sBAAsB,EAAE,CAAC;YACzB,WAAW,EAAE,CAAC;SACf,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAC5E;;;;;;;;;;OAUG;IACH,IAAI,OAA+B,CAAC;IACpC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,mBAAmB,GAAG,CAAC,CAAC;QAC5B,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACvD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QACD,MAAM,YAAY,GAAG,YAAY,GAAG,mBAAmB,GAAG,wBAAwB,CAAC;QACnF,MAAM,WAAW,GAAG,OAAO,EAAE,mBAAmB,IAAI,6BAA6B,CAAC;QAClF,IAAI,YAAY,GAAG,WAAW,EAAE,CAAC;YAC/B,MAAM,IAAI,cAAc,CACtB,4BAA4B,YAAY,4BAA4B,YAAY,GAAG;gBACjF,sBAAsB,mBAAmB,uBAAuB,WAAW,QAAQ;gBACnF,qFAAqF;gBACrF,gFAAgF;gBAChF,eAAe,EACjB,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,CAC7C,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,IAAI,UAAU,CAAC,YAAY,GAAG,mBAAmB,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,cAAc,GAAG,WAAW,EAAE,CAAC;QACpC,MAAM,OAAO,GAAgB;YAC3B,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,GAAG,cAAc,CAAC;SAC5D,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtE,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;QAE1B,0FAA0F;QAC1F,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACpD,WAAW,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAEzC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,oBAAoB,CAClC,MAAM,EACN,KAAK,EACL,OAAO,EACP,WAAW,CAAC,WAAW,EACvB,OAAO,EACP,OAAO,CACR,CAAC;YACF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,8EAA8E;gBAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;gBAC1B,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG;oBAAE,WAAW,CAAC,GAAG,GAAG,KAAK,CAAC;gBACrD,IAAI,KAAK,GAAG,WAAW,CAAC,GAAG;oBAAE,WAAW,CAAC,GAAG,GAAG,KAAK,CAAC;YACvD,CAAC;YACD,WAAW,CAAC,sBAAsB,IAAI,OAAO,CAAC,sBAAsB,CAAC;YACrE,WAAW,CAAC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;QAC5C,CAAC;QAED,cAAc,IAAI,OAAO,CAAC,KAAK,CAAC;QAChC,OAAO,EAAE,UAAU,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,MAAM;QACN,WAAW;QACX,cAAc;QACd,SAAS;QACT,WAAW,EAAE,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC;KAC7C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAuB,EACvB,OAAyB;IAEzB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,mBAAmB,GAAG,MAAM,CAAC,uBAAuB,CAAC,MAAM,KAAK,CAAC,CAAC;IAExE,MAAM,WAAW,GAAoB;QACnC,GAAG,MAAM,CAAC,WAAW;QACrB,GAAG,cAAc,CAAC,MAAM,CAAC;QACzB,GAAG,QAAQ,CAAC,WAAW;KACxB,CAAC;IAEF,MAAM,cAAc,GAAG,QAAQ,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC;IACtE,MAAM,SAAS,GACb,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,IAAI,SAAS,KAAK,SAAS;QAAE,WAAW,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IAExE,IAAI,YAAoB,CAAC;IACzB,IAAI,IAAuB,CAAC;IAC5B,IAAI,QAAQ,EAAE,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACpE,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,yBAAyB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,YAAY,GAAG,iBAAiB,CACpC,SAAS,CAAC,MAAM,EAChB,MAAM,CAAC,mBAAmB,EAC1B,QAAQ,CAAC,gBAAgB,CAC1B,CAAC;QACF,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,8FAA8F;QAC9F,mFAAmF;QACnF,YAAY,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC;IACD,eAAe,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAEzD,OAAO;QACL,EAAE,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC;QACtE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;QACvC,cAAc,EAAE,SAAS,EAAE,cAAc,IAAI,CAAC;QAC9C,SAAS,EAAE,SAAS,EAAE,SAAS,IAAI,CAAC;QACpC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,IAAI,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edfcore",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Modern, typed, zero-dependency reader for EDF, EDF+, BDF and BDF+ biosignal files. Works in browsers and Node with true random access.",
5
5
  "keywords": [
6
6
  "edf",
package/src/constants.ts CHANGED
@@ -93,4 +93,4 @@ export const SIGNAL_FIELD_BLOCK_OFFSETS = {
93
93
  } as const;
94
94
 
95
95
  /** Published package version. Kept in sync with package.json by a test. */
96
- export const VERSION = '0.1.2';
96
+ export const VERSION = '0.1.3';
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(0, Math.floor(options?.maxBytes ?? DEFAULT_MAX_BYTES));
40
- const requestedBlockBytes = Math.max(1, Math.floor(options?.blockBytes ?? DEFAULT_BLOCK_BYTES));
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 { assertExactRead, assertReadRange, throwIfAborted } from './source.js';
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 `throwIfAborted` polls around 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(1, Math.floor(options?.maxConcurrency ?? DEFAULT_MAX_CONCURRENCY)),
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
- throwIfAborted(readOptions);
255
- const response = await request(fetchImpl, href, headers, 'GET', signal);
256
-
257
- if (response.status === HTTP_PARTIAL_CONTENT) {
258
- const bytes = new Uint8Array(await response.arrayBuffer());
259
- return assertExactRead(bytes, offset, length);
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
- if (response.status === HTTP_OK) {
263
- if (options?.allowFullDownload !== true) throw rangeIgnoredError(href, offset, length);
264
- const body = new Uint8Array(await response.arrayBuffer());
265
- // A concurrent read may have won the race; either copy is the same resource, so keep
266
- // whichever landed first and let this one be collected.
267
- if (fullBody === undefined) fullBody = body;
268
- return sliceFullBody(fullBody, offset, length);
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
- throw new EdfSourceError(
272
- `Reading bytes ${offset}..${offset + length - 1} of ${href} failed: the server ` +
273
- `answered HTTP ${response.status}. Next: check the URL, its authentication headers ` +
274
- 'and whether a signed URL has expired.',
275
- { offset, requestedLength: length },
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
- throwIfAborted(readOptions);
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
- throwIfAborted(readOptions);
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
- if (options?.signal?.aborted !== true) return;
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
- // One scratch array for every signal and every chunk. Bounded by chunkRecords *
483
- // max(samplesPerRecord) * 4 bytes, which is at most twice the chunk's own byte size.
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