@neurodevs/node-lsl 18.1.0 → 20.0.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.
- package/build/__tests__/AbstractPackageTest.d.ts +19 -17
- package/build/__tests__/AbstractPackageTest.js +54 -39
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/BleDeviceController.test.d.ts +6 -1
- package/build/__tests__/impl/BleDeviceController.test.js +44 -15
- package/build/__tests__/impl/BleDeviceController.test.js.map +1 -1
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js +13 -13
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInfo.test.js +2 -2
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +3 -5
- package/build/__tests__/impl/LslStreamInlet.test.js +13 -46
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamOutlet.test.js +9 -16
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js +9 -10
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/__tests__/impl/UsbDeviceController.test.d.ts +17 -0
- package/build/__tests__/impl/UsbDeviceController.test.js +81 -0
- package/build/__tests__/impl/UsbDeviceController.test.js.map +1 -0
- package/build/__tests__/impl/WindowedClockRegressor.test.d.ts +19 -0
- package/build/__tests__/impl/WindowedClockRegressor.test.js +172 -0
- package/build/__tests__/impl/WindowedClockRegressor.test.js.map +1 -0
- package/build/assertions.js +1 -1
- package/build/assertions.js.map +1 -1
- package/build/impl/LslEventMarkerEmitter.d.ts +12 -12
- package/build/impl/LslEventMarkerEmitter.js.map +1 -1
- package/build/impl/LslStreamInfo.d.ts +7 -7
- package/build/impl/LslStreamInfo.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +63 -20
- package/build/impl/LslStreamInlet.js +221 -64
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +16 -14
- package/build/impl/LslStreamOutlet.js +34 -37
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +10 -10
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/impl/clocks/WindowedClockRegressor.d.ts +24 -0
- package/build/impl/clocks/WindowedClockRegressor.js +73 -0
- package/build/impl/clocks/WindowedClockRegressor.js.map +1 -0
- package/build/impl/controllers/BleDeviceController.d.ts +3 -1
- package/build/impl/controllers/BleDeviceController.js +9 -1
- package/build/impl/controllers/BleDeviceController.js.map +1 -1
- package/build/impl/controllers/UsbDeviceController.d.ts +23 -0
- package/build/impl/controllers/UsbDeviceController.js +40 -0
- package/build/impl/controllers/UsbDeviceController.js.map +1 -0
- package/build/index.d.ts +32 -20
- package/build/index.js +39 -26
- package/build/index.js.map +1 -1
- package/build/scripts/{runLslEventMarkerEmitter.js → runLslEmitter.js} +5 -4
- package/build/scripts/runLslEmitter.js.map +1 -0
- package/build/scripts/{runLslStreamOutlet.js → runLslOutlet.js} +1 -1
- package/build/scripts/runLslOutlet.js.map +1 -0
- package/build/scripts/runMuse.js +1 -1
- package/build/scripts/runMuse.js.map +1 -1
- package/build/scripts/runUsb.js +14 -0
- package/build/scripts/runUsb.js.map +1 -0
- package/build/testDoubles/BleController/FakeBleController.d.ts +3 -1
- package/build/testDoubles/BleController/FakeBleController.js +5 -0
- package/build/testDoubles/BleController/FakeBleController.js.map +1 -1
- package/build/testDoubles/ClockRegressor/FakeClockRegressor.d.ts +17 -0
- package/build/testDoubles/ClockRegressor/FakeClockRegressor.js +23 -0
- package/build/testDoubles/ClockRegressor/FakeClockRegressor.js.map +1 -0
- package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.d.ts → LslEmitter/FakeLslEmitter.d.ts} +4 -4
- package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.js → LslEmitter/FakeLslEmitter.js} +7 -7
- package/build/testDoubles/LslEmitter/FakeLslEmitter.js.map +1 -0
- package/build/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.d.ts → LslEmitter/SpyLslEmitter.d.ts} +4 -4
- package/build/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.js → LslEmitter/SpyLslEmitter.js} +3 -3
- package/build/testDoubles/LslEmitter/SpyLslEmitter.js.map +1 -0
- package/build/testDoubles/LslEmitter/ThrowingLslEmitter.d.ts +9 -0
- package/build/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.js → LslEmitter/ThrowingLslEmitter.js} +2 -2
- package/build/testDoubles/LslEmitter/ThrowingLslEmitter.js.map +1 -0
- package/build/testDoubles/{StreamInfo/FakeStreamInfo.d.ts → LslInfo/FakeLslInfo.d.ts} +4 -4
- package/build/testDoubles/{StreamInfo/FakeStreamInfo.js → LslInfo/FakeLslInfo.js} +7 -7
- package/build/testDoubles/LslInfo/FakeLslInfo.js.map +1 -0
- package/build/testDoubles/LslInfo/SpyLslInfo.d.ts +10 -0
- package/build/testDoubles/{StreamInfo/SpyStreamInfo.js → LslInfo/SpyLslInfo.js} +4 -4
- package/build/testDoubles/LslInfo/SpyLslInfo.js.map +1 -0
- package/build/testDoubles/{StreamInlet/FakeStreamInlet.d.ts → LslInlet/FakeLslInlet.d.ts} +4 -4
- package/build/testDoubles/{StreamInlet/FakeStreamInlet.js → LslInlet/FakeLslInlet.js} +12 -11
- package/build/testDoubles/LslInlet/FakeLslInlet.js.map +1 -0
- package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +4 -0
- package/build/testDoubles/{StreamInlet/SpyStreamInlet.js → LslInlet/SpyLslInlet.js} +2 -2
- package/build/testDoubles/LslInlet/SpyLslInlet.js.map +1 -0
- package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.d.ts → LslOutlet/FakeLslOutlet.d.ts} +5 -5
- package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.js → LslOutlet/FakeLslOutlet.js} +8 -8
- package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +1 -0
- package/build/testDoubles/LslWsBridge/FakeLslWsBridge.d.ts +14 -0
- package/build/testDoubles/{WebSocketBridge/FakeWebSocketBridge.js → LslWsBridge/FakeLslWsBridge.js} +14 -14
- package/build/testDoubles/LslWsBridge/FakeLslWsBridge.js.map +1 -0
- package/build/testDoubles/LslWsBridge/SpyLslWsBridge.d.ts +4 -0
- package/build/testDoubles/{WebSocketBridge/SpyLslWebSocketBridge.js → LslWsBridge/SpyLslWsBridge.js} +2 -2
- package/build/testDoubles/LslWsBridge/SpyLslWsBridge.js.map +1 -0
- package/build/testDoubles/UsbController/FakeUsbController.d.ts +12 -0
- package/build/testDoubles/UsbController/FakeUsbController.js +25 -0
- package/build/testDoubles/UsbController/FakeUsbController.js.map +1 -0
- package/build/testDoubles/consts.d.ts +2 -12
- package/build/testDoubles/consts.js +0 -20
- package/build/testDoubles/consts.js.map +1 -1
- package/build/testDoubles/generateRandomOutletOptions.d.ts +2 -2
- package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
- package/package.json +6 -5
- package/src/__tests__/AbstractPackageTest.ts +78 -49
- package/src/__tests__/impl/BleDeviceController.test.ts +59 -18
- package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +19 -24
- package/src/__tests__/impl/LslStreamInfo.test.ts +8 -8
- package/src/__tests__/impl/LslStreamInlet.test.ts +21 -78
- package/src/__tests__/impl/LslStreamOutlet.test.ts +22 -28
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +15 -18
- package/src/__tests__/impl/UsbDeviceController.test.ts +109 -0
- package/src/__tests__/impl/WindowedClockRegressor.test.ts +262 -0
- package/src/assertions.ts +1 -2
- package/src/impl/LslEventMarkerEmitter.ts +15 -17
- package/src/impl/LslStreamInfo.ts +7 -9
- package/src/impl/LslStreamInlet.ts +304 -77
- package/src/impl/LslStreamOutlet.ts +59 -57
- package/src/impl/LslWebSocketBridge.ts +15 -18
- package/src/impl/clocks/WindowedClockRegressor.ts +136 -0
- package/src/impl/controllers/BleDeviceController.ts +18 -1
- package/src/impl/controllers/UsbDeviceController.ts +65 -0
- package/src/index.ts +48 -28
- package/src/scripts/{runLslEventMarkerEmitter.ts → runLslEmitter.ts} +4 -3
- package/src/scripts/runMuse.ts +1 -1
- package/src/scripts/runUsb.ts +20 -0
- package/src/testDoubles/BleController/FakeBleController.ts +11 -0
- package/src/testDoubles/ClockRegressor/FakeClockRegressor.ts +46 -0
- package/src/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.ts → LslEmitter/FakeLslEmitter.ts} +10 -10
- package/src/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.ts → LslEmitter/SpyLslEmitter.ts} +4 -4
- package/src/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.ts → LslEmitter/ThrowingLslEmitter.ts} +4 -4
- package/src/testDoubles/{StreamInfo/FakeStreamInfo.ts → LslInfo/FakeLslInfo.ts} +9 -9
- package/src/testDoubles/{StreamInfo/SpyStreamInfo.ts → LslInfo/SpyLslInfo.ts} +5 -5
- package/src/testDoubles/{StreamInlet/FakeStreamInlet.ts → LslInlet/FakeLslInlet.ts} +15 -14
- package/src/testDoubles/LslInlet/SpyLslInlet.ts +10 -0
- package/src/testDoubles/{StreamOutlet/FakeStreamOutlet.ts → LslOutlet/FakeLslOutlet.ts} +11 -14
- package/src/testDoubles/{WebSocketBridge/FakeWebSocketBridge.ts → LslWsBridge/FakeLslWsBridge.ts} +19 -20
- package/src/testDoubles/LslWsBridge/SpyLslWsBridge.ts +9 -0
- package/src/testDoubles/UsbController/FakeUsbController.ts +34 -0
- package/src/testDoubles/consts.ts +3 -23
- package/src/testDoubles/generateRandomOutletOptions.ts +2 -2
- package/build/consts.d.ts +0 -11
- package/build/consts.js +0 -21
- package/build/consts.js.map +0 -1
- package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +0 -22
- package/build/impl/workers/inlet/LslStreamInlet.worker.js +0 -42
- package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +0 -1
- package/build/impl/workers/inlet/StreamInletWorker.d.ts +0 -73
- package/build/impl/workers/inlet/StreamInletWorker.js +0 -253
- package/build/impl/workers/inlet/StreamInletWorker.js.map +0 -1
- package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +0 -32
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js +0 -82
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +0 -1
- package/build/scripts/discoverMuse.js +0 -40
- package/build/scripts/discoverMuse.js.map +0 -1
- package/build/scripts/runLslEventMarkerEmitter.js.map +0 -1
- package/build/scripts/runLslStreamOutlet.js.map +0 -1
- package/build/scripts/testDestroyOutlet.d.ts +0 -1
- package/build/scripts/testDestroyOutlet.js +0 -4
- package/build/scripts/testDestroyOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +0 -9
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +0 -1
- package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +0 -10
- package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +0 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +0 -1
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +0 -4
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +0 -1
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +0 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +0 -14
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +0 -1
- package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.d.ts +0 -4
- package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js.map +0 -1
- package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +0 -27
- package/build/testDoubles/WorkerThreads/FakeWorker.js +0 -67
- package/build/testDoubles/WorkerThreads/FakeWorker.js.map +0 -1
- package/src/consts.ts +0 -21
- package/src/impl/workers/inlet/LslStreamInlet.worker.ts +0 -74
- package/src/impl/workers/inlet/StreamInletWorker.ts +0 -348
- package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +0 -144
- package/src/scripts/discoverMuse.ts +0 -50
- package/src/scripts/testDestroyOutlet.ts +0 -5
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +0 -10
- package/src/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.ts +0 -9
- package/src/testDoubles/WorkerThreads/FakeWorker.ts +0 -99
- /package/build/scripts/{discoverMuse.d.ts → runLslEmitter.d.ts} +0 -0
- /package/build/scripts/{runLslEventMarkerEmitter.d.ts → runLslOutlet.d.ts} +0 -0
- /package/build/scripts/{runLslStreamOutlet.d.ts → runUsb.d.ts} +0 -0
- /package/src/scripts/{runLslStreamOutlet.ts → runLslOutlet.ts} +0 -0
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { randomInt } from 'node:crypto'
|
|
2
|
+
|
|
3
|
+
import WebSocket, { Server } from 'ws'
|
|
1
4
|
import {
|
|
2
5
|
FakeLiblsl,
|
|
3
6
|
FakeLibndx,
|
|
@@ -6,25 +9,23 @@ import {
|
|
|
6
9
|
LibndxAdapter,
|
|
7
10
|
} from '@neurodevs/ndx-native'
|
|
8
11
|
import AbstractModuleTest from '@neurodevs/node-tdd'
|
|
9
|
-
import WebSocket, { Server } from 'ws'
|
|
10
12
|
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import
|
|
17
|
-
import
|
|
13
|
+
import SpyLslEmitter from '../testDoubles/LslEmitter/SpyLslEmitter.js'
|
|
14
|
+
import FakeLslInfo from '../testDoubles/LslInfo/FakeLslInfo.js'
|
|
15
|
+
import SpyLslInfo from '../testDoubles/LslInfo/SpyLslInfo.js'
|
|
16
|
+
import FakeLslInlet from '../testDoubles/LslInlet/FakeLslInlet.js'
|
|
17
|
+
import SpyLslInlet from '../testDoubles/LslInlet/SpyLslInlet.js'
|
|
18
|
+
import FakeLslOutlet from '../testDoubles/LslOutlet/FakeLslOutlet.js'
|
|
19
|
+
import SpyLslWsBridge from '../testDoubles/LslWsBridge/SpyLslWsBridge.js'
|
|
18
20
|
import FakeWebSocket from '../testDoubles/WebSockets/FakeWebSocket.js'
|
|
19
21
|
import FakeWebSocketServer from '../testDoubles/WebSockets/FakeWebSocketServer.js'
|
|
20
|
-
|
|
21
22
|
import LslWebSocketBridge from '../impl/LslWebSocketBridge.js'
|
|
22
23
|
import BleDeviceController from '../impl/controllers/BleDeviceController.js'
|
|
23
24
|
import LslEventMarkerEmitter from '../impl/LslEventMarkerEmitter.js'
|
|
24
25
|
import LslStreamInfo from '../impl/LslStreamInfo.js'
|
|
25
26
|
import LslStreamInlet, {
|
|
26
27
|
OnDataCallback,
|
|
27
|
-
|
|
28
|
+
LslInletOptions,
|
|
28
29
|
} from '../impl/LslStreamInlet.js'
|
|
29
30
|
import LslStreamOutlet from '../impl/LslStreamOutlet.js'
|
|
30
31
|
|
|
@@ -32,8 +33,31 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
32
33
|
protected static fakeLiblsl: FakeLiblsl
|
|
33
34
|
protected static fakeLibndx: FakeLibndx
|
|
34
35
|
|
|
36
|
+
protected static readonly fakeLslInfo = new FakeLslInfo()
|
|
37
|
+
|
|
38
|
+
protected static readonly name_ = this.generateId()
|
|
39
|
+
protected static readonly type = this.generateId()
|
|
40
|
+
protected static readonly sourceId = this.generateId()
|
|
41
|
+
protected static readonly units = this.generateId()
|
|
42
|
+
|
|
43
|
+
protected static readonly channelNames = [
|
|
44
|
+
this.generateId(),
|
|
45
|
+
this.generateId(),
|
|
46
|
+
this.generateId(),
|
|
47
|
+
]
|
|
48
|
+
|
|
49
|
+
protected static readonly channelCount = this.channelNames.length
|
|
50
|
+
|
|
51
|
+
protected static readonly chunkSize = randomInt(2, 100)
|
|
52
|
+
protected static readonly sampleRateHz = Math.floor(Math.random() * 100)
|
|
53
|
+
protected static readonly maxBufferedMs = Math.floor(Math.random() * 1000)
|
|
54
|
+
|
|
35
55
|
protected static async beforeEach() {
|
|
36
56
|
await super.beforeEach()
|
|
57
|
+
|
|
58
|
+
this.setImmediateTimeouts()
|
|
59
|
+
|
|
60
|
+
this.setFakeLibndx()
|
|
37
61
|
}
|
|
38
62
|
|
|
39
63
|
protected static setFakeLiblsl() {
|
|
@@ -44,6 +68,30 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
44
68
|
FakeLiblsl.fakeInfoHandles = [{} as InfoHandle]
|
|
45
69
|
}
|
|
46
70
|
|
|
71
|
+
protected static callsToSetTimeout: number[] = []
|
|
72
|
+
|
|
73
|
+
protected static setImmediateTimeouts() {
|
|
74
|
+
this.callsToSetTimeout = []
|
|
75
|
+
|
|
76
|
+
BleDeviceController.setTimeout = ((
|
|
77
|
+
callback: (...args: unknown[]) => void,
|
|
78
|
+
delayMs?: number,
|
|
79
|
+
...args: unknown[]
|
|
80
|
+
) => {
|
|
81
|
+
this.callsToSetTimeout.push(delayMs ?? 0)
|
|
82
|
+
return setTimeout(callback, 0, ...args)
|
|
83
|
+
}) as unknown as typeof setTimeout
|
|
84
|
+
|
|
85
|
+
LslStreamOutlet.setTimeout = ((
|
|
86
|
+
callback: (...args: unknown[]) => void,
|
|
87
|
+
delayMs?: number,
|
|
88
|
+
...args: unknown[]
|
|
89
|
+
) => {
|
|
90
|
+
this.callsToSetTimeout.push(delayMs ?? 0)
|
|
91
|
+
return setTimeout(callback, 0, ...args)
|
|
92
|
+
}) as unknown as typeof setTimeout
|
|
93
|
+
}
|
|
94
|
+
|
|
47
95
|
protected static setFakeLibndx() {
|
|
48
96
|
this.fakeLibndx = new FakeLibndx()
|
|
49
97
|
LibndxAdapter.setInstance(this.fakeLibndx)
|
|
@@ -54,36 +102,36 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
54
102
|
BleDeviceController.ndx = this.fakeLibndx
|
|
55
103
|
}
|
|
56
104
|
|
|
57
|
-
protected static
|
|
58
|
-
LslStreamInfo.Class =
|
|
59
|
-
|
|
105
|
+
protected static setSpyLslInfo() {
|
|
106
|
+
LslStreamInfo.Class = SpyLslInfo
|
|
107
|
+
SpyLslInfo.resetTestDouble()
|
|
60
108
|
}
|
|
61
109
|
|
|
62
|
-
protected static
|
|
63
|
-
LslStreamInfo.Class =
|
|
64
|
-
|
|
110
|
+
protected static setFakeLslInfo() {
|
|
111
|
+
LslStreamInfo.Class = FakeLslInfo
|
|
112
|
+
FakeLslInfo.resetTestDouble()
|
|
65
113
|
}
|
|
66
114
|
|
|
67
|
-
protected static
|
|
68
|
-
LslStreamInlet.Class =
|
|
115
|
+
protected static setSpyLslInlet() {
|
|
116
|
+
LslStreamInlet.Class = SpyLslInlet
|
|
69
117
|
}
|
|
70
118
|
|
|
71
|
-
protected static
|
|
72
|
-
LslStreamInlet.Class =
|
|
73
|
-
|
|
119
|
+
protected static setFakeLslInlet() {
|
|
120
|
+
LslStreamInlet.Class = FakeLslInlet
|
|
121
|
+
FakeLslInlet.resetTestDouble()
|
|
74
122
|
}
|
|
75
123
|
|
|
76
|
-
protected static
|
|
77
|
-
LslStreamOutlet.Class =
|
|
78
|
-
|
|
124
|
+
protected static setFakeLslOutlet() {
|
|
125
|
+
LslStreamOutlet.Class = FakeLslOutlet
|
|
126
|
+
FakeLslOutlet.resetTestDouble()
|
|
79
127
|
}
|
|
80
128
|
|
|
81
|
-
protected static
|
|
82
|
-
LslEventMarkerEmitter.Class =
|
|
129
|
+
protected static setSpyLslEmitter() {
|
|
130
|
+
LslEventMarkerEmitter.Class = SpyLslEmitter
|
|
83
131
|
}
|
|
84
132
|
|
|
85
|
-
protected static
|
|
86
|
-
LslWebSocketBridge.Class =
|
|
133
|
+
protected static setSpyLslWsBridge() {
|
|
134
|
+
LslWebSocketBridge.Class = SpyLslWsBridge
|
|
87
135
|
}
|
|
88
136
|
|
|
89
137
|
protected static setFakeWebSocket() {
|
|
@@ -96,30 +144,11 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
96
144
|
FakeWebSocketServer.resetTestDouble()
|
|
97
145
|
}
|
|
98
146
|
|
|
99
|
-
protected static readonly fakeStreamInfo = new FakeStreamInfo()
|
|
100
|
-
|
|
101
|
-
protected static readonly name_ = this.generateId()
|
|
102
|
-
protected static readonly type = this.generateId()
|
|
103
|
-
protected static readonly sourceId = this.generateId()
|
|
104
|
-
protected static readonly units = this.generateId()
|
|
105
|
-
|
|
106
|
-
protected static readonly channelNames = [
|
|
107
|
-
this.generateId(),
|
|
108
|
-
this.generateId(),
|
|
109
|
-
this.generateId(),
|
|
110
|
-
]
|
|
111
|
-
|
|
112
|
-
protected static readonly channelCount = this.channelNames.length
|
|
113
|
-
|
|
114
|
-
protected static readonly chunkSize = 2
|
|
115
|
-
protected static readonly sampleRateHz = Math.floor(Math.random() * 100)
|
|
116
|
-
protected static readonly maxBufferedMs = Math.floor(Math.random() * 1000)
|
|
117
|
-
|
|
118
147
|
protected static async LslStreamInlet(
|
|
119
|
-
options: Partial<
|
|
148
|
+
options: Partial<LslInletOptions>,
|
|
120
149
|
onData: OnDataCallback
|
|
121
150
|
) {
|
|
122
|
-
const defaultOptions:
|
|
151
|
+
const defaultOptions: LslInletOptions = {
|
|
123
152
|
sourceId: this.sourceId,
|
|
124
153
|
chunkSize: this.chunkSize,
|
|
125
154
|
maxBufferedMs: this.maxBufferedMs,
|
|
@@ -35,6 +35,14 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
|
|
|
35
35
|
},
|
|
36
36
|
]
|
|
37
37
|
|
|
38
|
+
private static readonly extraCharCallbacks = [
|
|
39
|
+
{
|
|
40
|
+
charUuid: this.generateId(),
|
|
41
|
+
charName: this.generateId(),
|
|
42
|
+
onData: async () => {},
|
|
43
|
+
},
|
|
44
|
+
]
|
|
45
|
+
|
|
38
46
|
private static onConnected = (_peripheral: NativePeripheral) => {
|
|
39
47
|
this.wasConnected = true
|
|
40
48
|
}
|
|
@@ -58,13 +66,11 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
|
|
|
58
66
|
await super.beforeEach()
|
|
59
67
|
|
|
60
68
|
BleDeviceController.waitAfterMs = 0
|
|
61
|
-
|
|
62
|
-
this.setFakeLibndx()
|
|
63
69
|
BleDeviceController.Class = SpyBleController
|
|
64
70
|
|
|
65
71
|
this.wasConnected = false
|
|
66
72
|
|
|
67
|
-
this.instance =
|
|
73
|
+
this.instance = this.BleDeviceController()
|
|
68
74
|
}
|
|
69
75
|
|
|
70
76
|
@test()
|
|
@@ -262,13 +268,10 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
|
|
|
262
268
|
const waitAfterMs = 20
|
|
263
269
|
BleDeviceController.waitAfterMs = waitAfterMs
|
|
264
270
|
|
|
265
|
-
const t0 = Date.now()
|
|
266
271
|
await this.connect()
|
|
267
|
-
const t1 = Date.now()
|
|
268
272
|
|
|
269
|
-
assert.
|
|
270
|
-
|
|
271
|
-
100 + waitAfterMs * 0.8,
|
|
273
|
+
assert.isTruthy(
|
|
274
|
+
this.callsToSetTimeout.includes(waitAfterMs),
|
|
272
275
|
'Did not wait after on connected!'
|
|
273
276
|
)
|
|
274
277
|
}
|
|
@@ -310,6 +313,42 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
|
|
|
310
313
|
)
|
|
311
314
|
}
|
|
312
315
|
|
|
316
|
+
@test()
|
|
317
|
+
protected static async subscribeCharacteristicsCallsLibndxBinding() {
|
|
318
|
+
await this.subscribeCharacteristics()
|
|
319
|
+
|
|
320
|
+
assert.isEqualDeep(
|
|
321
|
+
FakeLibndx.callsToAddBleCharCallbacks[0],
|
|
322
|
+
{
|
|
323
|
+
deviceUuid: this.uuid,
|
|
324
|
+
charCallbacks: this.extraCharCallbacks,
|
|
325
|
+
},
|
|
326
|
+
'Did not call addBleCharCallbacks as expected!'
|
|
327
|
+
)
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
@test()
|
|
331
|
+
protected static async subscribeCharacteristicsMergesIntoCharCallbacks() {
|
|
332
|
+
await this.subscribeCharacteristics()
|
|
333
|
+
|
|
334
|
+
assert.isEqualDeep(
|
|
335
|
+
this.instance.getCharacteristicCallbacks(),
|
|
336
|
+
[...this.charCallbacks, ...this.extraCharCallbacks],
|
|
337
|
+
'Did not merge the newly subscribed callbacks into charCallbacks!'
|
|
338
|
+
)
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
@test()
|
|
342
|
+
protected static async subscribeCharacteristicsThrowsOn400() {
|
|
343
|
+
this.setFake400Error()
|
|
344
|
+
|
|
345
|
+
await assert.doesThrowAsync(
|
|
346
|
+
async () => await this.subscribeCharacteristics(),
|
|
347
|
+
this.fake400Error,
|
|
348
|
+
'Did not throw error!'
|
|
349
|
+
)
|
|
350
|
+
}
|
|
351
|
+
|
|
313
352
|
@test()
|
|
314
353
|
protected static async callsSetBleRssiInterval() {
|
|
315
354
|
await this.connect()
|
|
@@ -431,7 +470,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
|
|
|
431
470
|
if (getCall()) {
|
|
432
471
|
resolve()
|
|
433
472
|
} else {
|
|
434
|
-
setTimeout(check,
|
|
473
|
+
setTimeout(check, 0)
|
|
435
474
|
}
|
|
436
475
|
}
|
|
437
476
|
check()
|
|
@@ -445,6 +484,10 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
|
|
|
445
484
|
)
|
|
446
485
|
}
|
|
447
486
|
|
|
487
|
+
private static async subscribeCharacteristics() {
|
|
488
|
+
await this.instance.subscribeCharacteristics(this.extraCharCallbacks)
|
|
489
|
+
}
|
|
490
|
+
|
|
448
491
|
private static async disconnect() {
|
|
449
492
|
await this.instance.disconnect()
|
|
450
493
|
}
|
|
@@ -469,24 +512,22 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
|
|
|
469
512
|
}
|
|
470
513
|
}
|
|
471
514
|
|
|
472
|
-
private static
|
|
515
|
+
private static BleDeviceController(
|
|
473
516
|
options?: Partial<BleControllerOptions>
|
|
474
517
|
) {
|
|
475
|
-
return
|
|
518
|
+
return BleDeviceController.Create({
|
|
476
519
|
deviceUuid: this.uuid,
|
|
477
520
|
charCallbacks: this.charCallbacks,
|
|
478
521
|
onConnected: this.onConnected,
|
|
479
522
|
rssiIntervalMs: this.rssiIntervalMs,
|
|
480
523
|
...options,
|
|
481
|
-
})
|
|
524
|
+
}) as SpyBleController
|
|
482
525
|
}
|
|
483
526
|
|
|
484
|
-
private static
|
|
485
|
-
return
|
|
527
|
+
private static BleControllerWithPrefix() {
|
|
528
|
+
return this.BleDeviceController({
|
|
486
529
|
deviceNamePrefix: this.namePrefix,
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
rssiIntervalMs: this.rssiIntervalMs,
|
|
490
|
-
} as unknown as BleControllerOptions)) as SpyBleController
|
|
530
|
+
deviceUuid: undefined,
|
|
531
|
+
})
|
|
491
532
|
}
|
|
492
533
|
}
|
|
@@ -3,23 +3,23 @@ import { randomInt } from 'node:crypto'
|
|
|
3
3
|
import { assert, test } from '@neurodevs/node-tdd'
|
|
4
4
|
|
|
5
5
|
import LslEventMarkerEmitter, {
|
|
6
|
-
|
|
6
|
+
EmitOptions,
|
|
7
7
|
} from '../../impl/LslEventMarkerEmitter.js'
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
8
|
+
import { LslOutletOptions } from '../../impl/LslStreamOutlet.js'
|
|
9
|
+
import SpyLslEmitter from '../../testDoubles/LslEmitter/SpyLslEmitter.js'
|
|
10
10
|
import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js'
|
|
11
|
-
import
|
|
11
|
+
import FakeLslOutlet from '../../testDoubles/LslOutlet/FakeLslOutlet.js'
|
|
12
12
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
13
13
|
|
|
14
14
|
export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
15
|
-
private static instance:
|
|
15
|
+
private static instance: SpyLslEmitter
|
|
16
16
|
|
|
17
17
|
protected static async beforeEach() {
|
|
18
18
|
await super.beforeEach()
|
|
19
19
|
|
|
20
20
|
this.setFakeLiblsl()
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
21
|
+
this.setFakeLslOutlet()
|
|
22
|
+
this.setSpyLslEmitter()
|
|
23
23
|
|
|
24
24
|
this.instance = await this.LslEventMarkerEmitter()
|
|
25
25
|
}
|
|
@@ -35,7 +35,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
35
35
|
protected static async loadsWithEventMarkerSpecificOptions() {
|
|
36
36
|
assert.isEqualDeep(
|
|
37
37
|
{
|
|
38
|
-
...
|
|
38
|
+
...FakeLslOutlet.callsToConstructor[0],
|
|
39
39
|
name: undefined,
|
|
40
40
|
sourceId: undefined,
|
|
41
41
|
},
|
|
@@ -51,14 +51,14 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
51
51
|
)
|
|
52
52
|
|
|
53
53
|
assert.isTrue(
|
|
54
|
-
|
|
54
|
+
FakeLslOutlet.callsToConstructor[0]?.sourceId.startsWith(
|
|
55
55
|
'event-markers-'
|
|
56
56
|
),
|
|
57
57
|
'Source ID was not generated uniquely!'
|
|
58
58
|
)
|
|
59
59
|
|
|
60
60
|
assert.isTrue(
|
|
61
|
-
|
|
61
|
+
FakeLslOutlet.callsToConstructor[0]?.name.startsWith(
|
|
62
62
|
'Event markers ('
|
|
63
63
|
),
|
|
64
64
|
'Name was not generated uniquely!'
|
|
@@ -70,7 +70,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
70
70
|
const options = generateRandomOutletOptions()
|
|
71
71
|
await this.LslEventMarkerEmitter(options)
|
|
72
72
|
|
|
73
|
-
assert.isEqualDeep(
|
|
73
|
+
assert.isEqualDeep(FakeLslOutlet.callsToConstructor[1], options)
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
@test()
|
|
@@ -81,7 +81,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
81
81
|
const marker = markers[0]
|
|
82
82
|
|
|
83
83
|
assert.isEqual(
|
|
84
|
-
|
|
84
|
+
FakeLslOutlet.callsToPushSample[0]?.sample[0],
|
|
85
85
|
marker.name,
|
|
86
86
|
'Pushed the wrong marker!'
|
|
87
87
|
)
|
|
@@ -93,7 +93,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
93
93
|
protected static async emittingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
|
|
94
94
|
const markers = await this.emitManyFor(2)
|
|
95
95
|
|
|
96
|
-
assert.isEqual(
|
|
96
|
+
assert.isEqual(FakeLslOutlet.callsToPushSample.length, 2)
|
|
97
97
|
|
|
98
98
|
assert.isEqual(
|
|
99
99
|
this.instance.totalwaitAfterMs,
|
|
@@ -162,7 +162,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
162
162
|
await this.emit(markerName)
|
|
163
163
|
|
|
164
164
|
assert.isEqualDeep(
|
|
165
|
-
|
|
165
|
+
FakeLslOutlet.callsToPushSample[0]?.sample,
|
|
166
166
|
[markerName],
|
|
167
167
|
'Pushed the wrong sample!'
|
|
168
168
|
)
|
|
@@ -170,7 +170,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
170
170
|
|
|
171
171
|
@test()
|
|
172
172
|
protected static async emitWaitsForMsIfPassed() {
|
|
173
|
-
|
|
173
|
+
SpyLslEmitter.shouldCallWaitOnSuper = true
|
|
174
174
|
|
|
175
175
|
const waitAfterMs = 10
|
|
176
176
|
|
|
@@ -190,7 +190,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
190
190
|
this.destroy()
|
|
191
191
|
|
|
192
192
|
assert.isEqual(
|
|
193
|
-
|
|
193
|
+
FakeLslOutlet.numCallsToDestroy,
|
|
194
194
|
1,
|
|
195
195
|
'Did not call destroy on outlet!'
|
|
196
196
|
)
|
|
@@ -268,10 +268,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
268
268
|
await this.emit(this.markerName)
|
|
269
269
|
}
|
|
270
270
|
|
|
271
|
-
private static async emit(
|
|
272
|
-
markerName: string,
|
|
273
|
-
options?: EventMarkerOptions
|
|
274
|
-
) {
|
|
271
|
+
private static async emit(markerName: string, options?: EmitOptions) {
|
|
275
272
|
return this.instance.emit(markerName, options)
|
|
276
273
|
}
|
|
277
274
|
|
|
@@ -314,10 +311,8 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
|
314
311
|
}
|
|
315
312
|
|
|
316
313
|
private static async LslEventMarkerEmitter(
|
|
317
|
-
options?: Partial<
|
|
314
|
+
options?: Partial<LslOutletOptions>
|
|
318
315
|
) {
|
|
319
|
-
return (await LslEventMarkerEmitter.Create(
|
|
320
|
-
options
|
|
321
|
-
)) as SpyEventMarkerEmitter
|
|
316
|
+
return (await LslEventMarkerEmitter.Create(options)) as SpyLslEmitter
|
|
322
317
|
}
|
|
323
318
|
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import SpyStreamInfo from '../../testDoubles/StreamInfo/SpyStreamInfo.js'
|
|
3
|
+
import LslStreamInfo, { LslInfoOptions } from '../../impl/LslStreamInfo.js'
|
|
4
|
+
import SpyLslInfo from '../../testDoubles/LslInfo/SpyLslInfo.js'
|
|
6
5
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
6
|
+
import { CHANNEL_FORMATS } from '@neurodevs/ndx-native'
|
|
7
7
|
|
|
8
8
|
export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
9
|
-
private static instance:
|
|
9
|
+
private static instance: SpyLslInfo
|
|
10
10
|
|
|
11
11
|
protected static async beforeEach() {
|
|
12
12
|
await super.beforeEach()
|
|
13
13
|
|
|
14
14
|
this.setFakeLiblsl()
|
|
15
|
-
this.
|
|
15
|
+
this.setSpyLslInfo()
|
|
16
16
|
|
|
17
17
|
this.instance = this.LslStreamInfo()
|
|
18
18
|
}
|
|
@@ -225,12 +225,12 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
225
225
|
channelNames: this.channelNames,
|
|
226
226
|
channelFormat: 'float32',
|
|
227
227
|
sampleRateHz: 100 * Math.random(),
|
|
228
|
-
} as
|
|
228
|
+
} as LslInfoOptions
|
|
229
229
|
|
|
230
|
-
private static LslStreamInfo(options?: Partial<
|
|
230
|
+
private static LslStreamInfo(options?: Partial<LslInfoOptions>) {
|
|
231
231
|
return LslStreamInfo.Create({
|
|
232
232
|
...this.defaultOptions,
|
|
233
233
|
...options,
|
|
234
|
-
}) as
|
|
234
|
+
}) as SpyLslInfo
|
|
235
235
|
}
|
|
236
236
|
}
|