@neurodevs/node-lsl 8.0.1 → 8.0.3

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.
Files changed (51) hide show
  1. package/.vscode/settings.json +17 -20
  2. package/build/.spruce/errors/errors.types.js +0 -2
  3. package/build/.spruce/errors/errors.types.js.map +1 -1
  4. package/build/__tests__/behavioral/LslOutlet.test.js +9 -14
  5. package/build/__tests__/behavioral/LslOutlet.test.js.map +1 -1
  6. package/build/__tests__/behavioral/TimeMarkerOutlet.test.js.map +1 -1
  7. package/build/__tests__/implementation/Liblsl.test.js +17 -4
  8. package/build/__tests__/implementation/Liblsl.test.js.map +1 -1
  9. package/build/__tests__/support/consts.js.map +1 -1
  10. package/build/__tests__/support/generateRandomOutletOptions.js.map +1 -1
  11. package/build/assertions.js.map +1 -1
  12. package/build/consts.js.map +1 -1
  13. package/build/errors/SpruceError.d.ts +1 -1
  14. package/build/errors/SpruceError.js.map +1 -1
  15. package/build/errors/failedToLoadLiblsl.builder.js.map +1 -1
  16. package/build/implementations/Liblsl.js +22 -6
  17. package/build/implementations/Liblsl.js.map +1 -1
  18. package/build/implementations/LslOutlet.js +6 -14
  19. package/build/implementations/LslOutlet.js.map +1 -1
  20. package/build/implementations/TimeMarkerOutlet.js +4 -1
  21. package/build/implementations/TimeMarkerOutlet.js.map +1 -1
  22. package/build/nodeLsl.types.d.ts +2 -2
  23. package/build/testDoubles/FakeLiblsl.js.map +1 -1
  24. package/build/testDoubles/MockTimeMarkerOutlet.js.map +1 -1
  25. package/build/testDoubles/SpyExtendsTimeMarkerOutlet.js.map +1 -1
  26. package/build/testDoubles/SpyImplementsTimeMarkerOutlet.js.map +1 -1
  27. package/build/validations.js.map +1 -1
  28. package/eslint.config.mjs +3 -0
  29. package/package.json +26 -26
  30. package/src/.spruce/errors/errors.types.ts +0 -3
  31. package/src/__tests__/behavioral/LslOutlet.test.ts +272 -267
  32. package/src/__tests__/behavioral/TimeMarkerOutlet.test.ts +144 -141
  33. package/src/__tests__/implementation/Liblsl.test.ts +461 -438
  34. package/src/__tests__/support/consts.ts +22 -22
  35. package/src/__tests__/support/generateRandomOutletOptions.ts +13 -13
  36. package/src/assertions.ts +39 -39
  37. package/src/consts.ts +16 -16
  38. package/src/errors/SpruceError.ts +16 -16
  39. package/src/errors/failedToLoadLiblsl.builder.ts +8 -8
  40. package/src/implementations/Liblsl.ts +205 -181
  41. package/src/implementations/LslOutlet.ts +114 -114
  42. package/src/implementations/TimeMarkerOutlet.ts +50 -50
  43. package/src/nodeLsl.types.ts +60 -63
  44. package/src/testDoubles/FakeLiblsl.ts +58 -56
  45. package/src/testDoubles/MockTimeMarkerOutlet.ts +56 -56
  46. package/src/testDoubles/SpyExtendsTimeMarkerOutlet.ts +11 -11
  47. package/src/testDoubles/SpyImplementsTimeMarkerOutlet.ts +28 -28
  48. package/src/validations.ts +6 -6
  49. package/tsconfig.json +3 -4
  50. package/.eslintignore +0 -3
  51. package/.eslintrc.js +0 -3
@@ -1,8 +1,8 @@
1
1
  import { randomInt } from 'crypto'
2
2
  import AbstractSpruceTest, {
3
- assert,
4
- generateId,
5
- test,
3
+ assert,
4
+ generateId,
5
+ test,
6
6
  } from '@sprucelabs/test-utils'
7
7
  import LiblslImpl from '../../implementations/Liblsl'
8
8
  import TimeMarkerOutletImpl from '../../implementations/TimeMarkerOutlet'
@@ -12,142 +12,145 @@ import SpyExtendsTimeMarkerOutlet from '../../testDoubles/SpyExtendsTimeMarkerOu
12
12
  import generateRandomOutletOptions from '../support/generateRandomOutletOptions'
13
13
 
14
14
  export default class TimeMarkerOutletTest extends AbstractSpruceTest {
15
- private static fakeLiblsl: FakeLiblsl
16
- private static outlet: SpyExtendsTimeMarkerOutlet
17
-
18
- protected static async beforeEach() {
19
- await super.beforeEach()
20
- TimeMarkerOutletImpl.Class = SpyExtendsTimeMarkerOutlet
21
- this.fakeLiblsl = new FakeLiblsl()
22
- LiblslImpl.setInstance(this.fakeLiblsl)
23
- this.outlet = this.Outlet()
24
- }
25
-
26
- @test()
27
- protected static async loadsWithTimeMarkerSpecificOptions() {
28
- assert.isEqualDeep(this.outlet.spyOptions, {
29
- name: 'Time markers',
30
- type: 'Markers',
31
- channelNames: ['Markers'],
32
- sampleRate: 0,
33
- channelFormat: 'string',
34
- sourceId: 'time-markers',
35
- manufacturer: 'N/A',
36
- unit: 'N/A',
37
- chunkSize: 0,
38
- maxBuffered: 0,
39
- })
40
- }
41
-
42
- @test()
43
- protected static async canOverrideDefaultOptions() {
44
- const options = generateRandomOutletOptions()
45
- const outlet = this.Outlet(options)
46
- assert.isEqualDeep(outlet.spyOptions, options)
47
- }
48
-
49
- @test()
50
- protected static async pushingSingleMarkerIncrementsHitCountAndWaitTime() {
51
- const markers = [this.generateDurationMarkerValues()]
52
- await this.outlet.pushMarkers(markers)
53
-
54
- assert.isEqual(this.fakeLiblsl.pushSampleStringTimestampHitCount, 1)
55
- assert.isEqual(this.outlet.totalWaitTimeMs, markers[0].durationMs)
56
- }
57
-
58
- @test()
59
- protected static async pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
60
- const markers = await this.pushTotalMarkers(2)
61
-
62
- assert.isEqual(this.fakeLiblsl.pushSampleStringTimestampHitCount, 2)
63
- assert.isEqual(
64
- this.outlet.totalWaitTimeMs,
65
- markers[0].durationMs + markers[1].durationMs
66
- )
67
- }
68
-
69
- @test('can stop on the first marker', 1)
70
- @test('can stop on the second marker', 2)
71
- @test('can stop on the third marker', 3)
72
- protected static async canStopTimeMarkersMidPush(bailIdx: number) {
73
- let hitCount = 0
74
-
75
- this.outlet.pushSample = () => {
76
- hitCount += 1
77
- if (hitCount === bailIdx) {
78
- this.outlet.stop()
79
- }
80
- }
81
-
82
- await this.pushTotalMarkers(10)
83
-
84
- assert.isEqual(hitCount, bailIdx)
85
- }
86
-
87
- @test()
88
- protected static async canStartAgainAfterStopping() {
89
- this.outlet.stop()
90
-
91
- let hitCount = 0
92
-
93
- this.outlet.pushSample = () => {
94
- hitCount++
95
- }
96
-
97
- await this.pushTotalMarkers(10)
98
-
99
- assert.isEqual(hitCount, 10)
100
- }
101
-
102
- @test()
103
- protected static async doesNotWaitIfStopped() {
104
- this.setupTimeMarkerImpl()
105
-
106
- const startMs = Date.now()
107
- const promise = this.pushTotalMarkers(2, 1000)
108
- this.outlet.stop()
109
- await promise
110
- const endMs = Date.now()
111
-
112
- assert.isBelow(endMs - startMs, 10)
113
- }
114
-
115
- @test()
116
- protected static async clearsTheTimeoutOnStop() {
117
- this.setupTimeMarkerImpl()
118
-
119
- const promise = this.pushTotalMarkers(2, 100)
120
-
121
- this.outlet.stop()
122
- this.outlet.pushSample = () => assert.fail('Should not have been called')
123
-
124
- await promise
125
- await this.wait(100)
126
- }
127
-
128
- private static setupTimeMarkerImpl() {
129
- TimeMarkerOutletImpl.Class = TimeMarkerOutletImpl as any
130
- this.outlet = this.Outlet()
131
- }
132
-
133
- private static async pushTotalMarkers(total: number, durationMs?: number) {
134
- const markers = new Array(total)
135
- .fill(null)
136
- .map(() => this.generateDurationMarkerValues(durationMs))
137
-
138
- await this.outlet.pushMarkers(markers)
139
-
140
- return markers
141
- }
142
-
143
- private static generateDurationMarkerValues(durationMs?: number) {
144
- return {
145
- name: generateId(),
146
- durationMs: durationMs ?? randomInt(100, 1000),
147
- }
148
- }
149
-
150
- private static Outlet(options?: Partial<LslOutletOptions>) {
151
- return TimeMarkerOutletImpl.Outlet(options) as SpyExtendsTimeMarkerOutlet
152
- }
15
+ private static fakeLiblsl: FakeLiblsl
16
+ private static outlet: SpyExtendsTimeMarkerOutlet
17
+
18
+ protected static async beforeEach() {
19
+ await super.beforeEach()
20
+ TimeMarkerOutletImpl.Class = SpyExtendsTimeMarkerOutlet
21
+ this.fakeLiblsl = new FakeLiblsl()
22
+ LiblslImpl.setInstance(this.fakeLiblsl)
23
+ this.outlet = this.Outlet()
24
+ }
25
+
26
+ @test()
27
+ protected static async loadsWithTimeMarkerSpecificOptions() {
28
+ assert.isEqualDeep(this.outlet.spyOptions, {
29
+ name: 'Time markers',
30
+ type: 'Markers',
31
+ channelNames: ['Markers'],
32
+ sampleRate: 0,
33
+ channelFormat: 'string',
34
+ sourceId: 'time-markers',
35
+ manufacturer: 'N/A',
36
+ unit: 'N/A',
37
+ chunkSize: 0,
38
+ maxBuffered: 0,
39
+ })
40
+ }
41
+
42
+ @test()
43
+ protected static async canOverrideDefaultOptions() {
44
+ const options = generateRandomOutletOptions()
45
+ const outlet = this.Outlet(options)
46
+ assert.isEqualDeep(outlet.spyOptions, options)
47
+ }
48
+
49
+ @test()
50
+ protected static async pushingSingleMarkerIncrementsHitCountAndWaitTime() {
51
+ const markers = [this.generateDurationMarkerValues()]
52
+ await this.outlet.pushMarkers(markers)
53
+
54
+ assert.isEqual(this.fakeLiblsl.pushSampleStringTimestampHitCount, 1)
55
+ assert.isEqual(this.outlet.totalWaitTimeMs, markers[0].durationMs)
56
+ }
57
+
58
+ @test()
59
+ protected static async pushingTwoMarkersIncrementsHitCountAndWaitTimeTwice() {
60
+ const markers = await this.pushTotalMarkers(2)
61
+
62
+ assert.isEqual(this.fakeLiblsl.pushSampleStringTimestampHitCount, 2)
63
+ assert.isEqual(
64
+ this.outlet.totalWaitTimeMs,
65
+ markers[0].durationMs + markers[1].durationMs
66
+ )
67
+ }
68
+
69
+ @test('can stop on the first marker', 1)
70
+ @test('can stop on the second marker', 2)
71
+ @test('can stop on the third marker', 3)
72
+ protected static async canStopTimeMarkersMidPush(bailIdx: number) {
73
+ let hitCount = 0
74
+
75
+ this.outlet.pushSample = () => {
76
+ hitCount += 1
77
+ if (hitCount === bailIdx) {
78
+ this.outlet.stop()
79
+ }
80
+ }
81
+
82
+ await this.pushTotalMarkers(10)
83
+
84
+ assert.isEqual(hitCount, bailIdx)
85
+ }
86
+
87
+ @test()
88
+ protected static async canStartAgainAfterStopping() {
89
+ this.outlet.stop()
90
+
91
+ let hitCount = 0
92
+
93
+ this.outlet.pushSample = () => {
94
+ hitCount++
95
+ }
96
+
97
+ await this.pushTotalMarkers(10)
98
+
99
+ assert.isEqual(hitCount, 10)
100
+ }
101
+
102
+ @test()
103
+ protected static async doesNotWaitIfStopped() {
104
+ this.setupTimeMarkerImpl()
105
+
106
+ const startMs = Date.now()
107
+ const promise = this.pushTotalMarkers(2, 1000)
108
+ this.outlet.stop()
109
+ await promise
110
+ const endMs = Date.now()
111
+
112
+ assert.isBelow(endMs - startMs, 10)
113
+ }
114
+
115
+ @test()
116
+ protected static async clearsTheTimeoutOnStop() {
117
+ this.setupTimeMarkerImpl()
118
+
119
+ const promise = this.pushTotalMarkers(2, 100)
120
+
121
+ this.outlet.stop()
122
+ this.outlet.pushSample = () =>
123
+ assert.fail('Should not have been called')
124
+
125
+ await promise
126
+ await this.wait(100)
127
+ }
128
+
129
+ private static setupTimeMarkerImpl() {
130
+ TimeMarkerOutletImpl.Class = TimeMarkerOutletImpl as any
131
+ this.outlet = this.Outlet()
132
+ }
133
+
134
+ private static async pushTotalMarkers(total: number, durationMs?: number) {
135
+ const markers = new Array(total)
136
+ .fill(null)
137
+ .map(() => this.generateDurationMarkerValues(durationMs))
138
+
139
+ await this.outlet.pushMarkers(markers)
140
+
141
+ return markers
142
+ }
143
+
144
+ private static generateDurationMarkerValues(durationMs?: number) {
145
+ return {
146
+ name: generateId(),
147
+ durationMs: durationMs ?? randomInt(100, 1000),
148
+ }
149
+ }
150
+
151
+ private static Outlet(options?: Partial<LslOutletOptions>) {
152
+ return TimeMarkerOutletImpl.Outlet(
153
+ options
154
+ ) as SpyExtendsTimeMarkerOutlet
155
+ }
153
156
  }