@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.
Files changed (189) hide show
  1. package/build/__tests__/AbstractPackageTest.d.ts +19 -17
  2. package/build/__tests__/AbstractPackageTest.js +54 -39
  3. package/build/__tests__/AbstractPackageTest.js.map +1 -1
  4. package/build/__tests__/impl/BleDeviceController.test.d.ts +6 -1
  5. package/build/__tests__/impl/BleDeviceController.test.js +44 -15
  6. package/build/__tests__/impl/BleDeviceController.test.js.map +1 -1
  7. package/build/__tests__/impl/LslEventMarkerEmitter.test.js +13 -13
  8. package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -1
  9. package/build/__tests__/impl/LslStreamInfo.test.js +2 -2
  10. package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
  11. package/build/__tests__/impl/LslStreamInlet.test.d.ts +3 -5
  12. package/build/__tests__/impl/LslStreamInlet.test.js +13 -46
  13. package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
  14. package/build/__tests__/impl/LslStreamOutlet.test.js +9 -16
  15. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
  16. package/build/__tests__/impl/LslWebSocketBridge.test.js +9 -10
  17. package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
  18. package/build/__tests__/impl/UsbDeviceController.test.d.ts +17 -0
  19. package/build/__tests__/impl/UsbDeviceController.test.js +81 -0
  20. package/build/__tests__/impl/UsbDeviceController.test.js.map +1 -0
  21. package/build/__tests__/impl/WindowedClockRegressor.test.d.ts +19 -0
  22. package/build/__tests__/impl/WindowedClockRegressor.test.js +172 -0
  23. package/build/__tests__/impl/WindowedClockRegressor.test.js.map +1 -0
  24. package/build/assertions.js +1 -1
  25. package/build/assertions.js.map +1 -1
  26. package/build/impl/LslEventMarkerEmitter.d.ts +12 -12
  27. package/build/impl/LslEventMarkerEmitter.js.map +1 -1
  28. package/build/impl/LslStreamInfo.d.ts +7 -7
  29. package/build/impl/LslStreamInfo.js.map +1 -1
  30. package/build/impl/LslStreamInlet.d.ts +63 -20
  31. package/build/impl/LslStreamInlet.js +221 -64
  32. package/build/impl/LslStreamInlet.js.map +1 -1
  33. package/build/impl/LslStreamOutlet.d.ts +16 -14
  34. package/build/impl/LslStreamOutlet.js +34 -37
  35. package/build/impl/LslStreamOutlet.js.map +1 -1
  36. package/build/impl/LslWebSocketBridge.d.ts +10 -10
  37. package/build/impl/LslWebSocketBridge.js.map +1 -1
  38. package/build/impl/clocks/WindowedClockRegressor.d.ts +24 -0
  39. package/build/impl/clocks/WindowedClockRegressor.js +73 -0
  40. package/build/impl/clocks/WindowedClockRegressor.js.map +1 -0
  41. package/build/impl/controllers/BleDeviceController.d.ts +3 -1
  42. package/build/impl/controllers/BleDeviceController.js +9 -1
  43. package/build/impl/controllers/BleDeviceController.js.map +1 -1
  44. package/build/impl/controllers/UsbDeviceController.d.ts +23 -0
  45. package/build/impl/controllers/UsbDeviceController.js +40 -0
  46. package/build/impl/controllers/UsbDeviceController.js.map +1 -0
  47. package/build/index.d.ts +32 -20
  48. package/build/index.js +39 -26
  49. package/build/index.js.map +1 -1
  50. package/build/scripts/{runLslEventMarkerEmitter.js → runLslEmitter.js} +5 -4
  51. package/build/scripts/runLslEmitter.js.map +1 -0
  52. package/build/scripts/{runLslStreamOutlet.js → runLslOutlet.js} +1 -1
  53. package/build/scripts/runLslOutlet.js.map +1 -0
  54. package/build/scripts/runMuse.js +1 -1
  55. package/build/scripts/runMuse.js.map +1 -1
  56. package/build/scripts/runUsb.js +14 -0
  57. package/build/scripts/runUsb.js.map +1 -0
  58. package/build/testDoubles/BleController/FakeBleController.d.ts +3 -1
  59. package/build/testDoubles/BleController/FakeBleController.js +5 -0
  60. package/build/testDoubles/BleController/FakeBleController.js.map +1 -1
  61. package/build/testDoubles/ClockRegressor/FakeClockRegressor.d.ts +17 -0
  62. package/build/testDoubles/ClockRegressor/FakeClockRegressor.js +23 -0
  63. package/build/testDoubles/ClockRegressor/FakeClockRegressor.js.map +1 -0
  64. package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.d.ts → LslEmitter/FakeLslEmitter.d.ts} +4 -4
  65. package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.js → LslEmitter/FakeLslEmitter.js} +7 -7
  66. package/build/testDoubles/LslEmitter/FakeLslEmitter.js.map +1 -0
  67. package/build/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.d.ts → LslEmitter/SpyLslEmitter.d.ts} +4 -4
  68. package/build/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.js → LslEmitter/SpyLslEmitter.js} +3 -3
  69. package/build/testDoubles/LslEmitter/SpyLslEmitter.js.map +1 -0
  70. package/build/testDoubles/LslEmitter/ThrowingLslEmitter.d.ts +9 -0
  71. package/build/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.js → LslEmitter/ThrowingLslEmitter.js} +2 -2
  72. package/build/testDoubles/LslEmitter/ThrowingLslEmitter.js.map +1 -0
  73. package/build/testDoubles/{StreamInfo/FakeStreamInfo.d.ts → LslInfo/FakeLslInfo.d.ts} +4 -4
  74. package/build/testDoubles/{StreamInfo/FakeStreamInfo.js → LslInfo/FakeLslInfo.js} +7 -7
  75. package/build/testDoubles/LslInfo/FakeLslInfo.js.map +1 -0
  76. package/build/testDoubles/LslInfo/SpyLslInfo.d.ts +10 -0
  77. package/build/testDoubles/{StreamInfo/SpyStreamInfo.js → LslInfo/SpyLslInfo.js} +4 -4
  78. package/build/testDoubles/LslInfo/SpyLslInfo.js.map +1 -0
  79. package/build/testDoubles/{StreamInlet/FakeStreamInlet.d.ts → LslInlet/FakeLslInlet.d.ts} +4 -4
  80. package/build/testDoubles/{StreamInlet/FakeStreamInlet.js → LslInlet/FakeLslInlet.js} +12 -11
  81. package/build/testDoubles/LslInlet/FakeLslInlet.js.map +1 -0
  82. package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +4 -0
  83. package/build/testDoubles/{StreamInlet/SpyStreamInlet.js → LslInlet/SpyLslInlet.js} +2 -2
  84. package/build/testDoubles/LslInlet/SpyLslInlet.js.map +1 -0
  85. package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.d.ts → LslOutlet/FakeLslOutlet.d.ts} +5 -5
  86. package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.js → LslOutlet/FakeLslOutlet.js} +8 -8
  87. package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +1 -0
  88. package/build/testDoubles/LslWsBridge/FakeLslWsBridge.d.ts +14 -0
  89. package/build/testDoubles/{WebSocketBridge/FakeWebSocketBridge.js → LslWsBridge/FakeLslWsBridge.js} +14 -14
  90. package/build/testDoubles/LslWsBridge/FakeLslWsBridge.js.map +1 -0
  91. package/build/testDoubles/LslWsBridge/SpyLslWsBridge.d.ts +4 -0
  92. package/build/testDoubles/{WebSocketBridge/SpyLslWebSocketBridge.js → LslWsBridge/SpyLslWsBridge.js} +2 -2
  93. package/build/testDoubles/LslWsBridge/SpyLslWsBridge.js.map +1 -0
  94. package/build/testDoubles/UsbController/FakeUsbController.d.ts +12 -0
  95. package/build/testDoubles/UsbController/FakeUsbController.js +25 -0
  96. package/build/testDoubles/UsbController/FakeUsbController.js.map +1 -0
  97. package/build/testDoubles/consts.d.ts +2 -12
  98. package/build/testDoubles/consts.js +0 -20
  99. package/build/testDoubles/consts.js.map +1 -1
  100. package/build/testDoubles/generateRandomOutletOptions.d.ts +2 -2
  101. package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
  102. package/package.json +6 -5
  103. package/src/__tests__/AbstractPackageTest.ts +78 -49
  104. package/src/__tests__/impl/BleDeviceController.test.ts +59 -18
  105. package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +19 -24
  106. package/src/__tests__/impl/LslStreamInfo.test.ts +8 -8
  107. package/src/__tests__/impl/LslStreamInlet.test.ts +21 -78
  108. package/src/__tests__/impl/LslStreamOutlet.test.ts +22 -28
  109. package/src/__tests__/impl/LslWebSocketBridge.test.ts +15 -18
  110. package/src/__tests__/impl/UsbDeviceController.test.ts +109 -0
  111. package/src/__tests__/impl/WindowedClockRegressor.test.ts +262 -0
  112. package/src/assertions.ts +1 -2
  113. package/src/impl/LslEventMarkerEmitter.ts +15 -17
  114. package/src/impl/LslStreamInfo.ts +7 -9
  115. package/src/impl/LslStreamInlet.ts +304 -77
  116. package/src/impl/LslStreamOutlet.ts +59 -57
  117. package/src/impl/LslWebSocketBridge.ts +15 -18
  118. package/src/impl/clocks/WindowedClockRegressor.ts +136 -0
  119. package/src/impl/controllers/BleDeviceController.ts +18 -1
  120. package/src/impl/controllers/UsbDeviceController.ts +65 -0
  121. package/src/index.ts +48 -28
  122. package/src/scripts/{runLslEventMarkerEmitter.ts → runLslEmitter.ts} +4 -3
  123. package/src/scripts/runMuse.ts +1 -1
  124. package/src/scripts/runUsb.ts +20 -0
  125. package/src/testDoubles/BleController/FakeBleController.ts +11 -0
  126. package/src/testDoubles/ClockRegressor/FakeClockRegressor.ts +46 -0
  127. package/src/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.ts → LslEmitter/FakeLslEmitter.ts} +10 -10
  128. package/src/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.ts → LslEmitter/SpyLslEmitter.ts} +4 -4
  129. package/src/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.ts → LslEmitter/ThrowingLslEmitter.ts} +4 -4
  130. package/src/testDoubles/{StreamInfo/FakeStreamInfo.ts → LslInfo/FakeLslInfo.ts} +9 -9
  131. package/src/testDoubles/{StreamInfo/SpyStreamInfo.ts → LslInfo/SpyLslInfo.ts} +5 -5
  132. package/src/testDoubles/{StreamInlet/FakeStreamInlet.ts → LslInlet/FakeLslInlet.ts} +15 -14
  133. package/src/testDoubles/LslInlet/SpyLslInlet.ts +10 -0
  134. package/src/testDoubles/{StreamOutlet/FakeStreamOutlet.ts → LslOutlet/FakeLslOutlet.ts} +11 -14
  135. package/src/testDoubles/{WebSocketBridge/FakeWebSocketBridge.ts → LslWsBridge/FakeLslWsBridge.ts} +19 -20
  136. package/src/testDoubles/LslWsBridge/SpyLslWsBridge.ts +9 -0
  137. package/src/testDoubles/UsbController/FakeUsbController.ts +34 -0
  138. package/src/testDoubles/consts.ts +3 -23
  139. package/src/testDoubles/generateRandomOutletOptions.ts +2 -2
  140. package/build/consts.d.ts +0 -11
  141. package/build/consts.js +0 -21
  142. package/build/consts.js.map +0 -1
  143. package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +0 -22
  144. package/build/impl/workers/inlet/LslStreamInlet.worker.js +0 -42
  145. package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +0 -1
  146. package/build/impl/workers/inlet/StreamInletWorker.d.ts +0 -73
  147. package/build/impl/workers/inlet/StreamInletWorker.js +0 -253
  148. package/build/impl/workers/inlet/StreamInletWorker.js.map +0 -1
  149. package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +0 -32
  150. package/build/impl/workers/outlet/LslStreamOutlet.worker.js +0 -82
  151. package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +0 -1
  152. package/build/scripts/discoverMuse.js +0 -40
  153. package/build/scripts/discoverMuse.js.map +0 -1
  154. package/build/scripts/runLslEventMarkerEmitter.js.map +0 -1
  155. package/build/scripts/runLslStreamOutlet.js.map +0 -1
  156. package/build/scripts/testDestroyOutlet.d.ts +0 -1
  157. package/build/scripts/testDestroyOutlet.js +0 -4
  158. package/build/scripts/testDestroyOutlet.js.map +0 -1
  159. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +0 -1
  160. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +0 -1
  161. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +0 -9
  162. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +0 -1
  163. package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +0 -1
  164. package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +0 -10
  165. package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +0 -1
  166. package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +0 -1
  167. package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +0 -4
  168. package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +0 -1
  169. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +0 -1
  170. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +0 -14
  171. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +0 -1
  172. package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.d.ts +0 -4
  173. package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js.map +0 -1
  174. package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +0 -27
  175. package/build/testDoubles/WorkerThreads/FakeWorker.js +0 -67
  176. package/build/testDoubles/WorkerThreads/FakeWorker.js.map +0 -1
  177. package/src/consts.ts +0 -21
  178. package/src/impl/workers/inlet/LslStreamInlet.worker.ts +0 -74
  179. package/src/impl/workers/inlet/StreamInletWorker.ts +0 -348
  180. package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +0 -144
  181. package/src/scripts/discoverMuse.ts +0 -50
  182. package/src/scripts/testDestroyOutlet.ts +0 -5
  183. package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +0 -10
  184. package/src/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.ts +0 -9
  185. package/src/testDoubles/WorkerThreads/FakeWorker.ts +0 -99
  186. /package/build/scripts/{discoverMuse.d.ts → runLslEmitter.d.ts} +0 -0
  187. /package/build/scripts/{runLslEventMarkerEmitter.d.ts → runLslOutlet.d.ts} +0 -0
  188. /package/build/scripts/{runLslStreamOutlet.d.ts → runUsb.d.ts} +0 -0
  189. /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
- StreamInletOptions,
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: SpyStreamInlet
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.setFakeStreamInfo()
64
- this.setSpyStreamInlet()
57
+ this.setFakeLslInfo()
58
+ this.setSpyLslInlet()
65
59
 
66
60
  this.callsToOnData = []
67
61
 
68
62
  LslStreamInlet.waitAfterOpenStreamMs = 0
69
-
70
- LslStreamInlet.Worker = FakeWorker as unknown as typeof Worker
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
- StreamInletWorker.freePointer = (params: FreePointerParams) => {
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
- FakeWorker.callsToPostMessage.filter(
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: this.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
- StreamInletWorker.handleLslError = (errorCode: number) => {
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 inletWorker = this.getFakeWorker(instance)['inletWorker']
418
- const original = inletWorker['pullDataOnce'].bind(inletWorker)
377
+ const original = instance['pullDataOnce'].bind(instance)
419
378
 
420
- inletWorker['pullDataOnce'] = async () => {
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<StreamInletOptions>
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?: SpyStreamInlet) {
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?: SpyStreamInlet) {
526
- const inst = instance || this.instance
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.getFakeWorker()['inletWorker']['inletHandle']
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 SpyStreamInlet
515
+ )) as SpyLslInlet
573
516
  }
574
517
  }
@@ -1,27 +1,25 @@
1
- import { Worker } from 'node:worker_threads'
2
- import { ChannelFormat, LslSample, FakeLiblsl } from '@neurodevs/ndx-native'
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
- StreamOutletOptions,
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 FakeStreamInfo from '../../testDoubles/StreamInfo/FakeStreamInfo.js'
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: StreamOutletOptions
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.setFakeStreamInfo()
32
+ this.setFakeLslInfo()
35
33
 
36
- LslStreamOutlet.Worker = FakeWorker as unknown as typeof Worker
37
- FakeWorker.resetTestDoubles()
38
-
39
- setOutletLiblslAdapter(this.fakeLiblsl)
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(FakeStreamInfo.callsToConstructor[0], {
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
- setOutletHandleLslError((errorCode: number) => {
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)
@@ -265,11 +260,12 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
265
260
 
266
261
  @test()
267
262
  protected static async waitsForTenMsAfterConstructionBeforeReturning() {
268
- const startMs = Date.now()
269
- await this.LslStreamOutlet({ waitAfterConstructionMs: 10 })
270
- const endMs = Date.now()
263
+ await this.LslStreamOutlet()
271
264
 
272
- assert.isAbove(endMs - startMs, 8)
265
+ assert.isTruthy(
266
+ this.callsToSetTimeout.includes(10),
267
+ 'Did not wait for 10ms after construction!'
268
+ )
273
269
  }
274
270
 
275
271
  @test()
@@ -345,7 +341,7 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
345
341
  }
346
342
 
347
343
  private static async createAndAssertThrows(
348
- option: keyof StreamOutletOptions,
344
+ option: keyof LslOutletOptions,
349
345
  value: number | string[] | ChannelFormat,
350
346
  expectedMessage: string
351
347
  ) {
@@ -367,9 +363,7 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
367
363
  return await this.LslStreamOutlet({ channelFormat: 'float32' })
368
364
  }
369
365
 
370
- private static async LslStreamOutlet(
371
- options?: Partial<StreamOutletOptions>
372
- ) {
366
+ private static async LslStreamOutlet(options?: Partial<LslOutletOptions>) {
373
367
  return await LslStreamOutlet.Create({
374
368
  ...this.randomOutletOptions,
375
369
  ...options,
@@ -378,7 +372,7 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
378
372
  }
379
373
 
380
374
  class CheckingOutlet extends LslStreamOutlet {
381
- public constructor(options: StreamOutletOptions) {
375
+ public constructor(options: LslOutletOptions) {
382
376
  super(options)
383
377
  }
384
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 { StreamInletOptions } from '../../impl/LslStreamInlet.js'
5
+ import { LslInletOptions } from '../../impl/LslStreamInlet.js'
6
6
  import LslWebSocketBridge, {
7
- WebSocketBridgeOptions,
7
+ LslWsBridgeOptions,
8
8
  } from '../../impl/LslWebSocketBridge.js'
9
- import FakeStreamInlet from '../../testDoubles/StreamInlet/FakeStreamInlet.js'
10
- import SpyLslWebSocketBridge from '../../testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js'
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: SpyLslWebSocketBridge
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.setFakeStreamInlet()
22
+ this.setFakeLslInlet()
23
23
  this.setFakeWebSocket()
24
24
  this.setFakeWebSocketServer()
25
- this.setSpyLslWebSocketBridge()
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 = FakeStreamInlet.callsToConstructor[0]
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
- FakeStreamInlet.numCallsToStartPulling,
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
- FakeStreamInlet.numCallsToStopPulling,
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
- FakeStreamInlet.numCallsToDestroy,
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
- FakeStreamInlet.callsToConstructor[0]?.onData!(samples, timestamps)
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: StreamInletOptions = {
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
  }
@@ -0,0 +1,109 @@
1
+ import { test, assert } from '@neurodevs/node-tdd'
2
+
3
+ import UsbDeviceController, {
4
+ UsbController,
5
+ } from '../../impl/controllers/UsbDeviceController.js'
6
+ import AbstractPackageTest from '../AbstractPackageTest.js'
7
+ import { FakeLibndx } from '@neurodevs/ndx-native'
8
+
9
+ export default class UsbDeviceControllerTest extends AbstractPackageTest {
10
+ private static instance: UsbController
11
+
12
+ private static readonly serialNumber = this.generateId()
13
+ private static readonly valueToWrite = this.generateId()
14
+
15
+ private static readonly callsToOnData: {
16
+ data: Buffer
17
+ length: number
18
+ timestampSec: number
19
+ }[] = []
20
+
21
+ private static readonly onData = (
22
+ data: Buffer,
23
+ length: number,
24
+ timestampSec: number
25
+ ) => {
26
+ this.callsToOnData.push({ data, length, timestampSec })
27
+ }
28
+
29
+ protected static async beforeEach() {
30
+ await super.beforeEach()
31
+
32
+ this.instance = this.UsbDeviceController()
33
+ }
34
+
35
+ @test()
36
+ protected static async createsInstance() {
37
+ assert.isTruthy(this.instance, 'Failed to create instance!')
38
+ }
39
+
40
+ @test()
41
+ protected static async connectCallsLibndxCreateUsbBackend() {
42
+ await this.connect()
43
+
44
+ assert.isEqualDeep(
45
+ FakeLibndx.callsToCreateUsbBackend[0],
46
+ {
47
+ serialNumber: this.serialNumber,
48
+ },
49
+ 'Did not call create_usb_backend!'
50
+ )
51
+ }
52
+
53
+ @test()
54
+ protected static async connectCallsLibndxStartUsbBackend() {
55
+ await this.connect()
56
+
57
+ assert.isEqualDeep(
58
+ FakeLibndx.callsToStartUsbBackend[0],
59
+ {
60
+ serialNumber: this.serialNumber,
61
+ onData: this.onData,
62
+ },
63
+ 'Did not call start_usb_backend!'
64
+ )
65
+ }
66
+
67
+ @test()
68
+ protected static async disconnectCallsLibndxStopUsbBackend() {
69
+ await this.connect()
70
+ await this.disconnect()
71
+
72
+ assert.isEqualDeep(
73
+ FakeLibndx.callsToStopUsbBackend[0],
74
+ {
75
+ serialNumber: this.serialNumber,
76
+ },
77
+ 'Did not call stop_usb_backend!'
78
+ )
79
+ }
80
+
81
+ @test()
82
+ protected static async writeUsbCallsLibndxWriteUsbBackend() {
83
+ await this.instance.writeUsb(this.valueToWrite)
84
+
85
+ assert.isEqualDeep(
86
+ FakeLibndx.callsToWriteUsbBackend[0],
87
+ {
88
+ serialNumber: this.serialNumber,
89
+ value: this.valueToWrite,
90
+ },
91
+ 'Did not call write_usb_backend!'
92
+ )
93
+ }
94
+
95
+ private static async connect() {
96
+ await this.instance.connect()
97
+ }
98
+
99
+ private static async disconnect() {
100
+ await this.instance.disconnect()
101
+ }
102
+
103
+ private static UsbDeviceController() {
104
+ return UsbDeviceController.Create({
105
+ onData: this.onData,
106
+ serialNumber: this.serialNumber,
107
+ })
108
+ }
109
+ }