edfcore 0.6.137 → 0.6.139
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/biosemi.d.ts.map +1 -1
- package/dist/biosemi.js +28 -3
- package/dist/biosemi.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/io/source.d.ts.map +1 -1
- package/dist/io/source.js +11 -3
- package/dist/io/source.js.map +1 -1
- package/docs/CHANGELOG.md +21 -0
- package/package.json +1 -1
- package/src/biosemi.ts +31 -2
- package/src/constants.ts +1 -1
- package/src/io/source.ts +11 -3
package/dist/biosemi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"biosemi.d.ts","sourceRoot":"","sources":["../src/biosemi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"biosemi.d.ts","sourceRoot":"","sources":["../src/biosemi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EAEZ,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EAEX,gBAAgB,EACjB,MAAM,YAAY,CAAC;AA2CpB;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAqDxE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAgC9D;AAqBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,YAAY,EACvB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAqIrC"}
|
package/dist/biosemi.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { BDF_DIGITAL_MIN } from './constants.js';
|
|
19
19
|
import { decodeDigitalCounted } from './decode/digital.js';
|
|
20
|
+
import { EdfAmbiguousChannelError } from './errors.js';
|
|
20
21
|
import { readRecordBytes } from './io/read.js';
|
|
21
22
|
import { scanChunkRecords } from './record-index.js';
|
|
22
23
|
import { assertRecording, assertSelection, gapBefore } from './recording.js';
|
|
@@ -88,12 +89,36 @@ export function getStatusSignal(header) {
|
|
|
88
89
|
}
|
|
89
90
|
if (header.bytesPerSample !== 3)
|
|
90
91
|
return undefined;
|
|
92
|
+
const matches = [];
|
|
91
93
|
for (const index of header.dataSignalIndices) {
|
|
92
94
|
const signal = header.signals[index];
|
|
93
|
-
if (signal !== undefined && signal.label.trim().toLowerCase() === STATUS_LABEL)
|
|
94
|
-
|
|
95
|
+
if (signal !== undefined && signal.label.trim().toLowerCase() === STATUS_LABEL) {
|
|
96
|
+
matches.push(signal);
|
|
97
|
+
}
|
|
95
98
|
}
|
|
96
|
-
|
|
99
|
+
/*
|
|
100
|
+
* More than one, refused rather than resolved to the first.
|
|
101
|
+
*
|
|
102
|
+
* `getSignal` states the reason for its own duplicate-label refusal and it is the whole of this
|
|
103
|
+
* one: "there is no answer edfcore could return that would not be a guess", because "returning
|
|
104
|
+
* the first is how the wrong channel ends up in a paper". This loop returned the first and said
|
|
105
|
+
* nothing, so `readTriggers` decoded a whole recording's triggers off a channel nobody chose —
|
|
106
|
+
* on the one path in the package where a missing event is indistinguishable from no events.
|
|
107
|
+
*
|
|
108
|
+
* A BDF carrying two channels labelled `Status` is malformed, which is precisely the file this
|
|
109
|
+
* package exists to be careful with (fixed in 0.6.138).
|
|
110
|
+
*/
|
|
111
|
+
if (matches.length > 1) {
|
|
112
|
+
throw new EdfAmbiguousChannelError(`this file has ${matches.length} signals labelled ${JSON.stringify(matches[0]?.label ?? '')} ` +
|
|
113
|
+
`(indices ${matches.map((signal) => signal.index).join(', ')}), so getStatusSignal ` +
|
|
114
|
+
'cannot choose one — returning the first would date every trigger in the recording to a ' +
|
|
115
|
+
'channel nobody picked. Next: select the one you mean with getSignal(header, index) and ' +
|
|
116
|
+
'decode it with decodeDigital() and decodeStatusWord().', {
|
|
117
|
+
label: matches[0]?.label.trim() ?? '',
|
|
118
|
+
matchingIndices: matches.map((signal) => signal.index),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
return matches[0];
|
|
97
122
|
}
|
|
98
123
|
/**
|
|
99
124
|
* Decodes one 24-bit Status sample.
|
package/dist/biosemi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"biosemi.js","sourceRoot":"","sources":["../src/biosemi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAarD,sFAAsF;AACtF,MAAM,YAAY,GAAG,QAAQ,CAAC;AAE9B,oGAAoG;AACpG,SAAS,cAAc,CAAC,MAAe;IACrC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,OAAO,MAAM,EAAE,CAAC;IAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC;AAC1B,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAAC;AACjC,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,CAAC;AAChC,+FAA+F;AAC/F,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C;;;;;;;;;;OAUG;IACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,MAAmD,EAAE,OAAO,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,UAAU,CAClB,0FAA0F;YACxF,2FAA2F;YAC3F,6CAA6C,CAChD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,YAAY;
|
|
1
|
+
{"version":3,"file":"biosemi.js","sourceRoot":"","sources":["../src/biosemi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAarD,sFAAsF;AACtF,MAAM,YAAY,GAAG,QAAQ,CAAC;AAE9B,oGAAoG;AACpG,SAAS,cAAc,CAAC,MAAe;IACrC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,OAAO,MAAM,EAAE,CAAC;IAC5D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC;AAC1B,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAAC;AACjC,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,CAAC;AAChC,+FAA+F;AAC/F,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C;;;;;;;;;;OAUG;IACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,MAAmD,EAAE,OAAO,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,UAAU,CAClB,0FAA0F;YACxF,2FAA2F;YAC3F,6CAA6C,CAChD,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD;;;;;;;;;;;OAWG;IACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,wBAAwB,CAChC,iBAAiB,OAAO,CAAC,MAAM,qBAAqB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,GAAG;YAC5F,YAAY,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB;YACpF,yFAAyF;YACzF,yFAAyF;YACzF,wDAAwD,EAC1D;YACE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;YACrC,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;SACvD,CACF,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,eAAe,IAAI,MAAM,GAAG,mBAAmB,EAAE,CAAC;QAC9F,MAAM,IAAI,UAAU,CAClB,uBAAuB,cAAc,CAAC,MAAM,CAAC,2CAA2C;YACtF,mBAAmB,eAAe,KAAK,mBAAmB,sBAAsB;YAChF,sFAAsF;YACtF,qFAAqF;YACrF,iEAAiE,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC9B,OAAO;QACL,GAAG;QACH,OAAO,EAAE,GAAG,GAAG,YAAY;QAC3B,QAAQ,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC;QACjC,UAAU,EAAE,CAAC,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC;QAC1C,UAAU,EAAE,CAAC,GAAG,GAAG,eAAe,CAAC,KAAK,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CACxB,QAA2C,EAC3C,WAAmB;IAEnB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;QACpC,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,GAAG,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK;YAAE,OAAO,OAAO,CAAC;IAC1F,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAuB,EACvB,SAA2B,EAC3B,OAAqB;IAErB,eAAe,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC3C,eAAe,CAAC,SAAS,EAAE,cAAc,EAAE,mCAAmC,CAAC,CAAC;IAChF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAE/C,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,UAAU,CAClB,yFAAyF;YACvF,8EAA8E;YAC9E,qCAAqC,CACxC,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAC9B,QAAQ,EACR,SAAS,CAAC,KAAK,EACf,SAAS,CAAC,YAAY,EACtB,SAAS,CAAC,eAAe,CAC1B,CAAC;IAEF,MAAM,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAChF,MAAM,cAAc,GAClB,gBAAgB,GAAG,cAAc,CAAC,SAAS,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAClF,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACjD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAEjD,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,uFAAuF;QACvF,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3E,yFAAyF;QACzF,4FAA4F;QAC5F,2FAA2F;QAC3F,0FAA0F;QAC1F,yDAAyD;QACzD,IAAI,QAA4B,CAAC;QACjC,6FAA6F;QAC7F,6EAA6E;QAC7E,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,wFAAwF;QACxF,gDAAgD;QAChD,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAChE;;;;;;;;;;;;;WAaG;QACH,MAAM,WAAW,GAAG,OAAO,EAAE,UAAU,CAAC;QACxC,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAC5E,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAA+B,CAAC;QAEpC,OAAO,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAgB;gBACzB,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,OAAO;gBAC9B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;aACvD,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3F,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;YAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;gBACpC,qFAAqF;gBACrF,uFAAuF;gBACvF,gFAAgF;gBAChF,MAAM,gBAAgB,GACpB,OAAO,KAAK,SAAS;oBACnB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,aAAa;oBACrC,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC;gBAEvF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7C,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,gBAAgB,GAAG,CAAC,CAAW,CAAC,CAAC;oBACnF,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC;oBACpE,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;oBAExB,sFAAsF;oBACtF,sFAAsF;oBACtF,oFAAoF;oBACpF,iFAAiF;oBACjF,gCAAgC;oBAChC,EAAE;oBACF,gFAAgF;oBAChF,uFAAuF;oBACvF,wFAAwF;oBACxF,kFAAkF;oBAClF,wFAAwF;oBACxF,oFAAoF;oBACpF,qBAAqB;oBACrB,EAAE;oBACF,+EAA+E;oBAC/E,MAAM,KAAK,GACT,aAAa,GAAG,EAAE,IAAI,gBAAgB,GAAG,CAAC;wBACxC,CAAC,CAAC,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,aAAa,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;wBACjF,CAAC,CAAC,gBAAgB,CAAC;oBAEvB,IAAI,KAAK,GAAG,gBAAgB,IAAI,KAAK,IAAI,cAAc;wBAAE,SAAS;oBAClE,IAAI,QAAQ,IAAI,CAAC,OAAO;wBAAE,SAAS;oBACnC,MAAM,UAAU,GAAG,CAAC,QAAQ,CAAC;oBAC7B,QAAQ,GAAG,IAAI,CAAC;oBAEhB,MAAM,CAAC,IAAI,CAAC;wBACV,WAAW,EAAE,WAAW,GAAG,gBAAgB,GAAG,CAAC;wBAC/C,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC;wBAC9B,KAAK;wBACL,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EAAE,IAAI;wBACZ,qFAAqF;wBACrF,2EAA2E;wBAC3E,aAAa,EACX,UAAU,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,KAAK,KAAK,WAAW,CAAC;4BAChE,CAAC,CAAC,aAAa;4BACf,CAAC,CAAC,SAAS;qBAChB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
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.139";
|
|
113
113
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.js
CHANGED
package/dist/io/source.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
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,CAE1D;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"}
|
package/dist/io/source.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { isByteArray } from '../bytes/latin1.js';
|
|
19
19
|
import { EdfSourceError } from '../errors.js';
|
|
20
|
+
import { describeValue } from '../text/describe.js';
|
|
20
21
|
/**
|
|
21
22
|
* The byte count of a genuine byte array, or `undefined` for anything else — which is why
|
|
22
23
|
* `EdfSourceError.receivedLength` is `number | undefined` rather than `number`.
|
|
@@ -67,13 +68,20 @@ export function assertExactRead(received, offset, length) {
|
|
|
67
68
|
* safe-integer-ness rather than truncating with `| 0`, which silently wraps past 2 GiB.
|
|
68
69
|
*/
|
|
69
70
|
export function assertReadRange(offset, length, byteLength) {
|
|
71
|
+
// `describeValue`, not `${offset}`. A string interpolates as its digits, so a `'0'` out of a
|
|
72
|
+
// query parameter or a JSON range was refused with "was given offset 0, which is not a
|
|
73
|
+
// non-negative safe integer" — naming a rule that 0 satisfies, about the first byte of the file.
|
|
74
|
+
// The same sentence about the same value, printed two ways, is the defect 0.6.114 fixed for
|
|
75
|
+
// `maxMaterializeBytes` and 0.6.131 for a record index; these are the two numbers every read in
|
|
76
|
+
// the package passes through.
|
|
70
77
|
if (!Number.isSafeInteger(offset) || offset < 0) {
|
|
71
|
-
throw new EdfSourceError(`ByteSource.read was given
|
|
78
|
+
throw new EdfSourceError(`ByteSource.read was given ${describeValue(offset)} as its offset, which is not a ` +
|
|
79
|
+
'non-negative safe integer. ' +
|
|
72
80
|
'Next: pass a plain integer byte offset; edfcore never truncates offsets to 32 bits.', { offset, requestedLength: length });
|
|
73
81
|
}
|
|
74
82
|
if (!Number.isSafeInteger(length) || length < 0) {
|
|
75
|
-
throw new EdfSourceError(`ByteSource.read was given
|
|
76
|
-
'Next: pass a plain integer byte count.', { offset, requestedLength: length });
|
|
83
|
+
throw new EdfSourceError(`ByteSource.read was given ${describeValue(length)} as its length, which is not a ` +
|
|
84
|
+
'non-negative safe integer. Next: pass a plain integer byte count.', { offset, requestedLength: length });
|
|
77
85
|
}
|
|
78
86
|
if (offset + length > byteLength) {
|
|
79
87
|
throw new EdfSourceError(`ByteSource.read(offset ${offset}, length ${length}) ends at byte ${offset + length}, ` +
|
package/dist/io/source.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/io/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,SAAS,gBAAgB,CAAC,QAAiB;IACzC,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,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,6FAA6F;IAC7F,uFAAuF;IACvF,iGAAiG;IACjG,4FAA4F;IAC5F,gGAAgG;IAChG,8BAA8B;IAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,cAAc,CACtB,6BAA6B,aAAa,CAAC,MAAM,CAAC,iCAAiC;YACjF,6BAA6B;YAC7B,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,6BAA6B,aAAa,CAAC,MAAM,CAAC,iCAAiC;YACjF,mEAAmE,EACrE,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,oBAAoB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAwB;IAC3D,IAAI,MAAM,EAAE,OAAO,KAAK,IAAI;QAAE,OAAO;IACrC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,MAAM,KAAK,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,MAAe;IACjC,IACE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;QAC1B,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,sBAAsB,EACjE,CAAC;QACD,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,CACL,uFAAuF;YACvF,qCAAqC,CACtC,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,MAA0D,CAAC;IAC7E,IACE,OAAO,SAAS,EAAE,IAAI,KAAK,QAAQ;QACnC,OAAQ,SAAuC,CAAC,WAAW,KAAK,UAAU,EAC1E,CAAC;QACD,OAAO,yDAAyD,CAAC;IACnE,CAAC;IACD,OAAO,CACL,8FAA8F;QAC9F,2DAA2D,CAC5D,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,MAAe;IACpC,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,wFAAwF;IACxF,0BAA0B;IAC1B,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,UAAU;QAC/D,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,OAAO,MAAM,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,MAAM,SAAS,GAAG,MAAqE,CAAC;IACxF,IAAI,OAAO,SAAS,EAAE,IAAI,KAAK,UAAU,IAAI,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ;QAAE,OAAO;IAC9F,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,IAAI,cAAc,CACtB,mFAAmF;QACjF,GAAG,QAAQ,WAAW,UAAU,CAAC,MAAM,CAAC,GAAG,EAC7C,EAAE,MAAM,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAClC,CAAC;AACJ,CAAC"}
|
package/docs/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,27 @@ 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.139
|
|
10
|
+
|
|
11
|
+
- **Fixed** `ByteSource.read` describing an offset or a length it refused as the number its digits
|
|
12
|
+
spell. A `'0'` out of a query parameter, a JSON range or a config key came back as "was given
|
|
13
|
+
offset 0, which is not a non-negative safe integer" — about the first byte of the file.
|
|
14
|
+
- Offset and length are the two numbers every read in the package passes through, so they are the
|
|
15
|
+
pair most likely to arrive from outside a TypeScript call site. Both now name the value as
|
|
16
|
+
itself; every numeric refusal reads as before.
|
|
17
|
+
|
|
18
|
+
## 0.6.138
|
|
19
|
+
|
|
20
|
+
- **Fixed** `getStatusSignal` returning the first of two channels labelled `Status` with nothing
|
|
21
|
+
saying a choice had been made, so `readTriggers` decoded a whole recording's triggers off a
|
|
22
|
+
channel nobody picked — on the one path where a missing event is indistinguishable from no
|
|
23
|
+
events.
|
|
24
|
+
- **Behaviour change**: a duplicate `Status` label is now an `EdfAmbiguousChannelError` carrying
|
|
25
|
+
the indices, which is what `getSignal` has always done for a duplicate label and for the reason
|
|
26
|
+
it states: "returning the first is how the wrong channel ends up in a paper".
|
|
27
|
+
- One Status channel still resolves, none still returns `undefined`, and a 16-bit file still
|
|
28
|
+
returns `undefined` without looking at labels.
|
|
29
|
+
|
|
9
30
|
## 0.6.137
|
|
10
31
|
|
|
11
32
|
- **Fixed** a refused record range being printed as the numbers its digits spell.
|
package/package.json
CHANGED
package/src/biosemi.ts
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import { BDF_DIGITAL_MIN } from './constants.js';
|
|
20
20
|
import { decodeDigitalCounted } from './decode/digital.js';
|
|
21
|
+
import { EdfAmbiguousChannelError } from './errors.js';
|
|
21
22
|
import { readRecordBytes } from './io/read.js';
|
|
22
23
|
import { scanChunkRecords } from './record-index.js';
|
|
23
24
|
import { assertRecording, assertSelection, gapBefore } from './recording.js';
|
|
@@ -102,11 +103,39 @@ export function getStatusSignal(header: EdfHeader): EdfSignal | undefined {
|
|
|
102
103
|
);
|
|
103
104
|
}
|
|
104
105
|
if (header.bytesPerSample !== 3) return undefined;
|
|
106
|
+
const matches: EdfSignal[] = [];
|
|
105
107
|
for (const index of header.dataSignalIndices) {
|
|
106
108
|
const signal = header.signals[index];
|
|
107
|
-
if (signal !== undefined && signal.label.trim().toLowerCase() === STATUS_LABEL)
|
|
109
|
+
if (signal !== undefined && signal.label.trim().toLowerCase() === STATUS_LABEL) {
|
|
110
|
+
matches.push(signal);
|
|
111
|
+
}
|
|
108
112
|
}
|
|
109
|
-
|
|
113
|
+
/*
|
|
114
|
+
* More than one, refused rather than resolved to the first.
|
|
115
|
+
*
|
|
116
|
+
* `getSignal` states the reason for its own duplicate-label refusal and it is the whole of this
|
|
117
|
+
* one: "there is no answer edfcore could return that would not be a guess", because "returning
|
|
118
|
+
* the first is how the wrong channel ends up in a paper". This loop returned the first and said
|
|
119
|
+
* nothing, so `readTriggers` decoded a whole recording's triggers off a channel nobody chose —
|
|
120
|
+
* on the one path in the package where a missing event is indistinguishable from no events.
|
|
121
|
+
*
|
|
122
|
+
* A BDF carrying two channels labelled `Status` is malformed, which is precisely the file this
|
|
123
|
+
* package exists to be careful with (fixed in 0.6.138).
|
|
124
|
+
*/
|
|
125
|
+
if (matches.length > 1) {
|
|
126
|
+
throw new EdfAmbiguousChannelError(
|
|
127
|
+
`this file has ${matches.length} signals labelled ${JSON.stringify(matches[0]?.label ?? '')} ` +
|
|
128
|
+
`(indices ${matches.map((signal) => signal.index).join(', ')}), so getStatusSignal ` +
|
|
129
|
+
'cannot choose one — returning the first would date every trigger in the recording to a ' +
|
|
130
|
+
'channel nobody picked. Next: select the one you mean with getSignal(header, index) and ' +
|
|
131
|
+
'decode it with decodeDigital() and decodeStatusWord().',
|
|
132
|
+
{
|
|
133
|
+
label: matches[0]?.label.trim() ?? '',
|
|
134
|
+
matchingIndices: matches.map((signal) => signal.index),
|
|
135
|
+
},
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
return matches[0];
|
|
110
139
|
}
|
|
111
140
|
|
|
112
141
|
/**
|
package/src/constants.ts
CHANGED
package/src/io/source.ts
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
|
|
19
19
|
import { isByteArray } from '../bytes/latin1.js';
|
|
20
20
|
import { EdfSourceError } from '../errors.js';
|
|
21
|
+
import { describeValue } from '../text/describe.js';
|
|
21
22
|
import type { AbortSignalLike, ByteSource, ReadOptions } from '../types.js';
|
|
22
23
|
|
|
23
24
|
/**
|
|
@@ -76,17 +77,24 @@ export function assertExactRead(received: Uint8Array, offset: number, length: nu
|
|
|
76
77
|
* safe-integer-ness rather than truncating with `| 0`, which silently wraps past 2 GiB.
|
|
77
78
|
*/
|
|
78
79
|
export function assertReadRange(offset: number, length: number, byteLength: number): void {
|
|
80
|
+
// `describeValue`, not `${offset}`. A string interpolates as its digits, so a `'0'` out of a
|
|
81
|
+
// query parameter or a JSON range was refused with "was given offset 0, which is not a
|
|
82
|
+
// non-negative safe integer" — naming a rule that 0 satisfies, about the first byte of the file.
|
|
83
|
+
// The same sentence about the same value, printed two ways, is the defect 0.6.114 fixed for
|
|
84
|
+
// `maxMaterializeBytes` and 0.6.131 for a record index; these are the two numbers every read in
|
|
85
|
+
// the package passes through.
|
|
79
86
|
if (!Number.isSafeInteger(offset) || offset < 0) {
|
|
80
87
|
throw new EdfSourceError(
|
|
81
|
-
`ByteSource.read was given
|
|
88
|
+
`ByteSource.read was given ${describeValue(offset)} as its offset, which is not a ` +
|
|
89
|
+
'non-negative safe integer. ' +
|
|
82
90
|
'Next: pass a plain integer byte offset; edfcore never truncates offsets to 32 bits.',
|
|
83
91
|
{ offset, requestedLength: length },
|
|
84
92
|
);
|
|
85
93
|
}
|
|
86
94
|
if (!Number.isSafeInteger(length) || length < 0) {
|
|
87
95
|
throw new EdfSourceError(
|
|
88
|
-
`ByteSource.read was given
|
|
89
|
-
'Next: pass a plain integer byte count.',
|
|
96
|
+
`ByteSource.read was given ${describeValue(length)} as its length, which is not a ` +
|
|
97
|
+
'non-negative safe integer. Next: pass a plain integer byte count.',
|
|
90
98
|
{ offset, requestedLength: length },
|
|
91
99
|
);
|
|
92
100
|
}
|