@neurodevs/node-lsl 17.1.1 → 18.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/.claude/settings.local.json +10 -0
- package/.vscode/launch.json +54 -57
- package/.vscode/settings.json +61 -66
- package/.vscode/tasks.json +98 -129
- package/README.md +20 -44
- package/build/__tests__/AbstractPackageTest.d.ts +7 -5
- package/build/__tests__/AbstractPackageTest.js +22 -15
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/BleDeviceController.test.d.ts +54 -0
- package/build/__tests__/impl/BleDeviceController.test.js +333 -0
- package/build/__tests__/impl/BleDeviceController.test.js.map +1 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.d.ts +34 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js +243 -0
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -0
- package/build/__tests__/impl/LslStreamInfo.test.d.ts +0 -3
- package/build/__tests__/impl/LslStreamInfo.test.js +2 -27
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +20 -8
- package/build/__tests__/impl/LslStreamInlet.test.js +224 -69
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamOutlet.test.d.ts +3 -7
- package/build/__tests__/impl/LslStreamOutlet.test.js +40 -50
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js +19 -20
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/assertions.d.ts +1 -1
- package/build/assertions.js.map +1 -1
- package/build/impl/LslEventMarkerEmitter.d.ts +35 -0
- package/build/impl/LslEventMarkerEmitter.js +86 -0
- package/build/impl/LslEventMarkerEmitter.js.map +1 -0
- package/build/impl/LslStreamInfo.d.ts +4 -8
- package/build/impl/LslStreamInfo.js +8 -21
- package/build/impl/LslStreamInfo.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +31 -50
- package/build/impl/LslStreamInlet.js +79 -149
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +15 -18
- package/build/impl/LslStreamOutlet.js +39 -47
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +4 -5
- package/build/impl/LslWebSocketBridge.js +10 -10
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/impl/controllers/BleDeviceController.d.ts +58 -0
- package/build/impl/controllers/BleDeviceController.js +145 -0
- package/build/impl/controllers/BleDeviceController.js.map +1 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +22 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.js +42 -0
- package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +1 -0
- package/build/impl/workers/inlet/StreamInletWorker.d.ts +73 -0
- package/build/impl/workers/inlet/StreamInletWorker.js +253 -0
- package/build/impl/workers/inlet/StreamInletWorker.js.map +1 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +32 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js +82 -0
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +1 -0
- package/build/index.d.ts +14 -14
- package/build/index.js +16 -16
- package/build/index.js.map +1 -1
- package/build/scripts/discoverMuse.js +40 -0
- package/build/scripts/discoverMuse.js.map +1 -0
- package/build/scripts/finalizeHandles.d.ts +2 -0
- package/build/scripts/finalizeHandles.js +48 -0
- package/build/scripts/finalizeHandles.js.map +1 -0
- package/build/scripts/runLslEventMarkerEmitter.d.ts +1 -0
- package/build/scripts/runLslEventMarkerEmitter.js +11 -0
- package/build/scripts/runLslEventMarkerEmitter.js.map +1 -0
- package/build/scripts/runMuse.d.ts +1 -0
- package/build/scripts/runMuse.js +40 -0
- package/build/scripts/runMuse.js.map +1 -0
- package/build/scripts/runOutletToInlet.js +7 -6
- package/build/scripts/runOutletToInlet.js.map +1 -1
- package/build/scripts/testDestroyOutlet.d.ts +1 -0
- package/build/scripts/testDestroyOutlet.js +4 -0
- package/build/scripts/testDestroyOutlet.js.map +1 -0
- package/build/testDoubles/BleController/FakeBleController.d.ts +24 -0
- package/build/testDoubles/BleController/FakeBleController.js +42 -0
- package/build/testDoubles/BleController/FakeBleController.js.map +1 -0
- package/build/testDoubles/BleController/SpyBleController.d.ts +14 -0
- package/build/testDoubles/BleController/SpyBleController.js +48 -0
- package/build/testDoubles/BleController/SpyBleController.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.d.ts +17 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js +30 -0
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.d.ts +10 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js +23 -0
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +9 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js +19 -0
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +1 -0
- package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +3 -3
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js +3 -3
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +8 -10
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js +6 -7
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +2 -5
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js +2 -8
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -1
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +7 -9
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +8 -8
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js +1 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +1 -1
- package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +27 -0
- package/build/testDoubles/WorkerThreads/FakeWorker.js +67 -0
- package/build/testDoubles/WorkerThreads/FakeWorker.js.map +1 -0
- package/build/testDoubles/generateRandomOutletOptions.js +1 -1
- package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
- package/build/validations.js +0 -2
- package/build/validations.js.map +1 -1
- package/eslint.config.js +3 -0
- package/package.json +27 -49
- package/prettier.config.js +3 -0
- package/src/__tests__/AbstractPackageTest.ts +38 -21
- package/src/__tests__/impl/BleDeviceController.test.ts +492 -0
- package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +323 -0
- package/src/__tests__/impl/LslStreamInfo.test.ts +3 -40
- package/src/__tests__/impl/LslStreamInlet.test.ts +344 -97
- package/src/__tests__/impl/LslStreamOutlet.test.ts +65 -73
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +22 -21
- package/src/assertions.ts +2 -1
- package/src/impl/LslEventMarkerEmitter.ts +133 -0
- package/src/impl/LslStreamInfo.ts +17 -29
- package/src/impl/LslStreamInlet.ts +102 -215
- package/src/impl/LslStreamOutlet.ts +54 -78
- package/src/impl/LslWebSocketBridge.ts +14 -14
- package/src/impl/controllers/BleDeviceController.ts +223 -0
- package/src/impl/workers/inlet/LslStreamInlet.worker.ts +74 -0
- package/src/impl/workers/inlet/StreamInletWorker.ts +348 -0
- package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +144 -0
- package/src/index.ts +16 -16
- package/src/scripts/discoverMuse.ts +50 -0
- package/src/scripts/finalizeHandles.ts +63 -0
- package/src/scripts/runLslEventMarkerEmitter.ts +15 -0
- package/src/scripts/runMuse.ts +50 -0
- package/src/scripts/runOutletToInlet.ts +10 -8
- package/src/scripts/testDestroyOutlet.ts +5 -0
- package/src/testDoubles/BleController/FakeBleController.ts +70 -0
- package/src/testDoubles/BleController/SpyBleController.ts +61 -0
- package/src/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.ts +46 -0
- package/src/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.ts +31 -0
- package/src/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.ts +29 -0
- package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +4 -4
- package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +11 -17
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +3 -16
- package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +15 -15
- package/src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts +1 -1
- package/src/testDoubles/WorkerThreads/FakeWorker.ts +99 -0
- package/src/testDoubles/generateRandomOutletOptions.ts +2 -1
- package/src/validations.ts +0 -2
- package/tsconfig.json +23 -27
- package/build/.spruce/settings.json +0 -11
- package/build/__tests__/impl/LiblslAdapter.test.d.ts +0 -79
- package/build/__tests__/impl/LiblslAdapter.test.js +0 -688
- package/build/__tests__/impl/LiblslAdapter.test.js.map +0 -1
- package/build/__tests__/impl/LslEventMarkerOutlet.test.d.ts +0 -21
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js +0 -160
- package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +0 -1
- package/build/handleError.d.ts +0 -8
- package/build/handleError.js +0 -25
- package/build/handleError.js.map +0 -1
- package/build/impl/LiblslAdapter.d.ts +0 -154
- package/build/impl/LiblslAdapter.js +0 -317
- package/build/impl/LiblslAdapter.js.map +0 -1
- package/build/impl/LslEventMarkerOutlet.d.ts +0 -28
- package/build/impl/LslEventMarkerOutlet.js +0 -63
- package/build/impl/LslEventMarkerOutlet.js.map +0 -1
- package/build/scripts/runLslEventMarkerOutlet.js +0 -18
- package/build/scripts/runLslEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.d.ts +0 -13
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js +0 -26
- package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.d.ts +0 -17
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js +0 -46
- package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +0 -19
- package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +0 -9
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js +0 -19
- package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +0 -1
- package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +0 -50
- package/build/testDoubles/Liblsl/FakeLiblsl.js +0 -126
- package/build/testDoubles/Liblsl/FakeLiblsl.js.map +0 -1
- package/eslint.config.mjs +0 -3
- package/src/.spruce/settings.json +0 -11
- package/src/__tests__/impl/LiblslAdapter.test.ts +0 -817
- package/src/__tests__/impl/LslEventMarkerOutlet.test.ts +0 -195
- package/src/handleError.ts +0 -24
- package/src/impl/LiblslAdapter.ts +0 -543
- package/src/impl/LslEventMarkerOutlet.ts +0 -97
- package/src/scripts/runLslEventMarkerOutlet.ts +0 -23
- package/src/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.ts +0 -36
- package/src/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.ts +0 -75
- package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +0 -24
- package/src/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.ts +0 -28
- package/src/testDoubles/Liblsl/FakeLiblsl.ts +0 -182
- /package/build/scripts/{runLslEventMarkerOutlet.d.ts → discoverMuse.d.ts} +0 -0
package/.vscode/launch.json
CHANGED
|
@@ -1,58 +1,55 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
57
|
-
]
|
|
58
|
-
}
|
|
2
|
+
"version": "1.0.0",
|
|
3
|
+
"configurations": [
|
|
4
|
+
{
|
|
5
|
+
"type": "node",
|
|
6
|
+
"request": "attach",
|
|
7
|
+
"name": "attach.tests",
|
|
8
|
+
"port": 5200,
|
|
9
|
+
"restart": true,
|
|
10
|
+
"timeout": 10000
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"type": "node",
|
|
14
|
+
"request": "launch",
|
|
15
|
+
"name": "test.file",
|
|
16
|
+
"runtimeExecutable": "node",
|
|
17
|
+
"runtimeArgs": [
|
|
18
|
+
"--inspect-brk",
|
|
19
|
+
"--trace-warnings",
|
|
20
|
+
"--experimental-vm-modules",
|
|
21
|
+
"${workspaceFolder}/node_modules/.bin/jest",
|
|
22
|
+
"${fileBasenameNoExtension}",
|
|
23
|
+
"--detectOpenHandles"
|
|
24
|
+
],
|
|
25
|
+
"cwd": "${workspaceFolder}",
|
|
26
|
+
"console": "integratedTerminal",
|
|
27
|
+
"internalConsoleOptions": "neverOpen"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"type": "node",
|
|
31
|
+
"request": "launch",
|
|
32
|
+
"name": "test.all",
|
|
33
|
+
"runtimeExecutable": "node",
|
|
34
|
+
"runtimeArgs": [
|
|
35
|
+
"--inspect-brk",
|
|
36
|
+
"--trace-warnings",
|
|
37
|
+
"--experimental-vm-modules",
|
|
38
|
+
"${workspaceFolder}/node_modules/.bin/jest"
|
|
39
|
+
],
|
|
40
|
+
"cwd": "${workspaceFolder}",
|
|
41
|
+
"console": "integratedTerminal",
|
|
42
|
+
"internalConsoleOptions": "neverOpen"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"type": "node",
|
|
46
|
+
"request": "launch",
|
|
47
|
+
"name": "boot",
|
|
48
|
+
"runtimeExecutable": "yarn",
|
|
49
|
+
"runtimeArgs": ["run", "--inspect-brk", "--trace-warnings", "boot"],
|
|
50
|
+
"cwd": "${workspaceFolder}",
|
|
51
|
+
"console": "integratedTerminal",
|
|
52
|
+
"internalConsoleOptions": "neverOpen"
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
package/.vscode/settings.json
CHANGED
|
@@ -1,67 +1,62 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
"editor.formatOnSave": false,
|
|
64
|
-
"editor.codeActionsOnSave": {
|
|
65
|
-
"source.fixAll.eslint": "always"
|
|
66
|
-
}
|
|
67
|
-
}
|
|
2
|
+
"debug.node.autoAttach": "on",
|
|
3
|
+
"git.ignoreLimitWarning": true,
|
|
4
|
+
"javascript.validate.enable": false,
|
|
5
|
+
"files.watcherExclude": {
|
|
6
|
+
"**/.git/objects/**": true,
|
|
7
|
+
"**/.git/subtree-cache/**": true,
|
|
8
|
+
"**/build/**": true,
|
|
9
|
+
"**/node_modules/**": true
|
|
10
|
+
},
|
|
11
|
+
"search.exclude": {
|
|
12
|
+
"**/build/**": true,
|
|
13
|
+
"**/node_modules/**": true,
|
|
14
|
+
"**/.next/**": true
|
|
15
|
+
},
|
|
16
|
+
"editor.codeActionsOnSave": {
|
|
17
|
+
"source.fixAll.eslint": "always"
|
|
18
|
+
},
|
|
19
|
+
"editor.formatOnSave": true,
|
|
20
|
+
"editor.formatOnSaveMode": "file",
|
|
21
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
22
|
+
"editor.maxTokenizationLineLength": 20000000,
|
|
23
|
+
"[javascript]": {
|
|
24
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
25
|
+
"editor.formatOnSave": true
|
|
26
|
+
},
|
|
27
|
+
"[javascriptreact]": {
|
|
28
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
29
|
+
"editor.formatOnSave": true
|
|
30
|
+
},
|
|
31
|
+
"[typescript]": {
|
|
32
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
33
|
+
"editor.formatOnSave": true
|
|
34
|
+
},
|
|
35
|
+
"[typescriptreact]": {
|
|
36
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
37
|
+
"editor.formatOnSave": true
|
|
38
|
+
},
|
|
39
|
+
"eslint.enable": true,
|
|
40
|
+
"eslint.useFlatConfig": true,
|
|
41
|
+
"eslint.validate": [
|
|
42
|
+
"javascript",
|
|
43
|
+
"javascriptreact",
|
|
44
|
+
"typescript",
|
|
45
|
+
"typescriptreact"
|
|
46
|
+
],
|
|
47
|
+
"eslint.workingDirectories": ["./"],
|
|
48
|
+
"debug.javascript.unmapMissingSources": true,
|
|
49
|
+
"javascript.preferences.importModuleSpecifier": "relative",
|
|
50
|
+
"typescript.preferences.importModuleSpecifier": "relative",
|
|
51
|
+
"typescript.tsdk": "node_modules/typescript/lib",
|
|
52
|
+
"typescript.validate.enable": true,
|
|
53
|
+
"cSpell.ignorePaths": [
|
|
54
|
+
"**/package-lock.json",
|
|
55
|
+
"**/node_modules/**",
|
|
56
|
+
"**/build/**",
|
|
57
|
+
"**/vscode-extension/**",
|
|
58
|
+
"**/.git/objects/**",
|
|
59
|
+
".vscode"
|
|
60
|
+
],
|
|
61
|
+
"cSpell.words": ["arkit", "autogenerated", "scrollable", "serializable"]
|
|
62
|
+
}
|
package/.vscode/tasks.json
CHANGED
|
@@ -1,130 +1,99 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
"clear": false
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
],
|
|
104
|
-
"inputs": [
|
|
105
|
-
{
|
|
106
|
-
"id": "spruceCommand",
|
|
107
|
-
"description": "spruce command",
|
|
108
|
-
"default": "create.test",
|
|
109
|
-
"type": "promptString"
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
"id": "command",
|
|
113
|
-
"description": "command",
|
|
114
|
-
"default": "yarn",
|
|
115
|
-
"type": "promptString"
|
|
116
|
-
},
|
|
117
|
-
{
|
|
118
|
-
"id": "optionsCommand",
|
|
119
|
-
"description": "optionsCommand",
|
|
120
|
-
"default": "add",
|
|
121
|
-
"type": "promptString"
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
"id": "ndxCommand",
|
|
125
|
-
"description": "ndx command",
|
|
126
|
-
"default": "create.module",
|
|
127
|
-
"type": "promptString"
|
|
128
|
-
}
|
|
129
|
-
]
|
|
130
|
-
}
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"tasks": [
|
|
4
|
+
{
|
|
5
|
+
"type": "npm",
|
|
6
|
+
"script": "watch.build.dev",
|
|
7
|
+
"group": "build",
|
|
8
|
+
"label": "watch.build.dev & problem.watcher",
|
|
9
|
+
"isBackground": true,
|
|
10
|
+
"runOptions": {
|
|
11
|
+
"runOn": "folderOpen"
|
|
12
|
+
},
|
|
13
|
+
"promptOnClose": false,
|
|
14
|
+
"presentation": {
|
|
15
|
+
"focus": false,
|
|
16
|
+
"reveal": "never"
|
|
17
|
+
},
|
|
18
|
+
"problemMatcher": {
|
|
19
|
+
"base": "$tsc-watch",
|
|
20
|
+
"applyTo": "allDocuments"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"label": "test.file",
|
|
25
|
+
"type": "shell",
|
|
26
|
+
"command": "node node_modules/@neurodevs/node-tdd/build/workspace/testRunner.cli.js --pattern \"${fileBasenameNoExtension}\" --watchMode standard --inspect 5200",
|
|
27
|
+
"promptOnClose": false,
|
|
28
|
+
"group": {
|
|
29
|
+
"kind": "test",
|
|
30
|
+
"isDefault": true
|
|
31
|
+
},
|
|
32
|
+
"presentation": {
|
|
33
|
+
"reveal": "always",
|
|
34
|
+
"panel": "dedicated"
|
|
35
|
+
},
|
|
36
|
+
"problemMatcher": []
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"label": "test.reporter",
|
|
40
|
+
"type": "shell",
|
|
41
|
+
"command": "node node_modules/@neurodevs/node-tdd/build/workspace/testRunner.cli.js --watchMode standard",
|
|
42
|
+
"promptOnClose": false,
|
|
43
|
+
"group": "test",
|
|
44
|
+
"runOptions": {
|
|
45
|
+
"runOn": "folderOpen"
|
|
46
|
+
},
|
|
47
|
+
"presentation": {
|
|
48
|
+
"panel": "shared",
|
|
49
|
+
"focus": true,
|
|
50
|
+
"reveal": "always"
|
|
51
|
+
},
|
|
52
|
+
"problemMatcher": []
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"label": "shell",
|
|
56
|
+
"type": "shell",
|
|
57
|
+
"command": "${input:command} ${input:optionsCommand}",
|
|
58
|
+
"problemMatcher": [],
|
|
59
|
+
"presentation": {
|
|
60
|
+
"reveal": "always",
|
|
61
|
+
"focus": true,
|
|
62
|
+
"panel": "new",
|
|
63
|
+
"clear": false
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"label": "ndx",
|
|
68
|
+
"type": "shell",
|
|
69
|
+
"command": "ndx ${input:ndxCommand}",
|
|
70
|
+
"problemMatcher": [],
|
|
71
|
+
"presentation": {
|
|
72
|
+
"reveal": "always",
|
|
73
|
+
"focus": true,
|
|
74
|
+
"panel": "new",
|
|
75
|
+
"clear": false
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"inputs": [
|
|
80
|
+
{
|
|
81
|
+
"id": "command",
|
|
82
|
+
"description": "command",
|
|
83
|
+
"default": "yarn",
|
|
84
|
+
"type": "promptString"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "optionsCommand",
|
|
88
|
+
"description": "optionsCommand",
|
|
89
|
+
"default": "add",
|
|
90
|
+
"type": "promptString"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "ndxCommand",
|
|
94
|
+
"description": "ndx command",
|
|
95
|
+
"default": "create.module",
|
|
96
|
+
"type": "promptString"
|
|
97
|
+
}
|
|
98
|
+
]
|
|
99
|
+
}
|
package/README.md
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
# node-lsl
|
|
2
|
+
|
|
2
3
|
Lab Streaming Layer (LSL) for synchronized streaming of multi-modal, time-series data over a network.
|
|
3
4
|
|
|
4
5
|
## Table of Contents
|
|
6
|
+
|
|
5
7
|
- [Overview](#overview)
|
|
6
8
|
- [Installation](#installation)
|
|
7
9
|
- [Usage](#usage)
|
|
8
10
|
- [LslStreamOutlet](#lslstreamoutlet)
|
|
9
|
-
- [
|
|
11
|
+
- [LslEventMarkerEmitter](#LslEventMarkerEmitter)
|
|
10
12
|
- [Test Doubles](#test-doubles)
|
|
11
13
|
|
|
12
14
|
## Overview
|
|
@@ -23,9 +25,9 @@ First, you need to install the C++ [liblsl](https://github.com/sccn/liblsl) libr
|
|
|
23
25
|
|
|
24
26
|
Then, install the package with your preferred package manager (make sure to be in the right directory for your Node project):
|
|
25
27
|
|
|
26
|
-
`npm install @neurodevs/node-lsl`
|
|
28
|
+
`npm install @neurodevs/node-lsl`
|
|
27
29
|
|
|
28
|
-
or
|
|
30
|
+
or
|
|
29
31
|
|
|
30
32
|
`yarn add @neurodevs/node-lsl`
|
|
31
33
|
|
|
@@ -45,59 +47,33 @@ LSL is often used to stream EEG data over a network. For example, to instantiate
|
|
|
45
47
|
import { LslStreamOutlet } from '@neurodevs/node-lsl'
|
|
46
48
|
|
|
47
49
|
const outlet = await LslStreamOutlet.Create({
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
name: 'Muse S (2nd gen)',
|
|
51
|
+
type: 'EEG',
|
|
52
|
+
sourceId: 'muse-s-eeg',
|
|
53
|
+
channelNames: ['TP9', 'AF7', 'AF8', 'TP10', 'AUX'],
|
|
54
|
+
channelFormat: 'float32',
|
|
55
|
+
sampleRateHz: 256,
|
|
56
|
+
chunkSize: 12,
|
|
55
57
|
})
|
|
56
58
|
|
|
57
59
|
outlet.pushSample([1, 2, 3, 4, 5])
|
|
58
60
|
```
|
|
59
61
|
|
|
60
|
-
###
|
|
62
|
+
### LslEventMarkerEmitter
|
|
61
63
|
|
|
62
|
-
LSL is also often used to push event markers that mark different phases of an experiment or session. The `
|
|
64
|
+
LSL is also often used to push event markers that mark different phases of an experiment or session. The `emitMany` method pushes an event marker, waits for a specified duration, then pushes the next marker. From experience, each event marker should have a `waitAfterMs` of at least 100 ms or so to ensure LSL receives the event markers in the right order.
|
|
63
65
|
|
|
64
66
|
```typescript
|
|
65
|
-
import {
|
|
67
|
+
import { LslEventMarkerEmitter } from '@neurodevs/node-lsl'
|
|
66
68
|
|
|
67
|
-
const
|
|
69
|
+
const emitter = await LslEventMarkerEmitter.Create()
|
|
68
70
|
|
|
69
71
|
const markers = [
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
{ name: 'phase-1-begin', waitAfterMs: 5000 },
|
|
73
|
+
{ name: 'phase-1-end', waitAfterMs: 100 },
|
|
72
74
|
]
|
|
73
75
|
|
|
74
|
-
|
|
75
|
-
await outlet.pushMarkers(markers)
|
|
76
|
+
const promise = emitter.emitMany(markers)
|
|
76
77
|
|
|
77
|
-
|
|
78
|
-
void outlet.pushMarkers(markers)
|
|
79
|
-
|
|
80
|
-
// Interrupts the above pushMarkers process
|
|
81
|
-
outlet.stop()
|
|
78
|
+
emitter.interrupt()
|
|
82
79
|
```
|
|
83
|
-
|
|
84
|
-
## Test Doubles
|
|
85
|
-
|
|
86
|
-
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.
|
|
87
|
-
|
|
88
|
-
For example, the `MockEventMarkerOutlet` class lets you test whether your application appropriately calls its methods without actually doing anything. Set this mock in your test code like this:
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
import { LslEventMarkerOutlet, MockEventMarkerOutlet } from '@neurodevs/node-lsl'
|
|
92
|
-
|
|
93
|
-
// In your tests / beforeEach
|
|
94
|
-
LslEventMarkerOutlet.Class = MockEventMarkerOutlet
|
|
95
|
-
const mock = await LslEventMarkerOutlet.Create()
|
|
96
|
-
|
|
97
|
-
// Do something in your application that should start the outlet
|
|
98
|
-
|
|
99
|
-
const expectedMarkers = ['phase-1-begin', ...]
|
|
100
|
-
mock.assertDidPushSamples(expectedMarkers)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Now, you'll have a failing test. There will be a helpful error message to guide you towards the solution. Basically, you just need to call the `pushSample` method in your application with the expected markers. See examples above for how to do so.
|
|
@@ -1,27 +1,29 @@
|
|
|
1
|
+
import { FakeLiblsl, FakeLibndx } from '@neurodevs/ndx-native';
|
|
1
2
|
import AbstractModuleTest from '@neurodevs/node-tdd';
|
|
2
|
-
import { OnDataCallback, StreamInletOptions } from '../impl/LslStreamInlet.js';
|
|
3
|
-
import FakeLiblsl from '../testDoubles/Liblsl/FakeLiblsl.js';
|
|
4
3
|
import FakeStreamInfo from '../testDoubles/StreamInfo/FakeStreamInfo.js';
|
|
4
|
+
import { OnDataCallback, StreamInletOptions } from '../impl/LslStreamInlet.js';
|
|
5
5
|
export default class AbstractPackageTest extends AbstractModuleTest {
|
|
6
6
|
protected static fakeLiblsl: FakeLiblsl;
|
|
7
|
+
protected static fakeLibndx: FakeLibndx;
|
|
7
8
|
protected static beforeEach(): Promise<void>;
|
|
8
9
|
protected static setFakeLiblsl(): void;
|
|
10
|
+
protected static setFakeLibndx(): void;
|
|
9
11
|
protected static setSpyStreamInfo(): void;
|
|
10
12
|
protected static setFakeStreamInfo(): void;
|
|
11
13
|
protected static setSpyStreamInlet(): void;
|
|
12
14
|
protected static setFakeStreamInlet(): void;
|
|
13
15
|
protected static setFakeStreamOutlet(): void;
|
|
14
|
-
protected static
|
|
16
|
+
protected static setSpyEventMarkerEmitter(): void;
|
|
15
17
|
protected static setSpyLslWebSocketBridge(): void;
|
|
16
18
|
protected static setFakeWebSocket(): void;
|
|
17
19
|
protected static setFakeWebSocketServer(): void;
|
|
18
|
-
protected static readonly
|
|
20
|
+
protected static readonly fakeStreamInfo: FakeStreamInfo;
|
|
19
21
|
protected static readonly name_: string;
|
|
20
22
|
protected static readonly type: string;
|
|
21
23
|
protected static readonly sourceId: string;
|
|
22
24
|
protected static readonly units: string;
|
|
23
25
|
protected static readonly channelNames: string[];
|
|
24
|
-
protected static
|
|
26
|
+
protected static readonly channelCount: number;
|
|
25
27
|
protected static readonly chunkSize = 2;
|
|
26
28
|
protected static readonly sampleRateHz: number;
|
|
27
29
|
protected static readonly maxBufferedMs: number;
|