@neurodevs/node-lsl 13.1.0 → 14.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.
- package/build/__tests__/AbstractPackageTest.js +1 -1
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js +7 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +16 -17
- package/build/impl/LslStreamOutlet.js +55 -66
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +11 -8
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/index.d.ts +2 -2
- package/build/index.js +3 -3
- package/build/index.js.map +1 -1
- package/build/testDoubles/{StreamTransportBridge/FakeStreamTransportBridge.d.ts → WebSocketBridge/FakeWebSocketBridge.d.ts} +2 -2
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js +25 -0
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +1 -0
- package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.d.ts +4 -0
- package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/AbstractPackageTest.ts +1 -1
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +18 -5
- package/src/impl/LslStreamOutlet.ts +88 -88
- package/src/impl/LslWebSocketBridge.ts +15 -12
- package/src/index.ts +3 -3
- package/src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts +31 -0
- package/src/testDoubles/{StreamTransportBridge → WebSocketBridge}/SpyLslWebSocketBridge.ts +2 -2
- package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js +0 -25
- package/build/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.js.map +0 -1
- package/build/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.d.ts +0 -4
- package/build/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.js.map +0 -1
- package/src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts +0 -33
- /package/build/testDoubles/{StreamTransportBridge → WebSocketBridge}/SpyLslWebSocketBridge.js +0 -0
|
@@ -12,7 +12,7 @@ import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo.js';
|
|
|
12
12
|
import FakeStreamInlet from '../testDoubles/StreamInlet/FakeStreamInlet.js';
|
|
13
13
|
import { SpyStreamInlet } from '../testDoubles/StreamInlet/SpyStreamInlet.js';
|
|
14
14
|
import FakeStreamOutlet from '../testDoubles/StreamOutlet/FakeStreamOutlet.js';
|
|
15
|
-
import SpyLslWebSocketBridge from '../testDoubles/
|
|
15
|
+
import SpyLslWebSocketBridge from '../testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js';
|
|
16
16
|
import FakeWebSocketServer from '../testDoubles/WebSockets/FakeWebSocketServer.js';
|
|
17
17
|
export default class AbstractPackageTest extends AbstractModuleTest {
|
|
18
18
|
static fakeLiblsl;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractPackageTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractPackageTest.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,qBAAqB,CAAA;AAGpD,OAAO,aAAa,MAAM,0BAA0B,CAAA;AACpD,OAAO,oBAAoB,MAAM,iCAAiC,CAAA;AAClE,OAAO,aAAa,MAAM,0BAA0B,CAAA;AACpD,OAAO,cAGN,MAAM,2BAA2B,CAAA;AAClC,OAAO,eAAe,MAAM,4BAA4B,CAAA;AACxD,OAAO,kBAAkB,MAAM,+BAA+B,CAAA;AAC9D,OAAO,oBAAoB,MAAM,0DAA0D,CAAA;AAC3F,OAAO,UAAU,MAAM,qCAAqC,CAAA;AAC5D,OAAO,cAAc,MAAM,6CAA6C,CAAA;AACxE,OAAO,aAAa,MAAM,4CAA4C,CAAA;AACtE,OAAO,eAAe,MAAM,+CAA+C,CAAA;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAA;AAC7E,OAAO,gBAAgB,MAAM,iDAAiD,CAAA;AAC9E,OAAO,qBAAqB,MAAM
|
|
1
|
+
{"version":3,"file":"AbstractPackageTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractPackageTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,12 +24,15 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
24
24
|
assert.isTruthy(this.instance, 'Failed to create instance!');
|
|
25
25
|
}
|
|
26
26
|
static async createsLslStreamInlet() {
|
|
27
|
-
const { channelNames, channelFormat, sampleRateHz, chunkSize } = FakeStreamInlet.callsToConstructor[0]?.options ?? {};
|
|
27
|
+
const { channelNames, channelFormat, sampleRateHz, chunkSize, name, type, sourceId, } = FakeStreamInlet.callsToConstructor[0]?.options ?? {};
|
|
28
28
|
assert.isEqualDeep({
|
|
29
29
|
channelNames,
|
|
30
30
|
channelFormat,
|
|
31
31
|
sampleRateHz,
|
|
32
32
|
chunkSize,
|
|
33
|
+
name,
|
|
34
|
+
type,
|
|
35
|
+
sourceId,
|
|
33
36
|
}, this.baseOptions);
|
|
34
37
|
}
|
|
35
38
|
static async activateCallsStartPullingOnInlet() {
|
|
@@ -104,6 +107,9 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
104
107
|
channelFormat: 'float32',
|
|
105
108
|
sampleRateHz: 100 * Math.random(),
|
|
106
109
|
chunkSize: randomInt(1, 100),
|
|
110
|
+
name: this.generateId(),
|
|
111
|
+
type: this.generateId(),
|
|
112
|
+
sourceId: this.generateId(),
|
|
107
113
|
};
|
|
108
114
|
static LslWebSocketBridge(options) {
|
|
109
115
|
return LslWebSocketBridge.Create({ ...this.baseOptions, ...options });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslWebSocketBridge.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/LslWebSocketBridge.test.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAElC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,kBAEN,MAAM,kCAAkC,CAAA;AACzC,OAAO,eAAe,MAAM,kDAAkD,CAAA;AAE9E,OAAO,aAAa,MAAM,+CAA+C,CAAA;AACzE,OAAO,mBAAmB,MAAM,qDAAqD,CAAA;AACrF,OAAO,mBAAmB,MAAM,2BAA2B,CAAA;AAE3D,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,mBAAmB;IAC3D,MAAM,CAAC,QAAQ,CAAuB;IAEpC,MAAM,CAAC,KAAK,CAAC,UAAU;QAC7B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QAExB,IAAI,CAAC,kBAAkB,EAAE,CAAA;QACzB,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAC7B,IAAI,CAAC,wBAAwB,EAAE,CAAA;QAE/B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAA2B,CAAA;IACtE,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,eAAe;QAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAA;IAChE,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,qBAAqB;QACxC,MAAM,
|
|
1
|
+
{"version":3,"file":"LslWebSocketBridge.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/LslWebSocketBridge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,36 +2,35 @@ import { ChannelFormat, LslSample } from './LiblslAdapter.js';
|
|
|
2
2
|
import { StreamInfo } from './LslStreamInfo.js';
|
|
3
3
|
export default class LslStreamOutlet implements StreamOutlet {
|
|
4
4
|
static Class?: StreamOutletConstructor;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly type: string;
|
|
7
|
+
readonly sourceId: string;
|
|
8
|
+
readonly channelNames: string[];
|
|
9
|
+
readonly channelFormat: ChannelFormat;
|
|
10
|
+
readonly channelCount: number;
|
|
11
|
+
readonly sampleRateHz: number;
|
|
12
|
+
readonly chunkSize: number;
|
|
13
|
+
readonly maxBufferedMs: number;
|
|
14
|
+
readonly manufacturer: string;
|
|
15
|
+
readonly units: string;
|
|
5
16
|
private info;
|
|
6
|
-
private options;
|
|
7
17
|
private outlet;
|
|
8
18
|
private pushSampleMethod;
|
|
9
19
|
protected constructor(info: StreamInfo, options: StreamOutletOptions);
|
|
10
20
|
static Create(options: StreamOutletOptions): Promise<StreamOutlet>;
|
|
11
21
|
private validateOptions;
|
|
12
|
-
private createStreamOutlet;
|
|
13
|
-
private setPushSampleMethod;
|
|
14
22
|
private validateChannelFormat;
|
|
23
|
+
private get isChannelFormatSupported();
|
|
15
24
|
private throwUnsupportedChannelFormat;
|
|
16
|
-
private
|
|
25
|
+
private createStreamOutlet;
|
|
26
|
+
private get boundStreamInfo();
|
|
27
|
+
private setPushSampleMethod;
|
|
17
28
|
private get pushMethod();
|
|
18
29
|
private readonly methodMap;
|
|
19
30
|
pushSample(sample: LslSample): void;
|
|
20
31
|
destroy(): void;
|
|
21
|
-
get name(): string;
|
|
22
|
-
get type(): string;
|
|
23
|
-
get sourceId(): string;
|
|
24
|
-
get channelNames(): string[];
|
|
25
|
-
get channelCount(): number;
|
|
26
|
-
get channelFormat(): "string" | "undefined" | "float32" | "double64" | "int32" | "int16" | "int8" | "int64";
|
|
27
|
-
get sampleRateHz(): number;
|
|
28
|
-
get chunkSize(): number;
|
|
29
|
-
get maxBufferedMs(): number;
|
|
30
|
-
get manufacturer(): string;
|
|
31
|
-
get units(): string;
|
|
32
|
-
private get boundStreamInfo();
|
|
33
32
|
private get lsl();
|
|
34
|
-
private static
|
|
33
|
+
private static waitToAllowSetup;
|
|
35
34
|
private static LslStreamInfo;
|
|
36
35
|
}
|
|
37
36
|
export interface StreamOutlet {
|
|
@@ -4,31 +4,43 @@ import LiblslAdapter from './LiblslAdapter.js';
|
|
|
4
4
|
import LslStreamInfo from './LslStreamInfo.js';
|
|
5
5
|
export default class LslStreamOutlet {
|
|
6
6
|
static Class;
|
|
7
|
+
name;
|
|
8
|
+
type;
|
|
9
|
+
sourceId;
|
|
10
|
+
channelNames;
|
|
11
|
+
channelFormat;
|
|
12
|
+
channelCount;
|
|
13
|
+
sampleRateHz;
|
|
14
|
+
chunkSize;
|
|
15
|
+
maxBufferedMs = 360 * 1000;
|
|
16
|
+
manufacturer = 'N/A';
|
|
17
|
+
units = 'N/A';
|
|
7
18
|
info;
|
|
8
|
-
options;
|
|
9
19
|
outlet;
|
|
10
20
|
pushSampleMethod;
|
|
11
21
|
constructor(info, options) {
|
|
22
|
+
const { name, type, sourceId, channelNames, channelFormat, sampleRateHz, chunkSize, maxBufferedMs, manufacturer, units, } = options;
|
|
12
23
|
this.info = info;
|
|
13
|
-
this.
|
|
24
|
+
this.name = name;
|
|
25
|
+
this.type = type;
|
|
26
|
+
this.sourceId = sourceId;
|
|
27
|
+
this.channelNames = channelNames;
|
|
28
|
+
this.channelFormat = channelFormat;
|
|
29
|
+
this.channelCount = channelNames.length;
|
|
30
|
+
this.sampleRateHz = sampleRateHz;
|
|
31
|
+
this.chunkSize = chunkSize;
|
|
32
|
+
this.maxBufferedMs = maxBufferedMs ?? this.maxBufferedMs;
|
|
33
|
+
this.manufacturer = manufacturer ?? this.manufacturer;
|
|
34
|
+
this.units = units ?? this.units;
|
|
14
35
|
this.validateOptions();
|
|
15
36
|
this.createStreamOutlet();
|
|
16
37
|
this.setPushSampleMethod();
|
|
17
38
|
}
|
|
18
39
|
static async Create(options) {
|
|
19
40
|
const { waitAfterConstructionMs = 10 } = options ?? {};
|
|
20
|
-
const
|
|
21
|
-
channelNames: options.channelNames,
|
|
22
|
-
channelFormat: options.channelFormat,
|
|
23
|
-
sampleRateHz: options.sampleRateHz,
|
|
24
|
-
name: options.name,
|
|
25
|
-
type: options.type,
|
|
26
|
-
sourceId: options.sourceId,
|
|
27
|
-
units: options.units,
|
|
28
|
-
};
|
|
29
|
-
const info = this.LslStreamInfo(infoOptions);
|
|
41
|
+
const info = this.LslStreamInfo(options);
|
|
30
42
|
const instance = new (this.Class ?? this)(info, options);
|
|
31
|
-
await this.
|
|
43
|
+
await this.waitToAllowSetup(waitAfterConstructionMs);
|
|
32
44
|
return instance;
|
|
33
45
|
}
|
|
34
46
|
validateOptions() {
|
|
@@ -37,6 +49,18 @@ export default class LslStreamOutlet {
|
|
|
37
49
|
assertValidChannelFormat(this.channelFormat);
|
|
38
50
|
assertValidChunkSize(this.chunkSize);
|
|
39
51
|
assertValidMaxBufferedMs(this.maxBufferedMs);
|
|
52
|
+
this.validateChannelFormat();
|
|
53
|
+
}
|
|
54
|
+
validateChannelFormat() {
|
|
55
|
+
if (!this.isChannelFormatSupported) {
|
|
56
|
+
this.throwUnsupportedChannelFormat();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
get isChannelFormatSupported() {
|
|
60
|
+
return this.channelFormat in this.methodMap;
|
|
61
|
+
}
|
|
62
|
+
throwUnsupportedChannelFormat() {
|
|
63
|
+
throw new Error(`This method currently does not support the ${this.channelFormat} type! Please implement it.`);
|
|
40
64
|
}
|
|
41
65
|
createStreamOutlet() {
|
|
42
66
|
this.outlet = this.lsl.createOutlet({
|
|
@@ -45,21 +69,12 @@ export default class LslStreamOutlet {
|
|
|
45
69
|
maxBufferedMs: this.maxBufferedMs,
|
|
46
70
|
});
|
|
47
71
|
}
|
|
72
|
+
get boundStreamInfo() {
|
|
73
|
+
return this.info.boundStreamInfo;
|
|
74
|
+
}
|
|
48
75
|
setPushSampleMethod() {
|
|
49
|
-
this.validateChannelFormat();
|
|
50
76
|
this.pushSampleMethod = this.lsl[this.pushMethod].bind(this.lsl);
|
|
51
77
|
}
|
|
52
|
-
validateChannelFormat() {
|
|
53
|
-
if (!(this.channelFormat in this.methodMap)) {
|
|
54
|
-
this.throwUnsupportedChannelFormat();
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
throwUnsupportedChannelFormat() {
|
|
58
|
-
throw new Error(this.unsupportedChannelMessage);
|
|
59
|
-
}
|
|
60
|
-
get unsupportedChannelMessage() {
|
|
61
|
-
return `This method currently does not support the ${this.channelFormat} type! Please implement it.`;
|
|
62
|
-
}
|
|
63
78
|
get pushMethod() {
|
|
64
79
|
return this.methodMap[this.channelFormat];
|
|
65
80
|
}
|
|
@@ -69,59 +84,33 @@ export default class LslStreamOutlet {
|
|
|
69
84
|
};
|
|
70
85
|
pushSample(sample) {
|
|
71
86
|
const timestamp = this.lsl.localClock();
|
|
72
|
-
|
|
87
|
+
const err = this.pushSampleMethod({
|
|
73
88
|
outlet: this.outlet,
|
|
74
89
|
sample,
|
|
75
90
|
timestamp,
|
|
76
|
-
})
|
|
91
|
+
});
|
|
92
|
+
handleError(err);
|
|
77
93
|
}
|
|
78
94
|
destroy() {
|
|
79
95
|
this.lsl.destroyOutlet({ outlet: this.outlet });
|
|
80
96
|
}
|
|
81
|
-
get name() {
|
|
82
|
-
return this.options.name;
|
|
83
|
-
}
|
|
84
|
-
get type() {
|
|
85
|
-
return this.options.type;
|
|
86
|
-
}
|
|
87
|
-
get sourceId() {
|
|
88
|
-
return this.options.sourceId;
|
|
89
|
-
}
|
|
90
|
-
get channelNames() {
|
|
91
|
-
return this.options.channelNames;
|
|
92
|
-
}
|
|
93
|
-
get channelCount() {
|
|
94
|
-
return this.channelNames.length;
|
|
95
|
-
}
|
|
96
|
-
get channelFormat() {
|
|
97
|
-
return this.options.channelFormat;
|
|
98
|
-
}
|
|
99
|
-
get sampleRateHz() {
|
|
100
|
-
return this.options.sampleRateHz;
|
|
101
|
-
}
|
|
102
|
-
get chunkSize() {
|
|
103
|
-
return this.options.chunkSize;
|
|
104
|
-
}
|
|
105
|
-
get maxBufferedMs() {
|
|
106
|
-
return this.options.maxBufferedMs ?? 360 * 1000;
|
|
107
|
-
}
|
|
108
|
-
get manufacturer() {
|
|
109
|
-
return this.options.manufacturer ?? 'N/A';
|
|
110
|
-
}
|
|
111
|
-
get units() {
|
|
112
|
-
return this.options.units ?? 'N/A';
|
|
113
|
-
}
|
|
114
|
-
get boundStreamInfo() {
|
|
115
|
-
return this.info.boundStreamInfo;
|
|
116
|
-
}
|
|
117
97
|
get lsl() {
|
|
118
98
|
return LiblslAdapter.getInstance();
|
|
119
99
|
}
|
|
120
|
-
static async
|
|
121
|
-
|
|
100
|
+
static async waitToAllowSetup(waitAfterConstructionMs) {
|
|
101
|
+
await new Promise((resolve) => setTimeout(resolve, waitAfterConstructionMs));
|
|
122
102
|
}
|
|
123
103
|
static LslStreamInfo(options) {
|
|
124
|
-
|
|
104
|
+
const { channelNames, channelFormat, sampleRateHz, name, type, sourceId, units, } = options;
|
|
105
|
+
return LslStreamInfo.Create({
|
|
106
|
+
name,
|
|
107
|
+
type,
|
|
108
|
+
sourceId,
|
|
109
|
+
channelNames,
|
|
110
|
+
channelFormat,
|
|
111
|
+
sampleRateHz,
|
|
112
|
+
units,
|
|
113
|
+
});
|
|
125
114
|
}
|
|
126
115
|
}
|
|
127
116
|
//# sourceMappingURL=LslStreamOutlet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslStreamOutlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamOutlet.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,GAC1B,MAAM,kBAAkB,CAAA;AACzB,OAAO,WAA6B,MAAM,mBAAmB,CAAA;AAO7D,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAC9C,OAAO,aAGN,MAAM,oBAAoB,CAAA;AAE3B,MAAM,CAAC,OAAO,OAAO,eAAe;IACzB,MAAM,CAAC,KAAK,CAA0B;
|
|
1
|
+
{"version":3,"file":"LslStreamOutlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamOutlet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { WebSocketServer } from 'ws';
|
|
2
2
|
import { ChannelFormat } from './LiblslAdapter.js';
|
|
3
3
|
import { StreamInlet } from './LslStreamInlet.js';
|
|
4
|
-
export default class LslWebSocketBridge implements
|
|
5
|
-
static Class?:
|
|
4
|
+
export default class LslWebSocketBridge implements WebSocketBridge {
|
|
5
|
+
static Class?: WebSocketBridgeConstructor;
|
|
6
6
|
static WSS: typeof import("ws").Server;
|
|
7
7
|
private inlet;
|
|
8
8
|
private wss;
|
|
9
9
|
private isDestroyed;
|
|
10
|
-
protected constructor(options:
|
|
11
|
-
static Create(options:
|
|
10
|
+
protected constructor(options: WebSocketBridgeConstructorOptions);
|
|
11
|
+
static Create(options: WebSocketBridgeOptions): WebSocketBridge;
|
|
12
12
|
activate(): void;
|
|
13
13
|
private throwIfBridgeIsDestroyed;
|
|
14
14
|
private startPullingData;
|
|
@@ -22,20 +22,23 @@ export default class LslWebSocketBridge implements StreamTransportBridge {
|
|
|
22
22
|
private static LslStreamInlet;
|
|
23
23
|
private static WebSocketServer;
|
|
24
24
|
}
|
|
25
|
-
export interface
|
|
25
|
+
export interface WebSocketBridge {
|
|
26
26
|
activate(): void;
|
|
27
27
|
deactivate(): void;
|
|
28
28
|
destroy(): void;
|
|
29
29
|
}
|
|
30
|
-
export type
|
|
31
|
-
export interface
|
|
30
|
+
export type WebSocketBridgeConstructor = new (options: WebSocketBridgeConstructorOptions) => WebSocketBridge;
|
|
31
|
+
export interface WebSocketBridgeOptions {
|
|
32
32
|
channelNames: string[];
|
|
33
33
|
channelFormat: ChannelFormat;
|
|
34
34
|
sampleRateHz: number;
|
|
35
35
|
chunkSize: number;
|
|
36
|
+
name?: string;
|
|
37
|
+
type?: string;
|
|
38
|
+
sourceId?: string;
|
|
36
39
|
wssPort?: number;
|
|
37
40
|
}
|
|
38
|
-
export interface
|
|
41
|
+
export interface WebSocketBridgeConstructorOptions extends WebSocketBridgeOptions {
|
|
39
42
|
inlet: StreamInlet;
|
|
40
43
|
wss: WebSocketServer;
|
|
41
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslWebSocketBridge.js","sourceRoot":"","sources":["../../src/impl/LslWebSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAA;AAEpC,OAAO,cAA+B,MAAM,qBAAqB,CAAA;AAEjE,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAC5B,MAAM,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"LslWebSocketBridge.js","sourceRoot":"","sources":["../../src/impl/LslWebSocketBridge.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -28,8 +28,8 @@ export { default as FakeStreamOutlet } from './testDoubles/StreamOutlet/FakeStre
|
|
|
28
28
|
export * from './testDoubles/StreamOutlet/FakeStreamOutlet.js';
|
|
29
29
|
export { default as LslWebSocketBridge } from './impl/LslWebSocketBridge.js';
|
|
30
30
|
export * from './impl/LslWebSocketBridge.js';
|
|
31
|
-
export { default as
|
|
32
|
-
export * from './testDoubles/
|
|
31
|
+
export { default as FakeWebSocketBridge } from './testDoubles/WebSocketBridge/FakeWebSocketBridge.js';
|
|
32
|
+
export * from './testDoubles/WebSocketBridge/FakeWebSocketBridge.js';
|
|
33
33
|
export { default as generateRandomOutletOptions } from './testDoubles/generateRandomOutletOptions.js';
|
|
34
34
|
export { default as FakeWebSocket } from './testDoubles/WebSockets/FakeWebSocket.js';
|
|
35
35
|
export * from './testDoubles/WebSockets/FakeWebSocket.js';
|
package/build/index.js
CHANGED
|
@@ -31,11 +31,11 @@ export { default as LslStreamOutlet } from './impl/LslStreamOutlet.js';
|
|
|
31
31
|
export * from './impl/LslStreamOutlet.js';
|
|
32
32
|
export { default as FakeStreamOutlet } from './testDoubles/StreamOutlet/FakeStreamOutlet.js';
|
|
33
33
|
export * from './testDoubles/StreamOutlet/FakeStreamOutlet.js';
|
|
34
|
-
//
|
|
34
|
+
// WebSocketBridge
|
|
35
35
|
export { default as LslWebSocketBridge } from './impl/LslWebSocketBridge.js';
|
|
36
36
|
export * from './impl/LslWebSocketBridge.js';
|
|
37
|
-
export { default as
|
|
38
|
-
export * from './testDoubles/
|
|
37
|
+
export { default as FakeWebSocketBridge } from './testDoubles/WebSocketBridge/FakeWebSocketBridge.js';
|
|
38
|
+
export * from './testDoubles/WebSocketBridge/FakeWebSocketBridge.js';
|
|
39
39
|
// Utils
|
|
40
40
|
export { default as generateRandomOutletOptions } from './testDoubles/generateRandomOutletOptions.js';
|
|
41
41
|
// WebSockets
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAChF,cAAc,gCAAgC,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0DAA0D,CAAA;AAC3G,cAAc,0DAA0D,CAAA;AAExE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0DAA0D,CAAA;AAC3G,cAAc,0DAA0D,CAAA;AAExE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yDAAyD,CAAA;AACzG,cAAc,yDAAyD,CAAA;AAEvE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,8DAA8D,CAAA;AACnH,cAAc,8DAA8D,CAAA;AAE5E,SAAS;AAET,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC1E,cAAc,oCAAoC,CAAA;AAElD,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,cAAc;AAEd,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,8CAA8C,CAAA;AACzF,cAAc,8CAA8C,CAAA;AAE5D,eAAe;AAEf,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAA;AACtE,cAAc,2BAA2B,CAAA;AAEzC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,cAAc,gDAAgD,CAAA;AAE9D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAChF,cAAc,gCAAgC,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0DAA0D,CAAA;AAC3G,cAAc,0DAA0D,CAAA;AAExE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0DAA0D,CAAA;AAC3G,cAAc,0DAA0D,CAAA;AAExE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,yDAAyD,CAAA;AACzG,cAAc,yDAAyD,CAAA;AAEvE,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,8DAA8D,CAAA;AACnH,cAAc,8DAA8D,CAAA;AAE5E,SAAS;AAET,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAC1E,cAAc,oCAAoC,CAAA;AAElD,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,cAAc;AAEd,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,8CAA8C,CAAA;AACzF,cAAc,8CAA8C,CAAA;AAE5D,eAAe;AAEf,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAA;AACtE,cAAc,2BAA2B,CAAA;AAEzC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,cAAc,gDAAgD,CAAA;AAE9D,kBAAkB;AAElB,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC5E,cAAc,8BAA8B,CAAA;AAE5C,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sDAAsD,CAAA;AACrG,cAAc,sDAAsD,CAAA;AAEpE,QAAQ;AAER,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,8CAA8C,CAAA;AAErG,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iDAAiD,CAAA;AAChG,cAAc,iDAAiD,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default class
|
|
1
|
+
import { WebSocketBridge } from '../../impl/LslWebSocketBridge.js';
|
|
2
|
+
export default class FakeWebSocketBridge implements WebSocketBridge {
|
|
3
3
|
static numCallsToConstructor: number;
|
|
4
4
|
static numCallsToActivate: number;
|
|
5
5
|
static numCallsToDeactivate: number;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export default class FakeWebSocketBridge {
|
|
2
|
+
static numCallsToConstructor = 0;
|
|
3
|
+
static numCallsToActivate = 0;
|
|
4
|
+
static numCallsToDeactivate = 0;
|
|
5
|
+
static numCallsToDestroy = 0;
|
|
6
|
+
constructor() {
|
|
7
|
+
FakeWebSocketBridge.numCallsToConstructor++;
|
|
8
|
+
}
|
|
9
|
+
activate() {
|
|
10
|
+
FakeWebSocketBridge.numCallsToActivate++;
|
|
11
|
+
}
|
|
12
|
+
deactivate() {
|
|
13
|
+
FakeWebSocketBridge.numCallsToDeactivate++;
|
|
14
|
+
}
|
|
15
|
+
destroy() {
|
|
16
|
+
FakeWebSocketBridge.numCallsToDestroy++;
|
|
17
|
+
}
|
|
18
|
+
static resetTestDouble() {
|
|
19
|
+
FakeWebSocketBridge.numCallsToConstructor = 0;
|
|
20
|
+
FakeWebSocketBridge.numCallsToActivate = 0;
|
|
21
|
+
FakeWebSocketBridge.numCallsToDeactivate = 0;
|
|
22
|
+
FakeWebSocketBridge.numCallsToDestroy = 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=FakeWebSocketBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FakeWebSocketBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC7B,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAA;IAChC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAA;IAC7B,MAAM,CAAC,oBAAoB,GAAG,CAAC,CAAA;IAC/B,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAEnC;QACI,mBAAmB,CAAC,qBAAqB,EAAE,CAAA;IAC/C,CAAC;IAEM,QAAQ;QACX,mBAAmB,CAAC,kBAAkB,EAAE,CAAA;IAC5C,CAAC;IAEM,UAAU;QACb,mBAAmB,CAAC,oBAAoB,EAAE,CAAA;IAC9C,CAAC;IAEM,OAAO;QACV,mBAAmB,CAAC,iBAAiB,EAAE,CAAA;IAC3C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,mBAAmB,CAAC,qBAAqB,GAAG,CAAC,CAAA;QAC7C,mBAAmB,CAAC,kBAAkB,GAAG,CAAC,CAAA;QAC1C,mBAAmB,CAAC,oBAAoB,GAAG,CAAC,CAAA;QAC5C,mBAAmB,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpyLslWebSocketBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,kBAEN,MAAM,kCAAkC,CAAA;AAEzC,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,kBAAkB;IACjE,YAAmB,OAA0C;QACzD,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;CACJ"}
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@ import SpyStreamInfo from '../testDoubles/StreamInfo/SpyStreamInfo.js'
|
|
|
17
17
|
import FakeStreamInlet from '../testDoubles/StreamInlet/FakeStreamInlet.js'
|
|
18
18
|
import { SpyStreamInlet } from '../testDoubles/StreamInlet/SpyStreamInlet.js'
|
|
19
19
|
import FakeStreamOutlet from '../testDoubles/StreamOutlet/FakeStreamOutlet.js'
|
|
20
|
-
import SpyLslWebSocketBridge from '../testDoubles/
|
|
20
|
+
import SpyLslWebSocketBridge from '../testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js'
|
|
21
21
|
import FakeWebSocketServer from '../testDoubles/WebSockets/FakeWebSocketServer.js'
|
|
22
22
|
|
|
23
23
|
export default class AbstractPackageTest extends AbstractModuleTest {
|
|
@@ -3,10 +3,10 @@ import { randomInt } from 'crypto'
|
|
|
3
3
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
4
4
|
|
|
5
5
|
import LslWebSocketBridge, {
|
|
6
|
-
|
|
6
|
+
WebSocketBridgeOptions,
|
|
7
7
|
} from '../../impl/LslWebSocketBridge.js'
|
|
8
8
|
import FakeStreamInlet from '../../testDoubles/StreamInlet/FakeStreamInlet.js'
|
|
9
|
-
import SpyLslWebSocketBridge from '../../testDoubles/
|
|
9
|
+
import SpyLslWebSocketBridge from '../../testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js'
|
|
10
10
|
import FakeWebSocket from '../../testDoubles/WebSockets/FakeWebSocket.js'
|
|
11
11
|
import FakeWebSocketServer from '../../testDoubles/WebSockets/FakeWebSocketServer.js'
|
|
12
12
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
@@ -31,8 +31,15 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
31
31
|
|
|
32
32
|
@test()
|
|
33
33
|
protected static async createsLslStreamInlet() {
|
|
34
|
-
const {
|
|
35
|
-
|
|
34
|
+
const {
|
|
35
|
+
channelNames,
|
|
36
|
+
channelFormat,
|
|
37
|
+
sampleRateHz,
|
|
38
|
+
chunkSize,
|
|
39
|
+
name,
|
|
40
|
+
type,
|
|
41
|
+
sourceId,
|
|
42
|
+
} = FakeStreamInlet.callsToConstructor[0]?.options ?? {}
|
|
36
43
|
|
|
37
44
|
assert.isEqualDeep(
|
|
38
45
|
{
|
|
@@ -40,6 +47,9 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
40
47
|
channelFormat,
|
|
41
48
|
sampleRateHz,
|
|
42
49
|
chunkSize,
|
|
50
|
+
name,
|
|
51
|
+
type,
|
|
52
|
+
sourceId,
|
|
43
53
|
},
|
|
44
54
|
this.baseOptions
|
|
45
55
|
)
|
|
@@ -188,10 +198,13 @@ export default class LslWebSocketBridgeTest extends AbstractPackageTest {
|
|
|
188
198
|
channelFormat: 'float32' as const,
|
|
189
199
|
sampleRateHz: 100 * Math.random(),
|
|
190
200
|
chunkSize: randomInt(1, 100),
|
|
201
|
+
name: this.generateId(),
|
|
202
|
+
type: this.generateId(),
|
|
203
|
+
sourceId: this.generateId(),
|
|
191
204
|
}
|
|
192
205
|
|
|
193
206
|
private static LslWebSocketBridge(
|
|
194
|
-
options?: Partial<
|
|
207
|
+
options?: Partial<WebSocketBridgeOptions>
|
|
195
208
|
) {
|
|
196
209
|
return LslWebSocketBridge.Create({ ...this.baseOptions, ...options })
|
|
197
210
|
}
|
|
@@ -21,14 +21,48 @@ import LslStreamInfo, {
|
|
|
21
21
|
export default class LslStreamOutlet implements StreamOutlet {
|
|
22
22
|
public static Class?: StreamOutletConstructor
|
|
23
23
|
|
|
24
|
+
public readonly name: string
|
|
25
|
+
public readonly type: string
|
|
26
|
+
public readonly sourceId: string
|
|
27
|
+
public readonly channelNames: string[]
|
|
28
|
+
public readonly channelFormat: ChannelFormat
|
|
29
|
+
public readonly channelCount: number
|
|
30
|
+
public readonly sampleRateHz: number
|
|
31
|
+
public readonly chunkSize: number
|
|
32
|
+
public readonly maxBufferedMs = 360 * 1000
|
|
33
|
+
public readonly manufacturer: string = 'N/A'
|
|
34
|
+
public readonly units: string = 'N/A'
|
|
35
|
+
|
|
24
36
|
private info: StreamInfo
|
|
25
|
-
private options: StreamOutletOptions
|
|
26
37
|
private outlet!: BoundOutlet
|
|
27
38
|
private pushSampleMethod!: (options: unknown) => LslErrorCode
|
|
28
39
|
|
|
29
40
|
protected constructor(info: StreamInfo, options: StreamOutletOptions) {
|
|
41
|
+
const {
|
|
42
|
+
name,
|
|
43
|
+
type,
|
|
44
|
+
sourceId,
|
|
45
|
+
channelNames,
|
|
46
|
+
channelFormat,
|
|
47
|
+
sampleRateHz,
|
|
48
|
+
chunkSize,
|
|
49
|
+
maxBufferedMs,
|
|
50
|
+
manufacturer,
|
|
51
|
+
units,
|
|
52
|
+
} = options
|
|
53
|
+
|
|
30
54
|
this.info = info
|
|
31
|
-
this.
|
|
55
|
+
this.name = name
|
|
56
|
+
this.type = type
|
|
57
|
+
this.sourceId = sourceId
|
|
58
|
+
this.channelNames = channelNames
|
|
59
|
+
this.channelFormat = channelFormat
|
|
60
|
+
this.channelCount = channelNames.length
|
|
61
|
+
this.sampleRateHz = sampleRateHz
|
|
62
|
+
this.chunkSize = chunkSize
|
|
63
|
+
this.maxBufferedMs = maxBufferedMs ?? this.maxBufferedMs
|
|
64
|
+
this.manufacturer = manufacturer ?? this.manufacturer
|
|
65
|
+
this.units = units ?? this.units
|
|
32
66
|
|
|
33
67
|
this.validateOptions()
|
|
34
68
|
this.createStreamOutlet()
|
|
@@ -38,20 +72,10 @@ export default class LslStreamOutlet implements StreamOutlet {
|
|
|
38
72
|
public static async Create(options: StreamOutletOptions) {
|
|
39
73
|
const { waitAfterConstructionMs = 10 } = options ?? {}
|
|
40
74
|
|
|
41
|
-
const
|
|
42
|
-
channelNames: options.channelNames,
|
|
43
|
-
channelFormat: options.channelFormat,
|
|
44
|
-
sampleRateHz: options.sampleRateHz,
|
|
45
|
-
name: options.name,
|
|
46
|
-
type: options.type,
|
|
47
|
-
sourceId: options.sourceId,
|
|
48
|
-
units: options.units,
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const info = this.LslStreamInfo(infoOptions)
|
|
75
|
+
const info = this.LslStreamInfo(options)
|
|
52
76
|
const instance = new (this.Class ?? this)(info, options)
|
|
53
77
|
|
|
54
|
-
await this.
|
|
78
|
+
await this.waitToAllowSetup(waitAfterConstructionMs)
|
|
55
79
|
|
|
56
80
|
return instance
|
|
57
81
|
}
|
|
@@ -62,6 +86,23 @@ export default class LslStreamOutlet implements StreamOutlet {
|
|
|
62
86
|
assertValidChannelFormat(this.channelFormat)
|
|
63
87
|
assertValidChunkSize(this.chunkSize)
|
|
64
88
|
assertValidMaxBufferedMs(this.maxBufferedMs)
|
|
89
|
+
this.validateChannelFormat()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
private validateChannelFormat() {
|
|
93
|
+
if (!this.isChannelFormatSupported) {
|
|
94
|
+
this.throwUnsupportedChannelFormat()
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private get isChannelFormatSupported() {
|
|
99
|
+
return this.channelFormat in this.methodMap
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private throwUnsupportedChannelFormat() {
|
|
103
|
+
throw new Error(
|
|
104
|
+
`This method currently does not support the ${this.channelFormat} type! Please implement it.`
|
|
105
|
+
)
|
|
65
106
|
}
|
|
66
107
|
|
|
67
108
|
private createStreamOutlet() {
|
|
@@ -72,28 +113,16 @@ export default class LslStreamOutlet implements StreamOutlet {
|
|
|
72
113
|
})
|
|
73
114
|
}
|
|
74
115
|
|
|
75
|
-
private
|
|
76
|
-
this.
|
|
116
|
+
private get boundStreamInfo() {
|
|
117
|
+
return this.info.boundStreamInfo
|
|
118
|
+
}
|
|
77
119
|
|
|
120
|
+
private setPushSampleMethod() {
|
|
78
121
|
this.pushSampleMethod = (
|
|
79
122
|
this.lsl[this.pushMethod] as (options: unknown) => LslErrorCode
|
|
80
123
|
).bind(this.lsl)
|
|
81
124
|
}
|
|
82
125
|
|
|
83
|
-
private validateChannelFormat() {
|
|
84
|
-
if (!(this.channelFormat in this.methodMap)) {
|
|
85
|
-
this.throwUnsupportedChannelFormat()
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
private throwUnsupportedChannelFormat() {
|
|
90
|
-
throw new Error(this.unsupportedChannelMessage)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
private get unsupportedChannelMessage() {
|
|
94
|
-
return `This method currently does not support the ${this.channelFormat} type! Please implement it.`
|
|
95
|
-
}
|
|
96
|
-
|
|
97
126
|
private get pushMethod() {
|
|
98
127
|
return this.methodMap[this.channelFormat]
|
|
99
128
|
}
|
|
@@ -106,77 +135,48 @@ export default class LslStreamOutlet implements StreamOutlet {
|
|
|
106
135
|
public pushSample(sample: LslSample) {
|
|
107
136
|
const timestamp = this.lsl.localClock()
|
|
108
137
|
|
|
109
|
-
|
|
110
|
-
this.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
)
|
|
138
|
+
const err = this.pushSampleMethod({
|
|
139
|
+
outlet: this.outlet,
|
|
140
|
+
sample,
|
|
141
|
+
timestamp,
|
|
142
|
+
})
|
|
143
|
+
handleError(err)
|
|
116
144
|
}
|
|
117
145
|
|
|
118
146
|
public destroy() {
|
|
119
147
|
this.lsl.destroyOutlet({ outlet: this.outlet })
|
|
120
148
|
}
|
|
121
149
|
|
|
122
|
-
public get name() {
|
|
123
|
-
return this.options.name
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
public get type() {
|
|
127
|
-
return this.options.type
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
public get sourceId() {
|
|
131
|
-
return this.options.sourceId
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
public get channelNames() {
|
|
135
|
-
return this.options.channelNames
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
public get channelCount() {
|
|
139
|
-
return this.channelNames.length
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
public get channelFormat() {
|
|
143
|
-
return this.options.channelFormat
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
public get sampleRateHz() {
|
|
147
|
-
return this.options.sampleRateHz
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
public get chunkSize() {
|
|
151
|
-
return this.options.chunkSize
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
public get maxBufferedMs() {
|
|
155
|
-
return this.options.maxBufferedMs ?? 360 * 1000
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
public get manufacturer() {
|
|
159
|
-
return this.options.manufacturer ?? 'N/A'
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
public get units() {
|
|
163
|
-
return this.options.units ?? 'N/A'
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
private get boundStreamInfo() {
|
|
167
|
-
return this.info.boundStreamInfo
|
|
168
|
-
}
|
|
169
|
-
|
|
170
150
|
private get lsl() {
|
|
171
151
|
return LiblslAdapter.getInstance()
|
|
172
152
|
}
|
|
173
153
|
|
|
174
|
-
private static async
|
|
175
|
-
|
|
154
|
+
private static async waitToAllowSetup(waitAfterConstructionMs: number) {
|
|
155
|
+
await new Promise((resolve) =>
|
|
156
|
+
setTimeout(resolve, waitAfterConstructionMs)
|
|
157
|
+
)
|
|
176
158
|
}
|
|
177
159
|
|
|
178
160
|
private static LslStreamInfo(options: StreamInfoOptions) {
|
|
179
|
-
|
|
161
|
+
const {
|
|
162
|
+
channelNames,
|
|
163
|
+
channelFormat,
|
|
164
|
+
sampleRateHz,
|
|
165
|
+
name,
|
|
166
|
+
type,
|
|
167
|
+
sourceId,
|
|
168
|
+
units,
|
|
169
|
+
} = options
|
|
170
|
+
|
|
171
|
+
return LslStreamInfo.Create({
|
|
172
|
+
name,
|
|
173
|
+
type,
|
|
174
|
+
sourceId,
|
|
175
|
+
channelNames,
|
|
176
|
+
channelFormat,
|
|
177
|
+
sampleRateHz,
|
|
178
|
+
units,
|
|
179
|
+
})
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
|
|
@@ -2,22 +2,22 @@ import { WebSocketServer } from 'ws'
|
|
|
2
2
|
import { ChannelFormat } from './LiblslAdapter.js'
|
|
3
3
|
import LslStreamInlet, { StreamInlet } from './LslStreamInlet.js'
|
|
4
4
|
|
|
5
|
-
export default class LslWebSocketBridge implements
|
|
6
|
-
public static Class?:
|
|
5
|
+
export default class LslWebSocketBridge implements WebSocketBridge {
|
|
6
|
+
public static Class?: WebSocketBridgeConstructor
|
|
7
7
|
public static WSS = WebSocketServer
|
|
8
8
|
|
|
9
9
|
private inlet: StreamInlet
|
|
10
10
|
private wss: WebSocketServer
|
|
11
11
|
private isDestroyed = false
|
|
12
12
|
|
|
13
|
-
protected constructor(options:
|
|
13
|
+
protected constructor(options: WebSocketBridgeConstructorOptions) {
|
|
14
14
|
const { inlet, wss } = options
|
|
15
15
|
|
|
16
16
|
this.inlet = inlet
|
|
17
17
|
this.wss = wss
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
public static Create(options:
|
|
20
|
+
public static Create(options: WebSocketBridgeOptions) {
|
|
21
21
|
const { wssPort = 8080 } = options ?? {}
|
|
22
22
|
const wss = this.WebSocketServer(wssPort)
|
|
23
23
|
const inlet = this.LslStreamInlet(options, wss)
|
|
@@ -88,7 +88,7 @@ export default class LslWebSocketBridge implements StreamTransportBridge {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
private static LslStreamInlet(
|
|
91
|
-
options:
|
|
91
|
+
options: WebSocketBridgeOptions,
|
|
92
92
|
wss: WebSocketServer
|
|
93
93
|
) {
|
|
94
94
|
const onData = this.createOnDataCallback(wss)
|
|
@@ -100,26 +100,29 @@ export default class LslWebSocketBridge implements StreamTransportBridge {
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
export interface
|
|
103
|
+
export interface WebSocketBridge {
|
|
104
104
|
activate(): void
|
|
105
105
|
deactivate(): void
|
|
106
106
|
destroy(): void
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
export type
|
|
110
|
-
options:
|
|
111
|
-
) =>
|
|
109
|
+
export type WebSocketBridgeConstructor = new (
|
|
110
|
+
options: WebSocketBridgeConstructorOptions
|
|
111
|
+
) => WebSocketBridge
|
|
112
112
|
|
|
113
|
-
export interface
|
|
113
|
+
export interface WebSocketBridgeOptions {
|
|
114
114
|
channelNames: string[]
|
|
115
115
|
channelFormat: ChannelFormat
|
|
116
116
|
sampleRateHz: number
|
|
117
117
|
chunkSize: number
|
|
118
|
+
name?: string
|
|
119
|
+
type?: string
|
|
120
|
+
sourceId?: string
|
|
118
121
|
wssPort?: number
|
|
119
122
|
}
|
|
120
123
|
|
|
121
|
-
export interface
|
|
122
|
-
extends
|
|
124
|
+
export interface WebSocketBridgeConstructorOptions
|
|
125
|
+
extends WebSocketBridgeOptions {
|
|
123
126
|
inlet: StreamInlet
|
|
124
127
|
wss: WebSocketServer
|
|
125
128
|
}
|
package/src/index.ts
CHANGED
|
@@ -50,13 +50,13 @@ export * from './impl/LslStreamOutlet.js'
|
|
|
50
50
|
export { default as FakeStreamOutlet } from './testDoubles/StreamOutlet/FakeStreamOutlet.js'
|
|
51
51
|
export * from './testDoubles/StreamOutlet/FakeStreamOutlet.js'
|
|
52
52
|
|
|
53
|
-
//
|
|
53
|
+
// WebSocketBridge
|
|
54
54
|
|
|
55
55
|
export { default as LslWebSocketBridge } from './impl/LslWebSocketBridge.js'
|
|
56
56
|
export * from './impl/LslWebSocketBridge.js'
|
|
57
57
|
|
|
58
|
-
export { default as
|
|
59
|
-
export * from './testDoubles/
|
|
58
|
+
export { default as FakeWebSocketBridge } from './testDoubles/WebSocketBridge/FakeWebSocketBridge.js'
|
|
59
|
+
export * from './testDoubles/WebSocketBridge/FakeWebSocketBridge.js'
|
|
60
60
|
|
|
61
61
|
// Utils
|
|
62
62
|
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { WebSocketBridge } from '../../impl/LslWebSocketBridge.js'
|
|
2
|
+
|
|
3
|
+
export default class FakeWebSocketBridge implements WebSocketBridge {
|
|
4
|
+
public static numCallsToConstructor = 0
|
|
5
|
+
public static numCallsToActivate = 0
|
|
6
|
+
public static numCallsToDeactivate = 0
|
|
7
|
+
public static numCallsToDestroy = 0
|
|
8
|
+
|
|
9
|
+
public constructor() {
|
|
10
|
+
FakeWebSocketBridge.numCallsToConstructor++
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
public activate() {
|
|
14
|
+
FakeWebSocketBridge.numCallsToActivate++
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public deactivate() {
|
|
18
|
+
FakeWebSocketBridge.numCallsToDeactivate++
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public destroy() {
|
|
22
|
+
FakeWebSocketBridge.numCallsToDestroy++
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public static resetTestDouble() {
|
|
26
|
+
FakeWebSocketBridge.numCallsToConstructor = 0
|
|
27
|
+
FakeWebSocketBridge.numCallsToActivate = 0
|
|
28
|
+
FakeWebSocketBridge.numCallsToDeactivate = 0
|
|
29
|
+
FakeWebSocketBridge.numCallsToDestroy = 0
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import LslWebSocketBridge, {
|
|
2
|
-
|
|
2
|
+
WebSocketBridgeConstructorOptions,
|
|
3
3
|
} from '../../impl/LslWebSocketBridge.js'
|
|
4
4
|
|
|
5
5
|
export default class SpyLslWebSocketBridge extends LslWebSocketBridge {
|
|
6
|
-
public constructor(options:
|
|
6
|
+
public constructor(options: WebSocketBridgeConstructorOptions) {
|
|
7
7
|
super(options)
|
|
8
8
|
}
|
|
9
9
|
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
export default class FakeStreamTransportBridge {
|
|
2
|
-
static numCallsToConstructor = 0;
|
|
3
|
-
static numCallsToActivate = 0;
|
|
4
|
-
static numCallsToDeactivate = 0;
|
|
5
|
-
static numCallsToDestroy = 0;
|
|
6
|
-
constructor() {
|
|
7
|
-
FakeStreamTransportBridge.numCallsToConstructor++;
|
|
8
|
-
}
|
|
9
|
-
activate() {
|
|
10
|
-
FakeStreamTransportBridge.numCallsToActivate++;
|
|
11
|
-
}
|
|
12
|
-
deactivate() {
|
|
13
|
-
FakeStreamTransportBridge.numCallsToDeactivate++;
|
|
14
|
-
}
|
|
15
|
-
destroy() {
|
|
16
|
-
FakeStreamTransportBridge.numCallsToDestroy++;
|
|
17
|
-
}
|
|
18
|
-
static resetTestDouble() {
|
|
19
|
-
FakeStreamTransportBridge.numCallsToConstructor = 0;
|
|
20
|
-
FakeStreamTransportBridge.numCallsToActivate = 0;
|
|
21
|
-
FakeStreamTransportBridge.numCallsToDeactivate = 0;
|
|
22
|
-
FakeStreamTransportBridge.numCallsToDestroy = 0;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=FakeStreamTransportBridge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FakeStreamTransportBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamTransportBridge/FakeStreamTransportBridge.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,yBAAyB;IAGnC,MAAM,CAAC,qBAAqB,GAAG,CAAC,CAAA;IAChC,MAAM,CAAC,kBAAkB,GAAG,CAAC,CAAA;IAC7B,MAAM,CAAC,oBAAoB,GAAG,CAAC,CAAA;IAC/B,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAA;IAEnC;QACI,yBAAyB,CAAC,qBAAqB,EAAE,CAAA;IACrD,CAAC;IAEM,QAAQ;QACX,yBAAyB,CAAC,kBAAkB,EAAE,CAAA;IAClD,CAAC;IAEM,UAAU;QACb,yBAAyB,CAAC,oBAAoB,EAAE,CAAA;IACpD,CAAC;IAEM,OAAO;QACV,yBAAyB,CAAC,iBAAiB,EAAE,CAAA;IACjD,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,yBAAyB,CAAC,qBAAqB,GAAG,CAAC,CAAA;QACnD,yBAAyB,CAAC,kBAAkB,GAAG,CAAC,CAAA;QAChD,yBAAyB,CAAC,oBAAoB,GAAG,CAAC,CAAA;QAClD,yBAAyB,CAAC,iBAAiB,GAAG,CAAC,CAAA;IACnD,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SpyLslWebSocketBridge.js","sourceRoot":"","sources":["../../../src/testDoubles/StreamTransportBridge/SpyLslWebSocketBridge.ts"],"names":[],"mappings":"AAAA,OAAO,kBAEN,MAAM,kCAAkC,CAAA;AAEzC,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,kBAAkB;IACjE,YAAmB,OAAgD;QAC/D,KAAK,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;CACJ"}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { StreamTransportBridge } from '../../impl/LslWebSocketBridge.js'
|
|
2
|
-
|
|
3
|
-
export default class FakeStreamTransportBridge
|
|
4
|
-
implements StreamTransportBridge
|
|
5
|
-
{
|
|
6
|
-
public static numCallsToConstructor = 0
|
|
7
|
-
public static numCallsToActivate = 0
|
|
8
|
-
public static numCallsToDeactivate = 0
|
|
9
|
-
public static numCallsToDestroy = 0
|
|
10
|
-
|
|
11
|
-
public constructor() {
|
|
12
|
-
FakeStreamTransportBridge.numCallsToConstructor++
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
public activate() {
|
|
16
|
-
FakeStreamTransportBridge.numCallsToActivate++
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
public deactivate() {
|
|
20
|
-
FakeStreamTransportBridge.numCallsToDeactivate++
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
public destroy() {
|
|
24
|
-
FakeStreamTransportBridge.numCallsToDestroy++
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public static resetTestDouble() {
|
|
28
|
-
FakeStreamTransportBridge.numCallsToConstructor = 0
|
|
29
|
-
FakeStreamTransportBridge.numCallsToActivate = 0
|
|
30
|
-
FakeStreamTransportBridge.numCallsToDeactivate = 0
|
|
31
|
-
FakeStreamTransportBridge.numCallsToDestroy = 0
|
|
32
|
-
}
|
|
33
|
-
}
|
/package/build/testDoubles/{StreamTransportBridge → WebSocketBridge}/SpyLslWebSocketBridge.js
RENAMED
|
File without changes
|