@neurodevs/node-lsl 17.1.1 → 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.
- package/.claude/settings.local.json +10 -0
- package/.vscode/launch.json +54 -57
- package/.vscode/settings.json +61 -66
- package/.vscode/tasks.json +98 -129
- package/README.md +20 -44
- package/build/__tests__/AbstractPackageTest.d.ts +7 -5
- package/build/__tests__/AbstractPackageTest.js +22 -15
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/BleDeviceController.test.d.ts +54 -0
- package/build/__tests__/impl/BleDeviceController.test.js +333 -0
- package/build/__tests__/impl/BleDeviceController.test.js.map +1 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.d.ts +34 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js +243 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -0
- package/build/__tests__/impl/LslStreamInfo.test.d.ts +0 -3
- package/build/__tests__/impl/LslStreamInfo.test.js +2 -27
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +20 -8
- package/build/__tests__/impl/LslStreamInlet.test.js +224 -69
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamOutlet.test.d.ts +3 -7
- package/build/__tests__/impl/LslStreamOutlet.test.js +40 -50
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js +19 -20
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/assertions.d.ts +1 -1
- package/build/assertions.js.map +1 -1
- package/build/impl/LslEventMarkerEmitter.d.ts +35 -0
- package/build/impl/LslEventMarkerEmitter.js +86 -0
- package/build/impl/LslEventMarkerEmitter.js.map +1 -0
- package/build/impl/LslStreamInfo.d.ts +4 -8
- package/build/impl/LslStreamInfo.js +8 -21
- package/build/impl/LslStreamInfo.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +31 -50
- package/build/impl/LslStreamInlet.js +79 -149
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +15 -18
- package/build/impl/LslStreamOutlet.js +39 -47
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +4 -5
- package/build/impl/LslWebSocketBridge.js +10 -10
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/impl/controllers/BleDeviceController.d.ts +58 -0
- package/build/impl/controllers/BleDeviceController.js +145 -0
- package/build/impl/controllers/BleDeviceController.js.map +1 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +22 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.js +42 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +1 -0
- package/build/impl/workers/inlet/StreamInletWorker.d.ts +73 -0
- package/build/impl/workers/inlet/StreamInletWorker.js +253 -0
- package/build/impl/workers/inlet/StreamInletWorker.js.map +1 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +32 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js +82 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +1 -0
- package/build/index.d.ts +14 -14
- package/build/index.js +16 -16
- package/build/index.js.map +1 -1
- package/build/scripts/discoverMuse.js +40 -0
- package/build/scripts/discoverMuse.js.map +1 -0
- package/build/scripts/finalizeHandles.d.ts +2 -0
- package/build/scripts/finalizeHandles.js +48 -0
- package/build/scripts/finalizeHandles.js.map +1 -0
- package/build/scripts/runLslEventMarkerEmitter.d.ts +1 -0
- package/build/scripts/runLslEventMarkerEmitter.js +11 -0
- package/build/scripts/runLslEventMarkerEmitter.js.map +1 -0
- package/build/scripts/runMuse.d.ts +1 -0
- package/build/scripts/runMuse.js +40 -0
- package/build/scripts/runMuse.js.map +1 -0
- package/build/scripts/runOutletToInlet.js +7 -6
- package/build/scripts/runOutletToInlet.js.map +1 -1
- package/build/scripts/testDestroyOutlet.d.ts +1 -0
- package/build/scripts/testDestroyOutlet.js +4 -0
- package/build/scripts/testDestroyOutlet.js.map +1 -0
- package/build/testDoubles/BleController/FakeBleController.d.ts +24 -0
- package/build/testDoubles/BleController/FakeBleController.js +42 -0
- package/build/testDoubles/BleController/FakeBleController.js.map +1 -0
- package/build/testDoubles/BleController/SpyBleController.d.ts +14 -0
- package/build/testDoubles/BleController/SpyBleController.js +48 -0
- package/build/testDoubles/BleController/SpyBleController.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.d.ts +17 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js +30 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.d.ts +10 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js +23 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +9 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js +19 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +3 -3
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js +3 -3
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +8 -10
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js +6 -7
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +2 -5
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js +2 -8
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +7 -9
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +8 -8
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +1 -1
- package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +27 -0
- package/build/testDoubles/WorkerThreads/FakeWorker.js +67 -0
- package/build/testDoubles/WorkerThreads/FakeWorker.js.map +1 -0
- package/build/testDoubles/generateRandomOutletOptions.js +1 -1
- package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
- package/build/validations.js +0 -2
- package/build/validations.js.map +1 -1
- package/eslint.config.js +3 -0
- package/package.json +27 -49
- package/prettier.config.js +3 -0
- package/src/__tests__/AbstractPackageTest.ts +38 -21
- package/src/__tests__/impl/BleDeviceController.test.ts +492 -0
- package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +323 -0
- package/src/__tests__/impl/LslStreamInfo.test.ts +3 -40
- package/src/__tests__/impl/LslStreamInlet.test.ts +344 -97
- package/src/__tests__/impl/LslStreamOutlet.test.ts +65 -73
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +22 -21
- package/src/assertions.ts +2 -1
- package/src/impl/LslEventMarkerEmitter.ts +133 -0
- package/src/impl/LslStreamInfo.ts +17 -29
- package/src/impl/LslStreamInlet.ts +102 -215
- package/src/impl/LslStreamOutlet.ts +54 -78
- package/src/impl/LslWebSocketBridge.ts +14 -14
- package/src/impl/controllers/BleDeviceController.ts +223 -0
- package/src/impl/workers/inlet/LslStreamInlet.worker.ts +74 -0
- package/src/impl/workers/inlet/StreamInletWorker.ts +348 -0
- package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +144 -0
- package/src/index.ts +16 -16
- package/src/scripts/discoverMuse.ts +50 -0
- package/src/scripts/finalizeHandles.ts +63 -0
- package/src/scripts/runLslEventMarkerEmitter.ts +15 -0
- package/src/scripts/runMuse.ts +50 -0
- package/src/scripts/runOutletToInlet.ts +10 -8
- package/src/scripts/testDestroyOutlet.ts +5 -0
- package/src/testDoubles/BleController/FakeBleController.ts +70 -0
- package/src/testDoubles/BleController/SpyBleController.ts +61 -0
- package/src/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.ts +46 -0
- package/src/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.ts +31 -0
- package/src/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.ts +29 -0
- package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +4 -4
- package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +11 -17
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +3 -16
- package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +15 -15
- package/src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts +1 -1
- package/src/testDoubles/WorkerThreads/FakeWorker.ts +99 -0
- package/src/testDoubles/generateRandomOutletOptions.ts +2 -1
- package/src/validations.ts +0 -2
- package/tsconfig.json +23 -27
- package/build/.spruce/settings.json +0 -11
- package/build/__tests__/impl/LiblslAdapter.test.d.ts +0 -79
- package/build/__tests__/impl/LiblslAdapter.test.js +0 -688
- package/build/__tests__/impl/LiblslAdapter.test.js.map +0 -1
- package/build/__tests__/impl/LslEventMarkerOutlet.test.d.ts +0 -21
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js +0 -160
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +0 -1
- package/build/handleError.d.ts +0 -8
- package/build/handleError.js +0 -25
- package/build/handleError.js.map +0 -1
- package/build/impl/LiblslAdapter.d.ts +0 -154
- package/build/impl/LiblslAdapter.js +0 -317
- package/build/impl/LiblslAdapter.js.map +0 -1
- package/build/impl/LslEventMarkerOutlet.d.ts +0 -28
- package/build/impl/LslEventMarkerOutlet.js +0 -63
- package/build/impl/LslEventMarkerOutlet.js.map +0 -1
- package/build/scripts/runLslEventMarkerOutlet.js +0 -18
- package/build/scripts/runLslEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.d.ts +0 -13
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js +0 -26
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.d.ts +0 -17
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js +0 -46
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +0 -19
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js +0 -19
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +0 -50
- package/build/testDoubles/Liblsl/FakeLiblsl.js +0 -126
- package/build/testDoubles/Liblsl/FakeLiblsl.js.map +0 -1
- package/eslint.config.mjs +0 -3
- package/src/.spruce/settings.json +0 -11
- package/src/__tests__/impl/LiblslAdapter.test.ts +0 -817
- package/src/__tests__/impl/LslEventMarkerOutlet.test.ts +0 -195
- package/src/handleError.ts +0 -24
- package/src/impl/LiblslAdapter.ts +0 -543
- package/src/impl/LslEventMarkerOutlet.ts +0 -97
- package/src/scripts/runLslEventMarkerOutlet.ts +0 -23
- package/src/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.ts +0 -36
- package/src/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.ts +0 -75
- package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +0 -24
- package/src/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.ts +0 -28
- package/src/testDoubles/Liblsl/FakeLiblsl.ts +0 -182
- /package/build/scripts/{runLslEventMarkerOutlet.d.ts → discoverMuse.d.ts} +0 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { randomInt } from 'node:crypto'
|
|
2
|
+
|
|
3
|
+
import { assert, test } from '@neurodevs/node-tdd'
|
|
4
|
+
|
|
5
|
+
import LslEventMarkerEmitter, {
|
|
6
|
+
EventMarkerOptions,
|
|
7
|
+
} from '../../impl/LslEventMarkerEmitter.js'
|
|
8
|
+
import { StreamOutletOptions } from '../../impl/LslStreamOutlet.js'
|
|
9
|
+
import SpyEventMarkerEmitter from '../../testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js'
|
|
10
|
+
import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js'
|
|
11
|
+
import FakeStreamOutlet from '../../testDoubles/StreamOutlet/FakeStreamOutlet.js'
|
|
12
|
+
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
13
|
+
|
|
14
|
+
export default class EventMarkerEmitterTest extends AbstractPackageTest {
|
|
15
|
+
private static instance: SpyEventMarkerEmitter
|
|
16
|
+
|
|
17
|
+
protected static async beforeEach() {
|
|
18
|
+
await super.beforeEach()
|
|
19
|
+
|
|
20
|
+
this.setFakeLiblsl()
|
|
21
|
+
this.setFakeStreamOutlet()
|
|
22
|
+
this.setSpyEventMarkerEmitter()
|
|
23
|
+
|
|
24
|
+
this.instance = await this.LslEventMarkerEmitter()
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private static readonly markerName = this.generateId()
|
|
28
|
+
|
|
29
|
+
@test()
|
|
30
|
+
protected static async createsInstance() {
|
|
31
|
+
assert.isTruthy(this.instance, 'Failed to create instance!')
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@test()
|
|
35
|
+
protected static async loadsWithEventMarkerSpecificOptions() {
|
|
36
|
+
assert.isEqualDeep(
|
|
37
|
+
{
|
|
38
|
+
...FakeStreamOutlet.callsToConstructor[0],
|
|
39
|
+
name: undefined,
|
|
40
|
+
sourceId: undefined,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: undefined,
|
|
44
|
+
type: 'Markers',
|
|
45
|
+
sourceId: undefined,
|
|
46
|
+
channelNames: ['Markers'],
|
|
47
|
+
channelFormat: 'string',
|
|
48
|
+
sampleRateHz: 0,
|
|
49
|
+
chunkSize: 1,
|
|
50
|
+
}
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
assert.isTrue(
|
|
54
|
+
FakeStreamOutlet.callsToConstructor[0]?.sourceId.startsWith(
|
|
55
|
+
'event-markers-'
|
|
56
|
+
),
|
|
57
|
+
'Source ID was not generated uniquely!'
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
assert.isTrue(
|
|
61
|
+
FakeStreamOutlet.callsToConstructor[0]?.name.startsWith(
|
|
62
|
+
'Event markers ('
|
|
63
|
+
),
|
|
64
|
+
'Name was not generated uniquely!'
|
|
65
|
+
)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
@test()
|
|
69
|
+
protected static async canOverrideDefaultOptions() {
|
|
70
|
+
const options = generateRandomOutletOptions()
|
|
71
|
+
await this.LslEventMarkerEmitter(options)
|
|
72
|
+
|
|
73
|
+
assert.isEqualDeep(FakeStreamOutlet.callsToConstructor[1], options)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@test()
|
|
77
|
+
protected static async emittingSingleMarkerIncrementsHitCountAndWaitTime() {
|
|
78
|
+
const markers = [this.generateEventMarker()]
|
|
79
|
+
await this.instance.emitMany(markers)
|
|
80
|
+
|
|
81
|
+
const marker = markers[0]
|
|
82
|
+
|
|
83
|
+
assert.isEqual(
|
|
84
|
+
FakeStreamOutlet.callsToPushSample[0]?.sample[0],
|
|
85
|
+
marker.name,
|
|
86
|
+
'Pushed the wrong marker!'
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
assert.isEqual(this.instance.totalwaitAfterMs, marker.waitAfterMs)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@test()
|
|
93
|
+
protected static async emittingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
|
|
94
|
+
const markers = await this.emitManyFor(2)
|
|
95
|
+
|
|
96
|
+
assert.isEqual(FakeStreamOutlet.callsToPushSample.length, 2)
|
|
97
|
+
|
|
98
|
+
assert.isEqual(
|
|
99
|
+
this.instance.totalwaitAfterMs,
|
|
100
|
+
markers[0].waitAfterMs + markers[1].waitAfterMs
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@test('interrupts on first marker', 1)
|
|
105
|
+
@test('interrupts on second marker', 2)
|
|
106
|
+
@test('interrupts on third marker', 3)
|
|
107
|
+
protected static async emitterIsInterruptable(bailIdx: number) {
|
|
108
|
+
let hitCount = 0
|
|
109
|
+
|
|
110
|
+
this.streamOutlet.pushSample = () => {
|
|
111
|
+
hitCount += 1
|
|
112
|
+
if (hitCount === bailIdx) {
|
|
113
|
+
this.interrupt()
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
await this.emitManyFor(10)
|
|
118
|
+
|
|
119
|
+
assert.isEqual(hitCount, bailIdx)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
@test()
|
|
123
|
+
protected static async canStartAgainAfterInterrupting() {
|
|
124
|
+
this.interrupt()
|
|
125
|
+
|
|
126
|
+
let hitCount = 0
|
|
127
|
+
|
|
128
|
+
this.streamOutlet.pushSample = () => {
|
|
129
|
+
hitCount++
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
await this.emitManyFor(10)
|
|
133
|
+
|
|
134
|
+
assert.isEqual(hitCount, 10)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@test()
|
|
138
|
+
protected static async doesNotWaitIfInterrupted() {
|
|
139
|
+
await this.setupOutlet()
|
|
140
|
+
|
|
141
|
+
const startMs = Date.now()
|
|
142
|
+
const promise = this.emitManyFor(2, 1000)
|
|
143
|
+
this.interrupt()
|
|
144
|
+
await promise
|
|
145
|
+
const endMs = Date.now()
|
|
146
|
+
|
|
147
|
+
assert.isBelow(endMs - startMs, 10)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@test()
|
|
151
|
+
protected static async clearsTimeoutOnInterrupt() {
|
|
152
|
+
void this.emitManyFor(2, 100)
|
|
153
|
+
this.interrupt()
|
|
154
|
+
|
|
155
|
+
this.streamOutlet.pushSample = () =>
|
|
156
|
+
assert.fail('Should not have been called')
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@test()
|
|
160
|
+
protected static async emitCallsPushSampleOnStreamOutlet() {
|
|
161
|
+
const markerName = this.generateId()
|
|
162
|
+
await this.emit(markerName)
|
|
163
|
+
|
|
164
|
+
assert.isEqualDeep(
|
|
165
|
+
FakeStreamOutlet.callsToPushSample[0]?.sample,
|
|
166
|
+
[markerName],
|
|
167
|
+
'Pushed the wrong sample!'
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
@test()
|
|
172
|
+
protected static async emitWaitsForMsIfPassed() {
|
|
173
|
+
SpyEventMarkerEmitter.shouldCallWaitOnSuper = true
|
|
174
|
+
|
|
175
|
+
const waitAfterMs = 10
|
|
176
|
+
|
|
177
|
+
const startMs = Date.now()
|
|
178
|
+
await this.instance.emit(this.markerName, { waitAfterMs })
|
|
179
|
+
const endMs = Date.now()
|
|
180
|
+
|
|
181
|
+
assert.isAbove(
|
|
182
|
+
endMs - startMs,
|
|
183
|
+
0.8 * waitAfterMs,
|
|
184
|
+
'Did not wait for the specified time!'
|
|
185
|
+
)
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
@test()
|
|
189
|
+
protected static async destroyCallsDestroyOnInternalStreamOutlet() {
|
|
190
|
+
this.destroy()
|
|
191
|
+
|
|
192
|
+
assert.isEqual(
|
|
193
|
+
FakeStreamOutlet.numCallsToDestroy,
|
|
194
|
+
1,
|
|
195
|
+
'Did not call destroy on outlet!'
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
@test()
|
|
200
|
+
protected static async destroyInterruptsIfRunning() {
|
|
201
|
+
let wasHit = false
|
|
202
|
+
|
|
203
|
+
const original = this.instance.interrupt.bind(this.instance)
|
|
204
|
+
|
|
205
|
+
this.instance.interrupt = () => {
|
|
206
|
+
wasHit = true
|
|
207
|
+
original()
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const promise = this.emitManyFor(5, 10)
|
|
211
|
+
this.destroy()
|
|
212
|
+
|
|
213
|
+
assert.isTrue(wasHit, 'Did not call interrupt on destroy!')
|
|
214
|
+
|
|
215
|
+
await promise
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
@test()
|
|
219
|
+
protected static async sourceIdIsUniqueAcrossInstances() {
|
|
220
|
+
const instance = await this.LslEventMarkerEmitter()
|
|
221
|
+
|
|
222
|
+
assert.isNotEqual(
|
|
223
|
+
instance['outlet'].sourceId,
|
|
224
|
+
this.instance['outlet'].sourceId,
|
|
225
|
+
'Source IDs are not unique!'
|
|
226
|
+
)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
@test()
|
|
230
|
+
protected static async emitThrowsIfCalledWhileAlreadyRunning() {
|
|
231
|
+
void this.instance.emit(this.markerName, { waitAfterMs: 10 })
|
|
232
|
+
|
|
233
|
+
await assert.doesThrowAsync(async () => {
|
|
234
|
+
await this.emit(this.generateId())
|
|
235
|
+
}, 'Cannot call emit while already running!')
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
@test()
|
|
239
|
+
protected static async emitManyThrowsIfCalledWhileAlreadyRunning() {
|
|
240
|
+
void EventMarkerEmitterTest.emitManyOnce()
|
|
241
|
+
|
|
242
|
+
await assert.doesThrowAsync(async () => {
|
|
243
|
+
await this.emitManyFor(5, 1)
|
|
244
|
+
}, 'Cannot call emitMany while already running!')
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
@test()
|
|
248
|
+
protected static async emitSetsIsRunningFalseOnceDone() {
|
|
249
|
+
await this.emitOnce()
|
|
250
|
+
|
|
251
|
+
assert.isFalse(
|
|
252
|
+
this.instance['isRunning'],
|
|
253
|
+
'emit did not set isRunning to false once done!'
|
|
254
|
+
)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
@test()
|
|
258
|
+
protected static async emitManySetsIsRunningFalseOnceDone() {
|
|
259
|
+
await this.emitManyOnce()
|
|
260
|
+
|
|
261
|
+
assert.isFalse(
|
|
262
|
+
this.instance['isRunning'],
|
|
263
|
+
'emitMany did not set isRunning to false once done! '
|
|
264
|
+
)
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private static async emitOnce() {
|
|
268
|
+
await this.emit(this.markerName)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
private static async emit(
|
|
272
|
+
markerName: string,
|
|
273
|
+
options?: EventMarkerOptions
|
|
274
|
+
) {
|
|
275
|
+
return this.instance.emit(markerName, options)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
private static async emitManyOnce() {
|
|
279
|
+
return this.emitManyFor(5, 1)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
private static async emitManyFor(total: number, waitAfterMs?: number) {
|
|
283
|
+
const markers = new Array(total)
|
|
284
|
+
.fill(null)
|
|
285
|
+
.map(() => this.generateEventMarker(waitAfterMs))
|
|
286
|
+
|
|
287
|
+
await this.instance.emitMany(markers)
|
|
288
|
+
|
|
289
|
+
return markers
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
private static generateEventMarker(waitAfterMs?: number) {
|
|
293
|
+
return {
|
|
294
|
+
name: this.generateId(),
|
|
295
|
+
waitAfterMs: waitAfterMs ?? randomInt(100, 1000),
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
private static interrupt() {
|
|
300
|
+
this.instance.interrupt()
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
private static destroy() {
|
|
304
|
+
this.instance.destroy()
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
private static get streamOutlet() {
|
|
308
|
+
return this.instance.getStreamOutlet()
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
private static async setupOutlet() {
|
|
312
|
+
LslEventMarkerEmitter.Class = LslEventMarkerEmitter as any
|
|
313
|
+
this.instance = await this.LslEventMarkerEmitter()
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
private static async LslEventMarkerEmitter(
|
|
317
|
+
options?: Partial<StreamOutletOptions>
|
|
318
|
+
) {
|
|
319
|
+
return (await LslEventMarkerEmitter.Create(
|
|
320
|
+
options
|
|
321
|
+
)) as SpyEventMarkerEmitter
|
|
322
|
+
}
|
|
323
|
+
}
|
|
@@ -196,7 +196,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
196
196
|
assert.isEqualDeep(
|
|
197
197
|
this.fakeLiblsl.lastAppendChannelsToStreamInfoOptions,
|
|
198
198
|
{
|
|
199
|
-
|
|
199
|
+
infoHandle: this.instance.infoHandle,
|
|
200
200
|
channels: this.channelNames.map((label: string) => ({
|
|
201
201
|
label,
|
|
202
202
|
units: this.units,
|
|
@@ -212,49 +212,12 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
212
212
|
this.instance.destroy()
|
|
213
213
|
|
|
214
214
|
assert.isEqualDeep(
|
|
215
|
-
this.fakeLiblsl.lastDestroyStreamInfoOptions?.
|
|
216
|
-
this.instance.
|
|
215
|
+
this.fakeLiblsl.lastDestroyStreamInfoOptions?.infoHandle,
|
|
216
|
+
this.instance.infoHandle,
|
|
217
217
|
'Should have called destroyStreamInfo!'
|
|
218
218
|
)
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
@test()
|
|
222
|
-
protected static async doesNotCreateNewStreamInfoIfPassedBoundInfo() {
|
|
223
|
-
this.LslStreamInfo({
|
|
224
|
-
boundInfo: this.instance.boundInfo,
|
|
225
|
-
})
|
|
226
|
-
|
|
227
|
-
assert.isEqual(
|
|
228
|
-
this.fakeLiblsl.createStreamInfoHitCount,
|
|
229
|
-
1,
|
|
230
|
-
'Should not have created new stream info!'
|
|
231
|
-
)
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
@test()
|
|
235
|
-
protected static async setsBoundInfoWhenPassed() {
|
|
236
|
-
const instance = this.LslStreamInfo({
|
|
237
|
-
boundInfo: this.instance.boundInfo,
|
|
238
|
-
})
|
|
239
|
-
|
|
240
|
-
assert.isEqualDeep(
|
|
241
|
-
instance.boundInfo,
|
|
242
|
-
this.instance.boundInfo,
|
|
243
|
-
'Should have set bound stream info!'
|
|
244
|
-
)
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
@test()
|
|
248
|
-
protected static async cachesInfoAttributesByBoundInfo() {
|
|
249
|
-
const cached = LslStreamInfo.From(this.instance.boundInfo)
|
|
250
|
-
|
|
251
|
-
assert.isEqualDeep(
|
|
252
|
-
cached,
|
|
253
|
-
this.instance,
|
|
254
|
-
'Should have set bound stream info!'
|
|
255
|
-
)
|
|
256
|
-
}
|
|
257
|
-
|
|
258
221
|
private static readonly defaultOptions = {
|
|
259
222
|
name: this.name,
|
|
260
223
|
type: this.type,
|