@neurodevs/node-lsl 10.2.1 → 11.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 +17 -38
- package/build/__tests__/{AbstractNodeLslTest.d.ts → AbstractLslTest.d.ts} +7 -6
- package/build/__tests__/{AbstractNodeLslTest.js → AbstractLslTest.js} +30 -24
- package/build/__tests__/AbstractLslTest.js.map +1 -0
- package/build/__tests__/{TimeMarkerOutlet.test.d.ts → EventMarkerOutlet.test.d.ts} +9 -8
- package/build/__tests__/{TimeMarkerOutlet.test.js → EventMarkerOutlet.test.js} +53 -48
- package/build/__tests__/EventMarkerOutlet.test.js.map +1 -0
- package/build/__tests__/{Liblsl.test.d.ts → LiblslAdapter.test.d.ts} +2 -2
- package/build/__tests__/{Liblsl.test.js → LiblslAdapter.test.js} +43 -75
- package/build/__tests__/LiblslAdapter.test.js.map +1 -0
- package/build/__tests__/LslStreamInfo.test.d.ts +3 -3
- package/build/__tests__/LslStreamInfo.test.js +3 -3
- package/build/__tests__/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/{LslInlet.test.d.ts → LslStreamInlet.test.d.ts} +4 -4
- package/build/__tests__/{LslInlet.test.js → LslStreamInlet.test.js} +19 -19
- package/build/__tests__/LslStreamInlet.test.js.map +1 -0
- package/build/__tests__/{LslOutlet.test.d.ts → LslStreamOutlet.test.d.ts} +3 -3
- package/build/__tests__/{LslOutlet.test.js → LslStreamOutlet.test.js} +45 -41
- package/build/__tests__/LslStreamOutlet.test.js.map +1 -0
- package/build/components/EventMarkerOutlet.d.ts +20 -0
- package/build/components/{TimeMarkerOutlet.js → EventMarkerOutlet.js} +11 -10
- package/build/components/EventMarkerOutlet.js.map +1 -0
- package/build/components/{Liblsl.d.ts → LiblslAdapter.d.ts} +1 -1
- package/build/components/{Liblsl.js → LiblslAdapter.js} +7 -7
- package/build/components/LiblslAdapter.js.map +1 -0
- package/build/components/LslStreamInfo.js +2 -2
- package/build/components/LslStreamInfo.js.map +1 -1
- package/build/components/{LslInlet.d.ts → LslStreamInlet.d.ts} +4 -4
- package/build/components/{LslInlet.js → LslStreamInlet.js} +5 -5
- package/build/components/LslStreamInlet.js.map +1 -0
- package/build/components/{LslOutlet.d.ts → LslStreamOutlet.d.ts} +1 -1
- package/build/components/{LslOutlet.js → LslStreamOutlet.js} +5 -5
- package/build/components/LslStreamOutlet.js.map +1 -0
- package/build/index.d.ts +20 -19
- package/build/index.js +33 -28
- package/build/index.js.map +1 -1
- package/build/nodeLsl.types.d.ts +3 -3
- package/build/testDoubles/{FakeLiblsl.d.ts → Liblsl/FakeLiblsl.d.ts} +1 -1
- package/build/testDoubles/Liblsl/FakeLiblsl.js.map +1 -0
- package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +7 -0
- package/build/testDoubles/{SpyLslInlet.js → LslInlet/SpyLslInlet.js} +2 -2
- package/build/testDoubles/LslInlet/SpyLslInlet.js.map +1 -0
- package/build/testDoubles/{FakeLslOutlet.d.ts → LslOutlet/FakeLslOutlet.d.ts} +3 -5
- package/build/testDoubles/{FakeLslOutlet.js → LslOutlet/FakeLslOutlet.js} +0 -4
- package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +1 -0
- package/build/testDoubles/{FakeTimeMarkerOutlet.d.ts → MarkerOutlet/FakeMarkerOutlet.d.ts} +4 -4
- package/build/testDoubles/{FakeTimeMarkerOutlet.js → MarkerOutlet/FakeMarkerOutlet.js} +4 -4
- package/build/testDoubles/MarkerOutlet/FakeMarkerOutlet.js.map +1 -0
- package/build/testDoubles/{MockTimeMarkerOutlet.d.ts → MarkerOutlet/MockMarkerOutlet.d.ts} +3 -2
- package/build/testDoubles/{MockTimeMarkerOutlet.js → MarkerOutlet/MockMarkerOutlet.js} +3 -3
- package/build/testDoubles/MarkerOutlet/MockMarkerOutlet.js.map +1 -0
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.d.ts +9 -0
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.js +24 -0
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.js.map +1 -0
- package/build/testDoubles/{FakeStreamInfo.d.ts → StreamInfo/FakeStreamInfo.d.ts} +2 -2
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -0
- package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +9 -0
- package/build/testDoubles/{SpyLslStreamInfo.js → StreamInfo/SpyStreamInfo.js} +4 -4
- package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +1 -0
- package/build/testDoubles/generateRandomOutletOptions.d.ts +1 -1
- package/package.json +1 -1
- package/src/__tests__/AbstractLslTest.ts +58 -0
- package/src/__tests__/EventMarkerOutlet.test.ts +165 -0
- package/src/__tests__/{Liblsl.test.ts → LiblslAdapter.test.ts} +18 -22
- package/src/__tests__/LslStreamInfo.test.ts +12 -12
- package/src/__tests__/{LslInlet.test.ts → LslStreamInlet.test.ts} +13 -13
- package/src/__tests__/{LslOutlet.test.ts → LslStreamOutlet.test.ts} +28 -22
- package/src/components/{TimeMarkerOutlet.ts → EventMarkerOutlet.ts} +17 -17
- package/src/components/{Liblsl.ts → LiblslAdapter.ts} +3 -3
- package/src/components/LslStreamInfo.ts +2 -2
- package/src/components/{LslInlet.ts → LslStreamInlet.ts} +5 -5
- package/src/components/{LslOutlet.ts → LslStreamOutlet.ts} +3 -3
- package/src/index.ts +28 -19
- package/src/nodeLsl.types.ts +3 -3
- package/src/testDoubles/{FakeLiblsl.ts → Liblsl/FakeLiblsl.ts} +1 -1
- package/src/testDoubles/{SpyLslInlet.ts → LslInlet/SpyLslInlet.ts} +5 -3
- package/src/testDoubles/{FakeLslOutlet.ts → LslOutlet/FakeLslOutlet.ts} +3 -9
- package/src/testDoubles/{FakeTimeMarkerOutlet.ts → MarkerOutlet/FakeMarkerOutlet.ts} +4 -4
- package/src/testDoubles/{MockTimeMarkerOutlet.ts → MarkerOutlet/MockMarkerOutlet.ts} +3 -2
- package/src/testDoubles/MarkerOutlet/SpyMarkerOutlet.ts +24 -0
- package/src/testDoubles/{FakeStreamInfo.ts → StreamInfo/FakeStreamInfo.ts} +2 -2
- package/src/testDoubles/{SpyLslStreamInfo.ts → StreamInfo/SpyStreamInfo.ts} +4 -2
- package/src/testDoubles/generateRandomOutletOptions.ts +1 -1
- package/build/__tests__/AbstractNodeLslTest.js.map +0 -1
- package/build/__tests__/Liblsl.test.js.map +0 -1
- package/build/__tests__/LslInlet.test.js.map +0 -1
- package/build/__tests__/LslOutlet.test.js.map +0 -1
- package/build/__tests__/SpyLslStreamInfo.d.ts +0 -5
- package/build/__tests__/SpyLslStreamInfo.js +0 -17
- package/build/__tests__/SpyLslStreamInfo.js.map +0 -1
- package/build/__tests__/TimeMarkerOutlet.test.js.map +0 -1
- package/build/components/Liblsl.js.map +0 -1
- package/build/components/LslInlet.js.map +0 -1
- package/build/components/LslOutlet.js.map +0 -1
- package/build/components/TimeMarkerOutlet.d.ts +0 -19
- package/build/components/TimeMarkerOutlet.js.map +0 -1
- package/build/demo.d.ts +0 -1
- package/build/demo.js +0 -42
- package/build/demo.js.map +0 -1
- package/build/testDoubles/FakeLiblsl.js.map +0 -1
- package/build/testDoubles/FakeLslOutlet.js.map +0 -1
- package/build/testDoubles/FakeLslStreamInfo.d.ts +0 -5
- package/build/testDoubles/FakeLslStreamInfo.js +0 -10
- package/build/testDoubles/FakeLslStreamInfo.js.map +0 -1
- package/build/testDoubles/FakeStreamInfo.js.map +0 -1
- package/build/testDoubles/FakeTimeMarkerOutlet.js.map +0 -1
- package/build/testDoubles/MockTimeMarkerOutlet.js.map +0 -1
- package/build/testDoubles/SpyLslInlet.d.ts +0 -7
- package/build/testDoubles/SpyLslInlet.js.map +0 -1
- package/build/testDoubles/SpyLslStreamInfo.d.ts +0 -9
- package/build/testDoubles/SpyLslStreamInfo.js.map +0 -1
- package/build/testDoubles/SpyTimeMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/SpyTimeMarkerOutlet.js +0 -19
- package/build/testDoubles/SpyTimeMarkerOutlet.js.map +0 -1
- package/src/__tests__/AbstractNodeLslTest.ts +0 -50
- package/src/__tests__/TimeMarkerOutlet.test.ts +0 -151
- package/src/demo.ts +0 -43
- package/src/testDoubles/SpyTimeMarkerOutlet.ts +0 -19
- /package/build/testDoubles/{FakeLiblsl.js → Liblsl/FakeLiblsl.js} +0 -0
- /package/build/testDoubles/{FakeStreamInfo.js → StreamInfo/FakeStreamInfo.js} +0 -0
package/README.md
CHANGED
|
@@ -5,8 +5,8 @@ Lab Streaming Layer (LSL) for synchronized streaming of multi-modal, time-series
|
|
|
5
5
|
- [Overview](#overview)
|
|
6
6
|
- [Installation](#installation)
|
|
7
7
|
- [Usage](#usage)
|
|
8
|
-
- [
|
|
9
|
-
- [
|
|
8
|
+
- [LslStreamOutlet](#lslstreamoutlet)
|
|
9
|
+
- [EventMarkerOutlet](#eventmarkeroutlet)
|
|
10
10
|
- [Test Doubles](#test-doubles)
|
|
11
11
|
|
|
12
12
|
## Overview
|
|
@@ -37,14 +37,14 @@ LIBLSL_PATH=/opt/homebrew/Cellar/lsl/1.16.2/lib/liblsl.1.16.2.dylib
|
|
|
37
37
|
|
|
38
38
|
## Usage
|
|
39
39
|
|
|
40
|
-
###
|
|
40
|
+
### LslStreamOutlet
|
|
41
41
|
|
|
42
42
|
LSL is often used to stream EEG data over a network. For example, to instantiate an LSL outlet for the [Muse S 2nd generation](https://choosemuse.com/products/muse-s-gen-2) headband:
|
|
43
43
|
|
|
44
44
|
```typescript
|
|
45
|
-
import {
|
|
45
|
+
import { LslStreamOutlet } from '@neurodevs/node-lsl'
|
|
46
46
|
|
|
47
|
-
const
|
|
47
|
+
const instance = LslStreamOutlet.Create({
|
|
48
48
|
name: 'Muse S (2nd gen)',
|
|
49
49
|
type: 'EEG',
|
|
50
50
|
channelNames: ['TP9', 'AF7', 'AF8', 'TP10', 'AUX'],
|
|
@@ -58,29 +58,18 @@ const outlet = LslOutletImpl.Outlet({
|
|
|
58
58
|
})
|
|
59
59
|
|
|
60
60
|
// Must be in async function
|
|
61
|
-
await
|
|
61
|
+
await instance.pushSample(...)
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
###
|
|
64
|
+
### EventMarkerOutlet
|
|
65
65
|
|
|
66
|
-
LSL is also often used to push
|
|
66
|
+
LSL is also often used to push event markers that mark different phases of an experiment or session. The `pushMarkers` method pushes an event marker, waits for a specified duration, then pushes the next marker. I recommend that each event marker has a duration of at least 100 ms so that LSL receives the markers in the right order.
|
|
67
67
|
|
|
68
68
|
```typescript
|
|
69
|
-
import {
|
|
69
|
+
import { EventMarkerOutlet } from '@neurodevs/node-lsl'
|
|
70
70
|
|
|
71
|
-
const
|
|
71
|
+
const instance = EventMarkerOutlet.Create()
|
|
72
72
|
|
|
73
|
-
// Must be in async function
|
|
74
|
-
await outlet.pushSample('phase-1-begin')
|
|
75
|
-
|
|
76
|
-
// Wait for phase to end
|
|
77
|
-
|
|
78
|
-
await outlet.pushSample('phase-1-end')
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
There is also a `pushMarkers` method that pushes a time marker, waits for a specified duration, then pushes the next marker. I recommend that each time marker has a duration of at least 100 ms so that LSL receives the markers in the right order.
|
|
82
|
-
|
|
83
|
-
```typescript
|
|
84
73
|
const markers = [
|
|
85
74
|
{ name: 'phase-1-begin', durationMs: 30 * 1000 },
|
|
86
75
|
{ name: 'phase-1-end', durationMs: 0.1 * 1000 },
|
|
@@ -89,38 +78,28 @@ const markers = [
|
|
|
89
78
|
]
|
|
90
79
|
|
|
91
80
|
// Must be in async function, hangs until complete
|
|
92
|
-
await
|
|
81
|
+
await instance.pushMarkers(markers)
|
|
93
82
|
```
|
|
94
83
|
|
|
95
|
-
If you then want to stop the
|
|
84
|
+
If you then want to stop the `EventMarkerOutlet` early, you simply do:
|
|
96
85
|
|
|
97
86
|
```typescript
|
|
98
|
-
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
You can optionally pass any LslOutlet options to the time marker outlet during instantiation. For example, if you want to override the type:
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
import { TimeMarkerOutletImpl } from '@neurodevs/node-lsl'
|
|
105
|
-
|
|
106
|
-
const outlet = TimeMarkerOutletImpl.Outlet({
|
|
107
|
-
type: 'custom-type'
|
|
108
|
-
})
|
|
87
|
+
instance.stop()
|
|
109
88
|
```
|
|
110
89
|
|
|
111
90
|
## Test Doubles
|
|
112
91
|
|
|
113
92
|
This package was developed using test-driven development (TDD). If you also follow TDD, you'll likely want test doubles to fake or mock certain behaviors for these classes.
|
|
114
93
|
|
|
115
|
-
For example, the `
|
|
94
|
+
For example, the `MockMarkerOutlet` class lets you test whether your application appropriately calls its methods without actually doing anything. Set this mock in your test code like this:
|
|
116
95
|
|
|
117
96
|
```typescript
|
|
118
|
-
import {
|
|
97
|
+
import { EventMarkerOutlet, MockMarkerOutlet } from '@neurodevs/node-lsl'
|
|
119
98
|
|
|
120
99
|
// In your tests / beforeEach
|
|
121
|
-
|
|
100
|
+
EventMarkerOutlet.Class = MockMarkerOutlet
|
|
122
101
|
|
|
123
|
-
const mock =
|
|
102
|
+
const mock = EventMarkerOutlet.Create()
|
|
124
103
|
|
|
125
104
|
// Do something in your application that should start the outlet
|
|
126
105
|
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import AbstractSpruceTest from '@sprucelabs/test-utils';
|
|
2
|
-
import FakeLiblsl from '../testDoubles/FakeLiblsl';
|
|
3
|
-
export default class
|
|
2
|
+
import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl';
|
|
3
|
+
export default class AbstractLslTest extends AbstractSpruceTest {
|
|
4
4
|
protected static fakeLiblsl: FakeLiblsl;
|
|
5
5
|
protected static beforeEach(): Promise<void>;
|
|
6
6
|
protected static setFakeLiblsl(): void;
|
|
7
|
-
protected static
|
|
7
|
+
protected static setSpyStreamInfo(): void;
|
|
8
8
|
protected static setFakeStreamInfo(): void;
|
|
9
9
|
protected static setSpyLslInlet(): void;
|
|
10
|
-
protected static
|
|
11
|
-
protected static
|
|
12
|
-
protected static readonly
|
|
10
|
+
protected static setFakeLslOutlet(): void;
|
|
11
|
+
protected static setSpyMarkerOutlet(): void;
|
|
12
|
+
protected static readonly name_: string;
|
|
13
13
|
protected static readonly type: string;
|
|
14
14
|
protected static readonly sourceId: string;
|
|
15
15
|
protected static readonly units: string;
|
|
16
|
+
protected static readonly channelNames: string[];
|
|
16
17
|
protected static readonly chunkSize: number;
|
|
17
18
|
protected static readonly maxBuffered: number;
|
|
18
19
|
}
|
|
@@ -37,44 +37,50 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
const test_utils_1 = __importStar(require("@sprucelabs/test-utils"));
|
|
40
|
-
const
|
|
41
|
-
const
|
|
40
|
+
const EventMarkerOutlet_1 = __importDefault(require("../components/EventMarkerOutlet"));
|
|
41
|
+
const LiblslAdapter_1 = __importDefault(require("../components/LiblslAdapter"));
|
|
42
42
|
const LslStreamInfo_1 = __importDefault(require("../components/LslStreamInfo"));
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
const SpyLslInlet_1 = require("../testDoubles/SpyLslInlet");
|
|
47
|
-
const
|
|
48
|
-
const
|
|
49
|
-
|
|
43
|
+
const LslStreamInlet_1 = __importDefault(require("../components/LslStreamInlet"));
|
|
44
|
+
const LslStreamOutlet_1 = __importDefault(require("../components/LslStreamOutlet"));
|
|
45
|
+
const FakeLiblsl_1 = __importDefault(require("../testDoubles/Liblsl/FakeLiblsl"));
|
|
46
|
+
const SpyLslInlet_1 = require("../testDoubles/LslInlet/SpyLslInlet");
|
|
47
|
+
const FakeLslOutlet_1 = __importDefault(require("../testDoubles/LslOutlet/FakeLslOutlet"));
|
|
48
|
+
const SpyMarkerOutlet_1 = __importDefault(require("../testDoubles/MarkerOutlet/SpyMarkerOutlet"));
|
|
49
|
+
const FakeStreamInfo_1 = __importDefault(require("../testDoubles/StreamInfo/FakeStreamInfo"));
|
|
50
|
+
const SpyStreamInfo_1 = __importDefault(require("../testDoubles/StreamInfo/SpyStreamInfo"));
|
|
51
|
+
class AbstractLslTest extends test_utils_1.default {
|
|
50
52
|
static async beforeEach() {
|
|
51
53
|
await super.beforeEach();
|
|
52
54
|
this.setFakeLiblsl();
|
|
53
55
|
}
|
|
54
56
|
static setFakeLiblsl() {
|
|
55
57
|
this.fakeLiblsl = new FakeLiblsl_1.default();
|
|
56
|
-
|
|
58
|
+
LiblslAdapter_1.default.setInstance(this.fakeLiblsl);
|
|
57
59
|
}
|
|
58
|
-
static
|
|
59
|
-
LslStreamInfo_1.default.Class =
|
|
60
|
+
static setSpyStreamInfo() {
|
|
61
|
+
LslStreamInfo_1.default.Class = SpyStreamInfo_1.default;
|
|
60
62
|
}
|
|
61
63
|
static setFakeStreamInfo() {
|
|
62
64
|
LslStreamInfo_1.default.Class = FakeStreamInfo_1.default;
|
|
63
65
|
FakeStreamInfo_1.default.resetTestDouble();
|
|
64
66
|
}
|
|
65
67
|
static setSpyLslInlet() {
|
|
66
|
-
|
|
68
|
+
LslStreamInlet_1.default.Class = SpyLslInlet_1.SpyLslInlet;
|
|
67
69
|
}
|
|
68
|
-
static
|
|
69
|
-
|
|
70
|
+
static setFakeLslOutlet() {
|
|
71
|
+
LslStreamOutlet_1.default.Class = FakeLslOutlet_1.default;
|
|
72
|
+
FakeLslOutlet_1.default.resetTestDouble();
|
|
73
|
+
}
|
|
74
|
+
static setSpyMarkerOutlet() {
|
|
75
|
+
EventMarkerOutlet_1.default.Class = SpyMarkerOutlet_1.default;
|
|
70
76
|
}
|
|
71
77
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
exports.default =
|
|
80
|
-
//# sourceMappingURL=
|
|
78
|
+
AbstractLslTest.name_ = (0, test_utils_1.generateId)();
|
|
79
|
+
AbstractLslTest.type = (0, test_utils_1.generateId)();
|
|
80
|
+
AbstractLslTest.sourceId = (0, test_utils_1.generateId)();
|
|
81
|
+
AbstractLslTest.units = (0, test_utils_1.generateId)();
|
|
82
|
+
AbstractLslTest.channelNames = [(0, test_utils_1.generateId)(), (0, test_utils_1.generateId)()];
|
|
83
|
+
AbstractLslTest.chunkSize = Math.floor(Math.random() * 100);
|
|
84
|
+
AbstractLslTest.maxBuffered = Math.floor(Math.random() * 100);
|
|
85
|
+
exports.default = AbstractLslTest;
|
|
86
|
+
//# sourceMappingURL=AbstractLslTest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractLslTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractLslTest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qEAAuE;AACvE,wFAA+D;AAC/D,gFAAuD;AACvD,gFAAuD;AACvD,kFAAyD;AAEzD,oFAA2D;AAC3D,kFAAyD;AACzD,qEAAiE;AACjE,2FAAkE;AAClE,kGAAyE;AACzE,8FAAqE;AACrE,4FAAmE;AAEnE,MAAqB,eAAgB,SAAQ,oBAAkB;IAGjD,MAAM,CAAC,KAAK,CAAC,UAAU;QAC7B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QAExB,IAAI,CAAC,aAAa,EAAE,CAAA;IACxB,CAAC;IAES,MAAM,CAAC,aAAa;QAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,oBAAU,EAAE,CAAA;QAClC,uBAAa,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC9C,CAAC;IAES,MAAM,CAAC,gBAAgB;QAC7B,uBAAa,CAAC,KAAK,GAAG,uBAAa,CAAA;IACvC,CAAC;IAES,MAAM,CAAC,iBAAiB;QAC9B,uBAAa,CAAC,KAAK,GAAG,wBAAc,CAAA;QACpC,wBAAc,CAAC,eAAe,EAAE,CAAA;IACpC,CAAC;IAES,MAAM,CAAC,cAAc;QAC3B,wBAAc,CAAC,KAAK,GAAG,yBAAW,CAAA;IACtC,CAAC;IAES,MAAM,CAAC,gBAAgB;QAC7B,yBAAe,CAAC,KAAK,GAAG,uBAAa,CAAA;QACrC,uBAAa,CAAC,eAAe,EAAE,CAAA;IACnC,CAAC;IAES,MAAM,CAAC,kBAAkB;QAC/B,2BAAiB,CAAC,KAAK,GAAG,yBAAe,CAAA;IAC7C,CAAC;;AAEyB,qBAAK,GAAG,IAAA,uBAAU,GAAE,CAAA;AACpB,oBAAI,GAAG,IAAA,uBAAU,GAAE,CAAA;AACnB,wBAAQ,GAAG,IAAA,uBAAU,GAAE,CAAA;AACvB,qBAAK,GAAG,IAAA,uBAAU,GAAE,CAAA;AACpB,4BAAY,GAAG,CAAC,IAAA,uBAAU,GAAE,EAAE,IAAA,uBAAU,GAAE,CAAC,CAAA;AAC3C,yBAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;AAC3C,2BAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAA;kBA1CtD,eAAe"}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import
|
|
2
|
-
export default class
|
|
3
|
-
private static
|
|
1
|
+
import AbstractLslTest from './AbstractLslTest';
|
|
2
|
+
export default class EventMarkerOutletTest extends AbstractLslTest {
|
|
3
|
+
private static instance;
|
|
4
4
|
protected static beforeEach(): Promise<void>;
|
|
5
|
-
protected static
|
|
5
|
+
protected static loadsWithEventMarkerSpecificOptions(): Promise<void>;
|
|
6
6
|
protected static canOverrideDefaultOptions(): Promise<void>;
|
|
7
7
|
protected static pushingSingleMarkerIncrementsHitCountAndWaitTime(): Promise<void>;
|
|
8
8
|
protected static pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice(): Promise<void>;
|
|
9
|
-
protected static
|
|
9
|
+
protected static canStopEventMarkersMidPush(bailIdx: number): Promise<void>;
|
|
10
10
|
protected static canStartAgainAfterStopping(): Promise<void>;
|
|
11
11
|
protected static doesNotWaitIfStopped(): Promise<void>;
|
|
12
12
|
protected static clearsTheTimeoutOnStop(): Promise<void>;
|
|
13
|
-
private static
|
|
13
|
+
private static get lslOutlet();
|
|
14
|
+
private static setupOutlet;
|
|
14
15
|
private static pushTotalMarkers;
|
|
15
|
-
private static
|
|
16
|
-
private static
|
|
16
|
+
private static generateDurationMarker;
|
|
17
|
+
private static EventMarkerOutlet;
|
|
17
18
|
}
|
|
@@ -11,24 +11,26 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
const crypto_1 = require("crypto");
|
|
13
13
|
const test_utils_1 = require("@sprucelabs/test-utils");
|
|
14
|
-
const
|
|
14
|
+
const EventMarkerOutlet_1 = __importDefault(require("../components/EventMarkerOutlet"));
|
|
15
15
|
const generateRandomOutletOptions_1 = __importDefault(require("../testDoubles/generateRandomOutletOptions"));
|
|
16
|
-
const
|
|
17
|
-
|
|
16
|
+
const FakeLslOutlet_1 = __importDefault(require("../testDoubles/LslOutlet/FakeLslOutlet"));
|
|
17
|
+
const AbstractLslTest_1 = __importDefault(require("./AbstractLslTest"));
|
|
18
|
+
class EventMarkerOutletTest extends AbstractLslTest_1.default {
|
|
18
19
|
static async beforeEach() {
|
|
19
20
|
await super.beforeEach();
|
|
20
|
-
this.setSpyTimeMarkerOutlet();
|
|
21
21
|
this.setFakeLiblsl();
|
|
22
|
-
this.
|
|
22
|
+
this.setFakeLslOutlet();
|
|
23
|
+
this.setSpyMarkerOutlet();
|
|
24
|
+
this.instance = await this.EventMarkerOutlet();
|
|
23
25
|
}
|
|
24
|
-
static async
|
|
25
|
-
test_utils_1.assert.isEqualDeep(
|
|
26
|
-
name: '
|
|
26
|
+
static async loadsWithEventMarkerSpecificOptions() {
|
|
27
|
+
test_utils_1.assert.isEqualDeep(FakeLslOutlet_1.default.callsToConstructor[0].options, {
|
|
28
|
+
name: 'Event markers',
|
|
27
29
|
type: 'Markers',
|
|
28
30
|
channelNames: ['Markers'],
|
|
29
31
|
sampleRate: 0,
|
|
30
32
|
channelFormat: 'string',
|
|
31
|
-
sourceId: '
|
|
33
|
+
sourceId: 'event-markers',
|
|
32
34
|
manufacturer: 'N/A',
|
|
33
35
|
unit: 'N/A',
|
|
34
36
|
chunkSize: 0,
|
|
@@ -37,103 +39,106 @@ class TimeMarkerOutletTest extends AbstractNodeLslTest_1.default {
|
|
|
37
39
|
}
|
|
38
40
|
static async canOverrideDefaultOptions() {
|
|
39
41
|
const options = (0, generateRandomOutletOptions_1.default)();
|
|
40
|
-
|
|
41
|
-
test_utils_1.assert.isEqualDeep(
|
|
42
|
+
await this.EventMarkerOutlet(options);
|
|
43
|
+
test_utils_1.assert.isEqualDeep(FakeLslOutlet_1.default.callsToConstructor[1].options, options);
|
|
42
44
|
}
|
|
43
45
|
static async pushingSingleMarkerIncrementsHitCountAndWaitTime() {
|
|
44
|
-
const markers = [this.
|
|
45
|
-
await this.
|
|
46
|
-
|
|
47
|
-
test_utils_1.assert.isEqual(
|
|
46
|
+
const markers = [this.generateDurationMarker()];
|
|
47
|
+
await this.instance.pushMarkers(markers);
|
|
48
|
+
const marker = markers[0];
|
|
49
|
+
test_utils_1.assert.isEqual(FakeLslOutlet_1.default.callsToPushSample[0][0], marker.name, 'Pushed the wrong marker!');
|
|
50
|
+
test_utils_1.assert.isEqual(this.instance.totalWaitTimeMs, marker.durationMs);
|
|
48
51
|
}
|
|
49
52
|
static async pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
|
|
50
53
|
const markers = await this.pushTotalMarkers(2);
|
|
51
|
-
test_utils_1.assert.isEqual(
|
|
52
|
-
test_utils_1.assert.isEqual(this.
|
|
54
|
+
test_utils_1.assert.isEqual(FakeLslOutlet_1.default.callsToPushSample.length, 2);
|
|
55
|
+
test_utils_1.assert.isEqual(this.instance.totalWaitTimeMs, markers[0].durationMs + markers[1].durationMs);
|
|
53
56
|
}
|
|
54
|
-
static async
|
|
57
|
+
static async canStopEventMarkersMidPush(bailIdx) {
|
|
55
58
|
let hitCount = 0;
|
|
56
|
-
|
|
59
|
+
const outlet = this.instance.getLslOutlet();
|
|
60
|
+
outlet.pushSample = () => {
|
|
57
61
|
hitCount += 1;
|
|
58
62
|
if (hitCount === bailIdx) {
|
|
59
|
-
this.
|
|
63
|
+
this.instance.stop();
|
|
60
64
|
}
|
|
61
65
|
};
|
|
62
66
|
await this.pushTotalMarkers(10);
|
|
63
67
|
test_utils_1.assert.isEqual(hitCount, bailIdx);
|
|
64
68
|
}
|
|
65
69
|
static async canStartAgainAfterStopping() {
|
|
66
|
-
this.
|
|
70
|
+
this.instance.stop();
|
|
67
71
|
let hitCount = 0;
|
|
68
|
-
|
|
72
|
+
const outlet = this.instance.getLslOutlet();
|
|
73
|
+
outlet.pushSample = () => {
|
|
69
74
|
hitCount++;
|
|
70
75
|
};
|
|
71
76
|
await this.pushTotalMarkers(10);
|
|
72
77
|
test_utils_1.assert.isEqual(hitCount, 10);
|
|
73
78
|
}
|
|
74
79
|
static async doesNotWaitIfStopped() {
|
|
75
|
-
await this.
|
|
80
|
+
await this.setupOutlet();
|
|
76
81
|
const startMs = Date.now();
|
|
77
82
|
const promise = this.pushTotalMarkers(2, 1000);
|
|
78
|
-
this.
|
|
83
|
+
this.instance.stop();
|
|
79
84
|
await promise;
|
|
80
85
|
const endMs = Date.now();
|
|
81
86
|
test_utils_1.assert.isBelow(endMs - startMs, 10);
|
|
82
87
|
}
|
|
83
88
|
static async clearsTheTimeoutOnStop() {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
this.
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
void this.pushTotalMarkers(2, 100);
|
|
90
|
+
this.instance.stop();
|
|
91
|
+
this.lslOutlet.pushSample = () => test_utils_1.assert.fail('Should not have been called');
|
|
92
|
+
}
|
|
93
|
+
static get lslOutlet() {
|
|
94
|
+
return this.instance.getLslOutlet();
|
|
90
95
|
}
|
|
91
|
-
static async
|
|
92
|
-
|
|
93
|
-
this.
|
|
96
|
+
static async setupOutlet() {
|
|
97
|
+
EventMarkerOutlet_1.default.Class = EventMarkerOutlet_1.default;
|
|
98
|
+
this.instance = await this.EventMarkerOutlet();
|
|
94
99
|
}
|
|
95
100
|
static async pushTotalMarkers(total, durationMs) {
|
|
96
101
|
const markers = new Array(total)
|
|
97
102
|
.fill(null)
|
|
98
|
-
.map(() => this.
|
|
99
|
-
await this.
|
|
103
|
+
.map(() => this.generateDurationMarker(durationMs));
|
|
104
|
+
await this.instance.pushMarkers(markers);
|
|
100
105
|
return markers;
|
|
101
106
|
}
|
|
102
|
-
static
|
|
107
|
+
static generateDurationMarker(durationMs) {
|
|
103
108
|
return {
|
|
104
109
|
name: (0, test_utils_1.generateId)(),
|
|
105
110
|
durationMs: durationMs ?? (0, crypto_1.randomInt)(100, 1000),
|
|
106
111
|
};
|
|
107
112
|
}
|
|
108
|
-
static async
|
|
109
|
-
return (await
|
|
113
|
+
static async EventMarkerOutlet(options) {
|
|
114
|
+
return (await EventMarkerOutlet_1.default.Create(options));
|
|
110
115
|
}
|
|
111
116
|
}
|
|
112
|
-
exports.default =
|
|
117
|
+
exports.default = EventMarkerOutletTest;
|
|
113
118
|
__decorate([
|
|
114
119
|
(0, test_utils_1.test)()
|
|
115
|
-
],
|
|
120
|
+
], EventMarkerOutletTest, "loadsWithEventMarkerSpecificOptions", null);
|
|
116
121
|
__decorate([
|
|
117
122
|
(0, test_utils_1.test)()
|
|
118
|
-
],
|
|
123
|
+
], EventMarkerOutletTest, "canOverrideDefaultOptions", null);
|
|
119
124
|
__decorate([
|
|
120
125
|
(0, test_utils_1.test)()
|
|
121
|
-
],
|
|
126
|
+
], EventMarkerOutletTest, "pushingSingleMarkerIncrementsHitCountAndWaitTime", null);
|
|
122
127
|
__decorate([
|
|
123
128
|
(0, test_utils_1.test)()
|
|
124
|
-
],
|
|
129
|
+
], EventMarkerOutletTest, "pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice", null);
|
|
125
130
|
__decorate([
|
|
126
131
|
(0, test_utils_1.test)('can stop on the first marker', 1),
|
|
127
132
|
(0, test_utils_1.test)('can stop on the second marker', 2),
|
|
128
133
|
(0, test_utils_1.test)('can stop on the third marker', 3)
|
|
129
|
-
],
|
|
134
|
+
], EventMarkerOutletTest, "canStopEventMarkersMidPush", null);
|
|
130
135
|
__decorate([
|
|
131
136
|
(0, test_utils_1.test)()
|
|
132
|
-
],
|
|
137
|
+
], EventMarkerOutletTest, "canStartAgainAfterStopping", null);
|
|
133
138
|
__decorate([
|
|
134
139
|
(0, test_utils_1.test)()
|
|
135
|
-
],
|
|
140
|
+
], EventMarkerOutletTest, "doesNotWaitIfStopped", null);
|
|
136
141
|
__decorate([
|
|
137
142
|
(0, test_utils_1.test)()
|
|
138
|
-
],
|
|
139
|
-
//# sourceMappingURL=
|
|
143
|
+
], EventMarkerOutletTest, "clearsTheTimeoutOnStop", null);
|
|
144
|
+
//# sourceMappingURL=EventMarkerOutlet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventMarkerOutlet.test.js","sourceRoot":"","sources":["../../src/__tests__/EventMarkerOutlet.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
export default class
|
|
1
|
+
import AbstractLslTest from './AbstractLslTest';
|
|
2
|
+
export default class LiblslAdapterTest extends AbstractLslTest {
|
|
3
3
|
private static lsl;
|
|
4
4
|
private static libraryPath?;
|
|
5
5
|
private static libraryOptions?;
|