@neurodevs/node-lsl 12.0.5 → 13.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 +2 -5
- package/build/__tests__/AbstractPackageTest.d.ts +9 -3
- package/build/__tests__/AbstractPackageTest.js +37 -3
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/LiblslAdapter.test.d.ts +6 -0
- package/build/__tests__/impl/LiblslAdapter.test.js +133 -12
- package/build/__tests__/impl/LiblslAdapter.test.js.map +1 -1
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js +5 -5
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInfo.test.js +3 -3
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +30 -2
- package/build/__tests__/impl/LslStreamInlet.test.js +181 -18
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamOutlet.test.d.ts +16 -7
- package/build/__tests__/impl/LslStreamOutlet.test.js +84 -23
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.d.ts +15 -0
- package/build/__tests__/impl/LslWebSocketBridge.test.js +112 -2
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/assertions.d.ts +3 -3
- package/build/assertions.js +6 -6
- package/build/assertions.js.map +1 -1
- package/build/handleError.d.ts +8 -0
- package/build/handleError.js +25 -0
- package/build/handleError.js.map +1 -0
- package/build/impl/LiblslAdapter.d.ts +128 -13
- package/build/impl/LiblslAdapter.js +149 -71
- package/build/impl/LiblslAdapter.js.map +1 -1
- package/build/impl/LslEventMarkerOutlet.d.ts +4 -1
- package/build/impl/LslEventMarkerOutlet.js +3 -3
- package/build/impl/LslEventMarkerOutlet.js.map +1 -1
- package/build/impl/LslStreamInfo.d.ts +3 -3
- package/build/impl/LslStreamInfo.js +5 -5
- package/build/impl/LslStreamInfo.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +52 -14
- package/build/impl/LslStreamInlet.js +157 -20
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +13 -13
- package/build/impl/LslStreamOutlet.js +22 -21
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +35 -3
- package/build/impl/LslWebSocketBridge.js +66 -3
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/index.d.ts +0 -1
- package/build/index.js +0 -1
- package/build/index.js.map +1 -1
- package/build/scripts/runLslStreamOutlet.js +2 -3
- package/build/scripts/runLslStreamOutlet.js.map +1 -1
- package/build/scripts/runOutletToInlet.d.ts +1 -0
- package/build/scripts/runOutletToInlet.js +45 -0
- package/build/scripts/runOutletToInlet.js.map +1 -0
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.d.ts +1 -2
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +1 -1
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.d.ts +2 -2
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +1 -1
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +1 -2
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +1 -1
- package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +15 -3
- package/build/testDoubles/Liblsl/FakeLiblsl.js +42 -0
- package/build/testDoubles/Liblsl/FakeLiblsl.js.map +1 -1
- package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +1 -1
- package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +1 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +12 -3
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js +25 -5
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +3 -3
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js +2 -2
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +4 -4
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +6 -6
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
- package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.d.ts +6 -0
- package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js +15 -0
- package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js.map +1 -1
- package/build/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.d.ts +4 -0
- package/build/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.js +7 -0
- package/build/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.js.map +1 -0
- package/build/testDoubles/WebSockets/FakeWebSocket.d.ts +10 -0
- package/build/testDoubles/WebSockets/FakeWebSocket.js +14 -0
- package/build/testDoubles/WebSockets/FakeWebSocket.js.map +1 -0
- package/build/testDoubles/WebSockets/FakeWebSocketServer.d.ts +13 -0
- package/build/testDoubles/WebSockets/FakeWebSocketServer.js +22 -0
- package/build/testDoubles/WebSockets/FakeWebSocketServer.js.map +1 -0
- package/build/testDoubles/generateRandomOutletOptions.js +3 -3
- package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
- package/package.json +5 -3
- package/src/__tests__/AbstractPackageTest.ts +52 -4
- package/src/__tests__/impl/LiblslAdapter.test.ts +181 -16
- package/src/__tests__/impl/LslEventMarkerOutlet.test.ts +5 -5
- package/src/__tests__/impl/LslStreamInfo.test.ts +3 -3
- package/src/__tests__/impl/LslStreamInlet.test.ts +253 -20
- package/src/__tests__/impl/LslStreamOutlet.test.ts +111 -24
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +163 -5
- package/src/assertions.ts +7 -7
- package/src/handleError.ts +24 -0
- package/src/impl/LiblslAdapter.ts +322 -97
- package/src/impl/LslEventMarkerOutlet.ts +8 -4
- package/src/impl/LslStreamInfo.ts +9 -9
- package/src/impl/LslStreamInlet.ts +233 -25
- package/src/impl/LslStreamOutlet.ts +43 -33
- package/src/impl/LslWebSocketBridge.ts +115 -5
- package/src/index.ts +0 -2
- package/src/scripts/runLslStreamOutlet.ts +2 -3
- package/src/scripts/runOutletToInlet.ts +53 -0
- package/src/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.ts +4 -2
- package/src/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.ts +5 -2
- package/src/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.ts +4 -2
- package/src/testDoubles/Liblsl/FakeLiblsl.ts +61 -1
- package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +1 -1
- package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +36 -5
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +7 -2
- package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +7 -7
- package/src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts +18 -0
- package/src/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.ts +9 -0
- package/src/testDoubles/WebSockets/FakeWebSocket.ts +17 -0
- package/src/testDoubles/WebSockets/FakeWebSocketServer.ts +32 -0
- package/src/testDoubles/generateRandomOutletOptions.ts +3 -3
- package/build/types.d.ts +0 -95
- package/build/types.js +0 -2
- package/build/types.js.map +0 -1
- package/src/types.ts +0 -111
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { StreamTransportBridge } from '../../impl/LslWebSocketBridge.js';
|
|
2
2
|
export default class FakeStreamTransportBridge implements StreamTransportBridge {
|
|
3
3
|
static numCallsToConstructor: number;
|
|
4
|
+
static numCallsToActivate: number;
|
|
5
|
+
static numCallsToDeactivate: number;
|
|
6
|
+
static numCallsToDestroy: number;
|
|
4
7
|
constructor();
|
|
8
|
+
activate(): void;
|
|
9
|
+
deactivate(): void;
|
|
10
|
+
destroy(): void;
|
|
5
11
|
static resetTestDouble(): void;
|
|
6
12
|
}
|
|
@@ -1,10 +1,25 @@
|
|
|
1
1
|
export default class FakeStreamTransportBridge {
|
|
2
2
|
static numCallsToConstructor = 0;
|
|
3
|
+
static numCallsToActivate = 0;
|
|
4
|
+
static numCallsToDeactivate = 0;
|
|
5
|
+
static numCallsToDestroy = 0;
|
|
3
6
|
constructor() {
|
|
4
7
|
FakeStreamTransportBridge.numCallsToConstructor++;
|
|
5
8
|
}
|
|
9
|
+
activate() {
|
|
10
|
+
FakeStreamTransportBridge.numCallsToActivate++;
|
|
11
|
+
}
|
|
12
|
+
deactivate() {
|
|
13
|
+
FakeStreamTransportBridge.numCallsToDeactivate++;
|
|
14
|
+
}
|
|
15
|
+
destroy() {
|
|
16
|
+
FakeStreamTransportBridge.numCallsToDestroy++;
|
|
17
|
+
}
|
|
6
18
|
static resetTestDouble() {
|
|
7
19
|
FakeStreamTransportBridge.numCallsToConstructor = 0;
|
|
20
|
+
FakeStreamTransportBridge.numCallsToActivate = 0;
|
|
21
|
+
FakeStreamTransportBridge.numCallsToDeactivate = 0;
|
|
22
|
+
FakeStreamTransportBridge.numCallsToDestroy = 0;
|
|
8
23
|
}
|
|
9
24
|
}
|
|
10
25
|
//# sourceMappingURL=FakeStreamTransportBridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FakeStreamTransportBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAGnC,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"FakeStreamTransportBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAGnC,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAA;IAChC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAA;IAC7B,MAAM,CAAC,oBAAoB,GAAG,CAAC,CAAA;IAC/B,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAEnC;QACI,yBAAyB,CAAC,qBAAqB,EAAE,CAAA;IACrD,CAAC;IAEM,QAAQ;QACX,yBAAyB,CAAC,kBAAkB,EAAE,CAAA;IAClD,CAAC;IAEM,UAAU;QACb,yBAAyB,CAAC,oBAAoB,EAAE,CAAA;IACpD,CAAC;IAEM,OAAO;QACV,yBAAyB,CAAC,iBAAiB,EAAE,CAAA;IACjD,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,yBAAyB,CAAC,qBAAqB,GAAG,CAAC,CAAA;QACnD,yBAAyB,CAAC,kBAAkB,GAAG,CAAC,CAAA;QAChD,yBAAyB,CAAC,oBAAoB,GAAG,CAAC,CAAA;QAClD,yBAAyB,CAAC,iBAAiB,GAAG,CAAC,CAAA;IACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpyLslWebSocketBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,kBAEN,MAAM,kCAAkC,CAAA;AAEzC,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,kBAAkB;IACjE,YAAmB,OAAgD;QAC/D,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;CACJ"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import generateId from '@neurodevs/generate-id';
|
|
2
|
+
import WebSocket from 'ws';
|
|
3
|
+
export default class FakeWebSocket {
|
|
4
|
+
static callsToSend = [];
|
|
5
|
+
readyState = WebSocket.OPEN;
|
|
6
|
+
id = generateId();
|
|
7
|
+
send(data) {
|
|
8
|
+
FakeWebSocket.callsToSend.push({ id: this.id, data });
|
|
9
|
+
}
|
|
10
|
+
static resetTestDouble() {
|
|
11
|
+
FakeWebSocket.callsToSend = [];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=FakeWebSocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FakeWebSocket.js","sourceRoot":"","sources":["../../../src/testDoubles/WebSockets/FakeWebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAC/C,OAAO,SAAS,MAAM,IAAI,CAAA;AAE1B,MAAM,CAAC,OAAO,OAAO,aAAa;IACvB,MAAM,CAAC,WAAW,GAAoC,EAAE,CAAA;IAExD,UAAU,GAAW,SAAS,CAAC,IAAI,CAAA;IACnC,EAAE,GAAG,UAAU,EAAE,CAAA;IAEjB,IAAI,CAAC,IAAa;QACrB,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IACzD,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,aAAa,CAAC,WAAW,GAAG,EAAE,CAAA;IAClC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import FakeWebSocket from './FakeWebSocket.js';
|
|
2
|
+
export default class FakeWebSocketServer {
|
|
3
|
+
static callsToConstructor: FakeWSSConstructorOptions[];
|
|
4
|
+
static numCallsToClose: number;
|
|
5
|
+
static clients: Set<FakeWebSocket>;
|
|
6
|
+
clients: Set<FakeWebSocket>;
|
|
7
|
+
constructor(options: FakeWSSConstructorOptions);
|
|
8
|
+
close(): void;
|
|
9
|
+
static resetTestDouble(): void;
|
|
10
|
+
}
|
|
11
|
+
export interface FakeWSSConstructorOptions {
|
|
12
|
+
port: number;
|
|
13
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import FakeWebSocket from './FakeWebSocket.js';
|
|
2
|
+
export default class FakeWebSocketServer {
|
|
3
|
+
static callsToConstructor = [];
|
|
4
|
+
static numCallsToClose = 0;
|
|
5
|
+
static clients = new Set([
|
|
6
|
+
new FakeWebSocket(),
|
|
7
|
+
new FakeWebSocket(),
|
|
8
|
+
]);
|
|
9
|
+
clients = FakeWebSocketServer.clients;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
FakeWebSocketServer.callsToConstructor.push(options);
|
|
12
|
+
}
|
|
13
|
+
close() {
|
|
14
|
+
FakeWebSocketServer.numCallsToClose += 1;
|
|
15
|
+
}
|
|
16
|
+
static resetTestDouble() {
|
|
17
|
+
FakeWebSocketServer.callsToConstructor = [];
|
|
18
|
+
FakeWebSocketServer.numCallsToClose = 0;
|
|
19
|
+
FakeWebSocket.resetTestDouble();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=FakeWebSocketServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FakeWebSocketServer.js","sourceRoot":"","sources":["../../../src/testDoubles/WebSockets/FakeWebSocketServer.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC7B,MAAM,CAAC,kBAAkB,GAAgC,EAAE,CAAA;IAC3D,MAAM,CAAC,eAAe,GAAG,CAAC,CAAA;IAE1B,MAAM,CAAC,OAAO,GAAG,IAAI,GAAG,CAAgB;QAC3C,IAAI,aAAa,EAAE;QACnB,IAAI,aAAa,EAAE;KACtB,CAAC,CAAA;IAEK,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAA;IAE5C,YAAmB,OAAkC;QACjD,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxD,CAAC;IAEM,KAAK;QACR,mBAAmB,CAAC,eAAe,IAAI,CAAC,CAAA;IAC5C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,mBAAmB,CAAC,kBAAkB,GAAG,EAAE,CAAA;QAC3C,mBAAmB,CAAC,eAAe,GAAG,CAAC,CAAA;QAEvC,aAAa,CAAC,eAAe,EAAE,CAAA;IACnC,CAAC"}
|
|
@@ -7,13 +7,13 @@ export default function generateRandomOutletOptions() {
|
|
|
7
7
|
name: generateId(),
|
|
8
8
|
type: generateId(),
|
|
9
9
|
channelNames: new Array(randomInt(1, 10)).fill(generateId()),
|
|
10
|
-
|
|
10
|
+
sampleRateHz: Math.random() * 10,
|
|
11
11
|
channelFormat: TEST_SUPPORTED_CHANNEL_FORMATS[randomChannelIdx],
|
|
12
12
|
sourceId: generateId(),
|
|
13
13
|
manufacturer: generateId(),
|
|
14
|
-
|
|
14
|
+
units: generateId(),
|
|
15
15
|
chunkSize: randomInt(0, 10),
|
|
16
|
-
|
|
16
|
+
maxBufferedMs: randomInt(0, 10),
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
//# sourceMappingURL=generateRandomOutletOptions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRandomOutletOptions.js","sourceRoot":"","sources":["../../src/testDoubles/generateRandomOutletOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAG/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,OAAO,UAAU,2BAA2B;IAC/C,MAAM,gBAAgB,GAAG,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAA;IAEzE,OAAO;QACH,IAAI,EAAE,UAAU,EAAE;QAClB,IAAI,EAAE,UAAU,EAAE;QAClB,YAAY,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5D,
|
|
1
|
+
{"version":3,"file":"generateRandomOutletOptions.js","sourceRoot":"","sources":["../../src/testDoubles/generateRandomOutletOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAClC,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAG/C,OAAO,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,OAAO,UAAU,2BAA2B;IAC/C,MAAM,gBAAgB,GAAG,SAAS,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAA;IAEzE,OAAO;QACH,IAAI,EAAE,UAAU,EAAE;QAClB,IAAI,EAAE,UAAU,EAAE;QAClB,YAAY,EAAE,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC5D,YAAY,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QAChC,aAAa,EAAE,8BAA8B,CAAC,gBAAgB,CAAC;QAC/D,QAAQ,EAAE,UAAU,EAAE;QACtB,YAAY,EAAE,UAAU,EAAE;QAC1B,KAAK,EAAE,UAAU,EAAE;QACnB,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,aAAa,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;KACX,CAAA;AAC5B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neurodevs/node-lsl",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.0",
|
|
4
4
|
"description": "Lab Streaming Layer (LSL) bindings for Node",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -45,15 +45,17 @@
|
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@neurodevs/generate-id": "^1.0.9",
|
|
48
|
-
"ffi-rs": "^1.0
|
|
48
|
+
"ffi-rs": "^1.3.0",
|
|
49
49
|
"node-gyp": "^10.2.0",
|
|
50
50
|
"ref-array-napi": "^1.2.2",
|
|
51
|
-
"ref-napi": "^3.0.3"
|
|
51
|
+
"ref-napi": "^3.0.3",
|
|
52
|
+
"ws": "^8.18.3"
|
|
52
53
|
},
|
|
53
54
|
"devDependencies": {
|
|
54
55
|
"@neurodevs/node-tdd": "^0.2.2",
|
|
55
56
|
"@types/ffi-napi": "^4.0.10",
|
|
56
57
|
"@types/node": "^22.9.0",
|
|
58
|
+
"@types/ws": "^8.18.1",
|
|
57
59
|
"chokidar-cli": "^3.0.0",
|
|
58
60
|
"concurrently": "^9.1.0",
|
|
59
61
|
"eslint": "^9.15.0",
|
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import AbstractModuleTest from '@neurodevs/node-tdd'
|
|
2
2
|
|
|
3
|
+
import { Server } from 'ws'
|
|
3
4
|
import LiblslAdapter from '../impl/LiblslAdapter.js'
|
|
4
5
|
import LslEventMarkerOutlet from '../impl/LslEventMarkerOutlet.js'
|
|
5
6
|
import LslStreamInfo from '../impl/LslStreamInfo.js'
|
|
6
|
-
import LslStreamInlet
|
|
7
|
+
import LslStreamInlet, {
|
|
8
|
+
OnDataCallback,
|
|
9
|
+
StreamInletOptions,
|
|
10
|
+
} from '../impl/LslStreamInlet.js'
|
|
7
11
|
import LslStreamOutlet from '../impl/LslStreamOutlet.js'
|
|
12
|
+
import LslWebSocketBridge from '../impl/LslWebSocketBridge.js'
|
|
8
13
|
import SpyEventMarkerOutlet from '../testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js'
|
|
9
14
|
import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl.js'
|
|
10
15
|
import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo.js'
|
|
11
16
|
import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo.js'
|
|
17
|
+
import FakeStreamInlet from '../testDoubles/StreamInlet/FakeStreamInlet.js'
|
|
12
18
|
import { SpyStreamInlet } from '../testDoubles/StreamInlet/SpyStreamInlet.js'
|
|
13
19
|
import FakeStreamOutlet from '../testDoubles/StreamOutlet/FakeStreamOutlet.js'
|
|
20
|
+
import SpyLslWebSocketBridge from '../testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.js'
|
|
21
|
+
import FakeWebSocketServer from '../testDoubles/WebSockets/FakeWebSocketServer.js'
|
|
14
22
|
|
|
15
23
|
export default class AbstractPackageTest extends AbstractModuleTest {
|
|
16
24
|
protected static fakeLiblsl: FakeLiblsl
|
|
@@ -24,6 +32,8 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
24
32
|
protected static setFakeLiblsl() {
|
|
25
33
|
this.fakeLiblsl = new FakeLiblsl()
|
|
26
34
|
LiblslAdapter.setInstance(this.fakeLiblsl)
|
|
35
|
+
|
|
36
|
+
FakeLiblsl.fakeErrorCode = 0
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
protected static setSpyStreamInfo() {
|
|
@@ -39,6 +49,11 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
39
49
|
LslStreamInlet.Class = SpyStreamInlet
|
|
40
50
|
}
|
|
41
51
|
|
|
52
|
+
protected static setFakeStreamInlet() {
|
|
53
|
+
LslStreamInlet.Class = FakeStreamInlet
|
|
54
|
+
FakeStreamInlet.resetTestDouble()
|
|
55
|
+
}
|
|
56
|
+
|
|
42
57
|
protected static setFakeStreamOutlet() {
|
|
43
58
|
LslStreamOutlet.Class = FakeStreamOutlet
|
|
44
59
|
FakeStreamOutlet.resetTestDouble()
|
|
@@ -48,6 +63,15 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
48
63
|
LslEventMarkerOutlet.Class = SpyEventMarkerOutlet
|
|
49
64
|
}
|
|
50
65
|
|
|
66
|
+
protected static setSpyLslWebSocketBridge() {
|
|
67
|
+
LslWebSocketBridge.Class = SpyLslWebSocketBridge
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
protected static setFakeWebSocketServer() {
|
|
71
|
+
LslWebSocketBridge.WSS = FakeWebSocketServer as unknown as typeof Server
|
|
72
|
+
FakeWebSocketServer.resetTestDouble()
|
|
73
|
+
}
|
|
74
|
+
|
|
51
75
|
protected static readonly name_ = this.generateId()
|
|
52
76
|
protected static readonly type = this.generateId()
|
|
53
77
|
protected static readonly sourceId = this.generateId()
|
|
@@ -56,9 +80,33 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
56
80
|
protected static readonly channelNames = [
|
|
57
81
|
this.generateId(),
|
|
58
82
|
this.generateId(),
|
|
83
|
+
this.generateId(),
|
|
59
84
|
]
|
|
60
85
|
|
|
61
|
-
protected static
|
|
62
|
-
|
|
63
|
-
|
|
86
|
+
protected static get channelCount() {
|
|
87
|
+
return this.channelNames.length
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
protected static readonly chunkSize = 2
|
|
91
|
+
protected static readonly sampleRateHz = Math.floor(Math.random() * 100)
|
|
92
|
+
protected static readonly maxBufferedMs = Math.floor(Math.random() * 1000)
|
|
93
|
+
|
|
94
|
+
protected static LslStreamInlet(
|
|
95
|
+
options: Partial<StreamInletOptions>,
|
|
96
|
+
onData: OnDataCallback
|
|
97
|
+
) {
|
|
98
|
+
const defaultOptions = {
|
|
99
|
+
sampleRateHz: 0,
|
|
100
|
+
channelNames: this.channelNames,
|
|
101
|
+
channelFormat: 'float32',
|
|
102
|
+
chunkSize: this.chunkSize,
|
|
103
|
+
maxBufferedMs: this.maxBufferedMs,
|
|
104
|
+
name: this.name_,
|
|
105
|
+
type: this.type,
|
|
106
|
+
sourceId: this.sourceId,
|
|
107
|
+
...options,
|
|
108
|
+
} as StreamInletOptions
|
|
109
|
+
|
|
110
|
+
return LslStreamInlet.Create(defaultOptions, onData)
|
|
111
|
+
}
|
|
64
112
|
}
|
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
import { randomInt } from 'crypto'
|
|
2
2
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
createPointer,
|
|
5
|
+
DataType,
|
|
6
|
+
FieldType,
|
|
7
|
+
FuncObj,
|
|
8
|
+
OpenParams,
|
|
9
|
+
unwrapPointer,
|
|
10
|
+
} from 'ffi-rs'
|
|
4
11
|
|
|
5
|
-
import LiblslAdapter from '../../impl/LiblslAdapter.js'
|
|
6
|
-
import FakeLiblsl from '../../testDoubles/Liblsl/FakeLiblsl.js'
|
|
7
12
|
import {
|
|
8
13
|
BoundChild,
|
|
9
14
|
BoundDescription,
|
|
10
15
|
BoundInlet,
|
|
11
16
|
BoundOutlet,
|
|
12
17
|
BoundStreamInfo,
|
|
13
|
-
FfiRsDefineOptions,
|
|
14
18
|
Liblsl,
|
|
15
19
|
LiblslBindings,
|
|
16
20
|
LslChannel,
|
|
17
|
-
} from '
|
|
21
|
+
} from 'impl/LiblslAdapter.js'
|
|
22
|
+
import LiblslAdapter from '../../impl/LiblslAdapter.js'
|
|
23
|
+
import FakeLiblsl from '../../testDoubles/Liblsl/FakeLiblsl.js'
|
|
18
24
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
19
25
|
|
|
20
26
|
export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
@@ -44,6 +50,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
44
50
|
private static appendChildHitCount: number
|
|
45
51
|
private static ffiRsOpenOptions?: OpenParams
|
|
46
52
|
private static ffiRsDefineOptions: FfiRsDefineOptions
|
|
53
|
+
private static ffiRsLoadOptions?: Record<string, any>
|
|
47
54
|
|
|
48
55
|
protected static async beforeEach() {
|
|
49
56
|
await super.beforeEach()
|
|
@@ -74,11 +81,11 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
74
81
|
this.appendChildHitCount = 0
|
|
75
82
|
|
|
76
83
|
delete this.ffiRsOpenOptions
|
|
77
|
-
LiblslAdapter.
|
|
84
|
+
LiblslAdapter.open = (options) => {
|
|
78
85
|
this.ffiRsOpenOptions = options
|
|
79
86
|
}
|
|
80
87
|
|
|
81
|
-
LiblslAdapter.
|
|
88
|
+
LiblslAdapter.define = (options) => {
|
|
82
89
|
this.ffiRsDefineOptions = options as FfiRsDefineOptions
|
|
83
90
|
if (this.shouldThrowWhenCreatingBindings) {
|
|
84
91
|
throw new Error('Failed to create bindings!')
|
|
@@ -86,6 +93,11 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
86
93
|
return this.fakeBindings as any
|
|
87
94
|
}
|
|
88
95
|
|
|
96
|
+
LiblslAdapter.load = (options) => {
|
|
97
|
+
this.ffiRsLoadOptions = options
|
|
98
|
+
return {} as any
|
|
99
|
+
}
|
|
100
|
+
|
|
89
101
|
LiblslAdapter.resetInstance()
|
|
90
102
|
this.instance = LiblslAdapter.getInstance()
|
|
91
103
|
}
|
|
@@ -157,7 +169,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
157
169
|
},
|
|
158
170
|
lsl_push_sample_ft: {
|
|
159
171
|
library: 'lsl',
|
|
160
|
-
retType: DataType.
|
|
172
|
+
retType: DataType.I32,
|
|
161
173
|
paramsType: [
|
|
162
174
|
DataType.External,
|
|
163
175
|
DataType.FloatArray,
|
|
@@ -166,7 +178,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
166
178
|
},
|
|
167
179
|
lsl_push_sample_strt: {
|
|
168
180
|
library: 'lsl',
|
|
169
|
-
retType: DataType.
|
|
181
|
+
retType: DataType.I32,
|
|
170
182
|
paramsType: [
|
|
171
183
|
DataType.External,
|
|
172
184
|
DataType.StringArray,
|
|
@@ -232,7 +244,13 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
232
244
|
@test()
|
|
233
245
|
protected static async canCreateOutletWithRequiredParams() {
|
|
234
246
|
const { options, outlet } = this.createRandomOutlet()
|
|
235
|
-
|
|
247
|
+
|
|
248
|
+
const expected = {
|
|
249
|
+
...options,
|
|
250
|
+
maxBufferedMs: options.maxBufferedMs / 1000,
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
assert.isEqualDeep(this.createOutletParams, Object.values(expected))
|
|
236
254
|
assert.isEqual(outlet, this.fakeOutlet)
|
|
237
255
|
}
|
|
238
256
|
|
|
@@ -304,7 +322,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
304
322
|
assert.isEqual(this.appendChildValueParams[2][1], 'type')
|
|
305
323
|
|
|
306
324
|
assert.isEqual(this.appendChildValueParams[0][2], channel.label)
|
|
307
|
-
assert.isEqual(this.appendChildValueParams[1][2], channel.
|
|
325
|
+
assert.isEqual(this.appendChildValueParams[1][2], channel.units)
|
|
308
326
|
assert.isEqual(this.appendChildValueParams[2][2], channel.type)
|
|
309
327
|
}
|
|
310
328
|
|
|
@@ -326,7 +344,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
326
344
|
assert.isEqual(this.appendChildParams?.[2][1], 'channel')
|
|
327
345
|
|
|
328
346
|
assert.isEqual(this.appendChildValueParams[3][2], channel2.label)
|
|
329
|
-
assert.isEqual(this.appendChildValueParams[4][2], channel2.
|
|
347
|
+
assert.isEqual(this.appendChildValueParams[4][2], channel2.units)
|
|
330
348
|
assert.isEqual(this.appendChildValueParams[5][2], channel2.type)
|
|
331
349
|
}
|
|
332
350
|
|
|
@@ -370,10 +388,141 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
370
388
|
@test()
|
|
371
389
|
protected static async canCreateInletWithRequiredParams() {
|
|
372
390
|
const { options, inlet } = this.createRandomInlet()
|
|
373
|
-
|
|
391
|
+
|
|
392
|
+
const expected = {
|
|
393
|
+
...options,
|
|
394
|
+
maxBufferedMs: options.maxBufferedMs / 1000,
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
assert.isEqualDeep(this.createInletParams, Object.values(expected))
|
|
374
398
|
assert.isEqual(inlet, this.fakeInlet)
|
|
375
399
|
}
|
|
376
400
|
|
|
401
|
+
@test()
|
|
402
|
+
protected static async pullSampleCallsBinding() {
|
|
403
|
+
const { inlet } = this.createRandomInlet()
|
|
404
|
+
|
|
405
|
+
const dataBuffer = Buffer.alloc(4 * this.channelCount)
|
|
406
|
+
const dataBufferElements = this.channelCount
|
|
407
|
+
const timeout = 0.0
|
|
408
|
+
|
|
409
|
+
const dataBufferPtr = unwrapPointer(
|
|
410
|
+
createPointer({
|
|
411
|
+
paramsType: [DataType.U8Array],
|
|
412
|
+
paramsValue: [dataBuffer],
|
|
413
|
+
})
|
|
414
|
+
)[0]
|
|
415
|
+
|
|
416
|
+
const errcodePtr = unwrapPointer(
|
|
417
|
+
createPointer({
|
|
418
|
+
paramsType: [DataType.U8Array],
|
|
419
|
+
paramsValue: [new Int32Array(1)],
|
|
420
|
+
})
|
|
421
|
+
)[0]
|
|
422
|
+
|
|
423
|
+
this.instance.pullSample({
|
|
424
|
+
inlet,
|
|
425
|
+
dataBufferPtr,
|
|
426
|
+
dataBufferElements,
|
|
427
|
+
timeout,
|
|
428
|
+
errcodePtr,
|
|
429
|
+
})
|
|
430
|
+
|
|
431
|
+
assert.isEqualDeep(
|
|
432
|
+
this.ffiRsLoadOptions,
|
|
433
|
+
{
|
|
434
|
+
library: 'lsl',
|
|
435
|
+
funcName: 'lsl_pull_sample_f',
|
|
436
|
+
retType: DataType.Double,
|
|
437
|
+
paramsType: [
|
|
438
|
+
DataType.External,
|
|
439
|
+
DataType.External,
|
|
440
|
+
DataType.I32,
|
|
441
|
+
DataType.Double,
|
|
442
|
+
DataType.External,
|
|
443
|
+
],
|
|
444
|
+
paramsValue: [
|
|
445
|
+
inlet,
|
|
446
|
+
dataBufferPtr,
|
|
447
|
+
dataBufferElements,
|
|
448
|
+
timeout,
|
|
449
|
+
errcodePtr,
|
|
450
|
+
],
|
|
451
|
+
},
|
|
452
|
+
'Did not call pullSample with expected options!'
|
|
453
|
+
)
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
@test()
|
|
457
|
+
protected static async pullChunkCallsBinding() {
|
|
458
|
+
const { inlet } = this.createRandomInlet()
|
|
459
|
+
|
|
460
|
+
const dataBuffer = Buffer.alloc(4 * this.chunkSize * this.channelCount)
|
|
461
|
+
const timestampBuffer = Buffer.alloc(8 * this.chunkSize)
|
|
462
|
+
const dataBufferElements = this.chunkSize * this.channelCount
|
|
463
|
+
const timestampBufferElements = this.chunkSize
|
|
464
|
+
const timeout = 0.0
|
|
465
|
+
|
|
466
|
+
const dataBufferPtr = unwrapPointer(
|
|
467
|
+
createPointer({
|
|
468
|
+
paramsType: [DataType.U8Array],
|
|
469
|
+
paramsValue: [dataBuffer],
|
|
470
|
+
})
|
|
471
|
+
)[0]
|
|
472
|
+
|
|
473
|
+
const timestampBufferPtr = unwrapPointer(
|
|
474
|
+
createPointer({
|
|
475
|
+
paramsType: [DataType.U8Array],
|
|
476
|
+
paramsValue: [timestampBuffer],
|
|
477
|
+
})
|
|
478
|
+
)[0]
|
|
479
|
+
|
|
480
|
+
const errcodePtr = unwrapPointer(
|
|
481
|
+
createPointer({
|
|
482
|
+
paramsType: [DataType.U8Array],
|
|
483
|
+
paramsValue: [new Int32Array(1)],
|
|
484
|
+
})
|
|
485
|
+
)[0]
|
|
486
|
+
|
|
487
|
+
this.instance.pullChunk({
|
|
488
|
+
inlet,
|
|
489
|
+
dataBufferPtr,
|
|
490
|
+
timestampBufferPtr,
|
|
491
|
+
dataBufferElements,
|
|
492
|
+
timestampBufferElements,
|
|
493
|
+
timeout,
|
|
494
|
+
errcodePtr,
|
|
495
|
+
})
|
|
496
|
+
|
|
497
|
+
assert.isEqualDeep(
|
|
498
|
+
this.ffiRsLoadOptions,
|
|
499
|
+
{
|
|
500
|
+
library: 'lsl',
|
|
501
|
+
funcName: 'lsl_pull_chunk_f',
|
|
502
|
+
retType: DataType.Double,
|
|
503
|
+
paramsType: [
|
|
504
|
+
DataType.External,
|
|
505
|
+
DataType.External,
|
|
506
|
+
DataType.External,
|
|
507
|
+
DataType.I32,
|
|
508
|
+
DataType.I32,
|
|
509
|
+
DataType.Double,
|
|
510
|
+
DataType.External,
|
|
511
|
+
],
|
|
512
|
+
paramsValue: [
|
|
513
|
+
inlet,
|
|
514
|
+
dataBufferPtr,
|
|
515
|
+
timestampBufferPtr,
|
|
516
|
+
dataBufferElements,
|
|
517
|
+
timestampBufferElements,
|
|
518
|
+
timeout,
|
|
519
|
+
errcodePtr,
|
|
520
|
+
],
|
|
521
|
+
},
|
|
522
|
+
'Did not call pullChunk with expected options!'
|
|
523
|
+
)
|
|
524
|
+
}
|
|
525
|
+
|
|
377
526
|
@test()
|
|
378
527
|
protected static async flushInletCallsBinding() {
|
|
379
528
|
const { inlet } = this.createRandomInlet()
|
|
@@ -386,6 +535,18 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
386
535
|
)
|
|
387
536
|
}
|
|
388
537
|
|
|
538
|
+
@test()
|
|
539
|
+
protected static async destroyInletCallsBinding() {
|
|
540
|
+
const { inlet } = this.createRandomInlet()
|
|
541
|
+
this.instance.destroyInlet({ inlet })
|
|
542
|
+
|
|
543
|
+
assert.isEqualDeep(
|
|
544
|
+
this.destroyInletParams,
|
|
545
|
+
[inlet],
|
|
546
|
+
'Should have called destroyInlet with expected params!'
|
|
547
|
+
)
|
|
548
|
+
}
|
|
549
|
+
|
|
389
550
|
private static createRandomStreamInfo() {
|
|
390
551
|
return this.instance.createStreamInfo(
|
|
391
552
|
this.generateRandomCreateStreamInfoOptions()
|
|
@@ -409,7 +570,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
409
570
|
const options = {
|
|
410
571
|
info,
|
|
411
572
|
chunkSize: randomInt(10),
|
|
412
|
-
|
|
573
|
+
maxBufferedMs: randomInt(10),
|
|
413
574
|
}
|
|
414
575
|
return options
|
|
415
576
|
}
|
|
@@ -418,7 +579,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
418
579
|
return {
|
|
419
580
|
label: this.generateId(),
|
|
420
581
|
type: this.generateId(),
|
|
421
|
-
|
|
582
|
+
units: this.generateId(),
|
|
422
583
|
}
|
|
423
584
|
}
|
|
424
585
|
|
|
@@ -427,7 +588,7 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
427
588
|
name: this.generateId(),
|
|
428
589
|
type: this.generateId(),
|
|
429
590
|
channelCount: randomInt(1, 10),
|
|
430
|
-
|
|
591
|
+
sampleRateHz: randomInt(100),
|
|
431
592
|
channelFormat: randomInt(7),
|
|
432
593
|
sourceId: this.generateId(),
|
|
433
594
|
}
|
|
@@ -449,9 +610,11 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
449
610
|
},
|
|
450
611
|
lsl_push_sample_ft: (params: any[]) => {
|
|
451
612
|
this.pushSampleFloatTimestampParams = params
|
|
613
|
+
return 0
|
|
452
614
|
},
|
|
453
615
|
lsl_push_sample_strt: (params: any[]) => {
|
|
454
616
|
this.pushSampleStringTimestampParams = params
|
|
617
|
+
return 0
|
|
455
618
|
},
|
|
456
619
|
lsl_destroy_outlet: (params: any[]) => {
|
|
457
620
|
this.destroyOutletParams = params
|
|
@@ -489,3 +652,5 @@ export default class LiblslAdapterTest extends AbstractPackageTest {
|
|
|
489
652
|
}
|
|
490
653
|
}
|
|
491
654
|
}
|
|
655
|
+
|
|
656
|
+
export type FfiRsDefineOptions = FuncObj<FieldType, boolean | undefined>
|
|
@@ -31,14 +31,14 @@ export default class EventMarkerOutletTest extends AbstractPackageTest {
|
|
|
31
31
|
assert.isEqualDeep(FakeStreamOutlet.callsToConstructor[0].options, {
|
|
32
32
|
name: 'Event markers',
|
|
33
33
|
type: 'Markers',
|
|
34
|
+
sourceId: 'event-markers',
|
|
34
35
|
channelNames: ['Markers'],
|
|
35
|
-
sampleRate: 0,
|
|
36
36
|
channelFormat: 'string',
|
|
37
|
-
|
|
38
|
-
manufacturer: 'N/A',
|
|
39
|
-
unit: 'N/A',
|
|
37
|
+
sampleRateHz: 0,
|
|
40
38
|
chunkSize: 0,
|
|
41
|
-
|
|
39
|
+
maxBufferedMs: 0,
|
|
40
|
+
manufacturer: 'N/A',
|
|
41
|
+
units: 'N/A',
|
|
42
42
|
})
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -146,7 +146,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
146
146
|
sourceId: this.generateId(),
|
|
147
147
|
channelCount: this.channelNames.length,
|
|
148
148
|
channelFormat: CHANNEL_FORMATS[randomChannelIdx],
|
|
149
|
-
|
|
149
|
+
sampleRateHz: 100 * Math.random(),
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
this.LslStreamInfo(options)
|
|
@@ -173,7 +173,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
173
173
|
info: this.instance.getStreamInfo(),
|
|
174
174
|
channels: this.channelNames.map((label: string) => ({
|
|
175
175
|
label,
|
|
176
|
-
|
|
176
|
+
units: this.units,
|
|
177
177
|
type: this.type,
|
|
178
178
|
})),
|
|
179
179
|
},
|
|
@@ -187,7 +187,7 @@ export default class LslStreamInfoTest extends AbstractPackageTest {
|
|
|
187
187
|
sourceId: this.generateId(),
|
|
188
188
|
channelNames: this.channelNames,
|
|
189
189
|
channelFormat: 'float32',
|
|
190
|
-
|
|
190
|
+
sampleRateHz: 100 * Math.random(),
|
|
191
191
|
} as StreamInfoOptions
|
|
192
192
|
|
|
193
193
|
private static LslStreamInfo(options?: Partial<StreamInfoOptions>) {
|