@neurodevs/node-lsl 19.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 (227) hide show
  1. package/README.md +6 -6
  2. package/build/__tests__/AbstractPackageTest.d.ts +12 -11
  3. package/build/__tests__/AbstractPackageTest.js +32 -34
  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} +68 -70
  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} +45 -46
  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 +2 -3
  18. package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
  19. package/build/__tests__/impl/LslStreamInlet.test.d.ts +3 -5
  20. package/build/__tests__/impl/LslStreamInlet.test.js +13 -47
  21. package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
  22. package/build/__tests__/impl/LslStreamOutlet.test.js +7 -13
  23. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
  24. package/build/__tests__/impl/LslWebSocketBridge.test.js +9 -11
  25. package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
  26. package/build/__tests__/impl/UsbDeviceController.test.js.map +1 -1
  27. package/build/__tests__/impl/WindowedClockRegressor.test.js +1 -1
  28. package/build/__tests__/impl/WindowedClockRegressor.test.js.map +1 -1
  29. package/build/assertions.js +1 -1
  30. package/build/assertions.js.map +1 -1
  31. package/build/impl/LslEventMarkerOutlet.d.ts +35 -0
  32. package/build/impl/{LslEventMarkerEmitter.js → LslEventMarkerOutlet.js} +2 -2
  33. package/build/impl/LslEventMarkerOutlet.js.map +1 -0
  34. package/build/impl/LslJsonOutlet.d.ts +33 -0
  35. package/build/impl/LslJsonOutlet.js +44 -0
  36. package/build/impl/LslJsonOutlet.js.map +1 -0
  37. package/build/impl/LslStreamInfo.d.ts +7 -7
  38. package/build/impl/LslStreamInfo.js.map +1 -1
  39. package/build/impl/LslStreamInlet.d.ts +63 -21
  40. package/build/impl/LslStreamInlet.js +221 -65
  41. package/build/impl/LslStreamInlet.js.map +1 -1
  42. package/build/impl/LslStreamOutlet.d.ts +16 -16
  43. package/build/impl/LslStreamOutlet.js +32 -36
  44. package/build/impl/LslStreamOutlet.js.map +1 -1
  45. package/build/impl/LslWebSocketBridge.d.ts +10 -10
  46. package/build/impl/LslWebSocketBridge.js.map +1 -1
  47. package/build/impl/clocks/WindowedClockRegressor.js.map +1 -0
  48. package/build/impl/controllers/{BleDeviceController.d.ts → BleGattController.d.ts} +10 -10
  49. package/build/impl/controllers/{BleDeviceController.js → BleGattController.js} +19 -19
  50. package/build/impl/controllers/BleGattController.js.map +1 -0
  51. package/build/impl/controllers/BleObserverController.d.ts +20 -0
  52. package/build/impl/controllers/BleObserverController.js +37 -0
  53. package/build/impl/controllers/BleObserverController.js.map +1 -0
  54. package/build/impl/controllers/UsbDeviceController.d.ts +9 -9
  55. package/build/impl/controllers/UsbDeviceController.js +7 -7
  56. package/build/impl/controllers/UsbDeviceController.js.map +1 -1
  57. package/build/index.d.ts +43 -31
  58. package/build/index.js +52 -39
  59. package/build/index.js.map +1 -1
  60. package/build/scripts/{runLslEventMarkerEmitter.js → runEventMarkerOutlet.js} +4 -3
  61. package/build/scripts/runEventMarkerOutlet.js.map +1 -0
  62. package/build/scripts/{runLslStreamOutlet.js → runLslOutlet.js} +1 -1
  63. package/build/scripts/runLslOutlet.js.map +1 -0
  64. package/build/scripts/runMuse.js +2 -2
  65. package/build/scripts/runMuse.js.map +1 -1
  66. package/build/testDoubles/{BleController/FakeBleController.d.ts → BleGatt/FakeBleGatt.d.ts} +6 -6
  67. package/build/testDoubles/{BleController/FakeBleController.js → BleGatt/FakeBleGatt.js} +8 -8
  68. package/build/testDoubles/BleGatt/FakeBleGatt.js.map +1 -0
  69. package/build/testDoubles/{BleController/SpyBleController.d.ts → BleGatt/SpyBleGatt.d.ts} +4 -4
  70. package/build/testDoubles/{BleController/SpyBleController.js → BleGatt/SpyBleGatt.js} +3 -3
  71. package/build/testDoubles/BleGatt/SpyBleGatt.js.map +1 -0
  72. package/build/testDoubles/BleObserver/FakeBleObserver.d.ts +10 -0
  73. package/build/testDoubles/BleObserver/FakeBleObserver.js +20 -0
  74. package/build/testDoubles/BleObserver/FakeBleObserver.js.map +1 -0
  75. package/build/testDoubles/ClockRegressor/FakeClockRegressor.d.ts +1 -1
  76. package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.d.ts → EventMarkerOutlet/FakeEventMarkerOutlet.d.ts} +4 -4
  77. package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.js → EventMarkerOutlet/FakeEventMarkerOutlet.js} +7 -7
  78. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +1 -0
  79. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +10 -0
  80. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +23 -0
  81. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +1 -0
  82. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +9 -0
  83. package/build/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.js → EventMarkerOutlet/ThrowingEventMarkerOutlet.js} +2 -2
  84. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +1 -0
  85. package/build/testDoubles/JsonOutlet/FakeJsonOutlet.d.ts +10 -0
  86. package/build/testDoubles/JsonOutlet/FakeJsonOutlet.js +20 -0
  87. package/build/testDoubles/JsonOutlet/FakeJsonOutlet.js.map +1 -0
  88. package/build/testDoubles/{StreamInfo/FakeStreamInfo.d.ts → LslInfo/FakeLslInfo.d.ts} +4 -4
  89. package/build/testDoubles/{StreamInfo/FakeStreamInfo.js → LslInfo/FakeLslInfo.js} +7 -7
  90. package/build/testDoubles/LslInfo/FakeLslInfo.js.map +1 -0
  91. package/build/testDoubles/LslInfo/SpyLslInfo.d.ts +10 -0
  92. package/build/testDoubles/{StreamInfo/SpyStreamInfo.js → LslInfo/SpyLslInfo.js} +4 -4
  93. package/build/testDoubles/LslInfo/SpyLslInfo.js.map +1 -0
  94. package/build/testDoubles/{StreamInlet/FakeStreamInlet.d.ts → LslInlet/FakeLslInlet.d.ts} +4 -4
  95. package/build/testDoubles/{StreamInlet/FakeStreamInlet.js → LslInlet/FakeLslInlet.js} +12 -11
  96. package/build/testDoubles/LslInlet/FakeLslInlet.js.map +1 -0
  97. package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +4 -0
  98. package/build/testDoubles/{StreamInlet/SpyStreamInlet.js → LslInlet/SpyLslInlet.js} +2 -2
  99. package/build/testDoubles/LslInlet/SpyLslInlet.js.map +1 -0
  100. package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.d.ts → LslOutlet/FakeLslOutlet.d.ts} +5 -5
  101. package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.js → LslOutlet/FakeLslOutlet.js} +8 -8
  102. package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +1 -0
  103. package/build/testDoubles/LslWsBridge/FakeLslWsBridge.d.ts +14 -0
  104. package/build/testDoubles/{WebSocketBridge/FakeWebSocketBridge.js → LslWsBridge/FakeLslWsBridge.js} +14 -14
  105. package/build/testDoubles/LslWsBridge/FakeLslWsBridge.js.map +1 -0
  106. package/build/testDoubles/LslWsBridge/SpyLslWsBridge.d.ts +4 -0
  107. package/build/testDoubles/{WebSocketBridge/SpyLslWebSocketBridge.js → LslWsBridge/SpyLslWsBridge.js} +2 -2
  108. package/build/testDoubles/LslWsBridge/SpyLslWsBridge.js.map +1 -0
  109. package/build/testDoubles/UsbDevice/FakeUsbDevice.d.ts +12 -0
  110. package/build/testDoubles/UsbDevice/FakeUsbDevice.js +25 -0
  111. package/build/testDoubles/UsbDevice/FakeUsbDevice.js.map +1 -0
  112. package/build/testDoubles/consts.d.ts +2 -12
  113. package/build/testDoubles/consts.js +0 -20
  114. package/build/testDoubles/consts.js.map +1 -1
  115. package/build/testDoubles/generateRandomOutletOptions.d.ts +2 -2
  116. package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
  117. package/package.json +5 -4
  118. package/src/__tests__/AbstractPackageTest.ts +35 -42
  119. package/src/__tests__/impl/{BleDeviceController.test.ts → BleGattController.test.ts} +45 -47
  120. package/src/__tests__/impl/BleObserverController.test.ts +72 -0
  121. package/src/__tests__/impl/{LslEventMarkerEmitter.test.ts → LslEventMarkerOutlet.test.ts} +33 -37
  122. package/src/__tests__/impl/LslJsonOutlet.test.ts +135 -0
  123. package/src/__tests__/impl/LslStreamInfo.test.ts +8 -9
  124. package/src/__tests__/impl/LslStreamInlet.test.ts +21 -79
  125. package/src/__tests__/impl/LslStreamOutlet.test.ts +17 -25
  126. package/src/__tests__/impl/LslWebSocketBridge.test.ts +15 -19
  127. package/src/__tests__/impl/UsbDeviceController.test.ts +2 -2
  128. package/src/__tests__/impl/WindowedClockRegressor.test.ts +1 -1
  129. package/src/assertions.ts +1 -2
  130. package/src/impl/{LslEventMarkerEmitter.ts → LslEventMarkerOutlet.ts} +17 -17
  131. package/src/impl/LslJsonOutlet.ts +87 -0
  132. package/src/impl/LslStreamInfo.ts +7 -9
  133. package/src/impl/LslStreamInlet.ts +305 -81
  134. package/src/impl/LslStreamOutlet.ts +62 -59
  135. package/src/impl/LslWebSocketBridge.ts +15 -18
  136. package/src/impl/controllers/{BleDeviceController.ts → BleGattController.ts} +23 -28
  137. package/src/impl/controllers/BleObserverController.ts +62 -0
  138. package/src/impl/controllers/UsbDeviceController.ts +14 -16
  139. package/src/index.ts +64 -44
  140. package/src/scripts/{runLslEventMarkerEmitter.ts → runEventMarkerOutlet.ts} +3 -2
  141. package/src/scripts/runMuse.ts +2 -2
  142. package/src/testDoubles/{BleController/FakeBleController.ts → BleGatt/FakeBleGatt.ts} +14 -14
  143. package/src/testDoubles/{BleController/SpyBleController.ts → BleGatt/SpyBleGatt.ts} +5 -5
  144. package/src/testDoubles/BleObserver/FakeBleObserver.ts +28 -0
  145. package/src/testDoubles/ClockRegressor/FakeClockRegressor.ts +1 -1
  146. package/src/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.ts → EventMarkerOutlet/FakeEventMarkerOutlet.ts} +11 -11
  147. package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +31 -0
  148. package/src/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.ts → EventMarkerOutlet/ThrowingEventMarkerOutlet.ts} +5 -5
  149. package/src/testDoubles/JsonOutlet/FakeJsonOutlet.ts +25 -0
  150. package/src/testDoubles/{StreamInfo/FakeStreamInfo.ts → LslInfo/FakeLslInfo.ts} +9 -9
  151. package/src/testDoubles/{StreamInfo/SpyStreamInfo.ts → LslInfo/SpyLslInfo.ts} +5 -5
  152. package/src/testDoubles/{StreamInlet/FakeStreamInlet.ts → LslInlet/FakeLslInlet.ts} +15 -14
  153. package/src/testDoubles/LslInlet/SpyLslInlet.ts +10 -0
  154. package/src/testDoubles/{StreamOutlet/FakeStreamOutlet.ts → LslOutlet/FakeLslOutlet.ts} +11 -14
  155. package/src/testDoubles/{WebSocketBridge/FakeWebSocketBridge.ts → LslWsBridge/FakeLslWsBridge.ts} +19 -19
  156. package/src/testDoubles/LslWsBridge/SpyLslWsBridge.ts +9 -0
  157. package/src/testDoubles/UsbDevice/FakeUsbDevice.ts +34 -0
  158. package/src/testDoubles/consts.ts +3 -23
  159. package/src/testDoubles/generateRandomOutletOptions.ts +2 -2
  160. package/build/__tests__/impl/BleDeviceController.test.js.map +0 -1
  161. package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +0 -1
  162. package/build/consts.d.ts +0 -11
  163. package/build/consts.js +0 -21
  164. package/build/consts.js.map +0 -1
  165. package/build/impl/LslEventMarkerEmitter.d.ts +0 -35
  166. package/build/impl/LslEventMarkerEmitter.js.map +0 -1
  167. package/build/impl/WindowedClockRegressor.js.map +0 -1
  168. package/build/impl/controllers/BleDeviceController.js.map +0 -1
  169. package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +0 -22
  170. package/build/impl/workers/inlet/LslStreamInlet.worker.js +0 -42
  171. package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +0 -1
  172. package/build/impl/workers/inlet/StreamInletWorker.d.ts +0 -73
  173. package/build/impl/workers/inlet/StreamInletWorker.js +0 -253
  174. package/build/impl/workers/inlet/StreamInletWorker.js.map +0 -1
  175. package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +0 -32
  176. package/build/impl/workers/outlet/LslStreamOutlet.worker.js +0 -82
  177. package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +0 -1
  178. package/build/scripts/discoverMuse.js +0 -40
  179. package/build/scripts/discoverMuse.js.map +0 -1
  180. package/build/scripts/runLslEventMarkerEmitter.js.map +0 -1
  181. package/build/scripts/runLslStreamOutlet.d.ts +0 -1
  182. package/build/scripts/runLslStreamOutlet.js.map +0 -1
  183. package/build/scripts/testDestroyOutlet.d.ts +0 -1
  184. package/build/scripts/testDestroyOutlet.js +0 -4
  185. package/build/scripts/testDestroyOutlet.js.map +0 -1
  186. package/build/testDoubles/BleController/FakeBleController.js.map +0 -1
  187. package/build/testDoubles/BleController/SpyBleController.js.map +0 -1
  188. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +0 -1
  189. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.d.ts +0 -10
  190. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js +0 -23
  191. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +0 -1
  192. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +0 -9
  193. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +0 -1
  194. package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +0 -1
  195. package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +0 -10
  196. package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +0 -1
  197. package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +0 -1
  198. package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +0 -4
  199. package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +0 -1
  200. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +0 -1
  201. package/build/testDoubles/UsbController/FakeUsbController.d.ts +0 -12
  202. package/build/testDoubles/UsbController/FakeUsbController.js +0 -25
  203. package/build/testDoubles/UsbController/FakeUsbController.js.map +0 -1
  204. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +0 -14
  205. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +0 -1
  206. package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.d.ts +0 -4
  207. package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js.map +0 -1
  208. package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +0 -27
  209. package/build/testDoubles/WorkerThreads/FakeWorker.js +0 -67
  210. package/build/testDoubles/WorkerThreads/FakeWorker.js.map +0 -1
  211. package/src/consts.ts +0 -21
  212. package/src/impl/workers/inlet/LslStreamInlet.worker.ts +0 -74
  213. package/src/impl/workers/inlet/StreamInletWorker.ts +0 -348
  214. package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +0 -144
  215. package/src/scripts/discoverMuse.ts +0 -50
  216. package/src/scripts/testDestroyOutlet.ts +0 -5
  217. package/src/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.ts +0 -31
  218. package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +0 -10
  219. package/src/testDoubles/UsbController/FakeUsbController.ts +0 -34
  220. package/src/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.ts +0 -9
  221. package/src/testDoubles/WorkerThreads/FakeWorker.ts +0 -99
  222. /package/build/impl/{WindowedClockRegressor.d.ts → clocks/WindowedClockRegressor.d.ts} +0 -0
  223. /package/build/impl/{WindowedClockRegressor.js → clocks/WindowedClockRegressor.js} +0 -0
  224. /package/build/scripts/{discoverMuse.d.ts → runEventMarkerOutlet.d.ts} +0 -0
  225. /package/build/scripts/{runLslEventMarkerEmitter.d.ts → runLslOutlet.d.ts} +0 -0
  226. /package/src/impl/{WindowedClockRegressor.ts → clocks/WindowedClockRegressor.ts} +0 -0
  227. /package/src/scripts/{runLslStreamOutlet.ts → runLslOutlet.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 = await this.BleController()
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,24 +514,20 @@ export default class BleDeviceControllerTest extends AbstractPackageTest {
512
514
  }
513
515
  }
514
516
 
515
- private static async BleController(
516
- options?: Partial<BleControllerOptions>
517
- ) {
518
- return (await 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 async BleControllerWithPrefix() {
528
- return (await BleDeviceController.Create({
527
+ private static BleGattControllerWithPrefix() {
528
+ return this.BleGattController({
529
529
  deviceNamePrefix: this.namePrefix,
530
- charCallbacks: this.charCallbacks,
531
- onConnected: this.onConnected,
532
- rssiIntervalMs: this.rssiIntervalMs,
533
- } as unknown as BleControllerOptions)) as SpyBleController
530
+ deviceUuid: undefined,
531
+ })
534
532
  }
535
533
  }
@@ -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, {
6
- EventMarkerOptions,
7
- } from '../../impl/LslEventMarkerEmitter.js'
8
- import { StreamOutletOptions } from '../../impl/LslStreamOutlet.js'
9
- import SpyEventMarkerEmitter from '../../testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js'
5
+ import LslEventMarkerOutlet, {
6
+ EmitOptions,
7
+ } from '../../impl/LslEventMarkerOutlet.js'
8
+ import { LslOutletOptions } from '../../impl/LslStreamOutlet.js'
9
+ import SpyEventMarkerOutlet from '../../testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.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
- export default class EventMarkerEmitterTest extends AbstractPackageTest {
15
- private static instance: SpyEventMarkerEmitter
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
- this.setFakeStreamOutlet()
22
- this.setSpyEventMarkerEmitter()
20
+ this.setFakeLslOutlet()
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()
@@ -35,7 +34,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
35
34
  protected static async loadsWithEventMarkerSpecificOptions() {
36
35
  assert.isEqualDeep(
37
36
  {
38
- ...FakeStreamOutlet.callsToConstructor[0],
37
+ ...FakeLslOutlet.callsToConstructor[0],
39
38
  name: undefined,
40
39
  sourceId: undefined,
41
40
  },
@@ -51,14 +50,14 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
51
50
  )
52
51
 
53
52
  assert.isTrue(
54
- FakeStreamOutlet.callsToConstructor[0]?.sourceId.startsWith(
53
+ FakeLslOutlet.callsToConstructor[0]?.sourceId.startsWith(
55
54
  'event-markers-'
56
55
  ),
57
56
  'Source ID was not generated uniquely!'
58
57
  )
59
58
 
60
59
  assert.isTrue(
61
- FakeStreamOutlet.callsToConstructor[0]?.name.startsWith(
60
+ FakeLslOutlet.callsToConstructor[0]?.name.startsWith(
62
61
  'Event markers ('
63
62
  ),
64
63
  'Name was not generated uniquely!'
@@ -68,9 +67,9 @@ 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
- assert.isEqualDeep(FakeStreamOutlet.callsToConstructor[1], options)
72
+ assert.isEqualDeep(FakeLslOutlet.callsToConstructor[1], options)
74
73
  }
75
74
 
76
75
  @test()
@@ -81,22 +80,22 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
81
80
  const marker = markers[0]
82
81
 
83
82
  assert.isEqual(
84
- FakeStreamOutlet.callsToPushSample[0]?.sample[0],
83
+ FakeLslOutlet.callsToPushSample[0]?.sample[0],
85
84
  marker.name,
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()
93
92
  protected static async emittingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
94
93
  const markers = await this.emitManyFor(2)
95
94
 
96
- assert.isEqual(FakeStreamOutlet.callsToPushSample.length, 2)
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 = () => {
@@ -162,7 +161,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
162
161
  await this.emit(markerName)
163
162
 
164
163
  assert.isEqualDeep(
165
- FakeStreamOutlet.callsToPushSample[0]?.sample,
164
+ FakeLslOutlet.callsToPushSample[0]?.sample,
166
165
  [markerName],
167
166
  'Pushed the wrong sample!'
168
167
  )
@@ -170,7 +169,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
170
169
 
171
170
  @test()
172
171
  protected static async emitWaitsForMsIfPassed() {
173
- SpyEventMarkerEmitter.shouldCallWaitOnSuper = true
172
+ SpyEventMarkerOutlet.shouldCallWaitOnSuper = true
174
173
 
175
174
  const waitAfterMs = 10
176
175
 
@@ -190,7 +189,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
190
189
  this.destroy()
191
190
 
192
191
  assert.isEqual(
193
- FakeStreamOutlet.numCallsToDestroy,
192
+ FakeLslOutlet.numCallsToDestroy,
194
193
  1,
195
194
  'Did not call destroy on outlet!'
196
195
  )
@@ -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)
@@ -268,10 +267,7 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
268
267
  await this.emit(this.markerName)
269
268
  }
270
269
 
271
- private static async emit(
272
- markerName: string,
273
- options?: EventMarkerOptions
274
- ) {
270
+ private static async emit(markerName: string, options?: EmitOptions) {
275
271
  return this.instance.emit(markerName, options)
276
272
  }
277
273
 
@@ -309,15 +305,15 @@ export default class EventMarkerEmitterTest extends AbstractPackageTest {
309
305
  }
310
306
 
311
307
  private static async setupOutlet() {
312
- LslEventMarkerEmitter.Class = LslEventMarkerEmitter as any
313
- this.instance = await this.LslEventMarkerEmitter()
308
+ LslEventMarkerOutlet.Class = LslEventMarkerOutlet as any
309
+ this.instance = await this.LslEventMarkerOutlet()
314
310
  }
315
311
 
316
- private static async LslEventMarkerEmitter(
317
- options?: Partial<StreamOutletOptions>
312
+ private static async LslEventMarkerOutlet(
313
+ options?: Partial<LslOutletOptions>
318
314
  ) {
319
- return (await LslEventMarkerEmitter.Create(
315
+ return (await LslEventMarkerOutlet.Create(
320
316
  options
321
- )) as SpyEventMarkerEmitter
317
+ )) as SpyEventMarkerOutlet
322
318
  }
323
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
+ }