@neurodevs/node-lsl 4.1.0 → 4.1.2
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.
- package/build/LslOutlet.d.ts +2 -11
- package/build/LslOutlet.js +24 -86
- package/build/LslOutlet.js.map +1 -1
- package/build/__tests__/behavioral/LslOutlet.test.js.map +1 -1
- package/build/__tests__/support/consts.d.ts +1 -1
- package/build/__tests__/support/consts.js.map +1 -1
- package/build/assertions.d.ts +6 -0
- package/build/assertions.js +57 -0
- package/build/assertions.js.map +1 -0
- package/build/consts.d.ts +2 -0
- package/build/consts.js +14 -0
- package/build/consts.js.map +1 -0
- package/build/validations.d.ts +4 -0
- package/build/validations.js +20 -0
- package/build/validations.js.map +1 -0
- package/package.json +1 -1
- package/src/LslOutlet.ts +33 -94
- package/src/__tests__/behavioral/LslOutlet.test.ts +3 -3
- package/src/__tests__/support/consts.ts +1 -1
- package/src/assertions.ts +58 -0
- package/src/consts.ts +12 -0
- package/src/validations.ts +15 -0
package/build/LslOutlet.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ChannelFormat } from './consts';
|
|
1
2
|
import { LslSample } from './Liblsl';
|
|
2
3
|
export default class LslOutletImpl implements LslOutlet {
|
|
3
4
|
static Class?: new (options: LslOutletOptions) => LslOutlet;
|
|
@@ -8,19 +9,10 @@ export default class LslOutletImpl implements LslOutlet {
|
|
|
8
9
|
static Outlet(options: LslOutletOptions): LslOutlet;
|
|
9
10
|
destroy(): void;
|
|
10
11
|
pushSample(sample: LslSample): void;
|
|
12
|
+
private getPushMethod;
|
|
11
13
|
private lookupChannelFormat;
|
|
12
|
-
private assertValidMaxBufferred;
|
|
13
|
-
private assertValidChunkSize;
|
|
14
|
-
private assertValidChannelFormat;
|
|
15
|
-
private assertValidSampleRate;
|
|
16
|
-
private assertValidChannelCount;
|
|
17
|
-
private isGreaterThanZero;
|
|
18
|
-
private isPositiveInteger;
|
|
19
|
-
private isPositiveIntegerOrZero;
|
|
20
14
|
private get lsl();
|
|
21
15
|
}
|
|
22
|
-
declare const CHANNEL_FORMATS: readonly ["undefined", "float32", "double64", "string", "int32", "int16", "int8", "int64"];
|
|
23
|
-
export type ChannelFormat = (typeof CHANNEL_FORMATS)[number];
|
|
24
16
|
export interface LslOutlet {
|
|
25
17
|
destroy(): void;
|
|
26
18
|
pushSample(sample: LslSample): void;
|
|
@@ -37,4 +29,3 @@ export interface LslOutletOptions {
|
|
|
37
29
|
chunkSize: number;
|
|
38
30
|
maxBuffered: number;
|
|
39
31
|
}
|
|
40
|
-
export {};
|
package/build/LslOutlet.js
CHANGED
|
@@ -15,6 +15,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
const schema_1 = require("@sprucelabs/schema");
|
|
18
|
+
const assertions_1 = require("./assertions");
|
|
19
|
+
const consts_1 = require("./consts");
|
|
18
20
|
const Liblsl_1 = __importDefault(require("./Liblsl"));
|
|
19
21
|
class LslOutletImpl {
|
|
20
22
|
constructor(options) {
|
|
@@ -34,11 +36,11 @@ class LslOutletImpl {
|
|
|
34
36
|
const _a = this
|
|
35
37
|
.options, { chunkSize, maxBuffered, channelNames } = _a, streamInfoOptions = __rest(_a, ["chunkSize", "maxBuffered", "channelNames"]);
|
|
36
38
|
const channelCount = channelNames.length;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
(0, assertions_1.assertValidChannelCount)(channelCount);
|
|
40
|
+
(0, assertions_1.assertValidSampleRate)(sampleRate);
|
|
41
|
+
(0, assertions_1.assertValidChannelFormat)(channelFormat);
|
|
42
|
+
(0, assertions_1.assertValidChunkSize)(chunkSize);
|
|
43
|
+
(0, assertions_1.assertValidMaxBufferred)(maxBuffered);
|
|
42
44
|
delete streamInfoOptions.manufacturer;
|
|
43
45
|
delete streamInfoOptions.unit;
|
|
44
46
|
this.streamInfo = this.lsl.createStreamInfo(Object.assign(Object.assign({}, streamInfoOptions), { channelCount, channelFormat: this.lookupChannelFormat(channelFormat) }));
|
|
@@ -65,95 +67,31 @@ class LslOutletImpl {
|
|
|
65
67
|
}
|
|
66
68
|
pushSample(sample) {
|
|
67
69
|
const timestamp = this.lsl.localClock();
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
70
|
+
const method = this.getPushMethod();
|
|
71
|
+
this.lsl[method]({
|
|
72
|
+
outlet: this.outlet,
|
|
73
|
+
sample,
|
|
74
|
+
timestamp,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
getPushMethod() {
|
|
78
|
+
const channelFormat = this.options.channelFormat;
|
|
79
|
+
const methodMap = {
|
|
80
|
+
float32: 'pushSampleFt',
|
|
81
|
+
string: 'pushSampleStrt',
|
|
82
|
+
};
|
|
83
|
+
const method = methodMap[channelFormat];
|
|
84
|
+
if (!this.lsl[method]) {
|
|
83
85
|
throw new Error(`This method currently does not support the ${this.options.channelFormat} type! Please implement it.`);
|
|
84
86
|
}
|
|
87
|
+
return method;
|
|
85
88
|
}
|
|
86
89
|
lookupChannelFormat(channelFormat) {
|
|
87
|
-
return CHANNEL_FORMATS.indexOf(channelFormat);
|
|
88
|
-
}
|
|
89
|
-
assertValidMaxBufferred(maxBuffered) {
|
|
90
|
-
if (!this.isPositiveIntegerOrZero(maxBuffered)) {
|
|
91
|
-
throw new schema_1.SchemaError({
|
|
92
|
-
code: 'INVALID_PARAMETERS',
|
|
93
|
-
parameters: ['maxBuffered'],
|
|
94
|
-
friendlyMessage: 'Max buffered must be a positive integer or zero.',
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
assertValidChunkSize(chunkSize) {
|
|
99
|
-
if (!this.isPositiveIntegerOrZero(chunkSize)) {
|
|
100
|
-
throw new schema_1.SchemaError({
|
|
101
|
-
code: 'INVALID_PARAMETERS',
|
|
102
|
-
parameters: ['chunkSize'],
|
|
103
|
-
friendlyMessage: 'Chunk size must be a positive integer or zero.',
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
assertValidChannelFormat(channelFormat) {
|
|
108
|
-
const validFormats = CHANNEL_FORMATS;
|
|
109
|
-
if (validFormats.indexOf(channelFormat) === -1) {
|
|
110
|
-
throw new schema_1.SchemaError({
|
|
111
|
-
code: 'INVALID_PARAMETERS',
|
|
112
|
-
parameters: ['channelFormat'],
|
|
113
|
-
friendlyMessage: 'Channel format must be a valid format.',
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
assertValidSampleRate(sampleRate) {
|
|
118
|
-
if (!this.isGreaterThanZero(sampleRate)) {
|
|
119
|
-
throw new schema_1.SchemaError({
|
|
120
|
-
code: 'INVALID_PARAMETERS',
|
|
121
|
-
parameters: ['sampleRate'],
|
|
122
|
-
friendlyMessage: 'Sample rate must be a positive number or zero.',
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
assertValidChannelCount(channelCount) {
|
|
127
|
-
if (!this.isPositiveInteger(channelCount)) {
|
|
128
|
-
throw new schema_1.SchemaError({
|
|
129
|
-
code: 'INVALID_PARAMETERS',
|
|
130
|
-
parameters: ['channelNames'],
|
|
131
|
-
friendlyMessage: 'channelNames must have 1 or more labels.',
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
isGreaterThanZero(value) {
|
|
136
|
-
return value >= 0;
|
|
137
|
-
}
|
|
138
|
-
isPositiveInteger(value) {
|
|
139
|
-
return Number.isInteger(value) && value > 0;
|
|
140
|
-
}
|
|
141
|
-
isPositiveIntegerOrZero(value) {
|
|
142
|
-
return Number.isInteger(value) && value >= 0;
|
|
90
|
+
return consts_1.CHANNEL_FORMATS.indexOf(channelFormat);
|
|
143
91
|
}
|
|
144
92
|
get lsl() {
|
|
145
93
|
return Liblsl_1.default.getInstance();
|
|
146
94
|
}
|
|
147
95
|
}
|
|
148
96
|
exports.default = LslOutletImpl;
|
|
149
|
-
const CHANNEL_FORMATS = [
|
|
150
|
-
'undefined',
|
|
151
|
-
'float32',
|
|
152
|
-
'double64',
|
|
153
|
-
'string',
|
|
154
|
-
'int32',
|
|
155
|
-
'int16',
|
|
156
|
-
'int8',
|
|
157
|
-
'int64',
|
|
158
|
-
];
|
|
159
97
|
//# sourceMappingURL=LslOutlet.js.map
|
package/build/LslOutlet.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslOutlet.js","sourceRoot":"","sources":["../src/LslOutlet.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"LslOutlet.js","sourceRoot":"","sources":["../src/LslOutlet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslOutlet.test.js","sourceRoot":"","sources":["../../../src/__tests__/behavioral/LslOutlet.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAAkC;AAClC,qEAK+B;AAC/B,0DAAoD;AACpD,
|
|
1
|
+
{"version":3,"file":"LslOutlet.test.js","sourceRoot":"","sources":["../../../src/__tests__/behavioral/LslOutlet.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const TEST_CHANNEL_FORMATS: string
|
|
1
|
+
export declare const TEST_CHANNEL_FORMATS: readonly ["undefined", "float32", "double64", "string", "int32", "int16", "int8", "int64"];
|
|
2
2
|
export type TestChannelFormat = (typeof TEST_CHANNEL_FORMATS)[number];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../../src/__tests__/support/consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG;IACnC,WAAW;IACX,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../../../src/__tests__/support/consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,oBAAoB,GAAG;IACnC,WAAW;IACX,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;CACE,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ChannelFormat } from './consts';
|
|
2
|
+
export declare function assertValidMaxBufferred(maxBuffered: number): void;
|
|
3
|
+
export declare function assertValidChunkSize(chunkSize: number): void;
|
|
4
|
+
export declare function assertValidChannelFormat(channelFormat: ChannelFormat): void;
|
|
5
|
+
export declare function assertValidSampleRate(sampleRate: number): void;
|
|
6
|
+
export declare function assertValidChannelCount(channelCount: number): void;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assertValidChannelCount = exports.assertValidSampleRate = exports.assertValidChannelFormat = exports.assertValidChunkSize = exports.assertValidMaxBufferred = void 0;
|
|
4
|
+
const schema_1 = require("@sprucelabs/schema");
|
|
5
|
+
const consts_1 = require("./consts");
|
|
6
|
+
const validations_1 = require("./validations");
|
|
7
|
+
function assertValidMaxBufferred(maxBuffered) {
|
|
8
|
+
if (!(0, validations_1.isPositiveIntegerOrZero)(maxBuffered)) {
|
|
9
|
+
throw new schema_1.SchemaError({
|
|
10
|
+
code: 'INVALID_PARAMETERS',
|
|
11
|
+
parameters: ['maxBuffered'],
|
|
12
|
+
friendlyMessage: 'Max buffered must be a positive integer or zero.',
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.assertValidMaxBufferred = assertValidMaxBufferred;
|
|
17
|
+
function assertValidChunkSize(chunkSize) {
|
|
18
|
+
if (!(0, validations_1.isPositiveIntegerOrZero)(chunkSize)) {
|
|
19
|
+
throw new schema_1.SchemaError({
|
|
20
|
+
code: 'INVALID_PARAMETERS',
|
|
21
|
+
parameters: ['chunkSize'],
|
|
22
|
+
friendlyMessage: 'Chunk size must be a positive integer or zero.',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.assertValidChunkSize = assertValidChunkSize;
|
|
27
|
+
function assertValidChannelFormat(channelFormat) {
|
|
28
|
+
if (!(0, validations_1.isStringInArray)(channelFormat, consts_1.CHANNEL_FORMATS)) {
|
|
29
|
+
throw new schema_1.SchemaError({
|
|
30
|
+
code: 'INVALID_PARAMETERS',
|
|
31
|
+
parameters: ['channelFormat'],
|
|
32
|
+
friendlyMessage: `Invalid `,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.assertValidChannelFormat = assertValidChannelFormat;
|
|
37
|
+
function assertValidSampleRate(sampleRate) {
|
|
38
|
+
if (!(0, validations_1.isGreaterThanOrEqualToZero)(sampleRate)) {
|
|
39
|
+
throw new schema_1.SchemaError({
|
|
40
|
+
code: 'INVALID_PARAMETERS',
|
|
41
|
+
parameters: ['sampleRate'],
|
|
42
|
+
friendlyMessage: 'Sample rate must be a positive number or zero.',
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.assertValidSampleRate = assertValidSampleRate;
|
|
47
|
+
function assertValidChannelCount(channelCount) {
|
|
48
|
+
if (!(0, validations_1.isPositiveInteger)(channelCount)) {
|
|
49
|
+
throw new schema_1.SchemaError({
|
|
50
|
+
code: 'INVALID_PARAMETERS',
|
|
51
|
+
parameters: ['channelNames'],
|
|
52
|
+
friendlyMessage: 'channelNames must have 1 or more labels.',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.assertValidChannelCount = assertValidChannelCount;
|
|
57
|
+
//# sourceMappingURL=assertions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAChD,qCAAyD;AACzD,+CAKsB;AAEtB,SAAgB,uBAAuB,CAAC,WAAmB;IAC1D,IAAI,CAAC,IAAA,qCAAuB,EAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,oBAAW,CAAC;YACrB,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,CAAC,aAAa,CAAC;YAC3B,eAAe,EAAE,kDAAkD;SACnE,CAAC,CAAA;IACH,CAAC;AACF,CAAC;AARD,0DAQC;AAED,SAAgB,oBAAoB,CAAC,SAAiB;IACrD,IAAI,CAAC,IAAA,qCAAuB,EAAC,SAAS,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,oBAAW,CAAC;YACrB,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,CAAC,WAAW,CAAC;YACzB,eAAe,EAAE,gDAAgD;SACjE,CAAC,CAAA;IACH,CAAC;AACF,CAAC;AARD,oDAQC;AAED,SAAgB,wBAAwB,CAAC,aAA4B;IACpE,IAAI,CAAC,IAAA,6BAAe,EAAC,aAAa,EAAE,wBAAe,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,oBAAW,CAAC;YACrB,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,CAAC,eAAe,CAAC;YAC7B,eAAe,EAAE,UAAU;SAC3B,CAAC,CAAA;IACH,CAAC;AACF,CAAC;AARD,4DAQC;AAED,SAAgB,qBAAqB,CAAC,UAAkB;IACvD,IAAI,CAAC,IAAA,wCAA0B,EAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,oBAAW,CAAC;YACrB,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,CAAC,YAAY,CAAC;YAC1B,eAAe,EAAE,gDAAgD;SACjE,CAAC,CAAA;IACH,CAAC;AACF,CAAC;AARD,sDAQC;AAED,SAAgB,uBAAuB,CAAC,YAAoB;IAC3D,IAAI,CAAC,IAAA,+BAAiB,EAAC,YAAY,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,oBAAW,CAAC;YACrB,IAAI,EAAE,oBAAoB;YAC1B,UAAU,EAAE,CAAC,cAAc,CAAC;YAC5B,eAAe,EAAE,0CAA0C;SAC3D,CAAC,CAAA;IACH,CAAC;AACF,CAAC;AARD,0DAQC"}
|
package/build/consts.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CHANNEL_FORMATS = void 0;
|
|
4
|
+
exports.CHANNEL_FORMATS = [
|
|
5
|
+
'undefined',
|
|
6
|
+
'float32',
|
|
7
|
+
'double64',
|
|
8
|
+
'string',
|
|
9
|
+
'int32',
|
|
10
|
+
'int16',
|
|
11
|
+
'int8',
|
|
12
|
+
'int64',
|
|
13
|
+
];
|
|
14
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,eAAe,GAAG;IAC9B,WAAW;IACX,SAAS;IACT,UAAU;IACV,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;CACE,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function isStringInArray(value: string, array: readonly string[]): boolean;
|
|
2
|
+
export declare function isGreaterThanOrEqualToZero(value: number): boolean;
|
|
3
|
+
export declare function isPositiveInteger(value: number): boolean;
|
|
4
|
+
export declare function isPositiveIntegerOrZero(value: number): boolean;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isPositiveIntegerOrZero = exports.isPositiveInteger = exports.isGreaterThanOrEqualToZero = exports.isStringInArray = void 0;
|
|
4
|
+
function isStringInArray(value, array) {
|
|
5
|
+
return array.indexOf(value) !== -1;
|
|
6
|
+
}
|
|
7
|
+
exports.isStringInArray = isStringInArray;
|
|
8
|
+
function isGreaterThanOrEqualToZero(value) {
|
|
9
|
+
return value >= 0;
|
|
10
|
+
}
|
|
11
|
+
exports.isGreaterThanOrEqualToZero = isGreaterThanOrEqualToZero;
|
|
12
|
+
function isPositiveInteger(value) {
|
|
13
|
+
return Number.isInteger(value) && value > 0;
|
|
14
|
+
}
|
|
15
|
+
exports.isPositiveInteger = isPositiveInteger;
|
|
16
|
+
function isPositiveIntegerOrZero(value) {
|
|
17
|
+
return Number.isInteger(value) && value >= 0;
|
|
18
|
+
}
|
|
19
|
+
exports.isPositiveIntegerOrZero = isPositiveIntegerOrZero;
|
|
20
|
+
//# sourceMappingURL=validations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validations.js","sourceRoot":"","sources":["../src/validations.ts"],"names":[],"mappings":";;;AAAA,SAAgB,eAAe,CAAC,KAAa,EAAE,KAAwB;IACtE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;AACnC,CAAC;AAFD,0CAEC;AAED,SAAgB,0BAA0B,CAAC,KAAa;IACvD,OAAO,KAAK,IAAI,CAAC,CAAA;AAClB,CAAC;AAFD,gEAEC;AAED,SAAgB,iBAAiB,CAAC,KAAa;IAC9C,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAA;AAC5C,CAAC;AAFD,8CAEC;AAED,SAAgB,uBAAuB,CAAC,KAAa;IACpD,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAC7C,CAAC;AAFD,0DAEC"}
|
package/package.json
CHANGED
package/src/LslOutlet.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { assertOptions } from '@sprucelabs/schema'
|
|
2
|
+
import {
|
|
3
|
+
assertValidChannelCount,
|
|
4
|
+
assertValidChannelFormat,
|
|
5
|
+
assertValidChunkSize,
|
|
6
|
+
assertValidMaxBufferred,
|
|
7
|
+
assertValidSampleRate,
|
|
8
|
+
} from './assertions'
|
|
9
|
+
import { CHANNEL_FORMATS, ChannelFormat } from './consts'
|
|
2
10
|
import LiblslImpl, {
|
|
3
11
|
BoundOutlet,
|
|
4
12
|
BoundStreamInfo,
|
|
@@ -33,11 +41,11 @@ export default class LslOutletImpl implements LslOutlet {
|
|
|
33
41
|
|
|
34
42
|
const channelCount = channelNames.length
|
|
35
43
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
44
|
+
assertValidChannelCount(channelCount)
|
|
45
|
+
assertValidSampleRate(sampleRate)
|
|
46
|
+
assertValidChannelFormat(channelFormat)
|
|
47
|
+
assertValidChunkSize(chunkSize)
|
|
48
|
+
assertValidMaxBufferred(maxBuffered)
|
|
41
49
|
|
|
42
50
|
delete streamInfoOptions.manufacturer
|
|
43
51
|
delete streamInfoOptions.unit
|
|
@@ -74,91 +82,35 @@ export default class LslOutletImpl implements LslOutlet {
|
|
|
74
82
|
|
|
75
83
|
public pushSample(sample: LslSample): void {
|
|
76
84
|
const timestamp = this.lsl.localClock()
|
|
85
|
+
const method = this.getPushMethod()
|
|
77
86
|
|
|
78
|
-
|
|
79
|
-
this.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
})
|
|
84
|
-
} else if (this.options.channelFormat === 'string') {
|
|
85
|
-
this.lsl.pushSampleStrt({
|
|
86
|
-
outlet: this.outlet,
|
|
87
|
-
sample: sample as string[],
|
|
88
|
-
timestamp,
|
|
89
|
-
})
|
|
90
|
-
} else {
|
|
91
|
-
throw new Error(
|
|
92
|
-
`This method currently does not support the ${this.options.channelFormat} type! Please implement it.`
|
|
93
|
-
)
|
|
94
|
-
}
|
|
87
|
+
this.lsl[method]({
|
|
88
|
+
outlet: this.outlet,
|
|
89
|
+
sample,
|
|
90
|
+
timestamp,
|
|
91
|
+
} as any)
|
|
95
92
|
}
|
|
96
93
|
|
|
97
|
-
private
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
private assertValidMaxBufferred(maxBuffered: number): void {
|
|
102
|
-
if (!this.isPositiveIntegerOrZero(maxBuffered)) {
|
|
103
|
-
throw new SchemaError({
|
|
104
|
-
code: 'INVALID_PARAMETERS',
|
|
105
|
-
parameters: ['maxBuffered'],
|
|
106
|
-
friendlyMessage: 'Max buffered must be a positive integer or zero.',
|
|
107
|
-
})
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
private assertValidChunkSize(chunkSize: number): void {
|
|
112
|
-
if (!this.isPositiveIntegerOrZero(chunkSize)) {
|
|
113
|
-
throw new SchemaError({
|
|
114
|
-
code: 'INVALID_PARAMETERS',
|
|
115
|
-
parameters: ['chunkSize'],
|
|
116
|
-
friendlyMessage: 'Chunk size must be a positive integer or zero.',
|
|
117
|
-
})
|
|
118
|
-
}
|
|
119
|
-
}
|
|
94
|
+
private getPushMethod() {
|
|
95
|
+
const channelFormat = this.options.channelFormat
|
|
120
96
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
throw new SchemaError({
|
|
125
|
-
code: 'INVALID_PARAMETERS',
|
|
126
|
-
parameters: ['channelFormat'],
|
|
127
|
-
friendlyMessage: 'Channel format must be a valid format.',
|
|
128
|
-
})
|
|
97
|
+
const methodMap: Record<string, keyof Liblsl> = {
|
|
98
|
+
float32: 'pushSampleFt',
|
|
99
|
+
string: 'pushSampleStrt',
|
|
129
100
|
}
|
|
130
|
-
}
|
|
131
101
|
|
|
132
|
-
|
|
133
|
-
if (!this.isGreaterThanZero(sampleRate)) {
|
|
134
|
-
throw new SchemaError({
|
|
135
|
-
code: 'INVALID_PARAMETERS',
|
|
136
|
-
parameters: ['sampleRate'],
|
|
137
|
-
friendlyMessage: 'Sample rate must be a positive number or zero.',
|
|
138
|
-
})
|
|
139
|
-
}
|
|
140
|
-
}
|
|
102
|
+
const method = methodMap[channelFormat]
|
|
141
103
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
parameters: ['channelNames'],
|
|
147
|
-
friendlyMessage: 'channelNames must have 1 or more labels.',
|
|
148
|
-
})
|
|
104
|
+
if (!this.lsl[method]) {
|
|
105
|
+
throw new Error(
|
|
106
|
+
`This method currently does not support the ${this.options.channelFormat} type! Please implement it.`
|
|
107
|
+
)
|
|
149
108
|
}
|
|
109
|
+
return method
|
|
150
110
|
}
|
|
151
111
|
|
|
152
|
-
private
|
|
153
|
-
return
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
private isPositiveInteger(value: number): boolean {
|
|
157
|
-
return Number.isInteger(value) && value > 0
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
private isPositiveIntegerOrZero(value: number): boolean {
|
|
161
|
-
return Number.isInteger(value) && value >= 0
|
|
112
|
+
private lookupChannelFormat(channelFormat: ChannelFormat): number {
|
|
113
|
+
return CHANNEL_FORMATS.indexOf(channelFormat)
|
|
162
114
|
}
|
|
163
115
|
|
|
164
116
|
private get lsl(): Liblsl {
|
|
@@ -166,19 +118,6 @@ export default class LslOutletImpl implements LslOutlet {
|
|
|
166
118
|
}
|
|
167
119
|
}
|
|
168
120
|
|
|
169
|
-
const CHANNEL_FORMATS = [
|
|
170
|
-
'undefined',
|
|
171
|
-
'float32',
|
|
172
|
-
'double64',
|
|
173
|
-
'string',
|
|
174
|
-
'int32',
|
|
175
|
-
'int16',
|
|
176
|
-
'int8',
|
|
177
|
-
'int64',
|
|
178
|
-
] as const
|
|
179
|
-
|
|
180
|
-
export type ChannelFormat = (typeof CHANNEL_FORMATS)[number]
|
|
181
|
-
|
|
182
121
|
export interface LslOutlet {
|
|
183
122
|
destroy(): void
|
|
184
123
|
pushSample(sample: LslSample): void
|
|
@@ -6,8 +6,8 @@ import AbstractSpruceTest, {
|
|
|
6
6
|
generateId,
|
|
7
7
|
} from '@sprucelabs/test-utils'
|
|
8
8
|
import LiblslImpl, { LslSample } from '../../Liblsl'
|
|
9
|
-
import LslOutlet, {
|
|
10
|
-
import { TEST_CHANNEL_FORMATS } from '../support/consts'
|
|
9
|
+
import LslOutlet, { LslOutletOptions } from '../../LslOutlet'
|
|
10
|
+
import { TEST_CHANNEL_FORMATS, TestChannelFormat } from '../support/consts'
|
|
11
11
|
import generateRandomOutletOptions from '../support/generateRandomOutletOptions'
|
|
12
12
|
import { SpyLiblsl } from '../support/SpyLiblsl'
|
|
13
13
|
|
|
@@ -86,7 +86,7 @@ export default class LslOutletTest extends AbstractSpruceTest {
|
|
|
86
86
|
@test()
|
|
87
87
|
protected static async supportsAllKnownChannelFormats() {
|
|
88
88
|
for (const format of TEST_CHANNEL_FORMATS) {
|
|
89
|
-
this.Outlet({ channelFormat: format as
|
|
89
|
+
this.Outlet({ channelFormat: format as TestChannelFormat })
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { SchemaError } from '@sprucelabs/schema'
|
|
2
|
+
import { CHANNEL_FORMATS, ChannelFormat } from './consts'
|
|
3
|
+
import {
|
|
4
|
+
isGreaterThanOrEqualToZero,
|
|
5
|
+
isPositiveInteger,
|
|
6
|
+
isPositiveIntegerOrZero,
|
|
7
|
+
isStringInArray,
|
|
8
|
+
} from './validations'
|
|
9
|
+
|
|
10
|
+
export function assertValidMaxBufferred(maxBuffered: number): void {
|
|
11
|
+
if (!isPositiveIntegerOrZero(maxBuffered)) {
|
|
12
|
+
throw new SchemaError({
|
|
13
|
+
code: 'INVALID_PARAMETERS',
|
|
14
|
+
parameters: ['maxBuffered'],
|
|
15
|
+
friendlyMessage: 'Max buffered must be a positive integer or zero.',
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function assertValidChunkSize(chunkSize: number): void {
|
|
21
|
+
if (!isPositiveIntegerOrZero(chunkSize)) {
|
|
22
|
+
throw new SchemaError({
|
|
23
|
+
code: 'INVALID_PARAMETERS',
|
|
24
|
+
parameters: ['chunkSize'],
|
|
25
|
+
friendlyMessage: 'Chunk size must be a positive integer or zero.',
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function assertValidChannelFormat(channelFormat: ChannelFormat): void {
|
|
31
|
+
if (!isStringInArray(channelFormat, CHANNEL_FORMATS)) {
|
|
32
|
+
throw new SchemaError({
|
|
33
|
+
code: 'INVALID_PARAMETERS',
|
|
34
|
+
parameters: ['channelFormat'],
|
|
35
|
+
friendlyMessage: `Invalid `,
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function assertValidSampleRate(sampleRate: number): void {
|
|
41
|
+
if (!isGreaterThanOrEqualToZero(sampleRate)) {
|
|
42
|
+
throw new SchemaError({
|
|
43
|
+
code: 'INVALID_PARAMETERS',
|
|
44
|
+
parameters: ['sampleRate'],
|
|
45
|
+
friendlyMessage: 'Sample rate must be a positive number or zero.',
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function assertValidChannelCount(channelCount: number): void {
|
|
51
|
+
if (!isPositiveInteger(channelCount)) {
|
|
52
|
+
throw new SchemaError({
|
|
53
|
+
code: 'INVALID_PARAMETERS',
|
|
54
|
+
parameters: ['channelNames'],
|
|
55
|
+
friendlyMessage: 'channelNames must have 1 or more labels.',
|
|
56
|
+
})
|
|
57
|
+
}
|
|
58
|
+
}
|
package/src/consts.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function isStringInArray(value: string, array: readonly string[]) {
|
|
2
|
+
return array.indexOf(value) !== -1
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function isGreaterThanOrEqualToZero(value: number): boolean {
|
|
6
|
+
return value >= 0
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function isPositiveInteger(value: number): boolean {
|
|
10
|
+
return Number.isInteger(value) && value > 0
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function isPositiveIntegerOrZero(value: number): boolean {
|
|
14
|
+
return Number.isInteger(value) && value >= 0
|
|
15
|
+
}
|