@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.
Files changed (198) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.vscode/launch.json +54 -57
  3. package/.vscode/settings.json +61 -66
  4. package/.vscode/tasks.json +98 -129
  5. package/README.md +20 -44
  6. package/build/__tests__/AbstractPackageTest.d.ts +7 -5
  7. package/build/__tests__/AbstractPackageTest.js +22 -15
  8. package/build/__tests__/AbstractPackageTest.js.map +1 -1
  9. package/build/__tests__/impl/BleDeviceController.test.d.ts +54 -0
  10. package/build/__tests__/impl/BleDeviceController.test.js +333 -0
  11. package/build/__tests__/impl/BleDeviceController.test.js.map +1 -0
  12. package/build/__tests__/impl/LslEventMarkerEmitter.test.d.ts +34 -0
  13. package/build/__tests__/impl/LslEventMarkerEmitter.test.js +243 -0
  14. package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -0
  15. package/build/__tests__/impl/LslStreamInfo.test.d.ts +0 -3
  16. package/build/__tests__/impl/LslStreamInfo.test.js +2 -27
  17. package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
  18. package/build/__tests__/impl/LslStreamInlet.test.d.ts +20 -8
  19. package/build/__tests__/impl/LslStreamInlet.test.js +224 -69
  20. package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
  21. package/build/__tests__/impl/LslStreamOutlet.test.d.ts +3 -7
  22. package/build/__tests__/impl/LslStreamOutlet.test.js +40 -50
  23. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
  24. package/build/__tests__/impl/LslWebSocketBridge.test.js +19 -20
  25. package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
  26. package/build/assertions.d.ts +1 -1
  27. package/build/assertions.js.map +1 -1
  28. package/build/impl/LslEventMarkerEmitter.d.ts +35 -0
  29. package/build/impl/LslEventMarkerEmitter.js +86 -0
  30. package/build/impl/LslEventMarkerEmitter.js.map +1 -0
  31. package/build/impl/LslStreamInfo.d.ts +4 -8
  32. package/build/impl/LslStreamInfo.js +8 -21
  33. package/build/impl/LslStreamInfo.js.map +1 -1
  34. package/build/impl/LslStreamInlet.d.ts +31 -50
  35. package/build/impl/LslStreamInlet.js +79 -149
  36. package/build/impl/LslStreamInlet.js.map +1 -1
  37. package/build/impl/LslStreamOutlet.d.ts +15 -18
  38. package/build/impl/LslStreamOutlet.js +39 -47
  39. package/build/impl/LslStreamOutlet.js.map +1 -1
  40. package/build/impl/LslWebSocketBridge.d.ts +4 -5
  41. package/build/impl/LslWebSocketBridge.js +10 -10
  42. package/build/impl/LslWebSocketBridge.js.map +1 -1
  43. package/build/impl/controllers/BleDeviceController.d.ts +58 -0
  44. package/build/impl/controllers/BleDeviceController.js +145 -0
  45. package/build/impl/controllers/BleDeviceController.js.map +1 -0
  46. package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +22 -0
  47. package/build/impl/workers/inlet/LslStreamInlet.worker.js +42 -0
  48. package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +1 -0
  49. package/build/impl/workers/inlet/StreamInletWorker.d.ts +73 -0
  50. package/build/impl/workers/inlet/StreamInletWorker.js +253 -0
  51. package/build/impl/workers/inlet/StreamInletWorker.js.map +1 -0
  52. package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +32 -0
  53. package/build/impl/workers/outlet/LslStreamOutlet.worker.js +82 -0
  54. package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +1 -0
  55. package/build/index.d.ts +14 -14
  56. package/build/index.js +16 -16
  57. package/build/index.js.map +1 -1
  58. package/build/scripts/discoverMuse.js +40 -0
  59. package/build/scripts/discoverMuse.js.map +1 -0
  60. package/build/scripts/finalizeHandles.d.ts +2 -0
  61. package/build/scripts/finalizeHandles.js +48 -0
  62. package/build/scripts/finalizeHandles.js.map +1 -0
  63. package/build/scripts/runLslEventMarkerEmitter.d.ts +1 -0
  64. package/build/scripts/runLslEventMarkerEmitter.js +11 -0
  65. package/build/scripts/runLslEventMarkerEmitter.js.map +1 -0
  66. package/build/scripts/runMuse.d.ts +1 -0
  67. package/build/scripts/runMuse.js +40 -0
  68. package/build/scripts/runMuse.js.map +1 -0
  69. package/build/scripts/runOutletToInlet.js +7 -6
  70. package/build/scripts/runOutletToInlet.js.map +1 -1
  71. package/build/scripts/testDestroyOutlet.d.ts +1 -0
  72. package/build/scripts/testDestroyOutlet.js +4 -0
  73. package/build/scripts/testDestroyOutlet.js.map +1 -0
  74. package/build/testDoubles/BleController/FakeBleController.d.ts +24 -0
  75. package/build/testDoubles/BleController/FakeBleController.js +42 -0
  76. package/build/testDoubles/BleController/FakeBleController.js.map +1 -0
  77. package/build/testDoubles/BleController/SpyBleController.d.ts +14 -0
  78. package/build/testDoubles/BleController/SpyBleController.js +48 -0
  79. package/build/testDoubles/BleController/SpyBleController.js.map +1 -0
  80. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.d.ts +17 -0
  81. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js +30 -0
  82. package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +1 -0
  83. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.d.ts +10 -0
  84. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js +23 -0
  85. package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +1 -0
  86. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +9 -0
  87. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js +19 -0
  88. package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +1 -0
  89. package/build/testDoubles/StreamInfo/FakeStreamInfo.d.ts +3 -3
  90. package/build/testDoubles/StreamInfo/FakeStreamInfo.js +3 -3
  91. package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +1 -1
  92. package/build/testDoubles/StreamInlet/FakeStreamInlet.d.ts +8 -10
  93. package/build/testDoubles/StreamInlet/FakeStreamInlet.js +6 -7
  94. package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +1 -1
  95. package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +2 -5
  96. package/build/testDoubles/StreamInlet/SpyStreamInlet.js +2 -8
  97. package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +1 -1
  98. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.d.ts +7 -9
  99. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js +8 -8
  100. package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +1 -1
  101. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +1 -1
  102. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js +1 -1
  103. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +1 -1
  104. package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +27 -0
  105. package/build/testDoubles/WorkerThreads/FakeWorker.js +67 -0
  106. package/build/testDoubles/WorkerThreads/FakeWorker.js.map +1 -0
  107. package/build/testDoubles/generateRandomOutletOptions.js +1 -1
  108. package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
  109. package/build/validations.js +0 -2
  110. package/build/validations.js.map +1 -1
  111. package/eslint.config.js +3 -0
  112. package/package.json +27 -49
  113. package/prettier.config.js +3 -0
  114. package/src/__tests__/AbstractPackageTest.ts +38 -21
  115. package/src/__tests__/impl/BleDeviceController.test.ts +492 -0
  116. package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +323 -0
  117. package/src/__tests__/impl/LslStreamInfo.test.ts +3 -40
  118. package/src/__tests__/impl/LslStreamInlet.test.ts +344 -97
  119. package/src/__tests__/impl/LslStreamOutlet.test.ts +65 -73
  120. package/src/__tests__/impl/LslWebSocketBridge.test.ts +22 -21
  121. package/src/assertions.ts +2 -1
  122. package/src/impl/LslEventMarkerEmitter.ts +133 -0
  123. package/src/impl/LslStreamInfo.ts +17 -29
  124. package/src/impl/LslStreamInlet.ts +102 -215
  125. package/src/impl/LslStreamOutlet.ts +54 -78
  126. package/src/impl/LslWebSocketBridge.ts +14 -14
  127. package/src/impl/controllers/BleDeviceController.ts +223 -0
  128. package/src/impl/workers/inlet/LslStreamInlet.worker.ts +74 -0
  129. package/src/impl/workers/inlet/StreamInletWorker.ts +348 -0
  130. package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +144 -0
  131. package/src/index.ts +16 -16
  132. package/src/scripts/discoverMuse.ts +50 -0
  133. package/src/scripts/finalizeHandles.ts +63 -0
  134. package/src/scripts/runLslEventMarkerEmitter.ts +15 -0
  135. package/src/scripts/runMuse.ts +50 -0
  136. package/src/scripts/runOutletToInlet.ts +10 -8
  137. package/src/scripts/testDestroyOutlet.ts +5 -0
  138. package/src/testDoubles/BleController/FakeBleController.ts +70 -0
  139. package/src/testDoubles/BleController/SpyBleController.ts +61 -0
  140. package/src/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.ts +46 -0
  141. package/src/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.ts +31 -0
  142. package/src/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.ts +29 -0
  143. package/src/testDoubles/StreamInfo/FakeStreamInfo.ts +4 -4
  144. package/src/testDoubles/StreamInlet/FakeStreamInlet.ts +11 -17
  145. package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +3 -16
  146. package/src/testDoubles/StreamOutlet/FakeStreamOutlet.ts +15 -15
  147. package/src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts +1 -1
  148. package/src/testDoubles/WorkerThreads/FakeWorker.ts +99 -0
  149. package/src/testDoubles/generateRandomOutletOptions.ts +2 -1
  150. package/src/validations.ts +0 -2
  151. package/tsconfig.json +23 -27
  152. package/build/.spruce/settings.json +0 -11
  153. package/build/__tests__/impl/LiblslAdapter.test.d.ts +0 -79
  154. package/build/__tests__/impl/LiblslAdapter.test.js +0 -688
  155. package/build/__tests__/impl/LiblslAdapter.test.js.map +0 -1
  156. package/build/__tests__/impl/LslEventMarkerOutlet.test.d.ts +0 -21
  157. package/build/__tests__/impl/LslEventMarkerOutlet.test.js +0 -160
  158. package/build/__tests__/impl/LslEventMarkerOutlet.test.js.map +0 -1
  159. package/build/handleError.d.ts +0 -8
  160. package/build/handleError.js +0 -25
  161. package/build/handleError.js.map +0 -1
  162. package/build/impl/LiblslAdapter.d.ts +0 -154
  163. package/build/impl/LiblslAdapter.js +0 -317
  164. package/build/impl/LiblslAdapter.js.map +0 -1
  165. package/build/impl/LslEventMarkerOutlet.d.ts +0 -28
  166. package/build/impl/LslEventMarkerOutlet.js +0 -63
  167. package/build/impl/LslEventMarkerOutlet.js.map +0 -1
  168. package/build/scripts/runLslEventMarkerOutlet.js +0 -18
  169. package/build/scripts/runLslEventMarkerOutlet.js.map +0 -1
  170. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.d.ts +0 -13
  171. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js +0 -26
  172. package/build/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js.map +0 -1
  173. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.d.ts +0 -17
  174. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js +0 -46
  175. package/build/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js.map +0 -1
  176. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.d.ts +0 -9
  177. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js +0 -19
  178. package/build/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js.map +0 -1
  179. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.d.ts +0 -9
  180. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js +0 -19
  181. package/build/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js.map +0 -1
  182. package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +0 -50
  183. package/build/testDoubles/Liblsl/FakeLiblsl.js +0 -126
  184. package/build/testDoubles/Liblsl/FakeLiblsl.js.map +0 -1
  185. package/eslint.config.mjs +0 -3
  186. package/src/.spruce/settings.json +0 -11
  187. package/src/__tests__/impl/LiblslAdapter.test.ts +0 -817
  188. package/src/__tests__/impl/LslEventMarkerOutlet.test.ts +0 -195
  189. package/src/handleError.ts +0 -24
  190. package/src/impl/LiblslAdapter.ts +0 -543
  191. package/src/impl/LslEventMarkerOutlet.ts +0 -97
  192. package/src/scripts/runLslEventMarkerOutlet.ts +0 -23
  193. package/src/testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.ts +0 -36
  194. package/src/testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.ts +0 -75
  195. package/src/testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.ts +0 -24
  196. package/src/testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.ts +0 -28
  197. package/src/testDoubles/Liblsl/FakeLiblsl.ts +0 -182
  198. /package/build/scripts/{runLslEventMarkerOutlet.d.ts → discoverMuse.d.ts} +0 -0
@@ -0,0 +1,10 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(yarn build.dev)",
5
+ "Bash(yarn test:*)",
6
+ "Bash(NODE_OPTIONS=--experimental-vm-modules yarn test:*)",
7
+ "Bash(tsc:*)"
8
+ ]
9
+ }
10
+ }
@@ -1,58 +1,55 @@
1
1
  {
2
- "version": "0.2.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
- "${workspaceFolder}/node_modules/.bin/jest",
21
- "${fileBasenameNoExtension}",
22
- "--detectOpenHandles"
23
- ],
24
- "cwd": "${workspaceFolder}",
25
- "console": "integratedTerminal",
26
- "internalConsoleOptions": "neverOpen"
27
- },
28
- {
29
- "type": "node",
30
- "request": "launch",
31
- "name": "test.all",
32
- "runtimeExecutable": "node",
33
- "runtimeArgs": [
34
- "--inspect-brk",
35
- "--trace-warnings",
36
- "${workspaceFolder}/node_modules/.bin/jest"
37
- ],
38
- "cwd": "${workspaceFolder}",
39
- "console": "integratedTerminal",
40
- "internalConsoleOptions": "neverOpen"
41
- },
42
- {
43
- "type": "node",
44
- "request": "launch",
45
- "name": "boot",
46
- "runtimeExecutable": "yarn",
47
- "runtimeArgs": [
48
- "run",
49
- "--inspect-brk",
50
- "--trace-warnings",
51
- "boot"
52
- ],
53
- "cwd": "${workspaceFolder}",
54
- "console": "integratedTerminal",
55
- "internalConsoleOptions": "neverOpen"
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
+ }
@@ -1,67 +1,62 @@
1
1
  {
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.maxTokenizationLineLength": 20000000,
17
- "[javascript]": {
18
- "editor.formatOnSave": false
19
- },
20
- "[javascriptreact]": {
21
- "editor.formatOnSave": false
22
- },
23
- "[typescript]": {
24
- "editor.formatOnSave": false
25
- },
26
- "[typescriptreact]": {
27
- "editor.formatOnSave": false
28
- },
29
- "[handlebars]": {
30
- "editor.formatOnSave": false
31
- },
32
- "typescript.tsdk": "node_modules/typescript/lib",
33
- "cSpell.ignorePaths": [
34
- "**/package-lock.json",
35
- "**/node_modules/**",
36
- "**/build/**",
37
- "**/vscode-extension/**",
38
- "**/.git/objects/**",
39
- ".vscode",
40
- ".spruce"
41
- ],
42
- "cSpell.words": [
43
- "arkit",
44
- "autogenerated",
45
- "scrollable",
46
- "serializable"
47
- ],
48
- "debug.javascript.unmapMissingSources": true,
49
- "javascript.preferences.importModuleSpecifier": "relative",
50
- "typescript.preferences.importModuleSpecifier": "relative",
51
- "eslint.experimental.useFlatConfig": true,
52
- "eslint.enable": true,
53
- "eslint.validate": [
54
- "javascript",
55
- "javascriptreact",
56
- "typescript",
57
- "typescriptreact"
58
- ],
59
- "eslint.workingDirectories": [
60
- "./"
61
- ],
62
- "typescript.validate.enable": true,
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
+ }
@@ -1,130 +1,99 @@
1
1
  {
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
- "command": "spruce",
26
- "args": [
27
- "test",
28
- "--inspect",
29
- "5200",
30
- "--pattern",
31
- "${fileBasenameNoExtension}",
32
- "--watchMode",
33
- "standard"
34
- ],
35
- "promptOnClose": false,
36
- "group": {
37
- "kind": "test",
38
- "isDefault": true
39
- },
40
- "presentation": {
41
- "reveal": "always",
42
- "panel": "dedicated"
43
- },
44
- "problemMatcher": []
45
- },
46
- {
47
- "label": "test.reporter",
48
- "command": "spruce",
49
- "args": [
50
- "test",
51
- "--shouldHoldAtStart",
52
- "true",
53
- "--watchMode",
54
- "smart"
55
- ],
56
- "promptOnClose": false,
57
- "group": "test",
58
- "runOptions": {
59
- "runOn": "folderOpen"
60
- },
61
- "presentation": {
62
- "panel": "shared",
63
- "focus": true,
64
- "reveal": "always"
65
- }
66
- },
67
- {
68
- "label": "spruce",
69
- "type": "shell",
70
- "command": "spruce ${input:spruceCommand}",
71
- "problemMatcher": [],
72
- "presentation": {
73
- "reveal": "always",
74
- "focus": true,
75
- "panel": "new",
76
- "clear": false
77
- }
78
- },
79
- {
80
- "label": "shell",
81
- "type": "shell",
82
- "command": "${input:command} ${input:optionsCommand}",
83
- "problemMatcher": [],
84
- "presentation": {
85
- "reveal": "always",
86
- "focus": true,
87
- "panel": "new",
88
- "clear": false
89
- }
90
- },
91
- {
92
- "label": "ndx",
93
- "type": "shell",
94
- "command": "ndx ${input:ndxCommand}",
95
- "problemMatcher": [],
96
- "presentation": {
97
- "reveal": "always",
98
- "focus": true,
99
- "panel": "new",
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
- - [LslEventMarkerOutlet](#lsleventmarkeroutlet)
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
- name: 'Muse S (2nd gen)',
49
- type: 'EEG',
50
- sourceId: 'muse-s-eeg',
51
- channelNames: ['TP9', 'AF7', 'AF8', 'TP10', 'AUX'],
52
- channelFormat: 'float32',
53
- sampleRateHz: 256,
54
- chunkSize: 12,
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
- ### LslEventMarkerOutlet
62
+ ### LslEventMarkerEmitter
61
63
 
62
- LSL is also often used to push event markers that mark different phases of an experiment or session. The `pushMarkers` method pushes an event marker, waits for a specified duration, then pushes the next marker. I recommend that each event marker has a duration of at least 100 ms so that LSL receives the markers in the right order.
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 { LslEventMarkerOutlet } from '@neurodevs/node-lsl'
67
+ import { LslEventMarkerEmitter } from '@neurodevs/node-lsl'
66
68
 
67
- const outlet = await LslEventMarkerOutlet.Create()
69
+ const emitter = await LslEventMarkerEmitter.Create()
68
70
 
69
71
  const markers = [
70
- { name: 'phase-1-begin', durationMs: 1000 },
71
- { name: 'phase-1-end', durationMs: 100 },
72
+ { name: 'phase-1-begin', waitAfterMs: 5000 },
73
+ { name: 'phase-1-end', waitAfterMs: 100 },
72
74
  ]
73
75
 
74
- // Hangs until complete
75
- await outlet.pushMarkers(markers)
76
+ const promise = emitter.emitMany(markers)
76
77
 
77
- // Void promise, does not hang
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 setSpyEventMarkerOutlet(): void;
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 info: FakeStreamInfo;
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 get channelCount(): number;
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;