@neurodevs/node-lsl 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 (60) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.js +3 -0
  3. package/.nvmrc +1 -0
  4. package/.vscode/launch.json +58 -0
  5. package/.vscode/settings.json +70 -0
  6. package/.vscode/tasks.json +112 -0
  7. package/LICENSE +21 -0
  8. package/README.md +2 -0
  9. package/build/.spruce/errors/errors.types.d.ts +21 -0
  10. package/build/.spruce/errors/errors.types.js +5 -0
  11. package/build/.spruce/errors/errors.types.js.map +1 -0
  12. package/build/.spruce/errors/nodeLsl/failedToLoadLiblsl.schema.d.ts +3 -0
  13. package/build/.spruce/errors/nodeLsl/failedToLoadLiblsl.schema.js +19 -0
  14. package/build/.spruce/errors/nodeLsl/failedToLoadLiblsl.schema.js.map +1 -0
  15. package/build/.spruce/errors/options.types.d.ts +7 -0
  16. package/build/.spruce/errors/options.types.js +3 -0
  17. package/build/.spruce/errors/options.types.js.map +1 -0
  18. package/build/.spruce/schemas/fields/fieldClassMap.d.ts +2 -0
  19. package/build/.spruce/schemas/fields/fieldClassMap.js +5 -0
  20. package/build/.spruce/schemas/fields/fieldClassMap.js.map +1 -0
  21. package/build/.spruce/schemas/fields/fields.types.d.ts +1 -0
  22. package/build/.spruce/schemas/fields/fields.types.js +3 -0
  23. package/build/.spruce/schemas/fields/fields.types.js.map +1 -0
  24. package/build/.spruce/settings.json +13 -0
  25. package/build/Liblsl.d.ts +47 -0
  26. package/build/Liblsl.js +81 -0
  27. package/build/Liblsl.js.map +1 -0
  28. package/build/LslOutlet.d.ts +30 -0
  29. package/build/LslOutlet.js +122 -0
  30. package/build/LslOutlet.js.map +1 -0
  31. package/build/__tests__/behavioral/LslOutlet.test.d.ts +26 -0
  32. package/build/__tests__/behavioral/LslOutlet.test.js +232 -0
  33. package/build/__tests__/behavioral/LslOutlet.test.js.map +1 -0
  34. package/build/__tests__/implementation/Liblsl.test.d.ts +28 -0
  35. package/build/__tests__/implementation/Liblsl.test.js +236 -0
  36. package/build/__tests__/implementation/Liblsl.test.js.map +1 -0
  37. package/build/errors/SpruceError.d.ts +6 -0
  38. package/build/errors/SpruceError.js +26 -0
  39. package/build/errors/SpruceError.js.map +1 -0
  40. package/build/errors/failedToLoadLiblsl.builder.d.ts +11 -0
  41. package/build/errors/failedToLoadLiblsl.builder.js +14 -0
  42. package/build/errors/failedToLoadLiblsl.builder.js.map +1 -0
  43. package/build/index.d.ts +4 -0
  44. package/build/index.js +27 -0
  45. package/build/index.js.map +1 -0
  46. package/package.json +80 -0
  47. package/src/.spruce/errors/errors.types.ts +40 -0
  48. package/src/.spruce/errors/nodeLsl/failedToLoadLiblsl.schema.ts +22 -0
  49. package/src/.spruce/errors/options.types.ts +10 -0
  50. package/src/.spruce/schemas/fields/fieldClassMap.ts +6 -0
  51. package/src/.spruce/schemas/fields/fields.types.ts +1 -0
  52. package/src/.spruce/settings.json +13 -0
  53. package/src/Liblsl.ts +151 -0
  54. package/src/LslOutlet.ts +143 -0
  55. package/src/__tests__/behavioral/LslOutlet.test.ts +217 -0
  56. package/src/__tests__/implementation/Liblsl.test.ts +231 -0
  57. package/src/errors/SpruceError.ts +23 -0
  58. package/src/errors/failedToLoadLiblsl.builder.ts +12 -0
  59. package/src/index.ts +5 -0
  60. package/tsconfig.json +40 -0
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const schema_1 = require("@sprucelabs/schema");
18
+ const Liblsl_1 = __importDefault(require("./Liblsl"));
19
+ class LslOutlet {
20
+ constructor(options) {
21
+ const { channelCount, sampleRate, channelFormat, chunkSize, maxBuffered } = (0, schema_1.assertOptions)(options, [
22
+ 'name',
23
+ 'type',
24
+ 'channelCount',
25
+ 'sampleRate',
26
+ 'channelFormat',
27
+ 'sourceId',
28
+ 'manufacturer',
29
+ 'unit',
30
+ 'chunkSize',
31
+ 'maxBuffered',
32
+ ]);
33
+ this.assertValidChannelCount(channelCount);
34
+ this.assertValidSampleRate(sampleRate);
35
+ this.assertValidChannelFormat(channelFormat);
36
+ this.assertValidChunkSize(chunkSize);
37
+ this.assertValidMaxBufferred(maxBuffered);
38
+ this.outletOptions = options;
39
+ }
40
+ assertValidMaxBufferred(maxBuffered) {
41
+ if (!this.isPositiveIntegerOrZero(maxBuffered)) {
42
+ throw new schema_1.SchemaError({
43
+ code: 'INVALID_PARAMETERS',
44
+ parameters: ['maxBuffered'],
45
+ friendlyMessage: 'Max buffered must be a positive integer or zero.',
46
+ });
47
+ }
48
+ }
49
+ assertValidChunkSize(chunkSize) {
50
+ if (!this.isPositiveIntegerOrZero(chunkSize)) {
51
+ throw new schema_1.SchemaError({
52
+ code: 'INVALID_PARAMETERS',
53
+ parameters: ['chunkSize'],
54
+ friendlyMessage: 'Chunk size must be a positive integer or zero.',
55
+ });
56
+ }
57
+ }
58
+ assertValidChannelFormat(channelFormat) {
59
+ const validFormats = CHANNEL_FORMATS;
60
+ if (validFormats.indexOf(channelFormat) === -1) {
61
+ throw new schema_1.SchemaError({
62
+ code: 'INVALID_PARAMETERS',
63
+ parameters: ['channelFormat'],
64
+ friendlyMessage: 'Channel format must be a valid format.',
65
+ });
66
+ }
67
+ }
68
+ assertValidSampleRate(sampleRate) {
69
+ if (!this.isPositiveNumber(sampleRate)) {
70
+ throw new schema_1.SchemaError({
71
+ code: 'INVALID_PARAMETERS',
72
+ parameters: ['sampleRate'],
73
+ friendlyMessage: 'Sample rate must be a positive number.',
74
+ });
75
+ }
76
+ }
77
+ assertValidChannelCount(channelCount) {
78
+ if (!this.isPositiveInteger(channelCount)) {
79
+ throw new schema_1.SchemaError({
80
+ code: 'INVALID_PARAMETERS',
81
+ parameters: ['channelCount'],
82
+ friendlyMessage: 'Channel count must be a positive integer.',
83
+ });
84
+ }
85
+ }
86
+ isPositiveNumber(value) {
87
+ return value > 0;
88
+ }
89
+ isPositiveIntegerOrZero(value) {
90
+ return Number.isInteger(value) && value >= 0;
91
+ }
92
+ isPositiveInteger(value) {
93
+ return Number.isInteger(value) && value > 0;
94
+ }
95
+ get lsl() {
96
+ return Liblsl_1.default.getInstance();
97
+ }
98
+ pushSample(sample) {
99
+ const _a = this
100
+ .outletOptions, { chunkSize, maxBuffered } = _a, streamInfoOptions = __rest(_a, ["chunkSize", "maxBuffered"]);
101
+ delete streamInfoOptions.manufacturer;
102
+ delete streamInfoOptions.unit;
103
+ const info = this.lsl.createStreamInfo(Object.assign(Object.assign({}, streamInfoOptions), { channelFormat: CHANNEL_FORMATS.indexOf(this.outletOptions.channelFormat) }));
104
+ this.lsl.pushSample(this.lsl.createOutlet({
105
+ info,
106
+ chunkSize,
107
+ maxBuffered,
108
+ }), sample);
109
+ }
110
+ }
111
+ exports.default = LslOutlet;
112
+ const CHANNEL_FORMATS = [
113
+ 'undefined',
114
+ 'float32',
115
+ 'double64',
116
+ 'string',
117
+ 'int32',
118
+ 'int16',
119
+ 'int8',
120
+ 'int64',
121
+ ];
122
+ //# sourceMappingURL=LslOutlet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LslOutlet.js","sourceRoot":"","sources":["../src/LslOutlet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import AbstractSpruceTest from '@sprucelabs/test-utils';
2
+ import { LslSample } from '../../Liblsl';
3
+ export declare const CHANNEL_FORMATS: readonly ["undefined", "float32", "double64", "string", "int32", "int16", "int8", "int64"];
4
+ export default class LslOutletTest extends AbstractSpruceTest {
5
+ private static spyLsl;
6
+ private static randomOutletOptions;
7
+ private static channelIdx;
8
+ protected static beforeEach(): Promise<void>;
9
+ protected static throwsWhenMissingRequiredParameters(): Promise<void>;
10
+ protected static canCreateWithRequiredParams(): Promise<void>;
11
+ protected static throwsWithInvalidChannelCount(): Promise<void>;
12
+ protected static throwsWithInvalidSampleRate(): Promise<void>;
13
+ protected static throwsWithInvalidChannelFormat(): Promise<void>;
14
+ protected static supportsAllKnownChannelFormats(): Promise<void>;
15
+ protected static throwWithInvalidChunkSize(): Promise<void>;
16
+ protected static throwsWithInvalidMaxBuffered(): Promise<void>;
17
+ protected static pushingSampleSendsToLsl(sample: LslSample): Promise<void>;
18
+ protected static pushingSamplePassesCorrectOptionsToCreateStreamInfo(): Promise<void>;
19
+ private static pushSample;
20
+ private static assertThrowsInvalidMaxBuffered;
21
+ private static assertThrowsInvalidChunkSize;
22
+ private static assertThrowsInvalidSampleRate;
23
+ private static assertThrowsInvalidChannelCount;
24
+ private static assertDoesThrowInvalidParameters;
25
+ private static Outlet;
26
+ }
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __rest = (this && this.__rest) || function (s, e) {
32
+ var t = {};
33
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
34
+ t[p] = s[p];
35
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
36
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
37
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
38
+ t[p[i]] = s[p[i]];
39
+ }
40
+ return t;
41
+ };
42
+ var __importDefault = (this && this.__importDefault) || function (mod) {
43
+ return (mod && mod.__esModule) ? mod : { "default": mod };
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.CHANNEL_FORMATS = void 0;
47
+ const crypto_1 = require("crypto");
48
+ const test_utils_1 = __importStar(require("@sprucelabs/test-utils"));
49
+ const Liblsl_1 = __importDefault(require("../../Liblsl"));
50
+ const LslOutlet_1 = __importDefault(require("../../LslOutlet"));
51
+ exports.CHANNEL_FORMATS = [
52
+ 'undefined',
53
+ 'float32',
54
+ 'double64',
55
+ 'string',
56
+ 'int32',
57
+ 'int16',
58
+ 'int8',
59
+ 'int64',
60
+ ];
61
+ class LslOutletTest extends test_utils_1.default {
62
+ static async beforeEach() {
63
+ await super.beforeEach();
64
+ this.channelIdx = (0, crypto_1.randomInt)(7);
65
+ this.randomOutletOptions = {
66
+ name: (0, test_utils_1.generateId)(),
67
+ type: (0, test_utils_1.generateId)(),
68
+ channelCount: (0, crypto_1.randomInt)(1, 10),
69
+ sampleRate: Math.random() * 10,
70
+ channelFormat: exports.CHANNEL_FORMATS[this.channelIdx],
71
+ sourceId: (0, test_utils_1.generateId)(),
72
+ manufacturer: (0, test_utils_1.generateId)(),
73
+ unit: (0, test_utils_1.generateId)(),
74
+ chunkSize: (0, crypto_1.randomInt)(0, 10),
75
+ maxBuffered: (0, crypto_1.randomInt)(0, 10),
76
+ };
77
+ this.spyLsl = new SpyLiblsl();
78
+ Liblsl_1.default.setInstance(this.spyLsl);
79
+ }
80
+ static async throwsWhenMissingRequiredParameters() {
81
+ //@ts-ignore
82
+ const err = test_utils_1.assert.doesThrow(() => new LslOutlet_1.default());
83
+ test_utils_1.errorAssert.assertError(err, 'MISSING_PARAMETERS', {
84
+ parameters: [
85
+ 'name',
86
+ 'type',
87
+ 'channelCount',
88
+ 'sampleRate',
89
+ 'channelFormat',
90
+ 'sourceId',
91
+ 'manufacturer',
92
+ 'unit',
93
+ 'chunkSize',
94
+ 'maxBuffered',
95
+ ],
96
+ });
97
+ }
98
+ static async canCreateWithRequiredParams() {
99
+ this.Outlet();
100
+ }
101
+ static async throwsWithInvalidChannelCount() {
102
+ this.assertThrowsInvalidChannelCount(0);
103
+ this.assertThrowsInvalidChannelCount(-1);
104
+ this.assertThrowsInvalidChannelCount(1.5);
105
+ }
106
+ static async throwsWithInvalidSampleRate() {
107
+ this.assertThrowsInvalidSampleRate(0);
108
+ this.assertThrowsInvalidSampleRate(-1);
109
+ this.assertThrowsInvalidSampleRate(-1.5);
110
+ }
111
+ static async throwsWithInvalidChannelFormat() {
112
+ //@ts-ignore
113
+ this.assertDoesThrowInvalidParameters({ channelFormat: (0, test_utils_1.generateId)() }, [
114
+ 'channelFormat',
115
+ ]);
116
+ }
117
+ static async supportsAllKnownChannelFormats() {
118
+ const valid = exports.CHANNEL_FORMATS;
119
+ for (const format of valid) {
120
+ this.Outlet({ channelFormat: format });
121
+ }
122
+ }
123
+ static async throwWithInvalidChunkSize() {
124
+ this.Outlet({ chunkSize: 0 });
125
+ this.assertThrowsInvalidChunkSize(-1);
126
+ this.assertThrowsInvalidChunkSize(-1.5);
127
+ this.assertThrowsInvalidChunkSize(1.5);
128
+ }
129
+ static async throwsWithInvalidMaxBuffered() {
130
+ this.Outlet({ maxBuffered: 0 });
131
+ this.assertThrowsInvalidMaxBuffered(-1);
132
+ this.assertThrowsInvalidMaxBuffered(-1.5);
133
+ this.assertThrowsInvalidMaxBuffered(1.5);
134
+ }
135
+ static async pushingSampleSendsToLsl(sample) {
136
+ this.pushSample(sample);
137
+ test_utils_1.assert.isEqual(this.spyLsl.lastPushedOutlet, this.spyLsl.outlet);
138
+ test_utils_1.assert.isEqualDeep(this.spyLsl.lastPushedSample, sample);
139
+ test_utils_1.assert.isEqualDeep(this.spyLsl.lastOutletOptions, {
140
+ info: this.spyLsl.streamInfo,
141
+ chunkSize: this.randomOutletOptions.chunkSize,
142
+ maxBuffered: this.randomOutletOptions.maxBuffered,
143
+ });
144
+ }
145
+ static async pushingSamplePassesCorrectOptionsToCreateStreamInfo() {
146
+ this.pushSample([1]);
147
+ const options = __rest(this.randomOutletOptions, []);
148
+ delete options.manufacturer;
149
+ delete options.unit;
150
+ delete options.chunkSize;
151
+ delete options.maxBuffered;
152
+ test_utils_1.assert.isEqualDeep(this.spyLsl.lastStreamInfoOptions, Object.assign(Object.assign({}, options), { channelFormat: this.channelIdx }));
153
+ }
154
+ static pushSample(sample) {
155
+ const outlet = this.Outlet();
156
+ outlet.pushSample(sample);
157
+ }
158
+ static assertThrowsInvalidMaxBuffered(maxBuffered) {
159
+ this.assertDoesThrowInvalidParameters({ maxBuffered }, ['maxBuffered']);
160
+ }
161
+ static assertThrowsInvalidChunkSize(chunkSize) {
162
+ this.assertDoesThrowInvalidParameters({ chunkSize }, ['chunkSize']);
163
+ }
164
+ static assertThrowsInvalidSampleRate(sampleRate) {
165
+ this.assertDoesThrowInvalidParameters({ sampleRate }, ['sampleRate']);
166
+ }
167
+ static assertThrowsInvalidChannelCount(count) {
168
+ this.assertDoesThrowInvalidParameters({ channelCount: count }, [
169
+ 'channelCount',
170
+ ]);
171
+ }
172
+ static assertDoesThrowInvalidParameters(options, parameters) {
173
+ const err = test_utils_1.assert.doesThrow(() => this.Outlet(options));
174
+ test_utils_1.errorAssert.assertError(err, 'INVALID_PARAMETERS', {
175
+ parameters,
176
+ });
177
+ }
178
+ static Outlet(options) {
179
+ return new LslOutlet_1.default(Object.assign(Object.assign({}, this.randomOutletOptions), options));
180
+ }
181
+ }
182
+ exports.default = LslOutletTest;
183
+ __decorate([
184
+ (0, test_utils_1.test)()
185
+ ], LslOutletTest, "throwsWhenMissingRequiredParameters", null);
186
+ __decorate([
187
+ (0, test_utils_1.test)()
188
+ ], LslOutletTest, "canCreateWithRequiredParams", null);
189
+ __decorate([
190
+ (0, test_utils_1.test)()
191
+ ], LslOutletTest, "throwsWithInvalidChannelCount", null);
192
+ __decorate([
193
+ (0, test_utils_1.test)()
194
+ ], LslOutletTest, "throwsWithInvalidSampleRate", null);
195
+ __decorate([
196
+ (0, test_utils_1.test)()
197
+ ], LslOutletTest, "throwsWithInvalidChannelFormat", null);
198
+ __decorate([
199
+ (0, test_utils_1.test)()
200
+ ], LslOutletTest, "supportsAllKnownChannelFormats", null);
201
+ __decorate([
202
+ (0, test_utils_1.test)()
203
+ ], LslOutletTest, "throwWithInvalidChunkSize", null);
204
+ __decorate([
205
+ (0, test_utils_1.test)()
206
+ ], LslOutletTest, "throwsWithInvalidMaxBuffered", null);
207
+ __decorate([
208
+ (0, test_utils_1.test)('pushing sample sends to lsl 1', [1]),
209
+ (0, test_utils_1.test)('pushing sample sends to lsl 2', [1, 2])
210
+ ], LslOutletTest, "pushingSampleSendsToLsl", null);
211
+ __decorate([
212
+ (0, test_utils_1.test)()
213
+ ], LslOutletTest, "pushingSamplePassesCorrectOptionsToCreateStreamInfo", null);
214
+ class SpyLiblsl {
215
+ constructor() {
216
+ this.outlet = {};
217
+ this.streamInfo = {};
218
+ }
219
+ createStreamInfo(options) {
220
+ this.lastStreamInfoOptions = options;
221
+ return this.streamInfo;
222
+ }
223
+ createOutlet(options) {
224
+ this.lastOutletOptions = options;
225
+ return this.outlet;
226
+ }
227
+ pushSample(outlet, sample) {
228
+ this.lastPushedOutlet = outlet;
229
+ this.lastPushedSample = sample;
230
+ }
231
+ }
232
+ //# sourceMappingURL=LslOutlet.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LslOutlet.test.js","sourceRoot":"","sources":["../../../src/__tests__/behavioral/LslOutlet.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import AbstractSpruceTest from '@sprucelabs/test-utils';
2
+ export default class LiblslTest extends AbstractSpruceTest {
3
+ private static lsl;
4
+ private static libraryPath?;
5
+ private static libraryOptions?;
6
+ private static fakeBindings;
7
+ private static fakeStreamInfo;
8
+ private static fakeOutlet;
9
+ private static createStreamInfoParams?;
10
+ private static createOutletParams?;
11
+ private static pushSampleParams?;
12
+ private static localClock;
13
+ private static shouldThrowWhenCreatingBindings;
14
+ protected static beforeEach(): Promise<void>;
15
+ protected static throwsIfNoEnvSet(): Promise<void>;
16
+ protected static throwsHelpfulErrorWhenBindingsFailToLoad(): Promise<void>;
17
+ protected static worksAsASingleton(): Promise<void>;
18
+ protected static singletonIsTheSame(): Promise<void>;
19
+ protected static canSetInstance(): void;
20
+ protected static createsExpectedBindingsToLiblsl(): Promise<void>;
21
+ protected static createStreamInfoThrowsWithMissingRequiredParams(): void;
22
+ protected static canGetStreamInfoWithRequiredParams(): Promise<void>;
23
+ protected static createOutletThrowsWhenMissingRequiredParams(): Promise<void>;
24
+ protected static canCreateOutletWithRequiredParams(): Promise<void>;
25
+ protected static pushSampleThrowsWhenMissingRequiredParams(): Promise<void>;
26
+ protected static pushSampleCallsBindings(): Promise<void>;
27
+ private static generateRandomCreateStreamInfoOptions;
28
+ }
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || function (mod) {
25
+ if (mod && mod.__esModule) return mod;
26
+ var result = {};
27
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
28
+ __setModuleDefault(result, mod);
29
+ return result;
30
+ };
31
+ var __importDefault = (this && this.__importDefault) || function (mod) {
32
+ return (mod && mod.__esModule) ? mod : { "default": mod };
33
+ };
34
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ const crypto_1 = require("crypto");
36
+ const test_utils_1 = __importStar(require("@sprucelabs/test-utils"));
37
+ const ref_array_napi_1 = __importDefault(require("ref-array-napi"));
38
+ const ref_napi_1 = __importDefault(require("ref-napi"));
39
+ const Liblsl_1 = __importDefault(require("../../Liblsl"));
40
+ class LiblslTest extends test_utils_1.default {
41
+ static async beforeEach() {
42
+ await super.beforeEach();
43
+ delete this.libraryPath;
44
+ delete this.libraryOptions;
45
+ delete this.createStreamInfoParams;
46
+ delete this.createOutletParams;
47
+ delete this.pushSampleParams;
48
+ process.env.LIBLSL_PATH = (0, test_utils_1.generateId)();
49
+ this.fakeStreamInfo = {};
50
+ this.fakeOutlet = {};
51
+ this.localClock = new Date().getTime();
52
+ this.shouldThrowWhenCreatingBindings = false;
53
+ this.fakeBindings = {
54
+ lsl_create_streaminfo: (...params) => {
55
+ this.createStreamInfoParams = params;
56
+ return this.fakeStreamInfo;
57
+ },
58
+ lsl_create_outlet: (...params) => {
59
+ this.createOutletParams = params;
60
+ return this.fakeOutlet;
61
+ },
62
+ lsl_push_sample_ft: (...params) => {
63
+ this.pushSampleParams = params;
64
+ return 0;
65
+ },
66
+ lsl_local_clock: () => this.localClock,
67
+ };
68
+ Liblsl_1.default.ffi = {
69
+ //@ts-ignore
70
+ Library: (path, options) => {
71
+ this.libraryPath = path;
72
+ this.libraryOptions = options;
73
+ if (this.shouldThrowWhenCreatingBindings) {
74
+ throw new Error('Failed to create bindings');
75
+ }
76
+ return this.fakeBindings;
77
+ },
78
+ };
79
+ Liblsl_1.default.reset();
80
+ this.lsl = Liblsl_1.default.getInstance();
81
+ }
82
+ static async throwsIfNoEnvSet() {
83
+ delete process.env.LIBLSL_PATH;
84
+ const err = test_utils_1.assert.doesThrow(() => new Liblsl_1.default());
85
+ test_utils_1.errorAssert.assertError(err, 'MISSING_PARAMETERS', {
86
+ parameters: ['env.LIBLSL_PATH'],
87
+ });
88
+ }
89
+ static async throwsHelpfulErrorWhenBindingsFailToLoad() {
90
+ this.shouldThrowWhenCreatingBindings = true;
91
+ const err = test_utils_1.assert.doesThrow(() => new Liblsl_1.default());
92
+ test_utils_1.errorAssert.assertError(err, 'FAILED_TO_LOAD_LIBLSL', {
93
+ liblslPath: process.env.LIBLSL_PATH,
94
+ });
95
+ }
96
+ static async worksAsASingleton() {
97
+ const liblsl = Liblsl_1.default.getInstance();
98
+ test_utils_1.assert.isInstanceOf(liblsl, Liblsl_1.default);
99
+ }
100
+ static async singletonIsTheSame() {
101
+ test_utils_1.assert.isEqual(Liblsl_1.default.getInstance(), Liblsl_1.default.getInstance());
102
+ }
103
+ static canSetInstance() {
104
+ const fake = new FakeLiblsl();
105
+ Liblsl_1.default.setInstance(fake);
106
+ test_utils_1.assert.isEqual(Liblsl_1.default.getInstance(), fake);
107
+ }
108
+ static async createsExpectedBindingsToLiblsl() {
109
+ process.env.LIBLSL_PATH = (0, test_utils_1.generateId)();
110
+ new Liblsl_1.default();
111
+ test_utils_1.assert.isEqual(this.libraryPath, process.env.LIBLSL_PATH);
112
+ const expected = {
113
+ lsl_create_streaminfo: [
114
+ streamInfo,
115
+ ['string', 'string', 'int', 'double', 'int', 'string'],
116
+ ],
117
+ lsl_create_outlet: [outletType, [streamInfo, 'int', 'int']],
118
+ lsl_local_clock: ['double', []],
119
+ lsl_push_sample_ft: ['void', [outletType, FloatArray, 'double']],
120
+ };
121
+ test_utils_1.assert.isEqual(JSON.stringify(this.libraryOptions), JSON.stringify(expected));
122
+ }
123
+ static createStreamInfoThrowsWithMissingRequiredParams() {
124
+ //@ts-ignore
125
+ const err = test_utils_1.assert.doesThrow(() => this.lsl.createStreamInfo());
126
+ test_utils_1.errorAssert.assertError(err, 'MISSING_PARAMETERS', {
127
+ parameters: [
128
+ 'name',
129
+ 'type',
130
+ 'channelCount',
131
+ 'sampleRate',
132
+ 'channelFormat',
133
+ 'sourceId',
134
+ ],
135
+ });
136
+ }
137
+ static async canGetStreamInfoWithRequiredParams() {
138
+ const options = this.generateRandomCreateStreamInfoOptions();
139
+ const actual = this.lsl.createStreamInfo(options);
140
+ test_utils_1.assert.isEqual(actual, this.fakeStreamInfo);
141
+ test_utils_1.assert.isEqualDeep(this.createStreamInfoParams, Object.values(options));
142
+ }
143
+ static async createOutletThrowsWhenMissingRequiredParams() {
144
+ //@ts-ignore
145
+ const err = test_utils_1.assert.doesThrow(() => this.lsl.createOutlet({}));
146
+ test_utils_1.errorAssert.assertError(err, 'MISSING_PARAMETERS', {
147
+ parameters: ['info', 'chunkSize', 'maxBuffered'],
148
+ });
149
+ }
150
+ static async canCreateOutletWithRequiredParams() {
151
+ const info = this.lsl.createStreamInfo(this.generateRandomCreateStreamInfoOptions());
152
+ const options = {
153
+ info,
154
+ chunkSize: (0, crypto_1.randomInt)(10),
155
+ maxBuffered: (0, crypto_1.randomInt)(10),
156
+ };
157
+ const actual = this.lsl.createOutlet(options);
158
+ test_utils_1.assert.isEqualDeep(this.createOutletParams, Object.values(options));
159
+ test_utils_1.assert.isEqual(actual, this.fakeOutlet);
160
+ }
161
+ static async pushSampleThrowsWhenMissingRequiredParams() {
162
+ //@ts-ignore
163
+ const err = test_utils_1.assert.doesThrow(() => this.lsl.pushSample());
164
+ test_utils_1.errorAssert.assertError(err, 'MISSING_PARAMETERS', {
165
+ parameters: ['outlet', 'sample'],
166
+ });
167
+ }
168
+ static async pushSampleCallsBindings() {
169
+ var _a, _b, _c;
170
+ const expected = [1, 2, 3];
171
+ this.lsl.pushSample(this.fakeOutlet, expected);
172
+ test_utils_1.assert.isEqual((_a = this.pushSampleParams) === null || _a === void 0 ? void 0 : _a[0], this.fakeOutlet);
173
+ test_utils_1.assert.isEqual((_b = this.pushSampleParams) === null || _b === void 0 ? void 0 : _b[1], expected);
174
+ test_utils_1.assert.isEqual((_c = this.pushSampleParams) === null || _c === void 0 ? void 0 : _c[2], this.localClock);
175
+ }
176
+ static generateRandomCreateStreamInfoOptions() {
177
+ return {
178
+ name: (0, test_utils_1.generateId)(),
179
+ type: (0, test_utils_1.generateId)(),
180
+ channelCount: (0, crypto_1.randomInt)(10),
181
+ sampleRate: (0, crypto_1.randomInt)(10),
182
+ channelFormat: (0, crypto_1.randomInt)(10),
183
+ sourceId: (0, test_utils_1.generateId)(),
184
+ };
185
+ }
186
+ }
187
+ exports.default = LiblslTest;
188
+ __decorate([
189
+ (0, test_utils_1.test)()
190
+ ], LiblslTest, "throwsIfNoEnvSet", null);
191
+ __decorate([
192
+ (0, test_utils_1.test)()
193
+ ], LiblslTest, "throwsHelpfulErrorWhenBindingsFailToLoad", null);
194
+ __decorate([
195
+ (0, test_utils_1.test)()
196
+ ], LiblslTest, "worksAsASingleton", null);
197
+ __decorate([
198
+ (0, test_utils_1.test)()
199
+ ], LiblslTest, "singletonIsTheSame", null);
200
+ __decorate([
201
+ (0, test_utils_1.test)()
202
+ ], LiblslTest, "canSetInstance", null);
203
+ __decorate([
204
+ (0, test_utils_1.test)()
205
+ ], LiblslTest, "createsExpectedBindingsToLiblsl", null);
206
+ __decorate([
207
+ (0, test_utils_1.test)()
208
+ ], LiblslTest, "createStreamInfoThrowsWithMissingRequiredParams", null);
209
+ __decorate([
210
+ (0, test_utils_1.test)()
211
+ ], LiblslTest, "canGetStreamInfoWithRequiredParams", null);
212
+ __decorate([
213
+ (0, test_utils_1.test)()
214
+ ], LiblslTest, "createOutletThrowsWhenMissingRequiredParams", null);
215
+ __decorate([
216
+ (0, test_utils_1.test)()
217
+ ], LiblslTest, "canCreateOutletWithRequiredParams", null);
218
+ __decorate([
219
+ (0, test_utils_1.test)()
220
+ ], LiblslTest, "pushSampleThrowsWhenMissingRequiredParams", null);
221
+ __decorate([
222
+ (0, test_utils_1.test)()
223
+ ], LiblslTest, "pushSampleCallsBindings", null);
224
+ class FakeLiblsl {
225
+ createOutlet(_options) {
226
+ return {};
227
+ }
228
+ createStreamInfo(_options) {
229
+ return {};
230
+ }
231
+ pushSample(_sample) { }
232
+ }
233
+ const streamInfo = ref_napi_1.default.refType(ref_napi_1.default.types.void);
234
+ const outletType = ref_napi_1.default.refType(ref_napi_1.default.types.void);
235
+ const FloatArray = (0, ref_array_napi_1.default)(ref_napi_1.default.types.float);
236
+ //# sourceMappingURL=Liblsl.test.js.map