@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,11 +1,13 @@
|
|
|
1
1
|
import LslStreamInlet from '../impl/LslStreamInlet.js'
|
|
2
2
|
import LslStreamOutlet from '../impl/LslStreamOutlet.js'
|
|
3
3
|
|
|
4
|
+
const sourceId = 'TestOutletID'
|
|
5
|
+
|
|
4
6
|
console.log('Creating outlet...')
|
|
5
7
|
const outlet = await LslStreamOutlet.Create({
|
|
6
8
|
name: 'TestOutlet',
|
|
7
9
|
type: 'TEST',
|
|
8
|
-
sourceId
|
|
10
|
+
sourceId,
|
|
9
11
|
sampleRateHz: 100,
|
|
10
12
|
channelNames: ['Ch1', 'Ch2', 'Ch3'],
|
|
11
13
|
channelFormat: 'float32',
|
|
@@ -16,20 +18,18 @@ const outlet = await LslStreamOutlet.Create({
|
|
|
16
18
|
|
|
17
19
|
console.log('Creating inlet...')
|
|
18
20
|
|
|
19
|
-
const inletOptions = {
|
|
20
|
-
info: outlet.info,
|
|
21
|
-
chunkSize: 1,
|
|
22
|
-
}
|
|
23
|
-
|
|
24
21
|
const inlet = await LslStreamInlet.Create(
|
|
25
|
-
|
|
22
|
+
{
|
|
23
|
+
sourceId,
|
|
24
|
+
chunkSize: 1,
|
|
25
|
+
},
|
|
26
26
|
(samples, timestamps) => {
|
|
27
27
|
console.log('Received samples:', samples, 'at timestamps:', timestamps)
|
|
28
28
|
}
|
|
29
29
|
)
|
|
30
30
|
|
|
31
31
|
console.log('Start pulling...')
|
|
32
|
-
inlet.startPulling()
|
|
32
|
+
await inlet.startPulling()
|
|
33
33
|
|
|
34
34
|
console.log('Waiting for 100 ms...')
|
|
35
35
|
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
@@ -49,3 +49,5 @@ for (let i = 0; i < 30; i++) {
|
|
|
49
49
|
outlet.pushSample(sample)
|
|
50
50
|
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
51
51
|
}
|
|
52
|
+
|
|
53
|
+
process.exit(0)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BackpressureMonitor } from '../../impl/LslBackpressureMonitor.js'
|
|
2
|
+
|
|
3
|
+
export default class FakeBackpressureMonitor implements BackpressureMonitor {
|
|
4
|
+
public static numCallsToConstructor = 0
|
|
5
|
+
|
|
6
|
+
public constructor() {
|
|
7
|
+
FakeBackpressureMonitor.numCallsToConstructor++
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
public static resetTestDouble() {
|
|
11
|
+
FakeBackpressureMonitor.numCallsToConstructor = 0
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EventMarkerEmitter,
|
|
3
|
+
EventMarkerOptions,
|
|
4
|
+
TimedEventMarker,
|
|
5
|
+
} from '../../impl/LslEventMarkerEmitter.js'
|
|
6
|
+
|
|
7
|
+
export default class FakeEventMarkerEmitter implements EventMarkerEmitter {
|
|
8
|
+
public static numCallsToConstructor = 0
|
|
9
|
+
|
|
10
|
+
public static callsToEmit: {
|
|
11
|
+
markerName: string
|
|
12
|
+
options?: EventMarkerOptions
|
|
13
|
+
}[] = []
|
|
14
|
+
|
|
15
|
+
public static callsToEmitMany: TimedEventMarker[][] = []
|
|
16
|
+
public static numCallsToInterrupt = 0
|
|
17
|
+
public static numCallsToDestroy = 0
|
|
18
|
+
|
|
19
|
+
public constructor() {
|
|
20
|
+
FakeEventMarkerEmitter.numCallsToConstructor++
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public async emit(markerName: string, options?: EventMarkerOptions) {
|
|
24
|
+
FakeEventMarkerEmitter.callsToEmit.push({ markerName, options })
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public async emitMany(markers: TimedEventMarker[]) {
|
|
28
|
+
FakeEventMarkerEmitter.callsToEmitMany.push(markers)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public interrupt() {
|
|
32
|
+
FakeEventMarkerEmitter.numCallsToInterrupt++
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public destroy() {
|
|
36
|
+
FakeEventMarkerEmitter.numCallsToDestroy++
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public static resetTestDouble() {
|
|
40
|
+
this.numCallsToConstructor = 0
|
|
41
|
+
this.callsToEmit = []
|
|
42
|
+
this.callsToEmitMany = []
|
|
43
|
+
this.numCallsToInterrupt = 0
|
|
44
|
+
this.numCallsToDestroy = 0
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import LslEventMarkerEmitter from '../../impl/LslEventMarkerEmitter.js'
|
|
2
|
+
import { StreamOutlet } from '../../impl/LslStreamOutlet.js'
|
|
3
|
+
|
|
4
|
+
export default class SpyEventMarkerEmitter extends LslEventMarkerEmitter {
|
|
5
|
+
public static shouldCallWaitOnSuper = false
|
|
6
|
+
|
|
7
|
+
public totalwaitAfterMs: number
|
|
8
|
+
|
|
9
|
+
public constructor(outlet: StreamOutlet) {
|
|
10
|
+
super(outlet)
|
|
11
|
+
|
|
12
|
+
this.totalwaitAfterMs = 0
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public async wait(waitAfterMs: number) {
|
|
16
|
+
this.totalwaitAfterMs += waitAfterMs
|
|
17
|
+
|
|
18
|
+
if (SpyEventMarkerEmitter.shouldCallWaitOnSuper) {
|
|
19
|
+
return super.wait(waitAfterMs)
|
|
20
|
+
}
|
|
21
|
+
return Promise.resolve()
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public getStreamOutlet() {
|
|
25
|
+
return this.outlet
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public resetTestDouble() {
|
|
29
|
+
this.totalwaitAfterMs = 0
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EventMarkerEmitter,
|
|
3
|
+
EventMarkerOptions,
|
|
4
|
+
TimedEventMarker,
|
|
5
|
+
} from '../../impl/LslEventMarkerEmitter.js'
|
|
6
|
+
|
|
7
|
+
export default class ThrowingEventMarkerEmitter implements EventMarkerEmitter {
|
|
8
|
+
private errorMsg = 'Intentional throwing: '
|
|
9
|
+
|
|
10
|
+
public constructor() {
|
|
11
|
+
throw new Error(this.errorMsg + 'constructor')
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public async emit(_markerName: string, _options?: EventMarkerOptions) {
|
|
15
|
+
throw new Error(this.errorMsg + 'emit')
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public async emitMany(_markers: TimedEventMarker[]) {
|
|
19
|
+
throw new Error(this.errorMsg + 'emitMany')
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public interrupt() {
|
|
23
|
+
throw new Error(this.errorMsg + 'interrupt')
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public destroy() {
|
|
27
|
+
throw new Error(this.errorMsg + 'destroy')
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import generateId from '@neurodevs/generate-id'
|
|
2
|
+
import { InfoHandle } from '@neurodevs/ndx-native'
|
|
2
3
|
|
|
3
|
-
import { BoundStreamInfo } from 'impl/LiblslAdapter.js'
|
|
4
4
|
import { StreamInfo, StreamInfoOptions } from '../../impl/LslStreamInfo.js'
|
|
5
5
|
|
|
6
6
|
export default class FakeStreamInfo implements StreamInfo {
|
|
7
7
|
public static callsToConstructor: (StreamInfoOptions | undefined)[] = []
|
|
8
8
|
public static numCallsToDestroy = 0
|
|
9
9
|
|
|
10
|
-
public static
|
|
10
|
+
public static infoHandle = {} as InfoHandle
|
|
11
11
|
|
|
12
12
|
public name = generateId()
|
|
13
13
|
public type = generateId()
|
|
@@ -29,8 +29,8 @@ export default class FakeStreamInfo implements StreamInfo {
|
|
|
29
29
|
return this.channelNames.length
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
public get
|
|
33
|
-
return FakeStreamInfo.
|
|
32
|
+
public get infoHandle() {
|
|
33
|
+
return FakeStreamInfo.infoHandle
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
public static resetTestDouble() {
|
|
@@ -1,40 +1,34 @@
|
|
|
1
|
-
import { StreamInfo } from '../../impl/LslStreamInfo.js'
|
|
2
1
|
import {
|
|
2
|
+
OnDataCallback,
|
|
3
3
|
StreamInlet,
|
|
4
|
-
|
|
4
|
+
StreamInletOptions,
|
|
5
5
|
} from '../../impl/LslStreamInlet.js'
|
|
6
6
|
|
|
7
7
|
export default class FakeStreamInlet implements StreamInlet {
|
|
8
8
|
public static callsToConstructor: {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
onData?: (samples: Float32Array, timestamps: Float64Array) => void
|
|
9
|
+
options?: StreamInletOptions
|
|
10
|
+
onData?: OnDataCallback
|
|
12
11
|
}[] = []
|
|
13
12
|
|
|
14
13
|
public static numCallsToStartPulling = 0
|
|
15
14
|
public static numCallsToStopPulling = 0
|
|
16
|
-
public static
|
|
15
|
+
public static numCallsToFlushInlet = 0
|
|
17
16
|
public static numCallsToDestroy = 0
|
|
18
17
|
|
|
19
18
|
public isRunning = false
|
|
20
19
|
|
|
21
|
-
protected onData!:
|
|
20
|
+
protected onData!: OnDataCallback
|
|
22
21
|
|
|
23
|
-
public constructor(
|
|
24
|
-
info?: StreamInfo,
|
|
25
|
-
options?: StreamInletConstructorOptions,
|
|
26
|
-
onData?: (samples: Float32Array, timestamps: Float64Array) => void
|
|
27
|
-
) {
|
|
22
|
+
public constructor(options?: StreamInletOptions, onData?: OnDataCallback) {
|
|
28
23
|
this.onData = onData ?? (() => {})
|
|
29
24
|
|
|
30
25
|
FakeStreamInlet.callsToConstructor.push({
|
|
31
|
-
info,
|
|
32
26
|
options,
|
|
33
27
|
onData: this.onData,
|
|
34
28
|
})
|
|
35
29
|
}
|
|
36
30
|
|
|
37
|
-
public startPulling() {
|
|
31
|
+
public async startPulling() {
|
|
38
32
|
FakeStreamInlet.numCallsToStartPulling++
|
|
39
33
|
this.isRunning = true
|
|
40
34
|
}
|
|
@@ -44,8 +38,8 @@ export default class FakeStreamInlet implements StreamInlet {
|
|
|
44
38
|
this.isRunning = false
|
|
45
39
|
}
|
|
46
40
|
|
|
47
|
-
public
|
|
48
|
-
FakeStreamInlet.
|
|
41
|
+
public flushInlet() {
|
|
42
|
+
FakeStreamInlet.numCallsToFlushInlet++
|
|
49
43
|
}
|
|
50
44
|
|
|
51
45
|
public destroy() {
|
|
@@ -55,7 +49,7 @@ export default class FakeStreamInlet implements StreamInlet {
|
|
|
55
49
|
public static resetTestDouble() {
|
|
56
50
|
FakeStreamInlet.callsToConstructor = []
|
|
57
51
|
FakeStreamInlet.numCallsToStartPulling = 0
|
|
58
|
-
FakeStreamInlet.
|
|
52
|
+
FakeStreamInlet.numCallsToFlushInlet = 0
|
|
59
53
|
FakeStreamInlet.numCallsToDestroy = 0
|
|
60
54
|
}
|
|
61
55
|
}
|
|
@@ -1,23 +1,10 @@
|
|
|
1
|
-
import { StreamInfo } from '../../impl/LslStreamInfo.js'
|
|
2
1
|
import LslStreamInlet, {
|
|
3
2
|
OnDataCallback,
|
|
4
|
-
|
|
3
|
+
StreamInletOptions,
|
|
5
4
|
} from '../../impl/LslStreamInlet.js'
|
|
6
5
|
|
|
7
6
|
export class SpyStreamInlet extends LslStreamInlet {
|
|
8
|
-
public constructor(
|
|
9
|
-
|
|
10
|
-
options: StreamInletConstructorOptions,
|
|
11
|
-
onData: OnDataCallback
|
|
12
|
-
) {
|
|
13
|
-
super(info, options, onData)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
public getStreamInfo() {
|
|
17
|
-
return this.info
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public getBoundInlet() {
|
|
21
|
-
return this.inlet
|
|
7
|
+
public constructor(options: StreamInletOptions, onData: OnDataCallback) {
|
|
8
|
+
super(options, onData)
|
|
22
9
|
}
|
|
23
10
|
}
|
|
@@ -1,30 +1,27 @@
|
|
|
1
|
-
import { randomInt } from 'crypto'
|
|
1
|
+
import { randomInt } from 'node:crypto'
|
|
2
|
+
|
|
2
3
|
import generateId from '@neurodevs/generate-id'
|
|
4
|
+
import { LslSample } from '@neurodevs/ndx-native'
|
|
3
5
|
|
|
4
|
-
import { LslSample } from 'impl/LiblslAdapter.js'
|
|
5
|
-
import { StreamInfo } from '../../impl/LslStreamInfo.js'
|
|
6
6
|
import {
|
|
7
7
|
StreamOutlet,
|
|
8
8
|
StreamOutletOptions,
|
|
9
9
|
} from '../../impl/LslStreamOutlet.js'
|
|
10
|
-
import FakeStreamInfo from '../StreamInfo/FakeStreamInfo.js'
|
|
11
10
|
|
|
12
11
|
export default class FakeStreamOutlet implements StreamOutlet {
|
|
13
|
-
public static callsToConstructor:
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
public static callsToConstructor: (StreamOutletOptions | undefined)[] = []
|
|
13
|
+
|
|
14
|
+
public static callsToPushSample: {
|
|
15
|
+
sample: LslSample
|
|
16
|
+
timestamp?: number
|
|
16
17
|
}[] = []
|
|
17
18
|
|
|
18
|
-
public static callsToPushSample: LslSample[] = []
|
|
19
19
|
public static numCallsToDestroy = 0
|
|
20
20
|
|
|
21
|
-
public info: StreamInfo
|
|
22
21
|
public options?: StreamOutletOptions
|
|
23
22
|
|
|
24
|
-
public constructor(
|
|
25
|
-
FakeStreamOutlet.callsToConstructor.push(
|
|
26
|
-
|
|
27
|
-
this.info = info ?? new FakeStreamInfo()
|
|
23
|
+
public constructor(options?: StreamOutletOptions) {
|
|
24
|
+
FakeStreamOutlet.callsToConstructor.push(options)
|
|
28
25
|
this.options = options
|
|
29
26
|
}
|
|
30
27
|
|
|
@@ -32,8 +29,8 @@ export default class FakeStreamOutlet implements StreamOutlet {
|
|
|
32
29
|
FakeStreamOutlet.numCallsToDestroy++
|
|
33
30
|
}
|
|
34
31
|
|
|
35
|
-
public pushSample(sample: LslSample) {
|
|
36
|
-
FakeStreamOutlet.callsToPushSample.push(sample)
|
|
32
|
+
public pushSample(sample: LslSample, timestamp?: number) {
|
|
33
|
+
FakeStreamOutlet.callsToPushSample.push({ sample, timestamp })
|
|
37
34
|
}
|
|
38
35
|
|
|
39
36
|
public get name() {
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { WorkerOptions } from 'node:worker_threads'
|
|
2
|
+
|
|
3
|
+
import { OnDataCallback } from '../../impl/LslStreamInlet.js'
|
|
4
|
+
import StreamInletWorker from '../../impl/workers/inlet/StreamInletWorker.js'
|
|
5
|
+
import {
|
|
6
|
+
createOutlet,
|
|
7
|
+
destroyOutlet,
|
|
8
|
+
pushSample,
|
|
9
|
+
} from '../../impl/workers/outlet/LslStreamOutlet.worker.js'
|
|
10
|
+
|
|
11
|
+
export default class FakeWorker {
|
|
12
|
+
public static callsToConstructor: {
|
|
13
|
+
filename: string | URL
|
|
14
|
+
options?: WorkerOptions
|
|
15
|
+
}[] = []
|
|
16
|
+
|
|
17
|
+
public static callsToPostMessage: WorkerMessage[] = []
|
|
18
|
+
|
|
19
|
+
public static callsToOn: {
|
|
20
|
+
type: string
|
|
21
|
+
listener: (...args: unknown[]) => void
|
|
22
|
+
}[] = []
|
|
23
|
+
|
|
24
|
+
public static inletWorker = new StreamInletWorker()
|
|
25
|
+
public static fakeOnData: OnDataCallback
|
|
26
|
+
|
|
27
|
+
public createInletPromise?: Promise<void>
|
|
28
|
+
|
|
29
|
+
public constructor(filename: string | URL, options?: WorkerOptions) {
|
|
30
|
+
FakeWorker.callsToConstructor.push({ filename, options })
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public postMessage(msg: WorkerMessage) {
|
|
34
|
+
FakeWorker.callsToPostMessage.push(msg)
|
|
35
|
+
|
|
36
|
+
const { type } = msg
|
|
37
|
+
|
|
38
|
+
switch (type) {
|
|
39
|
+
case 'createOutlet': {
|
|
40
|
+
createOutlet(msg as any)
|
|
41
|
+
break
|
|
42
|
+
}
|
|
43
|
+
case 'pushSample': {
|
|
44
|
+
pushSample(msg as any)
|
|
45
|
+
break
|
|
46
|
+
}
|
|
47
|
+
case 'destroyOutlet': {
|
|
48
|
+
destroyOutlet()
|
|
49
|
+
break
|
|
50
|
+
}
|
|
51
|
+
case 'createInlet': {
|
|
52
|
+
const { payload } = msg
|
|
53
|
+
this.createInletPromise = this.inletWorker.createInlet(
|
|
54
|
+
payload as any
|
|
55
|
+
)
|
|
56
|
+
break
|
|
57
|
+
}
|
|
58
|
+
case 'startPulling': {
|
|
59
|
+
this.inletWorker.startPulling(this.fakeOnData)
|
|
60
|
+
break
|
|
61
|
+
}
|
|
62
|
+
case 'flushInlet': {
|
|
63
|
+
this.inletWorker.flushInlet()
|
|
64
|
+
break
|
|
65
|
+
}
|
|
66
|
+
case 'stopPulling': {
|
|
67
|
+
this.inletWorker.stopPulling()
|
|
68
|
+
break
|
|
69
|
+
}
|
|
70
|
+
case 'destroyInlet': {
|
|
71
|
+
this.inletWorker.destroyInlet()
|
|
72
|
+
break
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public on(type: string, listener: (...args: unknown[]) => void) {
|
|
78
|
+
FakeWorker.callsToOn.push({ type, listener })
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private get inletWorker() {
|
|
82
|
+
return FakeWorker.inletWorker
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private get fakeOnData() {
|
|
86
|
+
return FakeWorker.fakeOnData
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public static resetTestDoubles() {
|
|
90
|
+
this.callsToConstructor = []
|
|
91
|
+
this.callsToPostMessage = []
|
|
92
|
+
this.callsToOn = []
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface WorkerMessage {
|
|
97
|
+
type: string
|
|
98
|
+
payload?: Record<string, unknown>[]
|
|
99
|
+
}
|
package/src/validations.ts
CHANGED
|
@@ -7,11 +7,9 @@ export function isGreaterThanOrEqualToZero(value: number) {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export function isPositiveInteger(value: number) {
|
|
10
|
-
//@ts-ignore
|
|
11
10
|
return Number.isInteger(value) && value > 0
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
export function isPositiveIntegerOrZero(value: number) {
|
|
15
|
-
//@ts-ignore
|
|
16
14
|
return Number.isInteger(value) && value >= 0
|
|
17
15
|
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { FieldType, FuncObj } from 'ffi-rs';
|
|
2
|
-
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
3
|
-
export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
4
|
-
private static instance;
|
|
5
|
-
private static libraryPath?;
|
|
6
|
-
private static libraryOptions?;
|
|
7
|
-
private static fakeBindings;
|
|
8
|
-
private static fakeStreamInfo;
|
|
9
|
-
private static fakeOutlet;
|
|
10
|
-
private static fakeInlet;
|
|
11
|
-
private static fakeDesc;
|
|
12
|
-
private static fakeChildNamedChannels;
|
|
13
|
-
private static createStreamInfoParams?;
|
|
14
|
-
private static destroyStreamInfoParams?;
|
|
15
|
-
private static appendChildParams;
|
|
16
|
-
private static createOutletParams?;
|
|
17
|
-
private static destroyOutletParams?;
|
|
18
|
-
private static createInletParams?;
|
|
19
|
-
private static flushInletParams?;
|
|
20
|
-
private static destroyInletParams?;
|
|
21
|
-
private static localClockParams?;
|
|
22
|
-
private static pushSampleFloatTimestampParams?;
|
|
23
|
-
private static pushSampleStringTimestampParams?;
|
|
24
|
-
private static appendChildValueParams;
|
|
25
|
-
private static shouldThrowWhenCreatingBindings;
|
|
26
|
-
private static getDescriptionParams?;
|
|
27
|
-
private static fakeChildNamedChannel;
|
|
28
|
-
private static appendChildHitCount;
|
|
29
|
-
private static ffiRsOpenOptions?;
|
|
30
|
-
private static ffiRsDefineOptions;
|
|
31
|
-
private static ffiRsLoadOptions?;
|
|
32
|
-
protected static beforeEach(): Promise<void>;
|
|
33
|
-
protected static createsInstance(): Promise<void>;
|
|
34
|
-
protected static throwsWhenBindingsFailToLoad(): Promise<void>;
|
|
35
|
-
protected static callsOpenOnFfiRs(): Promise<void>;
|
|
36
|
-
protected static worksAsASingleton(): Promise<void>;
|
|
37
|
-
protected static singletonIsTheSame(): Promise<void>;
|
|
38
|
-
protected static canSetInstance(): void;
|
|
39
|
-
protected static createsExpectedBindingsWithFfiRs(): Promise<void>;
|
|
40
|
-
protected static createsStreamInfoWithRequiredParams(): Promise<void>;
|
|
41
|
-
protected static destroysStreamInfoWithBoundInfo(): Promise<void>;
|
|
42
|
-
protected static resolvesStreamInfoByProp(): Promise<void>;
|
|
43
|
-
protected static resolveByPropAcceptsOptionalArgs(): Promise<void>;
|
|
44
|
-
protected static returnsHandlesForResolvedStreamInfos(): Promise<void>;
|
|
45
|
-
protected static createsOutletWithRequiredParams(): Promise<void>;
|
|
46
|
-
protected static pushesFloatSample(): Promise<void>;
|
|
47
|
-
protected static pushesStringSample(): Promise<void>;
|
|
48
|
-
protected static addingSingleChannelGetsDescription(): Promise<void>;
|
|
49
|
-
protected static addingMultpleChannelsAddsChildrenToChannelsChild(): Promise<void>;
|
|
50
|
-
protected static canDestroyOutlet(): Promise<void>;
|
|
51
|
-
protected static callingLocalClockTwiceReturnsDifferentTimestamps(): Promise<void>;
|
|
52
|
-
protected static localClockBindingReceivesEmptyArray(): Promise<void>;
|
|
53
|
-
protected static defaultsToMacOsPath(): Promise<void>;
|
|
54
|
-
protected static createInletWithRequiredParams(): Promise<void>;
|
|
55
|
-
protected static pullSampleCallsBinding(): Promise<void>;
|
|
56
|
-
protected static pullChunkCallsBinding(): Promise<void>;
|
|
57
|
-
protected static flushInletCallsBinding(): Promise<void>;
|
|
58
|
-
protected static destroyInletCallsBinding(): Promise<void>;
|
|
59
|
-
private static createRandomStreamInfo;
|
|
60
|
-
private static resolveByProp;
|
|
61
|
-
private static createRandomOutlet;
|
|
62
|
-
private static createRandomOutletOptions;
|
|
63
|
-
private static createRandomInlet;
|
|
64
|
-
private static createRandomInletOptions;
|
|
65
|
-
private static generateRandomChannelValues;
|
|
66
|
-
private static generateRandomCreateStreamInfoOptions;
|
|
67
|
-
private static readonly maxResults;
|
|
68
|
-
private static readonly bytesPerPointer;
|
|
69
|
-
private static readonly minResults;
|
|
70
|
-
private static readonly timeoutMs;
|
|
71
|
-
private static readonly prop;
|
|
72
|
-
private static readonly value;
|
|
73
|
-
private static readonly fakeNumResolveResults;
|
|
74
|
-
private static readonly resultsBuffer;
|
|
75
|
-
private static readonly resultsBufferPtr;
|
|
76
|
-
private static generateFailedMessage;
|
|
77
|
-
private static FakeBindings;
|
|
78
|
-
}
|
|
79
|
-
export type FfiRsDefineOptions = FuncObj<FieldType, boolean | undefined>;
|