@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.
Files changed (168) hide show
  1. package/build/__tests__/AbstractPackageTest.d.ts +11 -11
  2. package/build/__tests__/AbstractPackageTest.js +26 -30
  3. package/build/__tests__/AbstractPackageTest.js.map +1 -1
  4. package/build/__tests__/impl/BleDeviceController.test.d.ts +1 -1
  5. package/build/__tests__/impl/BleDeviceController.test.js +8 -10
  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 +7 -12
  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/WindowedClockRegressor.test.js +1 -1
  19. package/build/__tests__/impl/WindowedClockRegressor.test.js.map +1 -1
  20. package/build/assertions.js +1 -1
  21. package/build/assertions.js.map +1 -1
  22. package/build/impl/LslEventMarkerEmitter.d.ts +12 -12
  23. package/build/impl/LslEventMarkerEmitter.js.map +1 -1
  24. package/build/impl/LslStreamInfo.d.ts +7 -7
  25. package/build/impl/LslStreamInfo.js.map +1 -1
  26. package/build/impl/LslStreamInlet.d.ts +63 -21
  27. package/build/impl/LslStreamInlet.js +221 -65
  28. package/build/impl/LslStreamInlet.js.map +1 -1
  29. package/build/impl/LslStreamOutlet.d.ts +15 -14
  30. package/build/impl/LslStreamOutlet.js +32 -36
  31. package/build/impl/LslStreamOutlet.js.map +1 -1
  32. package/build/impl/LslWebSocketBridge.d.ts +10 -10
  33. package/build/impl/LslWebSocketBridge.js.map +1 -1
  34. package/build/impl/clocks/WindowedClockRegressor.js.map +1 -0
  35. package/build/impl/controllers/BleDeviceController.d.ts +1 -1
  36. package/build/impl/controllers/BleDeviceController.js +1 -1
  37. package/build/impl/controllers/BleDeviceController.js.map +1 -1
  38. package/build/index.d.ts +27 -23
  39. package/build/index.js +32 -29
  40. package/build/index.js.map +1 -1
  41. package/build/scripts/{runLslEventMarkerEmitter.js → runLslEmitter.js} +5 -4
  42. package/build/scripts/runLslEmitter.js.map +1 -0
  43. package/build/scripts/{runLslStreamOutlet.js → runLslOutlet.js} +1 -1
  44. package/build/scripts/runLslOutlet.js.map +1 -0
  45. package/build/scripts/runMuse.js +1 -1
  46. package/build/scripts/runMuse.js.map +1 -1
  47. package/build/testDoubles/ClockRegressor/FakeClockRegressor.d.ts +1 -1
  48. package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.d.ts → LslEmitter/FakeLslEmitter.d.ts} +4 -4
  49. package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.js → LslEmitter/FakeLslEmitter.js} +7 -7
  50. package/build/testDoubles/LslEmitter/FakeLslEmitter.js.map +1 -0
  51. package/build/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.d.ts → LslEmitter/SpyLslEmitter.d.ts} +4 -4
  52. package/build/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.js → LslEmitter/SpyLslEmitter.js} +3 -3
  53. package/build/testDoubles/LslEmitter/SpyLslEmitter.js.map +1 -0
  54. package/build/testDoubles/LslEmitter/ThrowingLslEmitter.d.ts +9 -0
  55. package/build/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.js → LslEmitter/ThrowingLslEmitter.js} +2 -2
  56. package/build/testDoubles/LslEmitter/ThrowingLslEmitter.js.map +1 -0
  57. package/build/testDoubles/{StreamInfo/FakeStreamInfo.d.ts → LslInfo/FakeLslInfo.d.ts} +4 -4
  58. package/build/testDoubles/{StreamInfo/FakeStreamInfo.js → LslInfo/FakeLslInfo.js} +7 -7
  59. package/build/testDoubles/LslInfo/FakeLslInfo.js.map +1 -0
  60. package/build/testDoubles/LslInfo/SpyLslInfo.d.ts +10 -0
  61. package/build/testDoubles/{StreamInfo/SpyStreamInfo.js → LslInfo/SpyLslInfo.js} +4 -4
  62. package/build/testDoubles/LslInfo/SpyLslInfo.js.map +1 -0
  63. package/build/testDoubles/{StreamInlet/FakeStreamInlet.d.ts → LslInlet/FakeLslInlet.d.ts} +4 -4
  64. package/build/testDoubles/{StreamInlet/FakeStreamInlet.js → LslInlet/FakeLslInlet.js} +12 -11
  65. package/build/testDoubles/LslInlet/FakeLslInlet.js.map +1 -0
  66. package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +4 -0
  67. package/build/testDoubles/{StreamInlet/SpyStreamInlet.js → LslInlet/SpyLslInlet.js} +2 -2
  68. package/build/testDoubles/LslInlet/SpyLslInlet.js.map +1 -0
  69. package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.d.ts → LslOutlet/FakeLslOutlet.d.ts} +5 -5
  70. package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.js → LslOutlet/FakeLslOutlet.js} +8 -8
  71. package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +1 -0
  72. package/build/testDoubles/LslWsBridge/FakeLslWsBridge.d.ts +14 -0
  73. package/build/testDoubles/{WebSocketBridge/FakeWebSocketBridge.js → LslWsBridge/FakeLslWsBridge.js} +14 -14
  74. package/build/testDoubles/LslWsBridge/FakeLslWsBridge.js.map +1 -0
  75. package/build/testDoubles/LslWsBridge/SpyLslWsBridge.d.ts +4 -0
  76. package/build/testDoubles/{WebSocketBridge/SpyLslWebSocketBridge.js → LslWsBridge/SpyLslWsBridge.js} +2 -2
  77. package/build/testDoubles/LslWsBridge/SpyLslWsBridge.js.map +1 -0
  78. package/build/testDoubles/consts.d.ts +2 -12
  79. package/build/testDoubles/consts.js +0 -20
  80. package/build/testDoubles/consts.js.map +1 -1
  81. package/build/testDoubles/generateRandomOutletOptions.d.ts +2 -2
  82. package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
  83. package/package.json +4 -3
  84. package/src/__tests__/AbstractPackageTest.ts +29 -38
  85. package/src/__tests__/impl/BleDeviceController.test.ts +8 -10
  86. package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +19 -24
  87. package/src/__tests__/impl/LslStreamInfo.test.ts +8 -8
  88. package/src/__tests__/impl/LslStreamInlet.test.ts +21 -78
  89. package/src/__tests__/impl/LslStreamOutlet.test.ts +17 -24
  90. package/src/__tests__/impl/LslWebSocketBridge.test.ts +15 -18
  91. package/src/__tests__/impl/WindowedClockRegressor.test.ts +1 -1
  92. package/src/assertions.ts +1 -2
  93. package/src/impl/LslEventMarkerEmitter.ts +15 -17
  94. package/src/impl/LslStreamInfo.ts +7 -9
  95. package/src/impl/LslStreamInlet.ts +305 -81
  96. package/src/impl/LslStreamOutlet.ts +57 -56
  97. package/src/impl/LslWebSocketBridge.ts +15 -18
  98. package/src/impl/controllers/BleDeviceController.ts +1 -1
  99. package/src/index.ts +38 -34
  100. package/src/scripts/{runLslEventMarkerEmitter.ts → runLslEmitter.ts} +4 -3
  101. package/src/scripts/runMuse.ts +1 -1
  102. package/src/testDoubles/ClockRegressor/FakeClockRegressor.ts +1 -1
  103. package/src/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.ts → LslEmitter/FakeLslEmitter.ts} +10 -10
  104. package/src/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.ts → LslEmitter/SpyLslEmitter.ts} +4 -4
  105. package/src/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.ts → LslEmitter/ThrowingLslEmitter.ts} +4 -4
  106. package/src/testDoubles/{StreamInfo/FakeStreamInfo.ts → LslInfo/FakeLslInfo.ts} +9 -9
  107. package/src/testDoubles/{StreamInfo/SpyStreamInfo.ts → LslInfo/SpyLslInfo.ts} +5 -5
  108. package/src/testDoubles/{StreamInlet/FakeStreamInlet.ts → LslInlet/FakeLslInlet.ts} +15 -14
  109. package/src/testDoubles/LslInlet/SpyLslInlet.ts +10 -0
  110. package/src/testDoubles/{StreamOutlet/FakeStreamOutlet.ts → LslOutlet/FakeLslOutlet.ts} +11 -14
  111. package/src/testDoubles/{WebSocketBridge/FakeWebSocketBridge.ts → LslWsBridge/FakeLslWsBridge.ts} +19 -19
  112. package/src/testDoubles/LslWsBridge/SpyLslWsBridge.ts +9 -0
  113. package/src/testDoubles/consts.ts +3 -23
  114. package/src/testDoubles/generateRandomOutletOptions.ts +2 -2
  115. package/build/consts.d.ts +0 -11
  116. package/build/consts.js +0 -21
  117. package/build/consts.js.map +0 -1
  118. package/build/impl/WindowedClockRegressor.js.map +0 -1
  119. package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +0 -22
  120. package/build/impl/workers/inlet/LslStreamInlet.worker.js +0 -42
  121. package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +0 -1
  122. package/build/impl/workers/inlet/StreamInletWorker.d.ts +0 -73
  123. package/build/impl/workers/inlet/StreamInletWorker.js +0 -253
  124. package/build/impl/workers/inlet/StreamInletWorker.js.map +0 -1
  125. package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +0 -32
  126. package/build/impl/workers/outlet/LslStreamOutlet.worker.js +0 -82
  127. package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +0 -1
  128. package/build/scripts/discoverMuse.js +0 -40
  129. package/build/scripts/discoverMuse.js.map +0 -1
  130. package/build/scripts/runLslEventMarkerEmitter.js.map +0 -1
  131. package/build/scripts/runLslStreamOutlet.d.ts +0 -1
  132. package/build/scripts/runLslStreamOutlet.js.map +0 -1
  133. package/build/scripts/testDestroyOutlet.d.ts +0 -1
  134. package/build/scripts/testDestroyOutlet.js +0 -4
  135. package/build/scripts/testDestroyOutlet.js.map +0 -1
  136. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +0 -1
  137. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +0 -1
  138. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +0 -9
  139. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +0 -1
  140. package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +0 -1
  141. package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +0 -10
  142. package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +0 -1
  143. package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +0 -1
  144. package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +0 -4
  145. package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +0 -1
  146. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +0 -1
  147. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +0 -14
  148. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +0 -1
  149. package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.d.ts +0 -4
  150. package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js.map +0 -1
  151. package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +0 -27
  152. package/build/testDoubles/WorkerThreads/FakeWorker.js +0 -67
  153. package/build/testDoubles/WorkerThreads/FakeWorker.js.map +0 -1
  154. package/src/consts.ts +0 -21
  155. package/src/impl/workers/inlet/LslStreamInlet.worker.ts +0 -74
  156. package/src/impl/workers/inlet/StreamInletWorker.ts +0 -348
  157. package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +0 -144
  158. package/src/scripts/discoverMuse.ts +0 -50
  159. package/src/scripts/testDestroyOutlet.ts +0 -5
  160. package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +0 -10
  161. package/src/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.ts +0 -9
  162. package/src/testDoubles/WorkerThreads/FakeWorker.ts +0 -99
  163. /package/build/impl/{WindowedClockRegressor.d.ts → clocks/WindowedClockRegressor.d.ts} +0 -0
  164. /package/build/impl/{WindowedClockRegressor.js → clocks/WindowedClockRegressor.js} +0 -0
  165. /package/build/scripts/{discoverMuse.d.ts → runLslEmitter.d.ts} +0 -0
  166. /package/build/scripts/{runLslEventMarkerEmitter.d.ts → runLslOutlet.d.ts} +0 -0
  167. /package/src/impl/{WindowedClockRegressor.ts → clocks/WindowedClockRegressor.ts} +0 -0
  168. /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()
35
-
36
- LslStreamOutlet.Worker = FakeWorker as unknown as typeof Worker
37
- FakeWorker.resetTestDoubles()
32
+ this.setFakeLslInfo()
38
33
 
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)
@@ -346,7 +341,7 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
346
341
  }
347
342
 
348
343
  private static async createAndAssertThrows(
349
- option: keyof StreamOutletOptions,
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: StreamOutletOptions) {
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 { 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
  }
@@ -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,6 +1,5 @@
1
- import { ChannelFormat } from '@neurodevs/ndx-native'
1
+ import { CHANNEL_FORMATS, ChannelFormat } from '@neurodevs/ndx-native'
2
2
 
3
- import { CHANNEL_FORMATS } from './consts.js'
4
3
  import {
5
4
  isGreaterThanOrEqualToZero,
6
5
  isPositiveInteger,
@@ -1,28 +1,28 @@
1
1
  import { generateShortId } from '@neurodevs/generate-id'
2
2
 
3
3
  import LslStreamOutlet, {
4
- StreamOutletOptions,
5
- StreamOutlet,
4
+ LslOutletOptions,
5
+ LslOutlet,
6
6
  } from './LslStreamOutlet.js'
7
7
 
8
- export default class LslEventMarkerEmitter implements EventMarkerEmitter {
9
- public static Class?: EventMarkerEmitterConstructor
8
+ export default class LslEventMarkerEmitter implements LslEmitter {
9
+ public static Class?: LslEmitterConstructor
10
10
 
11
- protected outlet: StreamOutlet
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: StreamOutlet) {
16
+ protected constructor(outlet: LslOutlet) {
17
17
  this.outlet = outlet
18
18
  }
19
19
 
20
- public static async Create(options?: EventMarkerEmitterOptions) {
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?: EventMarkerOptions) {
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 StreamOutletOptions
102
+ } as LslOutletOptions
103
103
  }
104
104
 
105
- private static LslStreamOutlet(options?: Partial<StreamOutletOptions>) {
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 EventMarkerEmitter {
114
- emit(markerName: string, options?: EventMarkerOptions): Promise<void>
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 EventMarkerEmitterOptions = Partial<StreamOutletOptions>
120
+ export type LslEmitterOptions = Partial<LslOutletOptions>
121
121
 
122
- export type EventMarkerEmitterConstructor = new (
123
- outlet: StreamOutlet
124
- ) => EventMarkerEmitter
122
+ export type LslEmitterConstructor = new (outlet: LslOutlet) => LslEmitter
125
123
 
126
- export interface EventMarkerOptions {
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 StreamInfo {
10
- public static Class?: StreamInfoConstructor
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: StreamInfoOptions) {
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: StreamInfoOptions) {
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 StreamInfo {
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 StreamInfoConstructor = new (
98
- options: StreamInfoOptions
99
- ) => StreamInfo
97
+ export type LslInfoConstructor = new (options: LslInfoOptions) => LslInfo
100
98
 
101
- export interface StreamInfoOptions {
99
+ export interface LslInfoOptions {
102
100
  channelNames: string[]
103
101
  channelFormat: ChannelFormat
104
102
  sampleRateHz: number