@neurodevs/node-lsl 2.0.2 → 3.2.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.
- package/README.md +1 -1
- package/build/Liblsl.d.ts +33 -25
- package/build/Liblsl.js +29 -30
- package/build/Liblsl.js.map +1 -1
- package/build/LslOutlet.d.ts +8 -7
- package/build/LslOutlet.js +28 -21
- package/build/LslOutlet.js.map +1 -1
- package/build/TimeMarkerOutlet.d.ts +4 -0
- package/build/TimeMarkerOutlet.js +26 -0
- package/build/TimeMarkerOutlet.js.map +1 -0
- package/build/__tests__/behavioral/LslOutlet.test.d.ts +10 -12
- package/build/__tests__/behavioral/LslOutlet.test.js +47 -98
- package/build/__tests__/behavioral/LslOutlet.test.js.map +1 -1
- package/build/__tests__/behavioral/TimeMarkerOutlet.test.d.ts +8 -0
- package/build/__tests__/behavioral/TimeMarkerOutlet.test.js +85 -0
- package/build/__tests__/behavioral/TimeMarkerOutlet.test.js.map +1 -0
- package/build/__tests__/implementation/Liblsl.test.d.ts +9 -9
- package/build/__tests__/implementation/Liblsl.test.js +76 -66
- package/build/__tests__/implementation/Liblsl.test.js.map +1 -1
- package/build/__tests__/support/SpyLiblsl.d.ts +14 -0
- package/build/__tests__/support/SpyLiblsl.js +27 -0
- package/build/__tests__/support/SpyLiblsl.js.map +1 -0
- package/build/__tests__/support/consts.d.ts +2 -0
- package/build/__tests__/support/consts.js +14 -0
- package/build/__tests__/support/consts.js.map +1 -0
- package/build/__tests__/support/generateRandomOutletOptions.d.ts +2 -0
- package/build/__tests__/support/generateRandomOutletOptions.js +21 -0
- package/build/__tests__/support/generateRandomOutletOptions.js.map +1 -0
- package/build/errors/SpruceError.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +3 -1
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/Liblsl.ts +76 -73
- package/src/LslOutlet.ts +39 -37
- package/src/TimeMarkerOutlet.ts +19 -0
- package/src/__tests__/behavioral/LslOutlet.test.ts +50 -119
- package/src/__tests__/behavioral/TimeMarkerOutlet.test.ts +54 -0
- package/src/__tests__/implementation/Liblsl.test.ts +96 -84
- package/src/__tests__/support/SpyLiblsl.ts +41 -0
- package/src/__tests__/support/consts.ts +12 -0
- package/src/__tests__/support/generateRandomOutletOptions.ts +19 -0
- package/src/index.ts +2 -0
package/README.md
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# node-lsl
|
|
2
|
-
Lab Streaming Layer (LSL) on Node
|
|
2
|
+
Lab Streaming Layer (LSL) on Node + TypeScript
|
package/build/Liblsl.d.ts
CHANGED
|
@@ -4,22 +4,21 @@ export default class LiblslImpl implements Liblsl {
|
|
|
4
4
|
static ffi: typeof ffi;
|
|
5
5
|
private bindings;
|
|
6
6
|
static getInstance(): Liblsl;
|
|
7
|
-
static reset(): void;
|
|
8
7
|
static setInstance(instance: Liblsl): void;
|
|
8
|
+
static resetInstance(): void;
|
|
9
9
|
constructor();
|
|
10
|
-
appendChannelsToStreamInfo(info: LslBindingsStreamInfo, channels: LslChannel[]): void;
|
|
11
10
|
private loadBindings;
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
createStreamInfo(options: CreateStreamInfoOptions): BoundStreamInfo;
|
|
12
|
+
appendChannelsToStreamInfo(options: AppendChannelsToStreamInfoOptions): void;
|
|
13
|
+
createOutlet(options: CreateOutletOptions): BoundOutlet;
|
|
14
|
+
pushSample(options: PushSampleOptions): void;
|
|
15
15
|
}
|
|
16
16
|
export interface Liblsl {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
createOutlet(options: CreateOutletOptions):
|
|
20
|
-
pushSample(
|
|
17
|
+
createStreamInfo(options: CreateStreamInfoOptions): BoundStreamInfo;
|
|
18
|
+
appendChannelsToStreamInfo(options: AppendChannelsToStreamInfoOptions): void;
|
|
19
|
+
createOutlet(options: CreateOutletOptions): BoundOutlet;
|
|
20
|
+
pushSample(options: PushSampleOptions): void;
|
|
21
21
|
}
|
|
22
|
-
export type LslSample = (number | string | undefined)[];
|
|
23
22
|
export interface CreateStreamInfoOptions {
|
|
24
23
|
name: string;
|
|
25
24
|
type: string;
|
|
@@ -30,30 +29,39 @@ export interface CreateStreamInfoOptions {
|
|
|
30
29
|
manufacturer?: string;
|
|
31
30
|
unit?: string;
|
|
32
31
|
}
|
|
32
|
+
export interface AppendChannelsToStreamInfoOptions {
|
|
33
|
+
info: BoundStreamInfo;
|
|
34
|
+
channels: LslChannel[];
|
|
35
|
+
}
|
|
36
|
+
export interface CreateOutletOptions {
|
|
37
|
+
info: BoundStreamInfo;
|
|
38
|
+
chunkSize: number;
|
|
39
|
+
maxBuffered: number;
|
|
40
|
+
}
|
|
41
|
+
export interface PushSampleOptions {
|
|
42
|
+
outlet: BoundOutlet;
|
|
43
|
+
sample: LslSample;
|
|
44
|
+
}
|
|
33
45
|
export interface LslChannel {
|
|
34
46
|
label: string;
|
|
35
47
|
unit: string;
|
|
36
48
|
type: string;
|
|
37
49
|
}
|
|
50
|
+
export type LslSample = (number | string | undefined)[];
|
|
38
51
|
export interface LiblslBindings {
|
|
39
|
-
lsl_create_streaminfo(name: string, type: string, channelCount: number, sampleRate: number, channelFormat: number, sourceId: string):
|
|
40
|
-
lsl_create_outlet(info:
|
|
41
|
-
lsl_push_sample_ft(outlet:
|
|
52
|
+
lsl_create_streaminfo(name: string, type: string, channelCount: number, sampleRate: number, channelFormat: number, sourceId: string): BoundStreamInfo;
|
|
53
|
+
lsl_create_outlet(info: BoundStreamInfo, chunkSize: number, maxBuffered: number): BoundOutlet;
|
|
54
|
+
lsl_push_sample_ft(outlet: BoundOutlet, sample: LslSample, timestamp: number): void;
|
|
42
55
|
lsl_local_clock(): number;
|
|
43
|
-
lsl_get_desc(info:
|
|
44
|
-
lsl_append_child(desc:
|
|
45
|
-
lsl_append_child_value(child:
|
|
46
|
-
}
|
|
47
|
-
export interface CreateOutletOptions {
|
|
48
|
-
info: LslBindingsStreamInfo;
|
|
49
|
-
chunkSize: number;
|
|
50
|
-
maxBuffered: number;
|
|
56
|
+
lsl_get_desc(info: BoundStreamInfo): BoundDesc;
|
|
57
|
+
lsl_append_child(desc: BoundDesc, name: string): BoundChild;
|
|
58
|
+
lsl_append_child_value(child: BoundChild, name: string, value: string): void;
|
|
51
59
|
}
|
|
52
|
-
export interface
|
|
60
|
+
export interface BoundStreamInfo {
|
|
53
61
|
}
|
|
54
|
-
export interface
|
|
62
|
+
export interface BoundOutlet {
|
|
55
63
|
}
|
|
56
|
-
export interface
|
|
64
|
+
export interface BoundDesc {
|
|
57
65
|
}
|
|
58
|
-
export interface
|
|
66
|
+
export interface BoundChild {
|
|
59
67
|
}
|
package/build/Liblsl.js
CHANGED
|
@@ -11,16 +11,16 @@ const SpruceError_1 = __importDefault(require("./errors/SpruceError"));
|
|
|
11
11
|
class LiblslImpl {
|
|
12
12
|
static getInstance() {
|
|
13
13
|
if (!this.instance) {
|
|
14
|
-
this.
|
|
14
|
+
this.setInstance(new this());
|
|
15
15
|
}
|
|
16
16
|
return this.instance;
|
|
17
17
|
}
|
|
18
|
-
static reset() {
|
|
19
|
-
delete this.instance;
|
|
20
|
-
}
|
|
21
18
|
static setInstance(instance) {
|
|
22
19
|
this.instance = instance;
|
|
23
20
|
}
|
|
21
|
+
static resetInstance() {
|
|
22
|
+
delete this.instance;
|
|
23
|
+
}
|
|
24
24
|
constructor() {
|
|
25
25
|
const path = process.env.LIBLSL_PATH;
|
|
26
26
|
if (!path) {
|
|
@@ -29,25 +29,13 @@ class LiblslImpl {
|
|
|
29
29
|
try {
|
|
30
30
|
this.bindings = this.loadBindings(path);
|
|
31
31
|
}
|
|
32
|
-
catch (
|
|
33
|
-
console.error(err);
|
|
32
|
+
catch (_a) {
|
|
34
33
|
throw new SpruceError_1.default({
|
|
35
34
|
code: 'FAILED_TO_LOAD_LIBLSL',
|
|
36
35
|
liblslPath: path,
|
|
37
36
|
});
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
|
-
appendChannelsToStreamInfo(info, channels) {
|
|
41
|
-
(0, schema_1.assertOptions)({ info, channels }, ['info', 'channels']);
|
|
42
|
-
const desc = this.bindings.lsl_get_desc(info);
|
|
43
|
-
const parent = this.bindings.lsl_append_child(desc, 'channels');
|
|
44
|
-
for (const channel of channels) {
|
|
45
|
-
const c = this.bindings.lsl_append_child(parent, 'channel');
|
|
46
|
-
this.bindings.lsl_append_child_value(c, 'label', channel.label);
|
|
47
|
-
this.bindings.lsl_append_child_value(c, 'unit', channel.unit);
|
|
48
|
-
this.bindings.lsl_append_child_value(c, 'type', channel.type);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
39
|
loadBindings(path) {
|
|
52
40
|
return LiblslImpl.ffi.Library(path, {
|
|
53
41
|
lsl_create_streaminfo: [
|
|
@@ -62,19 +50,6 @@ class LiblslImpl {
|
|
|
62
50
|
lsl_append_child_value: [xmlPtr, [xmlPtr, 'string', 'string']],
|
|
63
51
|
});
|
|
64
52
|
}
|
|
65
|
-
pushSample(outlet, sample) {
|
|
66
|
-
(0, schema_1.assertOptions)({ outlet, sample }, ['outlet', 'sample']);
|
|
67
|
-
const clock = this.bindings.lsl_local_clock();
|
|
68
|
-
this.bindings.lsl_push_sample_ft(outlet, sample, clock);
|
|
69
|
-
}
|
|
70
|
-
createOutlet(options) {
|
|
71
|
-
const { info, chunkSize, maxBuffered } = (0, schema_1.assertOptions)(options, [
|
|
72
|
-
'info',
|
|
73
|
-
'chunkSize',
|
|
74
|
-
'maxBuffered',
|
|
75
|
-
]);
|
|
76
|
-
return this.bindings.lsl_create_outlet(info, chunkSize, maxBuffered);
|
|
77
|
-
}
|
|
78
53
|
createStreamInfo(options) {
|
|
79
54
|
const { name, type, channelCount, sampleRate, channelFormat, sourceId } = (0, schema_1.assertOptions)(options, [
|
|
80
55
|
'name',
|
|
@@ -86,6 +61,30 @@ class LiblslImpl {
|
|
|
86
61
|
]);
|
|
87
62
|
return this.bindings.lsl_create_streaminfo(name, type, channelCount, sampleRate, channelFormat, sourceId);
|
|
88
63
|
}
|
|
64
|
+
appendChannelsToStreamInfo(options) {
|
|
65
|
+
const { info, channels } = (0, schema_1.assertOptions)(options, ['info', 'channels']);
|
|
66
|
+
const desc = this.bindings.lsl_get_desc(info);
|
|
67
|
+
const parent = this.bindings.lsl_append_child(desc, 'channels');
|
|
68
|
+
for (const channel of channels) {
|
|
69
|
+
const child = this.bindings.lsl_append_child(parent, 'channel');
|
|
70
|
+
this.bindings.lsl_append_child_value(child, 'label', channel.label);
|
|
71
|
+
this.bindings.lsl_append_child_value(child, 'unit', channel.unit);
|
|
72
|
+
this.bindings.lsl_append_child_value(child, 'type', channel.type);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
createOutlet(options) {
|
|
76
|
+
const { info, chunkSize, maxBuffered } = (0, schema_1.assertOptions)(options, [
|
|
77
|
+
'info',
|
|
78
|
+
'chunkSize',
|
|
79
|
+
'maxBuffered',
|
|
80
|
+
]);
|
|
81
|
+
return this.bindings.lsl_create_outlet(info, chunkSize, maxBuffered);
|
|
82
|
+
}
|
|
83
|
+
pushSample(options) {
|
|
84
|
+
const { outlet, sample } = (0, schema_1.assertOptions)(options, ['outlet', 'sample']);
|
|
85
|
+
const clock = this.bindings.lsl_local_clock();
|
|
86
|
+
this.bindings.lsl_push_sample_ft(outlet, sample, clock);
|
|
87
|
+
}
|
|
89
88
|
}
|
|
90
89
|
LiblslImpl.ffi = ffi_napi_1.default;
|
|
91
90
|
exports.default = LiblslImpl;
|
package/build/Liblsl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Liblsl.js","sourceRoot":"","sources":["../src/Liblsl.ts"],"names":[],"mappings":";;;;;AAAA,+CAAkD;AAClD,wDAA0B;AAC1B,oEAAsC;AACtC,wDAA0B;AAC1B,uEAA8C;AAE9C,MAAqB,UAAU;IAKvB,MAAM,CAAC,WAAW;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"Liblsl.js","sourceRoot":"","sources":["../src/Liblsl.ts"],"names":[],"mappings":"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"}
|
package/build/LslOutlet.d.ts
CHANGED
|
@@ -6,23 +6,27 @@ export default class LslOutletImpl implements LslOutlet {
|
|
|
6
6
|
private outlet;
|
|
7
7
|
protected constructor(options: LslOutletOptions);
|
|
8
8
|
static Outlet(options: LslOutletOptions): LslOutlet;
|
|
9
|
+
pushSample(sample: LslSample): void;
|
|
10
|
+
private lookupChannelFormat;
|
|
9
11
|
private assertValidMaxBufferred;
|
|
10
12
|
private assertValidChunkSize;
|
|
11
13
|
private assertValidChannelFormat;
|
|
12
14
|
private assertValidSampleRate;
|
|
13
15
|
private assertValidChannelCount;
|
|
14
|
-
private
|
|
15
|
-
private isPositiveIntegerOrZero;
|
|
16
|
+
private isGreaterThanZero;
|
|
16
17
|
private isPositiveInteger;
|
|
18
|
+
private isPositiveIntegerOrZero;
|
|
17
19
|
private get lsl();
|
|
18
|
-
pushSample(sample: LslSample): void;
|
|
19
20
|
}
|
|
20
21
|
declare const CHANNEL_FORMATS: readonly ["undefined", "float32", "double64", "string", "int32", "int16", "int8", "int64"];
|
|
21
22
|
export type ChannelFormat = (typeof CHANNEL_FORMATS)[number];
|
|
23
|
+
export interface LslOutlet {
|
|
24
|
+
pushSample(sample: LslSample): void;
|
|
25
|
+
}
|
|
22
26
|
export interface LslOutletOptions {
|
|
23
27
|
name: string;
|
|
24
28
|
type: string;
|
|
25
|
-
|
|
29
|
+
channelNames: string[];
|
|
26
30
|
sampleRate: number;
|
|
27
31
|
channelFormat: ChannelFormat;
|
|
28
32
|
sourceId: string;
|
|
@@ -31,7 +35,4 @@ export interface LslOutletOptions {
|
|
|
31
35
|
chunkSize: number;
|
|
32
36
|
maxBuffered: number;
|
|
33
37
|
}
|
|
34
|
-
export interface LslOutlet {
|
|
35
|
-
pushSample(sample: LslSample): void;
|
|
36
|
-
}
|
|
37
38
|
export {};
|
package/build/LslOutlet.js
CHANGED
|
@@ -21,7 +21,7 @@ class LslOutletImpl {
|
|
|
21
21
|
const { sampleRate, channelFormat } = (0, schema_1.assertOptions)(options, [
|
|
22
22
|
'name',
|
|
23
23
|
'type',
|
|
24
|
-
'
|
|
24
|
+
'channelNames',
|
|
25
25
|
'sampleRate',
|
|
26
26
|
'channelFormat',
|
|
27
27
|
'sourceId',
|
|
@@ -32,20 +32,24 @@ class LslOutletImpl {
|
|
|
32
32
|
]);
|
|
33
33
|
this.outletOptions = options;
|
|
34
34
|
const _a = this
|
|
35
|
-
.outletOptions, { chunkSize, maxBuffered,
|
|
36
|
-
|
|
35
|
+
.outletOptions, { chunkSize, maxBuffered, channelNames } = _a, streamInfoOptions = __rest(_a, ["chunkSize", "maxBuffered", "channelNames"]);
|
|
36
|
+
const channelCount = channelNames.length;
|
|
37
|
+
this.assertValidChannelCount(channelCount);
|
|
37
38
|
this.assertValidSampleRate(sampleRate);
|
|
38
39
|
this.assertValidChannelFormat(channelFormat);
|
|
39
40
|
this.assertValidChunkSize(chunkSize);
|
|
40
41
|
this.assertValidMaxBufferred(maxBuffered);
|
|
41
42
|
delete streamInfoOptions.manufacturer;
|
|
42
43
|
delete streamInfoOptions.unit;
|
|
43
|
-
this.streamInfo = this.lsl.createStreamInfo(Object.assign(Object.assign({}, streamInfoOptions), { channelCount
|
|
44
|
-
this.lsl.appendChannelsToStreamInfo(
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
this.streamInfo = this.lsl.createStreamInfo(Object.assign(Object.assign({}, streamInfoOptions), { channelCount, channelFormat: this.lookupChannelFormat(channelFormat) }));
|
|
45
|
+
this.lsl.appendChannelsToStreamInfo({
|
|
46
|
+
info: this.streamInfo,
|
|
47
|
+
channels: channelNames.map((label) => ({
|
|
48
|
+
label,
|
|
49
|
+
unit: this.outletOptions.unit,
|
|
50
|
+
type: this.outletOptions.type,
|
|
51
|
+
})),
|
|
52
|
+
});
|
|
49
53
|
this.outlet = this.lsl.createOutlet({
|
|
50
54
|
info: this.streamInfo,
|
|
51
55
|
chunkSize: this.outletOptions.chunkSize,
|
|
@@ -56,6 +60,12 @@ class LslOutletImpl {
|
|
|
56
60
|
var _a;
|
|
57
61
|
return new ((_a = this.Class) !== null && _a !== void 0 ? _a : this)(options);
|
|
58
62
|
}
|
|
63
|
+
pushSample(sample) {
|
|
64
|
+
this.lsl.pushSample({ outlet: this.outlet, sample });
|
|
65
|
+
}
|
|
66
|
+
lookupChannelFormat(channelFormat) {
|
|
67
|
+
return CHANNEL_FORMATS.indexOf(channelFormat);
|
|
68
|
+
}
|
|
59
69
|
assertValidMaxBufferred(maxBuffered) {
|
|
60
70
|
if (!this.isPositiveIntegerOrZero(maxBuffered)) {
|
|
61
71
|
throw new schema_1.SchemaError({
|
|
@@ -85,11 +95,11 @@ class LslOutletImpl {
|
|
|
85
95
|
}
|
|
86
96
|
}
|
|
87
97
|
assertValidSampleRate(sampleRate) {
|
|
88
|
-
if (!this.
|
|
98
|
+
if (!this.isGreaterThanZero(sampleRate)) {
|
|
89
99
|
throw new schema_1.SchemaError({
|
|
90
100
|
code: 'INVALID_PARAMETERS',
|
|
91
101
|
parameters: ['sampleRate'],
|
|
92
|
-
friendlyMessage: 'Sample rate must be a positive number.',
|
|
102
|
+
friendlyMessage: 'Sample rate must be a positive number or zero.',
|
|
93
103
|
});
|
|
94
104
|
}
|
|
95
105
|
}
|
|
@@ -97,26 +107,23 @@ class LslOutletImpl {
|
|
|
97
107
|
if (!this.isPositiveInteger(channelCount)) {
|
|
98
108
|
throw new schema_1.SchemaError({
|
|
99
109
|
code: 'INVALID_PARAMETERS',
|
|
100
|
-
parameters: ['
|
|
101
|
-
friendlyMessage: '
|
|
110
|
+
parameters: ['channelNames'],
|
|
111
|
+
friendlyMessage: 'channelNames must have 1 or more labels.',
|
|
102
112
|
});
|
|
103
113
|
}
|
|
104
114
|
}
|
|
105
|
-
|
|
106
|
-
return value
|
|
107
|
-
}
|
|
108
|
-
isPositiveIntegerOrZero(value) {
|
|
109
|
-
return Number.isInteger(value) && value >= 0;
|
|
115
|
+
isGreaterThanZero(value) {
|
|
116
|
+
return value >= 0;
|
|
110
117
|
}
|
|
111
118
|
isPositiveInteger(value) {
|
|
112
119
|
return Number.isInteger(value) && value > 0;
|
|
113
120
|
}
|
|
121
|
+
isPositiveIntegerOrZero(value) {
|
|
122
|
+
return Number.isInteger(value) && value >= 0;
|
|
123
|
+
}
|
|
114
124
|
get lsl() {
|
|
115
125
|
return Liblsl_1.default.getInstance();
|
|
116
126
|
}
|
|
117
|
-
pushSample(sample) {
|
|
118
|
-
this.lsl.pushSample(this.outlet, sample);
|
|
119
|
-
}
|
|
120
127
|
}
|
|
121
128
|
exports.default = LslOutletImpl;
|
|
122
129
|
const CHANNEL_FORMATS = [
|
package/build/LslOutlet.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslOutlet.js","sourceRoot":"","sources":["../src/LslOutlet.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA+D;AAC/D,
|
|
1
|
+
{"version":3,"file":"LslOutlet.js","sourceRoot":"","sources":["../src/LslOutlet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const LslOutlet_1 = __importDefault(require("./LslOutlet"));
|
|
7
|
+
class TimeMarkerOutlet extends LslOutlet_1.default {
|
|
8
|
+
static Outlet(options) {
|
|
9
|
+
var _a;
|
|
10
|
+
const defaultOptions = {
|
|
11
|
+
name: 'Time markers',
|
|
12
|
+
type: 'Markers',
|
|
13
|
+
channelNames: ['Markers'],
|
|
14
|
+
sampleRate: 0,
|
|
15
|
+
channelFormat: 'string',
|
|
16
|
+
sourceId: 'time-markers',
|
|
17
|
+
manufacturer: 'N/A',
|
|
18
|
+
unit: 'N/A',
|
|
19
|
+
chunkSize: 0,
|
|
20
|
+
maxBuffered: 0,
|
|
21
|
+
};
|
|
22
|
+
return new ((_a = this.Class) !== null && _a !== void 0 ? _a : this)(Object.assign(Object.assign({}, defaultOptions), options));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.default = TimeMarkerOutlet;
|
|
26
|
+
//# sourceMappingURL=TimeMarkerOutlet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeMarkerOutlet.js","sourceRoot":"","sources":["../src/TimeMarkerOutlet.ts"],"names":[],"mappings":";;;;;AAAA,4DAA6D;AAE7D,MAAqB,gBAAiB,SAAQ,mBAAa;IACnD,MAAM,CAAC,MAAM,CAAC,OAAmC;;QACvD,MAAM,cAAc,GAAG;YACtB,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,CAAC,SAAS,CAAC;YACzB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,QAAQ;YACvB,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,KAAK;YACnB,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,CAAC;SACM,CAAA;QACrB,OAAO,IAAI,CAAC,MAAA,IAAI,CAAC,KAAK,mCAAI,IAAI,CAAC,iCAAM,cAAc,GAAK,OAAO,EAAG,CAAA;IACnE,CAAC;CACD;AAhBD,mCAgBC"}
|
|
@@ -1,29 +1,27 @@
|
|
|
1
1
|
import AbstractSpruceTest from '@sprucelabs/test-utils';
|
|
2
2
|
import { LslSample } from '../../Liblsl';
|
|
3
|
-
export declare const CHANNEL_FORMATS: readonly ["undefined", "float32", "double64", "string", "int32", "int16", "int8", "int64"];
|
|
4
3
|
export default class LslOutletTest extends AbstractSpruceTest {
|
|
5
|
-
private static
|
|
4
|
+
private static spyLiblsl;
|
|
6
5
|
private static randomOutletOptions;
|
|
7
|
-
private static
|
|
6
|
+
private static channelFormatIdx;
|
|
8
7
|
protected static beforeEach(): Promise<void>;
|
|
9
|
-
protected static
|
|
10
|
-
protected static
|
|
11
|
-
protected static throwsWithInvalidChannelCount(): Promise<void>;
|
|
8
|
+
protected static throwsWhenMissingRequiredParams(): Promise<void>;
|
|
9
|
+
protected static throwsWithInvalidChannelNames(): Promise<void>;
|
|
12
10
|
protected static throwsWithInvalidSampleRate(): Promise<void>;
|
|
13
11
|
protected static throwsWithInvalidChannelFormat(): Promise<void>;
|
|
14
|
-
protected static
|
|
15
|
-
protected static throwWithInvalidChunkSize(): Promise<void>;
|
|
12
|
+
protected static throwsWithInvalidChunkSize(): Promise<void>;
|
|
16
13
|
protected static throwsWithInvalidMaxBuffered(): Promise<void>;
|
|
17
|
-
protected static
|
|
18
|
-
protected static
|
|
19
|
-
protected static
|
|
14
|
+
protected static supportsAllKnownChannelFormats(): Promise<void>;
|
|
15
|
+
protected static canPushSampleToLsl(sample: LslSample): Promise<void>;
|
|
16
|
+
protected static constructionCreatesStreamInfo(): Promise<void>;
|
|
17
|
+
protected static canOverrideClassInstantiatedInFactory(): Promise<void>;
|
|
20
18
|
protected static appendsChannelsBasedOnCount(labels: string[]): Promise<void>;
|
|
21
19
|
protected static pushSampleShouldNotCreateMultipleOutlets(): Promise<void>;
|
|
22
20
|
private static pushSample;
|
|
23
21
|
private static assertThrowsInvalidMaxBuffered;
|
|
24
22
|
private static assertThrowsInvalidChunkSize;
|
|
25
23
|
private static assertThrowsInvalidSampleRate;
|
|
26
|
-
private static
|
|
24
|
+
private static assertThrowsInvalidChannelNames;
|
|
27
25
|
private static assertDoesThrowInvalidParameters;
|
|
28
26
|
private static Outlet;
|
|
29
27
|
}
|