@neurodevs/node-lsl 18.0.0 → 18.1.0

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.
Files changed (90) hide show
  1. package/.vscode/launch.json +54 -58
  2. package/.vscode/settings.json +61 -66
  3. package/.vscode/tasks.json +98 -129
  4. package/README.md +14 -12
  5. package/build/__tests__/AbstractPackageTest.d.ts +4 -2
  6. package/build/__tests__/AbstractPackageTest.js +15 -6
  7. package/build/__tests__/AbstractPackageTest.js.map +1 -1
  8. package/build/__tests__/impl/BleDeviceController.test.d.ts +54 -0
  9. package/build/__tests__/impl/BleDeviceController.test.js +333 -0
  10. package/build/__tests__/impl/BleDeviceController.test.js.map +1 -0
  11. package/build/__tests__/impl/LslEventMarkerEmitter.test.js +1 -1
  12. package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -1
  13. package/build/__tests__/impl/LslStreamInlet.test.js +2 -2
  14. package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
  15. package/build/__tests__/impl/LslStreamOutlet.test.js +9 -9
  16. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
  17. package/build/__tests__/impl/LslWebSocketBridge.test.js +3 -3
  18. package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
  19. package/build/impl/LslStreamOutlet.d.ts +2 -2
  20. package/build/impl/LslStreamOutlet.js +2 -2
  21. package/build/impl/LslStreamOutlet.js.map +1 -1
  22. package/build/impl/LslWebSocketBridge.js +2 -2
  23. package/build/impl/LslWebSocketBridge.js.map +1 -1
  24. package/build/impl/controllers/BleDeviceController.d.ts +58 -0
  25. package/build/impl/controllers/BleDeviceController.js +145 -0
  26. package/build/impl/controllers/BleDeviceController.js.map +1 -0
  27. package/build/impl/workers/inlet/StreamInletWorker.d.ts +4 -4
  28. package/build/impl/workers/inlet/StreamInletWorker.js +12 -12
  29. package/build/impl/workers/inlet/StreamInletWorker.js.map +1 -1
  30. package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +3 -3
  31. package/build/impl/workers/outlet/LslStreamOutlet.worker.js +7 -7
  32. package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +1 -1
  33. package/build/index.d.ts +6 -4
  34. package/build/index.js +7 -5
  35. package/build/index.js.map +1 -1
  36. package/build/scripts/discoverMuse.d.ts +1 -0
  37. package/build/scripts/discoverMuse.js +40 -0
  38. package/build/scripts/discoverMuse.js.map +1 -0
  39. package/build/scripts/runMuse.d.ts +1 -0
  40. package/build/scripts/runMuse.js +40 -0
  41. package/build/scripts/runMuse.js.map +1 -0
  42. package/build/testDoubles/BleController/FakeBleController.d.ts +24 -0
  43. package/build/testDoubles/BleController/FakeBleController.js +42 -0
  44. package/build/testDoubles/BleController/FakeBleController.js.map +1 -0
  45. package/build/testDoubles/BleController/SpyBleController.d.ts +14 -0
  46. package/build/testDoubles/BleController/SpyBleController.js +48 -0
  47. package/build/testDoubles/BleController/SpyBleController.js.map +1 -0
  48. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +2 -2
  49. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +5 -2
  50. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
  51. package/build/testDoubles/generateRandomOutletOptions.js +1 -1
  52. package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
  53. package/eslint.config.js +3 -0
  54. package/package.json +18 -56
  55. package/prettier.config.js +3 -0
  56. package/src/__tests__/AbstractPackageTest.ts +28 -9
  57. package/src/__tests__/impl/BleDeviceController.test.ts +492 -0
  58. package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +2 -1
  59. package/src/__tests__/impl/LslStreamInlet.test.ts +2 -2
  60. package/src/__tests__/impl/LslStreamOutlet.test.ts +10 -10
  61. package/src/__tests__/impl/LslWebSocketBridge.test.ts +4 -3
  62. package/src/impl/LslStreamOutlet.ts +3 -3
  63. package/src/impl/LslWebSocketBridge.ts +2 -2
  64. package/src/impl/controllers/BleDeviceController.ts +223 -0
  65. package/src/impl/workers/inlet/StreamInletWorker.ts +12 -12
  66. package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +8 -8
  67. package/src/index.ts +8 -5
  68. package/src/scripts/discoverMuse.ts +50 -0
  69. package/src/scripts/runMuse.ts +50 -0
  70. package/src/testDoubles/BleController/FakeBleController.ts +70 -0
  71. package/src/testDoubles/BleController/SpyBleController.ts +61 -0
  72. package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +6 -3
  73. package/src/testDoubles/generateRandomOutletOptions.ts +2 -1
  74. package/tsconfig.json +23 -27
  75. package/.regressionproof.json +0 -7
  76. package/build/.spruce/settings.json +0 -15
  77. package/build/__tests__/impl/LslBackpressureMonitor.test.d.ts +0 -7
  78. package/build/__tests__/impl/LslBackpressureMonitor.test.js +0 -26
  79. package/build/__tests__/impl/LslBackpressureMonitor.test.js.map +0 -1
  80. package/build/impl/LslBackpressureMonitor.d.ts +0 -8
  81. package/build/impl/LslBackpressureMonitor.js +0 -8
  82. package/build/impl/LslBackpressureMonitor.js.map +0 -1
  83. package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.d.ts +0 -6
  84. package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.js +0 -10
  85. package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.js.map +0 -1
  86. package/eslint.config.mjs +0 -3
  87. package/src/.spruce/settings.json +0 -15
  88. package/src/__tests__/impl/LslBackpressureMonitor.test.ts +0 -25
  89. package/src/impl/LslBackpressureMonitor.ts +0 -13
  90. package/src/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.ts +0 -13
@@ -0,0 +1,40 @@
1
+ import koffi from 'koffi';
2
+ import BleDeviceController from '../impl/controllers/BleDeviceController.js';
3
+ const MUSE_CHARACTERISTIC_UUIDS = {
4
+ CONTROL: '273E0001-4C4D-454D-96BE-F03BAC821358',
5
+ TELEMETRY: '273E000B-4C4D-454D-96BE-F03BAC821358',
6
+ GYROSCOPE: '273E0009-4C4D-454D-96BE-F03BAC821358',
7
+ ACCELEROMETER: '273E000A-4C4D-454D-96BE-F03BAC821358',
8
+ PPG_AMBIENT: '273E000F-4C4D-454D-96BE-F03BAC821358',
9
+ PPG_INFRARED: '273E0010-4C4D-454D-96BE-F03BAC821358',
10
+ PPG_RED: '273E0011-4C4D-454D-96BE-F03BAC821358',
11
+ EEG_TP9: '273E0003-4C4D-454D-96BE-F03BAC821358',
12
+ EEG_AF7: '273E0004-4C4D-454D-96BE-F03BAC821358',
13
+ EEG_AF8: '273E0005-4C4D-454D-96BE-F03BAC821358',
14
+ EEG_TP10: '273E0006-4C4D-454D-96BE-F03BAC821358',
15
+ EEG_AUX: '273E0007-4C4D-454D-96BE-F03BAC821358',
16
+ };
17
+ const CONTROL_UUID = MUSE_CHARACTERISTIC_UUIDS['CONTROL'];
18
+ const charCallbacks = Object.entries(MUSE_CHARACTERISTIC_UUIDS).map(([name, uuid]) => {
19
+ return {
20
+ charUuid: uuid,
21
+ charName: name,
22
+ onData: (data, length, timestampSec) => {
23
+ const bytes = koffi.decode(data, 'uint8', length);
24
+ console.info(`[${timestampSec}] length=${length}`, bytes);
25
+ },
26
+ };
27
+ });
28
+ const muse = await BleDeviceController.Create({
29
+ deviceNamePrefix: 'Muse',
30
+ charCallbacks,
31
+ rssiIntervalMs: 1000,
32
+ });
33
+ await muse.connect();
34
+ for (const cmd of ['h', 'p50', 's', 'd']) {
35
+ await muse.writeCharacteristic(CONTROL_UUID, cmd);
36
+ await new Promise((resolve) => setTimeout(resolve, 100));
37
+ }
38
+ await new Promise((resolve) => setTimeout(resolve, 5 * 1000));
39
+ await muse.disconnect();
40
+ //# sourceMappingURL=discoverMuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discoverMuse.js","sourceRoot":"","sources":["../../src/scripts/discoverMuse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,4CAA4C,CAAA;AAE5E,MAAM,yBAAyB,GAA2B;IACtD,OAAO,EAAE,sCAAsC;IAC/C,SAAS,EAAE,sCAAsC;IACjD,SAAS,EAAE,sCAAsC;IACjD,aAAa,EAAE,sCAAsC;IACrD,WAAW,EAAE,sCAAsC;IACnD,YAAY,EAAE,sCAAsC;IACpD,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,QAAQ,EAAE,sCAAsC;IAChD,OAAO,EAAE,sCAAsC;CAClD,CAAA;AAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAA;AAEzD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACb,OAAO;QACH,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,YAAoB,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAa,CAAA;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,YAAY,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7D,CAAC;KACJ,CAAA;AACL,CAAC,CACJ,CAAA;AAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC;IAC1C,gBAAgB,EAAE,MAAM;IACxB,aAAa;IACb,cAAc,EAAE,IAAI;CACvB,CAAC,CAAA;AAEF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;AAEpB,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACvC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IACjD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;AAE7D,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import koffi from 'koffi';
2
+ import BleDeviceController from '../impl/controllers/BleDeviceController.js';
3
+ const MUSE_CHARACTERISTIC_UUIDS = {
4
+ CONTROL: '273E0001-4C4D-454D-96BE-F03BAC821358',
5
+ TELEMETRY: '273E000B-4C4D-454D-96BE-F03BAC821358',
6
+ GYROSCOPE: '273E0009-4C4D-454D-96BE-F03BAC821358',
7
+ ACCELEROMETER: '273E000A-4C4D-454D-96BE-F03BAC821358',
8
+ PPG_AMBIENT: '273E000F-4C4D-454D-96BE-F03BAC821358',
9
+ PPG_INFRARED: '273E0010-4C4D-454D-96BE-F03BAC821358',
10
+ PPG_RED: '273E0011-4C4D-454D-96BE-F03BAC821358',
11
+ EEG_TP9: '273E0003-4C4D-454D-96BE-F03BAC821358',
12
+ EEG_AF7: '273E0004-4C4D-454D-96BE-F03BAC821358',
13
+ EEG_AF8: '273E0005-4C4D-454D-96BE-F03BAC821358',
14
+ EEG_TP10: '273E0006-4C4D-454D-96BE-F03BAC821358',
15
+ EEG_AUX: '273E0007-4C4D-454D-96BE-F03BAC821358',
16
+ };
17
+ const CONTROL_UUID = MUSE_CHARACTERISTIC_UUIDS['CONTROL'];
18
+ const charCallbacks = Object.entries(MUSE_CHARACTERISTIC_UUIDS).map(([name, uuid]) => {
19
+ return {
20
+ charUuid: uuid,
21
+ charName: name,
22
+ onData: (data, length, timestampSec) => {
23
+ const bytes = koffi.decode(data, 'uint8', length);
24
+ console.info(`[${timestampSec}] length=${length}`, bytes);
25
+ },
26
+ };
27
+ });
28
+ const muse = await BleDeviceController.Create({
29
+ deviceUuid: 'CA6A61B7-B7A8-AF24-3C9E-04A6A5012554',
30
+ charCallbacks,
31
+ rssiIntervalMs: 1000,
32
+ });
33
+ await muse.connect();
34
+ for (const cmd of ['h', 'p50', 's', 'd']) {
35
+ await muse.writeCharacteristic(CONTROL_UUID, cmd);
36
+ await new Promise((resolve) => setTimeout(resolve, 100));
37
+ }
38
+ await new Promise((resolve) => setTimeout(resolve, 5 * 1000));
39
+ await muse.disconnect();
40
+ //# sourceMappingURL=runMuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runMuse.js","sourceRoot":"","sources":["../../src/scripts/runMuse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,4CAA4C,CAAA;AAE5E,MAAM,yBAAyB,GAA2B;IACtD,OAAO,EAAE,sCAAsC;IAC/C,SAAS,EAAE,sCAAsC;IACjD,SAAS,EAAE,sCAAsC;IACjD,aAAa,EAAE,sCAAsC;IACrD,WAAW,EAAE,sCAAsC;IACnD,YAAY,EAAE,sCAAsC;IACpD,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,QAAQ,EAAE,sCAAsC;IAChD,OAAO,EAAE,sCAAsC;CAClD,CAAA;AAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAA;AAEzD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACb,OAAO;QACH,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,YAAoB,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAa,CAAA;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,YAAY,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7D,CAAC;KACJ,CAAA;AACL,CAAC,CACJ,CAAA;AAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC;IAC1C,UAAU,EAAE,sCAAsC;IAClD,aAAa;IACb,cAAc,EAAE,IAAI;CACvB,CAAC,CAAA;AAEF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;AAEpB,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACvC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IACjD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;AAE7D,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { BleController, BleControllerOptions } from '../../impl/controllers/BleDeviceController.js';
2
+ export default class FakeBleController implements BleController {
3
+ static callsToConstructor: (BleControllerOptions | undefined)[];
4
+ static numCallsToConnect: number;
5
+ static callsToWriteCharacteristic: {
6
+ characteristicUuid: string;
7
+ value: string;
8
+ }[];
9
+ static numCallsToDisconnect: number;
10
+ static fakeCharacteristics: Record<string, unknown>;
11
+ static fakeName: string;
12
+ private _uuid;
13
+ private _name;
14
+ constructor(options?: BleControllerOptions);
15
+ connect(): Promise<void>;
16
+ writeCharacteristic(characteristicUuid: string, value: string): Promise<void>;
17
+ disconnect(): Promise<void>;
18
+ get uuid(): string;
19
+ get name(): string;
20
+ static resetTestDouble(): void;
21
+ }
22
+ export interface CallToBleControllerConstructor {
23
+ options: BleControllerOptions;
24
+ }
@@ -0,0 +1,42 @@
1
+ import generateId from '@neurodevs/generate-id';
2
+ export default class FakeBleController {
3
+ static callsToConstructor = [];
4
+ static numCallsToConnect = 0;
5
+ static callsToWriteCharacteristic = [];
6
+ static numCallsToDisconnect = 0;
7
+ static fakeCharacteristics = {};
8
+ static fakeName = `fake-${generateId()}`;
9
+ _uuid;
10
+ _name;
11
+ constructor(options) {
12
+ const { deviceUuid } = options ?? {};
13
+ this._uuid = deviceUuid ?? generateId();
14
+ this._name = FakeBleController.fakeName;
15
+ FakeBleController.callsToConstructor.push(options);
16
+ }
17
+ async connect() {
18
+ FakeBleController.numCallsToConnect++;
19
+ }
20
+ async writeCharacteristic(characteristicUuid, value) {
21
+ FakeBleController.callsToWriteCharacteristic.push({
22
+ characteristicUuid,
23
+ value,
24
+ });
25
+ }
26
+ async disconnect() {
27
+ FakeBleController.numCallsToDisconnect++;
28
+ }
29
+ get uuid() {
30
+ return this._uuid;
31
+ }
32
+ get name() {
33
+ return this._name;
34
+ }
35
+ static resetTestDouble() {
36
+ this.callsToConstructor = [];
37
+ this.numCallsToConnect = 0;
38
+ this.callsToWriteCharacteristic = [];
39
+ this.numCallsToDisconnect = 0;
40
+ }
41
+ }
42
+ //# sourceMappingURL=FakeBleController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeBleController.js","sourceRoot":"","sources":["../../../src/testDoubles/BleController/FakeBleController.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAM/C,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAC3B,MAAM,CAAC,kBAAkB,GAAyC,EAAE,CAAA;IAEpE,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAE5B,MAAM,CAAC,0BAA0B,GAGlC,EAAE,CAAA;IAED,MAAM,CAAC,oBAAoB,GAAG,CAAC,CAAA;IAE/B,MAAM,CAAC,mBAAmB,GAA4B,EAAE,CAAA;IACxD,MAAM,CAAC,QAAQ,GAAG,QAAQ,UAAU,EAAE,EAAE,CAAA;IAEvC,KAAK,CAAQ;IACb,KAAK,CAAQ;IAErB,YAAmB,OAA8B;QAC7C,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;QAEpC,IAAI,CAAC,KAAK,GAAG,UAAU,IAAI,UAAU,EAAE,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAA;QAEvC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtD,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,iBAAiB,CAAC,iBAAiB,EAAE,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC5B,kBAA0B,EAC1B,KAAa;QAEb,iBAAiB,CAAC,0BAA0B,CAAC,IAAI,CAAC;YAC9C,kBAAkB;YAClB,KAAK;SACR,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,UAAU;QACnB,iBAAiB,CAAC,oBAAoB,EAAE,CAAA;IAC5C,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAA;QAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAA;QAC1B,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAA;QACpC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAA;IACjC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import BleDeviceController, { BleControllerOptions } from '../../impl/controllers/BleDeviceController.js';
2
+ export default class SpyBleController extends BleDeviceController {
3
+ infoLogs: string[];
4
+ warnLogs: string[];
5
+ errorLogs: string[];
6
+ constructor(options: BleControllerOptions);
7
+ getCharacteristicCallbacks(): import("../../impl/controllers/BleDeviceController.js").CharacteristicCallbacks;
8
+ getRssiIntervalMs(): number | undefined;
9
+ getConnected(): boolean;
10
+ setLogInfoSpy(): void;
11
+ setLogWarnSpy(): void;
12
+ setLogErrorSpy(): void;
13
+ resetTestDouble(): void;
14
+ }
@@ -0,0 +1,48 @@
1
+ import BleDeviceController from '../../impl/controllers/BleDeviceController.js';
2
+ export default class SpyBleController extends BleDeviceController {
3
+ infoLogs = [];
4
+ warnLogs = [];
5
+ errorLogs = [];
6
+ constructor(options) {
7
+ super(options);
8
+ }
9
+ getCharacteristicCallbacks() {
10
+ return this.charCallbacks;
11
+ }
12
+ getRssiIntervalMs() {
13
+ return this.rssiIntervalMs;
14
+ }
15
+ getConnected() {
16
+ return this.connected;
17
+ }
18
+ setLogInfoSpy() {
19
+ this.infoLogs = [];
20
+ this.log.info = (...args) => {
21
+ const message = args.join(' ');
22
+ this.infoLogs.push(message);
23
+ return message;
24
+ };
25
+ }
26
+ setLogWarnSpy() {
27
+ this.warnLogs = [];
28
+ this.log.warn = (...args) => {
29
+ const message = args.join(' ');
30
+ this.warnLogs.push(message);
31
+ return message;
32
+ };
33
+ }
34
+ setLogErrorSpy() {
35
+ this.errorLogs = [];
36
+ this.log.error = (...args) => {
37
+ const message = args.join(' ');
38
+ this.errorLogs.push(message);
39
+ return message;
40
+ };
41
+ }
42
+ resetTestDouble() {
43
+ this.infoLogs = [];
44
+ this.warnLogs = [];
45
+ this.errorLogs = [];
46
+ }
47
+ }
48
+ //# sourceMappingURL=SpyBleController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpyBleController.js","sourceRoot":"","sources":["../../../src/testDoubles/BleController/SpyBleController.ts"],"names":[],"mappings":"AAAA,OAAO,mBAEN,MAAM,+CAA+C,CAAA;AAEtD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,mBAAmB;IACtD,QAAQ,GAAa,EAAE,CAAA;IACvB,QAAQ,GAAa,EAAE,CAAA;IACvB,SAAS,GAAa,EAAE,CAAA;IAE/B,YAAmB,OAA6B;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IAEM,0BAA0B;QAC7B,OAAO,IAAI,CAAC,aAAa,CAAA;IAC7B,CAAC;IAEM,iBAAiB;QACpB,OAAO,IAAI,CAAC,cAAc,CAAA;IAC9B,CAAC;IAEM,YAAY;QACf,OAAO,IAAI,CAAC,SAAS,CAAA;IACzB,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAElB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC3B,OAAO,OAAO,CAAA;QAClB,CAAC,CAAA;IACL,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAElB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC3B,OAAO,OAAO,CAAA;QAClB,CAAC,CAAA;IACL,CAAC;IAEM,cAAc;QACjB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QAEnB,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC5B,OAAO,OAAO,CAAA;QAClB,CAAC,CAAA;IACL,CAAC;IAEM,eAAe;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;IACvB,CAAC;CACJ"}
@@ -4,13 +4,13 @@ export default class FakeStreamOutlet implements StreamOutlet {
4
4
  static callsToConstructor: (StreamOutletOptions | undefined)[];
5
5
  static callsToPushSample: {
6
6
  sample: LslSample;
7
- timestamp?: number;
7
+ timestampSec?: number;
8
8
  }[];
9
9
  static numCallsToDestroy: number;
10
10
  options?: StreamOutletOptions;
11
11
  constructor(options?: StreamOutletOptions);
12
12
  destroy(): void;
13
- pushSample(sample: LslSample, timestamp?: number): void;
13
+ pushSample(sample: LslSample, timestampSec?: number): void;
14
14
  get name(): string;
15
15
  get type(): string;
16
16
  get sourceId(): string;
@@ -12,8 +12,11 @@ export default class FakeStreamOutlet {
12
12
  destroy() {
13
13
  FakeStreamOutlet.numCallsToDestroy++;
14
14
  }
15
- pushSample(sample, timestamp) {
16
- FakeStreamOutlet.callsToPushSample.push({ sample, timestamp });
15
+ pushSample(sample, timestampSec) {
16
+ FakeStreamOutlet.callsToPushSample.push({
17
+ sample,
18
+ timestampSec,
19
+ });
17
20
  }
18
21
  get name() {
19
22
  return this.options?.name ?? generateId();
@@ -1 +1 @@
1
- {"version":3,"file":"FakeStreamOutlet.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamOutlet/FakeStreamOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAQ/C,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAC1B,MAAM,CAAC,kBAAkB,GAAwC,EAAE,CAAA;IAEnE,MAAM,CAAC,iBAAiB,GAGzB,EAAE,CAAA;IAED,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAE5B,OAAO,CAAsB;IAEpC,YAAmB,OAA6B;QAC5C,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAEM,OAAO;QACV,gBAAgB,CAAC,iBAAiB,EAAE,CAAA;IACxC,CAAC;IAEM,UAAU,CAAC,MAAiB,EAAE,SAAkB;QACnD,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAA;IAClE,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,CAAA;IACjD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;IACnC,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,SAAS,CAAA;IACnD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC3D,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC5D,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,CAAA;IACrD,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,CAAA;IAC9C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,gBAAgB,CAAC,kBAAkB,GAAG,EAAE,CAAA;QACxC,gBAAgB,CAAC,iBAAiB,GAAG,EAAE,CAAA;QACvC,gBAAgB,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAC1C,CAAC"}
1
+ {"version":3,"file":"FakeStreamOutlet.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamOutlet/FakeStreamOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAQ/C,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAC1B,MAAM,CAAC,kBAAkB,GAAwC,EAAE,CAAA;IAEnE,MAAM,CAAC,iBAAiB,GAGzB,EAAE,CAAA;IAED,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAE5B,OAAO,CAAsB;IAEpC,YAAmB,OAA6B;QAC5C,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IAC1B,CAAC;IAEM,OAAO;QACV,gBAAgB,CAAC,iBAAiB,EAAE,CAAA;IACxC,CAAC;IAEM,UAAU,CAAC,MAAiB,EAAE,YAAqB;QACtD,gBAAgB,CAAC,iBAAiB,CAAC,IAAI,CAAC;YACpC,MAAM;YACN,YAAY;SACf,CAAC,CAAA;IACN,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAA;IAC7C,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,CAAA;IACjD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAA;IACnC,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,SAAS,CAAA;IACnD,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC3D,CAAC;IAED,IAAW,SAAS;QAChB,OAAO,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IACxD,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,aAAa,IAAI,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;IAC5D,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,CAAA;IACrD,CAAC;IAED,IAAW,KAAK;QACZ,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,CAAA;IAC9C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,gBAAgB,CAAC,kBAAkB,GAAG,EAAE,CAAA;QACxC,gBAAgB,CAAC,iBAAiB,GAAG,EAAE,CAAA;QACvC,gBAAgB,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAC1C,CAAC"}
@@ -1,4 +1,4 @@
1
- import { randomInt } from 'crypto';
1
+ import { randomInt } from 'node:crypto';
2
2
  import generateId from '@neurodevs/generate-id';
3
3
  import { TEST_SUPPORTED_CHANNEL_FORMATS } from './consts.js';
4
4
  export default function generateRandomOutletOptions() {
@@ -1 +1 @@
1
- {"version":3,"file":"generateRandomOutletOptions.js","sourceRoot":"","sources":["../../src/testDoubles/generateRandomOutletOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAG/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,OAAO,UAAU,2BAA2B;IAC/C,MAAM,gBAAgB,GAAG,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAA;IAEzE,OAAO;QACH,IAAI,EAAE,UAAU,EAAE;QAClB,IAAI,EAAE,UAAU,EAAE;QAClB,YAAY,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5D,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAChC,aAAa,EAAE,8BAA8B,CAAC,gBAAgB,CAAC;QAC/D,QAAQ,EAAE,UAAU,EAAE;QACtB,YAAY,EAAE,UAAU,EAAE;QAC1B,KAAK,EAAE,UAAU,EAAE;QACnB,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,aAAa,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;KACX,CAAA;AAC5B,CAAC"}
1
+ {"version":3,"file":"generateRandomOutletOptions.js","sourceRoot":"","sources":["../../src/testDoubles/generateRandomOutletOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAG/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,OAAO,UAAU,2BAA2B;IAC/C,MAAM,gBAAgB,GAAG,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAA;IAEzE,OAAO;QACH,IAAI,EAAE,UAAU,EAAE;QAClB,IAAI,EAAE,UAAU,EAAE;QAClB,YAAY,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5D,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAChC,aAAa,EAAE,8BAA8B,CAAC,gBAAgB,CAAC;QAC/D,QAAQ,EAAE,UAAU,EAAE;QACtB,YAAY,EAAE,UAAU,EAAE;QAC1B,KAAK,EAAE,UAAU,EAAE;QACnB,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,aAAa,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;KACX,CAAA;AAC5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import eslintConfigNdx from '@neurodevs/eslint-config-ndx'
2
+
3
+ export default eslintConfigNdx
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurodevs/node-lsl",
3
- "version": "18.0.0",
3
+ "version": "18.1.0",
4
4
  "description": "Lab Streaming Layer (LSL) bindings for Node",
5
5
  "type": "module",
6
6
  "keywords": [
@@ -14,7 +14,7 @@
14
14
  "brain-computer interface"
15
15
  ],
16
16
  "license": "MIT",
17
- "author": "Eric Yates <hello@ericthecurious.com>",
17
+ "author": "Eric Yates <hello@ericyates.me>",
18
18
  "homepage": "https://github.com/neurodevs/node-lsl",
19
19
  "repository": {
20
20
  "type": "git",
@@ -25,10 +25,9 @@
25
25
  },
26
26
  "main": "build/index.js",
27
27
  "scripts": {
28
- "build.ci": "yarn run build.tsc && yarn run build.resolve-paths && yarn run lint",
29
- "build.dev": "yarn run build.tsc --sourceMap ; yarn run resolve-paths.lint",
28
+ "build.ci": "yarn run build.tsc && yarn run lint",
29
+ "build.dev": "yarn run build.tsc --sourceMap ; yarn run fix.lint ; prettier --write . --log-level warn",
30
30
  "build.copy-files": "mkdir -p build && rsync -avzq --exclude='*.ts' ./src/ ./build/",
31
- "build.resolve-paths": "resolve-path-aliases --target build --patterns '**/*.js,**/*.d.ts'",
32
31
  "build.tsc": "yarn run build.copy-files && tsc",
33
32
  "clean": "yarn run clean.build",
34
33
  "clean.all": "yarn run clean.dependencies && yarn run clean.build",
@@ -36,75 +35,38 @@
36
35
  "clean.dependencies": "rm -rf node_modules/ package-lock.json yarn.lock",
37
36
  "fix.lint": "eslint --fix --cache '**/*.ts'",
38
37
  "lint": "eslint --cache '**/*.ts'",
39
- "lint.tsc": "tsc -p . --noEmit",
40
- "post.watch.build": "yarn run build.copy-files && yarn run build.resolve-paths",
41
38
  "rebuild": "yarn run clean.all && yarn install && yarn run build.dev",
42
39
  "update.dependencies": "yarn run clean.dependencies && yarn",
43
- "resolve-paths.lint": "yarn run build.resolve-paths ; yarn run lint",
44
40
  "test": "NODE_OPTIONS=--experimental-vm-modules jest",
45
- "watch.build.dev": "tsc-watch --sourceMap --onCompilationComplete 'yarn run post.watch.build'",
46
- "watch.lint": "concurrently 'yarn lint' \"chokidar 'src/**/*' -c 'yarn lint.tsc'\"",
47
- "watch.rebuild": "yarn run clean.all && yarn install && yarn run watch.build.dev",
48
- "watch.tsc": "tsc -w",
49
- "test.rs": "node build/test.js"
41
+ "watch.build.dev": "tsc-watch --sourceMap --onCompilationComplete 'yarn run build.copy-files'"
50
42
  },
51
43
  "dependencies": {
52
44
  "@neurodevs/generate-id": "^1.1.2",
53
- "@neurodevs/ndx-native": "^0.2.0",
45
+ "@neurodevs/ndx-native": "^7.0.1",
54
46
  "ffi-rs": "^1.3.1",
55
- "node-gyp": "^12.1.0",
56
- "ref-array-napi": "^1.2.2",
57
- "ref-napi": "^3.0.3",
58
47
  "ws": "^8.18.3"
59
48
  },
60
49
  "devDependencies": {
61
- "@neurodevs/node-tdd": "0.2.5",
62
- "@regressionproof/cli": "^0.8.0",
63
- "@regressionproof/jest-reporter": "^0.8.0",
64
- "@types/ffi-napi": "^4.0.10",
65
- "@types/node": "^25.0.2",
50
+ "@neurodevs/eslint-config-ndx": "^1.0.2",
51
+ "@neurodevs/node-tdd": "^3.0.1",
52
+ "@neurodevs/prettier-config-ndx": "^1.0.2",
66
53
  "@types/ws": "^8.18.1",
67
- "chokidar-cli": "^3.0.0",
68
- "concurrently": "^9.2.1",
69
- "eslint": "8.57.0",
70
- "eslint-config-spruce": "^11.2.26",
71
- "jest": "^30.2.0",
72
- "jest-circus": "^30.2.0",
73
- "prettier": "^3.7.4",
74
- "ts-node": "^10.9.2",
75
- "tsc-watch": "^7.2.0",
54
+ "prettier": "^3.8.3",
76
55
  "typescript": "^5.9.3"
77
56
  },
57
+ "resolutions": {
58
+ "glob": "^13.0.0"
59
+ },
78
60
  "jest": {
79
- "testRunner": "jest-circus/runner",
80
- "maxWorkers": 4,
81
- "testTimeout": 120000,
82
61
  "testEnvironment": "node",
83
- "extensionsToTreatAsEsm": [
84
- ".ts"
85
- ],
86
- "transform": {},
87
- "testPathIgnorePatterns": [
88
- "<rootDir>/tmp/",
89
- "<rootDir>/src/",
90
- "<rootDir>/node_modules/",
91
- "<rootDir>/build/__tests__/testDirsAndFiles/"
92
- ],
62
+ "testRunner": "jest-circus/runner",
93
63
  "testMatch": [
94
- "**/__tests__/**/*.test.js?(x)"
64
+ "<rootDir>/build/__tests__/**/*.test.js?(x)"
95
65
  ],
96
- "moduleNameMapper": {
97
- "^#spruce/(.*)$": "<rootDir>/build/.spruce/$1"
98
- },
66
+ "testTimeout": 5000,
67
+ "maxWorkers": 4,
99
68
  "reporters": [
100
- "default",
101
- "@regressionproof/jest-reporter"
102
- ]
103
- },
104
- "skill": {
105
- "namespace": "node-lsl",
106
- "upgradeIgnoreList": [
107
- "@sprucelabs/spruce-test-fixtures"
69
+ "default"
108
70
  ]
109
71
  }
110
72
  }
@@ -0,0 +1,3 @@
1
+ import prettierConfigNdx from '@neurodevs/prettier-config-ndx'
2
+
3
+ export default prettierConfigNdx
@@ -1,15 +1,13 @@
1
- import { FakeLiblsl, InfoHandle, LiblslAdapter } from '@neurodevs/ndx-native'
1
+ import {
2
+ FakeLiblsl,
3
+ FakeLibndx,
4
+ InfoHandle,
5
+ LiblslAdapter,
6
+ LibndxAdapter,
7
+ } from '@neurodevs/ndx-native'
2
8
  import AbstractModuleTest from '@neurodevs/node-tdd'
3
9
  import WebSocket, { Server } from 'ws'
4
10
 
5
- import LslEventMarkerEmitter from '../impl/LslEventMarkerEmitter.js'
6
- import LslStreamInfo from '../impl/LslStreamInfo.js'
7
- import LslStreamInlet, {
8
- OnDataCallback,
9
- StreamInletOptions,
10
- } from '../impl/LslStreamInlet.js'
11
- import LslStreamOutlet from '../impl/LslStreamOutlet.js'
12
- import LslWebSocketBridge from '../impl/LslWebSocketBridge.js'
13
11
  import SpyEventMarkerEmitter from '../testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js'
14
12
  import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo.js'
15
13
  import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo.js'
@@ -20,8 +18,19 @@ import SpyLslWebSocketBridge from '../testDoubles/WebSocketBridge/SpyLslWebSocke
20
18
  import FakeWebSocket from '../testDoubles/WebSockets/FakeWebSocket.js'
21
19
  import FakeWebSocketServer from '../testDoubles/WebSockets/FakeWebSocketServer.js'
22
20
 
21
+ import LslWebSocketBridge from '../impl/LslWebSocketBridge.js'
22
+ import BleDeviceController from '../impl/controllers/BleDeviceController.js'
23
+ import LslEventMarkerEmitter from '../impl/LslEventMarkerEmitter.js'
24
+ import LslStreamInfo from '../impl/LslStreamInfo.js'
25
+ import LslStreamInlet, {
26
+ OnDataCallback,
27
+ StreamInletOptions,
28
+ } from '../impl/LslStreamInlet.js'
29
+ import LslStreamOutlet from '../impl/LslStreamOutlet.js'
30
+
23
31
  export default class AbstractPackageTest extends AbstractModuleTest {
24
32
  protected static fakeLiblsl: FakeLiblsl
33
+ protected static fakeLibndx: FakeLibndx
25
34
 
26
35
  protected static async beforeEach() {
27
36
  await super.beforeEach()
@@ -35,6 +44,16 @@ export default class AbstractPackageTest extends AbstractModuleTest {
35
44
  FakeLiblsl.fakeInfoHandles = [{} as InfoHandle]
36
45
  }
37
46
 
47
+ protected static setFakeLibndx() {
48
+ this.fakeLibndx = new FakeLibndx()
49
+ LibndxAdapter.setInstance(this.fakeLibndx)
50
+
51
+ FakeLibndx.resetTestDouble()
52
+ FakeLibndx.fakeResult = { status: 200 }
53
+
54
+ BleDeviceController.ndx = this.fakeLibndx
55
+ }
56
+
38
57
  protected static setSpyStreamInfo() {
39
58
  LslStreamInfo.Class = SpyStreamInfo
40
59
  SpyStreamInfo.resetTestDouble()