edfcore 0.6.190 → 0.6.192

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.6.190";
112
+ export declare const VERSION = "0.6.192";
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.6.190';
82
+ export const VERSION = '0.6.192';
83
83
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"digital.d.ts","sourceRoot":"","sources":["../../src/decode/digital.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AAIrE;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACzC;AA8CD;;;;;;;GAOG;AACH;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAa9F;AAmDD;;;;;;;GAOG;AACH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAcf,OAAO,SAAQ,GACd,IAAI,CAQN;AAgFD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,cAAc,CA2BhB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAEZ"}
1
+ {"version":3,"file":"digital.d.ts","sourceRoot":"","sources":["../../src/decode/digital.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAa,WAAW,EAAE,MAAM,aAAa,CAAC;AAIrE;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;CACzC;AA8CD;;;;;;;GAOG;AACH;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAa9F;AAmDD;;;;;;;GAOG;AACH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAcf,OAAO,SAAQ,GACd,IAAI,CAQN;AAgFD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,cAAc,CAmDhB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,MAAM,EACnB,GAAG,CAAC,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAEZ"}
@@ -227,6 +227,28 @@ function decodeInt24(bytes, out, plan) {
227
227
  export function decodeDigitalCounted(header, recordBytes, records, signalIndex, out, options) {
228
228
  assertDecodable(header, recordBytes, 'decodeDigital');
229
229
  const signal = signalAt(header, signalIndex);
230
+ /*
231
+ * The ANNOTATIONS CHANNEL, which this decoded into numbers.
232
+ *
233
+ * Its region holds EDF+ TAL text, and de-interleaving it as int16 or int24 produced a perfectly
234
+ * ordinary `Int32Array` — `12331, 5140, 0, 0, 0` for a conforming file, which is `+0` and `\x14`
235
+ * read as samples. `decode/physical.ts` names that outcome exactly, and refuses to call it a next
236
+ * step: "It does, and it produces numbers that look exactly like a signal — the one failure this
237
+ * package exists to prevent."
238
+ *
239
+ * Every read above this refuses it already — `resolveSignals` for `readRecords`, `readWindow` and
240
+ * `streamRecords`, and `envelope.ts` for both envelope calls — so this primitive was the one route
241
+ * left to the thing all of them exist to stop. Nothing in the package decodes an annotation region
242
+ * this way: `readTriggers` and `validateRecording` name data signals, and the region's own reader
243
+ * is `decodeAnnotations`, which takes the same bytes.
244
+ */
245
+ if (signal.kind === 'annotations') {
246
+ throw new RangeError(`decodeDigital(): signal ${signalIndex} (${JSON.stringify(signal.label)}) is this file's ` +
247
+ 'annotations channel: its region holds TAL text rather than samples, so this would have ' +
248
+ 'returned the bytes of that text as an Int32Array — numbers that look exactly like a ' +
249
+ 'signal. Next: read it with decodeAnnotations(), which takes these same record bytes, and ' +
250
+ 'pass an index from header.dataSignalIndices here.');
251
+ }
230
252
  assertRecordRange(header, recordBytes, records);
231
253
  const bytesPerSample = header.bytesPerSample;
232
254
  const samplesPerRecord = signal.samplesPerRecord;
@@ -1 +1 @@
1
- {"version":3,"file":"digital.js","sourceRoot":"","sources":["../../src/decode/digital.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"digital.js","sourceRoot":"","sources":["../../src/decode/digital.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,WAAW,EAAE,CAAC;AAMvB;;;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,CA8BxF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAG1D;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4BxD;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAKnE;AAmDD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAS9E"}
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,WAAW,EAAE,CAAC;AAMvB;;;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,CA8BxF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAG1D;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4BxD;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAKnE;AAmDD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAyC9E"}
package/dist/io/source.js CHANGED
@@ -219,8 +219,38 @@ function describeGiven(source) {
219
219
  */
220
220
  export function assertByteSource(source) {
221
221
  const candidate = source;
222
- if (typeof candidate?.read === 'function' && typeof candidate.byteLength === 'number')
223
- return;
222
+ if (typeof candidate?.read === 'function' && typeof candidate.byteLength === 'number') {
223
+ /*
224
+ * And that the number is a BYTE COUNT, which "typeof number" is not.
225
+ *
226
+ * 0.6.85 made this exact argument for `fileHandleSource` and recorded what a bad one costs: "a
227
+ * `NaN` or an absent `byteLength` disabled the range guard rather than failing: `assertReadRange`
228
+ * compares against it, every comparison against `NaN` is false", and "the failure then surfaced
229
+ * in `parseHeader` — which does guard it — blaming a caller who passed it the right arguments".
230
+ *
231
+ * That fix went into one adapter. This is the boundary every source crosses, and the one shape
232
+ * no adapter can cover: a `ByteSource` the CALLER wrote, which `api-sources.md` documents
233
+ * writing. A `NaN` from a `Content-Length` header, a `-1` from a stat that failed, a fractional
234
+ * size from a division — each built a source, and the first read then reported
235
+ * `ByteSource.read(offset 0, length NaN) resolved with 0 bytes. A ByteSource must resolve with
236
+ * exactly the requested number of bytes or reject`. That accuses the caller's `read()` of
237
+ * breaking its contract when it answered correctly for the length edfcore computed and handed
238
+ * it.
239
+ */
240
+ if (Number.isSafeInteger(candidate.byteLength) && candidate.byteLength >= 0)
241
+ return;
242
+ /*
243
+ * A plain `RangeError`, not an `EdfSourceError`, and that is the load-bearing half.
244
+ * `inspect-rethrows-caller-bugs.test.ts` pins the rule for exactly this class: `inspectEdf`
245
+ * turns an `EdfError` into a diagnostic about the FILE, so a mistake in the arguments has to
246
+ * stay outside the family or a caller's triage absorbs it. The bytes here are usually a
247
+ * perfectly good recording.
248
+ */
249
+ throw new RangeError(`source.byteLength must be a non-negative safe integer, and this ByteSource advertises ` +
250
+ `${describeValue(candidate.byteLength)}. Every offset and length edfcore computes is ` +
251
+ 'measured against it, so the first read asked for a range derived from it and then blamed ' +
252
+ 'read() for the answer. Next: give the source the real size of the file in bytes.');
253
+ }
224
254
  const received = describeGiven(source);
225
255
  throw new EdfSourceError(`a ByteSource is needed — an object with a byteLength and a read() — and received ` +
226
256
  `${received}. Next: ${adapterFor(source)}.`, { offset: 0, requestedLength: 0 });
@@ -1 +1 @@
1
- {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"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"}
package/docs/CHANGELOG.md CHANGED
@@ -6,6 +6,36 @@ alone does not tell you whether you were affected.
6
6
  edfcore is pre-1.0. Patch releases have carried behaviour changes where the old behaviour was a
7
7
  defect; those are called out below.
8
8
 
9
+ ## 0.6.192
10
+
11
+ - **Fixed** a `ByteSource` being accepted with a `byteLength` that is not a byte count. The guard
12
+ checks it structurally — "a `read` function and a numeric `byteLength`" — because `api-sources.md`
13
+ documents writing your own, and numeric is not the same as usable: `NaN`, `-1`, `Infinity` and
14
+ `1.5` are all numbers.
15
+ - Each built a source, and the first read then answered `ByteSource.read(offset 0, length NaN)
16
+ resolved with 0 bytes. A ByteSource must resolve with exactly the requested number of bytes or
17
+ reject` — which accuses the caller's `read()` of breaking its contract when it answered correctly
18
+ for a length edfcore computed and handed it.
19
+ - 0.6.85 made this argument for `fileHandleSource` and recorded the same cost: a `NaN` "disabled the
20
+ range guard rather than failing", and the failure surfaced elsewhere "blaming a caller who passed
21
+ it the right arguments". That fix went into one adapter; this is the boundary every source crosses,
22
+ including the one no adapter can cover.
23
+ - A plain `RangeError`, not an `EdfSourceError`: `inspectEdf` turns an `EdfError` into a diagnostic
24
+ about the FILE, and the bytes here are usually a perfectly good recording.
25
+
26
+ ## 0.6.191
27
+
28
+ - **Fixed** `decodeDigital` decoding the annotations channel into numbers. Its region holds EDF+ TAL
29
+ text, and de-interleaving it as int16 produced an ordinary `Int32Array` — `12331, 5140, 0, 0, 0` on
30
+ a conforming file, the bytes of `+0` and the TAL separator read as samples — with no error and
31
+ nothing distinguishing them from a recorded channel.
32
+ - Every reader above it already refuses this: `resolveSignals` for `readRecords`, `readWindow` and
33
+ `streamRecords`, and `envelope.ts` for both envelope calls. `decode/physical.ts` even declines to
34
+ offer `decodeDigital` as the fallback for such a signal, in as many words — "It does, and it
35
+ produces numbers that look exactly like a signal — the one failure this package exists to prevent."
36
+ - So the primitive was the one route left to it. Nothing in the package decodes an annotation region
37
+ this way, and the refusal names `decodeAnnotations`, which takes the same record bytes.
38
+
9
39
  ## 0.6.190
10
40
 
11
41
  - **Fixed** `declaredDurationSeconds` dying on the record index. The guard 0.6.108 added tests
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "edfcore",
3
- "version": "0.6.190",
3
+ "version": "0.6.192",
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.6.190';
96
+ export const VERSION = '0.6.192';
@@ -321,6 +321,30 @@ export function decodeDigitalCounted(
321
321
  ): DecodedDigital {
322
322
  assertDecodable(header, recordBytes, 'decodeDigital');
323
323
  const signal = signalAt(header, signalIndex);
324
+ /*
325
+ * The ANNOTATIONS CHANNEL, which this decoded into numbers.
326
+ *
327
+ * Its region holds EDF+ TAL text, and de-interleaving it as int16 or int24 produced a perfectly
328
+ * ordinary `Int32Array` — `12331, 5140, 0, 0, 0` for a conforming file, which is `+0` and `\x14`
329
+ * read as samples. `decode/physical.ts` names that outcome exactly, and refuses to call it a next
330
+ * step: "It does, and it produces numbers that look exactly like a signal — the one failure this
331
+ * package exists to prevent."
332
+ *
333
+ * Every read above this refuses it already — `resolveSignals` for `readRecords`, `readWindow` and
334
+ * `streamRecords`, and `envelope.ts` for both envelope calls — so this primitive was the one route
335
+ * left to the thing all of them exist to stop. Nothing in the package decodes an annotation region
336
+ * this way: `readTriggers` and `validateRecording` name data signals, and the region's own reader
337
+ * is `decodeAnnotations`, which takes the same bytes.
338
+ */
339
+ if (signal.kind === 'annotations') {
340
+ throw new RangeError(
341
+ `decodeDigital(): signal ${signalIndex} (${JSON.stringify(signal.label)}) is this file's ` +
342
+ 'annotations channel: its region holds TAL text rather than samples, so this would have ' +
343
+ 'returned the bytes of that text as an Int32Array — numbers that look exactly like a ' +
344
+ 'signal. Next: read it with decodeAnnotations(), which takes these same record bytes, and ' +
345
+ 'pass an index from header.dataSignalIndices here.',
346
+ );
347
+ }
324
348
  assertRecordRange(header, recordBytes, records);
325
349
 
326
350
  const bytesPerSample = header.bytesPerSample;
package/src/io/source.ts CHANGED
@@ -252,7 +252,39 @@ function describeGiven(source: unknown): string {
252
252
  */
253
253
  export function assertByteSource(source: unknown): asserts source is ByteSource {
254
254
  const candidate = source as { read?: unknown; byteLength?: unknown } | null | undefined;
255
- if (typeof candidate?.read === 'function' && typeof candidate.byteLength === 'number') return;
255
+ if (typeof candidate?.read === 'function' && typeof candidate.byteLength === 'number') {
256
+ /*
257
+ * And that the number is a BYTE COUNT, which "typeof number" is not.
258
+ *
259
+ * 0.6.85 made this exact argument for `fileHandleSource` and recorded what a bad one costs: "a
260
+ * `NaN` or an absent `byteLength` disabled the range guard rather than failing: `assertReadRange`
261
+ * compares against it, every comparison against `NaN` is false", and "the failure then surfaced
262
+ * in `parseHeader` — which does guard it — blaming a caller who passed it the right arguments".
263
+ *
264
+ * That fix went into one adapter. This is the boundary every source crosses, and the one shape
265
+ * no adapter can cover: a `ByteSource` the CALLER wrote, which `api-sources.md` documents
266
+ * writing. A `NaN` from a `Content-Length` header, a `-1` from a stat that failed, a fractional
267
+ * size from a division — each built a source, and the first read then reported
268
+ * `ByteSource.read(offset 0, length NaN) resolved with 0 bytes. A ByteSource must resolve with
269
+ * exactly the requested number of bytes or reject`. That accuses the caller's `read()` of
270
+ * breaking its contract when it answered correctly for the length edfcore computed and handed
271
+ * it.
272
+ */
273
+ if (Number.isSafeInteger(candidate.byteLength) && (candidate.byteLength as number) >= 0) return;
274
+ /*
275
+ * A plain `RangeError`, not an `EdfSourceError`, and that is the load-bearing half.
276
+ * `inspect-rethrows-caller-bugs.test.ts` pins the rule for exactly this class: `inspectEdf`
277
+ * turns an `EdfError` into a diagnostic about the FILE, so a mistake in the arguments has to
278
+ * stay outside the family or a caller's triage absorbs it. The bytes here are usually a
279
+ * perfectly good recording.
280
+ */
281
+ throw new RangeError(
282
+ `source.byteLength must be a non-negative safe integer, and this ByteSource advertises ` +
283
+ `${describeValue(candidate.byteLength)}. Every offset and length edfcore computes is ` +
284
+ 'measured against it, so the first read asked for a range derived from it and then blamed ' +
285
+ 'read() for the answer. Next: give the source the real size of the file in bytes.',
286
+ );
287
+ }
256
288
  const received = describeGiven(source);
257
289
  throw new EdfSourceError(
258
290
  `a ByteSource is needed — an object with a byteLength and a read() — and received ` +