edfcore 0.6.103 → 0.6.105
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/decode/physical.d.ts +0 -13
- package/dist/decode/physical.d.ts.map +1 -1
- package/dist/decode/physical.js +27 -0
- package/dist/decode/physical.js.map +1 -1
- package/dist/io/read.d.ts.map +1 -1
- package/dist/io/read.js +8 -1
- package/dist/io/read.js.map +1 -1
- package/docs/CHANGELOG.md +25 -0
- package/package.json +1 -1
- package/src/constants.ts +1 -1
- package/src/decode/physical.ts +32 -1
- package/src/io/read.ts +8 -1
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.6.
|
|
112
|
+
export declare const VERSION = "0.6.105";
|
|
113
113
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.js
CHANGED
|
@@ -30,19 +30,6 @@ export declare function scalingError(signal: EdfSignal, tail?: {
|
|
|
30
30
|
readonly consequence?: string;
|
|
31
31
|
readonly nextStep?: string;
|
|
32
32
|
}): EdfScalingError;
|
|
33
|
-
/**
|
|
34
|
-
* `physical = bitValue * (offset + digital)`, in float64 throughout.
|
|
35
|
-
*
|
|
36
|
-
* THIS EXPRESSION IS PINNED AND MUST NOT BE "SIMPLIFIED". It is numerically worse than
|
|
37
|
-
* `physicalMinimum + (digital - digitalMinimum) * gain`, and that is not an accident: it is
|
|
38
|
-
* EDFlib's exact form, kept verbatim so edfcore reproduces pyEDFlib/EDFlib float64 output
|
|
39
|
-
* bit for bit. The two forms disagree by up to ~9.3e-10 LSB — ten orders of magnitude below
|
|
40
|
-
* the quantisation floor, and on asymmetric ranges they differ on nearly half the samples by
|
|
41
|
-
* one ULP. Rewriting this line breaks the golden-value tests, and rightly so.
|
|
42
|
-
*
|
|
43
|
-
* Throws `EdfScalingError` when `signal.scale` is `undefined`. edfcore never fabricates a gain,
|
|
44
|
-
* and `decodeDigital` keeps working on such a signal.
|
|
45
|
-
*/
|
|
46
33
|
export declare function toPhysical(signal: EdfSignal, digital: ArrayLike<number>, out?: Float64Array, options?: MaterializeOptions): Float64Array;
|
|
47
34
|
/**
|
|
48
35
|
* The signal's declared physical bounds, in ascending order.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"physical.d.ts","sourceRoot":"","sources":["../../src/decode/physical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAkB,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"physical.d.ts","sourceRoot":"","sources":["../../src/decode/physical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAkB,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/D,OAAO,KAAK,EAAqC,SAAS,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAiKvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACnE,eAAe,CAkBjB;AAiGD,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAC1B,GAAG,CAAC,EAAE,YAAY,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,YAAY,CAcd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG;IAClD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAcA;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,UAAU,EACnB,GAAG,CAAC,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,UAAU,CAuBZ"}
|
package/dist/decode/physical.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { EdfBudgetError, EdfScalingError } from '../errors.js';
|
|
12
12
|
import { resolveMaterializeBudget } from '../options.js';
|
|
13
|
+
import { describeValue } from '../text/describe.js';
|
|
13
14
|
const BYTES_PER_FLOAT64 = 8;
|
|
14
15
|
const BYTES_PER_INT32 = 4;
|
|
15
16
|
/** The physical dimension that marks a log-compressed channel (EDFlib `edffloat.html`). */
|
|
@@ -209,7 +210,31 @@ function resolveInt32Out(out, length, options) {
|
|
|
209
210
|
* Throws `EdfScalingError` when `signal.scale` is `undefined`. edfcore never fabricates a gain,
|
|
210
211
|
* and `decodeDigital` keeps working on such a signal.
|
|
211
212
|
*/
|
|
213
|
+
/**
|
|
214
|
+
* The SIGNAL, before any field of it is read.
|
|
215
|
+
*
|
|
216
|
+
* `EdfChunkSignal` is the other per-signal shape and it is the one a reader has in hand after a
|
|
217
|
+
* read, so `toPhysical(chunk.signals[0], chunk.signals[0].digital)` is the call the arguments
|
|
218
|
+
* suggest. It has no `scale`, so `toPhysical` took the no-gain branch and `scalingError` then read
|
|
219
|
+
* `signal.raw.digitalMinimum` off it — V8's `Cannot read properties of undefined`, thrown from
|
|
220
|
+
* inside the builder of the error that was meant to explain the problem.
|
|
221
|
+
*
|
|
222
|
+
* `physicalRangeOf` got further, and worse. It reported `signal undefined "undefined" declares
|
|
223
|
+
* physical minimum "undefined"` and sent the reader to `header.diagnostics` for a signal that is not
|
|
224
|
+
* there: a complaint about the FILE for a mistake in the argument, which is the one confusion
|
|
225
|
+
* `byteSource` says this package works hardest to avoid (fixed in 0.6.104).
|
|
226
|
+
*/
|
|
227
|
+
function assertSignal(signal, call) {
|
|
228
|
+
if (typeof signal?.index === 'number' && typeof signal.physicalMinimum === 'number')
|
|
229
|
+
return;
|
|
230
|
+
const chunk = typeof signal?.signalIndex === 'number';
|
|
231
|
+
throw new RangeError(`${call}(): the signal is ${chunk
|
|
232
|
+
? 'a chunk signal, which carries the samples rather than the declaration they are scaled by'
|
|
233
|
+
: `${describeValue(signal)}, not one of header.signals`}. Next: pass header.signals[chunkSignal.signalIndex], or resolve it with ` +
|
|
234
|
+
'getSignal(header, label).');
|
|
235
|
+
}
|
|
212
236
|
export function toPhysical(signal, digital, out, options) {
|
|
237
|
+
assertSignal(signal, 'toPhysical');
|
|
213
238
|
const scale = signal.scale;
|
|
214
239
|
if (scale === undefined)
|
|
215
240
|
throw scalingError(signal);
|
|
@@ -241,6 +266,7 @@ export function toPhysical(signal, digital, out, options) {
|
|
|
241
266
|
* reporting no error at all.
|
|
242
267
|
*/
|
|
243
268
|
export function physicalRangeOf(signal) {
|
|
269
|
+
assertSignal(signal, 'physicalRangeOf');
|
|
244
270
|
const { physicalMinimum, physicalMaximum } = signal;
|
|
245
271
|
if (!Number.isFinite(physicalMinimum) || !Number.isFinite(physicalMaximum)) {
|
|
246
272
|
throw new RangeError(`signal ${signal.index} "${signal.label}" declares physical minimum ` +
|
|
@@ -261,6 +287,7 @@ export function physicalRangeOf(signal) {
|
|
|
261
287
|
* are empty and collapse every sample onto a single value.
|
|
262
288
|
*/
|
|
263
289
|
export function clampToDigitalRange(signal, digital, out, options) {
|
|
290
|
+
assertSignal(signal, 'clampToDigitalRange');
|
|
264
291
|
const low = Math.min(signal.digitalMinimum, signal.digitalMaximum);
|
|
265
292
|
const high = Math.max(signal.digitalMinimum, signal.digitalMaximum);
|
|
266
293
|
if (!Number.isFinite(low) || !Number.isFinite(high)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"physical.js","sourceRoot":"","sources":["../../src/decode/physical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"physical.js","sourceRoot":"","sources":["../../src/decode/physical.ts"],"names":[],"mappings":"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"}
|
package/dist/io/read.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/io/read.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoBhG;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/io/read.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AASH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAoBhG;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CA8B9F;AAqED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC,CAarB"}
|
package/dist/io/read.js
CHANGED
|
@@ -28,7 +28,7 @@ import { EdfBudgetError, EdfRangeError } from '../errors.js';
|
|
|
28
28
|
import { parseHeader } from '../header/parse.js';
|
|
29
29
|
import { resolveMaterializeBudget } from '../options.js';
|
|
30
30
|
import { pluralise } from '../text/counted.js';
|
|
31
|
-
import { assertExactRead } from './source.js';
|
|
31
|
+
import { assertByteSource, assertExactRead } from './source.js';
|
|
32
32
|
/**
|
|
33
33
|
* The signal count, read leniently and reported to nobody.
|
|
34
34
|
*
|
|
@@ -56,6 +56,12 @@ function signalCountHint(fixedHeader) {
|
|
|
56
56
|
* the file's problem.
|
|
57
57
|
*/
|
|
58
58
|
export async function readHeader(source, options) {
|
|
59
|
+
// The refusal `openEdf` gives, in the two functions it is the convenience wrapper over.
|
|
60
|
+
// `api-primitives.md` sends a reader who has outgrown the top layer to exactly these, and neither
|
|
61
|
+
// checked its source: both read a field off it on their first line, so `readHeader(bytes)` — the
|
|
62
|
+
// same mistake 0.4.444 named `openEdf(bytes)` for — came back as V8's `Cannot read properties of
|
|
63
|
+
// undefined (reading 'byteLength')` (fixed in 0.6.105).
|
|
64
|
+
assertByteSource(source);
|
|
59
65
|
const sourceByteLength = source.byteLength;
|
|
60
66
|
const firstLength = Math.min(EDF_HEADER_BLOCK_BYTES, sourceByteLength);
|
|
61
67
|
const fixedHeader = assertExactRead(await source.read(0, firstLength, options), 0, firstLength);
|
|
@@ -141,6 +147,7 @@ function assertWithinBudget(requiredBytes, records, options) {
|
|
|
141
147
|
* honest than asking for it.
|
|
142
148
|
*/
|
|
143
149
|
export async function readRecordBytes(source, header, records, options) {
|
|
150
|
+
assertByteSource(source);
|
|
144
151
|
assertRecordRange(header, records);
|
|
145
152
|
const byteLength = records.count * header.recordByteLength;
|
|
146
153
|
if (byteLength === 0)
|
package/dist/io/read.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/io/read.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/io/read.ts"],"names":[],"mappings":"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"}
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,31 @@ 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.105
|
|
10
|
+
|
|
11
|
+
- **Fixed** `readHeader` and `readRecordBytes` — the two functions `openEdf` is the convenience
|
|
12
|
+
wrapper over — accepting anything as their source.
|
|
13
|
+
- `api-primitives.md` sends a reader who has outgrown the top layer to exactly these two, and both
|
|
14
|
+
read a field off the source on their first line. So `readHeader(bytes)`, the same mistake 0.4.444
|
|
15
|
+
named `openEdf(bytes)` for, made one layer down by someone who has just been told to drop a layer,
|
|
16
|
+
came back as `Cannot read properties of undefined (reading 'byteLength')`.
|
|
17
|
+
- Both now call `assertByteSource`, so all three entry points give the same refusal — including the
|
|
18
|
+
clause that recognises a path string and names `fileSource`.
|
|
19
|
+
|
|
20
|
+
## 0.6.104
|
|
21
|
+
|
|
22
|
+
- **Fixed** `toPhysical`, `physicalRangeOf` and `clampToDigitalRange` when handed a chunk signal
|
|
23
|
+
instead of the header's declaration.
|
|
24
|
+
- `toPhysical(chunk.signals[0], chunk.signals[0].digital)` is the call the argument list suggests, and
|
|
25
|
+
it is wrong: the scale lives on the header's signal. A chunk signal has no `scale`, so `toPhysical`
|
|
26
|
+
took its no-gain branch and `scalingError` then read `signal.raw.digitalMinimum` off it — a
|
|
27
|
+
`TypeError` thrown from inside the builder of the error meant to explain the problem.
|
|
28
|
+
- `physicalRangeOf` got further and worse. It reported `signal undefined "undefined" declares physical
|
|
29
|
+
minimum "undefined" … Next: read header.diagnostics for this signal`: a complaint about the FILE
|
|
30
|
+
for a mistake in the argument, pointing at a signal that is not there.
|
|
31
|
+
- All three now name the chunk signal as what it is and point at `header.signals[…]`. A real signal
|
|
32
|
+
that genuinely has no gain still gets the `EdfScalingError` it always did.
|
|
33
|
+
|
|
9
34
|
## 0.6.103
|
|
10
35
|
|
|
11
36
|
- **Fixed** `matchSignals` and `filterAnnotationsByText` throwing V8's "test is not a function" for a
|
package/package.json
CHANGED
package/src/constants.ts
CHANGED
package/src/decode/physical.ts
CHANGED
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
import { EdfBudgetError, EdfScalingError } from '../errors.js';
|
|
13
13
|
import { resolveMaterializeBudget } from '../options.js';
|
|
14
|
-
import
|
|
14
|
+
import { describeValue } from '../text/describe.js';
|
|
15
|
+
import type { EdfChunkSignal, EdfDiagnosticCode, EdfSignal } from '../types.js';
|
|
15
16
|
import type { MaterializeOptions } from './digital.js';
|
|
16
17
|
|
|
17
18
|
export type { MaterializeOptions } from './digital.js';
|
|
@@ -280,12 +281,40 @@ function resolveInt32Out(
|
|
|
280
281
|
* Throws `EdfScalingError` when `signal.scale` is `undefined`. edfcore never fabricates a gain,
|
|
281
282
|
* and `decodeDigital` keeps working on such a signal.
|
|
282
283
|
*/
|
|
284
|
+
/**
|
|
285
|
+
* The SIGNAL, before any field of it is read.
|
|
286
|
+
*
|
|
287
|
+
* `EdfChunkSignal` is the other per-signal shape and it is the one a reader has in hand after a
|
|
288
|
+
* read, so `toPhysical(chunk.signals[0], chunk.signals[0].digital)` is the call the arguments
|
|
289
|
+
* suggest. It has no `scale`, so `toPhysical` took the no-gain branch and `scalingError` then read
|
|
290
|
+
* `signal.raw.digitalMinimum` off it — V8's `Cannot read properties of undefined`, thrown from
|
|
291
|
+
* inside the builder of the error that was meant to explain the problem.
|
|
292
|
+
*
|
|
293
|
+
* `physicalRangeOf` got further, and worse. It reported `signal undefined "undefined" declares
|
|
294
|
+
* physical minimum "undefined"` and sent the reader to `header.diagnostics` for a signal that is not
|
|
295
|
+
* there: a complaint about the FILE for a mistake in the argument, which is the one confusion
|
|
296
|
+
* `byteSource` says this package works hardest to avoid (fixed in 0.6.104).
|
|
297
|
+
*/
|
|
298
|
+
function assertSignal(signal: EdfSignal, call: string): void {
|
|
299
|
+
if (typeof signal?.index === 'number' && typeof signal.physicalMinimum === 'number') return;
|
|
300
|
+
const chunk = typeof (signal as unknown as EdfChunkSignal | undefined)?.signalIndex === 'number';
|
|
301
|
+
throw new RangeError(
|
|
302
|
+
`${call}(): the signal is ${
|
|
303
|
+
chunk
|
|
304
|
+
? 'a chunk signal, which carries the samples rather than the declaration they are scaled by'
|
|
305
|
+
: `${describeValue(signal)}, not one of header.signals`
|
|
306
|
+
}. Next: pass header.signals[chunkSignal.signalIndex], or resolve it with ` +
|
|
307
|
+
'getSignal(header, label).',
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
|
|
283
311
|
export function toPhysical(
|
|
284
312
|
signal: EdfSignal,
|
|
285
313
|
digital: ArrayLike<number>,
|
|
286
314
|
out?: Float64Array,
|
|
287
315
|
options?: MaterializeOptions,
|
|
288
316
|
): Float64Array {
|
|
317
|
+
assertSignal(signal, 'toPhysical');
|
|
289
318
|
const scale = signal.scale;
|
|
290
319
|
if (scale === undefined) throw scalingError(signal);
|
|
291
320
|
|
|
@@ -321,6 +350,7 @@ export function physicalRangeOf(signal: EdfSignal): {
|
|
|
321
350
|
readonly low: number;
|
|
322
351
|
readonly high: number;
|
|
323
352
|
} {
|
|
353
|
+
assertSignal(signal, 'physicalRangeOf');
|
|
324
354
|
const { physicalMinimum, physicalMaximum } = signal;
|
|
325
355
|
if (!Number.isFinite(physicalMinimum) || !Number.isFinite(physicalMaximum)) {
|
|
326
356
|
throw new RangeError(
|
|
@@ -349,6 +379,7 @@ export function clampToDigitalRange(
|
|
|
349
379
|
out?: Int32Array,
|
|
350
380
|
options?: MaterializeOptions,
|
|
351
381
|
): Int32Array {
|
|
382
|
+
assertSignal(signal, 'clampToDigitalRange');
|
|
352
383
|
const low = Math.min(signal.digitalMinimum, signal.digitalMaximum);
|
|
353
384
|
const high = Math.max(signal.digitalMinimum, signal.digitalMaximum);
|
|
354
385
|
if (!Number.isFinite(low) || !Number.isFinite(high)) {
|
package/src/io/read.ts
CHANGED
|
@@ -30,7 +30,7 @@ import { parseHeader } from '../header/parse.js';
|
|
|
30
30
|
import { resolveMaterializeBudget } from '../options.js';
|
|
31
31
|
import { pluralise } from '../text/counted.js';
|
|
32
32
|
import type { ByteSource, EdfHeader, OpenOptions, ReadOptions, RecordRange } from '../types.js';
|
|
33
|
-
import { assertExactRead } from './source.js';
|
|
33
|
+
import { assertByteSource, assertExactRead } from './source.js';
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* The signal count, read leniently and reported to nobody.
|
|
@@ -58,6 +58,12 @@ function signalCountHint(fixedHeader: Uint8Array): number | undefined {
|
|
|
58
58
|
* the file's problem.
|
|
59
59
|
*/
|
|
60
60
|
export async function readHeader(source: ByteSource, options?: OpenOptions): Promise<EdfHeader> {
|
|
61
|
+
// The refusal `openEdf` gives, in the two functions it is the convenience wrapper over.
|
|
62
|
+
// `api-primitives.md` sends a reader who has outgrown the top layer to exactly these, and neither
|
|
63
|
+
// checked its source: both read a field off it on their first line, so `readHeader(bytes)` — the
|
|
64
|
+
// same mistake 0.4.444 named `openEdf(bytes)` for — came back as V8's `Cannot read properties of
|
|
65
|
+
// undefined (reading 'byteLength')` (fixed in 0.6.105).
|
|
66
|
+
assertByteSource(source);
|
|
61
67
|
const sourceByteLength = source.byteLength;
|
|
62
68
|
const firstLength = Math.min(EDF_HEADER_BLOCK_BYTES, sourceByteLength);
|
|
63
69
|
const fixedHeader = assertExactRead(await source.read(0, firstLength, options), 0, firstLength);
|
|
@@ -167,6 +173,7 @@ export async function readRecordBytes(
|
|
|
167
173
|
records: RecordRange,
|
|
168
174
|
options?: ReadOptions,
|
|
169
175
|
): Promise<Uint8Array> {
|
|
176
|
+
assertByteSource(source);
|
|
170
177
|
assertRecordRange(header, records);
|
|
171
178
|
const byteLength = records.count * header.recordByteLength;
|
|
172
179
|
if (byteLength === 0) return new Uint8Array(0);
|