@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.
- package/README.md +6 -6
- package/build/__tests__/AbstractPackageTest.d.ts +12 -11
- package/build/__tests__/AbstractPackageTest.js +32 -34
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/{BleDeviceController.test.d.ts → BleGattController.test.d.ts} +3 -3
- package/build/__tests__/impl/{BleDeviceController.test.js → BleGattController.test.js} +68 -70
- package/build/__tests__/impl/BleGattController.test.js.map +1 -0
- package/build/__tests__/impl/BleObserverController.test.d.ts +12 -0
- package/build/__tests__/impl/BleObserverController.test.js +62 -0
- package/build/__tests__/impl/BleObserverController.test.js.map +1 -0
- package/build/__tests__/impl/{LslEventMarkerEmitter.test.d.ts → LslEventMarkerOutlet.test.d.ts} +3 -3
- package/build/__tests__/impl/{LslEventMarkerEmitter.test.js → LslEventMarkerOutlet.test.js} +45 -46
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +1 -0
- package/build/__tests__/impl/LslJsonOutlet.test.d.ts +14 -0
- package/build/__tests__/impl/LslJsonOutlet.test.js +118 -0
- package/build/__tests__/impl/LslJsonOutlet.test.js.map +1 -0
- package/build/__tests__/impl/LslStreamInfo.test.js +2 -3
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +3 -5
- package/build/__tests__/impl/LslStreamInlet.test.js +13 -47
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamOutlet.test.js +7 -13
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js +9 -11
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/__tests__/impl/UsbDeviceController.test.js.map +1 -1
- package/build/__tests__/impl/WindowedClockRegressor.test.js +1 -1
- package/build/__tests__/impl/WindowedClockRegressor.test.js.map +1 -1
- package/build/assertions.js +1 -1
- package/build/assertions.js.map +1 -1
- package/build/impl/LslEventMarkerOutlet.d.ts +35 -0
- package/build/impl/{LslEventMarkerEmitter.js → LslEventMarkerOutlet.js} +2 -2
- package/build/impl/LslEventMarkerOutlet.js.map +1 -0
- package/build/impl/LslJsonOutlet.d.ts +33 -0
- package/build/impl/LslJsonOutlet.js +44 -0
- package/build/impl/LslJsonOutlet.js.map +1 -0
- package/build/impl/LslStreamInfo.d.ts +7 -7
- package/build/impl/LslStreamInfo.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +63 -21
- package/build/impl/LslStreamInlet.js +221 -65
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +16 -16
- package/build/impl/LslStreamOutlet.js +32 -36
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +10 -10
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/impl/clocks/WindowedClockRegressor.js.map +1 -0
- package/build/impl/controllers/{BleDeviceController.d.ts → BleGattController.d.ts} +10 -10
- package/build/impl/controllers/{BleDeviceController.js → BleGattController.js} +19 -19
- package/build/impl/controllers/BleGattController.js.map +1 -0
- package/build/impl/controllers/BleObserverController.d.ts +20 -0
- package/build/impl/controllers/BleObserverController.js +37 -0
- package/build/impl/controllers/BleObserverController.js.map +1 -0
- package/build/impl/controllers/UsbDeviceController.d.ts +9 -9
- package/build/impl/controllers/UsbDeviceController.js +7 -7
- package/build/impl/controllers/UsbDeviceController.js.map +1 -1
- package/build/index.d.ts +43 -31
- package/build/index.js +52 -39
- package/build/index.js.map +1 -1
- package/build/scripts/{runLslEventMarkerEmitter.js → runEventMarkerOutlet.js} +4 -3
- package/build/scripts/runEventMarkerOutlet.js.map +1 -0
- package/build/scripts/{runLslStreamOutlet.js → runLslOutlet.js} +1 -1
- package/build/scripts/runLslOutlet.js.map +1 -0
- package/build/scripts/runMuse.js +2 -2
- package/build/scripts/runMuse.js.map +1 -1
- package/build/testDoubles/{BleController/FakeBleController.d.ts → BleGatt/FakeBleGatt.d.ts} +6 -6
- package/build/testDoubles/{BleController/FakeBleController.js → BleGatt/FakeBleGatt.js} +8 -8
- package/build/testDoubles/BleGatt/FakeBleGatt.js.map +1 -0
- package/build/testDoubles/{BleController/SpyBleController.d.ts → BleGatt/SpyBleGatt.d.ts} +4 -4
- package/build/testDoubles/{BleController/SpyBleController.js → BleGatt/SpyBleGatt.js} +3 -3
- package/build/testDoubles/BleGatt/SpyBleGatt.js.map +1 -0
- package/build/testDoubles/BleObserver/FakeBleObserver.d.ts +10 -0
- package/build/testDoubles/BleObserver/FakeBleObserver.js +20 -0
- package/build/testDoubles/BleObserver/FakeBleObserver.js.map +1 -0
- package/build/testDoubles/ClockRegressor/FakeClockRegressor.d.ts +1 -1
- package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.d.ts → EventMarkerOutlet/FakeEventMarkerOutlet.d.ts} +4 -4
- package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.js → EventMarkerOutlet/FakeEventMarkerOutlet.js} +7 -7
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +1 -0
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +10 -0
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +23 -0
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +1 -0
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +9 -0
- package/build/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.js → EventMarkerOutlet/ThrowingEventMarkerOutlet.js} +2 -2
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +1 -0
- package/build/testDoubles/JsonOutlet/FakeJsonOutlet.d.ts +10 -0
- package/build/testDoubles/JsonOutlet/FakeJsonOutlet.js +20 -0
- package/build/testDoubles/JsonOutlet/FakeJsonOutlet.js.map +1 -0
- package/build/testDoubles/{StreamInfo/FakeStreamInfo.d.ts → LslInfo/FakeLslInfo.d.ts} +4 -4
- package/build/testDoubles/{StreamInfo/FakeStreamInfo.js → LslInfo/FakeLslInfo.js} +7 -7
- package/build/testDoubles/LslInfo/FakeLslInfo.js.map +1 -0
- package/build/testDoubles/LslInfo/SpyLslInfo.d.ts +10 -0
- package/build/testDoubles/{StreamInfo/SpyStreamInfo.js → LslInfo/SpyLslInfo.js} +4 -4
- package/build/testDoubles/LslInfo/SpyLslInfo.js.map +1 -0
- package/build/testDoubles/{StreamInlet/FakeStreamInlet.d.ts → LslInlet/FakeLslInlet.d.ts} +4 -4
- package/build/testDoubles/{StreamInlet/FakeStreamInlet.js → LslInlet/FakeLslInlet.js} +12 -11
- package/build/testDoubles/LslInlet/FakeLslInlet.js.map +1 -0
- package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +4 -0
- package/build/testDoubles/{StreamInlet/SpyStreamInlet.js → LslInlet/SpyLslInlet.js} +2 -2
- package/build/testDoubles/LslInlet/SpyLslInlet.js.map +1 -0
- package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.d.ts → LslOutlet/FakeLslOutlet.d.ts} +5 -5
- package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.js → LslOutlet/FakeLslOutlet.js} +8 -8
- package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +1 -0
- package/build/testDoubles/LslWsBridge/FakeLslWsBridge.d.ts +14 -0
- package/build/testDoubles/{WebSocketBridge/FakeWebSocketBridge.js → LslWsBridge/FakeLslWsBridge.js} +14 -14
- package/build/testDoubles/LslWsBridge/FakeLslWsBridge.js.map +1 -0
- package/build/testDoubles/LslWsBridge/SpyLslWsBridge.d.ts +4 -0
- package/build/testDoubles/{WebSocketBridge/SpyLslWebSocketBridge.js → LslWsBridge/SpyLslWsBridge.js} +2 -2
- package/build/testDoubles/LslWsBridge/SpyLslWsBridge.js.map +1 -0
- package/build/testDoubles/UsbDevice/FakeUsbDevice.d.ts +12 -0
- package/build/testDoubles/UsbDevice/FakeUsbDevice.js +25 -0
- package/build/testDoubles/UsbDevice/FakeUsbDevice.js.map +1 -0
- package/build/testDoubles/consts.d.ts +2 -12
- package/build/testDoubles/consts.js +0 -20
- package/build/testDoubles/consts.js.map +1 -1
- package/build/testDoubles/generateRandomOutletOptions.d.ts +2 -2
- package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
- package/package.json +5 -4
- package/src/__tests__/AbstractPackageTest.ts +35 -42
- package/src/__tests__/impl/{BleDeviceController.test.ts → BleGattController.test.ts} +45 -47
- package/src/__tests__/impl/BleObserverController.test.ts +72 -0
- package/src/__tests__/impl/{LslEventMarkerEmitter.test.ts → LslEventMarkerOutlet.test.ts} +33 -37
- package/src/__tests__/impl/LslJsonOutlet.test.ts +135 -0
- package/src/__tests__/impl/LslStreamInfo.test.ts +8 -9
- package/src/__tests__/impl/LslStreamInlet.test.ts +21 -79
- package/src/__tests__/impl/LslStreamOutlet.test.ts +17 -25
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +15 -19
- package/src/__tests__/impl/UsbDeviceController.test.ts +2 -2
- package/src/__tests__/impl/WindowedClockRegressor.test.ts +1 -1
- package/src/assertions.ts +1 -2
- package/src/impl/{LslEventMarkerEmitter.ts → LslEventMarkerOutlet.ts} +17 -17
- package/src/impl/LslJsonOutlet.ts +87 -0
- package/src/impl/LslStreamInfo.ts +7 -9
- package/src/impl/LslStreamInlet.ts +305 -81
- package/src/impl/LslStreamOutlet.ts +62 -59
- package/src/impl/LslWebSocketBridge.ts +15 -18
- package/src/impl/controllers/{BleDeviceController.ts → BleGattController.ts} +23 -28
- package/src/impl/controllers/BleObserverController.ts +62 -0
- package/src/impl/controllers/UsbDeviceController.ts +14 -16
- package/src/index.ts +64 -44
- package/src/scripts/{runLslEventMarkerEmitter.ts → runEventMarkerOutlet.ts} +3 -2
- package/src/scripts/runMuse.ts +2 -2
- package/src/testDoubles/{BleController/FakeBleController.ts → BleGatt/FakeBleGatt.ts} +14 -14
- package/src/testDoubles/{BleController/SpyBleController.ts → BleGatt/SpyBleGatt.ts} +5 -5
- package/src/testDoubles/BleObserver/FakeBleObserver.ts +28 -0
- package/src/testDoubles/ClockRegressor/FakeClockRegressor.ts +1 -1
- package/src/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.ts → EventMarkerOutlet/FakeEventMarkerOutlet.ts} +11 -11
- package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +31 -0
- package/src/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.ts → EventMarkerOutlet/ThrowingEventMarkerOutlet.ts} +5 -5
- package/src/testDoubles/JsonOutlet/FakeJsonOutlet.ts +25 -0
- package/src/testDoubles/{StreamInfo/FakeStreamInfo.ts → LslInfo/FakeLslInfo.ts} +9 -9
- package/src/testDoubles/{StreamInfo/SpyStreamInfo.ts → LslInfo/SpyLslInfo.ts} +5 -5
- package/src/testDoubles/{StreamInlet/FakeStreamInlet.ts → LslInlet/FakeLslInlet.ts} +15 -14
- package/src/testDoubles/LslInlet/SpyLslInlet.ts +10 -0
- package/src/testDoubles/{StreamOutlet/FakeStreamOutlet.ts → LslOutlet/FakeLslOutlet.ts} +11 -14
- package/src/testDoubles/{WebSocketBridge/FakeWebSocketBridge.ts → LslWsBridge/FakeLslWsBridge.ts} +19 -19
- package/src/testDoubles/LslWsBridge/SpyLslWsBridge.ts +9 -0
- package/src/testDoubles/UsbDevice/FakeUsbDevice.ts +34 -0
- package/src/testDoubles/consts.ts +3 -23
- package/src/testDoubles/generateRandomOutletOptions.ts +2 -2
- package/build/__tests__/impl/BleDeviceController.test.js.map +0 -1
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +0 -1
- package/build/consts.d.ts +0 -11
- package/build/consts.js +0 -21
- package/build/consts.js.map +0 -1
- package/build/impl/LslEventMarkerEmitter.d.ts +0 -35
- package/build/impl/LslEventMarkerEmitter.js.map +0 -1
- package/build/impl/WindowedClockRegressor.js.map +0 -1
- package/build/impl/controllers/BleDeviceController.js.map +0 -1
- package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +0 -22
- package/build/impl/workers/inlet/LslStreamInlet.worker.js +0 -42
- package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +0 -1
- package/build/impl/workers/inlet/StreamInletWorker.d.ts +0 -73
- package/build/impl/workers/inlet/StreamInletWorker.js +0 -253
- package/build/impl/workers/inlet/StreamInletWorker.js.map +0 -1
- package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +0 -32
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js +0 -82
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +0 -1
- package/build/scripts/discoverMuse.js +0 -40
- package/build/scripts/discoverMuse.js.map +0 -1
- package/build/scripts/runLslEventMarkerEmitter.js.map +0 -1
- package/build/scripts/runLslStreamOutlet.d.ts +0 -1
- package/build/scripts/runLslStreamOutlet.js.map +0 -1
- package/build/scripts/testDestroyOutlet.d.ts +0 -1
- package/build/scripts/testDestroyOutlet.js +0 -4
- package/build/scripts/testDestroyOutlet.js.map +0 -1
- package/build/testDoubles/BleController/FakeBleController.js.map +0 -1
- package/build/testDoubles/BleController/SpyBleController.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.d.ts +0 -10
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js +0 -23
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +0 -9
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +0 -1
- package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +0 -10
- package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +0 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +0 -1
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +0 -4
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +0 -1
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +0 -1
- package/build/testDoubles/UsbController/FakeUsbController.d.ts +0 -12
- package/build/testDoubles/UsbController/FakeUsbController.js +0 -25
- package/build/testDoubles/UsbController/FakeUsbController.js.map +0 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +0 -14
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +0 -1
- package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.d.ts +0 -4
- package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js.map +0 -1
- package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +0 -27
- package/build/testDoubles/WorkerThreads/FakeWorker.js +0 -67
- package/build/testDoubles/WorkerThreads/FakeWorker.js.map +0 -1
- package/src/consts.ts +0 -21
- package/src/impl/workers/inlet/LslStreamInlet.worker.ts +0 -74
- package/src/impl/workers/inlet/StreamInletWorker.ts +0 -348
- package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +0 -144
- package/src/scripts/discoverMuse.ts +0 -50
- package/src/scripts/testDestroyOutlet.ts +0 -5
- package/src/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.ts +0 -31
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +0 -10
- package/src/testDoubles/UsbController/FakeUsbController.ts +0 -34
- package/src/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.ts +0 -9
- package/src/testDoubles/WorkerThreads/FakeWorker.ts +0 -99
- /package/build/impl/{WindowedClockRegressor.d.ts → clocks/WindowedClockRegressor.d.ts} +0 -0
- /package/build/impl/{WindowedClockRegressor.js → clocks/WindowedClockRegressor.js} +0 -0
- /package/build/scripts/{discoverMuse.d.ts → runEventMarkerOutlet.d.ts} +0 -0
- /package/build/scripts/{runLslEventMarkerEmitter.d.ts → runLslOutlet.d.ts} +0 -0
- /package/src/impl/{WindowedClockRegressor.ts → clocks/WindowedClockRegressor.ts} +0 -0
- /package/src/scripts/{runLslStreamOutlet.ts → runLslOutlet.ts} +0 -0
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
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
|
|
14
|
-
public static Class?:
|
|
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
|
|
37
|
+
private info!: LslInfo
|
|
38
|
+
private handle!: OutletHandle
|
|
39
|
+
private pushSampleToLsl!: (opts: unknown) => LslErrorCode
|
|
31
40
|
|
|
32
|
-
protected constructor(options:
|
|
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:
|
|
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.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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<
|
|
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
|
|
136
|
-
this.
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
146
|
-
this.worker.postMessage({
|
|
147
|
-
type: 'destroyOutlet',
|
|
148
|
-
})
|
|
150
|
+
LslStreamOutlet.handleLslError(errorCode)
|
|
149
151
|
}
|
|
150
152
|
|
|
151
|
-
|
|
152
|
-
|
|
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
|
|
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
|
|
179
|
-
options: StreamOutletOptions
|
|
180
|
-
) => StreamOutlet
|
|
181
|
+
export type LslOutletConstructor = new (options: LslOutletOptions) => LslOutlet
|
|
181
182
|
|
|
182
|
-
export interface
|
|
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
|
|
9
|
-
public static Class?:
|
|
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:
|
|
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:
|
|
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:
|
|
26
|
+
public static async Create(options: LslWsBridgeOptions) {
|
|
30
27
|
const { listenPort, connectUrls, ...rest } = options
|
|
31
|
-
const inletOptions:
|
|
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:
|
|
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
|
|
164
|
+
export interface LslWsBridge {
|
|
168
165
|
activate(): Promise<void>
|
|
169
166
|
deactivate(): void
|
|
170
167
|
destroy(): void
|
|
171
168
|
}
|
|
172
169
|
|
|
173
|
-
export type
|
|
174
|
-
options:
|
|
175
|
-
) =>
|
|
170
|
+
export type LslWsBridgeConstructor = new (
|
|
171
|
+
options: LslWsBridgeConstructorOptions
|
|
172
|
+
) => LslWsBridge
|
|
176
173
|
|
|
177
|
-
export interface
|
|
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
|
|
185
|
-
inlet:
|
|
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
|
|
4
|
-
public static Class?:
|
|
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:
|
|
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
|
|
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.
|
|
57
|
-
this.
|
|
56
|
+
this.createBleGattBackend()
|
|
57
|
+
this.startBleGattBackend()
|
|
58
58
|
|
|
59
59
|
await this.waitForOnConnected()
|
|
60
60
|
await this.waitToDiscoverServices()
|
|
61
61
|
|
|
62
|
-
this.
|
|
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
|
-
|
|
84
|
+
BleGattController.setTimeout(checkDiscovered, 100)
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
checkDiscovered()
|
|
88
88
|
})
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
private
|
|
92
|
-
const { status, error } = this.ndx.
|
|
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
|
|
105
|
+
private startBleGattRssiPolling() {
|
|
106
106
|
if (this.rssiIntervalMs) {
|
|
107
|
-
this.ndx.
|
|
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
|
|
118
|
-
const { status, error } = this.ndx.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
196
|
+
return BleGattController.ndx
|
|
200
197
|
}
|
|
201
198
|
}
|
|
202
199
|
|
|
203
|
-
export interface
|
|
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
|
|
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
|
|
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
|
|
4
|
-
public static Class?:
|
|
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:
|
|
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:
|
|
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.
|
|
24
|
-
this.ndx.startUsbBackend(this.
|
|
23
|
+
this.ndx.createUsbBackend(this.usbDeviceOptions)
|
|
24
|
+
this.ndx.startUsbBackend(this.startUsbDeviceOptions)
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
private get
|
|
27
|
+
private get usbDeviceOptions() {
|
|
28
28
|
return {
|
|
29
29
|
serialNumber: this.serialNumber,
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
private get
|
|
33
|
+
private get startUsbDeviceOptions() {
|
|
34
34
|
return {
|
|
35
|
-
...this.
|
|
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.
|
|
42
|
+
...this.usbDeviceOptions,
|
|
43
43
|
value,
|
|
44
44
|
})
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
public async disconnect() {
|
|
48
|
-
this.ndx.stopUsbBackend(this.
|
|
48
|
+
this.ndx.stopUsbBackend(this.usbDeviceOptions)
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
export interface
|
|
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
|
|
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
|
|
64
|
-
options?: UsbControllerOptions
|
|
65
|
-
) => UsbController
|
|
63
|
+
export type UsbDeviceConstructor = new (options?: UsbDeviceOptions) => UsbDevice
|