@neurodevs/node-lsl 17.1.1 → 18.1.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 (198) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.vscode/launch.json +54 -57
  3. package/.vscode/settings.json +61 -66
  4. package/.vscode/tasks.json +98 -129
  5. package/README.md +20 -44
  6. package/build/__tests__/AbstractPackageTest.d.ts +7 -5
  7. package/build/__tests__/AbstractPackageTest.js +22 -15
  8. package/build/__tests__/AbstractPackageTest.js.map +1 -1
  9. package/build/__tests__/impl/BleDeviceController.test.d.ts +54 -0
  10. package/build/__tests__/impl/BleDeviceController.test.js +333 -0
  11. package/build/__tests__/impl/BleDeviceController.test.js.map +1 -0
  12. package/build/__tests__/impl/LslEventMarkerEmitter.test.d.ts +34 -0
  13. package/build/__tests__/impl/LslEventMarkerEmitter.test.js +243 -0
  14. package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -0
  15. package/build/__tests__/impl/LslStreamInfo.test.d.ts +0 -3
  16. package/build/__tests__/impl/LslStreamInfo.test.js +2 -27
  17. package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
  18. package/build/__tests__/impl/LslStreamInlet.test.d.ts +20 -8
  19. package/build/__tests__/impl/LslStreamInlet.test.js +224 -69
  20. package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
  21. package/build/__tests__/impl/LslStreamOutlet.test.d.ts +3 -7
  22. package/build/__tests__/impl/LslStreamOutlet.test.js +40 -50
  23. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
  24. package/build/__tests__/impl/LslWebSocketBridge.test.js +19 -20
  25. package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
  26. package/build/assertions.d.ts +1 -1
  27. package/build/assertions.js.map +1 -1
  28. package/build/impl/LslEventMarkerEmitter.d.ts +35 -0
  29. package/build/impl/LslEventMarkerEmitter.js +86 -0
  30. package/build/impl/LslEventMarkerEmitter.js.map +1 -0
  31. package/build/impl/LslStreamInfo.d.ts +4 -8
  32. package/build/impl/LslStreamInfo.js +8 -21
  33. package/build/impl/LslStreamInfo.js.map +1 -1
  34. package/build/impl/LslStreamInlet.d.ts +31 -50
  35. package/build/impl/LslStreamInlet.js +79 -149
  36. package/build/impl/LslStreamInlet.js.map +1 -1
  37. package/build/impl/LslStreamOutlet.d.ts +15 -18
  38. package/build/impl/LslStreamOutlet.js +39 -47
  39. package/build/impl/LslStreamOutlet.js.map +1 -1
  40. package/build/impl/LslWebSocketBridge.d.ts +4 -5
  41. package/build/impl/LslWebSocketBridge.js +10 -10
  42. package/build/impl/LslWebSocketBridge.js.map +1 -1
  43. package/build/impl/controllers/BleDeviceController.d.ts +58 -0
  44. package/build/impl/controllers/BleDeviceController.js +145 -0
  45. package/build/impl/controllers/BleDeviceController.js.map +1 -0
  46. package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +22 -0
  47. package/build/impl/workers/inlet/LslStreamInlet.worker.js +42 -0
  48. package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +1 -0
  49. package/build/impl/workers/inlet/StreamInletWorker.d.ts +73 -0
  50. package/build/impl/workers/inlet/StreamInletWorker.js +253 -0
  51. package/build/impl/workers/inlet/StreamInletWorker.js.map +1 -0
  52. package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +32 -0
  53. package/build/impl/workers/outlet/LslStreamOutlet.worker.js +82 -0
  54. package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +1 -0
  55. package/build/index.d.ts +14 -14
  56. package/build/index.js +16 -16
  57. package/build/index.js.map +1 -1
  58. package/build/scripts/discoverMuse.js +40 -0
  59. package/build/scripts/discoverMuse.js.map +1 -0
  60. package/build/scripts/finalizeHandles.d.ts +2 -0
  61. package/build/scripts/finalizeHandles.js +48 -0
  62. package/build/scripts/finalizeHandles.js.map +1 -0
  63. package/build/scripts/runLslEventMarkerEmitter.d.ts +1 -0
  64. package/build/scripts/runLslEventMarkerEmitter.js +11 -0
  65. package/build/scripts/runLslEventMarkerEmitter.js.map +1 -0
  66. package/build/scripts/runMuse.d.ts +1 -0
  67. package/build/scripts/runMuse.js +40 -0
  68. package/build/scripts/runMuse.js.map +1 -0
  69. package/build/scripts/runOutletToInlet.js +7 -6
  70. package/build/scripts/runOutletToInlet.js.map +1 -1
  71. package/build/scripts/testDestroyOutlet.d.ts +1 -0
  72. package/build/scripts/testDestroyOutlet.js +4 -0
  73. package/build/scripts/testDestroyOutlet.js.map +1 -0
  74. package/build/testDoubles/BleController/FakeBleController.d.ts +24 -0
  75. package/build/testDoubles/BleController/FakeBleController.js +42 -0
  76. package/build/testDoubles/BleController/FakeBleController.js.map +1 -0
  77. package/build/testDoubles/BleController/SpyBleController.d.ts +14 -0
  78. package/build/testDoubles/BleController/SpyBleController.js +48 -0
  79. package/build/testDoubles/BleController/SpyBleController.js.map +1 -0
  80. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.d.ts +17 -0
  81. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js +30 -0
  82. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +1 -0
  83. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.d.ts +10 -0
  84. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js +23 -0
  85. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +1 -0
  86. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +9 -0
  87. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js +19 -0
  88. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +1 -0
  89. package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +3 -3
  90. package/build/testDoubles/StreamInfo/FakeStreamInfo.js +3 -3
  91. package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -1
  92. package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +8 -10
  93. package/build/testDoubles/StreamInlet/FakeStreamInlet.js +6 -7
  94. package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -1
  95. package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +2 -5
  96. package/build/testDoubles/StreamInlet/SpyStreamInlet.js +2 -8
  97. package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -1
  98. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +7 -9
  99. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +8 -8
  100. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
  101. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +1 -1
  102. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js +1 -1
  103. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +1 -1
  104. package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +27 -0
  105. package/build/testDoubles/WorkerThreads/FakeWorker.js +67 -0
  106. package/build/testDoubles/WorkerThreads/FakeWorker.js.map +1 -0
  107. package/build/testDoubles/generateRandomOutletOptions.js +1 -1
  108. package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
  109. package/build/validations.js +0 -2
  110. package/build/validations.js.map +1 -1
  111. package/eslint.config.js +3 -0
  112. package/package.json +27 -49
  113. package/prettier.config.js +3 -0
  114. package/src/__tests__/AbstractPackageTest.ts +38 -21
  115. package/src/__tests__/impl/BleDeviceController.test.ts +492 -0
  116. package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +323 -0
  117. package/src/__tests__/impl/LslStreamInfo.test.ts +3 -40
  118. package/src/__tests__/impl/LslStreamInlet.test.ts +344 -97
  119. package/src/__tests__/impl/LslStreamOutlet.test.ts +65 -73
  120. package/src/__tests__/impl/LslWebSocketBridge.test.ts +22 -21
  121. package/src/assertions.ts +2 -1
  122. package/src/impl/LslEventMarkerEmitter.ts +133 -0
  123. package/src/impl/LslStreamInfo.ts +17 -29
  124. package/src/impl/LslStreamInlet.ts +102 -215
  125. package/src/impl/LslStreamOutlet.ts +54 -78
  126. package/src/impl/LslWebSocketBridge.ts +14 -14
  127. package/src/impl/controllers/BleDeviceController.ts +223 -0
  128. package/src/impl/workers/inlet/LslStreamInlet.worker.ts +74 -0
  129. package/src/impl/workers/inlet/StreamInletWorker.ts +348 -0
  130. package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +144 -0
  131. package/src/index.ts +16 -16
  132. package/src/scripts/discoverMuse.ts +50 -0
  133. package/src/scripts/finalizeHandles.ts +63 -0
  134. package/src/scripts/runLslEventMarkerEmitter.ts +15 -0
  135. package/src/scripts/runMuse.ts +50 -0
  136. package/src/scripts/runOutletToInlet.ts +10 -8
  137. package/src/scripts/testDestroyOutlet.ts +5 -0
  138. package/src/testDoubles/BleController/FakeBleController.ts +70 -0
  139. package/src/testDoubles/BleController/SpyBleController.ts +61 -0
  140. package/src/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.ts +46 -0
  141. package/src/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.ts +31 -0
  142. package/src/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.ts +29 -0
  143. package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +4 -4
  144. package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +11 -17
  145. package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +3 -16
  146. package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +15 -15
  147. package/src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts +1 -1
  148. package/src/testDoubles/WorkerThreads/FakeWorker.ts +99 -0
  149. package/src/testDoubles/generateRandomOutletOptions.ts +2 -1
  150. package/src/validations.ts +0 -2
  151. package/tsconfig.json +23 -27
  152. package/build/.spruce/settings.json +0 -11
  153. package/build/__tests__/impl/LiblslAdapter.test.d.ts +0 -79
  154. package/build/__tests__/impl/LiblslAdapter.test.js +0 -688
  155. package/build/__tests__/impl/LiblslAdapter.test.js.map +0 -1
  156. package/build/__tests__/impl/LslEventMarkerOutlet.test.d.ts +0 -21
  157. package/build/__tests__/impl/LslEventMarkerOutlet.test.js +0 -160
  158. package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +0 -1
  159. package/build/handleError.d.ts +0 -8
  160. package/build/handleError.js +0 -25
  161. package/build/handleError.js.map +0 -1
  162. package/build/impl/LiblslAdapter.d.ts +0 -154
  163. package/build/impl/LiblslAdapter.js +0 -317
  164. package/build/impl/LiblslAdapter.js.map +0 -1
  165. package/build/impl/LslEventMarkerOutlet.d.ts +0 -28
  166. package/build/impl/LslEventMarkerOutlet.js +0 -63
  167. package/build/impl/LslEventMarkerOutlet.js.map +0 -1
  168. package/build/scripts/runLslEventMarkerOutlet.js +0 -18
  169. package/build/scripts/runLslEventMarkerOutlet.js.map +0 -1
  170. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.d.ts +0 -13
  171. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js +0 -26
  172. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +0 -1
  173. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.d.ts +0 -17
  174. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js +0 -46
  175. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +0 -1
  176. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +0 -9
  177. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +0 -19
  178. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +0 -1
  179. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +0 -9
  180. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js +0 -19
  181. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +0 -1
  182. package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +0 -50
  183. package/build/testDoubles/Liblsl/FakeLiblsl.js +0 -126
  184. package/build/testDoubles/Liblsl/FakeLiblsl.js.map +0 -1
  185. package/eslint.config.mjs +0 -3
  186. package/src/.spruce/settings.json +0 -11
  187. package/src/__tests__/impl/LiblslAdapter.test.ts +0 -817
  188. package/src/__tests__/impl/LslEventMarkerOutlet.test.ts +0 -195
  189. package/src/handleError.ts +0 -24
  190. package/src/impl/LiblslAdapter.ts +0 -543
  191. package/src/impl/LslEventMarkerOutlet.ts +0 -97
  192. package/src/scripts/runLslEventMarkerOutlet.ts +0 -23
  193. package/src/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.ts +0 -36
  194. package/src/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.ts +0 -75
  195. package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +0 -24
  196. package/src/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.ts +0 -28
  197. package/src/testDoubles/Liblsl/FakeLiblsl.ts +0 -182
  198. /package/build/scripts/{runLslEventMarkerOutlet.d.ts → discoverMuse.d.ts} +0 -0
@@ -0,0 +1,323 @@
1
+ import { randomInt } from 'node:crypto'
2
+
3
+ import { assert, test } from '@neurodevs/node-tdd'
4
+
5
+ import LslEventMarkerEmitter, {
6
+ EventMarkerOptions,
7
+ } from '../../impl/LslEventMarkerEmitter.js'
8
+ import { StreamOutletOptions } from '../../impl/LslStreamOutlet.js'
9
+ import SpyEventMarkerEmitter from '../../testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js'
10
+ import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js'
11
+ import FakeStreamOutlet from '../../testDoubles/StreamOutlet/FakeStreamOutlet.js'
12
+ import AbstractPackageTest from '../AbstractPackageTest.js'
13
+
14
+ export default class EventMarkerEmitterTest extends AbstractPackageTest {
15
+ private static instance: SpyEventMarkerEmitter
16
+
17
+ protected static async beforeEach() {
18
+ await super.beforeEach()
19
+
20
+ this.setFakeLiblsl()
21
+ this.setFakeStreamOutlet()
22
+ this.setSpyEventMarkerEmitter()
23
+
24
+ this.instance = await this.LslEventMarkerEmitter()
25
+ }
26
+
27
+ private static readonly markerName = this.generateId()
28
+
29
+ @test()
30
+ protected static async createsInstance() {
31
+ assert.isTruthy(this.instance, 'Failed to create instance!')
32
+ }
33
+
34
+ @test()
35
+ protected static async loadsWithEventMarkerSpecificOptions() {
36
+ assert.isEqualDeep(
37
+ {
38
+ ...FakeStreamOutlet.callsToConstructor[0],
39
+ name: undefined,
40
+ sourceId: undefined,
41
+ },
42
+ {
43
+ name: undefined,
44
+ type: 'Markers',
45
+ sourceId: undefined,
46
+ channelNames: ['Markers'],
47
+ channelFormat: 'string',
48
+ sampleRateHz: 0,
49
+ chunkSize: 1,
50
+ }
51
+ )
52
+
53
+ assert.isTrue(
54
+ FakeStreamOutlet.callsToConstructor[0]?.sourceId.startsWith(
55
+ 'event-markers-'
56
+ ),
57
+ 'Source ID was not generated uniquely!'
58
+ )
59
+
60
+ assert.isTrue(
61
+ FakeStreamOutlet.callsToConstructor[0]?.name.startsWith(
62
+ 'Event markers ('
63
+ ),
64
+ 'Name was not generated uniquely!'
65
+ )
66
+ }
67
+
68
+ @test()
69
+ protected static async canOverrideDefaultOptions() {
70
+ const options = generateRandomOutletOptions()
71
+ await this.LslEventMarkerEmitter(options)
72
+
73
+ assert.isEqualDeep(FakeStreamOutlet.callsToConstructor[1], options)
74
+ }
75
+
76
+ @test()
77
+ protected static async emittingSingleMarkerIncrementsHitCountAndWaitTime() {
78
+ const markers = [this.generateEventMarker()]
79
+ await this.instance.emitMany(markers)
80
+
81
+ const marker = markers[0]
82
+
83
+ assert.isEqual(
84
+ FakeStreamOutlet.callsToPushSample[0]?.sample[0],
85
+ marker.name,
86
+ 'Pushed the wrong marker!'
87
+ )
88
+
89
+ assert.isEqual(this.instance.totalwaitAfterMs, marker.waitAfterMs)
90
+ }
91
+
92
+ @test()
93
+ protected static async emittingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
94
+ const markers = await this.emitManyFor(2)
95
+
96
+ assert.isEqual(FakeStreamOutlet.callsToPushSample.length, 2)
97
+
98
+ assert.isEqual(
99
+ this.instance.totalwaitAfterMs,
100
+ markers[0].waitAfterMs + markers[1].waitAfterMs
101
+ )
102
+ }
103
+
104
+ @test('interrupts on first marker', 1)
105
+ @test('interrupts on second marker', 2)
106
+ @test('interrupts on third marker', 3)
107
+ protected static async emitterIsInterruptable(bailIdx: number) {
108
+ let hitCount = 0
109
+
110
+ this.streamOutlet.pushSample = () => {
111
+ hitCount += 1
112
+ if (hitCount === bailIdx) {
113
+ this.interrupt()
114
+ }
115
+ }
116
+
117
+ await this.emitManyFor(10)
118
+
119
+ assert.isEqual(hitCount, bailIdx)
120
+ }
121
+
122
+ @test()
123
+ protected static async canStartAgainAfterInterrupting() {
124
+ this.interrupt()
125
+
126
+ let hitCount = 0
127
+
128
+ this.streamOutlet.pushSample = () => {
129
+ hitCount++
130
+ }
131
+
132
+ await this.emitManyFor(10)
133
+
134
+ assert.isEqual(hitCount, 10)
135
+ }
136
+
137
+ @test()
138
+ protected static async doesNotWaitIfInterrupted() {
139
+ await this.setupOutlet()
140
+
141
+ const startMs = Date.now()
142
+ const promise = this.emitManyFor(2, 1000)
143
+ this.interrupt()
144
+ await promise
145
+ const endMs = Date.now()
146
+
147
+ assert.isBelow(endMs - startMs, 10)
148
+ }
149
+
150
+ @test()
151
+ protected static async clearsTimeoutOnInterrupt() {
152
+ void this.emitManyFor(2, 100)
153
+ this.interrupt()
154
+
155
+ this.streamOutlet.pushSample = () =>
156
+ assert.fail('Should not have been called')
157
+ }
158
+
159
+ @test()
160
+ protected static async emitCallsPushSampleOnStreamOutlet() {
161
+ const markerName = this.generateId()
162
+ await this.emit(markerName)
163
+
164
+ assert.isEqualDeep(
165
+ FakeStreamOutlet.callsToPushSample[0]?.sample,
166
+ [markerName],
167
+ 'Pushed the wrong sample!'
168
+ )
169
+ }
170
+
171
+ @test()
172
+ protected static async emitWaitsForMsIfPassed() {
173
+ SpyEventMarkerEmitter.shouldCallWaitOnSuper = true
174
+
175
+ const waitAfterMs = 10
176
+
177
+ const startMs = Date.now()
178
+ await this.instance.emit(this.markerName, { waitAfterMs })
179
+ const endMs = Date.now()
180
+
181
+ assert.isAbove(
182
+ endMs - startMs,
183
+ 0.8 * waitAfterMs,
184
+ 'Did not wait for the specified time!'
185
+ )
186
+ }
187
+
188
+ @test()
189
+ protected static async destroyCallsDestroyOnInternalStreamOutlet() {
190
+ this.destroy()
191
+
192
+ assert.isEqual(
193
+ FakeStreamOutlet.numCallsToDestroy,
194
+ 1,
195
+ 'Did not call destroy on outlet!'
196
+ )
197
+ }
198
+
199
+ @test()
200
+ protected static async destroyInterruptsIfRunning() {
201
+ let wasHit = false
202
+
203
+ const original = this.instance.interrupt.bind(this.instance)
204
+
205
+ this.instance.interrupt = () => {
206
+ wasHit = true
207
+ original()
208
+ }
209
+
210
+ const promise = this.emitManyFor(5, 10)
211
+ this.destroy()
212
+
213
+ assert.isTrue(wasHit, 'Did not call interrupt on destroy!')
214
+
215
+ await promise
216
+ }
217
+
218
+ @test()
219
+ protected static async sourceIdIsUniqueAcrossInstances() {
220
+ const instance = await this.LslEventMarkerEmitter()
221
+
222
+ assert.isNotEqual(
223
+ instance['outlet'].sourceId,
224
+ this.instance['outlet'].sourceId,
225
+ 'Source IDs are not unique!'
226
+ )
227
+ }
228
+
229
+ @test()
230
+ protected static async emitThrowsIfCalledWhileAlreadyRunning() {
231
+ void this.instance.emit(this.markerName, { waitAfterMs: 10 })
232
+
233
+ await assert.doesThrowAsync(async () => {
234
+ await this.emit(this.generateId())
235
+ }, 'Cannot call emit while already running!')
236
+ }
237
+
238
+ @test()
239
+ protected static async emitManyThrowsIfCalledWhileAlreadyRunning() {
240
+ void EventMarkerEmitterTest.emitManyOnce()
241
+
242
+ await assert.doesThrowAsync(async () => {
243
+ await this.emitManyFor(5, 1)
244
+ }, 'Cannot call emitMany while already running!')
245
+ }
246
+
247
+ @test()
248
+ protected static async emitSetsIsRunningFalseOnceDone() {
249
+ await this.emitOnce()
250
+
251
+ assert.isFalse(
252
+ this.instance['isRunning'],
253
+ 'emit did not set isRunning to false once done!'
254
+ )
255
+ }
256
+
257
+ @test()
258
+ protected static async emitManySetsIsRunningFalseOnceDone() {
259
+ await this.emitManyOnce()
260
+
261
+ assert.isFalse(
262
+ this.instance['isRunning'],
263
+ 'emitMany did not set isRunning to false once done! '
264
+ )
265
+ }
266
+
267
+ private static async emitOnce() {
268
+ await this.emit(this.markerName)
269
+ }
270
+
271
+ private static async emit(
272
+ markerName: string,
273
+ options?: EventMarkerOptions
274
+ ) {
275
+ return this.instance.emit(markerName, options)
276
+ }
277
+
278
+ private static async emitManyOnce() {
279
+ return this.emitManyFor(5, 1)
280
+ }
281
+
282
+ private static async emitManyFor(total: number, waitAfterMs?: number) {
283
+ const markers = new Array(total)
284
+ .fill(null)
285
+ .map(() => this.generateEventMarker(waitAfterMs))
286
+
287
+ await this.instance.emitMany(markers)
288
+
289
+ return markers
290
+ }
291
+
292
+ private static generateEventMarker(waitAfterMs?: number) {
293
+ return {
294
+ name: this.generateId(),
295
+ waitAfterMs: waitAfterMs ?? randomInt(100, 1000),
296
+ }
297
+ }
298
+
299
+ private static interrupt() {
300
+ this.instance.interrupt()
301
+ }
302
+
303
+ private static destroy() {
304
+ this.instance.destroy()
305
+ }
306
+
307
+ private static get streamOutlet() {
308
+ return this.instance.getStreamOutlet()
309
+ }
310
+
311
+ private static async setupOutlet() {
312
+ LslEventMarkerEmitter.Class = LslEventMarkerEmitter as any
313
+ this.instance = await this.LslEventMarkerEmitter()
314
+ }
315
+
316
+ private static async LslEventMarkerEmitter(
317
+ options?: Partial<StreamOutletOptions>
318
+ ) {
319
+ return (await LslEventMarkerEmitter.Create(
320
+ options
321
+ )) as SpyEventMarkerEmitter
322
+ }
323
+ }
@@ -196,7 +196,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
196
196
  assert.isEqualDeep(
197
197
  this.fakeLiblsl.lastAppendChannelsToStreamInfoOptions,
198
198
  {
199
- info: this.instance.boundInfo,
199
+ infoHandle: this.instance.infoHandle,
200
200
  channels: this.channelNames.map((label: string) => ({
201
201
  label,
202
202
  units: this.units,
@@ -212,49 +212,12 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
212
212
  this.instance.destroy()
213
213
 
214
214
  assert.isEqualDeep(
215
- this.fakeLiblsl.lastDestroyStreamInfoOptions?.info,
216
- this.instance.boundInfo,
215
+ this.fakeLiblsl.lastDestroyStreamInfoOptions?.infoHandle,
216
+ this.instance.infoHandle,
217
217
  'Should have called destroyStreamInfo!'
218
218
  )
219
219
  }
220
220
 
221
- @test()
222
- protected static async doesNotCreateNewStreamInfoIfPassedBoundInfo() {
223
- this.LslStreamInfo({
224
- boundInfo: this.instance.boundInfo,
225
- })
226
-
227
- assert.isEqual(
228
- this.fakeLiblsl.createStreamInfoHitCount,
229
- 1,
230
- 'Should not have created new stream info!'
231
- )
232
- }
233
-
234
- @test()
235
- protected static async setsBoundInfoWhenPassed() {
236
- const instance = this.LslStreamInfo({
237
- boundInfo: this.instance.boundInfo,
238
- })
239
-
240
- assert.isEqualDeep(
241
- instance.boundInfo,
242
- this.instance.boundInfo,
243
- 'Should have set bound stream info!'
244
- )
245
- }
246
-
247
- @test()
248
- protected static async cachesInfoAttributesByBoundInfo() {
249
- const cached = LslStreamInfo.From(this.instance.boundInfo)
250
-
251
- assert.isEqualDeep(
252
- cached,
253
- this.instance,
254
- 'Should have set bound stream info!'
255
- )
256
- }
257
-
258
221
  private static readonly defaultOptions = {
259
222
  name: this.name,
260
223
  type: this.type,