@neurodevs/node-lsl 19.0.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 +11 -11
- package/build/__tests__/AbstractPackageTest.js +26 -30
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/BleDeviceController.test.d.ts +1 -1
- package/build/__tests__/impl/BleDeviceController.test.js +8 -10
- 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 +7 -12
- 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/WindowedClockRegressor.test.js +1 -1
- package/build/__tests__/impl/WindowedClockRegressor.test.js.map +1 -1
- 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 -21
- package/build/impl/LslStreamInlet.js +221 -65
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +15 -14
- package/build/impl/LslStreamOutlet.js +32 -36
- 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.js.map +1 -0
- package/build/impl/controllers/BleDeviceController.d.ts +1 -1
- package/build/impl/controllers/BleDeviceController.js +1 -1
- package/build/impl/controllers/BleDeviceController.js.map +1 -1
- package/build/index.d.ts +27 -23
- package/build/index.js +32 -29
- 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/testDoubles/ClockRegressor/FakeClockRegressor.d.ts +1 -1
- 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/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 +4 -3
- package/src/__tests__/AbstractPackageTest.ts +29 -38
- package/src/__tests__/impl/BleDeviceController.test.ts +8 -10
- 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 +17 -24
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +15 -18
- package/src/__tests__/impl/WindowedClockRegressor.test.ts +1 -1
- 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 +305 -81
- package/src/impl/LslStreamOutlet.ts +57 -56
- package/src/impl/LslWebSocketBridge.ts +15 -18
- package/src/impl/controllers/BleDeviceController.ts +1 -1
- package/src/index.ts +38 -34
- package/src/scripts/{runLslEventMarkerEmitter.ts → runLslEmitter.ts} +4 -3
- package/src/scripts/runMuse.ts +1 -1
- package/src/testDoubles/ClockRegressor/FakeClockRegressor.ts +1 -1
- 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 -19
- package/src/testDoubles/LslWsBridge/SpyLslWsBridge.ts +9 -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/WindowedClockRegressor.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.d.ts +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/impl/{WindowedClockRegressor.d.ts → clocks/WindowedClockRegressor.d.ts} +0 -0
- /package/build/impl/{WindowedClockRegressor.js → clocks/WindowedClockRegressor.js} +0 -0
- /package/build/scripts/{discoverMuse.d.ts → runLslEmitter.d.ts} +0 -0
- /package/build/scripts/{runLslEventMarkerEmitter.d.ts → runLslOutlet.d.ts} +0 -0
- /package/src/impl/{WindowedClockRegressor.ts → clocks/WindowedClockRegressor.ts} +0 -0
- /package/src/scripts/{runLslStreamOutlet.ts → runLslOutlet.ts} +0 -0
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { Worker } from 'node:worker_threads'
|
|
2
|
-
|
|
3
1
|
import { FakeLiblsl } from '@neurodevs/ndx-native'
|
|
4
2
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
5
3
|
import {
|
|
@@ -11,16 +9,12 @@ import {
|
|
|
11
9
|
unwrapPointer,
|
|
12
10
|
} from 'ffi-rs'
|
|
13
11
|
|
|
14
|
-
import LslStreamInlet, {
|
|
15
|
-
|
|
16
|
-
} from '../../impl/LslStreamInlet.js'
|
|
17
|
-
import StreamInletWorker from '../../impl/workers/inlet/StreamInletWorker.js'
|
|
18
|
-
import { SpyStreamInlet } from '../../testDoubles/StreamInlet/SpyStreamInlet.js'
|
|
19
|
-
import FakeWorker from '../../testDoubles/WorkerThreads/FakeWorker.js'
|
|
12
|
+
import LslStreamInlet, { LslInletOptions } from '../../impl/LslStreamInlet.js'
|
|
13
|
+
import SpyLslInlet from '../../testDoubles/LslInlet/SpyLslInlet.js'
|
|
20
14
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
21
15
|
|
|
22
16
|
export default class LslStreamInletTest extends AbstractPackageTest {
|
|
23
|
-
private static instance:
|
|
17
|
+
private static instance: SpyLslInlet
|
|
24
18
|
|
|
25
19
|
private static callsToOnData: {
|
|
26
20
|
samples: number[]
|
|
@@ -60,20 +54,14 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
60
54
|
await super.beforeEach()
|
|
61
55
|
|
|
62
56
|
this.setFakeLiblsl()
|
|
63
|
-
this.
|
|
64
|
-
this.
|
|
57
|
+
this.setFakeLslInfo()
|
|
58
|
+
this.setSpyLslInlet()
|
|
65
59
|
|
|
66
60
|
this.callsToOnData = []
|
|
67
61
|
|
|
68
62
|
LslStreamInlet.waitAfterOpenStreamMs = 0
|
|
69
|
-
|
|
70
|
-
LslStreamInlet.
|
|
71
|
-
FakeWorker.resetTestDoubles()
|
|
72
|
-
|
|
73
|
-
StreamInletWorker.lsl = this.fakeLiblsl
|
|
74
|
-
StreamInletWorker.freePointer = () => {}
|
|
75
|
-
|
|
76
|
-
FakeWorker.fakeOnData = this.onData
|
|
63
|
+
LslStreamInlet.lsl = this.fakeLiblsl
|
|
64
|
+
LslStreamInlet.freePointer = () => {}
|
|
77
65
|
|
|
78
66
|
this.instance = await this.LslStreamInlet()
|
|
79
67
|
}
|
|
@@ -133,7 +121,7 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
133
121
|
|
|
134
122
|
let calls: FreePointerParams[] = []
|
|
135
123
|
|
|
136
|
-
|
|
124
|
+
LslStreamInlet.freePointer = (params: FreePointerParams) => {
|
|
137
125
|
calls.push(params)
|
|
138
126
|
}
|
|
139
127
|
|
|
@@ -201,9 +189,7 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
201
189
|
await this.startPulling()
|
|
202
190
|
|
|
203
191
|
assert.isEqual(
|
|
204
|
-
|
|
205
|
-
(msg) => msg.type === 'startPulling'
|
|
206
|
-
).length,
|
|
192
|
+
this.fakeLiblsl.createInletHitCount,
|
|
207
193
|
1,
|
|
208
194
|
'startPulling did not return early!'
|
|
209
195
|
)
|
|
@@ -243,7 +229,7 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
243
229
|
assert.isEqualDeep(
|
|
244
230
|
this.fakeLiblsl.lastOpenStreamOptions,
|
|
245
231
|
{
|
|
246
|
-
inletHandle:
|
|
232
|
+
inletHandle: instance['inletHandle'],
|
|
247
233
|
timeoutMs: openStreamTimeoutMs,
|
|
248
234
|
errorCodePtr: this.errorCodePtr,
|
|
249
235
|
},
|
|
@@ -253,27 +239,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
253
239
|
instance.stopPulling()
|
|
254
240
|
}
|
|
255
241
|
|
|
256
|
-
@test()
|
|
257
|
-
protected static async waitsAfterOpeningStreamWithPassedOption() {
|
|
258
|
-
const waitAfterOpenStreamMs = 10
|
|
259
|
-
|
|
260
|
-
const instance = await this.LslStreamInlet({
|
|
261
|
-
waitAfterOpenStreamMs,
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
let t0 = Date.now()
|
|
265
|
-
await this.startPulling(instance)
|
|
266
|
-
let elapsed = Date.now() - t0
|
|
267
|
-
|
|
268
|
-
instance.stopPulling()
|
|
269
|
-
|
|
270
|
-
assert.isAbove(
|
|
271
|
-
elapsed,
|
|
272
|
-
waitAfterOpenStreamMs * 0.8,
|
|
273
|
-
'Did not wait after opening stream!'
|
|
274
|
-
)
|
|
275
|
-
}
|
|
276
|
-
|
|
277
242
|
@test()
|
|
278
243
|
protected static async stopPullingClosesInletStream() {
|
|
279
244
|
await this.startPulling()
|
|
@@ -386,15 +351,10 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
386
351
|
protected static async pushSampleHandlesErrorCode() {
|
|
387
352
|
let passedErrorCode: number | undefined
|
|
388
353
|
|
|
389
|
-
|
|
354
|
+
LslStreamInlet.handleLslError = (errorCode: number) => {
|
|
390
355
|
passedErrorCode = errorCode
|
|
391
356
|
}
|
|
392
357
|
|
|
393
|
-
const fakeErrorCode = [-4, -3, -2, -1, 0][Math.floor(Math.random() * 5)]
|
|
394
|
-
const worker = this.getFakeWorker()
|
|
395
|
-
|
|
396
|
-
worker['inletWorker']['pullErrorBuffer'].writeInt32LE(fakeErrorCode)
|
|
397
|
-
|
|
398
358
|
await this.startThenStop()
|
|
399
359
|
|
|
400
360
|
assert.isEqualDeep(
|
|
@@ -414,10 +374,9 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
414
374
|
|
|
415
375
|
let pulls = 0
|
|
416
376
|
|
|
417
|
-
const
|
|
418
|
-
const original = inletWorker['pullDataOnce'].bind(inletWorker)
|
|
377
|
+
const original = instance['pullDataOnce'].bind(instance)
|
|
419
378
|
|
|
420
|
-
|
|
379
|
+
instance['pullDataOnce'] = async () => {
|
|
421
380
|
pulls++
|
|
422
381
|
await original()
|
|
423
382
|
}
|
|
@@ -508,32 +467,23 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
508
467
|
}
|
|
509
468
|
|
|
510
469
|
private static async runInletWithOptions(
|
|
511
|
-
options?: Partial<
|
|
470
|
+
options?: Partial<LslInletOptions>
|
|
512
471
|
) {
|
|
513
472
|
const inlet = await this.LslStreamInlet(options)
|
|
473
|
+
this.instance = inlet
|
|
514
474
|
await this.startThenStop(inlet)
|
|
515
475
|
return inlet
|
|
516
476
|
}
|
|
517
477
|
|
|
518
|
-
private static async startThenStop(inlet?:
|
|
478
|
+
private static async startThenStop(inlet?: SpyLslInlet) {
|
|
519
479
|
const instance = inlet || this.instance
|
|
520
480
|
await this.startPulling(instance)
|
|
521
481
|
await this.wait(10)
|
|
522
482
|
instance.stopPulling()
|
|
523
483
|
}
|
|
524
484
|
|
|
525
|
-
private static async startPulling(instance?:
|
|
526
|
-
|
|
527
|
-
const startPullingPromise = inst.startPulling()
|
|
528
|
-
|
|
529
|
-
while (!this.getFakeWorker(inst).createInletPromise) {
|
|
530
|
-
await this.wait(1)
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
await this.getFakeWorker(inst).createInletPromise
|
|
534
|
-
inst['workerReady'] = true
|
|
535
|
-
|
|
536
|
-
await startPullingPromise
|
|
485
|
+
private static async startPulling(instance?: SpyLslInlet) {
|
|
486
|
+
await (instance || this.instance).startPulling()
|
|
537
487
|
}
|
|
538
488
|
|
|
539
489
|
private static stopPulling() {
|
|
@@ -549,26 +499,19 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
549
499
|
}
|
|
550
500
|
|
|
551
501
|
private static get inletHandle() {
|
|
552
|
-
return this.
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
private static getFakeWorker(instance?: SpyStreamInlet) {
|
|
556
|
-
const inst = instance || this.instance
|
|
557
|
-
return inst['worker'] as unknown as FakeWorker
|
|
502
|
+
return this.instance['inletHandle']
|
|
558
503
|
}
|
|
559
504
|
|
|
560
505
|
private static onData = (samples: number[], timestamps: number[]) => {
|
|
561
506
|
this.callsToOnData.push({ samples, timestamps })
|
|
562
507
|
}
|
|
563
508
|
|
|
564
|
-
protected static async LslStreamInlet(
|
|
565
|
-
options?: Partial<StreamInletOptions>
|
|
566
|
-
) {
|
|
509
|
+
protected static async LslStreamInlet(options?: Partial<LslInletOptions>) {
|
|
567
510
|
return (await AbstractPackageTest.LslStreamInlet(
|
|
568
511
|
{
|
|
569
512
|
...options,
|
|
570
513
|
},
|
|
571
514
|
this.onData
|
|
572
|
-
)) as
|
|
515
|
+
)) as SpyLslInlet
|
|
573
516
|
}
|
|
574
517
|
}
|
|
@@ -1,27 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
ChannelFormat,
|
|
3
|
+
LslSample,
|
|
4
|
+
FakeLiblsl,
|
|
5
|
+
CHANNEL_FORMATS,
|
|
6
|
+
} from '@neurodevs/ndx-native'
|
|
3
7
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
4
8
|
|
|
5
|
-
import { CHANNEL_FORMATS } from '../../consts.js'
|
|
6
9
|
import LslStreamOutlet, {
|
|
7
|
-
|
|
10
|
+
LslOutletOptions,
|
|
8
11
|
} from '../../impl/LslStreamOutlet.js'
|
|
9
|
-
import {
|
|
10
|
-
setOutletHandleLslError,
|
|
11
|
-
setOutletLiblslAdapter,
|
|
12
|
-
} from '../../impl/workers/outlet/LslStreamOutlet.worker.js'
|
|
13
12
|
import {
|
|
14
13
|
TEST_SUPPORTED_CHANNEL_FORMATS,
|
|
15
14
|
TEST_UNSUPPORTED_CHANNEL_FORMATS,
|
|
16
15
|
TestChannelFormat,
|
|
17
16
|
} from '../../testDoubles/consts.js'
|
|
18
17
|
import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js'
|
|
19
|
-
import
|
|
20
|
-
import FakeWorker from '../../testDoubles/WorkerThreads/FakeWorker.js'
|
|
18
|
+
import FakeLslInfo from '../../testDoubles/LslInfo/FakeLslInfo.js'
|
|
21
19
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
22
20
|
|
|
23
21
|
export default class LslStreamOutletTest extends AbstractPackageTest {
|
|
24
|
-
private static randomOutletOptions:
|
|
22
|
+
private static randomOutletOptions: LslOutletOptions
|
|
25
23
|
|
|
26
24
|
protected static async beforeEach() {
|
|
27
25
|
await super.beforeEach()
|
|
@@ -31,12 +29,9 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
|
|
|
31
29
|
this.randomOutletOptions = generateRandomOutletOptions()
|
|
32
30
|
|
|
33
31
|
this.setFakeLiblsl()
|
|
34
|
-
this.
|
|
35
|
-
|
|
36
|
-
LslStreamOutlet.Worker = FakeWorker as unknown as typeof Worker
|
|
37
|
-
FakeWorker.resetTestDoubles()
|
|
32
|
+
this.setFakeLslInfo()
|
|
38
33
|
|
|
39
|
-
|
|
34
|
+
LslStreamOutlet.lsl = this.fakeLiblsl
|
|
40
35
|
}
|
|
41
36
|
|
|
42
37
|
@test()
|
|
@@ -175,7 +170,7 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
|
|
|
175
170
|
protected static async constructionCreatesStreamInfo() {
|
|
176
171
|
await this.LslStreamOutlet()
|
|
177
172
|
|
|
178
|
-
assert.isEqualDeep(
|
|
173
|
+
assert.isEqualDeep(FakeLslInfo.callsToConstructor[0], {
|
|
179
174
|
channelNames: this.randomOutletOptions.channelNames,
|
|
180
175
|
channelFormat: this.randomOutletOptions.channelFormat,
|
|
181
176
|
sampleRateHz: this.randomOutletOptions.sampleRateHz,
|
|
@@ -241,9 +236,9 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
|
|
|
241
236
|
protected static async pushSampleHandlesErrorCode() {
|
|
242
237
|
let passedErrorCode: number | undefined
|
|
243
238
|
|
|
244
|
-
|
|
239
|
+
LslStreamOutlet.handleLslError = (errorCode: number) => {
|
|
245
240
|
passedErrorCode = errorCode
|
|
246
|
-
}
|
|
241
|
+
}
|
|
247
242
|
|
|
248
243
|
FakeLiblsl.fakeErrorCode = [-4, -3, -2, -1, 0][
|
|
249
244
|
Math.floor(Math.random() * 5)
|
|
@@ -346,7 +341,7 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
|
|
|
346
341
|
}
|
|
347
342
|
|
|
348
343
|
private static async createAndAssertThrows(
|
|
349
|
-
option: keyof
|
|
344
|
+
option: keyof LslOutletOptions,
|
|
350
345
|
value: number | string[] | ChannelFormat,
|
|
351
346
|
expectedMessage: string
|
|
352
347
|
) {
|
|
@@ -368,9 +363,7 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
|
|
|
368
363
|
return await this.LslStreamOutlet({ channelFormat: 'float32' })
|
|
369
364
|
}
|
|
370
365
|
|
|
371
|
-
private static async LslStreamOutlet(
|
|
372
|
-
options?: Partial<StreamOutletOptions>
|
|
373
|
-
) {
|
|
366
|
+
private static async LslStreamOutlet(options?: Partial<LslOutletOptions>) {
|
|
374
367
|
return await LslStreamOutlet.Create({
|
|
375
368
|
...this.randomOutletOptions,
|
|
376
369
|
...options,
|
|
@@ -379,7 +372,7 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
|
|
|
379
372
|
}
|
|
380
373
|
|
|
381
374
|
class CheckingOutlet extends LslStreamOutlet {
|
|
382
|
-
public constructor(options:
|
|
375
|
+
public constructor(options: LslOutletOptions) {
|
|
383
376
|
super(options)
|
|
384
377
|
}
|
|
385
378
|
}
|
|
@@ -2,30 +2,29 @@ import { randomInt } from 'node:crypto'
|
|
|
2
2
|
|
|
3
3
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { LslInletOptions } from '../../impl/LslStreamInlet.js'
|
|
6
6
|
import LslWebSocketBridge, {
|
|
7
|
-
|
|
7
|
+
LslWsBridgeOptions,
|
|
8
8
|
} from '../../impl/LslWebSocketBridge.js'
|
|
9
|
-
import
|
|
10
|
-
import
|
|
9
|
+
import FakeLslInlet from '../../testDoubles/LslInlet/FakeLslInlet.js'
|
|
10
|
+
import SpyLslWsBridge from '../../testDoubles/LslWsBridge/SpyLslWsBridge.js'
|
|
11
11
|
import FakeWebSocket from '../../testDoubles/WebSockets/FakeWebSocket.js'
|
|
12
12
|
import FakeWebSocketServer from '../../testDoubles/WebSockets/FakeWebSocketServer.js'
|
|
13
13
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
14
14
|
|
|
15
15
|
export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
16
|
-
private static instance:
|
|
16
|
+
private static instance: SpyLslWsBridge
|
|
17
17
|
|
|
18
18
|
protected static async beforeEach() {
|
|
19
19
|
await super.beforeEach()
|
|
20
20
|
|
|
21
21
|
this.setFakeLiblsl()
|
|
22
|
-
this.
|
|
22
|
+
this.setFakeLslInlet()
|
|
23
23
|
this.setFakeWebSocket()
|
|
24
24
|
this.setFakeWebSocketServer()
|
|
25
|
-
this.
|
|
25
|
+
this.setSpyLslWsBridge()
|
|
26
26
|
|
|
27
|
-
this.instance =
|
|
28
|
-
(await this.LslWebSocketBridge()) as SpyLslWebSocketBridge
|
|
27
|
+
this.instance = (await this.LslWebSocketBridge()) as SpyLslWsBridge
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
@test()
|
|
@@ -35,7 +34,7 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
35
34
|
|
|
36
35
|
@test()
|
|
37
36
|
protected static async createsLslStreamInlet() {
|
|
38
|
-
const call =
|
|
37
|
+
const call = FakeLslInlet.callsToConstructor[0]
|
|
39
38
|
|
|
40
39
|
const sourceId = call.options!.sourceId
|
|
41
40
|
const chunkSize = call.options!.chunkSize
|
|
@@ -54,7 +53,7 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
54
53
|
await this.activate()
|
|
55
54
|
|
|
56
55
|
assert.isEqual(
|
|
57
|
-
|
|
56
|
+
FakeLslInlet.numCallsToStartPulling,
|
|
58
57
|
1,
|
|
59
58
|
'Did not call startPulling on inlet!'
|
|
60
59
|
)
|
|
@@ -66,7 +65,7 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
66
65
|
this.deactivate()
|
|
67
66
|
|
|
68
67
|
assert.isEqual(
|
|
69
|
-
|
|
68
|
+
FakeLslInlet.numCallsToStopPulling,
|
|
70
69
|
1,
|
|
71
70
|
'Did not call stopPulling on inlet!'
|
|
72
71
|
)
|
|
@@ -77,7 +76,7 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
77
76
|
this.destroy()
|
|
78
77
|
|
|
79
78
|
assert.isEqual(
|
|
80
|
-
|
|
79
|
+
FakeLslInlet.numCallsToDestroy,
|
|
81
80
|
1,
|
|
82
81
|
'Did not call destroy on inlet!'
|
|
83
82
|
)
|
|
@@ -270,7 +269,7 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
270
269
|
const samples = [...new Float32Array([1, 2, 3, 4, 5, 6])]
|
|
271
270
|
const timestamps = [...new Float64Array([7, 8])]
|
|
272
271
|
|
|
273
|
-
|
|
272
|
+
FakeLslInlet.callsToConstructor[0]?.onData!(samples, timestamps)
|
|
274
273
|
return { samples, timestamps }
|
|
275
274
|
}
|
|
276
275
|
|
|
@@ -278,7 +277,7 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
278
277
|
|
|
279
278
|
private static readonly connectUrls = [this.generateId(), this.generateId()]
|
|
280
279
|
|
|
281
|
-
private static readonly inletOptions:
|
|
280
|
+
private static readonly inletOptions: LslInletOptions = {
|
|
282
281
|
sourceId: this.sourceId,
|
|
283
282
|
chunkSize: randomInt(1, 100),
|
|
284
283
|
}
|
|
@@ -289,9 +288,7 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
289
288
|
connectUrls: this.connectUrls,
|
|
290
289
|
}
|
|
291
290
|
|
|
292
|
-
private static LslWebSocketBridge(
|
|
293
|
-
options?: Partial<WebSocketBridgeOptions>
|
|
294
|
-
) {
|
|
291
|
+
private static LslWebSocketBridge(options?: Partial<LslWsBridgeOptions>) {
|
|
295
292
|
return LslWebSocketBridge.Create({ ...this.baseOptions, ...options })
|
|
296
293
|
}
|
|
297
294
|
}
|
|
@@ -4,7 +4,7 @@ import { test, assert } from '@neurodevs/node-tdd'
|
|
|
4
4
|
|
|
5
5
|
import WindowedClockRegressor, {
|
|
6
6
|
ClockRegressor,
|
|
7
|
-
} from '../../impl/WindowedClockRegressor.js'
|
|
7
|
+
} from '../../impl/clocks/WindowedClockRegressor.js'
|
|
8
8
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
9
9
|
|
|
10
10
|
export default class WindowedClockRegressorTest extends AbstractPackageTest {
|
package/src/assertions.ts
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
import { generateShortId } from '@neurodevs/generate-id'
|
|
2
2
|
|
|
3
3
|
import LslStreamOutlet, {
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
LslOutletOptions,
|
|
5
|
+
LslOutlet,
|
|
6
6
|
} from './LslStreamOutlet.js'
|
|
7
7
|
|
|
8
|
-
export default class LslEventMarkerEmitter implements
|
|
9
|
-
public static Class?:
|
|
8
|
+
export default class LslEventMarkerEmitter implements LslEmitter {
|
|
9
|
+
public static Class?: LslEmitterConstructor
|
|
10
10
|
|
|
11
|
-
protected outlet:
|
|
11
|
+
protected outlet: LslOutlet
|
|
12
12
|
private isRunning = false
|
|
13
13
|
private waitResolve?: () => void
|
|
14
14
|
private timeout?: any
|
|
15
15
|
|
|
16
|
-
protected constructor(outlet:
|
|
16
|
+
protected constructor(outlet: LslOutlet) {
|
|
17
17
|
this.outlet = outlet
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
public static async Create(options?:
|
|
20
|
+
public static async Create(options?: LslEmitterOptions) {
|
|
21
21
|
const outlet = await this.LslStreamOutlet(options)
|
|
22
22
|
return new (this.Class ?? this)(outlet)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
public async emit(markerName: string, options?:
|
|
25
|
+
public async emit(markerName: string, options?: EmitOptions) {
|
|
26
26
|
this.throwIfAlreadyRunning('emit')
|
|
27
27
|
this.isRunning = true
|
|
28
28
|
|
|
@@ -99,10 +99,10 @@ export default class LslEventMarkerEmitter implements EventMarkerEmitter {
|
|
|
99
99
|
channelFormat: 'string',
|
|
100
100
|
sampleRateHz: 0,
|
|
101
101
|
chunkSize: 1,
|
|
102
|
-
} as
|
|
102
|
+
} as LslOutletOptions
|
|
103
103
|
}
|
|
104
104
|
|
|
105
|
-
private static LslStreamOutlet(options?: Partial<
|
|
105
|
+
private static LslStreamOutlet(options?: Partial<LslOutletOptions>) {
|
|
106
106
|
return LslStreamOutlet.Create({
|
|
107
107
|
...this.generateDefaultOutletOptions(),
|
|
108
108
|
...options,
|
|
@@ -110,20 +110,18 @@ export default class LslEventMarkerEmitter implements EventMarkerEmitter {
|
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
export interface
|
|
114
|
-
emit(markerName: string, options?:
|
|
113
|
+
export interface LslEmitter {
|
|
114
|
+
emit(markerName: string, options?: EmitOptions): Promise<void>
|
|
115
115
|
emitMany(markers: TimedEventMarker[]): Promise<void>
|
|
116
116
|
interrupt(): void
|
|
117
117
|
destroy(): void
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
export type
|
|
120
|
+
export type LslEmitterOptions = Partial<LslOutletOptions>
|
|
121
121
|
|
|
122
|
-
export type
|
|
123
|
-
outlet: StreamOutlet
|
|
124
|
-
) => EventMarkerEmitter
|
|
122
|
+
export type LslEmitterConstructor = new (outlet: LslOutlet) => LslEmitter
|
|
125
123
|
|
|
126
|
-
export interface
|
|
124
|
+
export interface EmitOptions {
|
|
127
125
|
waitAfterMs?: number
|
|
128
126
|
}
|
|
129
127
|
|
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
CHANNEL_FORMATS_MAP,
|
|
7
7
|
} from '@neurodevs/ndx-native'
|
|
8
8
|
|
|
9
|
-
export default class LslStreamInfo implements
|
|
10
|
-
public static Class?:
|
|
9
|
+
export default class LslStreamInfo implements LslInfo {
|
|
10
|
+
public static Class?: LslInfoConstructor
|
|
11
11
|
|
|
12
12
|
public readonly name: string
|
|
13
13
|
public readonly type: string
|
|
@@ -22,7 +22,7 @@ export default class LslStreamInfo implements StreamInfo {
|
|
|
22
22
|
|
|
23
23
|
private lsl = LiblslAdapter.getInstance()
|
|
24
24
|
|
|
25
|
-
protected constructor(options:
|
|
25
|
+
protected constructor(options: LslInfoOptions) {
|
|
26
26
|
const {
|
|
27
27
|
name = `lsl-stream-info-${generateId()}`,
|
|
28
28
|
type = generateId(),
|
|
@@ -46,7 +46,7 @@ export default class LslStreamInfo implements StreamInfo {
|
|
|
46
46
|
this.appendChannelsToStreamInfo()
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
public static Create(options:
|
|
49
|
+
public static Create(options: LslInfoOptions) {
|
|
50
50
|
return new (this.Class ?? this)(options)
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -81,7 +81,7 @@ export default class LslStreamInfo implements StreamInfo {
|
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
export interface
|
|
84
|
+
export interface LslInfo {
|
|
85
85
|
destroy(): void
|
|
86
86
|
readonly name: string
|
|
87
87
|
readonly type: string
|
|
@@ -94,11 +94,9 @@ export interface StreamInfo {
|
|
|
94
94
|
readonly infoHandle: InfoHandle
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
export type
|
|
98
|
-
options: StreamInfoOptions
|
|
99
|
-
) => StreamInfo
|
|
97
|
+
export type LslInfoConstructor = new (options: LslInfoOptions) => LslInfo
|
|
100
98
|
|
|
101
|
-
export interface
|
|
99
|
+
export interface LslInfoOptions {
|
|
102
100
|
channelNames: string[]
|
|
103
101
|
channelFormat: ChannelFormat
|
|
104
102
|
sampleRateHz: number
|