@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
@@ -1,6 +1,11 @@
1
- import { Worker } from 'node:worker_threads'
2
-
3
- import { ChannelFormat, Liblsl, LslSample } from '@neurodevs/ndx-native'
1
+ import {
2
+ ChannelFormat,
3
+ LiblslAdapter,
4
+ LslErrorCode,
5
+ LslSample,
6
+ OutletHandle,
7
+ handleLslError,
8
+ } from '@neurodevs/ndx-native'
4
9
 
5
10
  import {
6
11
  assertValidChannelCount,
@@ -9,11 +14,13 @@ import {
9
14
  assertValidMaxBufferedMs,
10
15
  assertValidSampleRateHz,
11
16
  } from '../assertions.js'
17
+ import LslStreamInfo, { LslInfo } from './LslStreamInfo.js'
12
18
 
13
- export default class LslStreamOutlet implements StreamOutlet {
14
- public static Class?: StreamOutletConstructor
15
- public static Worker = Worker
19
+ export default class LslStreamOutlet implements LslOutlet {
20
+ public static Class?: LslOutletConstructor
16
21
  public static setTimeout = setTimeout
22
+ public static lsl = LiblslAdapter.getInstance()
23
+ public static handleLslError = handleLslError
17
24
 
18
25
  public readonly name: string
19
26
  public readonly type: string
@@ -27,9 +34,11 @@ export default class LslStreamOutlet implements StreamOutlet {
27
34
  public readonly manufacturer: string = 'N/A'
28
35
  public readonly units: string = 'N/A'
29
36
 
30
- private worker!: Worker
37
+ private info!: LslInfo
38
+ private handle!: OutletHandle
39
+ private pushSampleToLsl!: (opts: unknown) => LslErrorCode
31
40
 
32
- protected constructor(options: StreamOutletOptions) {
41
+ protected constructor(options: LslOutletOptions) {
33
42
  const {
34
43
  name,
35
44
  type,
@@ -56,11 +65,10 @@ export default class LslStreamOutlet implements StreamOutlet {
56
65
  this.units = units ?? this.units
57
66
 
58
67
  this.validateOptions()
59
- this.createWorkerThread()
60
68
  this.createStreamOutlet()
61
69
  }
62
70
 
63
- public static async Create(options: StreamOutletOptions) {
71
+ public static async Create(options: LslOutletOptions) {
64
72
  const { waitAfterConstructionMs = 10 } = options ?? {}
65
73
 
66
74
  const instance = new (this.Class ?? this)(options)
@@ -94,62 +102,57 @@ export default class LslStreamOutlet implements StreamOutlet {
94
102
  )
95
103
  }
96
104
 
97
- private createWorkerThread() {
98
- this.worker = new this.Worker(
99
- new URL(
100
- './workers/outlet/LslStreamOutlet.worker.js',
101
- import.meta.url
102
- )
103
- )
104
- }
105
-
106
105
  private createStreamOutlet() {
107
- this.worker.postMessage({
108
- type: 'createOutlet',
109
- payload: {
110
- infoOptions: {
111
- name: this.name,
112
- type: this.type,
113
- sourceId: this.sourceId,
114
- channelNames: this.channelNames,
115
- channelFormat: this.channelFormat,
116
- sampleRateHz: this.sampleRateHz,
117
- units: this.units,
118
- },
119
- chunkSize: this.chunkSize,
120
- maxBufferedMs: this.maxBufferedMs,
121
- pushMethod: this.pushMethod,
122
- },
106
+ this.info = LslStreamInfo.Create({
107
+ name: this.name,
108
+ type: this.type,
109
+ sourceId: this.sourceId,
110
+ channelNames: this.channelNames,
111
+ channelFormat: this.channelFormat,
112
+ sampleRateHz: this.sampleRateHz,
113
+ units: this.units,
123
114
  })
115
+
116
+ this.handle = this.lsl.createOutlet({
117
+ infoHandle: this.info.infoHandle,
118
+ chunkSize: this.chunkSize,
119
+ maxBufferedMs: this.maxBufferedMs,
120
+ })
121
+
122
+ this.pushSampleToLsl = (
123
+ this.lsl[this.pushMethod] as (opts: unknown) => LslErrorCode
124
+ ).bind(this.lsl)
125
+ }
126
+
127
+ private get lsl() {
128
+ return LslStreamOutlet.lsl
124
129
  }
125
130
 
126
131
  private get pushMethod() {
127
132
  return this.methodMap[this.channelFormat]
128
133
  }
129
134
 
130
- private readonly methodMap: Record<string, keyof Liblsl> = {
135
+ private readonly methodMap: Record<
136
+ string,
137
+ 'pushSampleFloatTimestamp' | 'pushSampleStringTimestamp'
138
+ > = {
131
139
  float32: 'pushSampleFloatTimestamp',
132
140
  string: 'pushSampleStringTimestamp',
133
141
  }
134
142
 
135
- public pushSample(sample: LslSample, timestampSec?: number) {
136
- this.worker.postMessage({
137
- type: 'pushSample',
138
- payload: {
139
- sample,
140
- timestampSec,
141
- },
143
+ public pushSample(sample: LslSample, timestampSec = this.lsl.localClock()) {
144
+ const errorCode = this.pushSampleToLsl({
145
+ outletHandle: this.handle,
146
+ sample,
147
+ timestampSec,
142
148
  })
143
- }
144
149
 
145
- public destroy() {
146
- this.worker.postMessage({
147
- type: 'destroyOutlet',
148
- })
150
+ LslStreamOutlet.handleLslError(errorCode)
149
151
  }
150
152
 
151
- private get Worker() {
152
- return LslStreamOutlet.Worker
153
+ public destroy() {
154
+ this.lsl.destroyOutlet({ outletHandle: this.handle })
155
+ this.lsl.destroyStreamInfo({ infoHandle: this.info.infoHandle })
153
156
  }
154
157
 
155
158
  private static async waitForSetup(waitAfterConstructionMs: number) {
@@ -159,7 +162,7 @@ export default class LslStreamOutlet implements StreamOutlet {
159
162
  }
160
163
  }
161
164
 
162
- export interface StreamOutlet {
165
+ export interface LslOutlet {
163
166
  pushSample(sample: LslSample, timestampSec?: number): void
164
167
  destroy(): void
165
168
  readonly name: string
@@ -175,15 +178,9 @@ export interface StreamOutlet {
175
178
  readonly manufacturer: string
176
179
  }
177
180
 
178
- export type StreamOutletConstructor = new (
179
- options: StreamOutletOptions
180
- ) => StreamOutlet
181
+ export type LslOutletConstructor = new (options: LslOutletOptions) => LslOutlet
181
182
 
182
- export interface StreamOutletOptions extends StreamOutletConstructorOptions {
183
- waitAfterConstructionMs?: number
184
- }
185
-
186
- export interface StreamOutletConstructorOptions {
183
+ export interface LslOutletOptions {
187
184
  name: string
188
185
  type: string
189
186
  sourceId: string
@@ -194,4 +191,10 @@ export interface StreamOutletConstructorOptions {
194
191
  maxBufferedMs?: number
195
192
  manufacturer?: string
196
193
  units?: string
194
+ waitAfterConstructionMs?: number
197
195
  }
196
+
197
+ export type LslOutletConstructorOptions = Omit<
198
+ LslOutletOptions,
199
+ 'waitAfterConstructionMs'
200
+ >
@@ -1,22 +1,19 @@
1
1
  import WebSocket, { WebSocketServer } from 'ws'
2
2
 
3
- import LslStreamInlet, {
4
- StreamInlet,
5
- StreamInletOptions,
6
- } from './LslStreamInlet.js'
3
+ import LslStreamInlet, { LslInlet, LslInletOptions } from './LslStreamInlet.js'
7
4
 
8
- export default class LslWebSocketBridge implements WebSocketBridge {
9
- public static Class?: WebSocketBridgeConstructor
5
+ export default class LslWebSocketBridge implements LslWsBridge {
6
+ public static Class?: LslWsBridgeConstructor
10
7
  public static WS = WebSocket
11
8
  public static WSS = WebSocketServer
12
9
 
13
- private inlet: StreamInlet
10
+ private inlet: LslInlet
14
11
  private localServer?: WebSocketServer
15
12
  private remoteSockets?: WebSocket[]
16
13
 
17
14
  private isDestroyed = false
18
15
 
19
- protected constructor(options: WebSocketBridgeConstructorOptions) {
16
+ protected constructor(options: LslWsBridgeConstructorOptions) {
20
17
  const { inlet, localServer, remoteSockets } = options
21
18
 
22
19
  this.inlet = inlet
@@ -26,9 +23,9 @@ export default class LslWebSocketBridge implements WebSocketBridge {
26
23
  this.throwIfNoLocalServerOrRemoteSockets()
27
24
  }
28
25
 
29
- public static async Create(options: WebSocketBridgeOptions) {
26
+ public static async Create(options: LslWsBridgeOptions) {
30
27
  const { listenPort, connectUrls, ...rest } = options
31
- const inletOptions: StreamInletOptions = rest
28
+ const inletOptions: LslInletOptions = rest
32
29
 
33
30
  const localServer = this.WebSocketServer(listenPort)
34
31
  const remoteSockets = this.createSocketsFrom(connectUrls)
@@ -155,7 +152,7 @@ export default class LslWebSocketBridge implements WebSocketBridge {
155
152
  }
156
153
 
157
154
  private static async LslStreamInlet(
158
- options: StreamInletOptions,
155
+ options: LslInletOptions,
159
156
  localServer?: WebSocketServer,
160
157
  remoteSockets?: WebSocket[]
161
158
  ) {
@@ -164,25 +161,25 @@ export default class LslWebSocketBridge implements WebSocketBridge {
164
161
  }
165
162
  }
166
163
 
167
- export interface WebSocketBridge {
164
+ export interface LslWsBridge {
168
165
  activate(): Promise<void>
169
166
  deactivate(): void
170
167
  destroy(): void
171
168
  }
172
169
 
173
- export type WebSocketBridgeConstructor = new (
174
- options: WebSocketBridgeConstructorOptions
175
- ) => WebSocketBridge
170
+ export type LslWsBridgeConstructor = new (
171
+ options: LslWsBridgeConstructorOptions
172
+ ) => LslWsBridge
176
173
 
177
- export interface WebSocketBridgeOptions {
174
+ export interface LslWsBridgeOptions {
178
175
  sourceId: string
179
176
  chunkSize: number
180
177
  listenPort?: number
181
178
  connectUrls?: string | string[]
182
179
  }
183
180
 
184
- export interface WebSocketBridgeConstructorOptions extends WebSocketBridgeOptions {
185
- inlet: StreamInlet
181
+ export interface LslWsBridgeConstructorOptions extends LslWsBridgeOptions {
182
+ inlet: LslInlet
186
183
  localServer?: WebSocketServer
187
184
  remoteSockets?: WebSocket[]
188
185
  }
@@ -1,7 +1,7 @@
1
1
  import { LibndxAdapter, Libndx, NativePeripheral } from '@neurodevs/ndx-native'
2
2
 
3
- export default class BleDeviceController implements BleController {
4
- public static Class?: BleControllerConstructor
3
+ export default class BleGattController implements BleGatt {
4
+ public static Class?: BleGattConstructor
5
5
  public static setTimeout = setTimeout
6
6
  public static waitAfterMs = 1000
7
7
 
@@ -28,7 +28,7 @@ export default class BleDeviceController implements BleController {
28
28
  private deviceName?: string
29
29
  private onConnected?: (peripheral: NativePeripheral) => void
30
30
 
31
- protected constructor(options: BleControllerOptions) {
31
+ protected constructor(options: BleGattOptions) {
32
32
  const {
33
33
  deviceUuid,
34
34
  deviceNamePrefix,
@@ -44,7 +44,7 @@ export default class BleDeviceController implements BleController {
44
44
  this.rssiIntervalMs = rssiIntervalMs
45
45
  }
46
46
 
47
- public static async Create(options: BleControllerOptions) {
47
+ public static Create(options: BleGattOptions) {
48
48
  return new (this.Class ?? this)(options)
49
49
  }
50
50
 
@@ -53,13 +53,13 @@ export default class BleDeviceController implements BleController {
53
53
  await this.discoverUuid()
54
54
  }
55
55
 
56
- this.createBleBackend()
57
- this.startBleBackend()
56
+ this.createBleGattBackend()
57
+ this.startBleGattBackend()
58
58
 
59
59
  await this.waitForOnConnected()
60
60
  await this.waitToDiscoverServices()
61
61
 
62
- this.setBleRssiInterval()
62
+ this.startBleGattRssiPolling()
63
63
  }
64
64
 
65
65
  private async discoverUuid() {
@@ -81,15 +81,15 @@ export default class BleDeviceController implements BleController {
81
81
  if (this.deviceUuid) {
82
82
  resolve()
83
83
  } else {
84
- BleDeviceController.setTimeout(checkDiscovered, 100)
84
+ BleGattController.setTimeout(checkDiscovered, 100)
85
85
  }
86
86
  }
87
87
  checkDiscovered()
88
88
  })
89
89
  }
90
90
 
91
- private createBleBackend() {
92
- const { status, error } = this.ndx.createBleBackend({
91
+ private createBleGattBackend() {
92
+ const { status, error } = this.ndx.createBleGattBackend({
93
93
  deviceUuid: this.uuid,
94
94
  })
95
95
 
@@ -102,9 +102,9 @@ export default class BleDeviceController implements BleController {
102
102
  }
103
103
  }
104
104
 
105
- private setBleRssiInterval() {
105
+ private startBleGattRssiPolling() {
106
106
  if (this.rssiIntervalMs) {
107
- this.ndx.setBleRssiInterval({
107
+ this.ndx.startBleGattRssiPolling({
108
108
  deviceUuid: this.uuid,
109
109
  intervalMs: this.rssiIntervalMs,
110
110
  onRssi: (rssi: number) => {
@@ -114,8 +114,8 @@ export default class BleDeviceController implements BleController {
114
114
  }
115
115
  }
116
116
 
117
- private startBleBackend() {
118
- const { status, error } = this.ndx.startBleBackend({
117
+ private startBleGattBackend() {
118
+ const { status, error } = this.ndx.startBleGattBackend({
119
119
  deviceUuid: this.uuid,
120
120
  onConnected: (peripheral: NativePeripheral) => {
121
121
  const { name } = peripheral
@@ -136,7 +136,7 @@ export default class BleDeviceController implements BleController {
136
136
  if (this.connected) {
137
137
  resolve()
138
138
  } else {
139
- BleDeviceController.setTimeout(checkConnected, 100)
139
+ BleGattController.setTimeout(checkConnected, 100)
140
140
  }
141
141
  }
142
142
  checkConnected()
@@ -145,10 +145,7 @@ export default class BleDeviceController implements BleController {
145
145
 
146
146
  private async waitToDiscoverServices() {
147
147
  await new Promise<void>((resolve) =>
148
- BleDeviceController.setTimeout(
149
- resolve,
150
- BleDeviceController.waitAfterMs
151
- )
148
+ BleGattController.setTimeout(resolve, BleGattController.waitAfterMs)
152
149
  )
153
150
  }
154
151
 
@@ -156,7 +153,7 @@ export default class BleDeviceController implements BleController {
156
153
  charUuid: CharacteristicUuid,
157
154
  value: string
158
155
  ) {
159
- const { status, error } = this.ndx.writeBleCharacteristic({
156
+ const { status, error } = this.ndx.writeBleGattChar({
160
157
  deviceUuid: this.uuid,
161
158
  charUuid,
162
159
  value,
@@ -168,7 +165,7 @@ export default class BleDeviceController implements BleController {
168
165
  public async subscribeCharacteristics(
169
166
  charCallbacks: CharacteristicCallbacks
170
167
  ) {
171
- const { status, error } = this.ndx.addBleCharCallbacks({
168
+ const { status, error } = this.ndx.registerBleGattCharCallbacks({
172
169
  deviceUuid: this.uuid,
173
170
  charCallbacks,
174
171
  })
@@ -179,7 +176,7 @@ export default class BleDeviceController implements BleController {
179
176
  }
180
177
 
181
178
  public async disconnect() {
182
- const { status, error } = this.ndx.stopBleBackend({
179
+ const { status, error } = this.ndx.stopBleGattBackend({
183
180
  deviceUuid: this.uuid,
184
181
  })
185
182
 
@@ -196,11 +193,11 @@ export default class BleDeviceController implements BleController {
196
193
  }
197
194
 
198
195
  private get ndx() {
199
- return BleDeviceController.ndx
196
+ return BleGattController.ndx
200
197
  }
201
198
  }
202
199
 
203
- export interface BleController {
200
+ export interface BleGatt {
204
201
  uuid: string
205
202
  name: string
206
203
 
@@ -218,7 +215,7 @@ export interface BleController {
218
215
  disconnect(): Promise<void>
219
216
  }
220
217
 
221
- export type BleControllerOptions = {
218
+ export type BleGattOptions = {
222
219
  charCallbacks: CharacteristicCallbacks
223
220
  onConnected?: (peripheral: NativePeripheral) => void
224
221
  rssiIntervalMs?: number
@@ -227,9 +224,7 @@ export type BleControllerOptions = {
227
224
  | { deviceUuid?: string; deviceNamePrefix: string }
228
225
  )
229
226
 
230
- export type BleControllerConstructor = new (
231
- options: BleControllerOptions
232
- ) => BleController
227
+ export type BleGattConstructor = new (options: BleGattOptions) => BleGatt
233
228
 
234
229
  export type CharacteristicCallbacks = {
235
230
  charUuid: string
@@ -0,0 +1,62 @@
1
+ import { LibndxAdapter } from '@neurodevs/ndx-native'
2
+
3
+ export default class BleObserverController implements BleObserver {
4
+ public static Class?: BleObserverConstructor
5
+
6
+ private readonly deviceUuid: string
7
+ private readonly ndx = LibndxAdapter.getInstance()
8
+
9
+ protected constructor(options: BleObserverOptions) {
10
+ const { deviceUuid } = options
11
+
12
+ this.deviceUuid = deviceUuid ?? ''
13
+ }
14
+
15
+ public static Create(options: BleObserverOptions) {
16
+ return new (this.Class ?? this)(options)
17
+ }
18
+
19
+ public async startObserving() {
20
+ this.createBleObserverBackend()
21
+ this.startBleObserverBackend()
22
+ }
23
+
24
+ private createBleObserverBackend() {
25
+ this.ndx.createBleObserverBackend({
26
+ deviceUuid: this.deviceUuid,
27
+ })
28
+ }
29
+
30
+ private startBleObserverBackend() {
31
+ this.ndx.startBleObserverBackend({
32
+ deviceUuid: this.deviceUuid,
33
+ onAdvertisement: (
34
+ _data: Buffer,
35
+ _length: number,
36
+ _timestampSec: number
37
+ ) => {},
38
+ })
39
+ }
40
+
41
+ public async stopObserving() {
42
+ this.stopBleObserverBackend()
43
+ }
44
+
45
+ private stopBleObserverBackend() {
46
+ this.ndx.stopBleObserverBackend({
47
+ deviceUuid: this.deviceUuid,
48
+ })
49
+ }
50
+ }
51
+ export interface BleObserver {
52
+ startObserving(): Promise<void>
53
+ stopObserving(): Promise<void>
54
+ }
55
+
56
+ export type BleObserverConstructor = new (
57
+ options: BleObserverOptions
58
+ ) => BleObserver
59
+
60
+ export type BleObserverOptions = {
61
+ deviceUuid: string
62
+ }
@@ -1,65 +1,63 @@
1
1
  import { LibndxAdapter } from '@neurodevs/ndx-native'
2
2
 
3
- export default class UsbDeviceController implements UsbController {
4
- public static Class?: UsbControllerConstructor
3
+ export default class UsbDeviceController implements UsbDevice {
4
+ public static Class?: UsbDeviceConstructor
5
5
 
6
6
  private onData: (data: Buffer, length: number, timestampSec: number) => void
7
7
  private serialNumber: string
8
8
 
9
9
  private ndx = LibndxAdapter.getInstance()
10
10
 
11
- protected constructor(options: UsbControllerOptions) {
11
+ protected constructor(options: UsbDeviceOptions) {
12
12
  const { onData, serialNumber } = options ?? {}
13
13
 
14
14
  this.onData = onData
15
15
  this.serialNumber = serialNumber ?? ''
16
16
  }
17
17
 
18
- public static Create(options: UsbControllerOptions) {
18
+ public static Create(options: UsbDeviceOptions) {
19
19
  return new (this.Class ?? this)(options)
20
20
  }
21
21
 
22
22
  public async connect() {
23
- this.ndx.createUsbBackend(this.usbControllerOptions)
24
- this.ndx.startUsbBackend(this.startUsbControllerOptions)
23
+ this.ndx.createUsbBackend(this.usbDeviceOptions)
24
+ this.ndx.startUsbBackend(this.startUsbDeviceOptions)
25
25
  }
26
26
 
27
- private get usbControllerOptions() {
27
+ private get usbDeviceOptions() {
28
28
  return {
29
29
  serialNumber: this.serialNumber,
30
30
  }
31
31
  }
32
32
 
33
- private get startUsbControllerOptions() {
33
+ private get startUsbDeviceOptions() {
34
34
  return {
35
- ...this.usbControllerOptions,
35
+ ...this.usbDeviceOptions,
36
36
  onData: this.onData,
37
37
  }
38
38
  }
39
39
 
40
40
  public async writeUsb(value: string) {
41
41
  this.ndx.writeUsbBackend({
42
- ...this.usbControllerOptions,
42
+ ...this.usbDeviceOptions,
43
43
  value,
44
44
  })
45
45
  }
46
46
 
47
47
  public async disconnect() {
48
- this.ndx.stopUsbBackend(this.usbControllerOptions)
48
+ this.ndx.stopUsbBackend(this.usbDeviceOptions)
49
49
  }
50
50
  }
51
51
 
52
- export interface UsbController {
52
+ export interface UsbDevice {
53
53
  connect(): Promise<void>
54
54
  writeUsb(value: string): Promise<void>
55
55
  disconnect(): Promise<void>
56
56
  }
57
57
 
58
- export interface UsbControllerOptions {
58
+ export interface UsbDeviceOptions {
59
59
  onData: (data: Buffer, length: number, timestampSec: number) => void
60
60
  serialNumber?: string
61
61
  }
62
62
 
63
- export type UsbControllerConstructor = new (
64
- options?: UsbControllerOptions
65
- ) => UsbController
63
+ export type UsbDeviceConstructor = new (options?: UsbDeviceOptions) => UsbDevice