@neurodevs/node-lsl 20.0.0 → 22.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 (117) hide show
  1. package/README.md +6 -6
  2. package/build/__tests__/AbstractPackageTest.d.ts +2 -1
  3. package/build/__tests__/AbstractPackageTest.js +9 -7
  4. package/build/__tests__/AbstractPackageTest.js.map +1 -1
  5. package/build/__tests__/impl/{BleDeviceController.test.d.ts → BleGattController.test.d.ts} +3 -3
  6. package/build/__tests__/impl/{BleDeviceController.test.js → BleGattController.test.js} +65 -65
  7. package/build/__tests__/impl/BleGattController.test.js.map +1 -0
  8. package/build/__tests__/impl/BleObserverController.test.d.ts +12 -0
  9. package/build/__tests__/impl/BleObserverController.test.js +62 -0
  10. package/build/__tests__/impl/BleObserverController.test.js.map +1 -0
  11. package/build/__tests__/impl/{LslEventMarkerEmitter.test.d.ts → LslEventMarkerOutlet.test.d.ts} +3 -3
  12. package/build/__tests__/impl/{LslEventMarkerEmitter.test.js → LslEventMarkerOutlet.test.js} +35 -36
  13. package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +1 -0
  14. package/build/__tests__/impl/LslJsonOutlet.test.d.ts +14 -0
  15. package/build/__tests__/impl/LslJsonOutlet.test.js +118 -0
  16. package/build/__tests__/impl/LslJsonOutlet.test.js.map +1 -0
  17. package/build/__tests__/impl/LslStreamInfo.test.js +0 -1
  18. package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
  19. package/build/__tests__/impl/LslStreamInlet.test.js +0 -1
  20. package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
  21. package/build/__tests__/impl/LslStreamOutlet.test.js +0 -1
  22. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
  23. package/build/__tests__/impl/LslWebSocketBridge.test.js +0 -1
  24. package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
  25. package/build/__tests__/impl/UsbDeviceController.test.js.map +1 -1
  26. package/build/impl/{LslEventMarkerEmitter.d.ts → LslEventMarkerOutlet.d.ts} +6 -6
  27. package/build/impl/{LslEventMarkerEmitter.js → LslEventMarkerOutlet.js} +2 -2
  28. package/build/impl/LslEventMarkerOutlet.js.map +1 -0
  29. package/build/impl/LslJsonOutlet.d.ts +33 -0
  30. package/build/impl/LslJsonOutlet.js +44 -0
  31. package/build/impl/LslJsonOutlet.js.map +1 -0
  32. package/build/impl/LslStreamOutlet.d.ts +3 -4
  33. package/build/impl/controllers/{BleDeviceController.d.ts → BleGattController.d.ts} +10 -10
  34. package/build/impl/controllers/{BleDeviceController.js → BleGattController.js} +18 -18
  35. package/build/impl/controllers/BleGattController.js.map +1 -0
  36. package/build/impl/controllers/BleObserverController.d.ts +20 -0
  37. package/build/impl/controllers/BleObserverController.js +37 -0
  38. package/build/impl/controllers/BleObserverController.js.map +1 -0
  39. package/build/impl/controllers/UsbDeviceController.d.ts +9 -9
  40. package/build/impl/controllers/UsbDeviceController.js +7 -7
  41. package/build/impl/controllers/UsbDeviceController.js.map +1 -1
  42. package/build/index.d.ts +24 -16
  43. package/build/index.js +29 -19
  44. package/build/index.js.map +1 -1
  45. package/build/scripts/runEventMarkerOutlet.js +12 -0
  46. package/build/scripts/runEventMarkerOutlet.js.map +1 -0
  47. package/build/scripts/runMuse.js +2 -2
  48. package/build/scripts/runMuse.js.map +1 -1
  49. package/build/testDoubles/{BleController/FakeBleController.d.ts → BleGatt/FakeBleGatt.d.ts} +6 -6
  50. package/build/testDoubles/{BleController/FakeBleController.js → BleGatt/FakeBleGatt.js} +8 -8
  51. package/build/testDoubles/BleGatt/FakeBleGatt.js.map +1 -0
  52. package/build/testDoubles/{BleController/SpyBleController.d.ts → BleGatt/SpyBleGatt.d.ts} +4 -4
  53. package/build/testDoubles/{BleController/SpyBleController.js → BleGatt/SpyBleGatt.js} +3 -3
  54. package/build/testDoubles/BleGatt/SpyBleGatt.js.map +1 -0
  55. package/build/testDoubles/BleObserver/FakeBleObserver.d.ts +10 -0
  56. package/build/testDoubles/BleObserver/FakeBleObserver.js +20 -0
  57. package/build/testDoubles/BleObserver/FakeBleObserver.js.map +1 -0
  58. package/build/testDoubles/{LslEmitter/FakeLslEmitter.d.ts → EventMarkerOutlet/FakeEventMarkerOutlet.d.ts} +2 -2
  59. package/build/testDoubles/{LslEmitter/FakeLslEmitter.js → EventMarkerOutlet/FakeEventMarkerOutlet.js} +7 -7
  60. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +1 -0
  61. package/build/testDoubles/{LslEmitter/SpyLslEmitter.d.ts → EventMarkerOutlet/SpyEventMarkerOutlet.d.ts} +3 -3
  62. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +23 -0
  63. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +1 -0
  64. package/build/testDoubles/{LslEmitter/ThrowingLslEmitter.d.ts → EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts} +2 -2
  65. package/build/testDoubles/{LslEmitter/ThrowingLslEmitter.js → EventMarkerOutlet/ThrowingEventMarkerOutlet.js} +2 -2
  66. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +1 -0
  67. package/build/testDoubles/JsonOutlet/FakeJsonOutlet.d.ts +10 -0
  68. package/build/testDoubles/JsonOutlet/FakeJsonOutlet.js +20 -0
  69. package/build/testDoubles/JsonOutlet/FakeJsonOutlet.js.map +1 -0
  70. package/build/testDoubles/UsbDevice/FakeUsbDevice.d.ts +12 -0
  71. package/build/testDoubles/UsbDevice/FakeUsbDevice.js +25 -0
  72. package/build/testDoubles/UsbDevice/FakeUsbDevice.js.map +1 -0
  73. package/package.json +3 -3
  74. package/src/__tests__/AbstractPackageTest.ts +9 -7
  75. package/src/__tests__/impl/{BleDeviceController.test.ts → BleGattController.test.ts} +43 -43
  76. package/src/__tests__/impl/BleObserverController.test.ts +72 -0
  77. package/src/__tests__/impl/{LslEventMarkerEmitter.test.ts → LslEventMarkerOutlet.test.ts} +20 -19
  78. package/src/__tests__/impl/LslJsonOutlet.test.ts +135 -0
  79. package/src/__tests__/impl/LslStreamInfo.test.ts +0 -1
  80. package/src/__tests__/impl/LslStreamInlet.test.ts +0 -1
  81. package/src/__tests__/impl/LslStreamOutlet.test.ts +0 -1
  82. package/src/__tests__/impl/LslWebSocketBridge.test.ts +0 -1
  83. package/src/__tests__/impl/UsbDeviceController.test.ts +2 -2
  84. package/src/impl/{LslEventMarkerEmitter.ts → LslEventMarkerOutlet.ts} +8 -6
  85. package/src/impl/LslJsonOutlet.ts +87 -0
  86. package/src/impl/LslStreamOutlet.ts +7 -5
  87. package/src/impl/controllers/{BleDeviceController.ts → BleGattController.ts} +23 -28
  88. package/src/impl/controllers/BleObserverController.ts +62 -0
  89. package/src/impl/controllers/UsbDeviceController.ts +14 -16
  90. package/src/index.ts +40 -24
  91. package/src/scripts/{runLslEmitter.ts → runEventMarkerOutlet.ts} +5 -5
  92. package/src/scripts/runMuse.ts +2 -2
  93. package/src/testDoubles/{BleController/FakeBleController.ts → BleGatt/FakeBleGatt.ts} +14 -14
  94. package/src/testDoubles/{BleController/SpyBleController.ts → BleGatt/SpyBleGatt.ts} +5 -5
  95. package/src/testDoubles/BleObserver/FakeBleObserver.ts +28 -0
  96. package/src/testDoubles/{LslEmitter/FakeLslEmitter.ts → EventMarkerOutlet/FakeEventMarkerOutlet.ts} +8 -8
  97. package/src/testDoubles/{LslEmitter/SpyLslEmitter.ts → EventMarkerOutlet/SpyEventMarkerOutlet.ts} +7 -7
  98. package/src/testDoubles/{LslEmitter/ThrowingLslEmitter.ts → EventMarkerOutlet/ThrowingEventMarkerOutlet.ts} +3 -3
  99. package/src/testDoubles/JsonOutlet/FakeJsonOutlet.ts +25 -0
  100. package/src/testDoubles/UsbDevice/FakeUsbDevice.ts +34 -0
  101. package/build/__tests__/impl/BleDeviceController.test.js.map +0 -1
  102. package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +0 -1
  103. package/build/impl/LslEventMarkerEmitter.js.map +0 -1
  104. package/build/impl/controllers/BleDeviceController.js.map +0 -1
  105. package/build/scripts/runLslEmitter.js +0 -12
  106. package/build/scripts/runLslEmitter.js.map +0 -1
  107. package/build/testDoubles/BleController/FakeBleController.js.map +0 -1
  108. package/build/testDoubles/BleController/SpyBleController.js.map +0 -1
  109. package/build/testDoubles/LslEmitter/FakeLslEmitter.js.map +0 -1
  110. package/build/testDoubles/LslEmitter/SpyLslEmitter.js +0 -23
  111. package/build/testDoubles/LslEmitter/SpyLslEmitter.js.map +0 -1
  112. package/build/testDoubles/LslEmitter/ThrowingLslEmitter.js.map +0 -1
  113. package/build/testDoubles/UsbController/FakeUsbController.d.ts +0 -12
  114. package/build/testDoubles/UsbController/FakeUsbController.js +0 -25
  115. package/build/testDoubles/UsbController/FakeUsbController.js.map +0 -1
  116. package/src/testDoubles/UsbController/FakeUsbController.ts +0 -34
  117. /package/build/scripts/{runLslEmitter.d.ts → runEventMarkerOutlet.d.ts} +0 -0
@@ -3,14 +3,14 @@ import { randomInt } from 'node:crypto'
3
3
  import { test, assert } from '@neurodevs/node-tdd'
4
4
  import { FakeLibndx, NativePeripheral } from '@neurodevs/ndx-native'
5
5
 
6
- import SpyBleController from '../../testDoubles/BleController/SpyBleController.js'
6
+ import SpyBleGatt from '../../testDoubles/BleGatt/SpyBleGatt.js'
7
7
  import AbstractPackageTest from '../AbstractPackageTest.js'
8
- import BleDeviceController, {
9
- BleControllerOptions,
10
- } from '../../impl/controllers/BleDeviceController.js'
8
+ import BleGattController, {
9
+ BleGattOptions,
10
+ } from '../../impl/controllers/BleGattController.js'
11
11
 
12
- export default class BleDeviceControllerTest extends AbstractPackageTest {
13
- private static instance: SpyBleController
12
+ export default class BleGattControllerTest extends AbstractPackageTest {
13
+ private static instance: SpyBleGatt
14
14
 
15
15
  private static readonly uuid = this.generateId()
16
16
  private static readonly namePrefix = this.generateId()
@@ -56,7 +56,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
56
56
 
57
57
  protected static async beforeAll() {
58
58
  assert.isEqual(
59
- BleDeviceController.waitAfterMs,
59
+ BleGattController.waitAfterMs,
60
60
  1000,
61
61
  'Set incorrect waitAfterMs!'
62
62
  )
@@ -65,12 +65,12 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
65
65
  protected static async beforeEach() {
66
66
  await super.beforeEach()
67
67
 
68
- BleDeviceController.waitAfterMs = 0
69
- BleDeviceController.Class = SpyBleController
68
+ BleGattController.waitAfterMs = 0
69
+ BleGattController.Class = SpyBleGatt
70
70
 
71
71
  this.wasConnected = false
72
72
 
73
- this.instance = this.BleDeviceController()
73
+ this.instance = this.BleGattController()
74
74
  }
75
75
 
76
76
  @test()
@@ -83,17 +83,17 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
83
83
  await this.connect()
84
84
 
85
85
  assert.isEqualDeep(
86
- FakeLibndx.callsToCreateBleBackend[0],
86
+ FakeLibndx.callsToCreateBleGattBackend[0],
87
87
  {
88
88
  deviceUuid: this.uuid,
89
89
  },
90
- 'Did not call createBleBackend!'
90
+ 'Did not call createBleGattBackend!'
91
91
  )
92
92
  }
93
93
 
94
94
  @test()
95
95
  protected static async discoversUuidWhenDeviceUuidNotProvided() {
96
- const instance = await this.BleControllerWithPrefix()
96
+ const instance = await this.BleGattControllerWithPrefix()
97
97
 
98
98
  await this.connectWithDiscovery(instance)
99
99
 
@@ -124,12 +124,12 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
124
124
 
125
125
  @test()
126
126
  protected static async usesDiscoveredUuidToCreateBleBackend() {
127
- const instance = await this.BleControllerWithPrefix()
127
+ const instance = await this.BleGattControllerWithPrefix()
128
128
 
129
129
  await this.connectWithDiscovery(instance)
130
130
 
131
131
  assert.isEqualDeep(
132
- FakeLibndx.callsToCreateBleBackend[0],
132
+ FakeLibndx.callsToCreateBleGattBackend[0],
133
133
  {
134
134
  deviceUuid: this.discoveredUuid,
135
135
  },
@@ -139,12 +139,12 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
139
139
 
140
140
  @test()
141
141
  protected static async usesDiscoveredUuidToStartBleBackend() {
142
- const instance = await this.BleControllerWithPrefix()
142
+ const instance = await this.BleGattControllerWithPrefix()
143
143
 
144
144
  await this.connectWithDiscovery(instance)
145
145
 
146
146
  assert.isEqual(
147
- FakeLibndx.callsToStartBleBackend[0]?.deviceUuid,
147
+ FakeLibndx.callsToStartBleGattBackend[0]?.deviceUuid,
148
148
  this.discoveredUuid,
149
149
  'Did not start BLE backend with the discovered uuid!'
150
150
  )
@@ -152,7 +152,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
152
152
 
153
153
  @test()
154
154
  protected static async exposesDiscoveredUuid() {
155
- const instance = await this.BleControllerWithPrefix()
155
+ const instance = await this.BleGattControllerWithPrefix()
156
156
 
157
157
  await this.connectWithDiscovery(instance)
158
158
 
@@ -189,18 +189,18 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
189
189
  protected static async connectCallsLibndxStartBleBackend() {
190
190
  await this.connect()
191
191
 
192
- const call = FakeLibndx.callsToStartBleBackend[0]
192
+ const call = FakeLibndx.callsToStartBleGattBackend[0]
193
193
 
194
194
  assert.isEqual(
195
195
  call.deviceUuid,
196
196
  this.uuid,
197
- 'Did not call startBleBackend with correct deviceUuid!'
197
+ 'Did not call startBleGattBackend with correct deviceUuid!'
198
198
  )
199
199
 
200
200
  assert.isEqual(
201
201
  call.charCallbacks.length,
202
202
  2,
203
- 'Did not call startBleBackend with charCallbacks!'
203
+ 'Did not call startBleGattBackend with charCallbacks!'
204
204
  )
205
205
 
206
206
  let i = 0
@@ -228,7 +228,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
228
228
  @test()
229
229
  protected static async startBleBackendThrowsOn400() {
230
230
  //@ts-ignore
231
- this.instance.createBleBackend = () => {}
231
+ this.instance.createBleGattBackend = () => {}
232
232
 
233
233
  this.setFake400Error()
234
234
 
@@ -242,7 +242,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
242
242
  @test()
243
243
  protected static async startBleBackendThrowsOn500() {
244
244
  //@ts-ignore
245
- this.instance.createBleBackend = () => {}
245
+ this.instance.createBleGattBackend = () => {}
246
246
 
247
247
  this.setFake500Error()
248
248
 
@@ -266,7 +266,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
266
266
  @test()
267
267
  protected static async waitsAfterOnConnectedToDiscoverServices() {
268
268
  const waitAfterMs = 20
269
- BleDeviceController.waitAfterMs = waitAfterMs
269
+ BleGattController.waitAfterMs = waitAfterMs
270
270
 
271
271
  await this.connect()
272
272
 
@@ -281,13 +281,13 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
281
281
  await this.writeCharacteristic()
282
282
 
283
283
  assert.isEqualDeep(
284
- FakeLibndx.callsToWriteBleCharacteristic[0],
284
+ FakeLibndx.callsToWriteBleGattChar[0],
285
285
  {
286
286
  deviceUuid: this.uuid,
287
287
  charUuid: this.charUuid,
288
288
  value: this.charValueToWrite,
289
289
  },
290
- 'Did not call writeBleCharacteristic as expected!'
290
+ 'Did not call writeBleGattChar as expected!'
291
291
  )
292
292
  }
293
293
 
@@ -318,12 +318,12 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
318
318
  await this.subscribeCharacteristics()
319
319
 
320
320
  assert.isEqualDeep(
321
- FakeLibndx.callsToAddBleCharCallbacks[0],
321
+ FakeLibndx.callsToRegisterBleGattCharCallbacks[0],
322
322
  {
323
323
  deviceUuid: this.uuid,
324
324
  charCallbacks: this.extraCharCallbacks,
325
325
  },
326
- 'Did not call addBleCharCallbacks as expected!'
326
+ 'Did not call registerBleGattCharCallbacks as expected!'
327
327
  )
328
328
  }
329
329
 
@@ -354,7 +354,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
354
354
  await this.connect()
355
355
 
356
356
  const { deviceUuid, intervalMs } =
357
- FakeLibndx.callsToSetBleRssiInterval[0]
357
+ FakeLibndx.callsToStartBleGattRssiPolling[0]
358
358
 
359
359
  assert.isEqualDeep(
360
360
  { deviceUuid, intervalMs },
@@ -362,7 +362,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
362
362
  deviceUuid: this.uuid,
363
363
  intervalMs: this.rssiIntervalMs,
364
364
  },
365
- 'Did not call setBleRssiInterval as expected!'
365
+ 'Did not call startBleGattRssiPolling as expected!'
366
366
  )
367
367
  }
368
368
 
@@ -371,11 +371,11 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
371
371
  await this.disconnect()
372
372
 
373
373
  assert.isEqualDeep(
374
- FakeLibndx.callsToStopBleBackend[0],
374
+ FakeLibndx.callsToStopBleGattBackend[0],
375
375
  {
376
376
  deviceUuid: this.uuid,
377
377
  },
378
- 'Did not call stopBleBackend!'
378
+ 'Did not call stopBleGattBackend!'
379
379
  )
380
380
  }
381
381
 
@@ -446,20 +446,22 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
446
446
  private static async connect() {
447
447
  const promise = this.instance.connect()
448
448
 
449
- const startCall = FakeLibndx.callsToStartBleBackend[0]
449
+ const startCall = FakeLibndx.callsToStartBleGattBackend[0]
450
450
  startCall?.onConnected(this.nativePeripheral)
451
451
 
452
452
  await promise
453
453
  }
454
454
 
455
- private static async connectWithDiscovery(instance: SpyBleController) {
455
+ private static async connectWithDiscovery(instance: SpyBleGatt) {
456
456
  const promise = instance.connect()
457
457
 
458
458
  FakeLibndx.callsToDiscoverBleUuid[0]?.onDiscovered(this.discoveredUuid)
459
459
 
460
- await this.waitForCall(() => FakeLibndx.callsToStartBleBackend[0])
460
+ await this.waitForCall(() => FakeLibndx.callsToStartBleGattBackend[0])
461
461
 
462
- FakeLibndx.callsToStartBleBackend[0]?.onConnected(this.nativePeripheral)
462
+ FakeLibndx.callsToStartBleGattBackend[0]?.onConnected(
463
+ this.nativePeripheral
464
+ )
463
465
 
464
466
  await promise
465
467
  }
@@ -512,20 +514,18 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
512
514
  }
513
515
  }
514
516
 
515
- private static BleDeviceController(
516
- options?: Partial<BleControllerOptions>
517
- ) {
518
- return BleDeviceController.Create({
517
+ private static BleGattController(options?: Partial<BleGattOptions>) {
518
+ return BleGattController.Create({
519
519
  deviceUuid: this.uuid,
520
520
  charCallbacks: this.charCallbacks,
521
521
  onConnected: this.onConnected,
522
522
  rssiIntervalMs: this.rssiIntervalMs,
523
523
  ...options,
524
- }) as SpyBleController
524
+ }) as SpyBleGatt
525
525
  }
526
526
 
527
- private static BleControllerWithPrefix() {
528
- return this.BleDeviceController({
527
+ private static BleGattControllerWithPrefix() {
528
+ return this.BleGattController({
529
529
  deviceNamePrefix: this.namePrefix,
530
530
  deviceUuid: undefined,
531
531
  })
@@ -0,0 +1,72 @@
1
+ import { test, assert } from '@neurodevs/node-tdd'
2
+
3
+ import BleObserverController, {
4
+ BleObserver,
5
+ } from '../../impl/controllers/BleObserverController.js'
6
+ import AbstractPackageTest from '../AbstractPackageTest.js'
7
+ import { FakeLibndx } from '@neurodevs/ndx-native'
8
+
9
+ export default class BleObserverControllerTest extends AbstractPackageTest {
10
+ private static instance: BleObserver
11
+
12
+ protected static async beforeEach() {
13
+ await super.beforeEach()
14
+
15
+ this.instance = this.BleObserverController()
16
+ }
17
+
18
+ @test()
19
+ protected static async createsInstance() {
20
+ assert.isTruthy(this.instance, 'Failed to create instance!')
21
+ }
22
+
23
+ @test()
24
+ protected static async startObservingCreatesBleObserverBackend() {
25
+ await this.startObserving()
26
+
27
+ assert.isEqualDeep(FakeLibndx.callsToCreateBleObserver[0], {
28
+ deviceUuid: this.deviceUuid,
29
+ })
30
+ }
31
+
32
+ @test()
33
+ protected static async startObservingStartsBleObserverBackend() {
34
+ await this.startObserving()
35
+
36
+ const { deviceUuid, onAdvertisement } =
37
+ FakeLibndx.callsToStartBleObserver[0]
38
+
39
+ assert.isEqual(
40
+ deviceUuid,
41
+ this.deviceUuid,
42
+ 'Did not pass deviceUuid to startBleObserverBackend!'
43
+ )
44
+ assert.isFunction(
45
+ onAdvertisement,
46
+ 'Did not pass onAdvertisement to startBleObserverBackend!'
47
+ )
48
+ }
49
+
50
+ @test()
51
+ protected static async stopObservingStopsBleObserverBackend() {
52
+ await this.stopObserving()
53
+
54
+ assert.isEqualDeep(FakeLibndx.callsToStopBleObserver[0], {
55
+ deviceUuid: this.deviceUuid,
56
+ })
57
+ }
58
+
59
+ private static async startObserving() {
60
+ await this.instance.startObserving()
61
+ }
62
+
63
+ private static async stopObserving() {
64
+ await this.instance.stopObserving()
65
+ }
66
+
67
+ private static BleObserverController() {
68
+ return BleObserverController.Create({
69
+ deviceUuid: this.deviceUuid,
70
+ })
71
+ }
72
+ }
@@ -2,26 +2,25 @@ import { randomInt } from 'node:crypto'
2
2
 
3
3
  import { assert, test } from '@neurodevs/node-tdd'
4
4
 
5
- import LslEventMarkerEmitter, {
5
+ import LslEventMarkerOutlet, {
6
6
  EmitOptions,
7
- } from '../../impl/LslEventMarkerEmitter.js'
7
+ } from '../../impl/LslEventMarkerOutlet.js'
8
8
  import { LslOutletOptions } from '../../impl/LslStreamOutlet.js'
9
- import SpyLslEmitter from '../../testDoubles/LslEmitter/SpyLslEmitter.js'
9
+ import SpyEventMarkerOutlet from '../../testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js'
10
10
  import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js'
11
11
  import FakeLslOutlet from '../../testDoubles/LslOutlet/FakeLslOutlet.js'
12
12
  import AbstractPackageTest from '../AbstractPackageTest.js'
13
13
 
14
- export default class EventMarkerEmitterTest extends AbstractPackageTest {
15
- private static instance: SpyLslEmitter
14
+ export default class EventMarkerOutletTest extends AbstractPackageTest {
15
+ private static instance: SpyEventMarkerOutlet
16
16
 
17
17
  protected static async beforeEach() {
18
18
  await super.beforeEach()
19
19
 
20
- this.setFakeLiblsl()
21
20
  this.setFakeLslOutlet()
22
- this.setSpyLslEmitter()
21
+ this.setSpyEventMarkerOutlet()
23
22
 
24
- this.instance = await this.LslEventMarkerEmitter()
23
+ this.instance = await this.LslEventMarkerOutlet()
25
24
  }
26
25
 
27
26
  private static readonly markerName = this.generateId()
@@ -68,7 +67,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
68
67
  @test()
69
68
  protected static async canOverrideDefaultOptions() {
70
69
  const options = generateRandomOutletOptions()
71
- await this.LslEventMarkerEmitter(options)
70
+ await this.LslEventMarkerOutlet(options)
72
71
 
73
72
  assert.isEqualDeep(FakeLslOutlet.callsToConstructor[1], options)
74
73
  }
@@ -86,7 +85,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
86
85
  'Pushed the wrong marker!'
87
86
  )
88
87
 
89
- assert.isEqual(this.instance.totalwaitAfterMs, marker.waitAfterMs)
88
+ assert.isEqual(this.instance.totalWaitAfterMs, marker.waitAfterMs)
90
89
  }
91
90
 
92
91
  @test()
@@ -96,7 +95,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
96
95
  assert.isEqual(FakeLslOutlet.callsToPushSample.length, 2)
97
96
 
98
97
  assert.isEqual(
99
- this.instance.totalwaitAfterMs,
98
+ this.instance.totalWaitAfterMs,
100
99
  markers[0].waitAfterMs + markers[1].waitAfterMs
101
100
  )
102
101
  }
@@ -104,7 +103,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
104
103
  @test('interrupts on first marker', 1)
105
104
  @test('interrupts on second marker', 2)
106
105
  @test('interrupts on third marker', 3)
107
- protected static async emitterIsInterruptable(bailIdx: number) {
106
+ protected static async outletIsInterruptable(bailIdx: number) {
108
107
  let hitCount = 0
109
108
 
110
109
  this.streamOutlet.pushSample = () => {
@@ -170,7 +169,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
170
169
 
171
170
  @test()
172
171
  protected static async emitWaitsForMsIfPassed() {
173
- SpyLslEmitter.shouldCallWaitOnSuper = true
172
+ SpyEventMarkerOutlet.shouldCallWaitOnSuper = true
174
173
 
175
174
  const waitAfterMs = 10
176
175
 
@@ -217,7 +216,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
217
216
 
218
217
  @test()
219
218
  protected static async sourceIdIsUniqueAcrossInstances() {
220
- const instance = await this.LslEventMarkerEmitter()
219
+ const instance = await this.LslEventMarkerOutlet()
221
220
 
222
221
  assert.isNotEqual(
223
222
  instance['outlet'].sourceId,
@@ -237,7 +236,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
237
236
 
238
237
  @test()
239
238
  protected static async emitManyThrowsIfCalledWhileAlreadyRunning() {
240
- void EventMarkerEmitterTest.emitManyOnce()
239
+ void EventMarkerOutletTest.emitManyOnce()
241
240
 
242
241
  await assert.doesThrowAsync(async () => {
243
242
  await this.emitManyFor(5, 1)
@@ -306,13 +305,15 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
306
305
  }
307
306
 
308
307
  private static async setupOutlet() {
309
- LslEventMarkerEmitter.Class = LslEventMarkerEmitter as any
310
- this.instance = await this.LslEventMarkerEmitter()
308
+ LslEventMarkerOutlet.Class = LslEventMarkerOutlet as any
309
+ this.instance = await this.LslEventMarkerOutlet()
311
310
  }
312
311
 
313
- private static async LslEventMarkerEmitter(
312
+ private static async LslEventMarkerOutlet(
314
313
  options?: Partial<LslOutletOptions>
315
314
  ) {
316
- return (await LslEventMarkerEmitter.Create(options)) as SpyLslEmitter
315
+ return (await LslEventMarkerOutlet.Create(
316
+ options
317
+ )) as SpyEventMarkerOutlet
317
318
  }
318
319
  }
@@ -0,0 +1,135 @@
1
+ import { test, assert } from '@neurodevs/node-tdd'
2
+
3
+ import LslJsonOutlet, {
4
+ JsonOutlet,
5
+ JsonOutletOptions,
6
+ } from '../../impl/LslJsonOutlet.js'
7
+ import FakeLslOutlet from '../../testDoubles/LslOutlet/FakeLslOutlet.js'
8
+ import AbstractPackageTest from '../AbstractPackageTest.js'
9
+
10
+ export default class LslJsonOutletTest extends AbstractPackageTest {
11
+ private static instance: JsonOutlet
12
+
13
+ protected static async beforeEach() {
14
+ await super.beforeEach()
15
+
16
+ this.setFakeLslOutlet()
17
+
18
+ LslJsonOutlet.backupIdCounter = 0
19
+
20
+ this.instance = await this.LslJsonOutlet()
21
+ }
22
+
23
+ @test()
24
+ protected static async createsInstance() {
25
+ assert.isTruthy(this.instance, 'Failed to create instance!')
26
+ }
27
+
28
+ @test()
29
+ protected static async loadsWithJsonSpecificOptionsOnce() {
30
+ assert.isEqualDeep(FakeLslOutlet.callsToConstructor[0], {
31
+ name: `JSON (json-1)`,
32
+ type: 'JSON',
33
+ sourceId: 'json-1',
34
+ channelNames: ['JSON'],
35
+ channelFormat: 'string',
36
+ sampleRateHz: 0,
37
+ chunkSize: 1,
38
+ })
39
+ }
40
+
41
+ @test()
42
+ protected static async loadsWithJsonSpecificOptionsTwice() {
43
+ await this.LslJsonOutlet()
44
+
45
+ assert.isEqualDeep(FakeLslOutlet.callsToConstructor[1], {
46
+ name: `JSON (json-2)`,
47
+ type: 'JSON',
48
+ sourceId: 'json-2',
49
+ channelNames: ['JSON'],
50
+ channelFormat: 'string',
51
+ sampleRateHz: 0,
52
+ chunkSize: 1,
53
+ })
54
+ }
55
+
56
+ @test()
57
+ protected static async canOverrideDefaultOptions() {
58
+ const channelName = this.generateId()
59
+
60
+ await this.LslJsonOutlet({
61
+ name: this.name_,
62
+ type: this.type,
63
+ sourceId: this.sourceId,
64
+ channelName,
65
+ sampleRateHz: this.sampleRateHz,
66
+ chunkSize: this.chunkSize,
67
+ })
68
+
69
+ assert.isEqualDeep(FakeLslOutlet.callsToConstructor[1], {
70
+ name: this.name_,
71
+ type: this.type,
72
+ sourceId: this.sourceId,
73
+ channelNames: [channelName],
74
+ channelFormat: 'string',
75
+ sampleRateHz: this.sampleRateHz,
76
+ chunkSize: this.chunkSize,
77
+ })
78
+ }
79
+
80
+ @test()
81
+ protected static async pushJsonSerializesAndPushesToLslOutlet() {
82
+ const data = { [this.generateId()]: this.generateId() }
83
+
84
+ this.instance.pushJson(data)
85
+
86
+ assert.isEqualDeep(FakeLslOutlet.callsToPushSample[0]?.sample, [
87
+ JSON.stringify(data),
88
+ ])
89
+ }
90
+
91
+ @test()
92
+ protected static async destroyCallsDestroyOnLslOutlet() {
93
+ this.instance.destroy()
94
+
95
+ assert.isEqual(
96
+ FakeLslOutlet.numCallsToDestroy,
97
+ 1,
98
+ 'Did not call destroy on outlet!'
99
+ )
100
+ }
101
+
102
+ @test()
103
+ protected static async pushJsonThrowsIfPayloadExceedsMaxBytesPerSample() {
104
+ const maxBytesPerSample = 10
105
+
106
+ const instance = await this.LslJsonOutlet({ maxBytesPerSample })
107
+ const data = { [this.generateId()]: this.generateId() }
108
+
109
+ assert.doesThrow(
110
+ () => instance.pushJson(data),
111
+ `Payload of ${JSON.stringify(data).length} bytes exceeds maxBytesPerSample of ${maxBytesPerSample}!`
112
+ )
113
+ }
114
+
115
+ @test()
116
+ protected static async countsUtf8BytesNotCharacters() {
117
+ const data = { emoji: '😀😀😀' }
118
+
119
+ const json = JSON.stringify(data)
120
+ const totalBytes = Buffer.byteLength(json)
121
+
122
+ const maxBytesPerSample = json.length
123
+
124
+ const instance = await this.LslJsonOutlet({ maxBytesPerSample })
125
+
126
+ assert.doesThrow(
127
+ () => instance.pushJson(data),
128
+ `Payload of ${totalBytes} bytes exceeds maxBytesPerSample of ${maxBytesPerSample}!`
129
+ )
130
+ }
131
+
132
+ private static LslJsonOutlet(options?: JsonOutletOptions) {
133
+ return LslJsonOutlet.Create(options)
134
+ }
135
+ }
@@ -11,7 +11,6 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
11
11
  protected static async beforeEach() {
12
12
  await super.beforeEach()
13
13
 
14
- this.setFakeLiblsl()
15
14
  this.setSpyLslInfo()
16
15
 
17
16
  this.instance = this.LslStreamInfo()
@@ -53,7 +53,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
53
53
  protected static async beforeEach() {
54
54
  await super.beforeEach()
55
55
 
56
- this.setFakeLiblsl()
57
56
  this.setFakeLslInfo()
58
57
  this.setSpyLslInlet()
59
58
 
@@ -28,7 +28,6 @@ export default class LslStreamOutletTest extends AbstractPackageTest {
28
28
 
29
29
  this.randomOutletOptions = generateRandomOutletOptions()
30
30
 
31
- this.setFakeLiblsl()
32
31
  this.setFakeLslInfo()
33
32
 
34
33
  LslStreamOutlet.lsl = this.fakeLiblsl
@@ -18,7 +18,6 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
18
18
  protected static async beforeEach() {
19
19
  await super.beforeEach()
20
20
 
21
- this.setFakeLiblsl()
22
21
  this.setFakeLslInlet()
23
22
  this.setFakeWebSocket()
24
23
  this.setFakeWebSocketServer()
@@ -1,13 +1,13 @@
1
1
  import { test, assert } from '@neurodevs/node-tdd'
2
2
 
3
3
  import UsbDeviceController, {
4
- UsbController,
4
+ UsbDevice,
5
5
  } from '../../impl/controllers/UsbDeviceController.js'
6
6
  import AbstractPackageTest from '../AbstractPackageTest.js'
7
7
  import { FakeLibndx } from '@neurodevs/ndx-native'
8
8
 
9
9
  export default class UsbDeviceControllerTest extends AbstractPackageTest {
10
- private static instance: UsbController
10
+ private static instance: UsbDevice
11
11
 
12
12
  private static readonly serialNumber = this.generateId()
13
13
  private static readonly valueToWrite = this.generateId()
@@ -5,8 +5,8 @@ import LslStreamOutlet, {
5
5
  LslOutlet,
6
6
  } from './LslStreamOutlet.js'
7
7
 
8
- export default class LslEventMarkerEmitter implements LslEmitter {
9
- public static Class?: LslEmitterConstructor
8
+ export default class LslEventMarkerOutlet implements EventMarkerOutlet {
9
+ public static Class?: EventMarkerOutletConstructor
10
10
 
11
11
  protected outlet: LslOutlet
12
12
  private isRunning = false
@@ -17,7 +17,7 @@ export default class LslEventMarkerEmitter implements LslEmitter {
17
17
  this.outlet = outlet
18
18
  }
19
19
 
20
- public static async Create(options?: LslEmitterOptions) {
20
+ public static async Create(options?: EventMarkerOutletOptions) {
21
21
  const outlet = await this.LslStreamOutlet(options)
22
22
  return new (this.Class ?? this)(outlet)
23
23
  }
@@ -110,16 +110,18 @@ export default class LslEventMarkerEmitter implements LslEmitter {
110
110
  }
111
111
  }
112
112
 
113
- export interface LslEmitter {
113
+ export interface EventMarkerOutlet {
114
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 LslEmitterOptions = Partial<LslOutletOptions>
120
+ export type EventMarkerOutletOptions = Partial<LslOutletOptions>
121
121
 
122
- export type LslEmitterConstructor = new (outlet: LslOutlet) => LslEmitter
122
+ export type EventMarkerOutletConstructor = new (
123
+ outlet: LslOutlet
124
+ ) => EventMarkerOutlet
123
125
 
124
126
  export interface EmitOptions {
125
127
  waitAfterMs?: number