@neurodevs/node-lsl 4.0.0 → 4.1.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/build/TimeMarkerOutlet.d.ts +6 -0
- package/build/TimeMarkerOutlet.js +9 -0
- package/build/TimeMarkerOutlet.js.map +1 -1
- package/build/__tests__/behavioral/TimeMarkerOutlet.test.d.ts +4 -0
- package/build/__tests__/behavioral/TimeMarkerOutlet.test.js +31 -2
- package/build/__tests__/behavioral/TimeMarkerOutlet.test.js.map +1 -1
- package/build/__tests__/support/SpyLiblsl.d.ts +1 -0
- package/build/__tests__/support/SpyLiblsl.js +2 -0
- package/build/__tests__/support/SpyLiblsl.js.map +1 -1
- package/package.json +1 -1
- package/src/TimeMarkerOutlet.ts +16 -0
- package/src/__tests__/behavioral/TimeMarkerOutlet.test.ts +42 -3
- package/src/__tests__/support/SpyLiblsl.ts +2 -0
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import LslOutletImpl, { LslOutletOptions } from './LslOutlet';
|
|
2
2
|
export default class TimeMarkerOutlet extends LslOutletImpl {
|
|
3
3
|
static Outlet(options?: Partial<LslOutletOptions>): import("./LslOutlet").LslOutlet;
|
|
4
|
+
pushMarkers(markers: DurationMarker[]): Promise<void>;
|
|
5
|
+
protected wait(durationMs: number): Promise<unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface DurationMarker {
|
|
8
|
+
name: string;
|
|
9
|
+
durationMs: number;
|
|
4
10
|
}
|
|
@@ -21,6 +21,15 @@ class TimeMarkerOutlet extends LslOutlet_1.default {
|
|
|
21
21
|
};
|
|
22
22
|
return new ((_a = this.Class) !== null && _a !== void 0 ? _a : this)(Object.assign(Object.assign({}, defaultOptions), options));
|
|
23
23
|
}
|
|
24
|
+
async pushMarkers(markers) {
|
|
25
|
+
for (let marker of markers) {
|
|
26
|
+
this.pushSample([marker.name]);
|
|
27
|
+
await this.wait(marker.durationMs);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async wait(durationMs) {
|
|
31
|
+
return new Promise((resolve) => setTimeout(resolve, durationMs));
|
|
32
|
+
}
|
|
24
33
|
}
|
|
25
34
|
exports.default = TimeMarkerOutlet;
|
|
26
35
|
//# sourceMappingURL=TimeMarkerOutlet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeMarkerOutlet.js","sourceRoot":"","sources":["../src/TimeMarkerOutlet.ts"],"names":[],"mappings":";;;;;AAAA,4DAA6D;AAE7D,MAAqB,gBAAiB,SAAQ,mBAAa;IACnD,MAAM,CAAC,MAAM,CAAC,OAAmC;;QACvD,MAAM,cAAc,GAAG;YACtB,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,CAAC,SAAS,CAAC;YACzB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,QAAQ;YACvB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,KAAK;YACnB,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC;SACM,CAAA;QACrB,OAAO,IAAI,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,IAAI,CAAC,iCAAM,cAAc,GAAK,OAAO,EAAG,CAAA;IACnE,CAAC;CACD;
|
|
1
|
+
{"version":3,"file":"TimeMarkerOutlet.js","sourceRoot":"","sources":["../src/TimeMarkerOutlet.ts"],"names":[],"mappings":";;;;;AAAA,4DAA6D;AAE7D,MAAqB,gBAAiB,SAAQ,mBAAa;IACnD,MAAM,CAAC,MAAM,CAAC,OAAmC;;QACvD,MAAM,cAAc,GAAG;YACtB,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,CAAC,SAAS,CAAC;YACzB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,QAAQ;YACvB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,KAAK;YACnB,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC;SACM,CAAA;QACrB,OAAO,IAAI,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,IAAI,CAAC,iCAAM,cAAc,GAAK,OAAO,EAAG,CAAA;IACnE,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,OAAyB;QACjD,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;YAC9B,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QACnC,CAAC;IACF,CAAC;IAES,KAAK,CAAC,IAAI,CAAC,UAAkB;QACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;IACjE,CAAC;CACD;AA3BD,mCA2BC"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import AbstractSpruceTest from '@sprucelabs/test-utils';
|
|
2
2
|
export default class TimeMarkerOutletTest extends AbstractSpruceTest {
|
|
3
3
|
private static spyLiblsl;
|
|
4
|
+
private static outlet;
|
|
4
5
|
protected static beforeEach(): Promise<void>;
|
|
5
6
|
protected static loadsWithTimeMarkerSpecificOptions(): Promise<void>;
|
|
6
7
|
protected static canOverrideDefaultOptions(): Promise<void>;
|
|
8
|
+
protected static pushingSingleMarkerIncrementsHitCountAndWaitTime(): Promise<void>;
|
|
9
|
+
protected static pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice(): Promise<void>;
|
|
10
|
+
private static generateRandomDurationMarker;
|
|
7
11
|
private static Outlet;
|
|
8
12
|
}
|
|
@@ -44,10 +44,10 @@ class TimeMarkerOutletTest extends test_utils_1.default {
|
|
|
44
44
|
TimeMarkerOutlet_1.default.Class = SpyTimeMarkerOutlet;
|
|
45
45
|
this.spyLiblsl = new SpyLiblsl_1.SpyLiblsl();
|
|
46
46
|
Liblsl_1.default.setInstance(this.spyLiblsl);
|
|
47
|
+
this.outlet = this.Outlet();
|
|
47
48
|
}
|
|
48
49
|
static async loadsWithTimeMarkerSpecificOptions() {
|
|
49
|
-
|
|
50
|
-
test_utils_1.assert.isEqualDeep(outlet.spyOptions, {
|
|
50
|
+
test_utils_1.assert.isEqualDeep(this.outlet.spyOptions, {
|
|
51
51
|
name: 'Time markers',
|
|
52
52
|
type: 'Markers',
|
|
53
53
|
channelNames: ['Markers'],
|
|
@@ -65,6 +65,24 @@ class TimeMarkerOutletTest extends test_utils_1.default {
|
|
|
65
65
|
const outlet = this.Outlet(options);
|
|
66
66
|
test_utils_1.assert.isEqualDeep(outlet.spyOptions, options);
|
|
67
67
|
}
|
|
68
|
+
static async pushingSingleMarkerIncrementsHitCountAndWaitTime() {
|
|
69
|
+
const markers = [this.generateRandomDurationMarker()];
|
|
70
|
+
await this.outlet.pushMarkers(markers);
|
|
71
|
+
test_utils_1.assert.isEqual(this.spyLiblsl.pushSampleStrtHitCount, 1);
|
|
72
|
+
test_utils_1.assert.isEqual(this.outlet.totalWaitTimeMs, markers[0].durationMs);
|
|
73
|
+
}
|
|
74
|
+
static async pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
|
|
75
|
+
const markers = [
|
|
76
|
+
this.generateRandomDurationMarker(),
|
|
77
|
+
this.generateRandomDurationMarker(),
|
|
78
|
+
];
|
|
79
|
+
await this.outlet.pushMarkers(markers);
|
|
80
|
+
test_utils_1.assert.isEqual(this.spyLiblsl.pushSampleStrtHitCount, 2);
|
|
81
|
+
test_utils_1.assert.isEqual(this.outlet.totalWaitTimeMs, markers[0].durationMs + markers[1].durationMs);
|
|
82
|
+
}
|
|
83
|
+
static generateRandomDurationMarker() {
|
|
84
|
+
return { name: (0, test_utils_1.generateId)(), durationMs: (0, crypto_1.randomInt)(100, 1000) };
|
|
85
|
+
}
|
|
68
86
|
static Outlet(options) {
|
|
69
87
|
return TimeMarkerOutlet_1.default.Outlet(options);
|
|
70
88
|
}
|
|
@@ -76,10 +94,21 @@ __decorate([
|
|
|
76
94
|
__decorate([
|
|
77
95
|
(0, test_utils_1.test)()
|
|
78
96
|
], TimeMarkerOutletTest, "canOverrideDefaultOptions", null);
|
|
97
|
+
__decorate([
|
|
98
|
+
(0, test_utils_1.test)()
|
|
99
|
+
], TimeMarkerOutletTest, "pushingSingleMarkerIncrementsHitCountAndWaitTime", null);
|
|
100
|
+
__decorate([
|
|
101
|
+
(0, test_utils_1.test)()
|
|
102
|
+
], TimeMarkerOutletTest, "pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice", null);
|
|
79
103
|
class SpyTimeMarkerOutlet extends TimeMarkerOutlet_1.default {
|
|
80
104
|
constructor(options) {
|
|
81
105
|
super(options);
|
|
82
106
|
this.spyOptions = options;
|
|
107
|
+
this.totalWaitTimeMs = 0;
|
|
108
|
+
}
|
|
109
|
+
async wait(durationMs) {
|
|
110
|
+
this.totalWaitTimeMs += durationMs;
|
|
111
|
+
return Promise.resolve();
|
|
83
112
|
}
|
|
84
113
|
}
|
|
85
114
|
//# sourceMappingURL=TimeMarkerOutlet.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeMarkerOutlet.test.js","sourceRoot":"","sources":["../../../src/__tests__/behavioral/TimeMarkerOutlet.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAkC;AAClC,
|
|
1
|
+
{"version":3,"file":"TimeMarkerOutlet.test.js","sourceRoot":"","sources":["../../../src/__tests__/behavioral/TimeMarkerOutlet.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,7 @@ export declare class SpyLiblsl implements Liblsl {
|
|
|
10
10
|
createStreamInfoHitCount: number;
|
|
11
11
|
destroyOutletHitCount: number;
|
|
12
12
|
localClockHitCount: number;
|
|
13
|
+
pushSampleStrtHitCount: number;
|
|
13
14
|
createStreamInfo(options: CreateStreamInfoOptions): BoundStreamInfo;
|
|
14
15
|
appendChannelsToStreamInfo(options: AppendChannelsToStreamInfoOptions): void;
|
|
15
16
|
createOutlet(options: CreateOutletOptions): BoundOutlet;
|
|
@@ -8,6 +8,7 @@ class SpyLiblsl {
|
|
|
8
8
|
this.createStreamInfoHitCount = 0;
|
|
9
9
|
this.destroyOutletHitCount = 0;
|
|
10
10
|
this.localClockHitCount = 0;
|
|
11
|
+
this.pushSampleStrtHitCount = 0;
|
|
11
12
|
}
|
|
12
13
|
createStreamInfo(options) {
|
|
13
14
|
this.createStreamInfoHitCount++;
|
|
@@ -29,6 +30,7 @@ class SpyLiblsl {
|
|
|
29
30
|
}
|
|
30
31
|
pushSampleStrt(options) {
|
|
31
32
|
this.lastPushSampleStrtOptions = options;
|
|
33
|
+
this.pushSampleStrtHitCount++;
|
|
32
34
|
}
|
|
33
35
|
localClock() {
|
|
34
36
|
this.localClockHitCount++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpyLiblsl.js","sourceRoot":"","sources":["../../../src/__tests__/support/SpyLiblsl.ts"],"names":[],"mappings":";;;AAWA,MAAa,SAAS;IAAtB;QACQ,WAAM,GAAgB,EAAiB,CAAA;QACvC,eAAU,GAAoB,EAAqB,CAAA;QAQnD,6BAAwB,GAAG,CAAC,CAAA;QAC5B,0BAAqB,GAAG,CAAC,CAAA;QACzB,uBAAkB,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"SpyLiblsl.js","sourceRoot":"","sources":["../../../src/__tests__/support/SpyLiblsl.ts"],"names":[],"mappings":";;;AAWA,MAAa,SAAS;IAAtB;QACQ,WAAM,GAAgB,EAAiB,CAAA;QACvC,eAAU,GAAoB,EAAqB,CAAA;QAQnD,6BAAwB,GAAG,CAAC,CAAA;QAC5B,0BAAqB,GAAG,CAAC,CAAA;QACzB,uBAAkB,GAAG,CAAC,CAAA;QACtB,2BAAsB,GAAG,CAAC,CAAA;IAoClC,CAAC;IAlCO,gBAAgB,CAAC,OAAgC;QACvD,IAAI,CAAC,wBAAwB,EAAE,CAAA;QAC/B,IAAI,CAAC,2BAA2B,GAAG,OAAO,CAAA;QAC1C,OAAO,IAAI,CAAC,UAAU,CAAA;IACvB,CAAC;IAEM,0BAA0B,CAChC,OAA0C;QAE1C,IAAI,CAAC,qCAAqC,GAAG,OAAO,CAAA;IACrD,CAAC;IAEM,YAAY,CAAC,OAA4B;QAC/C,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAA;QACtC,OAAO,IAAI,CAAC,MAAM,CAAA;IACnB,CAAC;IAEM,aAAa;QACnB,IAAI,CAAC,qBAAqB,EAAE,CAAA;IAC7B,CAAC;IAEM,YAAY,CAAC,OAA4B;QAC/C,IAAI,CAAC,uBAAuB,GAAG,OAAO,CAAA;IACvC,CAAC;IAEM,cAAc,CAAC,OAA8B;QACnD,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAA;QACxC,IAAI,CAAC,sBAAsB,EAAE,CAAA;IAC9B,CAAC;IAEM,UAAU;QAChB,IAAI,CAAC,kBAAkB,EAAE,CAAA;QACzB,OAAO,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAC5B,CAAC;CACD;AAjDD,8BAiDC"}
|
package/package.json
CHANGED
package/src/TimeMarkerOutlet.ts
CHANGED
|
@@ -16,4 +16,20 @@ export default class TimeMarkerOutlet extends LslOutletImpl {
|
|
|
16
16
|
} as LslOutletOptions
|
|
17
17
|
return new (this.Class ?? this)({ ...defaultOptions, ...options })
|
|
18
18
|
}
|
|
19
|
+
|
|
20
|
+
public async pushMarkers(markers: DurationMarker[]) {
|
|
21
|
+
for (let marker of markers) {
|
|
22
|
+
this.pushSample([marker.name])
|
|
23
|
+
await this.wait(marker.durationMs)
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
protected async wait(durationMs: number) {
|
|
28
|
+
return new Promise((resolve) => setTimeout(resolve, durationMs))
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface DurationMarker {
|
|
33
|
+
name: string
|
|
34
|
+
durationMs: number
|
|
19
35
|
}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { randomInt } from 'crypto'
|
|
2
|
-
import AbstractSpruceTest, {
|
|
2
|
+
import AbstractSpruceTest, {
|
|
3
|
+
assert,
|
|
4
|
+
generateId,
|
|
5
|
+
test,
|
|
6
|
+
} from '@sprucelabs/test-utils'
|
|
3
7
|
import LiblslImpl from '../../Liblsl'
|
|
4
8
|
import { LslOutletOptions } from '../../LslOutlet'
|
|
5
9
|
import TimeMarkerOutlet from '../../TimeMarkerOutlet'
|
|
@@ -8,18 +12,19 @@ import { SpyLiblsl } from '../support/SpyLiblsl'
|
|
|
8
12
|
|
|
9
13
|
export default class TimeMarkerOutletTest extends AbstractSpruceTest {
|
|
10
14
|
private static spyLiblsl: SpyLiblsl
|
|
15
|
+
private static outlet: SpyTimeMarkerOutlet
|
|
11
16
|
|
|
12
17
|
protected static async beforeEach() {
|
|
13
18
|
await super.beforeEach()
|
|
14
19
|
TimeMarkerOutlet.Class = SpyTimeMarkerOutlet
|
|
15
20
|
this.spyLiblsl = new SpyLiblsl()
|
|
16
21
|
LiblslImpl.setInstance(this.spyLiblsl)
|
|
22
|
+
this.outlet = this.Outlet()
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
@test()
|
|
20
26
|
protected static async loadsWithTimeMarkerSpecificOptions() {
|
|
21
|
-
|
|
22
|
-
assert.isEqualDeep(outlet.spyOptions, {
|
|
27
|
+
assert.isEqualDeep(this.outlet.spyOptions, {
|
|
23
28
|
name: 'Time markers',
|
|
24
29
|
type: 'Markers',
|
|
25
30
|
channelNames: ['Markers'],
|
|
@@ -40,6 +45,32 @@ export default class TimeMarkerOutletTest extends AbstractSpruceTest {
|
|
|
40
45
|
assert.isEqualDeep(outlet.spyOptions, options)
|
|
41
46
|
}
|
|
42
47
|
|
|
48
|
+
@test()
|
|
49
|
+
protected static async pushingSingleMarkerIncrementsHitCountAndWaitTime() {
|
|
50
|
+
const markers = [this.generateRandomDurationMarker()]
|
|
51
|
+
await this.outlet.pushMarkers(markers)
|
|
52
|
+
assert.isEqual(this.spyLiblsl.pushSampleStrtHitCount, 1)
|
|
53
|
+
assert.isEqual(this.outlet.totalWaitTimeMs, markers[0].durationMs)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@test()
|
|
57
|
+
protected static async pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
|
|
58
|
+
const markers = [
|
|
59
|
+
this.generateRandomDurationMarker(),
|
|
60
|
+
this.generateRandomDurationMarker(),
|
|
61
|
+
]
|
|
62
|
+
await this.outlet.pushMarkers(markers)
|
|
63
|
+
assert.isEqual(this.spyLiblsl.pushSampleStrtHitCount, 2)
|
|
64
|
+
assert.isEqual(
|
|
65
|
+
this.outlet.totalWaitTimeMs,
|
|
66
|
+
markers[0].durationMs + markers[1].durationMs
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private static generateRandomDurationMarker() {
|
|
71
|
+
return { name: generateId(), durationMs: randomInt(100, 1000) }
|
|
72
|
+
}
|
|
73
|
+
|
|
43
74
|
private static Outlet(options?: Partial<LslOutletOptions>) {
|
|
44
75
|
return TimeMarkerOutlet.Outlet(options) as SpyTimeMarkerOutlet
|
|
45
76
|
}
|
|
@@ -47,8 +78,16 @@ export default class TimeMarkerOutletTest extends AbstractSpruceTest {
|
|
|
47
78
|
|
|
48
79
|
class SpyTimeMarkerOutlet extends TimeMarkerOutlet {
|
|
49
80
|
public spyOptions: LslOutletOptions
|
|
81
|
+
public totalWaitTimeMs: number
|
|
82
|
+
|
|
50
83
|
public constructor(options: LslOutletOptions) {
|
|
51
84
|
super(options)
|
|
52
85
|
this.spyOptions = options
|
|
86
|
+
this.totalWaitTimeMs = 0
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public async wait(durationMs: number) {
|
|
90
|
+
this.totalWaitTimeMs += durationMs
|
|
91
|
+
return Promise.resolve()
|
|
53
92
|
}
|
|
54
93
|
}
|
|
@@ -22,6 +22,7 @@ export class SpyLiblsl implements Liblsl {
|
|
|
22
22
|
public createStreamInfoHitCount = 0
|
|
23
23
|
public destroyOutletHitCount = 0
|
|
24
24
|
public localClockHitCount = 0
|
|
25
|
+
public pushSampleStrtHitCount = 0
|
|
25
26
|
|
|
26
27
|
public createStreamInfo(options: CreateStreamInfoOptions): BoundStreamInfo {
|
|
27
28
|
this.createStreamInfoHitCount++
|
|
@@ -50,6 +51,7 @@ export class SpyLiblsl implements Liblsl {
|
|
|
50
51
|
|
|
51
52
|
public pushSampleStrt(options: PushSampleStrtOptions) {
|
|
52
53
|
this.lastPushSampleStrtOptions = options
|
|
54
|
+
this.pushSampleStrtHitCount++
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
public localClock() {
|