@neurodevs/ndx-native 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.nvmrc +1 -0
  2. package/.vscode/launch.json +58 -0
  3. package/.vscode/settings.json +67 -0
  4. package/.vscode/tasks.json +130 -0
  5. package/LICENSE +21 -0
  6. package/README.md +2 -0
  7. package/build/.spruce/settings.json +11 -0
  8. package/build/__tests__/AbstractPackageTest.d.ts +7 -0
  9. package/build/__tests__/AbstractPackageTest.js +14 -0
  10. package/build/__tests__/AbstractPackageTest.js.map +1 -0
  11. package/build/__tests__/impl/LabrecorderAdapter.test.d.ts +30 -0
  12. package/build/__tests__/impl/LabrecorderAdapter.test.js +164 -0
  13. package/build/__tests__/impl/LabrecorderAdapter.test.js.map +1 -0
  14. package/build/__tests__/impl/LiblslAdapter.test.d.ts +84 -0
  15. package/build/__tests__/impl/LiblslAdapter.test.js +750 -0
  16. package/build/__tests__/impl/LiblslAdapter.test.js.map +1 -0
  17. package/build/__tests__/impl/LibxdfAdapter.test.d.ts +45 -0
  18. package/build/__tests__/impl/LibxdfAdapter.test.js +243 -0
  19. package/build/__tests__/impl/LibxdfAdapter.test.js.map +1 -0
  20. package/build/consts.d.ts +11 -0
  21. package/build/consts.js +21 -0
  22. package/build/consts.js.map +1 -0
  23. package/build/impl/LabrecorderAdapter.d.ts +30 -0
  24. package/build/impl/LabrecorderAdapter.js +69 -0
  25. package/build/impl/LabrecorderAdapter.js.map +1 -0
  26. package/build/impl/LiblslAdapter.d.ts +172 -0
  27. package/build/impl/LiblslAdapter.js +360 -0
  28. package/build/impl/LiblslAdapter.js.map +1 -0
  29. package/build/impl/LibxdfAdapter.d.ts +92 -0
  30. package/build/impl/LibxdfAdapter.js +130 -0
  31. package/build/impl/LibxdfAdapter.js.map +1 -0
  32. package/build/index.d.ts +14 -0
  33. package/build/index.js +18 -0
  34. package/build/index.js.map +1 -0
  35. package/build/lib/handleError.d.ts +8 -0
  36. package/build/lib/handleError.js +25 -0
  37. package/build/lib/handleError.js.map +1 -0
  38. package/build/testDoubles/Labrecorder/FakeLabrecorder.d.ts +15 -0
  39. package/build/testDoubles/Labrecorder/FakeLabrecorder.js +26 -0
  40. package/build/testDoubles/Labrecorder/FakeLabrecorder.js.map +1 -0
  41. package/build/testDoubles/Liblsl/FakeLiblsl.d.ts +57 -0
  42. package/build/testDoubles/Liblsl/FakeLiblsl.js +140 -0
  43. package/build/testDoubles/Liblsl/FakeLiblsl.js.map +1 -0
  44. package/build/testDoubles/Libxdf/FakeLibxdf.d.ts +13 -0
  45. package/build/testDoubles/Libxdf/FakeLibxdf.js +25 -0
  46. package/build/testDoubles/Libxdf/FakeLibxdf.js.map +1 -0
  47. package/build/testDoubles/Libxdf/SpyLibxdf.d.ts +6 -0
  48. package/build/testDoubles/Libxdf/SpyLibxdf.js +10 -0
  49. package/build/testDoubles/Libxdf/SpyLibxdf.js.map +1 -0
  50. package/eslint.config.mjs +3 -0
  51. package/package.json +84 -0
  52. package/src/.spruce/settings.json +11 -0
  53. package/src/__tests__/AbstractPackageTest.ts +16 -0
  54. package/src/__tests__/impl/LabrecorderAdapter.test.ts +197 -0
  55. package/src/__tests__/impl/LiblslAdapter.test.ts +907 -0
  56. package/src/__tests__/impl/LibxdfAdapter.test.ts +290 -0
  57. package/src/consts.ts +21 -0
  58. package/src/impl/LabrecorderAdapter.ts +100 -0
  59. package/src/impl/LiblslAdapter.ts +616 -0
  60. package/src/impl/LibxdfAdapter.ts +227 -0
  61. package/src/index.ts +26 -0
  62. package/src/lib/handleError.ts +24 -0
  63. package/src/testDoubles/Labrecorder/FakeLabrecorder.ts +37 -0
  64. package/src/testDoubles/Liblsl/FakeLiblsl.ts +204 -0
  65. package/src/testDoubles/Libxdf/FakeLibxdf.ts +33 -0
  66. package/src/testDoubles/Libxdf/SpyLibxdf.ts +13 -0
  67. package/tsconfig.json +28 -0
@@ -0,0 +1,172 @@
1
+ import { define, JsExternal, load, open } from 'ffi-rs';
2
+ import { CHANNEL_FORMATS } from '../consts.js';
3
+ import { LslErrorCode } from '../lib/handleError.js';
4
+ export default class LiblslAdapter implements Liblsl {
5
+ static open: typeof open;
6
+ static define: typeof define;
7
+ static load: typeof load;
8
+ static alloc: (size: number, fill?: string | Uint8Array | number, encoding?: BufferEncoding) => Buffer<ArrayBuffer>;
9
+ private static instance?;
10
+ liblslPath: string;
11
+ private bindings;
12
+ private readonly defaultMacOsPath;
13
+ protected constructor();
14
+ private tryToLoadBindings;
15
+ private throwFailedToLoadLiblsl;
16
+ static getInstance(): Liblsl;
17
+ static setInstance(instance: Liblsl): void;
18
+ static resetInstance(): void;
19
+ private loadBindings;
20
+ private openLiblsl;
21
+ private defineLiblslBindings;
22
+ createStreamInfo(options: CreateStreamInfoOptions): InfoHandle;
23
+ appendChannelsToStreamInfo(options: AppendChannelsToStreamInfoOptions): void;
24
+ destroyStreamInfo(options: DestroyStreamInfoOptions): void;
25
+ resolveByProp(options: ResolveByPropOptions): Promise<InfoHandle[]>;
26
+ createOutlet(options: CreateOutletOptions): OutletHandle;
27
+ pushSampleFloatTimestamp(options: PushSampleFloatTimestampOptions): LslErrorCode;
28
+ pushSampleStringTimestamp(options: PushSampleStringTimestampOptions): LslErrorCode;
29
+ destroyOutlet(options: DestroyOutletOptions): void;
30
+ createInlet(options: CreateInletOptions): InletHandle;
31
+ private readonly maxChunkSize;
32
+ private readonly shouldRecover;
33
+ getChannelCount(options: GetChannelCountOptions): number;
34
+ openStream(options: OpenStreamOptions): Promise<void>;
35
+ closeStream(options: CloseStreamOptions): void;
36
+ pullSample(options: PullSampleOptions): number;
37
+ pullChunk(options: PullChunkOptions): number;
38
+ flushInlet(options: FlushInletOptions): void;
39
+ destroyInlet(options: DestroyInletOptions): void;
40
+ localClock(): number;
41
+ private get open();
42
+ private get define();
43
+ private get load();
44
+ private get alloc();
45
+ private get liblslFuncs();
46
+ }
47
+ export interface Liblsl {
48
+ liblslPath: string;
49
+ createStreamInfo(options: CreateStreamInfoOptions): InfoHandle;
50
+ destroyStreamInfo(options: DestroyStreamInfoOptions): void;
51
+ appendChannelsToStreamInfo(options: AppendChannelsToStreamInfoOptions): void;
52
+ getChannelCount(options: GetChannelCountOptions): number;
53
+ resolveByProp(options: ResolveByPropOptions): Promise<InfoHandle[]>;
54
+ createOutlet(options: CreateOutletOptions): OutletHandle;
55
+ pushSampleFloatTimestamp(options: PushSampleFloatTimestampOptions): LslErrorCode;
56
+ pushSampleStringTimestamp(options: PushSampleStringTimestampOptions): LslErrorCode;
57
+ destroyOutlet(options: DestroyOutletOptions): void;
58
+ createInlet(options: CreateInletOptions): InletHandle;
59
+ openStream(options: OpenStreamOptions): Promise<void>;
60
+ closeStream(options: CloseStreamOptions): void;
61
+ pullSample(options: PullSampleOptions): number;
62
+ pullChunk(options: PullChunkOptions): number;
63
+ flushInlet(options: FlushInletOptions): void;
64
+ destroyInlet(options: DestroyInletOptions): void;
65
+ localClock(): number;
66
+ }
67
+ export interface CreateStreamInfoOptions {
68
+ name: string;
69
+ type: string;
70
+ sourceId: string;
71
+ channelCount: number;
72
+ channelFormat: number;
73
+ sampleRateHz: number;
74
+ manufacturer?: string;
75
+ units?: string;
76
+ }
77
+ export interface AppendChannelsToStreamInfoOptions {
78
+ infoHandle: InfoHandle;
79
+ channels: LslChannel[];
80
+ }
81
+ export interface GetChannelCountOptions {
82
+ infoHandle: InfoHandle;
83
+ }
84
+ export interface DestroyStreamInfoOptions {
85
+ infoHandle: InfoHandle;
86
+ }
87
+ export interface ResolveByPropOptions {
88
+ prop: string;
89
+ value: string;
90
+ minResults?: number;
91
+ timeoutMs?: number;
92
+ }
93
+ export interface CreateOutletOptions {
94
+ infoHandle: InfoHandle;
95
+ chunkSize: number;
96
+ maxBufferedMs: number;
97
+ }
98
+ export interface PushSampleFloatTimestampOptions {
99
+ outletHandle: OutletHandle;
100
+ sample: number[];
101
+ timestamp: number;
102
+ }
103
+ export interface PushSampleStringTimestampOptions {
104
+ outletHandle: OutletHandle;
105
+ sample: string[];
106
+ timestamp: number;
107
+ }
108
+ export interface DestroyOutletOptions {
109
+ outletHandle: OutletHandle;
110
+ }
111
+ export interface CreateInletOptions {
112
+ infoHandle: InfoHandle;
113
+ maxBufferedMs: number;
114
+ }
115
+ export interface OpenStreamOptions {
116
+ inletHandle: InletHandle;
117
+ timeoutMs: number;
118
+ errorCodePtr: JsExternal;
119
+ }
120
+ export interface CloseStreamOptions {
121
+ inletHandle: InletHandle;
122
+ }
123
+ export interface PullSampleOptions {
124
+ inletHandle: InletHandle;
125
+ sampleBufferPtr: JsExternal;
126
+ sampleBufferElements: number;
127
+ timeoutMs: number;
128
+ errorCodePtr: JsExternal;
129
+ }
130
+ export interface PullChunkOptions extends PullSampleOptions {
131
+ timestampBufferPtr: JsExternal;
132
+ timestampBufferElements: number;
133
+ }
134
+ export interface FlushInletOptions {
135
+ inletHandle: InletHandle;
136
+ }
137
+ export interface DestroyInletOptions {
138
+ inletHandle: InletHandle;
139
+ }
140
+ export interface LiblslBindings {
141
+ lsl_create_streaminfo(args: [string, string, number, number, number, string]): InfoHandle;
142
+ lsl_get_desc(args: [InfoHandle]): DescriptionHandle;
143
+ lsl_get_channel_count(args: [InfoHandle]): number;
144
+ lsl_append_child(args: [DescriptionHandle, string]): ChildHandle;
145
+ lsl_append_child_value(args: [ChildHandle, string, string]): void;
146
+ lsl_destroy_streaminfo(args: [InfoHandle]): void;
147
+ lsl_create_outlet(args: [InfoHandle, number, number]): OutletHandle;
148
+ lsl_push_sample_ft(args: [OutletHandle, LslSample, number]): LslErrorCode;
149
+ lsl_push_sample_strt(args: [OutletHandle, LslSample, number]): LslErrorCode;
150
+ lsl_destroy_outlet(args: [OutletHandle]): void;
151
+ lsl_create_inlet(args: any): InletHandle;
152
+ lsl_inlet_flush(args: [InletHandle]): void;
153
+ lsl_destroy_inlet(args: any): void;
154
+ lsl_local_clock(args: []): number;
155
+ }
156
+ export type ChannelFormat = (typeof CHANNEL_FORMATS)[number];
157
+ export interface LslChannel {
158
+ label: string;
159
+ units: string;
160
+ type: string;
161
+ }
162
+ export type LslSample = (number | string | undefined)[];
163
+ export interface InfoHandle {
164
+ }
165
+ export interface OutletHandle {
166
+ }
167
+ export interface InletHandle {
168
+ }
169
+ export interface DescriptionHandle {
170
+ }
171
+ export interface ChildHandle {
172
+ }
@@ -0,0 +1,360 @@
1
+ import { createPointer, DataType, define, load, open, unwrapPointer, } from 'ffi-rs';
2
+ export default class LiblslAdapter {
3
+ static open = open;
4
+ static define = define;
5
+ static load = load;
6
+ static alloc = Buffer.alloc;
7
+ static instance;
8
+ liblslPath;
9
+ bindings;
10
+ defaultMacOsPath = `/opt/homebrew/Cellar/lsl/1.16.2/lib/liblsl.1.16.2.dylib`;
11
+ constructor() {
12
+ this.liblslPath = process.env.LIBLSL_PATH ?? this.defaultMacOsPath;
13
+ this.tryToLoadBindings();
14
+ }
15
+ tryToLoadBindings() {
16
+ try {
17
+ this.loadBindings();
18
+ }
19
+ catch (error) {
20
+ this.throwFailedToLoadLiblsl(error);
21
+ }
22
+ }
23
+ throwFailedToLoadLiblsl(error) {
24
+ throw new Error(`Loading the liblsl dylib failed! I tried to load it from ${this.liblslPath}.\n\n${error.message}\n\n`);
25
+ }
26
+ static getInstance() {
27
+ if (!this.instance) {
28
+ this.setInstance(new this());
29
+ }
30
+ return this.instance;
31
+ }
32
+ static setInstance(instance) {
33
+ this.instance = instance;
34
+ }
35
+ static resetInstance() {
36
+ delete this.instance;
37
+ }
38
+ loadBindings() {
39
+ this.openLiblsl();
40
+ this.bindings = this.defineLiblslBindings();
41
+ }
42
+ openLiblsl() {
43
+ this.open({
44
+ library: 'lsl',
45
+ path: this.liblslPath,
46
+ });
47
+ }
48
+ defineLiblslBindings() {
49
+ return this.define(this.liblslFuncs);
50
+ }
51
+ createStreamInfo(options) {
52
+ const { name, type, sourceId, channelCount, channelFormat, sampleRateHz, } = options;
53
+ return this.bindings.lsl_create_streaminfo([
54
+ name,
55
+ type,
56
+ channelCount,
57
+ sampleRateHz,
58
+ channelFormat,
59
+ sourceId,
60
+ ]);
61
+ }
62
+ appendChannelsToStreamInfo(options) {
63
+ const { infoHandle, channels } = options;
64
+ const description = this.bindings.lsl_get_desc([infoHandle]);
65
+ const parent = this.bindings.lsl_append_child([description, 'channels']);
66
+ for (const channel of channels) {
67
+ const child = this.bindings.lsl_append_child([parent, 'channel']);
68
+ this.bindings.lsl_append_child_value([
69
+ child,
70
+ 'label',
71
+ channel.label,
72
+ ]);
73
+ this.bindings.lsl_append_child_value([child, 'unit', channel.units]);
74
+ this.bindings.lsl_append_child_value([child, 'type', channel.type]);
75
+ }
76
+ }
77
+ destroyStreamInfo(options) {
78
+ const { infoHandle } = options;
79
+ this.bindings.lsl_destroy_streaminfo([infoHandle]);
80
+ }
81
+ async resolveByProp(options) {
82
+ const { prop, value, minResults = 1, timeoutMs = 1000 } = options;
83
+ const maxResults = 1024;
84
+ const bytesPerPointer = 8;
85
+ const resultsBuffer = this.alloc(maxResults * bytesPerPointer);
86
+ const resultsBufferPtr = unwrapPointer(createPointer({
87
+ paramsType: [DataType.U8Array],
88
+ paramsValue: [resultsBuffer],
89
+ }))[0];
90
+ const numResults = await this.load({
91
+ library: 'lsl',
92
+ funcName: 'lsl_resolve_byprop',
93
+ retType: DataType.I32,
94
+ paramsType: [
95
+ DataType.External,
96
+ DataType.I32,
97
+ DataType.String,
98
+ DataType.String,
99
+ DataType.I32,
100
+ DataType.Double,
101
+ ],
102
+ paramsValue: [
103
+ resultsBufferPtr,
104
+ maxResults,
105
+ prop,
106
+ value,
107
+ minResults,
108
+ timeoutMs / 1000,
109
+ ],
110
+ runInNewThread: true,
111
+ });
112
+ const handles = [];
113
+ for (let i = 0; i < numResults; i++) {
114
+ const handle = resultsBuffer.readBigUInt64LE(i * bytesPerPointer);
115
+ if (handle !== 0n) {
116
+ const handleRef = createPointer({
117
+ paramsType: [DataType.BigInt],
118
+ paramsValue: [handle],
119
+ });
120
+ const handlePtr = unwrapPointer(handleRef)[0];
121
+ handles.push(handlePtr);
122
+ }
123
+ }
124
+ return handles;
125
+ }
126
+ createOutlet(options) {
127
+ const { infoHandle, chunkSize, maxBufferedMs } = options;
128
+ return this.bindings.lsl_create_outlet([
129
+ infoHandle,
130
+ chunkSize,
131
+ maxBufferedMs / 1000,
132
+ ]);
133
+ }
134
+ pushSampleFloatTimestamp(options) {
135
+ const { outletHandle, sample, timestamp } = options;
136
+ return this.bindings.lsl_push_sample_ft([
137
+ outletHandle,
138
+ sample,
139
+ timestamp,
140
+ ]);
141
+ }
142
+ pushSampleStringTimestamp(options) {
143
+ const { outletHandle, sample, timestamp } = options;
144
+ return this.bindings.lsl_push_sample_strt([
145
+ outletHandle,
146
+ sample,
147
+ timestamp,
148
+ ]);
149
+ }
150
+ destroyOutlet(options) {
151
+ const { outletHandle } = options;
152
+ this.bindings.lsl_destroy_outlet([outletHandle]);
153
+ }
154
+ createInlet(options) {
155
+ const { infoHandle, maxBufferedMs } = options;
156
+ return this.bindings.lsl_create_inlet([
157
+ infoHandle,
158
+ maxBufferedMs / 1000,
159
+ this.maxChunkSize,
160
+ this.shouldRecover,
161
+ ]);
162
+ }
163
+ maxChunkSize = 0;
164
+ shouldRecover = 1;
165
+ getChannelCount(options) {
166
+ const { infoHandle } = options;
167
+ return this.bindings.lsl_get_channel_count([infoHandle]);
168
+ }
169
+ async openStream(options) {
170
+ const { inletHandle, timeoutMs, errorCodePtr } = options;
171
+ await this.load({
172
+ library: 'lsl',
173
+ funcName: 'lsl_open_stream',
174
+ retType: DataType.Void,
175
+ paramsType: [DataType.External, DataType.Double, DataType.External],
176
+ paramsValue: [inletHandle, timeoutMs / 1000, errorCodePtr],
177
+ runInNewThread: true,
178
+ });
179
+ }
180
+ closeStream(options) {
181
+ const { inletHandle } = options;
182
+ this.load({
183
+ library: 'lsl',
184
+ funcName: 'lsl_close_stream',
185
+ retType: DataType.Void,
186
+ paramsType: [DataType.External],
187
+ paramsValue: [inletHandle],
188
+ });
189
+ }
190
+ pullSample(options) {
191
+ const { inletHandle, sampleBufferPtr, sampleBufferElements, timeoutMs, errorCodePtr: errorCodePtr, } = options;
192
+ return this.load({
193
+ library: 'lsl',
194
+ funcName: 'lsl_pull_sample_f',
195
+ retType: DataType.Double,
196
+ paramsType: [
197
+ DataType.External,
198
+ DataType.External,
199
+ DataType.I32,
200
+ DataType.Double,
201
+ DataType.External,
202
+ ],
203
+ paramsValue: [
204
+ inletHandle,
205
+ sampleBufferPtr,
206
+ sampleBufferElements,
207
+ timeoutMs / 1000,
208
+ errorCodePtr,
209
+ ],
210
+ });
211
+ }
212
+ pullChunk(options) {
213
+ const { inletHandle, sampleBufferPtr, timestampBufferPtr, sampleBufferElements, timestampBufferElements, timeoutMs, errorCodePtr: errorCodePtr, } = options;
214
+ return this.load({
215
+ library: 'lsl',
216
+ funcName: 'lsl_pull_chunk_f',
217
+ retType: DataType.Double,
218
+ paramsType: [
219
+ DataType.External,
220
+ DataType.External,
221
+ DataType.External,
222
+ DataType.I32,
223
+ DataType.I32,
224
+ DataType.Double,
225
+ DataType.External,
226
+ ],
227
+ paramsValue: [
228
+ inletHandle,
229
+ sampleBufferPtr,
230
+ timestampBufferPtr,
231
+ sampleBufferElements,
232
+ timestampBufferElements,
233
+ timeoutMs / 1000,
234
+ errorCodePtr,
235
+ ],
236
+ });
237
+ }
238
+ flushInlet(options) {
239
+ const { inletHandle } = options;
240
+ this.bindings.lsl_inlet_flush([inletHandle]);
241
+ }
242
+ destroyInlet(options) {
243
+ const { inletHandle } = options;
244
+ this.bindings.lsl_destroy_inlet([inletHandle]);
245
+ }
246
+ localClock() {
247
+ return this.bindings.lsl_local_clock([]);
248
+ }
249
+ get open() {
250
+ return LiblslAdapter.open;
251
+ }
252
+ get define() {
253
+ return LiblslAdapter.define;
254
+ }
255
+ get load() {
256
+ return LiblslAdapter.load;
257
+ }
258
+ get alloc() {
259
+ return LiblslAdapter.alloc;
260
+ }
261
+ get liblslFuncs() {
262
+ return {
263
+ lsl_create_streaminfo: {
264
+ library: 'lsl',
265
+ retType: DataType.External,
266
+ paramsType: [
267
+ DataType.String,
268
+ DataType.String,
269
+ DataType.I32,
270
+ DataType.Double,
271
+ DataType.I32,
272
+ DataType.String,
273
+ ],
274
+ },
275
+ lsl_destroy_streaminfo: {
276
+ library: 'lsl',
277
+ retType: DataType.Void,
278
+ paramsType: [DataType.External],
279
+ },
280
+ lsl_create_outlet: {
281
+ library: 'lsl',
282
+ retType: DataType.External,
283
+ paramsType: [DataType.External, DataType.I32, DataType.I32],
284
+ },
285
+ lsl_push_sample_ft: {
286
+ library: 'lsl',
287
+ retType: DataType.I32,
288
+ paramsType: [
289
+ DataType.External,
290
+ DataType.FloatArray,
291
+ DataType.Double,
292
+ ],
293
+ },
294
+ lsl_push_sample_strt: {
295
+ library: 'lsl',
296
+ retType: DataType.I32,
297
+ paramsType: [
298
+ DataType.External,
299
+ DataType.StringArray,
300
+ DataType.Double,
301
+ ],
302
+ },
303
+ lsl_destroy_outlet: {
304
+ library: 'lsl',
305
+ retType: DataType.Void,
306
+ paramsType: [DataType.External],
307
+ },
308
+ lsl_create_inlet: {
309
+ library: 'lsl',
310
+ retType: DataType.External,
311
+ paramsType: [
312
+ DataType.External,
313
+ DataType.I32,
314
+ DataType.I32,
315
+ DataType.I32,
316
+ ],
317
+ },
318
+ lsl_inlet_flush: {
319
+ library: 'lsl',
320
+ retType: DataType.I32,
321
+ paramsType: [DataType.External],
322
+ },
323
+ lsl_destroy_inlet: {
324
+ library: 'lsl',
325
+ retType: DataType.Void,
326
+ paramsType: [DataType.External],
327
+ },
328
+ lsl_get_desc: {
329
+ library: 'lsl',
330
+ retType: DataType.External,
331
+ paramsType: [DataType.External],
332
+ },
333
+ lsl_get_channel_count: {
334
+ library: 'lsl',
335
+ retType: DataType.I32,
336
+ paramsType: [DataType.External],
337
+ },
338
+ lsl_append_child: {
339
+ library: 'lsl',
340
+ retType: DataType.External,
341
+ paramsType: [DataType.External, DataType.String],
342
+ },
343
+ lsl_append_child_value: {
344
+ library: 'lsl',
345
+ retType: DataType.External,
346
+ paramsType: [
347
+ DataType.External,
348
+ DataType.String,
349
+ DataType.String,
350
+ ],
351
+ },
352
+ lsl_local_clock: {
353
+ library: 'lsl',
354
+ retType: DataType.Double,
355
+ paramsType: [],
356
+ },
357
+ };
358
+ }
359
+ }
360
+ //# sourceMappingURL=LiblslAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiblslAdapter.js","sourceRoot":"","sources":["../../src/impl/LiblslAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,QAAQ,EACR,MAAM,EAEN,IAAI,EACJ,IAAI,EACJ,aAAa,GAChB,MAAM,QAAQ,CAAA;AAKf,MAAM,CAAC,OAAO,OAAO,aAAa;IACvB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;IAE1B,MAAM,CAAC,QAAQ,CAAS;IAEzB,UAAU,CAAQ;IACjB,QAAQ,CAAiB;IAEhB,gBAAgB,GAAG,yDAAyD,CAAA;IAE7F;QACI,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,CAAA;QAClE,IAAI,CAAC,iBAAiB,EAAE,CAAA;IAC5B,CAAC;IAEO,iBAAiB;QACrB,IAAI,CAAC;YACD,IAAI,CAAC,YAAY,EAAE,CAAA;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,uBAAuB,CAAC,KAAc,CAAC,CAAA;QAChD,CAAC;IACL,CAAC;IAEO,uBAAuB,CAAC,KAAY;QACxC,MAAM,IAAI,KAAK,CACX,4DAA4D,IAAI,CAAC,UAAU,QAAQ,KAAK,CAAC,OAAO,MAAM,CACzG,CAAA;IACL,CAAC;IAEM,MAAM,CAAC,WAAW;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjB,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QAChC,CAAC;QACD,OAAO,IAAI,CAAC,QAAS,CAAA;IACzB,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,QAAgB;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC5B,CAAC;IAEM,MAAM,CAAC,aAAa;QACvB,OAAO,IAAI,CAAC,QAAQ,CAAA;IACxB,CAAC;IAEO,YAAY;QAChB,IAAI,CAAC,UAAU,EAAE,CAAA;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;IAC/C,CAAC;IAEO,UAAU;QACd,IAAI,CAAC,IAAI,CAAC;YACN,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,IAAI,CAAC,UAAU;SACxB,CAAC,CAAA;IACN,CAAC;IAEO,oBAAoB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAmB,CAAA;IAC1D,CAAC;IAEM,gBAAgB,CAAC,OAAgC;QACpD,MAAM,EACF,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,YAAY,GACf,GAAG,OAAO,CAAA;QAEX,OAAO,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACvC,IAAI;YACJ,IAAI;YACJ,YAAY;YACZ,YAAY;YACZ,aAAa;YACb,QAAQ;SACX,CAAC,CAAA;IACN,CAAC;IAEM,0BAA0B,CAC7B,OAA0C;QAE1C,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;QAExC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;QAExE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;YACjE,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBACjC,KAAK;gBACL,OAAO;gBACP,OAAO,CAAC,KAAK;aAChB,CAAC,CAAA;YACF,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;YACpE,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACvE,CAAC;IACL,CAAC;IAEM,iBAAiB,CAAC,OAAiC;QACtD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;QAC9B,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;IACtD,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,OAA6B;QACpD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;QAEjE,MAAM,UAAU,GAAG,IAAI,CAAA;QACvB,MAAM,eAAe,GAAG,CAAC,CAAA;QAEzB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,eAAe,CAAC,CAAA;QAE9D,MAAM,gBAAgB,GAAG,aAAa,CAClC,aAAa,CAAC;YACV,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC9B,WAAW,EAAE,CAAC,aAAa,CAAC;SAC/B,CAAC,CACL,CAAC,CAAC,CAAC,CAAA;QAEJ,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC/B,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,oBAAoB;YAC9B,OAAO,EAAE,QAAQ,CAAC,GAAG;YACrB,UAAU,EAAE;gBACR,QAAQ,CAAC,QAAQ;gBACjB,QAAQ,CAAC,GAAG;gBACZ,QAAQ,CAAC,MAAM;gBACf,QAAQ,CAAC,MAAM;gBACf,QAAQ,CAAC,GAAG;gBACZ,QAAQ,CAAC,MAAM;aAClB;YACD,WAAW,EAAE;gBACT,gBAAgB;gBAChB,UAAU;gBACV,IAAI;gBACJ,KAAK;gBACL,UAAU;gBACV,SAAS,GAAG,IAAI;aACnB;YACD,cAAc,EAAE,IAAI;SACvB,CAAC,CAAA;QAEF,MAAM,OAAO,GAAiB,EAAE,CAAA;QAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,aAAa,CAAC,eAAe,CAAC,CAAC,GAAG,eAAe,CAAC,CAAA;YAEjE,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;gBAChB,MAAM,SAAS,GAAG,aAAa,CAAC;oBAC5B,UAAU,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC7B,WAAW,EAAE,CAAC,MAAM,CAAC;iBACxB,CAAC,CAAA;gBAEF,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;gBAE7C,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC3B,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAA;IAClB,CAAC;IAEM,YAAY,CAAC,OAA4B;QAC5C,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;QAExD,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YACnC,UAAU;YACV,SAAS;YACT,aAAa,GAAG,IAAI;SACvB,CAAC,CAAA;IACN,CAAC;IAEM,wBAAwB,CAAC,OAAwC;QACpE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;QAEnD,OAAO,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YACpC,YAAY;YACZ,MAAM;YACN,SAAS;SACZ,CAAC,CAAA;IACN,CAAC;IAEM,yBAAyB,CAC5B,OAAyC;QAEzC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;QAEnD,OAAO,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACtC,YAAY;YACZ,MAAM;YACN,SAAS;SACZ,CAAC,CAAA;IACN,CAAC;IAEM,aAAa,CAAC,OAA6B;QAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;QAChC,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;IACpD,CAAC;IAEM,WAAW,CAAC,OAA2B;QAC1C,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;QAE7C,OAAO,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAClC,UAAU;YACV,aAAa,GAAG,IAAI;YACpB,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,aAAa;SACrB,CAAC,CAAA;IACN,CAAC;IAEgB,YAAY,GAAG,CAAC,CAAA;IAChB,aAAa,GAAG,CAAC,CAAA;IAE3B,eAAe,CAAC,OAA+B;QAClD,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;IAC5D,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,OAA0B;QAC9C,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;QAExD,MAAM,IAAI,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,iBAAiB;YAC3B,OAAO,EAAE,QAAQ,CAAC,IAAI;YACtB,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;YACnE,WAAW,EAAE,CAAC,WAAW,EAAE,SAAS,GAAG,IAAI,EAAE,YAAY,CAAC;YAC1D,cAAc,EAAE,IAAI;SACvB,CAAC,CAAA;IACN,CAAC;IAEM,WAAW,CAAC,OAA2B;QAC1C,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;QAE/B,IAAI,CAAC,IAAI,CAAC;YACN,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,kBAAkB;YAC5B,OAAO,EAAE,QAAQ,CAAC,IAAI;YACtB,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC/B,WAAW,EAAE,CAAC,WAAW,CAAC;SAC7B,CAAC,CAAA;IACN,CAAC;IAEM,UAAU,CAAC,OAA0B;QACxC,MAAM,EACF,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,SAAS,EACT,YAAY,EAAE,YAAY,GAC7B,GAAG,OAAO,CAAA;QAEX,OAAO,IAAI,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,mBAAmB;YAC7B,OAAO,EAAE,QAAQ,CAAC,MAAM;YACxB,UAAU,EAAE;gBACR,QAAQ,CAAC,QAAQ;gBACjB,QAAQ,CAAC,QAAQ;gBACjB,QAAQ,CAAC,GAAG;gBACZ,QAAQ,CAAC,MAAM;gBACf,QAAQ,CAAC,QAAQ;aACpB;YACD,WAAW,EAAE;gBACT,WAAW;gBACX,eAAe;gBACf,oBAAoB;gBACpB,SAAS,GAAG,IAAI;gBAChB,YAAY;aACf;SACJ,CAAC,CAAA;IACN,CAAC;IAEM,SAAS,CAAC,OAAyB;QACtC,MAAM,EACF,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,SAAS,EACT,YAAY,EAAE,YAAY,GAC7B,GAAG,OAAO,CAAA;QAEX,OAAO,IAAI,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,kBAAkB;YAC5B,OAAO,EAAE,QAAQ,CAAC,MAAM;YACxB,UAAU,EAAE;gBACR,QAAQ,CAAC,QAAQ;gBACjB,QAAQ,CAAC,QAAQ;gBACjB,QAAQ,CAAC,QAAQ;gBACjB,QAAQ,CAAC,GAAG;gBACZ,QAAQ,CAAC,GAAG;gBACZ,QAAQ,CAAC,MAAM;gBACf,QAAQ,CAAC,QAAQ;aACpB;YACD,WAAW,EAAE;gBACT,WAAW;gBACX,eAAe;gBACf,kBAAkB;gBAClB,oBAAoB;gBACpB,uBAAuB;gBACvB,SAAS,GAAG,IAAI;gBAChB,YAAY;aACf;SACJ,CAAC,CAAA;IACN,CAAC;IAEM,UAAU,CAAC,OAA0B;QACxC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;QAC/B,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;IAChD,CAAC;IAEM,YAAY,CAAC,OAA4B;QAC5C,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;QAC/B,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;IAClD,CAAC;IAEM,UAAU;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,IAAY,IAAI;QACZ,OAAO,aAAa,CAAC,IAAI,CAAA;IAC7B,CAAC;IAED,IAAY,MAAM;QACd,OAAO,aAAa,CAAC,MAAM,CAAA;IAC/B,CAAC;IAED,IAAY,IAAI;QACZ,OAAO,aAAa,CAAC,IAAI,CAAA;IAC7B,CAAC;IAED,IAAY,KAAK;QACb,OAAO,aAAa,CAAC,KAAK,CAAA;IAC9B,CAAC;IAED,IAAY,WAAW;QACnB,OAAO;YACH,qBAAqB,EAAE;gBACnB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,QAAQ;gBAC1B,UAAU,EAAE;oBACR,QAAQ,CAAC,MAAM;oBACf,QAAQ,CAAC,MAAM;oBACf,QAAQ,CAAC,GAAG;oBACZ,QAAQ,CAAC,MAAM;oBACf,QAAQ,CAAC,GAAG;oBACZ,QAAQ,CAAC,MAAM;iBAClB;aACJ;YACD,sBAAsB,EAAE;gBACpB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAClC;YACD,iBAAiB,EAAE;gBACf,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,QAAQ;gBAC1B,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC;aAC9D;YACD,kBAAkB,EAAE;gBAChB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,GAAG;gBACrB,UAAU,EAAE;oBACR,QAAQ,CAAC,QAAQ;oBACjB,QAAQ,CAAC,UAAU;oBACnB,QAAQ,CAAC,MAAM;iBAClB;aACJ;YACD,oBAAoB,EAAE;gBAClB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,GAAG;gBACrB,UAAU,EAAE;oBACR,QAAQ,CAAC,QAAQ;oBACjB,QAAQ,CAAC,WAAW;oBACpB,QAAQ,CAAC,MAAM;iBAClB;aACJ;YACD,kBAAkB,EAAE;gBAChB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAClC;YACD,gBAAgB,EAAE;gBACd,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,QAAQ;gBAC1B,UAAU,EAAE;oBACR,QAAQ,CAAC,QAAQ;oBACjB,QAAQ,CAAC,GAAG;oBACZ,QAAQ,CAAC,GAAG;oBACZ,QAAQ,CAAC,GAAG;iBACf;aACJ;YACD,eAAe,EAAE;gBACb,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,GAAG;gBACrB,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAClC;YACD,iBAAiB,EAAE;gBACf,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,IAAI;gBACtB,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAClC;YACD,YAAY,EAAE;gBACV,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,QAAQ;gBAC1B,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAClC;YACD,qBAAqB,EAAE;gBACnB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,GAAG;gBACrB,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;aAClC;YACD,gBAAgB,EAAE;gBACd,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,QAAQ;gBAC1B,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC;aACnD;YACD,sBAAsB,EAAE;gBACpB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,QAAQ;gBAC1B,UAAU,EAAE;oBACR,QAAQ,CAAC,QAAQ;oBACjB,QAAQ,CAAC,MAAM;oBACf,QAAQ,CAAC,MAAM;iBAClB;aACJ;YACD,eAAe,EAAE;gBACb,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,QAAQ,CAAC,MAAM;gBACxB,UAAU,EAAE,EAAE;aACjB;SACJ,CAAA;IACL,CAAC"}
@@ -0,0 +1,92 @@
1
+ import { MangledNameMap } from '@neurodevs/node-mangled-names';
2
+ import { define, FieldType, FuncObj, open } from 'ffi-rs';
3
+ export default class LibxdfAdapter implements Libxdf {
4
+ static Class?: LibxdfConstructor;
5
+ static ffiRsOpen: typeof open;
6
+ static ffiRsDefine: typeof define;
7
+ private static readonly loadXdfName;
8
+ private static unmangledNames;
9
+ protected bindings: LibxdfBindings;
10
+ private libxdfPath;
11
+ private mangledNameMap;
12
+ protected constructor(libxdfPath: string, mangledNameMap: MangledNameMap);
13
+ static Create(libxdfPath: string, throwIfPathNotExists?: boolean): Promise<Libxdf>;
14
+ private tryToLoadBindings;
15
+ private loadBindings;
16
+ private openLibxdf;
17
+ private defineBindings;
18
+ private throwFailedToLoadLiblsl;
19
+ private generateFailedMessage;
20
+ loadXdf(path: string): {
21
+ path: string;
22
+ streams: {
23
+ id: number;
24
+ name: string;
25
+ type: string;
26
+ channelCount: number;
27
+ channelFormat: string;
28
+ nominalSampleRateHz: number;
29
+ data: number[][];
30
+ timestamps: number[];
31
+ }[];
32
+ events: {
33
+ name: string;
34
+ timestamp: number;
35
+ streamId: number;
36
+ }[];
37
+ };
38
+ private get unmangledNames();
39
+ private get loadXdfName();
40
+ private static generateFailedMessage;
41
+ private static loadMangledNameMap;
42
+ private static MangledNameExtractor;
43
+ }
44
+ export interface Libxdf {
45
+ loadXdf(path: string): XdfFile;
46
+ }
47
+ export type LibxdfConstructor = new (libxdfPath: string, mangledNameMap: MangledNameMap) => Libxdf;
48
+ export type LibxdfBindings = Record<string, (path: string[]) => string>;
49
+ export type LibxdfStatusCode = 0 | Exclude<number, 0>;
50
+ export type FfiRsDefineOptions = FuncObj<FieldType, boolean | undefined, boolean | undefined>;
51
+ export interface XdfFile {
52
+ path: string;
53
+ streams: XdfStream[];
54
+ events: XdfEvent[];
55
+ }
56
+ export interface XdfStream {
57
+ id: number;
58
+ name: string;
59
+ type: string;
60
+ channelCount: number;
61
+ channelFormat: string;
62
+ nominalSampleRateHz: number;
63
+ data: number[][];
64
+ timestamps: number[];
65
+ }
66
+ export interface XdfEvent {
67
+ name: string;
68
+ timestamp: number;
69
+ streamId: number;
70
+ }
71
+ export interface LibxdfFile {
72
+ streams: LibxdfStream[];
73
+ events: LibxdfEvent[];
74
+ }
75
+ export interface LibxdfStream {
76
+ stream_id: number;
77
+ stream_info: LibxdfStreamInfo;
78
+ time_series: number[][];
79
+ time_stamps: number[];
80
+ }
81
+ export interface LibxdfStreamInfo {
82
+ channel_count: number;
83
+ channel_format: string;
84
+ nominal_srate: number;
85
+ stream_name: string;
86
+ stream_type: string;
87
+ }
88
+ export interface LibxdfEvent {
89
+ stream_id: number;
90
+ event_name: string;
91
+ event_timestamp: number;
92
+ }