@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,3 +1,6 @@
1
+ import { randomInt } from 'node:crypto'
2
+
3
+ import WebSocket, { Server } from 'ws'
1
4
  import {
2
5
  FakeLiblsl,
3
6
  FakeLibndx,
@@ -6,25 +9,23 @@ import {
6
9
  LibndxAdapter,
7
10
  } from '@neurodevs/ndx-native'
8
11
  import AbstractModuleTest from '@neurodevs/node-tdd'
9
- import WebSocket, { Server } from 'ws'
10
12
 
11
- import SpyEventMarkerEmitter from '../testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js'
12
- import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo.js'
13
- import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo.js'
14
- import FakeStreamInlet from '../testDoubles/StreamInlet/FakeStreamInlet.js'
15
- import { SpyStreamInlet } from '../testDoubles/StreamInlet/SpyStreamInlet.js'
16
- import FakeStreamOutlet from '../testDoubles/StreamOutlet/FakeStreamOutlet.js'
17
- import SpyLslWebSocketBridge from '../testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js'
13
+ import SpyLslEmitter from '../testDoubles/LslEmitter/SpyLslEmitter.js'
14
+ import FakeLslInfo from '../testDoubles/LslInfo/FakeLslInfo.js'
15
+ import SpyLslInfo from '../testDoubles/LslInfo/SpyLslInfo.js'
16
+ import FakeLslInlet from '../testDoubles/LslInlet/FakeLslInlet.js'
17
+ import SpyLslInlet from '../testDoubles/LslInlet/SpyLslInlet.js'
18
+ import FakeLslOutlet from '../testDoubles/LslOutlet/FakeLslOutlet.js'
19
+ import SpyLslWsBridge from '../testDoubles/LslWsBridge/SpyLslWsBridge.js'
18
20
  import FakeWebSocket from '../testDoubles/WebSockets/FakeWebSocket.js'
19
21
  import FakeWebSocketServer from '../testDoubles/WebSockets/FakeWebSocketServer.js'
20
-
21
22
  import LslWebSocketBridge from '../impl/LslWebSocketBridge.js'
22
23
  import BleDeviceController from '../impl/controllers/BleDeviceController.js'
23
24
  import LslEventMarkerEmitter from '../impl/LslEventMarkerEmitter.js'
24
25
  import LslStreamInfo from '../impl/LslStreamInfo.js'
25
26
  import LslStreamInlet, {
26
27
  OnDataCallback,
27
- StreamInletOptions,
28
+ LslInletOptions,
28
29
  } from '../impl/LslStreamInlet.js'
29
30
  import LslStreamOutlet from '../impl/LslStreamOutlet.js'
30
31
 
@@ -32,8 +33,31 @@ export default class AbstractPackageTest extends AbstractModuleTest {
32
33
  protected static fakeLiblsl: FakeLiblsl
33
34
  protected static fakeLibndx: FakeLibndx
34
35
 
36
+ protected static readonly fakeLslInfo = new FakeLslInfo()
37
+
38
+ protected static readonly name_ = this.generateId()
39
+ protected static readonly type = this.generateId()
40
+ protected static readonly sourceId = this.generateId()
41
+ protected static readonly units = this.generateId()
42
+
43
+ protected static readonly channelNames = [
44
+ this.generateId(),
45
+ this.generateId(),
46
+ this.generateId(),
47
+ ]
48
+
49
+ protected static readonly channelCount = this.channelNames.length
50
+
51
+ protected static readonly chunkSize = randomInt(2, 100)
52
+ protected static readonly sampleRateHz = Math.floor(Math.random() * 100)
53
+ protected static readonly maxBufferedMs = Math.floor(Math.random() * 1000)
54
+
35
55
  protected static async beforeEach() {
36
56
  await super.beforeEach()
57
+
58
+ this.setImmediateTimeouts()
59
+
60
+ this.setFakeLibndx()
37
61
  }
38
62
 
39
63
  protected static setFakeLiblsl() {
@@ -44,6 +68,30 @@ export default class AbstractPackageTest extends AbstractModuleTest {
44
68
  FakeLiblsl.fakeInfoHandles = [{} as InfoHandle]
45
69
  }
46
70
 
71
+ protected static callsToSetTimeout: number[] = []
72
+
73
+ protected static setImmediateTimeouts() {
74
+ this.callsToSetTimeout = []
75
+
76
+ BleDeviceController.setTimeout = ((
77
+ callback: (...args: unknown[]) => void,
78
+ delayMs?: number,
79
+ ...args: unknown[]
80
+ ) => {
81
+ this.callsToSetTimeout.push(delayMs ?? 0)
82
+ return setTimeout(callback, 0, ...args)
83
+ }) as unknown as typeof setTimeout
84
+
85
+ LslStreamOutlet.setTimeout = ((
86
+ callback: (...args: unknown[]) => void,
87
+ delayMs?: number,
88
+ ...args: unknown[]
89
+ ) => {
90
+ this.callsToSetTimeout.push(delayMs ?? 0)
91
+ return setTimeout(callback, 0, ...args)
92
+ }) as unknown as typeof setTimeout
93
+ }
94
+
47
95
  protected static setFakeLibndx() {
48
96
  this.fakeLibndx = new FakeLibndx()
49
97
  LibndxAdapter.setInstance(this.fakeLibndx)
@@ -54,36 +102,36 @@ export default class AbstractPackageTest extends AbstractModuleTest {
54
102
  BleDeviceController.ndx = this.fakeLibndx
55
103
  }
56
104
 
57
- protected static setSpyStreamInfo() {
58
- LslStreamInfo.Class = SpyStreamInfo
59
- SpyStreamInfo.resetTestDouble()
105
+ protected static setSpyLslInfo() {
106
+ LslStreamInfo.Class = SpyLslInfo
107
+ SpyLslInfo.resetTestDouble()
60
108
  }
61
109
 
62
- protected static setFakeStreamInfo() {
63
- LslStreamInfo.Class = FakeStreamInfo
64
- FakeStreamInfo.resetTestDouble()
110
+ protected static setFakeLslInfo() {
111
+ LslStreamInfo.Class = FakeLslInfo
112
+ FakeLslInfo.resetTestDouble()
65
113
  }
66
114
 
67
- protected static setSpyStreamInlet() {
68
- LslStreamInlet.Class = SpyStreamInlet
115
+ protected static setSpyLslInlet() {
116
+ LslStreamInlet.Class = SpyLslInlet
69
117
  }
70
118
 
71
- protected static setFakeStreamInlet() {
72
- LslStreamInlet.Class = FakeStreamInlet
73
- FakeStreamInlet.resetTestDouble()
119
+ protected static setFakeLslInlet() {
120
+ LslStreamInlet.Class = FakeLslInlet
121
+ FakeLslInlet.resetTestDouble()
74
122
  }
75
123
 
76
- protected static setFakeStreamOutlet() {
77
- LslStreamOutlet.Class = FakeStreamOutlet
78
- FakeStreamOutlet.resetTestDouble()
124
+ protected static setFakeLslOutlet() {
125
+ LslStreamOutlet.Class = FakeLslOutlet
126
+ FakeLslOutlet.resetTestDouble()
79
127
  }
80
128
 
81
- protected static setSpyEventMarkerEmitter() {
82
- LslEventMarkerEmitter.Class = SpyEventMarkerEmitter
129
+ protected static setSpyLslEmitter() {
130
+ LslEventMarkerEmitter.Class = SpyLslEmitter
83
131
  }
84
132
 
85
- protected static setSpyLslWebSocketBridge() {
86
- LslWebSocketBridge.Class = SpyLslWebSocketBridge
133
+ protected static setSpyLslWsBridge() {
134
+ LslWebSocketBridge.Class = SpyLslWsBridge
87
135
  }
88
136
 
89
137
  protected static setFakeWebSocket() {
@@ -96,30 +144,11 @@ export default class AbstractPackageTest extends AbstractModuleTest {
96
144
  FakeWebSocketServer.resetTestDouble()
97
145
  }
98
146
 
99
- protected static readonly fakeStreamInfo = new FakeStreamInfo()
100
-
101
- protected static readonly name_ = this.generateId()
102
- protected static readonly type = this.generateId()
103
- protected static readonly sourceId = this.generateId()
104
- protected static readonly units = this.generateId()
105
-
106
- protected static readonly channelNames = [
107
- this.generateId(),
108
- this.generateId(),
109
- this.generateId(),
110
- ]
111
-
112
- protected static readonly channelCount = this.channelNames.length
113
-
114
- protected static readonly chunkSize = 2
115
- protected static readonly sampleRateHz = Math.floor(Math.random() * 100)
116
- protected static readonly maxBufferedMs = Math.floor(Math.random() * 1000)
117
-
118
147
  protected static async LslStreamInlet(
119
- options: Partial<StreamInletOptions>,
148
+ options: Partial<LslInletOptions>,
120
149
  onData: OnDataCallback
121
150
  ) {
122
- const defaultOptions: StreamInletOptions = {
151
+ const defaultOptions: LslInletOptions = {
123
152
  sourceId: this.sourceId,
124
153
  chunkSize: this.chunkSize,
125
154
  maxBufferedMs: this.maxBufferedMs,
@@ -35,6 +35,14 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
35
35
  },
36
36
  ]
37
37
 
38
+ private static readonly extraCharCallbacks = [
39
+ {
40
+ charUuid: this.generateId(),
41
+ charName: this.generateId(),
42
+ onData: async () => {},
43
+ },
44
+ ]
45
+
38
46
  private static onConnected = (_peripheral: NativePeripheral) => {
39
47
  this.wasConnected = true
40
48
  }
@@ -58,13 +66,11 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
58
66
  await super.beforeEach()
59
67
 
60
68
  BleDeviceController.waitAfterMs = 0
61
-
62
- this.setFakeLibndx()
63
69
  BleDeviceController.Class = SpyBleController
64
70
 
65
71
  this.wasConnected = false
66
72
 
67
- this.instance = await this.BleController()
73
+ this.instance = this.BleDeviceController()
68
74
  }
69
75
 
70
76
  @test()
@@ -262,13 +268,10 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
262
268
  const waitAfterMs = 20
263
269
  BleDeviceController.waitAfterMs = waitAfterMs
264
270
 
265
- const t0 = Date.now()
266
271
  await this.connect()
267
- const t1 = Date.now()
268
272
 
269
- assert.isAbove(
270
- t1 - t0,
271
- 100 + waitAfterMs * 0.8,
273
+ assert.isTruthy(
274
+ this.callsToSetTimeout.includes(waitAfterMs),
272
275
  'Did not wait after on connected!'
273
276
  )
274
277
  }
@@ -310,6 +313,42 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
310
313
  )
311
314
  }
312
315
 
316
+ @test()
317
+ protected static async subscribeCharacteristicsCallsLibndxBinding() {
318
+ await this.subscribeCharacteristics()
319
+
320
+ assert.isEqualDeep(
321
+ FakeLibndx.callsToAddBleCharCallbacks[0],
322
+ {
323
+ deviceUuid: this.uuid,
324
+ charCallbacks: this.extraCharCallbacks,
325
+ },
326
+ 'Did not call addBleCharCallbacks as expected!'
327
+ )
328
+ }
329
+
330
+ @test()
331
+ protected static async subscribeCharacteristicsMergesIntoCharCallbacks() {
332
+ await this.subscribeCharacteristics()
333
+
334
+ assert.isEqualDeep(
335
+ this.instance.getCharacteristicCallbacks(),
336
+ [...this.charCallbacks, ...this.extraCharCallbacks],
337
+ 'Did not merge the newly subscribed callbacks into charCallbacks!'
338
+ )
339
+ }
340
+
341
+ @test()
342
+ protected static async subscribeCharacteristicsThrowsOn400() {
343
+ this.setFake400Error()
344
+
345
+ await assert.doesThrowAsync(
346
+ async () => await this.subscribeCharacteristics(),
347
+ this.fake400Error,
348
+ 'Did not throw error!'
349
+ )
350
+ }
351
+
313
352
  @test()
314
353
  protected static async callsSetBleRssiInterval() {
315
354
  await this.connect()
@@ -431,7 +470,7 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
431
470
  if (getCall()) {
432
471
  resolve()
433
472
  } else {
434
- setTimeout(check, 10)
473
+ setTimeout(check, 0)
435
474
  }
436
475
  }
437
476
  check()
@@ -445,6 +484,10 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
445
484
  )
446
485
  }
447
486
 
487
+ private static async subscribeCharacteristics() {
488
+ await this.instance.subscribeCharacteristics(this.extraCharCallbacks)
489
+ }
490
+
448
491
  private static async disconnect() {
449
492
  await this.instance.disconnect()
450
493
  }
@@ -469,24 +512,22 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
469
512
  }
470
513
  }
471
514
 
472
- private static async BleController(
515
+ private static BleDeviceController(
473
516
  options?: Partial<BleControllerOptions>
474
517
  ) {
475
- return (await BleDeviceController.Create({
518
+ return BleDeviceController.Create({
476
519
  deviceUuid: this.uuid,
477
520
  charCallbacks: this.charCallbacks,
478
521
  onConnected: this.onConnected,
479
522
  rssiIntervalMs: this.rssiIntervalMs,
480
523
  ...options,
481
- })) as SpyBleController
524
+ }) as SpyBleController
482
525
  }
483
526
 
484
- private static async BleControllerWithPrefix() {
485
- return (await BleDeviceController.Create({
527
+ private static BleControllerWithPrefix() {
528
+ return this.BleDeviceController({
486
529
  deviceNamePrefix: this.namePrefix,
487
- charCallbacks: this.charCallbacks,
488
- onConnected: this.onConnected,
489
- rssiIntervalMs: this.rssiIntervalMs,
490
- } as unknown as BleControllerOptions)) as SpyBleController
530
+ deviceUuid: undefined,
531
+ })
491
532
  }
492
533
  }
@@ -3,23 +3,23 @@ import { randomInt } from 'node:crypto'
3
3
  import { assert, test } from '@neurodevs/node-tdd'
4
4
 
5
5
  import LslEventMarkerEmitter, {
6
- EventMarkerOptions,
6
+ EmitOptions,
7
7
  } from '../../impl/LslEventMarkerEmitter.js'
8
- import { StreamOutletOptions } from '../../impl/LslStreamOutlet.js'
9
- import SpyEventMarkerEmitter from '../../testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js'
8
+ import { LslOutletOptions } from '../../impl/LslStreamOutlet.js'
9
+ import SpyLslEmitter from '../../testDoubles/LslEmitter/SpyLslEmitter.js'
10
10
  import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js'
11
- import FakeStreamOutlet from '../../testDoubles/StreamOutlet/FakeStreamOutlet.js'
11
+ import FakeLslOutlet from '../../testDoubles/LslOutlet/FakeLslOutlet.js'
12
12
  import AbstractPackageTest from '../AbstractPackageTest.js'
13
13
 
14
14
  export default class EventMarkerEmitterTest extends AbstractPackageTest {
15
- private static instance: SpyEventMarkerEmitter
15
+ private static instance: SpyLslEmitter
16
16
 
17
17
  protected static async beforeEach() {
18
18
  await super.beforeEach()
19
19
 
20
20
  this.setFakeLiblsl()
21
- this.setFakeStreamOutlet()
22
- this.setSpyEventMarkerEmitter()
21
+ this.setFakeLslOutlet()
22
+ this.setSpyLslEmitter()
23
23
 
24
24
  this.instance = await this.LslEventMarkerEmitter()
25
25
  }
@@ -35,7 +35,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
35
35
  protected static async loadsWithEventMarkerSpecificOptions() {
36
36
  assert.isEqualDeep(
37
37
  {
38
- ...FakeStreamOutlet.callsToConstructor[0],
38
+ ...FakeLslOutlet.callsToConstructor[0],
39
39
  name: undefined,
40
40
  sourceId: undefined,
41
41
  },
@@ -51,14 +51,14 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
51
51
  )
52
52
 
53
53
  assert.isTrue(
54
- FakeStreamOutlet.callsToConstructor[0]?.sourceId.startsWith(
54
+ FakeLslOutlet.callsToConstructor[0]?.sourceId.startsWith(
55
55
  'event-markers-'
56
56
  ),
57
57
  'Source ID was not generated uniquely!'
58
58
  )
59
59
 
60
60
  assert.isTrue(
61
- FakeStreamOutlet.callsToConstructor[0]?.name.startsWith(
61
+ FakeLslOutlet.callsToConstructor[0]?.name.startsWith(
62
62
  'Event markers ('
63
63
  ),
64
64
  'Name was not generated uniquely!'
@@ -70,7 +70,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
70
70
  const options = generateRandomOutletOptions()
71
71
  await this.LslEventMarkerEmitter(options)
72
72
 
73
- assert.isEqualDeep(FakeStreamOutlet.callsToConstructor[1], options)
73
+ assert.isEqualDeep(FakeLslOutlet.callsToConstructor[1], options)
74
74
  }
75
75
 
76
76
  @test()
@@ -81,7 +81,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
81
81
  const marker = markers[0]
82
82
 
83
83
  assert.isEqual(
84
- FakeStreamOutlet.callsToPushSample[0]?.sample[0],
84
+ FakeLslOutlet.callsToPushSample[0]?.sample[0],
85
85
  marker.name,
86
86
  'Pushed the wrong marker!'
87
87
  )
@@ -93,7 +93,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
93
93
  protected static async emittingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
94
94
  const markers = await this.emitManyFor(2)
95
95
 
96
- assert.isEqual(FakeStreamOutlet.callsToPushSample.length, 2)
96
+ assert.isEqual(FakeLslOutlet.callsToPushSample.length, 2)
97
97
 
98
98
  assert.isEqual(
99
99
  this.instance.totalwaitAfterMs,
@@ -162,7 +162,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
162
162
  await this.emit(markerName)
163
163
 
164
164
  assert.isEqualDeep(
165
- FakeStreamOutlet.callsToPushSample[0]?.sample,
165
+ FakeLslOutlet.callsToPushSample[0]?.sample,
166
166
  [markerName],
167
167
  'Pushed the wrong sample!'
168
168
  )
@@ -170,7 +170,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
170
170
 
171
171
  @test()
172
172
  protected static async emitWaitsForMsIfPassed() {
173
- SpyEventMarkerEmitter.shouldCallWaitOnSuper = true
173
+ SpyLslEmitter.shouldCallWaitOnSuper = true
174
174
 
175
175
  const waitAfterMs = 10
176
176
 
@@ -190,7 +190,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
190
190
  this.destroy()
191
191
 
192
192
  assert.isEqual(
193
- FakeStreamOutlet.numCallsToDestroy,
193
+ FakeLslOutlet.numCallsToDestroy,
194
194
  1,
195
195
  'Did not call destroy on outlet!'
196
196
  )
@@ -268,10 +268,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
268
268
  await this.emit(this.markerName)
269
269
  }
270
270
 
271
- private static async emit(
272
- markerName: string,
273
- options?: EventMarkerOptions
274
- ) {
271
+ private static async emit(markerName: string, options?: EmitOptions) {
275
272
  return this.instance.emit(markerName, options)
276
273
  }
277
274
 
@@ -314,10 +311,8 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
314
311
  }
315
312
 
316
313
  private static async LslEventMarkerEmitter(
317
- options?: Partial<StreamOutletOptions>
314
+ options?: Partial<LslOutletOptions>
318
315
  ) {
319
- return (await LslEventMarkerEmitter.Create(
320
- options
321
- )) as SpyEventMarkerEmitter
316
+ return (await LslEventMarkerEmitter.Create(options)) as SpyLslEmitter
322
317
  }
323
318
  }
@@ -1,18 +1,18 @@
1
1
  import { test, assert } from '@neurodevs/node-tdd'
2
2
 
3
- import { CHANNEL_FORMATS } from '../../consts.js'
4
- import LslStreamInfo, { StreamInfoOptions } from '../../impl/LslStreamInfo.js'
5
- import SpyStreamInfo from '../../testDoubles/StreamInfo/SpyStreamInfo.js'
3
+ import LslStreamInfo, { LslInfoOptions } from '../../impl/LslStreamInfo.js'
4
+ import SpyLslInfo from '../../testDoubles/LslInfo/SpyLslInfo.js'
6
5
  import AbstractPackageTest from '../AbstractPackageTest.js'
6
+ import { CHANNEL_FORMATS } from '@neurodevs/ndx-native'
7
7
 
8
8
  export default class LslStreamInfoTest extends AbstractPackageTest {
9
- private static instance: SpyStreamInfo
9
+ private static instance: SpyLslInfo
10
10
 
11
11
  protected static async beforeEach() {
12
12
  await super.beforeEach()
13
13
 
14
14
  this.setFakeLiblsl()
15
- this.setSpyStreamInfo()
15
+ this.setSpyLslInfo()
16
16
 
17
17
  this.instance = this.LslStreamInfo()
18
18
  }
@@ -225,12 +225,12 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
225
225
  channelNames: this.channelNames,
226
226
  channelFormat: 'float32',
227
227
  sampleRateHz: 100 * Math.random(),
228
- } as StreamInfoOptions
228
+ } as LslInfoOptions
229
229
 
230
- private static LslStreamInfo(options?: Partial<StreamInfoOptions>) {
230
+ private static LslStreamInfo(options?: Partial<LslInfoOptions>) {
231
231
  return LslStreamInfo.Create({
232
232
  ...this.defaultOptions,
233
233
  ...options,
234
- }) as SpyStreamInfo
234
+ }) as SpyLslInfo
235
235
  }
236
236
  }