@neurodevs/node-lsl 11.4.2 → 12.0.1
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/.vscode/tasks.json +19 -1
- package/README.md +8 -9
- package/build/__tests__/{AbstractLslTest.d.ts → AbstractPackageTest.d.ts} +7 -6
- package/build/__tests__/AbstractPackageTest.js +53 -0
- package/build/__tests__/AbstractPackageTest.js.map +1 -0
- package/build/__tests__/{modules → impl}/LiblslAdapter.test.d.ts +6 -3
- package/build/__tests__/{modules → impl}/LiblslAdapter.test.js +193 -151
- package/build/__tests__/impl/LiblslAdapter.test.js.map +1 -0
- package/build/__tests__/{modules/EventMarkerOutlet.test.d.ts → impl/LslEventMarkerOutlet.test.d.ts} +5 -4
- package/build/__tests__/{modules/EventMarkerOutlet.test.js → impl/LslEventMarkerOutlet.test.js} +54 -52
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +1 -0
- package/build/__tests__/{modules → impl}/LslStreamInfo.test.d.ts +3 -3
- package/build/__tests__/{modules → impl}/LslStreamInfo.test.js +53 -59
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -0
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +11 -0
- package/build/__tests__/{modules → impl}/LslStreamInlet.test.js +28 -26
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -0
- package/build/__tests__/{modules → impl}/LslStreamOutlet.test.d.ts +3 -3
- package/build/__tests__/{modules → impl}/LslStreamOutlet.test.js +56 -60
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -0
- package/build/__tests__/impl/LslWebSocketBridge.test.d.ts +7 -0
- package/build/__tests__/impl/LslWebSocketBridge.test.js +26 -0
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -0
- package/build/assertions.d.ts +1 -1
- package/build/assertions.js +13 -20
- package/build/assertions.js.map +1 -1
- package/build/consts.js +2 -5
- package/build/consts.js.map +1 -1
- package/build/{modules → impl}/LiblslAdapter.d.ts +5 -4
- package/build/{modules → impl}/LiblslAdapter.js +60 -51
- package/build/impl/LiblslAdapter.js.map +1 -0
- package/build/impl/LslEventMarkerOutlet.d.ts +23 -0
- package/build/{modules/EventMarkerOutlet.js → impl/LslEventMarkerOutlet.js} +12 -14
- package/build/impl/LslEventMarkerOutlet.js.map +1 -0
- package/build/{modules → impl}/LslStreamInfo.d.ts +1 -1
- package/build/{modules → impl}/LslStreamInfo.js +19 -16
- package/build/impl/LslStreamInfo.js.map +1 -0
- package/build/impl/LslStreamInlet.d.ts +34 -0
- package/build/{modules → impl}/LslStreamInlet.js +19 -16
- package/build/impl/LslStreamInlet.js.map +1 -0
- package/build/{modules → impl}/LslStreamOutlet.d.ts +10 -10
- package/build/{modules → impl}/LslStreamOutlet.js +22 -23
- package/build/impl/LslStreamOutlet.js.map +1 -0
- package/build/impl/LslWebSocketBridge.d.ts +8 -0
- package/build/impl/LslWebSocketBridge.js +8 -0
- package/build/impl/LslWebSocketBridge.js.map +1 -0
- package/build/index.d.ts +34 -30
- package/build/index.js +39 -69
- package/build/index.js.map +1 -1
- package/build/scripts/{demoMarkerOutlet.js → runLslEventMarkerOutlet.js} +3 -8
- package/build/scripts/runLslEventMarkerOutlet.js.map +1 -0
- package/build/scripts/{demoStreamOutlet.js → runLslStreamOutlet.js} +3 -8
- package/build/scripts/runLslStreamOutlet.js.map +1 -0
- package/build/testDoubles/{MarkerOutlet/FakeMarkerOutlet.d.ts → EventMarkerOutlet/FakeEventMarkerOutlet.d.ts} +3 -3
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js +26 -0
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +1 -0
- package/build/testDoubles/{MarkerOutlet/MockMarkerOutlet.d.ts → EventMarkerOutlet/MockEventMarkerOutlet.d.ts} +3 -3
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js +46 -0
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +1 -0
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +9 -0
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +19 -0
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +1 -0
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +10 -0
- package/build/testDoubles/{MarkerOutlet/ThrowingMarkerOutlet.js → EventMarkerOutlet/ThrowingEventMarkerOutlet.js} +3 -6
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +1 -0
- package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +4 -1
- package/build/testDoubles/Liblsl/FakeLiblsl.js +23 -15
- package/build/testDoubles/Liblsl/FakeLiblsl.js.map +1 -1
- package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +2 -2
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js +3 -6
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -1
- package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +2 -2
- package/build/testDoubles/StreamInfo/SpyStreamInfo.js +2 -8
- package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +1 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +12 -0
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js +18 -0
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -0
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +8 -0
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js +16 -0
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -0
- package/build/testDoubles/{LslOutlet/FakeLslOutlet.d.ts → StreamOutlet/FakeStreamOutlet.d.ts} +10 -11
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +57 -0
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -0
- package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.d.ts +6 -0
- package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js +10 -0
- package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js.map +1 -0
- package/build/testDoubles/consts.js +4 -7
- package/build/testDoubles/consts.js.map +1 -1
- package/build/testDoubles/generateRandomOutletOptions.d.ts +2 -2
- package/build/testDoubles/generateRandomOutletOptions.js +14 -17
- package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
- package/build/types.d.ts +9 -4
- package/build/types.js +1 -2
- package/build/validations.js +4 -10
- package/build/validations.js.map +1 -1
- package/package.json +22 -12
- package/src/__tests__/AbstractPackageTest.ts +65 -0
- package/src/__tests__/{modules → impl}/LiblslAdapter.test.ts +71 -44
- package/src/__tests__/{modules/EventMarkerOutlet.test.ts → impl/LslEventMarkerOutlet.test.ts} +40 -28
- package/src/__tests__/{modules → impl}/LslStreamInfo.test.ts +10 -8
- package/src/__tests__/{modules → impl}/LslStreamInlet.test.ts +27 -14
- package/src/__tests__/{modules → impl}/LslStreamOutlet.test.ts +24 -17
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +25 -0
- package/src/assertions.ts +3 -3
- package/src/{modules → impl}/LiblslAdapter.ts +33 -21
- package/src/{modules/EventMarkerOutlet.ts → impl/LslEventMarkerOutlet.ts} +17 -12
- package/src/{modules → impl}/LslStreamInfo.ts +5 -4
- package/src/{modules → impl}/LslStreamInlet.ts +27 -16
- package/src/{modules → impl}/LslStreamOutlet.ts +19 -16
- package/src/impl/LslWebSocketBridge.ts +13 -0
- package/src/index.ts +43 -35
- package/src/scripts/{demoMarkerOutlet.ts → runLslEventMarkerOutlet.ts} +2 -2
- package/src/scripts/{demoStreamOutlet.ts → runLslStreamOutlet.ts} +1 -1
- package/src/testDoubles/{MarkerOutlet/FakeMarkerOutlet.ts → EventMarkerOutlet/FakeEventMarkerOutlet.ts} +7 -7
- package/src/testDoubles/{MarkerOutlet/MockMarkerOutlet.ts → EventMarkerOutlet/MockEventMarkerOutlet.ts} +5 -4
- package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +24 -0
- package/src/testDoubles/{MarkerOutlet/ThrowingMarkerOutlet.ts → EventMarkerOutlet/ThrowingEventMarkerOutlet.ts} +3 -3
- package/src/testDoubles/Liblsl/FakeLiblsl.ts +9 -1
- package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +2 -2
- package/src/testDoubles/StreamInfo/SpyStreamInfo.ts +1 -1
- package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +27 -0
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +22 -0
- package/src/testDoubles/{LslOutlet/FakeLslOutlet.ts → StreamOutlet/FakeStreamOutlet.ts} +22 -19
- package/src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts +15 -0
- package/src/testDoubles/generateRandomOutletOptions.ts +5 -4
- package/src/types.ts +11 -4
- package/tsconfig.json +17 -28
- package/build/__tests__/AbstractLslTest.js +0 -87
- package/build/__tests__/AbstractLslTest.js.map +0 -1
- package/build/__tests__/modules/EventMarkerOutlet.test.js.map +0 -1
- package/build/__tests__/modules/LiblslAdapter.test.js.map +0 -1
- package/build/__tests__/modules/LslStreamInfo.test.js.map +0 -1
- package/build/__tests__/modules/LslStreamInlet.test.d.ts +0 -10
- package/build/__tests__/modules/LslStreamInlet.test.js.map +0 -1
- package/build/__tests__/modules/LslStreamOutlet.test.js.map +0 -1
- package/build/modules/EventMarkerOutlet.d.ts +0 -23
- package/build/modules/EventMarkerOutlet.js.map +0 -1
- package/build/modules/LiblslAdapter.js.map +0 -1
- package/build/modules/LslStreamInfo.js.map +0 -1
- package/build/modules/LslStreamInlet.d.ts +0 -31
- package/build/modules/LslStreamInlet.js.map +0 -1
- package/build/modules/LslStreamOutlet.js.map +0 -1
- package/build/scripts/demoMarkerOutlet.js.map +0 -1
- package/build/scripts/demoStreamOutlet.js.map +0 -1
- package/build/testDoubles/LslInlet/FakeLslInlet.d.ts +0 -11
- package/build/testDoubles/LslInlet/FakeLslInlet.js +0 -16
- package/build/testDoubles/LslInlet/FakeLslInlet.js.map +0 -1
- package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +0 -7
- package/build/testDoubles/LslInlet/SpyLslInlet.js +0 -20
- package/build/testDoubles/LslInlet/SpyLslInlet.js.map +0 -1
- package/build/testDoubles/LslOutlet/FakeLslOutlet.js +0 -59
- package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +0 -1
- package/build/testDoubles/MarkerOutlet/FakeMarkerOutlet.js +0 -29
- package/build/testDoubles/MarkerOutlet/FakeMarkerOutlet.js.map +0 -1
- package/build/testDoubles/MarkerOutlet/MockMarkerOutlet.js +0 -49
- package/build/testDoubles/MarkerOutlet/MockMarkerOutlet.js.map +0 -1
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.js +0 -24
- package/build/testDoubles/MarkerOutlet/SpyMarkerOutlet.js.map +0 -1
- package/build/testDoubles/MarkerOutlet/ThrowingMarkerOutlet.d.ts +0 -10
- package/build/testDoubles/MarkerOutlet/ThrowingMarkerOutlet.js.map +0 -1
- package/src/__tests__/AbstractLslTest.ts +0 -59
- package/src/testDoubles/LslInlet/FakeLslInlet.ts +0 -22
- package/src/testDoubles/LslInlet/SpyLslInlet.ts +0 -16
- package/src/testDoubles/MarkerOutlet/SpyMarkerOutlet.ts +0 -24
- /package/build/scripts/{demoMarkerOutlet.d.ts → runLslEventMarkerOutlet.d.ts} +0 -0
- /package/build/scripts/{demoStreamOutlet.d.ts → runLslStreamOutlet.d.ts} +0 -0
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
import { test, assert } from '@
|
|
2
|
-
import LslStreamInlet, {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import
|
|
1
|
+
import { test, assert } from '@neurodevs/node-tdd'
|
|
2
|
+
import LslStreamInlet, {
|
|
3
|
+
StreamInletOptions,
|
|
4
|
+
} from '../../impl/LslStreamInlet.js'
|
|
5
|
+
import FakeStreamInfo from '../../testDoubles/StreamInfo/FakeStreamInfo.js'
|
|
6
|
+
import { SpyStreamInlet } from '../../testDoubles/StreamInlet/SpyStreamInlet.js'
|
|
7
|
+
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
6
8
|
|
|
7
|
-
export default class LslStreamInletTest extends
|
|
8
|
-
private static instance:
|
|
9
|
+
export default class LslStreamInletTest extends AbstractPackageTest {
|
|
10
|
+
private static instance: SpyStreamInlet
|
|
9
11
|
|
|
10
12
|
protected static async beforeEach() {
|
|
11
13
|
await super.beforeEach()
|
|
12
14
|
|
|
13
|
-
this.
|
|
15
|
+
this.setSpyStreamInlet()
|
|
14
16
|
this.setFakeStreamInfo()
|
|
15
17
|
|
|
16
18
|
this.instance = this.LslStreamInlet()
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
@test()
|
|
20
|
-
protected static async
|
|
21
|
-
assert.isTruthy(this.instance, '
|
|
22
|
+
protected static async createsInstance() {
|
|
23
|
+
assert.isTruthy(this.instance, 'Failed to create instance!')
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
@test()
|
|
@@ -49,7 +51,7 @@ export default class LslStreamInletTest extends AbstractLslTest {
|
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
@test()
|
|
52
|
-
protected static async
|
|
54
|
+
protected static async callsBindingsToCreateStreamInlet() {
|
|
53
55
|
const fakeInfo = this.instance.getStreamInfo()
|
|
54
56
|
|
|
55
57
|
assert.isTruthy(fakeInfo, 'Should have created stream info!')
|
|
@@ -65,7 +67,18 @@ export default class LslStreamInletTest extends AbstractLslTest {
|
|
|
65
67
|
)
|
|
66
68
|
}
|
|
67
69
|
|
|
68
|
-
|
|
70
|
+
@test()
|
|
71
|
+
protected static async flushSamplesCallsLslBinding() {
|
|
72
|
+
this.instance.flushSamples()
|
|
73
|
+
|
|
74
|
+
assert.isEqualDeep(
|
|
75
|
+
this.fakeLiblsl.lastFlushInletOptions,
|
|
76
|
+
{ inlet: this.instance.getBoundInlet() },
|
|
77
|
+
'Should have called flushInlet!'
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
private static LslStreamInlet(options?: Partial<StreamInletOptions>) {
|
|
69
82
|
const defaultOptions = {
|
|
70
83
|
channelNames: this.channelNames,
|
|
71
84
|
channelFormat: 'float32',
|
|
@@ -76,7 +89,7 @@ export default class LslStreamInletTest extends AbstractLslTest {
|
|
|
76
89
|
chunkSize: this.chunkSize,
|
|
77
90
|
maxBuffered: this.maxBuffered,
|
|
78
91
|
...options,
|
|
79
|
-
} as
|
|
80
|
-
return LslStreamInlet.Create(defaultOptions) as
|
|
92
|
+
} as StreamInletOptions
|
|
93
|
+
return LslStreamInlet.Create(defaultOptions) as SpyStreamInlet
|
|
81
94
|
}
|
|
82
95
|
}
|
|
@@ -1,22 +1,23 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import generateId from '@neurodevs/generate-id'
|
|
2
|
+
import { test, assert } from '@neurodevs/node-tdd'
|
|
3
|
+
|
|
4
|
+
import { CHANNEL_FORMATS } from '../../consts.js'
|
|
5
|
+
import { StreamInfo } from '../../impl/LslStreamInfo.js'
|
|
4
6
|
import LslStreamOutlet, {
|
|
5
|
-
|
|
6
|
-
} from '../../
|
|
7
|
+
StreamOutletOptions,
|
|
8
|
+
} from '../../impl/LslStreamOutlet.js'
|
|
7
9
|
import {
|
|
8
10
|
TEST_SUPPORTED_CHANNEL_FORMATS,
|
|
9
11
|
TEST_UNSUPPORTED_CHANNEL_FORMATS,
|
|
10
12
|
TestChannelFormat,
|
|
11
|
-
} from '../../testDoubles/consts'
|
|
12
|
-
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import
|
|
16
|
-
import AbstractLslTest from '../AbstractLslTest'
|
|
13
|
+
} from '../../testDoubles/consts.js'
|
|
14
|
+
import generateRandomOutletOptions from '../../testDoubles/generateRandomOutletOptions.js'
|
|
15
|
+
import FakeStreamInfo from '../../testDoubles/StreamInfo/FakeStreamInfo.js'
|
|
16
|
+
import { ChannelFormat, LslSample } from '../../types.js'
|
|
17
|
+
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
17
18
|
|
|
18
|
-
export default class LslStreamOutletTest extends
|
|
19
|
-
private static randomOutletOptions:
|
|
19
|
+
export default class LslStreamOutletTest extends AbstractPackageTest {
|
|
20
|
+
private static randomOutletOptions: StreamOutletOptions
|
|
20
21
|
|
|
21
22
|
protected static async beforeEach() {
|
|
22
23
|
await super.beforeEach()
|
|
@@ -254,14 +255,18 @@ export default class LslStreamOutletTest extends AbstractLslTest {
|
|
|
254
255
|
}
|
|
255
256
|
|
|
256
257
|
private static async createAndAssertThrows(
|
|
257
|
-
option: keyof
|
|
258
|
+
option: keyof StreamOutletOptions,
|
|
258
259
|
value: number | string[] | ChannelFormat,
|
|
259
260
|
expectedMessage: string
|
|
260
261
|
) {
|
|
261
262
|
const err = await assert.doesThrowAsync(
|
|
262
263
|
async () => await this.LslStreamOutlet({ [option]: value })
|
|
263
264
|
)
|
|
264
|
-
|
|
265
|
+
|
|
266
|
+
assert.isTrue(
|
|
267
|
+
err.message.includes(expectedMessage),
|
|
268
|
+
'Did not receive the expected error!'
|
|
269
|
+
)
|
|
265
270
|
}
|
|
266
271
|
|
|
267
272
|
private static async StringOutlet() {
|
|
@@ -272,7 +277,9 @@ export default class LslStreamOutletTest extends AbstractLslTest {
|
|
|
272
277
|
return await this.LslStreamOutlet({ channelFormat: 'float32' })
|
|
273
278
|
}
|
|
274
279
|
|
|
275
|
-
private static async LslStreamOutlet(
|
|
280
|
+
private static async LslStreamOutlet(
|
|
281
|
+
options?: Partial<StreamOutletOptions>
|
|
282
|
+
) {
|
|
276
283
|
return await LslStreamOutlet.Create({
|
|
277
284
|
...this.randomOutletOptions,
|
|
278
285
|
...options,
|
|
@@ -281,7 +288,7 @@ export default class LslStreamOutletTest extends AbstractLslTest {
|
|
|
281
288
|
}
|
|
282
289
|
|
|
283
290
|
class CheckingOutlet extends LslStreamOutlet {
|
|
284
|
-
public constructor(info: StreamInfo, options:
|
|
291
|
+
public constructor(info: StreamInfo, options: StreamOutletOptions) {
|
|
285
292
|
super(info, options)
|
|
286
293
|
}
|
|
287
294
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { test, assert } from '@neurodevs/node-tdd'
|
|
2
|
+
|
|
3
|
+
import LslWebSocketBridge, {
|
|
4
|
+
StreamTransportBridge,
|
|
5
|
+
} from '../../impl/LslWebSocketBridge.js'
|
|
6
|
+
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
7
|
+
|
|
8
|
+
export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
9
|
+
private static instance: StreamTransportBridge
|
|
10
|
+
|
|
11
|
+
protected static async beforeEach() {
|
|
12
|
+
await super.beforeEach()
|
|
13
|
+
|
|
14
|
+
this.instance = this.LslWebSocketBridge()
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
@test()
|
|
18
|
+
protected static async createsInstance() {
|
|
19
|
+
assert.isTruthy(this.instance, 'Failed to create instance!')
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
private static LslWebSocketBridge() {
|
|
23
|
+
return LslWebSocketBridge.Create()
|
|
24
|
+
}
|
|
25
|
+
}
|
package/src/assertions.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { CHANNEL_FORMATS } from './consts'
|
|
2
|
-
import { ChannelFormat } from './types'
|
|
1
|
+
import { CHANNEL_FORMATS } from './consts.js'
|
|
2
|
+
import { ChannelFormat } from './types.js'
|
|
3
3
|
import {
|
|
4
4
|
isGreaterThanOrEqualToZero,
|
|
5
5
|
isPositiveInteger,
|
|
6
6
|
isPositiveIntegerOrZero,
|
|
7
7
|
isStringInArray,
|
|
8
|
-
} from './validations'
|
|
8
|
+
} from './validations.js'
|
|
9
9
|
|
|
10
10
|
export function assertValidChunkSize(chunkSize: number) {
|
|
11
11
|
if (!isPositiveIntegerOrZero(chunkSize)) {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DataType, define, open } from 'ffi-rs'
|
|
2
|
+
|
|
2
3
|
import {
|
|
3
4
|
Liblsl,
|
|
4
5
|
LiblslBindings,
|
|
@@ -10,7 +11,8 @@ import {
|
|
|
10
11
|
PushSampleStringTimestampOptions,
|
|
11
12
|
CreateInletOptions,
|
|
12
13
|
DestroyInletOptions,
|
|
13
|
-
|
|
14
|
+
FlushInletOptions,
|
|
15
|
+
} from '../types.js'
|
|
14
16
|
|
|
15
17
|
export default class LiblslAdapter implements Liblsl {
|
|
16
18
|
public static ffiRsOpen = open
|
|
@@ -76,26 +78,6 @@ export default class LiblslAdapter implements Liblsl {
|
|
|
76
78
|
retType: DataType.External,
|
|
77
79
|
paramsType: [DataType.External, DataType.I32, DataType.I32],
|
|
78
80
|
},
|
|
79
|
-
lsl_destroy_outlet: {
|
|
80
|
-
library: 'lsl',
|
|
81
|
-
retType: DataType.Void,
|
|
82
|
-
paramsType: [DataType.External],
|
|
83
|
-
},
|
|
84
|
-
lsl_create_inlet: {
|
|
85
|
-
library: 'lsl',
|
|
86
|
-
retType: DataType.External,
|
|
87
|
-
paramsType: [DataType.External, DataType.I32, DataType.I32],
|
|
88
|
-
},
|
|
89
|
-
lsl_destroy_inlet: {
|
|
90
|
-
library: 'lsl',
|
|
91
|
-
retType: DataType.Void,
|
|
92
|
-
paramsType: [DataType.External],
|
|
93
|
-
},
|
|
94
|
-
lsl_local_clock: {
|
|
95
|
-
library: 'lsl',
|
|
96
|
-
retType: DataType.Double,
|
|
97
|
-
paramsType: [],
|
|
98
|
-
},
|
|
99
81
|
lsl_push_sample_ft: {
|
|
100
82
|
library: 'lsl',
|
|
101
83
|
retType: DataType.Void,
|
|
@@ -114,6 +96,26 @@ export default class LiblslAdapter implements Liblsl {
|
|
|
114
96
|
DataType.Double,
|
|
115
97
|
],
|
|
116
98
|
},
|
|
99
|
+
lsl_destroy_outlet: {
|
|
100
|
+
library: 'lsl',
|
|
101
|
+
retType: DataType.Void,
|
|
102
|
+
paramsType: [DataType.External],
|
|
103
|
+
},
|
|
104
|
+
lsl_create_inlet: {
|
|
105
|
+
library: 'lsl',
|
|
106
|
+
retType: DataType.External,
|
|
107
|
+
paramsType: [DataType.External, DataType.I32, DataType.I32],
|
|
108
|
+
},
|
|
109
|
+
lsl_flush_inlet: {
|
|
110
|
+
library: 'lsl',
|
|
111
|
+
retType: DataType.I32,
|
|
112
|
+
paramsType: [DataType.External],
|
|
113
|
+
},
|
|
114
|
+
lsl_destroy_inlet: {
|
|
115
|
+
library: 'lsl',
|
|
116
|
+
retType: DataType.Void,
|
|
117
|
+
paramsType: [DataType.External],
|
|
118
|
+
},
|
|
117
119
|
lsl_get_desc: {
|
|
118
120
|
library: 'lsl',
|
|
119
121
|
retType: DataType.External,
|
|
@@ -133,6 +135,11 @@ export default class LiblslAdapter implements Liblsl {
|
|
|
133
135
|
DataType.String,
|
|
134
136
|
],
|
|
135
137
|
},
|
|
138
|
+
lsl_local_clock: {
|
|
139
|
+
library: 'lsl',
|
|
140
|
+
retType: DataType.Double,
|
|
141
|
+
paramsType: [],
|
|
142
|
+
},
|
|
136
143
|
}) as unknown as LiblslBindings
|
|
137
144
|
}
|
|
138
145
|
|
|
@@ -203,6 +210,11 @@ export default class LiblslAdapter implements Liblsl {
|
|
|
203
210
|
return this.bindings.lsl_create_inlet([info, chunkSize, maxBuffered])
|
|
204
211
|
}
|
|
205
212
|
|
|
213
|
+
public flushInlet(options: FlushInletOptions) {
|
|
214
|
+
const { inlet } = options
|
|
215
|
+
this.bindings.lsl_flush_inlet([inlet])
|
|
216
|
+
}
|
|
217
|
+
|
|
206
218
|
public destroyInlet(_options: DestroyInletOptions) {}
|
|
207
219
|
|
|
208
220
|
public localClock() {
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import { DurationMarker } from '../types'
|
|
2
|
-
import LslStreamOutlet, {
|
|
1
|
+
import { DurationMarker } from '../types.js'
|
|
2
|
+
import LslStreamOutlet, {
|
|
3
|
+
StreamOutletOptions,
|
|
4
|
+
StreamOutlet,
|
|
5
|
+
} from './LslStreamOutlet.js'
|
|
3
6
|
|
|
4
|
-
export default class
|
|
5
|
-
public static Class?:
|
|
7
|
+
export default class LslEventMarkerOutlet implements EventMarkerOutlet {
|
|
8
|
+
public static Class?: EventMarkerOutletConstructor
|
|
6
9
|
|
|
7
|
-
protected
|
|
10
|
+
protected outlet: StreamOutlet
|
|
8
11
|
private isPlaying = false
|
|
9
12
|
private waitResolve?: () => void
|
|
10
13
|
private timeout?: any
|
|
11
14
|
|
|
12
|
-
protected constructor(
|
|
13
|
-
this.
|
|
15
|
+
protected constructor(outlet: StreamOutlet) {
|
|
16
|
+
this.outlet = outlet
|
|
14
17
|
}
|
|
15
18
|
|
|
16
|
-
public static async Create(options?: Partial<
|
|
19
|
+
public static async Create(options?: Partial<StreamOutletOptions>) {
|
|
17
20
|
const defaultOptions = {
|
|
18
21
|
name: 'Event markers',
|
|
19
22
|
type: 'Markers',
|
|
@@ -25,7 +28,7 @@ export default class EventMarkerOutlet implements MarkerOutlet {
|
|
|
25
28
|
unit: 'N/A',
|
|
26
29
|
chunkSize: 0,
|
|
27
30
|
maxBuffered: 0,
|
|
28
|
-
} as
|
|
31
|
+
} as StreamOutletOptions
|
|
29
32
|
|
|
30
33
|
const outlet = await LslStreamOutlet.Create({
|
|
31
34
|
...defaultOptions,
|
|
@@ -55,7 +58,7 @@ export default class EventMarkerOutlet implements MarkerOutlet {
|
|
|
55
58
|
}
|
|
56
59
|
|
|
57
60
|
private pushMarkerToOutlet(markerName: string) {
|
|
58
|
-
this.
|
|
61
|
+
this.outlet.pushSample([markerName])
|
|
59
62
|
}
|
|
60
63
|
|
|
61
64
|
protected async wait(durationMs: number) {
|
|
@@ -74,10 +77,12 @@ export default class EventMarkerOutlet implements MarkerOutlet {
|
|
|
74
77
|
}
|
|
75
78
|
}
|
|
76
79
|
|
|
77
|
-
export interface
|
|
80
|
+
export interface EventMarkerOutlet {
|
|
78
81
|
pushMarker(markerName: string): void
|
|
79
82
|
pushMarkers(markers: DurationMarker[]): Promise<void>
|
|
80
83
|
stop(): void
|
|
81
84
|
}
|
|
82
85
|
|
|
83
|
-
export type
|
|
86
|
+
export type EventMarkerOutletConstructor = new (
|
|
87
|
+
outlet: StreamOutlet
|
|
88
|
+
) => EventMarkerOutlet
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
1
|
+
import generateId from '@neurodevs/generate-id'
|
|
2
|
+
|
|
3
|
+
import { CHANNEL_FORMATS_MAP } from '../consts.js'
|
|
4
|
+
import { BoundStreamInfo, ChannelFormat } from '../types.js'
|
|
5
|
+
import LiblslAdapter from './LiblslAdapter.js'
|
|
5
6
|
|
|
6
7
|
export default class LslStreamInfo implements StreamInfo {
|
|
7
8
|
public static Class?: StreamInfoConstructor
|
|
@@ -1,17 +1,22 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { ChannelFormat } from '../types'
|
|
3
|
-
import LiblslAdapter from './LiblslAdapter'
|
|
4
|
-
import LslStreamInfo, { StreamInfo, StreamInfoOptions } from './LslStreamInfo'
|
|
1
|
+
import generateId from '@neurodevs/generate-id'
|
|
5
2
|
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
import { BoundInlet, ChannelFormat } from '../types.js'
|
|
4
|
+
import LiblslAdapter from './LiblslAdapter.js'
|
|
5
|
+
import LslStreamInfo, {
|
|
6
|
+
StreamInfo,
|
|
7
|
+
StreamInfoOptions,
|
|
8
|
+
} from './LslStreamInfo.js'
|
|
9
|
+
|
|
10
|
+
export default class LslStreamInlet implements StreamInlet {
|
|
11
|
+
public static Class?: StreamInletConstructor
|
|
8
12
|
|
|
9
13
|
protected name: string
|
|
10
14
|
protected info: StreamInfo
|
|
15
|
+
protected inlet!: BoundInlet
|
|
11
16
|
private chunkSize: number
|
|
12
17
|
private maxBuffered: number
|
|
13
18
|
|
|
14
|
-
protected constructor(info: StreamInfo, options:
|
|
19
|
+
protected constructor(info: StreamInfo, options: StreamInletOptions) {
|
|
15
20
|
const {
|
|
16
21
|
name = this.defaultName,
|
|
17
22
|
chunkSize,
|
|
@@ -23,18 +28,18 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
23
28
|
this.maxBuffered = maxBuffered
|
|
24
29
|
this.name = name
|
|
25
30
|
|
|
26
|
-
this.
|
|
31
|
+
this.createStreamInlet()
|
|
27
32
|
}
|
|
28
33
|
|
|
29
|
-
public static Create(options:
|
|
34
|
+
public static Create(options: StreamInletOptions) {
|
|
30
35
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
31
36
|
const { maxBuffered, chunkSize, ...infoOptions } = options
|
|
32
37
|
const info = this.LslStreamInfo(infoOptions)
|
|
33
38
|
return new (this.Class ?? this)(info, options)
|
|
34
39
|
}
|
|
35
40
|
|
|
36
|
-
private
|
|
37
|
-
this.lsl.createInlet({
|
|
41
|
+
private createStreamInlet() {
|
|
42
|
+
this.inlet = this.lsl.createInlet({
|
|
38
43
|
info: this.boundStreamInfo,
|
|
39
44
|
chunkSize: this.chunkSize,
|
|
40
45
|
maxBuffered: this.maxBuffered,
|
|
@@ -51,19 +56,25 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
51
56
|
|
|
52
57
|
private readonly defaultName = `lsl-inlet-${generateId()}`
|
|
53
58
|
|
|
59
|
+
public flushSamples() {
|
|
60
|
+
this.lsl.flushInlet({ inlet: this.inlet })
|
|
61
|
+
}
|
|
62
|
+
|
|
54
63
|
private static LslStreamInfo(options: StreamInfoOptions) {
|
|
55
64
|
return LslStreamInfo.Create(options)
|
|
56
65
|
}
|
|
57
66
|
}
|
|
58
67
|
|
|
59
|
-
export interface
|
|
68
|
+
export interface StreamInlet {
|
|
69
|
+
flushSamples(): void
|
|
70
|
+
}
|
|
60
71
|
|
|
61
|
-
export type
|
|
72
|
+
export type StreamInletConstructor = new (
|
|
62
73
|
info: StreamInfo,
|
|
63
|
-
options:
|
|
64
|
-
) =>
|
|
74
|
+
options: StreamInletOptions
|
|
75
|
+
) => StreamInlet
|
|
65
76
|
|
|
66
|
-
export interface
|
|
77
|
+
export interface StreamInletOptions {
|
|
67
78
|
sampleRate: number
|
|
68
79
|
channelNames: string[]
|
|
69
80
|
channelFormat: ChannelFormat
|
|
@@ -4,29 +4,32 @@ import {
|
|
|
4
4
|
assertValidChunkSize,
|
|
5
5
|
assertValidMaxBuffered,
|
|
6
6
|
assertValidSampleRate,
|
|
7
|
-
} from '../assertions'
|
|
8
|
-
import { ChannelFormat, BoundOutlet, Liblsl, LslSample } from '../types'
|
|
9
|
-
import LiblslAdapter from './LiblslAdapter'
|
|
10
|
-
import LslStreamInfo, {
|
|
7
|
+
} from '../assertions.js'
|
|
8
|
+
import { ChannelFormat, BoundOutlet, Liblsl, LslSample } from '../types.js'
|
|
9
|
+
import LiblslAdapter from './LiblslAdapter.js'
|
|
10
|
+
import LslStreamInfo, {
|
|
11
|
+
StreamInfo,
|
|
12
|
+
StreamInfoOptions,
|
|
13
|
+
} from './LslStreamInfo.js'
|
|
11
14
|
|
|
12
|
-
export default class LslStreamOutlet implements
|
|
13
|
-
public static Class?:
|
|
15
|
+
export default class LslStreamOutlet implements StreamOutlet {
|
|
16
|
+
public static Class?: StreamOutletConstructor
|
|
14
17
|
|
|
15
18
|
private info: StreamInfo
|
|
16
|
-
private options:
|
|
19
|
+
private options: StreamOutletOptions
|
|
17
20
|
private outlet!: BoundOutlet
|
|
18
21
|
private pushSampleByType!: (options: any) => void
|
|
19
22
|
|
|
20
|
-
protected constructor(info: StreamInfo, options:
|
|
23
|
+
protected constructor(info: StreamInfo, options: StreamOutletOptions) {
|
|
21
24
|
this.info = info
|
|
22
25
|
this.options = options
|
|
23
26
|
|
|
24
27
|
this.validateOptions()
|
|
25
|
-
this.
|
|
28
|
+
this.createStreamOutlet()
|
|
26
29
|
this.setPushSampleType()
|
|
27
30
|
}
|
|
28
31
|
|
|
29
|
-
public static async Create(options:
|
|
32
|
+
public static async Create(options: StreamOutletOptions) {
|
|
30
33
|
const { waitAfterConstructionMs = 10 } = options ?? {}
|
|
31
34
|
|
|
32
35
|
const streamInfoOptions = {
|
|
@@ -55,7 +58,7 @@ export default class LslStreamOutlet implements LslOutlet {
|
|
|
55
58
|
assertValidMaxBuffered(this.maxBuffered)
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
private
|
|
61
|
+
private createStreamOutlet() {
|
|
59
62
|
this.outlet = this.lsl.createOutlet({
|
|
60
63
|
info: this.boundStreamInfo,
|
|
61
64
|
chunkSize: this.chunkSize,
|
|
@@ -167,7 +170,7 @@ export default class LslStreamOutlet implements LslOutlet {
|
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
172
|
|
|
170
|
-
export interface
|
|
173
|
+
export interface StreamOutlet {
|
|
171
174
|
pushSample(sample: LslSample): void
|
|
172
175
|
destroy(): void
|
|
173
176
|
readonly name: string
|
|
@@ -182,12 +185,12 @@ export interface LslOutlet {
|
|
|
182
185
|
readonly unit: string
|
|
183
186
|
}
|
|
184
187
|
|
|
185
|
-
export type
|
|
188
|
+
export type StreamOutletConstructor = new (
|
|
186
189
|
info: StreamInfo,
|
|
187
|
-
options:
|
|
188
|
-
) =>
|
|
190
|
+
options: StreamOutletOptions
|
|
191
|
+
) => StreamOutlet
|
|
189
192
|
|
|
190
|
-
export interface
|
|
193
|
+
export interface StreamOutletOptions {
|
|
191
194
|
name: string
|
|
192
195
|
type: string
|
|
193
196
|
sourceId: string
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export default class LslWebSocketBridge implements StreamTransportBridge {
|
|
2
|
+
public static Class?: StreamTransportBridgeConstructor
|
|
3
|
+
|
|
4
|
+
protected constructor() {}
|
|
5
|
+
|
|
6
|
+
public static Create() {
|
|
7
|
+
return new (this.Class ?? this)()
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface StreamTransportBridge {}
|
|
12
|
+
|
|
13
|
+
export type StreamTransportBridgeConstructor = new () => StreamTransportBridge
|
package/src/index.ts
CHANGED
|
@@ -1,57 +1,65 @@
|
|
|
1
|
-
export * from './types'
|
|
1
|
+
export * from './types.js'
|
|
2
2
|
|
|
3
|
-
//
|
|
3
|
+
// EventMarkerOutlet
|
|
4
4
|
|
|
5
|
-
export { default as
|
|
6
|
-
export * from './
|
|
5
|
+
export { default as EventMarkerOutlet } from './impl/LslEventMarkerOutlet.js'
|
|
6
|
+
export * from './impl/LslEventMarkerOutlet.js'
|
|
7
7
|
|
|
8
|
-
export { default as
|
|
9
|
-
export * from './testDoubles/
|
|
8
|
+
export { default as FakeMarkerOutlet } from './testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js'
|
|
9
|
+
export * from './testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js'
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
export { default as MockMarkerOutlet } from './testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js'
|
|
12
|
+
export * from './testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js'
|
|
12
13
|
|
|
13
|
-
export { default as
|
|
14
|
-
export * from './
|
|
14
|
+
export { default as SpyMarkerOutlet } from './testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js'
|
|
15
|
+
export * from './testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js'
|
|
15
16
|
|
|
16
|
-
export { default as
|
|
17
|
-
export * from './testDoubles/
|
|
17
|
+
export { default as ThrowingMarkerOutlet } from './testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js'
|
|
18
|
+
export * from './testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js'
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
export * from './testDoubles/StreamInfo/FakeStreamInfo'
|
|
20
|
+
// Liblsl
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
export { default as LiblslAdapter } from './impl/LiblslAdapter.js'
|
|
23
|
+
export * from './impl/LiblslAdapter.js'
|
|
23
24
|
|
|
24
|
-
export { default as
|
|
25
|
-
export * from './
|
|
25
|
+
export { default as FakeLiblsl } from './testDoubles/Liblsl/FakeLiblsl.js'
|
|
26
|
+
export * from './testDoubles/Liblsl/FakeLiblsl.js'
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
export * from './testDoubles/LslInlet/FakeLslInlet'
|
|
28
|
+
// StreamInfo
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
export { default as LslStreamInfo } from './impl/LslStreamInfo.js'
|
|
31
|
+
export * from './impl/LslStreamInfo.js'
|
|
31
32
|
|
|
32
|
-
export { default as
|
|
33
|
-
export * from './
|
|
33
|
+
export { default as SpyStreamInfo } from './testDoubles/StreamInfo/SpyStreamInfo.js'
|
|
34
|
+
export * from './testDoubles/StreamInfo/SpyStreamInfo.js'
|
|
34
35
|
|
|
35
|
-
export { default as
|
|
36
|
-
export * from './testDoubles/
|
|
36
|
+
export { default as FakeStreamInfo } from './testDoubles/StreamInfo/FakeStreamInfo.js'
|
|
37
|
+
export * from './testDoubles/StreamInfo/FakeStreamInfo.js'
|
|
37
38
|
|
|
38
|
-
//
|
|
39
|
+
// StreamInlet
|
|
40
|
+
|
|
41
|
+
export { default as LslStreamInlet } from './impl/LslStreamInlet.js'
|
|
42
|
+
export * from './impl/LslStreamInlet.js'
|
|
43
|
+
|
|
44
|
+
export { default as FakeStreamInlet } from './testDoubles/StreamInlet/FakeStreamInlet.js'
|
|
45
|
+
export * from './testDoubles/StreamInlet/FakeStreamInlet.js'
|
|
46
|
+
|
|
47
|
+
// StreamOutlet
|
|
39
48
|
|
|
40
|
-
export { default as
|
|
41
|
-
export * from './
|
|
49
|
+
export { default as LslStreamOutlet } from './impl/LslStreamOutlet.js'
|
|
50
|
+
export * from './impl/LslStreamOutlet.js'
|
|
42
51
|
|
|
43
|
-
export { default as
|
|
44
|
-
export * from './testDoubles/
|
|
52
|
+
export { default as FakeStreamOutlet } from './testDoubles/StreamOutlet/FakeStreamOutlet.js'
|
|
53
|
+
export * from './testDoubles/StreamOutlet/FakeStreamOutlet.js'
|
|
45
54
|
|
|
46
|
-
|
|
47
|
-
export * from './testDoubles/MarkerOutlet/MockMarkerOutlet'
|
|
55
|
+
// StreamTransportBridge
|
|
48
56
|
|
|
49
|
-
export { default as
|
|
50
|
-
export * from './
|
|
57
|
+
export { default as LslWebSocketBridge } from './impl/LslWebSocketBridge.js'
|
|
58
|
+
export * from './impl/LslWebSocketBridge.js'
|
|
51
59
|
|
|
52
|
-
export { default as
|
|
53
|
-
export * from './testDoubles/
|
|
60
|
+
export { default as FakeStreamTransportBridge } from './testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js'
|
|
61
|
+
export * from './testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js'
|
|
54
62
|
|
|
55
63
|
// Utils
|
|
56
64
|
|
|
57
|
-
export { default as generateRandomOutletOptions } from './testDoubles/generateRandomOutletOptions'
|
|
65
|
+
export { default as generateRandomOutletOptions } from './testDoubles/generateRandomOutletOptions.js'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import LslEventMarkerOutlet from '../impl/LslEventMarkerOutlet.js'
|
|
2
2
|
|
|
3
3
|
async function main() {
|
|
4
|
-
const outlet = await
|
|
4
|
+
const outlet = await LslEventMarkerOutlet.Create()
|
|
5
5
|
|
|
6
6
|
const markers = [
|
|
7
7
|
{ name: 'phase-1-begin', durationMs: 100 },
|