@neurodevs/node-lsl 17.1.1 → 18.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/.claude/settings.local.json +10 -0
- package/.regressionproof.json +7 -0
- package/.vscode/launch.json +3 -2
- package/README.md +9 -35
- package/build/.spruce/settings.json +5 -1
- package/build/__tests__/AbstractPackageTest.d.ts +4 -4
- package/build/__tests__/AbstractPackageTest.js +9 -11
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/LslBackpressureMonitor.test.d.ts +7 -0
- package/build/__tests__/impl/LslBackpressureMonitor.test.js +26 -0
- package/build/__tests__/impl/LslBackpressureMonitor.test.js.map +1 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.d.ts +34 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js +243 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -0
- package/build/__tests__/impl/LslStreamInfo.test.d.ts +0 -3
- package/build/__tests__/impl/LslStreamInfo.test.js +2 -27
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +20 -8
- package/build/__tests__/impl/LslStreamInlet.test.js +224 -69
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamOutlet.test.d.ts +3 -7
- package/build/__tests__/impl/LslStreamOutlet.test.js +36 -46
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js +16 -17
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/assertions.d.ts +1 -1
- package/build/assertions.js.map +1 -1
- package/build/impl/LslBackpressureMonitor.d.ts +8 -0
- package/build/impl/LslBackpressureMonitor.js +8 -0
- package/build/impl/LslBackpressureMonitor.js.map +1 -0
- package/build/impl/LslEventMarkerEmitter.d.ts +35 -0
- package/build/impl/LslEventMarkerEmitter.js +86 -0
- package/build/impl/LslEventMarkerEmitter.js.map +1 -0
- package/build/impl/LslStreamInfo.d.ts +4 -8
- package/build/impl/LslStreamInfo.js +8 -21
- package/build/impl/LslStreamInfo.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +31 -50
- package/build/impl/LslStreamInlet.js +79 -149
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +15 -18
- package/build/impl/LslStreamOutlet.js +39 -47
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +4 -5
- package/build/impl/LslWebSocketBridge.js +8 -8
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +22 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.js +42 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +1 -0
- package/build/impl/workers/inlet/StreamInletWorker.d.ts +73 -0
- package/build/impl/workers/inlet/StreamInletWorker.js +253 -0
- package/build/impl/workers/inlet/StreamInletWorker.js.map +1 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +32 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js +82 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +1 -0
- package/build/index.d.ts +12 -14
- package/build/index.js +14 -16
- package/build/index.js.map +1 -1
- package/build/scripts/finalizeHandles.d.ts +2 -0
- package/build/scripts/finalizeHandles.js +48 -0
- package/build/scripts/finalizeHandles.js.map +1 -0
- package/build/scripts/runLslEventMarkerEmitter.js +11 -0
- package/build/scripts/runLslEventMarkerEmitter.js.map +1 -0
- package/build/scripts/runOutletToInlet.js +7 -6
- package/build/scripts/runOutletToInlet.js.map +1 -1
- package/build/scripts/testDestroyOutlet.d.ts +1 -0
- package/build/scripts/testDestroyOutlet.js +4 -0
- package/build/scripts/testDestroyOutlet.js.map +1 -0
- package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.d.ts +6 -0
- package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.js +10 -0
- package/build/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.d.ts +17 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js +30 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.d.ts +10 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js +23 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +9 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js +19 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +3 -3
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js +3 -3
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +8 -10
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js +6 -7
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +2 -5
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js +2 -8
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +7 -9
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +5 -8
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +1 -1
- package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +27 -0
- package/build/testDoubles/WorkerThreads/FakeWorker.js +67 -0
- package/build/testDoubles/WorkerThreads/FakeWorker.js.map +1 -0
- package/build/validations.js +0 -2
- package/build/validations.js.map +1 -1
- package/package.json +23 -7
- package/src/.spruce/settings.json +5 -1
- package/src/__tests__/AbstractPackageTest.ts +12 -14
- package/src/__tests__/impl/LslBackpressureMonitor.test.ts +25 -0
- package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +322 -0
- package/src/__tests__/impl/LslStreamInfo.test.ts +3 -40
- package/src/__tests__/impl/LslStreamInlet.test.ts +344 -97
- package/src/__tests__/impl/LslStreamOutlet.test.ts +61 -69
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +18 -18
- package/src/assertions.ts +2 -1
- package/src/impl/LslBackpressureMonitor.ts +13 -0
- package/src/impl/LslEventMarkerEmitter.ts +133 -0
- package/src/impl/LslStreamInfo.ts +17 -29
- package/src/impl/LslStreamInlet.ts +102 -215
- package/src/impl/LslStreamOutlet.ts +54 -78
- package/src/impl/LslWebSocketBridge.ts +12 -12
- package/src/impl/workers/inlet/LslStreamInlet.worker.ts +74 -0
- package/src/impl/workers/inlet/StreamInletWorker.ts +348 -0
- package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +144 -0
- package/src/index.ts +14 -17
- package/src/scripts/finalizeHandles.ts +63 -0
- package/src/scripts/runLslEventMarkerEmitter.ts +15 -0
- package/src/scripts/runOutletToInlet.ts +10 -8
- package/src/scripts/testDestroyOutlet.ts +5 -0
- package/src/testDoubles/BackpressureMonitor/FakeBackpressureMonitor.ts +13 -0
- package/src/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.ts +46 -0
- package/src/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.ts +31 -0
- package/src/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.ts +29 -0
- package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +4 -4
- package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +11 -17
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +3 -16
- package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +12 -15
- package/src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts +1 -1
- package/src/testDoubles/WorkerThreads/FakeWorker.ts +99 -0
- package/src/validations.ts +0 -2
- package/build/__tests__/impl/LiblslAdapter.test.d.ts +0 -79
- package/build/__tests__/impl/LiblslAdapter.test.js +0 -688
- package/build/__tests__/impl/LiblslAdapter.test.js.map +0 -1
- package/build/__tests__/impl/LslEventMarkerOutlet.test.d.ts +0 -21
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js +0 -160
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +0 -1
- package/build/handleError.d.ts +0 -8
- package/build/handleError.js +0 -25
- package/build/handleError.js.map +0 -1
- package/build/impl/LiblslAdapter.d.ts +0 -154
- package/build/impl/LiblslAdapter.js +0 -317
- package/build/impl/LiblslAdapter.js.map +0 -1
- package/build/impl/LslEventMarkerOutlet.d.ts +0 -28
- package/build/impl/LslEventMarkerOutlet.js +0 -63
- package/build/impl/LslEventMarkerOutlet.js.map +0 -1
- package/build/scripts/runLslEventMarkerOutlet.js +0 -18
- package/build/scripts/runLslEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.d.ts +0 -13
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js +0 -26
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.d.ts +0 -17
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js +0 -46
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +0 -19
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js +0 -19
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +0 -50
- package/build/testDoubles/Liblsl/FakeLiblsl.js +0 -126
- package/build/testDoubles/Liblsl/FakeLiblsl.js.map +0 -1
- package/src/__tests__/impl/LiblslAdapter.test.ts +0 -817
- package/src/__tests__/impl/LslEventMarkerOutlet.test.ts +0 -195
- package/src/handleError.ts +0 -24
- package/src/impl/LiblslAdapter.ts +0 -543
- package/src/impl/LslEventMarkerOutlet.ts +0 -97
- package/src/scripts/runLslEventMarkerOutlet.ts +0 -23
- package/src/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.ts +0 -36
- package/src/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.ts +0 -75
- package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +0 -24
- package/src/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.ts +0 -28
- package/src/testDoubles/Liblsl/FakeLiblsl.ts +0 -182
- /package/build/scripts/{runLslEventMarkerOutlet.d.ts → runLslEventMarkerEmitter.d.ts} +0 -0
|
@@ -1,69 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { StreamInfo } from './LslStreamInfo.js';
|
|
1
|
+
import { Worker } from 'node:worker_threads';
|
|
3
2
|
export default class LslStreamInlet implements StreamInlet {
|
|
4
3
|
static Class?: StreamInletConstructor;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
private
|
|
4
|
+
static Worker: typeof Worker;
|
|
5
|
+
static waitAfterOpenStreamMs: number;
|
|
6
|
+
private sourceId;
|
|
8
7
|
private chunkSize;
|
|
9
8
|
private maxBufferedMs;
|
|
10
|
-
private
|
|
9
|
+
private pullTimeoutMs;
|
|
10
|
+
private openStreamTimeoutMs;
|
|
11
|
+
private waitAfterOpenStreamMs;
|
|
12
|
+
private waitBetweenPullsMs;
|
|
13
|
+
private flushInletOnStop;
|
|
11
14
|
private onData;
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
private dataBuffer;
|
|
15
|
-
private wrappedDataBufferPtr;
|
|
16
|
-
private dataBufferPtr;
|
|
17
|
-
private timestampBuffer;
|
|
18
|
-
private wrappedTimestampBufferPtr;
|
|
19
|
-
private timestampBufferPtr;
|
|
20
|
-
private errorCodeBuffer;
|
|
21
|
-
private wrappedErrorCodeBufferPtr;
|
|
22
|
-
private errorCodeBufferPtr;
|
|
15
|
+
private worker;
|
|
16
|
+
private workerReady;
|
|
23
17
|
private readonly sixMinutesInMs;
|
|
24
|
-
private
|
|
25
|
-
|
|
18
|
+
private readonly aboutOneYearInMs;
|
|
19
|
+
isRunning: boolean;
|
|
20
|
+
protected constructor(options: StreamInletOptions, onData: OnDataCallback);
|
|
26
21
|
static Create(options: StreamInletOptions, onData: OnDataCallback): Promise<StreamInlet>;
|
|
27
|
-
private
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
private createDataBuffer;
|
|
32
|
-
private readonly bytesPerFloat;
|
|
33
|
-
private createTimestampBuffer;
|
|
34
|
-
private readonly bytesPerDouble;
|
|
35
|
-
private createErrorCodeBuffer;
|
|
36
|
-
private readonly bytesPerInt;
|
|
37
|
-
private createPointersToBuffers;
|
|
38
|
-
private createDataBufferPtr;
|
|
39
|
-
private createTimestampBufferPtr;
|
|
40
|
-
private createErrorCodeBufferPtr;
|
|
41
|
-
private pullOnLoop;
|
|
42
|
-
private pullSample;
|
|
43
|
-
private callPullSampleBinding;
|
|
44
|
-
private createFloatArrayFromDataBuffer;
|
|
45
|
-
private pullChunk;
|
|
46
|
-
private callPullChunkBinding;
|
|
47
|
-
private createDoubleArrayFromTimestampBuffer;
|
|
48
|
-
private handleErrorCodeIfPresent;
|
|
22
|
+
private createWorkerThread;
|
|
23
|
+
startPulling(): Promise<void>;
|
|
24
|
+
private postCreate;
|
|
25
|
+
private postStartPulling;
|
|
49
26
|
stopPulling(): void;
|
|
50
|
-
|
|
27
|
+
flushInlet(): void;
|
|
51
28
|
destroy(): void;
|
|
52
|
-
private
|
|
29
|
+
private get defaultWaitMs();
|
|
30
|
+
private get Worker();
|
|
53
31
|
}
|
|
54
32
|
export interface StreamInlet {
|
|
55
|
-
startPulling(): void
|
|
33
|
+
startPulling(): Promise<void>;
|
|
56
34
|
stopPulling(): void;
|
|
57
|
-
|
|
35
|
+
flushInlet(): void;
|
|
58
36
|
destroy(): void;
|
|
59
37
|
readonly isRunning: boolean;
|
|
60
38
|
}
|
|
61
|
-
export type StreamInletConstructor = new (
|
|
39
|
+
export type StreamInletConstructor = new (options: StreamInletOptions, onData: OnDataCallback) => StreamInlet;
|
|
62
40
|
export interface StreamInletOptions {
|
|
63
|
-
|
|
41
|
+
sourceId: string;
|
|
64
42
|
chunkSize: number;
|
|
65
43
|
maxBufferedMs?: number;
|
|
66
|
-
|
|
44
|
+
openStreamTimeoutMs?: number;
|
|
45
|
+
waitAfterOpenStreamMs?: number;
|
|
46
|
+
pullTimeoutMs?: number;
|
|
47
|
+
waitBetweenPullsMs?: number;
|
|
48
|
+
flushInletOnStop?: boolean;
|
|
67
49
|
}
|
|
68
|
-
export type
|
|
69
|
-
export type OnDataCallback = (samples: Float32Array, timestamps: Float64Array) => void;
|
|
50
|
+
export type OnDataCallback = (samples: number[], timestamps: number[]) => void;
|
|
@@ -1,181 +1,111 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import handleError from '../handleError.js';
|
|
3
|
-
import LiblslAdapter from './LiblslAdapter.js';
|
|
1
|
+
import { Worker } from 'node:worker_threads';
|
|
4
2
|
export default class LslStreamInlet {
|
|
5
3
|
static Class;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
static Worker = Worker;
|
|
5
|
+
static waitAfterOpenStreamMs = 100;
|
|
6
|
+
sourceId;
|
|
9
7
|
chunkSize;
|
|
10
8
|
maxBufferedMs;
|
|
11
|
-
|
|
9
|
+
pullTimeoutMs;
|
|
10
|
+
openStreamTimeoutMs;
|
|
11
|
+
waitAfterOpenStreamMs;
|
|
12
|
+
waitBetweenPullsMs;
|
|
13
|
+
flushInletOnStop;
|
|
12
14
|
onData;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
dataBuffer;
|
|
16
|
-
wrappedDataBufferPtr;
|
|
17
|
-
dataBufferPtr;
|
|
18
|
-
timestampBuffer;
|
|
19
|
-
wrappedTimestampBufferPtr;
|
|
20
|
-
timestampBufferPtr;
|
|
21
|
-
errorCodeBuffer;
|
|
22
|
-
wrappedErrorCodeBufferPtr;
|
|
23
|
-
errorCodeBufferPtr;
|
|
15
|
+
worker;
|
|
16
|
+
workerReady = false;
|
|
24
17
|
sixMinutesInMs = 360 * 1000;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
this.
|
|
18
|
+
aboutOneYearInMs = 32000000 * 1000;
|
|
19
|
+
isRunning = false;
|
|
20
|
+
constructor(options, onData) {
|
|
21
|
+
const { sourceId, chunkSize, maxBufferedMs, pullTimeoutMs, openStreamTimeoutMs, waitAfterOpenStreamMs, waitBetweenPullsMs, flushInletOnStop, } = options ?? {};
|
|
22
|
+
this.sourceId = sourceId;
|
|
30
23
|
this.chunkSize = chunkSize;
|
|
31
24
|
this.maxBufferedMs = maxBufferedMs ?? this.sixMinutesInMs;
|
|
32
|
-
this.
|
|
25
|
+
this.pullTimeoutMs = pullTimeoutMs ?? 0;
|
|
26
|
+
this.openStreamTimeoutMs = openStreamTimeoutMs ?? this.aboutOneYearInMs;
|
|
27
|
+
this.waitAfterOpenStreamMs = waitAfterOpenStreamMs ?? this.defaultWaitMs;
|
|
28
|
+
this.waitBetweenPullsMs = waitBetweenPullsMs ?? 1;
|
|
29
|
+
this.flushInletOnStop = flushInletOnStop ?? true;
|
|
33
30
|
this.onData = onData;
|
|
34
|
-
this.
|
|
35
|
-
this.createBoundInlet();
|
|
31
|
+
this.createWorkerThread();
|
|
36
32
|
}
|
|
37
33
|
static async Create(options, onData) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
this.createDataBuffer();
|
|
63
|
-
this.createTimestampBuffer();
|
|
64
|
-
this.createErrorCodeBuffer();
|
|
65
|
-
}
|
|
66
|
-
createDataBuffer() {
|
|
67
|
-
this.dataBuffer = Buffer.alloc(this.bytesPerFloat * this.chunkSize * this.channelCount);
|
|
68
|
-
}
|
|
69
|
-
bytesPerFloat = 4;
|
|
70
|
-
createTimestampBuffer() {
|
|
71
|
-
this.timestampBuffer = Buffer.alloc(this.bytesPerDouble * this.chunkSize);
|
|
72
|
-
}
|
|
73
|
-
bytesPerDouble = 8;
|
|
74
|
-
createErrorCodeBuffer() {
|
|
75
|
-
this.errorCodeBuffer = Buffer.alloc(this.bytesPerInt);
|
|
76
|
-
}
|
|
77
|
-
bytesPerInt = 4;
|
|
78
|
-
createPointersToBuffers() {
|
|
79
|
-
this.createDataBufferPtr();
|
|
80
|
-
this.createTimestampBufferPtr();
|
|
81
|
-
this.createErrorCodeBufferPtr();
|
|
82
|
-
}
|
|
83
|
-
createDataBufferPtr() {
|
|
84
|
-
this.wrappedDataBufferPtr = createPointer({
|
|
85
|
-
paramsType: [DataType.U8Array],
|
|
86
|
-
paramsValue: [this.dataBuffer],
|
|
87
|
-
});
|
|
88
|
-
this.dataBufferPtr = unwrapPointer(this.wrappedDataBufferPtr)[0];
|
|
89
|
-
}
|
|
90
|
-
createTimestampBufferPtr() {
|
|
91
|
-
this.wrappedTimestampBufferPtr = createPointer({
|
|
92
|
-
paramsType: [DataType.U8Array],
|
|
93
|
-
paramsValue: [this.timestampBuffer],
|
|
94
|
-
});
|
|
95
|
-
this.timestampBufferPtr = unwrapPointer(this.wrappedTimestampBufferPtr)[0];
|
|
96
|
-
}
|
|
97
|
-
createErrorCodeBufferPtr() {
|
|
98
|
-
this.wrappedErrorCodeBufferPtr = createPointer({
|
|
99
|
-
paramsType: [DataType.U8Array],
|
|
100
|
-
paramsValue: [this.errorCodeBuffer],
|
|
34
|
+
return new (this.Class ?? this)(options, onData);
|
|
35
|
+
}
|
|
36
|
+
createWorkerThread() {
|
|
37
|
+
this.worker = new this.Worker(new URL('./workers/inlet/LslStreamInlet.worker.js', import.meta.url));
|
|
38
|
+
this.worker.on('message', (msg) => {
|
|
39
|
+
const { type } = msg;
|
|
40
|
+
switch (type) {
|
|
41
|
+
case 'ready': {
|
|
42
|
+
this.workerReady = true;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'data': {
|
|
46
|
+
const { payload } = msg;
|
|
47
|
+
const { samples, timestamps } = payload;
|
|
48
|
+
this.onData(samples, timestamps);
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case 'error': {
|
|
52
|
+
const { error } = msg;
|
|
53
|
+
throw new Error(error);
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
throw new Error(`Unknown message type: ${type}`);
|
|
57
|
+
}
|
|
101
58
|
});
|
|
102
|
-
this.errorCodeBufferPtr = unwrapPointer(this.wrappedErrorCodeBufferPtr)[0];
|
|
103
59
|
}
|
|
104
|
-
async
|
|
105
|
-
if (this.isRunning) {
|
|
106
|
-
|
|
107
|
-
this.
|
|
108
|
-
|
|
109
|
-
|
|
60
|
+
async startPulling() {
|
|
61
|
+
if (!this.isRunning) {
|
|
62
|
+
this.isRunning = true;
|
|
63
|
+
this.postCreate();
|
|
64
|
+
while (!this.workerReady) {
|
|
65
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
110
66
|
}
|
|
111
|
-
|
|
112
|
-
void this.pullOnLoop();
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
pullSample() {
|
|
117
|
-
const timestamp = this.callPullSampleBinding();
|
|
118
|
-
if (timestamp > 0) {
|
|
119
|
-
return {
|
|
120
|
-
samples: this.createFloatArrayFromDataBuffer(),
|
|
121
|
-
timestamps: new Float64Array([timestamp]),
|
|
122
|
-
};
|
|
67
|
+
this.postStartPulling();
|
|
123
68
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
callPullSampleBinding() {
|
|
127
|
-
return this.lsl.pullSample({
|
|
128
|
-
inlet: this.inlet,
|
|
129
|
-
dataBufferPtr: this.dataBufferPtr,
|
|
130
|
-
dataBufferElements: this.channelCount,
|
|
131
|
-
timeout: this.timeoutMs / 1000,
|
|
132
|
-
errcodePtr: this.errorCodeBufferPtr,
|
|
133
|
-
});
|
|
134
|
-
}
|
|
135
|
-
createFloatArrayFromDataBuffer() {
|
|
136
|
-
return new Float32Array(this.dataBuffer.buffer, this.dataBuffer.byteOffset, this.chunkSize * this.channelCount);
|
|
137
|
-
}
|
|
138
|
-
pullChunk() {
|
|
139
|
-
const firstTimestamp = this.callPullChunkBinding();
|
|
140
|
-
if (firstTimestamp > 0) {
|
|
141
|
-
return {
|
|
142
|
-
samples: this.createFloatArrayFromDataBuffer(),
|
|
143
|
-
timestamps: this.createDoubleArrayFromTimestampBuffer(),
|
|
144
|
-
};
|
|
69
|
+
else {
|
|
70
|
+
console.warn('Skipping startPulling: inlet is already running!');
|
|
145
71
|
}
|
|
146
|
-
return { samples: undefined, timestamps: undefined };
|
|
147
72
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
73
|
+
postCreate() {
|
|
74
|
+
this.worker.postMessage({
|
|
75
|
+
type: 'createInlet',
|
|
76
|
+
payload: {
|
|
77
|
+
sourceId: this.sourceId,
|
|
78
|
+
chunkSize: this.chunkSize,
|
|
79
|
+
maxBufferedMs: this.maxBufferedMs,
|
|
80
|
+
openStreamTimeoutMs: this.openStreamTimeoutMs,
|
|
81
|
+
waitAfterOpenStreamMs: this.waitAfterOpenStreamMs,
|
|
82
|
+
pullTimeoutMs: this.pullTimeoutMs,
|
|
83
|
+
waitBetweenPullsMs: this.waitBetweenPullsMs,
|
|
84
|
+
flushInletOnStop: this.flushInletOnStop,
|
|
85
|
+
},
|
|
157
86
|
});
|
|
158
87
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
handleErrorCodeIfPresent() {
|
|
163
|
-
handleError(this.errorCodeBuffer.readInt32LE());
|
|
88
|
+
postStartPulling() {
|
|
89
|
+
this.worker.postMessage({ type: 'startPulling' });
|
|
164
90
|
}
|
|
165
91
|
stopPulling() {
|
|
166
92
|
this.isRunning = false;
|
|
93
|
+
this.worker.postMessage({ type: 'stopPulling' });
|
|
167
94
|
}
|
|
168
|
-
|
|
169
|
-
this.
|
|
95
|
+
flushInlet() {
|
|
96
|
+
this.worker.postMessage({ type: 'flushInlet' });
|
|
170
97
|
}
|
|
171
98
|
destroy() {
|
|
172
99
|
if (this.isRunning) {
|
|
173
100
|
this.stopPulling();
|
|
174
101
|
}
|
|
175
|
-
this.
|
|
102
|
+
this.worker.postMessage({ type: 'destroyInlet' });
|
|
103
|
+
}
|
|
104
|
+
get defaultWaitMs() {
|
|
105
|
+
return LslStreamInlet.waitAfterOpenStreamMs;
|
|
176
106
|
}
|
|
177
|
-
|
|
178
|
-
|
|
107
|
+
get Worker() {
|
|
108
|
+
return LslStreamInlet.Worker;
|
|
179
109
|
}
|
|
180
110
|
}
|
|
181
111
|
//# sourceMappingURL=LslStreamInlet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslStreamInlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamInlet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"LslStreamInlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamInlet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Worker } from 'node:worker_threads';
|
|
2
|
+
import { ChannelFormat, LslSample } from '@neurodevs/ndx-native';
|
|
3
3
|
export default class LslStreamOutlet implements StreamOutlet {
|
|
4
4
|
static Class?: StreamOutletConstructor;
|
|
5
|
-
|
|
5
|
+
static Worker: typeof Worker;
|
|
6
6
|
readonly name: string;
|
|
7
7
|
readonly type: string;
|
|
8
8
|
readonly sourceId: string;
|
|
@@ -14,30 +14,25 @@ export default class LslStreamOutlet implements StreamOutlet {
|
|
|
14
14
|
readonly maxBufferedMs: number;
|
|
15
15
|
readonly manufacturer: string;
|
|
16
16
|
readonly units: string;
|
|
17
|
-
private
|
|
18
|
-
|
|
19
|
-
private lsl;
|
|
20
|
-
protected constructor(info: StreamInfo, options: StreamOutletOptions);
|
|
17
|
+
private worker;
|
|
18
|
+
protected constructor(options: StreamOutletOptions);
|
|
21
19
|
static Create(options: StreamOutletOptions): Promise<StreamOutlet>;
|
|
22
20
|
private validateOptions;
|
|
23
21
|
private validateChannelFormat;
|
|
24
22
|
private get isChannelFormatSupported();
|
|
25
23
|
private throwUnsupportedChannelFormat;
|
|
24
|
+
private createWorkerThread;
|
|
26
25
|
private createStreamOutlet;
|
|
27
|
-
private setPushSampleMethod;
|
|
28
26
|
private get pushMethod();
|
|
29
27
|
private readonly methodMap;
|
|
30
|
-
pushSample(sample: LslSample): void;
|
|
28
|
+
pushSample(sample: LslSample, timestamp?: number): void;
|
|
31
29
|
destroy(): void;
|
|
32
|
-
private
|
|
33
|
-
private
|
|
34
|
-
private static waitToAllowSetup;
|
|
35
|
-
private static LslStreamInfo;
|
|
30
|
+
private get Worker();
|
|
31
|
+
private static waitForSetup;
|
|
36
32
|
}
|
|
37
33
|
export interface StreamOutlet {
|
|
38
|
-
pushSample(sample: LslSample): void;
|
|
34
|
+
pushSample(sample: LslSample, timestamp?: number): void;
|
|
39
35
|
destroy(): void;
|
|
40
|
-
readonly info: StreamInfo;
|
|
41
36
|
readonly name: string;
|
|
42
37
|
readonly type: string;
|
|
43
38
|
readonly sourceId: string;
|
|
@@ -50,8 +45,11 @@ export interface StreamOutlet {
|
|
|
50
45
|
readonly maxBufferedMs: number;
|
|
51
46
|
readonly manufacturer: string;
|
|
52
47
|
}
|
|
53
|
-
export type StreamOutletConstructor = new (
|
|
54
|
-
export interface StreamOutletOptions {
|
|
48
|
+
export type StreamOutletConstructor = new (options: StreamOutletOptions) => StreamOutlet;
|
|
49
|
+
export interface StreamOutletOptions extends StreamOutletConstructorOptions {
|
|
50
|
+
waitAfterConstructionMs?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface StreamOutletConstructorOptions {
|
|
55
53
|
name: string;
|
|
56
54
|
type: string;
|
|
57
55
|
sourceId: string;
|
|
@@ -62,5 +60,4 @@ export interface StreamOutletOptions {
|
|
|
62
60
|
maxBufferedMs?: number;
|
|
63
61
|
manufacturer?: string;
|
|
64
62
|
units?: string;
|
|
65
|
-
waitAfterConstructionMs?: number;
|
|
66
63
|
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
+
import { Worker } from 'node:worker_threads';
|
|
1
2
|
import { assertValidChannelCount, assertValidChannelFormat, assertValidChunkSize, assertValidMaxBufferedMs, assertValidSampleRateHz, } from '../assertions.js';
|
|
2
|
-
import handleError from '../handleError.js';
|
|
3
|
-
import LiblslAdapter from './LiblslAdapter.js';
|
|
4
|
-
import LslStreamInfo from './LslStreamInfo.js';
|
|
5
3
|
export default class LslStreamOutlet {
|
|
6
4
|
static Class;
|
|
7
|
-
|
|
5
|
+
static Worker = Worker;
|
|
8
6
|
name;
|
|
9
7
|
type;
|
|
10
8
|
sourceId;
|
|
@@ -16,12 +14,9 @@ export default class LslStreamOutlet {
|
|
|
16
14
|
maxBufferedMs = 360 * 1000;
|
|
17
15
|
manufacturer = 'N/A';
|
|
18
16
|
units = 'N/A';
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
lsl = LiblslAdapter.getInstance();
|
|
22
|
-
constructor(info, options) {
|
|
17
|
+
worker;
|
|
18
|
+
constructor(options) {
|
|
23
19
|
const { name, type, sourceId, channelNames, channelFormat, sampleRateHz, chunkSize, maxBufferedMs, manufacturer, units, } = options;
|
|
24
|
-
this.info = info;
|
|
25
20
|
this.name = name;
|
|
26
21
|
this.type = type;
|
|
27
22
|
this.sourceId = sourceId;
|
|
@@ -34,14 +29,13 @@ export default class LslStreamOutlet {
|
|
|
34
29
|
this.manufacturer = manufacturer ?? this.manufacturer;
|
|
35
30
|
this.units = units ?? this.units;
|
|
36
31
|
this.validateOptions();
|
|
32
|
+
this.createWorkerThread();
|
|
37
33
|
this.createStreamOutlet();
|
|
38
|
-
this.setPushSampleMethod();
|
|
39
34
|
}
|
|
40
35
|
static async Create(options) {
|
|
41
36
|
const { waitAfterConstructionMs = 10 } = options ?? {};
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
await this.waitToAllowSetup(waitAfterConstructionMs);
|
|
37
|
+
const instance = new (this.Class ?? this)(options);
|
|
38
|
+
await this.waitForSetup(waitAfterConstructionMs);
|
|
45
39
|
return instance;
|
|
46
40
|
}
|
|
47
41
|
validateOptions() {
|
|
@@ -63,16 +57,28 @@ export default class LslStreamOutlet {
|
|
|
63
57
|
throwUnsupportedChannelFormat() {
|
|
64
58
|
throw new Error(`This method currently does not support the ${this.channelFormat} type! Please implement it.`);
|
|
65
59
|
}
|
|
60
|
+
createWorkerThread() {
|
|
61
|
+
this.worker = new this.Worker(new URL('./workers/outlet/LslStreamOutlet.worker.js', import.meta.url));
|
|
62
|
+
}
|
|
66
63
|
createStreamOutlet() {
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
this.worker.postMessage({
|
|
65
|
+
type: 'createOutlet',
|
|
66
|
+
payload: {
|
|
67
|
+
infoOptions: {
|
|
68
|
+
name: this.name,
|
|
69
|
+
type: this.type,
|
|
70
|
+
sourceId: this.sourceId,
|
|
71
|
+
channelNames: this.channelNames,
|
|
72
|
+
channelFormat: this.channelFormat,
|
|
73
|
+
sampleRateHz: this.sampleRateHz,
|
|
74
|
+
units: this.units,
|
|
75
|
+
},
|
|
76
|
+
chunkSize: this.chunkSize,
|
|
77
|
+
maxBufferedMs: this.maxBufferedMs,
|
|
78
|
+
pushMethod: this.pushMethod,
|
|
79
|
+
},
|
|
71
80
|
});
|
|
72
81
|
}
|
|
73
|
-
setPushSampleMethod() {
|
|
74
|
-
this.pushSampleMethod = this.lsl[this.pushMethod].bind(this.lsl);
|
|
75
|
-
}
|
|
76
82
|
get pushMethod() {
|
|
77
83
|
return this.methodMap[this.channelFormat];
|
|
78
84
|
}
|
|
@@ -80,39 +86,25 @@ export default class LslStreamOutlet {
|
|
|
80
86
|
float32: 'pushSampleFloatTimestamp',
|
|
81
87
|
string: 'pushSampleStringTimestamp',
|
|
82
88
|
};
|
|
83
|
-
pushSample(sample) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
pushSample(sample, timestamp) {
|
|
90
|
+
this.worker.postMessage({
|
|
91
|
+
type: 'pushSample',
|
|
92
|
+
payload: {
|
|
93
|
+
sample,
|
|
94
|
+
timestamp,
|
|
95
|
+
},
|
|
89
96
|
});
|
|
90
|
-
handleError(err);
|
|
91
97
|
}
|
|
92
98
|
destroy() {
|
|
93
|
-
this.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
destroyBoundInfo() {
|
|
97
|
-
this.lsl.destroyStreamInfo({ info: this.info.boundInfo });
|
|
99
|
+
this.worker.postMessage({
|
|
100
|
+
type: 'destroyOutlet',
|
|
101
|
+
});
|
|
98
102
|
}
|
|
99
|
-
|
|
100
|
-
|
|
103
|
+
get Worker() {
|
|
104
|
+
return LslStreamOutlet.Worker;
|
|
101
105
|
}
|
|
102
|
-
static async
|
|
106
|
+
static async waitForSetup(waitAfterConstructionMs) {
|
|
103
107
|
await new Promise((resolve) => setTimeout(resolve, waitAfterConstructionMs));
|
|
104
108
|
}
|
|
105
|
-
static LslStreamInfo(options) {
|
|
106
|
-
const { channelNames, channelFormat, sampleRateHz, name, type, sourceId, units, } = options;
|
|
107
|
-
return LslStreamInfo.Create({
|
|
108
|
-
name,
|
|
109
|
-
type,
|
|
110
|
-
sourceId,
|
|
111
|
-
channelNames,
|
|
112
|
-
channelFormat,
|
|
113
|
-
sampleRateHz,
|
|
114
|
-
units,
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
109
|
}
|
|
118
110
|
//# sourceMappingURL=LslStreamOutlet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslStreamOutlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,GAC1B,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"LslStreamOutlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamOutlet.ts"],"names":[],"mappings":"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"}
|