@neurodevs/node-lsl 22.0.0 → 23.0.0
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__/impl/BleObserverController.test.d.ts +8 -0
- package/build/__tests__/impl/BleObserverController.test.js +57 -2
- package/build/__tests__/impl/BleObserverController.test.js.map +1 -1
- package/build/impl/LslEventMarkerOutlet.js.map +1 -1
- package/build/impl/controllers/BleObserverController.d.ts +5 -0
- package/build/impl/controllers/BleObserverController.js +17 -5
- package/build/impl/controllers/BleObserverController.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/impl/BleObserverController.test.ts +82 -2
- package/src/impl/LslEventMarkerOutlet.ts +1 -1
- package/src/impl/controllers/BleObserverController.ts +25 -10
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
2
2
|
export default class BleObserverControllerTest extends AbstractPackageTest {
|
|
3
3
|
private static instance;
|
|
4
|
+
private static passedAdvertisements;
|
|
5
|
+
private static readonly fakeError;
|
|
6
|
+
private static readonly advertisement;
|
|
4
7
|
protected static beforeEach(): Promise<void>;
|
|
5
8
|
protected static createsInstance(): Promise<void>;
|
|
6
9
|
protected static startObservingCreatesBleObserverBackend(): Promise<void>;
|
|
7
10
|
protected static startObservingStartsBleObserverBackend(): Promise<void>;
|
|
11
|
+
protected static passesExpectedArgsToOnAdvertisement(): Promise<void>;
|
|
8
12
|
protected static stopObservingStopsBleObserverBackend(): Promise<void>;
|
|
13
|
+
protected static createBleObserverBackendThrowsOnError(): Promise<void>;
|
|
14
|
+
protected static startObservingThrowsOnError(): Promise<void>;
|
|
15
|
+
protected static stopObservingThrowsOnError(): Promise<void>;
|
|
16
|
+
private static setFakeErrorResult;
|
|
9
17
|
private static startObserving;
|
|
10
18
|
private static stopObserving;
|
|
11
19
|
private static BleObserverController;
|
|
@@ -4,14 +4,29 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
4
4
|
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;
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
|
+
import { randomInt } from 'node:crypto';
|
|
8
|
+
import { FakeLibndx } from '@neurodevs/ndx-native';
|
|
7
9
|
import { test, assert } from '@neurodevs/node-tdd';
|
|
8
|
-
import BleObserverController from '../../impl/controllers/BleObserverController.js';
|
|
9
10
|
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
10
|
-
import
|
|
11
|
+
import BleObserverController from '../../impl/controllers/BleObserverController.js';
|
|
11
12
|
export default class BleObserverControllerTest extends AbstractPackageTest {
|
|
12
13
|
static instance;
|
|
14
|
+
static passedAdvertisements;
|
|
15
|
+
static fakeError = this.generateId();
|
|
16
|
+
static advertisement = {
|
|
17
|
+
localName: this.generateId(),
|
|
18
|
+
companyId: randomInt(0, 65535),
|
|
19
|
+
manufacturerData: this.generateId().slice(0, 8),
|
|
20
|
+
serviceUuids: [],
|
|
21
|
+
serviceData: {},
|
|
22
|
+
rssi: null,
|
|
23
|
+
txPowerLevel: null,
|
|
24
|
+
isConnectable: true,
|
|
25
|
+
timestampSec: 1234.5,
|
|
26
|
+
};
|
|
13
27
|
static async beforeEach() {
|
|
14
28
|
await super.beforeEach();
|
|
29
|
+
this.passedAdvertisements = [];
|
|
15
30
|
this.instance = this.BleObserverController();
|
|
16
31
|
}
|
|
17
32
|
static async createsInstance() {
|
|
@@ -29,12 +44,37 @@ export default class BleObserverControllerTest extends AbstractPackageTest {
|
|
|
29
44
|
assert.isEqual(deviceUuid, this.deviceUuid, 'Did not pass deviceUuid to startBleObserverBackend!');
|
|
30
45
|
assert.isFunction(onAdvertisement, 'Did not pass onAdvertisement to startBleObserverBackend!');
|
|
31
46
|
}
|
|
47
|
+
static async passesExpectedArgsToOnAdvertisement() {
|
|
48
|
+
await this.startObserving();
|
|
49
|
+
FakeLibndx.callsToStartBleObserver[0]?.onAdvertisement(this.advertisement);
|
|
50
|
+
assert.isEqualDeep(this.passedAdvertisements[0], this.advertisement, 'Did not pass expected args to onAdvertisement!');
|
|
51
|
+
}
|
|
32
52
|
static async stopObservingStopsBleObserverBackend() {
|
|
33
53
|
await this.stopObserving();
|
|
34
54
|
assert.isEqualDeep(FakeLibndx.callsToStopBleObserver[0], {
|
|
35
55
|
deviceUuid: this.deviceUuid,
|
|
36
56
|
});
|
|
37
57
|
}
|
|
58
|
+
static async createBleObserverBackendThrowsOnError() {
|
|
59
|
+
this.setFakeErrorResult();
|
|
60
|
+
//@ts-ignore
|
|
61
|
+
this.instance.startBleObserverBackend = () => { };
|
|
62
|
+
await assert.doesThrowAsync(async () => await this.startObserving(), this.fakeError, 'Did not throw error!');
|
|
63
|
+
}
|
|
64
|
+
static async startObservingThrowsOnError() {
|
|
65
|
+
this.setFakeErrorResult();
|
|
66
|
+
await assert.doesThrowAsync(async () => await this.startObserving(), this.fakeError, 'Did not throw error!');
|
|
67
|
+
}
|
|
68
|
+
static async stopObservingThrowsOnError() {
|
|
69
|
+
this.setFakeErrorResult();
|
|
70
|
+
await assert.doesThrowAsync(async () => await this.stopObserving(), this.fakeError, 'Did not throw error!');
|
|
71
|
+
}
|
|
72
|
+
static setFakeErrorResult() {
|
|
73
|
+
FakeLibndx.fakeResult = {
|
|
74
|
+
status: 400,
|
|
75
|
+
error: this.fakeError,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
38
78
|
static async startObserving() {
|
|
39
79
|
await this.instance.startObserving();
|
|
40
80
|
}
|
|
@@ -44,6 +84,9 @@ export default class BleObserverControllerTest extends AbstractPackageTest {
|
|
|
44
84
|
static BleObserverController() {
|
|
45
85
|
return BleObserverController.Create({
|
|
46
86
|
deviceUuid: this.deviceUuid,
|
|
87
|
+
onAdvertisement: (advertisement) => {
|
|
88
|
+
this.passedAdvertisements.push(advertisement);
|
|
89
|
+
},
|
|
47
90
|
});
|
|
48
91
|
}
|
|
49
92
|
}
|
|
@@ -56,7 +99,19 @@ __decorate([
|
|
|
56
99
|
__decorate([
|
|
57
100
|
test()
|
|
58
101
|
], BleObserverControllerTest, "startObservingStartsBleObserverBackend", null);
|
|
102
|
+
__decorate([
|
|
103
|
+
test()
|
|
104
|
+
], BleObserverControllerTest, "passesExpectedArgsToOnAdvertisement", null);
|
|
59
105
|
__decorate([
|
|
60
106
|
test()
|
|
61
107
|
], BleObserverControllerTest, "stopObservingStopsBleObserverBackend", null);
|
|
108
|
+
__decorate([
|
|
109
|
+
test()
|
|
110
|
+
], BleObserverControllerTest, "createBleObserverBackendThrowsOnError", null);
|
|
111
|
+
__decorate([
|
|
112
|
+
test()
|
|
113
|
+
], BleObserverControllerTest, "startObservingThrowsOnError", null);
|
|
114
|
+
__decorate([
|
|
115
|
+
test()
|
|
116
|
+
], BleObserverControllerTest, "stopObservingThrowsOnError", null);
|
|
62
117
|
//# sourceMappingURL=BleObserverController.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BleObserverController.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/BleObserverController.test.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"BleObserverController.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/BleObserverController.test.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,UAAU,EAAuB,MAAM,uBAAuB,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,mBAAmB,MAAM,2BAA2B,CAAA;AAC3D,OAAO,qBAEN,MAAM,iDAAiD,CAAA;AAExD,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,mBAAmB;IAC9D,MAAM,CAAC,QAAQ,CAAa;IAC5B,MAAM,CAAC,oBAAoB,CAAuB;IAElD,MAAM,CAAU,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;IAE7C,MAAM,CAAU,aAAa,GAAwB;QACzD,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE;QAC5B,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;QAC9B,gBAAgB,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC/C,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,EAAE;QACf,IAAI,EAAE,IAAI;QACV,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,MAAM;KACvB,CAAA;IAES,MAAM,CAAC,KAAK,CAAC,UAAU;QAC7B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QAExB,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAA;QAE9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAA;IAChD,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,uCAAuC;QAC1D,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;QAE3B,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;YACvD,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC,CAAA;IACN,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,sCAAsC;QACzD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;QAE3B,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GACjC,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAA;QAEzC,MAAM,CAAC,OAAO,CACV,UAAU,EACV,IAAI,CAAC,UAAU,EACf,qDAAqD,CACxD,CAAA;QACD,MAAM,CAAC,UAAU,CACb,eAAe,EACf,0DAA0D,CAC7D,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,mCAAmC;QACtD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;QAE3B,UAAU,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,eAAe,CAClD,IAAI,CAAC,aAAa,CACrB,CAAA;QAED,MAAM,CAAC,WAAW,CACd,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAC5B,IAAI,CAAC,aAAa,EAClB,gDAAgD,CACnD,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,oCAAoC;QACvD,MAAM,IAAI,CAAC,aAAa,EAAE,CAAA;QAE1B,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE;YACrD,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC,CAAA;IACN,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,qCAAqC;QACxD,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAEzB,YAAY;QACZ,IAAI,CAAC,QAAQ,CAAC,uBAAuB,GAAG,GAAG,EAAE,GAAE,CAAC,CAAA;QAEhD,MAAM,MAAM,CAAC,cAAc,CACvB,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EACvC,IAAI,CAAC,SAAS,EACd,sBAAsB,CACzB,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,2BAA2B;QAC9C,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAEzB,MAAM,MAAM,CAAC,cAAc,CACvB,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,EACvC,IAAI,CAAC,SAAS,EACd,sBAAsB,CACzB,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,0BAA0B;QAC7C,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAEzB,MAAM,MAAM,CAAC,cAAc,CACvB,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,EACtC,IAAI,CAAC,SAAS,EACd,sBAAsB,CACzB,CAAA;IACL,CAAC;IAEO,MAAM,CAAC,kBAAkB;QAC7B,UAAU,CAAC,UAAU,GAAG;YACpB,MAAM,EAAE,GAAG;YACX,KAAK,EAAE,IAAI,CAAC,SAAS;SACxB,CAAA;IACL,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,cAAc;QAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAA;IACxC,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,aAAa;QAC9B,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAA;IACvC,CAAC;IAEO,MAAM,CAAC,qBAAqB;QAChC,OAAO,qBAAqB,CAAC,MAAM,CAAC;YAChC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,eAAe,EAAE,CAAC,aAAkC,EAAE,EAAE;gBACpD,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;YACjD,CAAC;SACJ,CAAC,CAAA;IACN,CAAC;;AAjHsB;IADtB,IAAI,EAAE;sDAGN;AAGsB;IADtB,IAAI,EAAE;8EAON;AAGsB;IADtB,IAAI,EAAE;6EAgBN;AAGsB;IADtB,IAAI,EAAE;0EAaN;AAGsB;IADtB,IAAI,EAAE;2EAON;AAGsB;IADtB,IAAI,EAAE;4EAYN;AAGsB;IADtB,IAAI,EAAE;kEASN;AAGsB;IADtB,IAAI,EAAE;iEASN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslEventMarkerOutlet.js","sourceRoot":"","sources":["../../src/impl/LslEventMarkerOutlet.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"LslEventMarkerOutlet.js","sourceRoot":"","sources":["../../src/impl/LslEventMarkerOutlet.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { NativeAdvertisement } from '@neurodevs/ndx-native';
|
|
1
2
|
export default class BleObserverController implements BleObserver {
|
|
2
3
|
static Class?: BleObserverConstructor;
|
|
3
4
|
private readonly deviceUuid;
|
|
5
|
+
private readonly onAdvertisement?;
|
|
4
6
|
private readonly ndx;
|
|
5
7
|
protected constructor(options: BleObserverOptions);
|
|
6
8
|
static Create(options: BleObserverOptions): BleObserver;
|
|
@@ -9,6 +11,7 @@ export default class BleObserverController implements BleObserver {
|
|
|
9
11
|
private startBleObserverBackend;
|
|
10
12
|
stopObserving(): Promise<void>;
|
|
11
13
|
private stopBleObserverBackend;
|
|
14
|
+
private throwIfError;
|
|
12
15
|
}
|
|
13
16
|
export interface BleObserver {
|
|
14
17
|
startObserving(): Promise<void>;
|
|
@@ -17,4 +20,6 @@ export interface BleObserver {
|
|
|
17
20
|
export type BleObserverConstructor = new (options: BleObserverOptions) => BleObserver;
|
|
18
21
|
export type BleObserverOptions = {
|
|
19
22
|
deviceUuid: string;
|
|
23
|
+
onAdvertisement?: OnAdvertisement;
|
|
20
24
|
};
|
|
25
|
+
export type OnAdvertisement = (advertisement: NativeAdvertisement) => void;
|
|
@@ -2,10 +2,12 @@ import { LibndxAdapter } from '@neurodevs/ndx-native';
|
|
|
2
2
|
export default class BleObserverController {
|
|
3
3
|
static Class;
|
|
4
4
|
deviceUuid;
|
|
5
|
+
onAdvertisement;
|
|
5
6
|
ndx = LibndxAdapter.getInstance();
|
|
6
7
|
constructor(options) {
|
|
7
|
-
const { deviceUuid } = options;
|
|
8
|
+
const { deviceUuid, onAdvertisement } = options;
|
|
8
9
|
this.deviceUuid = deviceUuid ?? '';
|
|
10
|
+
this.onAdvertisement = onAdvertisement;
|
|
9
11
|
}
|
|
10
12
|
static Create(options) {
|
|
11
13
|
return new (this.Class ?? this)(options);
|
|
@@ -15,23 +17,33 @@ export default class BleObserverController {
|
|
|
15
17
|
this.startBleObserverBackend();
|
|
16
18
|
}
|
|
17
19
|
createBleObserverBackend() {
|
|
18
|
-
this.ndx.createBleObserverBackend({
|
|
20
|
+
const { status, error } = this.ndx.createBleObserverBackend({
|
|
19
21
|
deviceUuid: this.deviceUuid,
|
|
20
22
|
});
|
|
23
|
+
this.throwIfError(status, error);
|
|
21
24
|
}
|
|
22
25
|
startBleObserverBackend() {
|
|
23
|
-
this.ndx.startBleObserverBackend({
|
|
26
|
+
const { status, error } = this.ndx.startBleObserverBackend({
|
|
24
27
|
deviceUuid: this.deviceUuid,
|
|
25
|
-
onAdvertisement: (
|
|
28
|
+
onAdvertisement: (advertisement) => {
|
|
29
|
+
this.onAdvertisement?.(advertisement);
|
|
30
|
+
},
|
|
26
31
|
});
|
|
32
|
+
this.throwIfError(status, error);
|
|
27
33
|
}
|
|
28
34
|
async stopObserving() {
|
|
29
35
|
this.stopBleObserverBackend();
|
|
30
36
|
}
|
|
31
37
|
stopBleObserverBackend() {
|
|
32
|
-
this.ndx.stopBleObserverBackend({
|
|
38
|
+
const { status, error } = this.ndx.stopBleObserverBackend({
|
|
33
39
|
deviceUuid: this.deviceUuid,
|
|
34
40
|
});
|
|
41
|
+
this.throwIfError(status, error);
|
|
42
|
+
}
|
|
43
|
+
throwIfError(status, error) {
|
|
44
|
+
if (status !== 200) {
|
|
45
|
+
throw new Error(`${status} error: ${error ?? 'Unknown error'}`);
|
|
46
|
+
}
|
|
35
47
|
}
|
|
36
48
|
}
|
|
37
49
|
//# sourceMappingURL=BleObserverController.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BleObserverController.js","sourceRoot":"","sources":["../../../src/impl/controllers/BleObserverController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"BleObserverController.js","sourceRoot":"","sources":["../../../src/impl/controllers/BleObserverController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAuB,MAAM,uBAAuB,CAAA;AAE1E,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAC/B,MAAM,CAAC,KAAK,CAAyB;IAE3B,UAAU,CAAQ;IAClB,eAAe,CAAkB;IACjC,GAAG,GAAG,aAAa,CAAC,WAAW,EAAE,CAAA;IAElD,YAAsB,OAA2B;QAC7C,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,CAAA;QAE/C,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,EAAE,CAAA;QAClC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;IAC1C,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,OAA2B;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC;IAEM,KAAK,CAAC,cAAc;QACvB,IAAI,CAAC,wBAAwB,EAAE,CAAA;QAC/B,IAAI,CAAC,uBAAuB,EAAE,CAAA;IAClC,CAAC;IAEO,wBAAwB;QAC5B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC;YACxD,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACpC,CAAC;IAEO,uBAAuB;QAC3B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC;YACvD,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,eAAe,EAAE,CAAC,aAAkC,EAAE,EAAE;gBACpD,IAAI,CAAC,eAAe,EAAE,CAAC,aAAa,CAAC,CAAA;YACzC,CAAC;SACJ,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACpC,CAAC;IAEM,KAAK,CAAC,aAAa;QACtB,IAAI,CAAC,sBAAsB,EAAE,CAAA;IACjC,CAAC;IAEO,sBAAsB;QAC1B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACtD,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACpC,CAAC;IAEO,YAAY,CAAC,MAAc,EAAE,KAAyB;QAC1D,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,WAAW,KAAK,IAAI,eAAe,EAAE,CAAC,CAAA;QACnE,CAAC;IACL,CAAC;CACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neurodevs/node-lsl",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "23.0.0",
|
|
4
4
|
"description": "Lab Streaming Layer (LSL) bindings for Node",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -42,12 +42,12 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@neurodevs/generate-id": "^1.1.3",
|
|
45
|
-
"@neurodevs/ndx-native": "^
|
|
45
|
+
"@neurodevs/ndx-native": "^9.0.0",
|
|
46
46
|
"ffi-rs": "^1.3.1",
|
|
47
47
|
"ws": "^8.18.3"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@neurodevs/eslint-config-ndx": "
|
|
50
|
+
"@neurodevs/eslint-config-ndx": "2.0.0",
|
|
51
51
|
"@neurodevs/node-tdd": "^3.0.3",
|
|
52
52
|
"@neurodevs/prettier-config-ndx": "^1.0.2",
|
|
53
53
|
"@types/ws": "^8.18.1",
|
|
@@ -1,17 +1,36 @@
|
|
|
1
|
+
import { randomInt } from 'node:crypto'
|
|
2
|
+
|
|
3
|
+
import { FakeLibndx, NativeAdvertisement } from '@neurodevs/ndx-native'
|
|
1
4
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
2
5
|
|
|
6
|
+
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
3
7
|
import BleObserverController, {
|
|
4
8
|
BleObserver,
|
|
5
9
|
} from '../../impl/controllers/BleObserverController.js'
|
|
6
|
-
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
7
|
-
import { FakeLibndx } from '@neurodevs/ndx-native'
|
|
8
10
|
|
|
9
11
|
export default class BleObserverControllerTest extends AbstractPackageTest {
|
|
10
12
|
private static instance: BleObserver
|
|
13
|
+
private static passedAdvertisements: NativeAdvertisement[]
|
|
14
|
+
|
|
15
|
+
private static readonly fakeError = this.generateId()
|
|
16
|
+
|
|
17
|
+
private static readonly advertisement: NativeAdvertisement = {
|
|
18
|
+
localName: this.generateId(),
|
|
19
|
+
companyId: randomInt(0, 65535),
|
|
20
|
+
manufacturerData: this.generateId().slice(0, 8),
|
|
21
|
+
serviceUuids: [],
|
|
22
|
+
serviceData: {},
|
|
23
|
+
rssi: null,
|
|
24
|
+
txPowerLevel: null,
|
|
25
|
+
isConnectable: true,
|
|
26
|
+
timestampSec: 1234.5,
|
|
27
|
+
}
|
|
11
28
|
|
|
12
29
|
protected static async beforeEach() {
|
|
13
30
|
await super.beforeEach()
|
|
14
31
|
|
|
32
|
+
this.passedAdvertisements = []
|
|
33
|
+
|
|
15
34
|
this.instance = this.BleObserverController()
|
|
16
35
|
}
|
|
17
36
|
|
|
@@ -47,6 +66,21 @@ export default class BleObserverControllerTest extends AbstractPackageTest {
|
|
|
47
66
|
)
|
|
48
67
|
}
|
|
49
68
|
|
|
69
|
+
@test()
|
|
70
|
+
protected static async passesExpectedArgsToOnAdvertisement() {
|
|
71
|
+
await this.startObserving()
|
|
72
|
+
|
|
73
|
+
FakeLibndx.callsToStartBleObserver[0]?.onAdvertisement(
|
|
74
|
+
this.advertisement
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
assert.isEqualDeep(
|
|
78
|
+
this.passedAdvertisements[0],
|
|
79
|
+
this.advertisement,
|
|
80
|
+
'Did not pass expected args to onAdvertisement!'
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
50
84
|
@test()
|
|
51
85
|
protected static async stopObservingStopsBleObserverBackend() {
|
|
52
86
|
await this.stopObserving()
|
|
@@ -56,6 +90,49 @@ export default class BleObserverControllerTest extends AbstractPackageTest {
|
|
|
56
90
|
})
|
|
57
91
|
}
|
|
58
92
|
|
|
93
|
+
@test()
|
|
94
|
+
protected static async createBleObserverBackendThrowsOnError() {
|
|
95
|
+
this.setFakeErrorResult()
|
|
96
|
+
|
|
97
|
+
//@ts-ignore
|
|
98
|
+
this.instance.startBleObserverBackend = () => {}
|
|
99
|
+
|
|
100
|
+
await assert.doesThrowAsync(
|
|
101
|
+
async () => await this.startObserving(),
|
|
102
|
+
this.fakeError,
|
|
103
|
+
'Did not throw error!'
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
@test()
|
|
108
|
+
protected static async startObservingThrowsOnError() {
|
|
109
|
+
this.setFakeErrorResult()
|
|
110
|
+
|
|
111
|
+
await assert.doesThrowAsync(
|
|
112
|
+
async () => await this.startObserving(),
|
|
113
|
+
this.fakeError,
|
|
114
|
+
'Did not throw error!'
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
@test()
|
|
119
|
+
protected static async stopObservingThrowsOnError() {
|
|
120
|
+
this.setFakeErrorResult()
|
|
121
|
+
|
|
122
|
+
await assert.doesThrowAsync(
|
|
123
|
+
async () => await this.stopObserving(),
|
|
124
|
+
this.fakeError,
|
|
125
|
+
'Did not throw error!'
|
|
126
|
+
)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private static setFakeErrorResult() {
|
|
130
|
+
FakeLibndx.fakeResult = {
|
|
131
|
+
status: 400,
|
|
132
|
+
error: this.fakeError,
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
59
136
|
private static async startObserving() {
|
|
60
137
|
await this.instance.startObserving()
|
|
61
138
|
}
|
|
@@ -67,6 +144,9 @@ export default class BleObserverControllerTest extends AbstractPackageTest {
|
|
|
67
144
|
private static BleObserverController() {
|
|
68
145
|
return BleObserverController.Create({
|
|
69
146
|
deviceUuid: this.deviceUuid,
|
|
147
|
+
onAdvertisement: (advertisement: NativeAdvertisement) => {
|
|
148
|
+
this.passedAdvertisements.push(advertisement)
|
|
149
|
+
},
|
|
70
150
|
})
|
|
71
151
|
}
|
|
72
152
|
}
|
|
@@ -99,7 +99,7 @@ export default class LslEventMarkerOutlet implements EventMarkerOutlet {
|
|
|
99
99
|
channelFormat: 'string',
|
|
100
100
|
sampleRateHz: 0,
|
|
101
101
|
chunkSize: 1,
|
|
102
|
-
}
|
|
102
|
+
} satisfies LslOutletOptions
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
private static LslStreamOutlet(options?: Partial<LslOutletOptions>) {
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { LibndxAdapter } from '@neurodevs/ndx-native'
|
|
1
|
+
import { LibndxAdapter, NativeAdvertisement } from '@neurodevs/ndx-native'
|
|
2
2
|
|
|
3
3
|
export default class BleObserverController implements BleObserver {
|
|
4
4
|
public static Class?: BleObserverConstructor
|
|
5
5
|
|
|
6
6
|
private readonly deviceUuid: string
|
|
7
|
+
private readonly onAdvertisement?: OnAdvertisement
|
|
7
8
|
private readonly ndx = LibndxAdapter.getInstance()
|
|
8
9
|
|
|
9
10
|
protected constructor(options: BleObserverOptions) {
|
|
10
|
-
const { deviceUuid } = options
|
|
11
|
+
const { deviceUuid, onAdvertisement } = options
|
|
11
12
|
|
|
12
13
|
this.deviceUuid = deviceUuid ?? ''
|
|
14
|
+
this.onAdvertisement = onAdvertisement
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
public static Create(options: BleObserverOptions) {
|
|
@@ -22,20 +24,22 @@ export default class BleObserverController implements BleObserver {
|
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
private createBleObserverBackend() {
|
|
25
|
-
this.ndx.createBleObserverBackend({
|
|
27
|
+
const { status, error } = this.ndx.createBleObserverBackend({
|
|
26
28
|
deviceUuid: this.deviceUuid,
|
|
27
29
|
})
|
|
30
|
+
|
|
31
|
+
this.throwIfError(status, error)
|
|
28
32
|
}
|
|
29
33
|
|
|
30
34
|
private startBleObserverBackend() {
|
|
31
|
-
this.ndx.startBleObserverBackend({
|
|
35
|
+
const { status, error } = this.ndx.startBleObserverBackend({
|
|
32
36
|
deviceUuid: this.deviceUuid,
|
|
33
|
-
onAdvertisement: (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
_timestampSec: number
|
|
37
|
-
) => {},
|
|
37
|
+
onAdvertisement: (advertisement: NativeAdvertisement) => {
|
|
38
|
+
this.onAdvertisement?.(advertisement)
|
|
39
|
+
},
|
|
38
40
|
})
|
|
41
|
+
|
|
42
|
+
this.throwIfError(status, error)
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
public async stopObserving() {
|
|
@@ -43,9 +47,17 @@ export default class BleObserverController implements BleObserver {
|
|
|
43
47
|
}
|
|
44
48
|
|
|
45
49
|
private stopBleObserverBackend() {
|
|
46
|
-
this.ndx.stopBleObserverBackend({
|
|
50
|
+
const { status, error } = this.ndx.stopBleObserverBackend({
|
|
47
51
|
deviceUuid: this.deviceUuid,
|
|
48
52
|
})
|
|
53
|
+
|
|
54
|
+
this.throwIfError(status, error)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private throwIfError(status: number, error: string | undefined) {
|
|
58
|
+
if (status !== 200) {
|
|
59
|
+
throw new Error(`${status} error: ${error ?? 'Unknown error'}`)
|
|
60
|
+
}
|
|
49
61
|
}
|
|
50
62
|
}
|
|
51
63
|
export interface BleObserver {
|
|
@@ -59,4 +71,7 @@ export type BleObserverConstructor = new (
|
|
|
59
71
|
|
|
60
72
|
export type BleObserverOptions = {
|
|
61
73
|
deviceUuid: string
|
|
74
|
+
onAdvertisement?: OnAdvertisement
|
|
62
75
|
}
|
|
76
|
+
|
|
77
|
+
export type OnAdvertisement = (advertisement: NativeAdvertisement) => void
|