@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
@@ -1,688 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- import { randomInt } from 'crypto';
8
- import { test, assert } from '@neurodevs/node-tdd';
9
- import { createPointer, DataType, unwrapPointer, } from 'ffi-rs';
10
- import LiblslAdapter from '../../impl/LiblslAdapter.js';
11
- import FakeLiblsl from '../../testDoubles/Liblsl/FakeLiblsl.js';
12
- import AbstractPackageTest from '../AbstractPackageTest.js';
13
- export default class LiblslAdapterTest extends AbstractPackageTest {
14
- static instance;
15
- static libraryPath;
16
- static libraryOptions;
17
- static fakeBindings;
18
- static fakeStreamInfo;
19
- static fakeOutlet;
20
- static fakeInlet = {};
21
- static fakeDesc;
22
- static fakeChildNamedChannels;
23
- static createStreamInfoParams;
24
- static destroyStreamInfoParams;
25
- static appendChildParams = [];
26
- static createOutletParams;
27
- static destroyOutletParams;
28
- static createInletParams;
29
- static flushInletParams;
30
- static destroyInletParams;
31
- static localClockParams;
32
- static pushSampleFloatTimestampParams;
33
- static pushSampleStringTimestampParams;
34
- static appendChildValueParams;
35
- static shouldThrowWhenCreatingBindings;
36
- static getDescriptionParams;
37
- static fakeChildNamedChannel;
38
- static appendChildHitCount;
39
- static ffiRsOpenOptions;
40
- static ffiRsDefineOptions;
41
- static ffiRsLoadOptions;
42
- static async beforeEach() {
43
- await super.beforeEach();
44
- delete this.libraryPath;
45
- delete this.libraryOptions;
46
- delete this.createStreamInfoParams;
47
- delete this.createOutletParams;
48
- delete this.destroyOutletParams;
49
- delete this.createInletParams;
50
- delete this.destroyInletParams;
51
- delete this.pushSampleFloatTimestampParams;
52
- delete this.getDescriptionParams;
53
- this.appendChildParams = [];
54
- this.appendChildValueParams = [];
55
- process.env.LIBLSL_PATH = this.generateId();
56
- this.fakeStreamInfo = {};
57
- this.fakeDesc = {};
58
- this.fakeOutlet = {};
59
- this.fakeChildNamedChannels = {};
60
- this.fakeChildNamedChannel = {};
61
- this.fakeBindings = this.FakeBindings();
62
- this.shouldThrowWhenCreatingBindings = false;
63
- this.appendChildHitCount = 0;
64
- delete this.ffiRsOpenOptions;
65
- LiblslAdapter.open = (options) => {
66
- this.ffiRsOpenOptions = options;
67
- };
68
- LiblslAdapter.define = (options) => {
69
- this.ffiRsDefineOptions = options;
70
- if (this.shouldThrowWhenCreatingBindings) {
71
- throw new Error('Failed to create bindings!');
72
- }
73
- return this.fakeBindings;
74
- };
75
- LiblslAdapter.load = (options) => {
76
- this.ffiRsLoadOptions = options;
77
- return this.fakeNumResolveResults;
78
- };
79
- LiblslAdapter.resetInstance();
80
- this.instance = LiblslAdapter.getInstance();
81
- }
82
- static async createsInstance() {
83
- assert.isTruthy(this.instance, 'Failed to create instance!');
84
- }
85
- static async throwsWhenBindingsFailToLoad() {
86
- this.shouldThrowWhenCreatingBindings = true;
87
- LiblslAdapter.resetInstance();
88
- const err = assert.doesThrow(() => LiblslAdapter.getInstance());
89
- assert.isTrue(err.message.includes(this.generateFailedMessage()), 'Did not receive the expected error!');
90
- }
91
- static async callsOpenOnFfiRs() {
92
- assert.isEqualDeep(this.ffiRsOpenOptions, {
93
- library: 'lsl',
94
- path: process.env.LIBLSL_PATH,
95
- });
96
- }
97
- static async worksAsASingleton() {
98
- const liblsl = LiblslAdapter.getInstance();
99
- //@ts-ignore
100
- assert.isInstanceOf(liblsl, LiblslAdapter);
101
- }
102
- static async singletonIsTheSame() {
103
- assert.isEqual(LiblslAdapter.getInstance(), LiblslAdapter.getInstance());
104
- }
105
- static canSetInstance() {
106
- const fake = new FakeLiblsl();
107
- LiblslAdapter.setInstance(fake);
108
- assert.isEqual(LiblslAdapter.getInstance(), fake);
109
- }
110
- static async createsExpectedBindingsWithFfiRs() {
111
- assert.isEqualDeep(this.ffiRsDefineOptions, {
112
- lsl_create_streaminfo: {
113
- library: 'lsl',
114
- retType: DataType.External,
115
- paramsType: [
116
- DataType.String,
117
- DataType.String,
118
- DataType.I32,
119
- DataType.Double,
120
- DataType.I32,
121
- DataType.String,
122
- ],
123
- },
124
- lsl_destroy_streaminfo: {
125
- library: 'lsl',
126
- retType: DataType.Void,
127
- paramsType: [DataType.External],
128
- },
129
- lsl_create_outlet: {
130
- library: 'lsl',
131
- retType: DataType.External,
132
- paramsType: [DataType.External, DataType.I32, DataType.I32],
133
- },
134
- lsl_push_sample_ft: {
135
- library: 'lsl',
136
- retType: DataType.I32,
137
- paramsType: [
138
- DataType.External,
139
- DataType.FloatArray,
140
- DataType.Double,
141
- ],
142
- },
143
- lsl_push_sample_strt: {
144
- library: 'lsl',
145
- retType: DataType.I32,
146
- paramsType: [
147
- DataType.External,
148
- DataType.StringArray,
149
- DataType.Double,
150
- ],
151
- },
152
- lsl_destroy_outlet: {
153
- library: 'lsl',
154
- retType: DataType.Void,
155
- paramsType: [DataType.External],
156
- },
157
- lsl_create_inlet: {
158
- library: 'lsl',
159
- retType: DataType.External,
160
- paramsType: [
161
- DataType.External,
162
- DataType.I32,
163
- DataType.I32,
164
- DataType.I32,
165
- ],
166
- },
167
- lsl_flush_inlet: {
168
- library: 'lsl',
169
- retType: DataType.I32,
170
- paramsType: [DataType.External],
171
- },
172
- lsl_destroy_inlet: {
173
- library: 'lsl',
174
- retType: DataType.Void,
175
- paramsType: [DataType.External],
176
- },
177
- lsl_get_desc: {
178
- library: 'lsl',
179
- retType: DataType.External,
180
- paramsType: [DataType.External],
181
- },
182
- lsl_append_child: {
183
- library: 'lsl',
184
- retType: DataType.External,
185
- paramsType: [DataType.External, DataType.String],
186
- },
187
- lsl_append_child_value: {
188
- library: 'lsl',
189
- retType: DataType.External,
190
- paramsType: [
191
- DataType.External,
192
- DataType.String,
193
- DataType.String,
194
- ],
195
- },
196
- lsl_local_clock: {
197
- library: 'lsl',
198
- retType: DataType.Double,
199
- paramsType: [],
200
- },
201
- });
202
- }
203
- static async createsStreamInfoWithRequiredParams() {
204
- const options = this.generateRandomCreateStreamInfoOptions();
205
- const actual = this.instance.createStreamInfo(options);
206
- assert.isEqual(actual, this.fakeStreamInfo);
207
- assert.isEqualDeep(this.createStreamInfoParams, Object.values(options));
208
- }
209
- static async destroysStreamInfoWithBoundInfo() {
210
- const info = this.createRandomStreamInfo();
211
- this.instance.destroyStreamInfo({ info });
212
- assert.isEqualDeep(this.destroyStreamInfoParams, [info], 'Did not call destroyStreamInfo with expected params!');
213
- }
214
- static async resolvesStreamInfoByProp() {
215
- await this.resolveByProp();
216
- assert.isEqualDeep(this.ffiRsLoadOptions, {
217
- library: 'lsl',
218
- funcName: 'lsl_resolve_byprop',
219
- retType: DataType.I32,
220
- paramsType: [
221
- DataType.External,
222
- DataType.I32,
223
- DataType.String,
224
- DataType.String,
225
- DataType.I32,
226
- DataType.Double,
227
- ],
228
- paramsValue: [
229
- this.resultsBufferPtr,
230
- this.maxResults,
231
- this.prop,
232
- this.value,
233
- this.minResults,
234
- this.timeoutMs / 1000,
235
- ],
236
- runInNewThread: true,
237
- }, 'Did not call resolveByProp with expected params!');
238
- }
239
- static async resolveByPropAcceptsOptionalArgs() {
240
- const minResults = randomInt(0, 10);
241
- const timeoutMs = Math.random() * 1000;
242
- await this.resolveByProp({
243
- minResults,
244
- timeoutMs,
245
- });
246
- assert.isEqualDeep({
247
- minResults: this.ffiRsLoadOptions?.['paramsValue']?.[4],
248
- timeoutMs: this.ffiRsLoadOptions?.['paramsValue']?.[5],
249
- }, { minResults, timeoutMs: timeoutMs / 1000 }, 'Did not call resolveByProp with expected params!');
250
- }
251
- static async returnsHandlesForResolvedStreamInfos() {
252
- LiblslAdapter.alloc = (size) => {
253
- const buffer = Buffer.alloc(size);
254
- for (let i = 0; i < this.fakeNumResolveResults; i++) {
255
- const offset = i * this.bytesPerPointer;
256
- buffer.writeBigUInt64LE(BigInt(i + 1), offset);
257
- }
258
- return buffer;
259
- };
260
- const expectedHandles = [];
261
- for (let i = 0; i < this.fakeNumResolveResults; i++) {
262
- expectedHandles.push(BigInt(i + 1));
263
- }
264
- const actualHandles = await this.resolveByProp();
265
- const actual = actualHandles.map((h) => h.toString());
266
- const expected = expectedHandles.map((h) => h.toString());
267
- assert.isEqualDeep(actual, expected, 'Did not receive expected resolved stream info handles!');
268
- }
269
- static async createsOutletWithRequiredParams() {
270
- const { options, outlet } = this.createRandomOutlet();
271
- const expected = {
272
- ...options,
273
- maxBufferedMs: options.maxBufferedMs / 1000,
274
- };
275
- assert.isEqualDeep(this.createOutletParams, Object.values(expected));
276
- assert.isEqual(outlet, this.fakeOutlet);
277
- }
278
- static async pushesFloatSample() {
279
- const expected = [1.0, 2.0, 3.0];
280
- const timestamp = randomInt(100);
281
- const options = {
282
- outlet: this.fakeOutlet,
283
- sample: expected,
284
- timestamp,
285
- };
286
- this.instance.pushSampleFloatTimestamp(options);
287
- assert.isEqualDeep(this.pushSampleFloatTimestampParams, [
288
- this.fakeOutlet,
289
- expected,
290
- timestamp,
291
- ]);
292
- }
293
- static async pushesStringSample() {
294
- const expected = [this.generateId()];
295
- const timestamp = randomInt(100);
296
- const options = {
297
- outlet: this.fakeOutlet,
298
- sample: expected,
299
- timestamp,
300
- };
301
- this.instance.pushSampleStringTimestamp(options);
302
- assert.isEqual(this.pushSampleStringTimestampParams?.[0], this.fakeOutlet);
303
- assert.isEqualDeep(this.pushSampleStringTimestampParams?.[1], expected);
304
- assert.isEqual(this.pushSampleStringTimestampParams?.[2], timestamp);
305
- }
306
- static async addingSingleChannelGetsDescription() {
307
- const info = this.createRandomStreamInfo();
308
- const channel = this.generateRandomChannelValues();
309
- this.instance.appendChannelsToStreamInfo({
310
- info,
311
- channels: [channel],
312
- });
313
- assert.isEqualDeep(this.getDescriptionParams?.[0], [info]);
314
- assert.isEqual(this.appendChildParams?.[0][0], this.fakeDesc);
315
- assert.isEqual(this.appendChildParams?.[0][1], 'channels');
316
- assert.isEqual(this.appendChildParams?.[1][0], this.fakeChildNamedChannels);
317
- assert.isEqual(this.appendChildParams?.[1][1], 'channel');
318
- assert.isLength(this.appendChildValueParams, 3);
319
- for (let i = 0; i < 3; i++) {
320
- const param = this.appendChildValueParams[i];
321
- assert.isEqual(param[0], this.fakeChildNamedChannel);
322
- }
323
- assert.isEqual(this.appendChildValueParams[0][1], 'label');
324
- assert.isEqual(this.appendChildValueParams[1][1], 'unit');
325
- assert.isEqual(this.appendChildValueParams[2][1], 'type');
326
- assert.isEqual(this.appendChildValueParams[0][2], channel.label);
327
- assert.isEqual(this.appendChildValueParams[1][2], channel.units);
328
- assert.isEqual(this.appendChildValueParams[2][2], channel.type);
329
- }
330
- static async addingMultpleChannelsAddsChildrenToChannelsChild() {
331
- const info = this.createRandomStreamInfo();
332
- const channel1 = this.generateRandomChannelValues();
333
- const channel2 = this.generateRandomChannelValues();
334
- this.instance.appendChannelsToStreamInfo({
335
- info,
336
- channels: [channel1, channel2],
337
- });
338
- assert.isEqual(this.appendChildParams?.[2][0], this.fakeChildNamedChannels);
339
- assert.isEqual(this.appendChildParams?.[2][1], 'channel');
340
- assert.isEqual(this.appendChildValueParams[3][2], channel2.label);
341
- assert.isEqual(this.appendChildValueParams[4][2], channel2.units);
342
- assert.isEqual(this.appendChildValueParams[5][2], channel2.type);
343
- }
344
- static async canDestroyOutlet() {
345
- const outlet = this.createRandomOutlet();
346
- const options = { outlet };
347
- this.instance.destroyOutlet(options);
348
- assert.isEqualDeep(this.destroyOutletParams, Object.values(options));
349
- }
350
- static async callingLocalClockTwiceReturnsDifferentTimestamps() {
351
- const t1 = this.instance.localClock();
352
- await this.wait(10);
353
- const t2 = this.instance.localClock();
354
- assert.isNotEqual(t1, t2);
355
- }
356
- static async localClockBindingReceivesEmptyArray() {
357
- delete this.localClockParams;
358
- this.instance.localClock();
359
- assert.isEqualDeep(this.localClockParams, []);
360
- }
361
- static async defaultsToMacOsPath() {
362
- delete process.env.LIBLSL_PATH;
363
- LiblslAdapter.resetInstance();
364
- this.instance = LiblslAdapter.getInstance();
365
- assert.isEqual(this.ffiRsOpenOptions?.path, '/opt/homebrew/Cellar/lsl/1.16.2/lib/liblsl.1.16.2.dylib');
366
- }
367
- static async createInletWithRequiredParams() {
368
- const { options, inlet } = this.createRandomInlet();
369
- const { maxBufferedMs } = options;
370
- const expected = {
371
- ...options,
372
- maxBufferedMs: maxBufferedMs / 1000,
373
- };
374
- const maxChunkSize = 0;
375
- const shouldRecover = 1;
376
- assert.isEqualDeep(this.createInletParams, [...Object.values(expected), maxChunkSize, shouldRecover], 'Did not call createInlet with expected params!');
377
- assert.isEqual(inlet, this.fakeInlet, 'Did not receive expected inlet!');
378
- }
379
- static async pullSampleCallsBinding() {
380
- const { inlet } = this.createRandomInlet();
381
- const dataBuffer = Buffer.alloc(4 * this.channelCount);
382
- const dataBufferElements = this.channelCount;
383
- const timeout = 0.0;
384
- const dataBufferPtr = unwrapPointer(createPointer({
385
- paramsType: [DataType.U8Array],
386
- paramsValue: [dataBuffer],
387
- }))[0];
388
- const errcodePtr = unwrapPointer(createPointer({
389
- paramsType: [DataType.U8Array],
390
- paramsValue: [new Int32Array(1)],
391
- }))[0];
392
- this.instance.pullSample({
393
- inlet,
394
- dataBufferPtr,
395
- dataBufferElements,
396
- timeout,
397
- errcodePtr,
398
- });
399
- assert.isEqualDeep(this.ffiRsLoadOptions, {
400
- library: 'lsl',
401
- funcName: 'lsl_pull_sample_f',
402
- retType: DataType.Double,
403
- paramsType: [
404
- DataType.External,
405
- DataType.External,
406
- DataType.I32,
407
- DataType.Double,
408
- DataType.External,
409
- ],
410
- paramsValue: [
411
- inlet,
412
- dataBufferPtr,
413
- dataBufferElements,
414
- timeout,
415
- errcodePtr,
416
- ],
417
- }, 'Did not call pullSample with expected options!');
418
- }
419
- static async pullChunkCallsBinding() {
420
- const { inlet } = this.createRandomInlet();
421
- const dataBuffer = Buffer.alloc(4 * this.chunkSize * this.channelCount);
422
- const timestampBuffer = Buffer.alloc(8 * this.chunkSize);
423
- const dataBufferElements = this.chunkSize * this.channelCount;
424
- const timestampBufferElements = this.chunkSize;
425
- const timeout = 0.0;
426
- const dataBufferPtr = unwrapPointer(createPointer({
427
- paramsType: [DataType.U8Array],
428
- paramsValue: [dataBuffer],
429
- }))[0];
430
- const timestampBufferPtr = unwrapPointer(createPointer({
431
- paramsType: [DataType.U8Array],
432
- paramsValue: [timestampBuffer],
433
- }))[0];
434
- const errcodePtr = unwrapPointer(createPointer({
435
- paramsType: [DataType.U8Array],
436
- paramsValue: [new Int32Array(1)],
437
- }))[0];
438
- this.instance.pullChunk({
439
- inlet,
440
- dataBufferPtr,
441
- timestampBufferPtr,
442
- dataBufferElements,
443
- timestampBufferElements,
444
- timeout,
445
- errcodePtr,
446
- });
447
- assert.isEqualDeep(this.ffiRsLoadOptions, {
448
- library: 'lsl',
449
- funcName: 'lsl_pull_chunk_f',
450
- retType: DataType.Double,
451
- paramsType: [
452
- DataType.External,
453
- DataType.External,
454
- DataType.External,
455
- DataType.I32,
456
- DataType.I32,
457
- DataType.Double,
458
- DataType.External,
459
- ],
460
- paramsValue: [
461
- inlet,
462
- dataBufferPtr,
463
- timestampBufferPtr,
464
- dataBufferElements,
465
- timestampBufferElements,
466
- timeout,
467
- errcodePtr,
468
- ],
469
- }, 'Did not call pullChunk with expected options!');
470
- }
471
- static async flushInletCallsBinding() {
472
- const { inlet } = this.createRandomInlet();
473
- this.instance.flushInlet({ inlet });
474
- assert.isEqualDeep(this.flushInletParams, [inlet], 'Should have called flushInlet with expected params!');
475
- }
476
- static async destroyInletCallsBinding() {
477
- const { inlet } = this.createRandomInlet();
478
- this.instance.destroyInlet({ inlet });
479
- assert.isEqualDeep(this.destroyInletParams, [inlet], 'Should have called destroyInlet with expected params!');
480
- }
481
- static createRandomStreamInfo() {
482
- return this.instance.createStreamInfo(this.generateRandomCreateStreamInfoOptions());
483
- }
484
- static async resolveByProp(options) {
485
- return this.instance.resolveByProp({
486
- prop: this.prop,
487
- value: this.value,
488
- minResults: this.minResults,
489
- timeoutMs: this.timeoutMs,
490
- ...options,
491
- });
492
- }
493
- static createRandomOutlet() {
494
- const options = this.createRandomOutletOptions();
495
- const outlet = this.instance.createOutlet(options);
496
- return { options, outlet };
497
- }
498
- static createRandomOutletOptions() {
499
- const info = this.createRandomStreamInfo();
500
- const options = {
501
- info,
502
- chunkSize: randomInt(10),
503
- maxBufferedMs: randomInt(10),
504
- };
505
- return options;
506
- }
507
- static createRandomInlet() {
508
- const options = this.createRandomInletOptions();
509
- const inlet = this.instance.createInlet(options);
510
- return { options, inlet };
511
- }
512
- static createRandomInletOptions() {
513
- const info = this.createRandomStreamInfo();
514
- const options = {
515
- info,
516
- maxBufferedMs: randomInt(10),
517
- };
518
- return options;
519
- }
520
- static generateRandomChannelValues() {
521
- return {
522
- label: this.generateId(),
523
- type: this.generateId(),
524
- units: this.generateId(),
525
- };
526
- }
527
- static generateRandomCreateStreamInfoOptions() {
528
- return {
529
- name: this.generateId(),
530
- type: this.generateId(),
531
- channelCount: randomInt(1, 10),
532
- sampleRateHz: randomInt(100),
533
- channelFormat: randomInt(7),
534
- sourceId: this.generateId(),
535
- };
536
- }
537
- // resolveByProp
538
- static maxResults = 1024;
539
- static bytesPerPointer = 8;
540
- static minResults = 1;
541
- static timeoutMs = 1000;
542
- static prop = this.generateId();
543
- static value = this.generateId();
544
- static fakeNumResolveResults = 2;
545
- static resultsBuffer = Buffer.alloc(this.maxResults * this.bytesPerPointer);
546
- static resultsBufferPtr = unwrapPointer(createPointer({
547
- paramsType: [DataType.U8Array],
548
- paramsValue: [this.resultsBuffer],
549
- }))[0];
550
- static generateFailedMessage() {
551
- return `Loading the liblsl dylib failed! I tried to load it from ${process.env.LIBLSL_PATH}.`;
552
- }
553
- static FakeBindings() {
554
- return {
555
- lsl_create_streaminfo: (params) => {
556
- this.createStreamInfoParams = params;
557
- return this.fakeStreamInfo;
558
- },
559
- lsl_destroy_streaminfo: (params) => {
560
- this.destroyStreamInfoParams = params;
561
- },
562
- lsl_create_outlet: (params) => {
563
- this.createOutletParams = params;
564
- return this.fakeOutlet;
565
- },
566
- lsl_push_sample_ft: (params) => {
567
- this.pushSampleFloatTimestampParams = params;
568
- return 0;
569
- },
570
- lsl_push_sample_strt: (params) => {
571
- this.pushSampleStringTimestampParams = params;
572
- return 0;
573
- },
574
- lsl_destroy_outlet: (params) => {
575
- this.destroyOutletParams = params;
576
- },
577
- lsl_create_inlet: (params) => {
578
- this.createInletParams = params;
579
- return this.fakeInlet;
580
- },
581
- lsl_flush_inlet: (params) => {
582
- this.flushInletParams = params;
583
- return 0;
584
- },
585
- lsl_destroy_inlet: (params) => {
586
- this.destroyInletParams = params;
587
- },
588
- lsl_local_clock: (params) => {
589
- this.localClockParams = params;
590
- return new Date().getTime();
591
- },
592
- lsl_get_desc: (info) => {
593
- this.getDescriptionParams = [info];
594
- return this.fakeDesc;
595
- },
596
- lsl_append_child: (params) => {
597
- this.appendChildParams.push(params);
598
- if (this.appendChildHitCount === 0) {
599
- this.appendChildHitCount++;
600
- return this.fakeChildNamedChannels;
601
- }
602
- return this.fakeChildNamedChannel;
603
- },
604
- lsl_append_child_value: (params) => {
605
- this.appendChildValueParams.push(params);
606
- },
607
- };
608
- }
609
- }
610
- __decorate([
611
- test()
612
- ], LiblslAdapterTest, "createsInstance", null);
613
- __decorate([
614
- test()
615
- ], LiblslAdapterTest, "throwsWhenBindingsFailToLoad", null);
616
- __decorate([
617
- test()
618
- ], LiblslAdapterTest, "callsOpenOnFfiRs", null);
619
- __decorate([
620
- test()
621
- ], LiblslAdapterTest, "worksAsASingleton", null);
622
- __decorate([
623
- test()
624
- ], LiblslAdapterTest, "singletonIsTheSame", null);
625
- __decorate([
626
- test()
627
- ], LiblslAdapterTest, "canSetInstance", null);
628
- __decorate([
629
- test()
630
- ], LiblslAdapterTest, "createsExpectedBindingsWithFfiRs", null);
631
- __decorate([
632
- test()
633
- ], LiblslAdapterTest, "createsStreamInfoWithRequiredParams", null);
634
- __decorate([
635
- test()
636
- ], LiblslAdapterTest, "destroysStreamInfoWithBoundInfo", null);
637
- __decorate([
638
- test()
639
- ], LiblslAdapterTest, "resolvesStreamInfoByProp", null);
640
- __decorate([
641
- test()
642
- ], LiblslAdapterTest, "resolveByPropAcceptsOptionalArgs", null);
643
- __decorate([
644
- test()
645
- ], LiblslAdapterTest, "returnsHandlesForResolvedStreamInfos", null);
646
- __decorate([
647
- test()
648
- ], LiblslAdapterTest, "createsOutletWithRequiredParams", null);
649
- __decorate([
650
- test()
651
- ], LiblslAdapterTest, "pushesFloatSample", null);
652
- __decorate([
653
- test()
654
- ], LiblslAdapterTest, "pushesStringSample", null);
655
- __decorate([
656
- test()
657
- ], LiblslAdapterTest, "addingSingleChannelGetsDescription", null);
658
- __decorate([
659
- test()
660
- ], LiblslAdapterTest, "addingMultpleChannelsAddsChildrenToChannelsChild", null);
661
- __decorate([
662
- test()
663
- ], LiblslAdapterTest, "canDestroyOutlet", null);
664
- __decorate([
665
- test()
666
- ], LiblslAdapterTest, "callingLocalClockTwiceReturnsDifferentTimestamps", null);
667
- __decorate([
668
- test()
669
- ], LiblslAdapterTest, "localClockBindingReceivesEmptyArray", null);
670
- __decorate([
671
- test()
672
- ], LiblslAdapterTest, "defaultsToMacOsPath", null);
673
- __decorate([
674
- test()
675
- ], LiblslAdapterTest, "createInletWithRequiredParams", null);
676
- __decorate([
677
- test()
678
- ], LiblslAdapterTest, "pullSampleCallsBinding", null);
679
- __decorate([
680
- test()
681
- ], LiblslAdapterTest, "pullChunkCallsBinding", null);
682
- __decorate([
683
- test()
684
- ], LiblslAdapterTest, "flushInletCallsBinding", null);
685
- __decorate([
686
- test()
687
- ], LiblslAdapterTest, "destroyInletCallsBinding", null);
688
- //# sourceMappingURL=LiblslAdapter.test.js.map