@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.
@@ -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;AAhBD,mCAgBC"}
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
- const outlet = this.Outlet();
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,qEAAyE;AACzE,0DAAqC;AAErC,8EAAqD;AACrD,yGAAgF;AAChF,oDAAgD;AAEhD,MAAqB,oBAAqB,SAAQ,oBAAkB;IAGzD,MAAM,CAAC,KAAK,CAAC,UAAU;QAChC,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QACxB,0BAAgB,CAAC,KAAK,GAAG,mBAAmB,CAAA;QAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAA;QAChC,gBAAU,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,kCAAkC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;QAC5B,mBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE;YACrC,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;SACd,CAAC,CAAA;IACH,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,yBAAyB;QAC/C,MAAM,OAAO,GAAG,IAAA,qCAA2B,EAAC,IAAA,kBAAS,EAAC,CAAC,CAAC,CAAC,CAAA;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACnC,mBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC/C,CAAC;IAEO,MAAM,CAAC,MAAM,CAAC,OAAmC;QACxD,OAAO,0BAAgB,CAAC,MAAM,CAAC,OAAO,CAAwB,CAAA;IAC/D,CAAC;CACD;AArCD,uCAqCC;AA1BuB;IADtB,IAAA,iBAAI,GAAE;oEAeN;AAGsB;IADtB,IAAA,iBAAI,GAAE;2DAKN;AAOF,MAAM,mBAAoB,SAAQ,0BAAgB;IAEjD,YAAmB,OAAyB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,UAAU,GAAG,OAAO,CAAA;IAC1B,CAAC;CACD"}
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;IAmC9B,CAAC;IAjCO,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;IACzC,CAAC;IAEM,UAAU;QAChB,IAAI,CAAC,kBAAkB,EAAE,CAAA;QACzB,OAAO,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IAC5B,CAAC;CACD;AA/CD,8BA+CC"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurodevs/node-lsl",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "main": "build/index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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, { assert, test } from '@sprucelabs/test-utils'
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
- const outlet = this.Outlet()
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() {