@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,82 @@
1
+ import { parentPort } from 'node:worker_threads';
2
+ import { LiblslAdapter, handleLslError, LslErrorCode, } from '@neurodevs/ndx-native';
3
+ import LslStreamInfo from '../../LslStreamInfo.js';
4
+ let lsl = LiblslAdapter.getInstance();
5
+ export function setOutletLiblslAdapter(adapter) {
6
+ LiblslAdapter.setInstance(adapter);
7
+ lsl = LiblslAdapter.getInstance();
8
+ }
9
+ let handleLslErrorFn = handleLslError;
10
+ export function setOutletHandleLslError(fn) {
11
+ handleLslErrorFn = fn;
12
+ }
13
+ let info;
14
+ let handle;
15
+ let pushMethod;
16
+ parentPort?.on('message', (msg) => {
17
+ const { type } = msg;
18
+ try {
19
+ switch (type) {
20
+ case 'createOutlet': {
21
+ createOutlet(msg);
22
+ break;
23
+ }
24
+ case 'pushSample': {
25
+ pushSample(msg);
26
+ break;
27
+ }
28
+ case 'destroyOutlet': {
29
+ destroyOutlet();
30
+ break;
31
+ }
32
+ }
33
+ }
34
+ catch (err) {
35
+ parentPort?.postMessage({
36
+ type: 'error',
37
+ error: err instanceof Error ? err.message : String(err),
38
+ });
39
+ }
40
+ });
41
+ export function createOutlet(msg) {
42
+ const { payload } = msg;
43
+ info = LslStreamInfo.Create(payload.infoOptions);
44
+ handle = lsl.createOutlet({
45
+ infoHandle: info.infoHandle,
46
+ chunkSize: payload.chunkSize,
47
+ maxBufferedMs: payload.maxBufferedMs,
48
+ });
49
+ pushMethod = lsl[payload.pushMethod].bind(lsl);
50
+ parentPort?.postMessage({ type: 'ready' });
51
+ }
52
+ export function pushSample(msg) {
53
+ const { payload } = msg;
54
+ const { sample, timestampSec = lsl.localClock() } = payload;
55
+ if (!handle || !pushMethod) {
56
+ throw new Error('Outlet not initialized');
57
+ }
58
+ const errorCode = pushMethod({
59
+ outletHandle: handle,
60
+ sample,
61
+ timestampSec,
62
+ });
63
+ try {
64
+ handleLslErrorFn(errorCode);
65
+ }
66
+ catch {
67
+ parentPort?.postMessage({
68
+ type: 'error',
69
+ error: `Error pushing sample: ${LslErrorCode[errorCode]}`,
70
+ });
71
+ }
72
+ }
73
+ export function destroyOutlet() {
74
+ if (handle) {
75
+ lsl.destroyOutlet({ outletHandle: handle });
76
+ }
77
+ if (info) {
78
+ lsl.destroyStreamInfo({ infoHandle: info.infoHandle });
79
+ }
80
+ parentPort?.close();
81
+ }
82
+ //# sourceMappingURL=LslStreamOutlet.worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LslStreamOutlet.worker.js","sourceRoot":"","sources":["../../../../src/impl/workers/outlet/LslStreamOutlet.worker.ts"],"names":[],"mappings":"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"}
package/build/index.d.ts CHANGED
@@ -1,17 +1,17 @@
1
- export { default as LslEventMarkerOutlet } from './impl/LslEventMarkerOutlet.js';
2
- export * from './impl/LslEventMarkerOutlet.js';
3
- export { default as FakeEventMarkerOutlet } from './testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js';
4
- export * from './testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js';
5
- export { default as MockEventMarkerOutlet } from './testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js';
6
- export * from './testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js';
7
- export { default as SpyEventMarkerOutlet } from './testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js';
8
- export * from './testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js';
9
- export { default as ThrowingEventMarkerOutlet } from './testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js';
10
- export * from './testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js';
11
- export { default as LiblslAdapter } from './impl/LiblslAdapter.js';
12
- export * from './impl/LiblslAdapter.js';
13
- export { default as FakeLiblsl } from './testDoubles/Liblsl/FakeLiblsl.js';
14
- export * from './testDoubles/Liblsl/FakeLiblsl.js';
1
+ export { default as BleDeviceController } from './impl/controllers/BleDeviceController.js';
2
+ export * from './impl/controllers/BleDeviceController.js';
3
+ export { default as FakeBleController } from './testDoubles/BleController/FakeBleController.js';
4
+ export * from './testDoubles/BleController/FakeBleController.js';
5
+ export { default as SpyBleController } from './testDoubles/BleController/SpyBleController.js';
6
+ export * from './testDoubles/BleController/SpyBleController.js';
7
+ export { default as LslEventMarkerEmitter } from './impl/LslEventMarkerEmitter.js';
8
+ export * from './impl/LslEventMarkerEmitter.js';
9
+ export { default as FakeEventMarkerEmitter } from './testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js';
10
+ export * from './testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js';
11
+ export { default as SpyEventMarkerEmitter } from './testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js';
12
+ export * from './testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js';
13
+ export { default as ThrowingEventMarkerEmitter } from './testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js';
14
+ export * from './testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js';
15
15
  export { default as LslStreamInfo } from './impl/LslStreamInfo.js';
16
16
  export * from './impl/LslStreamInfo.js';
17
17
  export { default as SpyStreamInfo } from './testDoubles/StreamInfo/SpyStreamInfo.js';
package/build/index.js CHANGED
@@ -1,19 +1,19 @@
1
- // EventMarkerOutlet
2
- export { default as LslEventMarkerOutlet } from './impl/LslEventMarkerOutlet.js';
3
- export * from './impl/LslEventMarkerOutlet.js';
4
- export { default as FakeEventMarkerOutlet } from './testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js';
5
- export * from './testDoubles/EventMarkerOutlet/FakeEventMarkerOutlet.js';
6
- export { default as MockEventMarkerOutlet } from './testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js';
7
- export * from './testDoubles/EventMarkerOutlet/MockEventMarkerOutlet.js';
8
- export { default as SpyEventMarkerOutlet } from './testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js';
9
- export * from './testDoubles/EventMarkerOutlet/SpyEventMarkerOutlet.js';
10
- export { default as ThrowingEventMarkerOutlet } from './testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js';
11
- export * from './testDoubles/EventMarkerOutlet/ThrowingEventMarkerOutlet.js';
12
- // Liblsl
13
- export { default as LiblslAdapter } from './impl/LiblslAdapter.js';
14
- export * from './impl/LiblslAdapter.js';
15
- export { default as FakeLiblsl } from './testDoubles/Liblsl/FakeLiblsl.js';
16
- export * from './testDoubles/Liblsl/FakeLiblsl.js';
1
+ // DeviceController
2
+ export { default as BleDeviceController } from './impl/controllers/BleDeviceController.js';
3
+ export * from './impl/controllers/BleDeviceController.js';
4
+ export { default as FakeBleController } from './testDoubles/BleController/FakeBleController.js';
5
+ export * from './testDoubles/BleController/FakeBleController.js';
6
+ export { default as SpyBleController } from './testDoubles/BleController/SpyBleController.js';
7
+ export * from './testDoubles/BleController/SpyBleController.js';
8
+ // EventMarkerEmitter
9
+ export { default as LslEventMarkerEmitter } from './impl/LslEventMarkerEmitter.js';
10
+ export * from './impl/LslEventMarkerEmitter.js';
11
+ export { default as FakeEventMarkerEmitter } from './testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js';
12
+ export * from './testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js';
13
+ export { default as SpyEventMarkerEmitter } from './testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js';
14
+ export * from './testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js';
15
+ export { default as ThrowingEventMarkerEmitter } from './testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js';
16
+ export * from './testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js';
17
17
  // StreamInfo
18
18
  export { default as LslStreamInfo } from './impl/LslStreamInfo.js';
19
19
  export * from './impl/LslStreamInfo.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAChF,cAAc,gCAAgC,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0DAA0D,CAAA;AAC3G,cAAc,0DAA0D,CAAA;AAExE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0DAA0D,CAAA;AAC3G,cAAc,0DAA0D,CAAA;AAExE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yDAAyD,CAAA;AACzG,cAAc,yDAAyD,CAAA;AAEvE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,8DAA8D,CAAA;AACnH,cAAc,8DAA8D,CAAA;AAE5E,SAAS;AAET,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC1E,cAAc,oCAAoC,CAAA;AAElD,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,cAAc;AAEd,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,8CAA8C,CAAA;AACzF,cAAc,8CAA8C,CAAA;AAE5D,eAAe;AAEf,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAA;AACtE,cAAc,2BAA2B,CAAA;AAEzC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,cAAc,gDAAgD,CAAA;AAE9D,kBAAkB;AAElB,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC5E,cAAc,8BAA8B,CAAA;AAE5C,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sDAAsD,CAAA;AACrG,cAAc,sDAAsD,CAAA;AAEpE,QAAQ;AAER,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,8CAA8C,CAAA;AAErG,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iDAAiD,CAAA;AAChG,cAAc,iDAAiD,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AAEnB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AAC1F,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,kDAAkD,CAAA;AAC/F,cAAc,kDAAkD,CAAA;AAEhE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iDAAiD,CAAA;AAC7F,cAAc,iDAAiD,CAAA;AAE/D,qBAAqB;AAErB,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAClF,cAAc,iCAAiC,CAAA;AAE/C,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,4DAA4D,CAAA;AAC9G,cAAc,4DAA4D,CAAA;AAE1E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,2DAA2D,CAAA;AAC5G,cAAc,2DAA2D,CAAA;AAEzE,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,gEAAgE,CAAA;AACtH,cAAc,gEAAgE,CAAA;AAE9E,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,cAAc;AAEd,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,8CAA8C,CAAA;AACzF,cAAc,8CAA8C,CAAA;AAE5D,eAAe;AAEf,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAA;AACtE,cAAc,2BAA2B,CAAA;AAEzC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,cAAc,gDAAgD,CAAA;AAE9D,kBAAkB;AAElB,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC5E,cAAc,8BAA8B,CAAA;AAE5C,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sDAAsD,CAAA;AACrG,cAAc,sDAAsD,CAAA;AAEpE,QAAQ;AAER,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,8CAA8C,CAAA;AAErG,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iDAAiD,CAAA;AAChG,cAAc,iDAAiD,CAAA"}
@@ -0,0 +1,40 @@
1
+ import koffi from 'koffi';
2
+ import BleDeviceController from '../impl/controllers/BleDeviceController.js';
3
+ const MUSE_CHARACTERISTIC_UUIDS = {
4
+ CONTROL: '273E0001-4C4D-454D-96BE-F03BAC821358',
5
+ TELEMETRY: '273E000B-4C4D-454D-96BE-F03BAC821358',
6
+ GYROSCOPE: '273E0009-4C4D-454D-96BE-F03BAC821358',
7
+ ACCELEROMETER: '273E000A-4C4D-454D-96BE-F03BAC821358',
8
+ PPG_AMBIENT: '273E000F-4C4D-454D-96BE-F03BAC821358',
9
+ PPG_INFRARED: '273E0010-4C4D-454D-96BE-F03BAC821358',
10
+ PPG_RED: '273E0011-4C4D-454D-96BE-F03BAC821358',
11
+ EEG_TP9: '273E0003-4C4D-454D-96BE-F03BAC821358',
12
+ EEG_AF7: '273E0004-4C4D-454D-96BE-F03BAC821358',
13
+ EEG_AF8: '273E0005-4C4D-454D-96BE-F03BAC821358',
14
+ EEG_TP10: '273E0006-4C4D-454D-96BE-F03BAC821358',
15
+ EEG_AUX: '273E0007-4C4D-454D-96BE-F03BAC821358',
16
+ };
17
+ const CONTROL_UUID = MUSE_CHARACTERISTIC_UUIDS['CONTROL'];
18
+ const charCallbacks = Object.entries(MUSE_CHARACTERISTIC_UUIDS).map(([name, uuid]) => {
19
+ return {
20
+ charUuid: uuid,
21
+ charName: name,
22
+ onData: (data, length, timestampSec) => {
23
+ const bytes = koffi.decode(data, 'uint8', length);
24
+ console.info(`[${timestampSec}] length=${length}`, bytes);
25
+ },
26
+ };
27
+ });
28
+ const muse = await BleDeviceController.Create({
29
+ deviceNamePrefix: 'Muse',
30
+ charCallbacks,
31
+ rssiIntervalMs: 1000,
32
+ });
33
+ await muse.connect();
34
+ for (const cmd of ['h', 'p50', 's', 'd']) {
35
+ await muse.writeCharacteristic(CONTROL_UUID, cmd);
36
+ await new Promise((resolve) => setTimeout(resolve, 100));
37
+ }
38
+ await new Promise((resolve) => setTimeout(resolve, 5 * 1000));
39
+ await muse.disconnect();
40
+ //# sourceMappingURL=discoverMuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discoverMuse.js","sourceRoot":"","sources":["../../src/scripts/discoverMuse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,4CAA4C,CAAA;AAE5E,MAAM,yBAAyB,GAA2B;IACtD,OAAO,EAAE,sCAAsC;IAC/C,SAAS,EAAE,sCAAsC;IACjD,SAAS,EAAE,sCAAsC;IACjD,aAAa,EAAE,sCAAsC;IACrD,WAAW,EAAE,sCAAsC;IACnD,YAAY,EAAE,sCAAsC;IACpD,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,QAAQ,EAAE,sCAAsC;IAChD,OAAO,EAAE,sCAAsC;CAClD,CAAA;AAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAA;AAEzD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACb,OAAO;QACH,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,YAAoB,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAa,CAAA;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,YAAY,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7D,CAAC;KACJ,CAAA;AACL,CAAC,CACJ,CAAA;AAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC;IAC1C,gBAAgB,EAAE,MAAM;IACxB,aAAa;IACb,cAAc,EAAE,IAAI;CACvB,CAAC,CAAA;AAEF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;AAEpB,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACvC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IACjD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;AAE7D,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA"}
@@ -0,0 +1,2 @@
1
+ export type DestroyHandle = () => void;
2
+ export declare function register(destroy: DestroyHandle): (() => void) | undefined;
@@ -0,0 +1,48 @@
1
+ const destroyHandles = new Set();
2
+ let isFinalizing = false;
3
+ export function register(destroy) {
4
+ if (isFinalizing) {
5
+ destroy();
6
+ return;
7
+ }
8
+ destroyHandles.add(destroy);
9
+ const unregister = () => {
10
+ destroyHandles.delete(destroy);
11
+ };
12
+ return unregister;
13
+ }
14
+ function finalizeHandles() {
15
+ if (isFinalizing) {
16
+ return;
17
+ }
18
+ isFinalizing = true;
19
+ for (const destroy of destroyHandles) {
20
+ try {
21
+ destroy();
22
+ }
23
+ catch (err) {
24
+ console.error('Error during finalization:', err);
25
+ }
26
+ }
27
+ destroyHandles.clear();
28
+ }
29
+ process.once('SIGINT', finalizeHandles);
30
+ process.once('SIGTERM', finalizeHandles);
31
+ process.once('uncaughtException', (err) => {
32
+ console.error('Uncaught exception:', err);
33
+ finalizeHandles();
34
+ process.exit(1);
35
+ });
36
+ process.once('unhandledRejection', (reason) => {
37
+ console.error('Unhandled rejection:', reason);
38
+ finalizeHandles();
39
+ process.exit(1);
40
+ });
41
+ process.once('beforeExit', () => {
42
+ if (destroyHandles.size > 0 && !isFinalizing) {
43
+ console.warn('Warning: process is exiting with active handles.\n' +
44
+ 'Did you forget to call destroy()? Finalizing automatically.');
45
+ finalizeHandles();
46
+ }
47
+ });
48
+ //# sourceMappingURL=finalizeHandles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalizeHandles.js","sourceRoot":"","sources":["../../src/scripts/finalizeHandles.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAiB,CAAA;AAE/C,IAAI,YAAY,GAAG,KAAK,CAAA;AAExB,MAAM,UAAU,QAAQ,CAAC,OAAsB;IAC3C,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,CAAA;QACT,OAAM;IACV,CAAC;IAED,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAE3B,MAAM,UAAU,GAAG,GAAG,EAAE;QACpB,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC,CAAA;IAED,OAAO,UAAU,CAAA;AACrB,CAAC;AAED,SAAS,eAAe;IACpB,IAAI,YAAY,EAAE,CAAC;QACf,OAAM;IACV,CAAC;IACD,YAAY,GAAG,IAAI,CAAA;IAEnB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC;YACD,OAAO,EAAE,CAAA;QACb,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAA;QACpD,CAAC;IACL,CAAC;IAED,cAAc,CAAC,KAAK,EAAE,CAAA;AAC1B,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAA;AAEvC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;AAExC,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;IACtC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;IACzC,eAAe,EAAE,CAAA;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACnB,CAAC,CAAC,CAAA;AAEF,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;IAC1C,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAA;IAC7C,eAAe,EAAE,CAAA;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACnB,CAAC,CAAC,CAAA;AAEF,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;IAC5B,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,CACR,oDAAoD;YAChD,6DAA6D,CACpE,CAAA;QACD,eAAe,EAAE,CAAA;IACrB,CAAC;AACL,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ import LslEventMarkerEmitter from '../impl/LslEventMarkerEmitter.js';
2
+ const outlet = await LslEventMarkerEmitter.Create();
3
+ const markers = [
4
+ { name: 'phase-1-begin', waitAfterMs: 100 },
5
+ { name: 'phase-1-end', waitAfterMs: 100 },
6
+ { name: 'never-reached-marker', waitAfterMs: 100 },
7
+ ];
8
+ void outlet.emitMany(markers);
9
+ await new Promise((resolve) => setTimeout(resolve, 250));
10
+ outlet.interrupt();
11
+ //# sourceMappingURL=runLslEventMarkerEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runLslEventMarkerEmitter.js","sourceRoot":"","sources":["../../src/scripts/runLslEventMarkerEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,kCAAkC,CAAA;AAEpE,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,CAAA;AAEnD,MAAM,OAAO,GAAG;IACZ,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,EAAE;IAC3C,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,EAAE;IACzC,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,GAAG,EAAE;CACrD,CAAA;AAED,KAAK,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AAE7B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAExD,MAAM,CAAC,SAAS,EAAE,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import koffi from 'koffi';
2
+ import BleDeviceController from '../impl/controllers/BleDeviceController.js';
3
+ const MUSE_CHARACTERISTIC_UUIDS = {
4
+ CONTROL: '273E0001-4C4D-454D-96BE-F03BAC821358',
5
+ TELEMETRY: '273E000B-4C4D-454D-96BE-F03BAC821358',
6
+ GYROSCOPE: '273E0009-4C4D-454D-96BE-F03BAC821358',
7
+ ACCELEROMETER: '273E000A-4C4D-454D-96BE-F03BAC821358',
8
+ PPG_AMBIENT: '273E000F-4C4D-454D-96BE-F03BAC821358',
9
+ PPG_INFRARED: '273E0010-4C4D-454D-96BE-F03BAC821358',
10
+ PPG_RED: '273E0011-4C4D-454D-96BE-F03BAC821358',
11
+ EEG_TP9: '273E0003-4C4D-454D-96BE-F03BAC821358',
12
+ EEG_AF7: '273E0004-4C4D-454D-96BE-F03BAC821358',
13
+ EEG_AF8: '273E0005-4C4D-454D-96BE-F03BAC821358',
14
+ EEG_TP10: '273E0006-4C4D-454D-96BE-F03BAC821358',
15
+ EEG_AUX: '273E0007-4C4D-454D-96BE-F03BAC821358',
16
+ };
17
+ const CONTROL_UUID = MUSE_CHARACTERISTIC_UUIDS['CONTROL'];
18
+ const charCallbacks = Object.entries(MUSE_CHARACTERISTIC_UUIDS).map(([name, uuid]) => {
19
+ return {
20
+ charUuid: uuid,
21
+ charName: name,
22
+ onData: (data, length, timestampSec) => {
23
+ const bytes = koffi.decode(data, 'uint8', length);
24
+ console.info(`[${timestampSec}] length=${length}`, bytes);
25
+ },
26
+ };
27
+ });
28
+ const muse = await BleDeviceController.Create({
29
+ deviceUuid: 'CA6A61B7-B7A8-AF24-3C9E-04A6A5012554',
30
+ charCallbacks,
31
+ rssiIntervalMs: 1000,
32
+ });
33
+ await muse.connect();
34
+ for (const cmd of ['h', 'p50', 's', 'd']) {
35
+ await muse.writeCharacteristic(CONTROL_UUID, cmd);
36
+ await new Promise((resolve) => setTimeout(resolve, 100));
37
+ }
38
+ await new Promise((resolve) => setTimeout(resolve, 5 * 1000));
39
+ await muse.disconnect();
40
+ //# sourceMappingURL=runMuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runMuse.js","sourceRoot":"","sources":["../../src/scripts/runMuse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,mBAAmB,MAAM,4CAA4C,CAAA;AAE5E,MAAM,yBAAyB,GAA2B;IACtD,OAAO,EAAE,sCAAsC;IAC/C,SAAS,EAAE,sCAAsC;IACjD,SAAS,EAAE,sCAAsC;IACjD,aAAa,EAAE,sCAAsC;IACrD,WAAW,EAAE,sCAAsC;IACnD,YAAY,EAAE,sCAAsC;IACpD,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,OAAO,EAAE,sCAAsC;IAC/C,QAAQ,EAAE,sCAAsC;IAChD,OAAO,EAAE,sCAAsC;CAClD,CAAA;AAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,SAAS,CAAC,CAAA;AAEzD,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAC/D,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;IACb,OAAO;QACH,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,YAAoB,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAa,CAAA;YAC7D,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,YAAY,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;QAC7D,CAAC;KACJ,CAAA;AACL,CAAC,CACJ,CAAA;AAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC;IAC1C,UAAU,EAAE,sCAAsC;IAClD,aAAa;IACb,cAAc,EAAE,IAAI;CACvB,CAAC,CAAA;AAEF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;AAEpB,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACvC,MAAM,IAAI,CAAC,mBAAmB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IACjD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;AAE7D,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA"}
@@ -1,10 +1,11 @@
1
1
  import LslStreamInlet from '../impl/LslStreamInlet.js';
2
2
  import LslStreamOutlet from '../impl/LslStreamOutlet.js';
3
+ const sourceId = 'TestOutletID';
3
4
  console.log('Creating outlet...');
4
5
  const outlet = await LslStreamOutlet.Create({
5
6
  name: 'TestOutlet',
6
7
  type: 'TEST',
7
- sourceId: 'TestOutletID',
8
+ sourceId,
8
9
  sampleRateHz: 100,
9
10
  channelNames: ['Ch1', 'Ch2', 'Ch3'],
10
11
  channelFormat: 'float32',
@@ -13,15 +14,14 @@ const outlet = await LslStreamOutlet.Create({
13
14
  manufacturer: 'test',
14
15
  });
15
16
  console.log('Creating inlet...');
16
- const inletOptions = {
17
- info: outlet.info,
17
+ const inlet = await LslStreamInlet.Create({
18
+ sourceId,
18
19
  chunkSize: 1,
19
- };
20
- const inlet = await LslStreamInlet.Create(inletOptions, (samples, timestamps) => {
20
+ }, (samples, timestamps) => {
21
21
  console.log('Received samples:', samples, 'at timestamps:', timestamps);
22
22
  });
23
23
  console.log('Start pulling...');
24
- inlet.startPulling();
24
+ await inlet.startPulling();
25
25
  console.log('Waiting for 100 ms...');
26
26
  await new Promise((resolve) => setTimeout(resolve, 100));
27
27
  console.log('Pushing samples...');
@@ -37,4 +37,5 @@ for (let i = 0; i < 30; i++) {
37
37
  outlet.pushSample(sample);
38
38
  await new Promise((resolve) => setTimeout(resolve, 100));
39
39
  }
40
+ process.exit(0);
40
41
  //# sourceMappingURL=runOutletToInlet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runOutletToInlet.js","sourceRoot":"","sources":["../../src/scripts/runOutletToInlet.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,2BAA2B,CAAA;AACtD,OAAO,eAAe,MAAM,4BAA4B,CAAA;AAExD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;AACjC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,cAAc;IACxB,YAAY,EAAE,GAAG;IACjB,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IACnC,aAAa,EAAE,SAAS;IACxB,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,MAAM;CACvB,CAAC,CAAA;AAEF,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAEhC,MAAM,YAAY,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,SAAS,EAAE,CAAC;CACf,CAAA;AAED,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CACrC,YAAY,EACZ,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAA;AAC3E,CAAC,CACJ,CAAA;AAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;AAC/B,KAAK,CAAC,YAAY,EAAE,CAAA;AAEpB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;AACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAExD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;AACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC3D,CAAC;AAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;AAEzD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;AACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5D,CAAC"}
1
+ {"version":3,"file":"runOutletToInlet.js","sourceRoot":"","sources":["../../src/scripts/runOutletToInlet.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,MAAM,2BAA2B,CAAA;AACtD,OAAO,eAAe,MAAM,4BAA4B,CAAA;AAExD,MAAM,QAAQ,GAAG,cAAc,CAAA;AAE/B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;AACjC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,MAAM;IACZ,QAAQ;IACR,YAAY,EAAE,GAAG;IACjB,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IACnC,aAAa,EAAE,SAAS;IACxB,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,MAAM;IACb,YAAY,EAAE,MAAM;CACvB,CAAC,CAAA;AAEF,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAEhC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CACrC;IACI,QAAQ;IACR,SAAS,EAAE,CAAC;CACf,EACD,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE;IACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAA;AAC3E,CAAC,CACJ,CAAA;AAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;AAC/B,MAAM,KAAK,CAAC,YAAY,EAAE,CAAA;AAE1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;AACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAExD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;AACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC3D,CAAC;AAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;AAEzD,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;AACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACxB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import LslEventMarkerEmitter from '../impl/LslEventMarkerEmitter.js';
2
+ const emitter = await LslEventMarkerEmitter.Create();
3
+ emitter.destroy();
4
+ //# sourceMappingURL=testDestroyOutlet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testDestroyOutlet.js","sourceRoot":"","sources":["../../src/scripts/testDestroyOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,kCAAkC,CAAA;AAEpE,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,CAAA;AAEpD,OAAO,CAAC,OAAO,EAAE,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { BleController, BleControllerOptions } from '../../impl/controllers/BleDeviceController.js';
2
+ export default class FakeBleController implements BleController {
3
+ static callsToConstructor: (BleControllerOptions | undefined)[];
4
+ static numCallsToConnect: number;
5
+ static callsToWriteCharacteristic: {
6
+ characteristicUuid: string;
7
+ value: string;
8
+ }[];
9
+ static numCallsToDisconnect: number;
10
+ static fakeCharacteristics: Record<string, unknown>;
11
+ static fakeName: string;
12
+ private _uuid;
13
+ private _name;
14
+ constructor(options?: BleControllerOptions);
15
+ connect(): Promise<void>;
16
+ writeCharacteristic(characteristicUuid: string, value: string): Promise<void>;
17
+ disconnect(): Promise<void>;
18
+ get uuid(): string;
19
+ get name(): string;
20
+ static resetTestDouble(): void;
21
+ }
22
+ export interface CallToBleControllerConstructor {
23
+ options: BleControllerOptions;
24
+ }
@@ -0,0 +1,42 @@
1
+ import generateId from '@neurodevs/generate-id';
2
+ export default class FakeBleController {
3
+ static callsToConstructor = [];
4
+ static numCallsToConnect = 0;
5
+ static callsToWriteCharacteristic = [];
6
+ static numCallsToDisconnect = 0;
7
+ static fakeCharacteristics = {};
8
+ static fakeName = `fake-${generateId()}`;
9
+ _uuid;
10
+ _name;
11
+ constructor(options) {
12
+ const { deviceUuid } = options ?? {};
13
+ this._uuid = deviceUuid ?? generateId();
14
+ this._name = FakeBleController.fakeName;
15
+ FakeBleController.callsToConstructor.push(options);
16
+ }
17
+ async connect() {
18
+ FakeBleController.numCallsToConnect++;
19
+ }
20
+ async writeCharacteristic(characteristicUuid, value) {
21
+ FakeBleController.callsToWriteCharacteristic.push({
22
+ characteristicUuid,
23
+ value,
24
+ });
25
+ }
26
+ async disconnect() {
27
+ FakeBleController.numCallsToDisconnect++;
28
+ }
29
+ get uuid() {
30
+ return this._uuid;
31
+ }
32
+ get name() {
33
+ return this._name;
34
+ }
35
+ static resetTestDouble() {
36
+ this.callsToConstructor = [];
37
+ this.numCallsToConnect = 0;
38
+ this.callsToWriteCharacteristic = [];
39
+ this.numCallsToDisconnect = 0;
40
+ }
41
+ }
42
+ //# sourceMappingURL=FakeBleController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeBleController.js","sourceRoot":"","sources":["../../../src/testDoubles/BleController/FakeBleController.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAM/C,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAC3B,MAAM,CAAC,kBAAkB,GAAyC,EAAE,CAAA;IAEpE,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAE5B,MAAM,CAAC,0BAA0B,GAGlC,EAAE,CAAA;IAED,MAAM,CAAC,oBAAoB,GAAG,CAAC,CAAA;IAE/B,MAAM,CAAC,mBAAmB,GAA4B,EAAE,CAAA;IACxD,MAAM,CAAC,QAAQ,GAAG,QAAQ,UAAU,EAAE,EAAE,CAAA;IAEvC,KAAK,CAAQ;IACb,KAAK,CAAQ;IAErB,YAAmB,OAA8B;QAC7C,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;QAEpC,IAAI,CAAC,KAAK,GAAG,UAAU,IAAI,UAAU,EAAE,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAA;QAEvC,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtD,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,iBAAiB,CAAC,iBAAiB,EAAE,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC5B,kBAA0B,EAC1B,KAAa;QAEb,iBAAiB,CAAC,0BAA0B,CAAC,IAAI,CAAC;YAC9C,kBAAkB;YAClB,KAAK;SACR,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,UAAU;QACnB,iBAAiB,CAAC,oBAAoB,EAAE,CAAA;IAC5C,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,KAAK,CAAA;IACrB,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAA;QAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAA;QAC1B,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAA;QACpC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAA;IACjC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import BleDeviceController, { BleControllerOptions } from '../../impl/controllers/BleDeviceController.js';
2
+ export default class SpyBleController extends BleDeviceController {
3
+ infoLogs: string[];
4
+ warnLogs: string[];
5
+ errorLogs: string[];
6
+ constructor(options: BleControllerOptions);
7
+ getCharacteristicCallbacks(): import("../../impl/controllers/BleDeviceController.js").CharacteristicCallbacks;
8
+ getRssiIntervalMs(): number | undefined;
9
+ getConnected(): boolean;
10
+ setLogInfoSpy(): void;
11
+ setLogWarnSpy(): void;
12
+ setLogErrorSpy(): void;
13
+ resetTestDouble(): void;
14
+ }
@@ -0,0 +1,48 @@
1
+ import BleDeviceController from '../../impl/controllers/BleDeviceController.js';
2
+ export default class SpyBleController extends BleDeviceController {
3
+ infoLogs = [];
4
+ warnLogs = [];
5
+ errorLogs = [];
6
+ constructor(options) {
7
+ super(options);
8
+ }
9
+ getCharacteristicCallbacks() {
10
+ return this.charCallbacks;
11
+ }
12
+ getRssiIntervalMs() {
13
+ return this.rssiIntervalMs;
14
+ }
15
+ getConnected() {
16
+ return this.connected;
17
+ }
18
+ setLogInfoSpy() {
19
+ this.infoLogs = [];
20
+ this.log.info = (...args) => {
21
+ const message = args.join(' ');
22
+ this.infoLogs.push(message);
23
+ return message;
24
+ };
25
+ }
26
+ setLogWarnSpy() {
27
+ this.warnLogs = [];
28
+ this.log.warn = (...args) => {
29
+ const message = args.join(' ');
30
+ this.warnLogs.push(message);
31
+ return message;
32
+ };
33
+ }
34
+ setLogErrorSpy() {
35
+ this.errorLogs = [];
36
+ this.log.error = (...args) => {
37
+ const message = args.join(' ');
38
+ this.errorLogs.push(message);
39
+ return message;
40
+ };
41
+ }
42
+ resetTestDouble() {
43
+ this.infoLogs = [];
44
+ this.warnLogs = [];
45
+ this.errorLogs = [];
46
+ }
47
+ }
48
+ //# sourceMappingURL=SpyBleController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpyBleController.js","sourceRoot":"","sources":["../../../src/testDoubles/BleController/SpyBleController.ts"],"names":[],"mappings":"AAAA,OAAO,mBAEN,MAAM,+CAA+C,CAAA;AAEtD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,mBAAmB;IACtD,QAAQ,GAAa,EAAE,CAAA;IACvB,QAAQ,GAAa,EAAE,CAAA;IACvB,SAAS,GAAa,EAAE,CAAA;IAE/B,YAAmB,OAA6B;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IAEM,0BAA0B;QAC7B,OAAO,IAAI,CAAC,aAAa,CAAA;IAC7B,CAAC;IAEM,iBAAiB;QACpB,OAAO,IAAI,CAAC,cAAc,CAAA;IAC9B,CAAC;IAEM,YAAY;QACf,OAAO,IAAI,CAAC,SAAS,CAAA;IACzB,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAElB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC3B,OAAO,OAAO,CAAA;QAClB,CAAC,CAAA;IACL,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAElB,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC3B,OAAO,OAAO,CAAA;QAClB,CAAC,CAAA;IACL,CAAC;IAEM,cAAc;QACjB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QAEnB,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,IAAe,EAAE,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC5B,OAAO,OAAO,CAAA;QAClB,CAAC,CAAA;IACL,CAAC;IAEM,eAAe;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;IACvB,CAAC;CACJ"}
@@ -0,0 +1,17 @@
1
+ import { EventMarkerEmitter, EventMarkerOptions, TimedEventMarker } from '../../impl/LslEventMarkerEmitter.js';
2
+ export default class FakeEventMarkerEmitter implements EventMarkerEmitter {
3
+ static numCallsToConstructor: number;
4
+ static callsToEmit: {
5
+ markerName: string;
6
+ options?: EventMarkerOptions;
7
+ }[];
8
+ static callsToEmitMany: TimedEventMarker[][];
9
+ static numCallsToInterrupt: number;
10
+ static numCallsToDestroy: number;
11
+ constructor();
12
+ emit(markerName: string, options?: EventMarkerOptions): Promise<void>;
13
+ emitMany(markers: TimedEventMarker[]): Promise<void>;
14
+ interrupt(): void;
15
+ destroy(): void;
16
+ static resetTestDouble(): void;
17
+ }
@@ -0,0 +1,30 @@
1
+ export default class FakeEventMarkerEmitter {
2
+ static numCallsToConstructor = 0;
3
+ static callsToEmit = [];
4
+ static callsToEmitMany = [];
5
+ static numCallsToInterrupt = 0;
6
+ static numCallsToDestroy = 0;
7
+ constructor() {
8
+ FakeEventMarkerEmitter.numCallsToConstructor++;
9
+ }
10
+ async emit(markerName, options) {
11
+ FakeEventMarkerEmitter.callsToEmit.push({ markerName, options });
12
+ }
13
+ async emitMany(markers) {
14
+ FakeEventMarkerEmitter.callsToEmitMany.push(markers);
15
+ }
16
+ interrupt() {
17
+ FakeEventMarkerEmitter.numCallsToInterrupt++;
18
+ }
19
+ destroy() {
20
+ FakeEventMarkerEmitter.numCallsToDestroy++;
21
+ }
22
+ static resetTestDouble() {
23
+ this.numCallsToConstructor = 0;
24
+ this.callsToEmit = [];
25
+ this.callsToEmitMany = [];
26
+ this.numCallsToInterrupt = 0;
27
+ this.numCallsToDestroy = 0;
28
+ }
29
+ }
30
+ //# sourceMappingURL=FakeEventMarkerEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeEventMarkerEmitter.js","sourceRoot":"","sources":["../../../src/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,OAAO,OAAO,sBAAsB;IAChC,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAA;IAEhC,MAAM,CAAC,WAAW,GAGnB,EAAE,CAAA;IAED,MAAM,CAAC,eAAe,GAAyB,EAAE,CAAA;IACjD,MAAM,CAAC,mBAAmB,GAAG,CAAC,CAAA;IAC9B,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAEnC;QACI,sBAAsB,CAAC,qBAAqB,EAAE,CAAA;IAClD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,UAAkB,EAAE,OAA4B;QAC9D,sBAAsB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAA;IACpE,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,OAA2B;QAC7C,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxD,CAAC;IAEM,SAAS;QACZ,sBAAsB,CAAC,mBAAmB,EAAE,CAAA;IAChD,CAAC;IAEM,OAAO;QACV,sBAAsB,CAAC,iBAAiB,EAAE,CAAA;IAC9C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAA;QAC9B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;QACrB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAC9B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import LslEventMarkerEmitter from '../../impl/LslEventMarkerEmitter.js';
2
+ import { StreamOutlet } from '../../impl/LslStreamOutlet.js';
3
+ export default class SpyEventMarkerEmitter extends LslEventMarkerEmitter {
4
+ static shouldCallWaitOnSuper: boolean;
5
+ totalwaitAfterMs: number;
6
+ constructor(outlet: StreamOutlet);
7
+ wait(waitAfterMs: number): Promise<unknown>;
8
+ getStreamOutlet(): StreamOutlet;
9
+ resetTestDouble(): void;
10
+ }