@matter/react-native 0.16.9 → 0.16.10-alpha.0-20260218-52b333ceb
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/dist/cjs/ble/BleScanner.d.ts +2 -2
- package/dist/cjs/ble/BleScanner.d.ts.map +1 -1
- package/dist/cjs/ble/BleScanner.js +41 -14
- package/dist/cjs/ble/BleScanner.js.map +1 -1
- package/dist/esm/ble/BleScanner.d.ts +2 -2
- package/dist/esm/ble/BleScanner.d.ts.map +1 -1
- package/dist/esm/ble/BleScanner.js +42 -15
- package/dist/esm/ble/BleScanner.js.map +1 -1
- package/package.json +5 -5
- package/src/ble/BleScanner.ts +52 -16
|
@@ -32,7 +32,7 @@ export declare class BleScanner implements Scanner {
|
|
|
32
32
|
* promise.
|
|
33
33
|
*/
|
|
34
34
|
private finishWaiter;
|
|
35
|
-
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers): void;
|
|
35
|
+
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers, resolvePromise?: boolean): void;
|
|
36
36
|
private handleDiscoveredDevice;
|
|
37
37
|
private findCommissionableQueryIdentifier;
|
|
38
38
|
/**
|
|
@@ -44,7 +44,7 @@ export declare class BleScanner implements Scanner {
|
|
|
44
44
|
findOperationalDevice(): Promise<undefined>;
|
|
45
45
|
getDiscoveredOperationalDevice(): undefined;
|
|
46
46
|
findCommissionableDevices(identifier: CommissionableDeviceIdentifiers, timeout?: Duration, ignoreExistingRecords?: boolean): Promise<CommissionableDevice[]>;
|
|
47
|
-
findCommissionableDevicesContinuously(identifier: CommissionableDeviceIdentifiers, callback: (device: CommissionableDevice) => void, timeout?: Duration): Promise<CommissionableDevice[]>;
|
|
47
|
+
findCommissionableDevicesContinuously(identifier: CommissionableDeviceIdentifiers, callback: (device: CommissionableDevice) => void, timeout?: Duration, cancelSignal?: Promise<void>): Promise<CommissionableDevice[]>;
|
|
48
48
|
getDiscoveredCommissionableDevices(identifier: CommissionableDeviceIdentifiers): CommissionableDevice[];
|
|
49
49
|
close(): Promise<void>;
|
|
50
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BleScanner.d.ts","sourceRoot":"","sources":["../../../src/ble/BleScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,WAAW,EAAiB,QAAQ,
|
|
1
|
+
{"version":3,"file":"BleScanner.d.ts","sourceRoot":"","sources":["../../../src/ble/BleScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,WAAW,EAAiB,QAAQ,EAAkD,MAAM,UAAU,CAAC;AACvH,OAAO,EAAsB,oBAAoB,EAAE,+BAA+B,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/G,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAIjE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,wBAAwB,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,KAAK,wBAAwB,GAAG,oBAAoB,GAAG;IACnD,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,qBAAa,UAAW,YAAW,OAAO;IAgB1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAftC,IAAI,IAAI,gBAEP;IAED,OAAO,CAAC,QAAQ,CAAC,aAAa,CAQ1B;IACJ,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0C;gBAErD,SAAS,EAAE,oBAAoB;IAMrD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB;IAQhE;;;OAGG;YACW,qBAAqB;IAuBnC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAapB,mCAAmC,CAAC,UAAU,EAAE,+BAA+B,EAAE,cAAc,UAAO;IAOtG,OAAO,CAAC,sBAAsB;IAoC9B,OAAO,CAAC,iCAAiC;IAmCzC;;;OAGG;IACH,OAAO,CAAC,kCAAkC;IAa1C,OAAO,CAAC,wBAAwB;IA4B1B,qBAAqB,IAAI,OAAO,CAAC,SAAS,CAAC;IAKjD,8BAA8B,IAAI,SAAS;IAKrC,yBAAyB,CAC3B,UAAU,EAAE,+BAA+B,EAC3C,OAAO,WAAc,EACrB,qBAAqB,UAAQ,GAC9B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAqB5B,qCAAqC,CACvC,UAAU,EAAE,+BAA+B,EAC3C,QAAQ,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,EAChD,OAAO,CAAC,EAAE,QAAQ,EAClB,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAC7B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAgDlC,kCAAkC,CAAC,UAAU,EAAE,+BAA+B,GAAG,oBAAoB,EAAE;IAIjG,KAAK;CAMd"}
|
|
@@ -53,12 +53,18 @@ class BleScanner {
|
|
|
53
53
|
* Registers a deferred promise for a specific queryId together with a timeout and return the promise.
|
|
54
54
|
* The promise will be resolved when the timer runs out latest.
|
|
55
55
|
*/
|
|
56
|
-
async registerWaiterPromise(queryId, timeout, resolveOnUpdatedRecords = true) {
|
|
56
|
+
async registerWaiterPromise(queryId, timeout, resolveOnUpdatedRecords = true, cancelResolver) {
|
|
57
57
|
const { promise, resolver } = (0, import_general.createPromise)();
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
let timer;
|
|
59
|
+
if (timeout) {
|
|
60
|
+
timer = import_general.Time.getTimer("BLE query timeout", timeout, () => {
|
|
61
|
+
cancelResolver?.();
|
|
62
|
+
this.finishWaiter(queryId, true);
|
|
63
|
+
}).start();
|
|
64
|
+
}
|
|
65
|
+
this.recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords, cancelResolver });
|
|
60
66
|
logger.debug(
|
|
61
|
-
`Registered waiter for query ${queryId} with timeout ${timeout ? import_general.Duration.format(timeout)
|
|
67
|
+
`Registered waiter for query ${queryId} with timeout ${timeout === void 0 ? "(none)" : import_general.Duration.format(timeout)}${resolveOnUpdatedRecords ? "" : " (not resolving on updated records)"}`
|
|
62
68
|
);
|
|
63
69
|
await promise;
|
|
64
70
|
}
|
|
@@ -72,15 +78,17 @@ class BleScanner {
|
|
|
72
78
|
const { timer, resolver, resolveOnUpdatedRecords } = waiter;
|
|
73
79
|
if (isUpdatedRecord && !resolveOnUpdatedRecords) return;
|
|
74
80
|
logger.debug(`Finishing waiter for query ${queryId}, resolving: ${resolvePromise}`);
|
|
75
|
-
timer
|
|
81
|
+
timer?.stop();
|
|
76
82
|
if (resolvePromise) {
|
|
77
83
|
resolver();
|
|
78
84
|
}
|
|
79
85
|
this.recordWaiters.delete(queryId);
|
|
80
86
|
}
|
|
81
|
-
cancelCommissionableDeviceDiscovery(identifier) {
|
|
87
|
+
cancelCommissionableDeviceDiscovery(identifier, resolvePromise = true) {
|
|
82
88
|
const queryKey = this.buildCommissionableQueryIdentifier(identifier);
|
|
83
|
-
this.
|
|
89
|
+
const { cancelResolver } = this.recordWaiters.get(queryKey) ?? {};
|
|
90
|
+
cancelResolver?.();
|
|
91
|
+
this.finishWaiter(queryKey, resolvePromise);
|
|
84
92
|
}
|
|
85
93
|
handleDiscoveredDevice(peripheral, manufacturerServiceData) {
|
|
86
94
|
logger.debug(
|
|
@@ -206,12 +214,28 @@ class BleScanner {
|
|
|
206
214
|
}
|
|
207
215
|
return storedRecords.map(({ deviceData }) => deviceData);
|
|
208
216
|
}
|
|
209
|
-
async findCommissionableDevicesContinuously(identifier, callback, timeout
|
|
217
|
+
async findCommissionableDevicesContinuously(identifier, callback, timeout, cancelSignal) {
|
|
210
218
|
const discoveredDevices = /* @__PURE__ */ new Set();
|
|
211
|
-
const discoveryEndTime = import_general.Time.nowMs + timeout;
|
|
219
|
+
const discoveryEndTime = timeout ? import_general.Time.nowMs + timeout : void 0;
|
|
212
220
|
const queryKey = this.buildCommissionableQueryIdentifier(identifier);
|
|
213
221
|
await this.bleClient.startScanning();
|
|
214
|
-
|
|
222
|
+
let queryResolver;
|
|
223
|
+
if (cancelSignal === void 0) {
|
|
224
|
+
const { promise, resolver } = (0, import_general.createPromise)();
|
|
225
|
+
cancelSignal = promise;
|
|
226
|
+
queryResolver = resolver;
|
|
227
|
+
}
|
|
228
|
+
let canceled = false;
|
|
229
|
+
cancelSignal?.then(
|
|
230
|
+
() => {
|
|
231
|
+
canceled = true;
|
|
232
|
+
this.finishWaiter(queryKey, true);
|
|
233
|
+
},
|
|
234
|
+
(cause) => {
|
|
235
|
+
logger.error("Unexpected error canceling commissioning", cause);
|
|
236
|
+
}
|
|
237
|
+
);
|
|
238
|
+
while (!canceled) {
|
|
215
239
|
this.getCommissionableDevices(identifier).forEach(({ deviceData }) => {
|
|
216
240
|
const { deviceIdentifier } = deviceData;
|
|
217
241
|
if (!discoveredDevices.has(deviceIdentifier)) {
|
|
@@ -219,11 +243,14 @@ class BleScanner {
|
|
|
219
243
|
callback(deviceData);
|
|
220
244
|
}
|
|
221
245
|
});
|
|
222
|
-
|
|
223
|
-
if (
|
|
224
|
-
|
|
246
|
+
let remainingTime;
|
|
247
|
+
if (discoveryEndTime !== void 0) {
|
|
248
|
+
remainingTime = import_general.Millis.ceil((0, import_general.Timespan)(import_general.Time.nowMs, discoveryEndTime).duration);
|
|
249
|
+
if (remainingTime <= 0) {
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
225
252
|
}
|
|
226
|
-
await this.registerWaiterPromise(queryKey, remainingTime, false);
|
|
253
|
+
await this.registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
|
|
227
254
|
}
|
|
228
255
|
await this.bleClient.stopScanning();
|
|
229
256
|
return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/ble/BleScanner.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -32,7 +32,7 @@ export declare class BleScanner implements Scanner {
|
|
|
32
32
|
* promise.
|
|
33
33
|
*/
|
|
34
34
|
private finishWaiter;
|
|
35
|
-
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers): void;
|
|
35
|
+
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers, resolvePromise?: boolean): void;
|
|
36
36
|
private handleDiscoveredDevice;
|
|
37
37
|
private findCommissionableQueryIdentifier;
|
|
38
38
|
/**
|
|
@@ -44,7 +44,7 @@ export declare class BleScanner implements Scanner {
|
|
|
44
44
|
findOperationalDevice(): Promise<undefined>;
|
|
45
45
|
getDiscoveredOperationalDevice(): undefined;
|
|
46
46
|
findCommissionableDevices(identifier: CommissionableDeviceIdentifiers, timeout?: Duration, ignoreExistingRecords?: boolean): Promise<CommissionableDevice[]>;
|
|
47
|
-
findCommissionableDevicesContinuously(identifier: CommissionableDeviceIdentifiers, callback: (device: CommissionableDevice) => void, timeout?: Duration): Promise<CommissionableDevice[]>;
|
|
47
|
+
findCommissionableDevicesContinuously(identifier: CommissionableDeviceIdentifiers, callback: (device: CommissionableDevice) => void, timeout?: Duration, cancelSignal?: Promise<void>): Promise<CommissionableDevice[]>;
|
|
48
48
|
getDiscoveredCommissionableDevices(identifier: CommissionableDeviceIdentifiers): CommissionableDevice[];
|
|
49
49
|
close(): Promise<void>;
|
|
50
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BleScanner.d.ts","sourceRoot":"","sources":["../../../src/ble/BleScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,WAAW,EAAiB,QAAQ,
|
|
1
|
+
{"version":3,"file":"BleScanner.d.ts","sourceRoot":"","sources":["../../../src/ble/BleScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,WAAW,EAAiB,QAAQ,EAAkD,MAAM,UAAU,CAAC;AACvH,OAAO,EAAsB,oBAAoB,EAAE,+BAA+B,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/G,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAIjE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,wBAAwB,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,KAAK,wBAAwB,GAAG,oBAAoB,GAAG;IACnD,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,qBAAa,UAAW,YAAW,OAAO;IAgB1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAftC,IAAI,IAAI,gBAEP;IAED,OAAO,CAAC,QAAQ,CAAC,aAAa,CAQ1B;IACJ,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0C;gBAErD,SAAS,EAAE,oBAAoB;IAMrD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB;IAQhE;;;OAGG;YACW,qBAAqB;IAuBnC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAapB,mCAAmC,CAAC,UAAU,EAAE,+BAA+B,EAAE,cAAc,UAAO;IAOtG,OAAO,CAAC,sBAAsB;IAoC9B,OAAO,CAAC,iCAAiC;IAmCzC;;;OAGG;IACH,OAAO,CAAC,kCAAkC;IAa1C,OAAO,CAAC,wBAAwB;IA4B1B,qBAAqB,IAAI,OAAO,CAAC,SAAS,CAAC;IAKjD,8BAA8B,IAAI,SAAS;IAKrC,yBAAyB,CAC3B,UAAU,EAAE,+BAA+B,EAC3C,OAAO,WAAc,EACrB,qBAAqB,UAAQ,GAC9B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAqB5B,qCAAqC,CACvC,UAAU,EAAE,+BAA+B,EAC3C,QAAQ,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,EAChD,OAAO,CAAC,EAAE,QAAQ,EAClB,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAC7B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAgDlC,kCAAkC,CAAC,UAAU,EAAE,+BAA+B,GAAG,oBAAoB,EAAE;IAIjG,KAAK;CAMd"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Copyright 2022-2026 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Bytes, ChannelType, createPromise, Duration, Logger,
|
|
6
|
+
import { Bytes, ChannelType, createPromise, Duration, Logger, Millis, Seconds, Time, Timespan } from "#general";
|
|
7
7
|
import { BleError, BtpCodec } from "#protocol";
|
|
8
8
|
import { VendorId } from "#types";
|
|
9
9
|
const logger = Logger.get("BleScanner");
|
|
@@ -30,12 +30,18 @@ class BleScanner {
|
|
|
30
30
|
* Registers a deferred promise for a specific queryId together with a timeout and return the promise.
|
|
31
31
|
* The promise will be resolved when the timer runs out latest.
|
|
32
32
|
*/
|
|
33
|
-
async registerWaiterPromise(queryId, timeout, resolveOnUpdatedRecords = true) {
|
|
33
|
+
async registerWaiterPromise(queryId, timeout, resolveOnUpdatedRecords = true, cancelResolver) {
|
|
34
34
|
const { promise, resolver } = createPromise();
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
let timer;
|
|
36
|
+
if (timeout) {
|
|
37
|
+
timer = Time.getTimer("BLE query timeout", timeout, () => {
|
|
38
|
+
cancelResolver?.();
|
|
39
|
+
this.finishWaiter(queryId, true);
|
|
40
|
+
}).start();
|
|
41
|
+
}
|
|
42
|
+
this.recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords, cancelResolver });
|
|
37
43
|
logger.debug(
|
|
38
|
-
`Registered waiter for query ${queryId} with timeout ${timeout ?
|
|
44
|
+
`Registered waiter for query ${queryId} with timeout ${timeout === void 0 ? "(none)" : Duration.format(timeout)}${resolveOnUpdatedRecords ? "" : " (not resolving on updated records)"}`
|
|
39
45
|
);
|
|
40
46
|
await promise;
|
|
41
47
|
}
|
|
@@ -49,15 +55,17 @@ class BleScanner {
|
|
|
49
55
|
const { timer, resolver, resolveOnUpdatedRecords } = waiter;
|
|
50
56
|
if (isUpdatedRecord && !resolveOnUpdatedRecords) return;
|
|
51
57
|
logger.debug(`Finishing waiter for query ${queryId}, resolving: ${resolvePromise}`);
|
|
52
|
-
timer
|
|
58
|
+
timer?.stop();
|
|
53
59
|
if (resolvePromise) {
|
|
54
60
|
resolver();
|
|
55
61
|
}
|
|
56
62
|
this.recordWaiters.delete(queryId);
|
|
57
63
|
}
|
|
58
|
-
cancelCommissionableDeviceDiscovery(identifier) {
|
|
64
|
+
cancelCommissionableDeviceDiscovery(identifier, resolvePromise = true) {
|
|
59
65
|
const queryKey = this.buildCommissionableQueryIdentifier(identifier);
|
|
60
|
-
this.
|
|
66
|
+
const { cancelResolver } = this.recordWaiters.get(queryKey) ?? {};
|
|
67
|
+
cancelResolver?.();
|
|
68
|
+
this.finishWaiter(queryKey, resolvePromise);
|
|
61
69
|
}
|
|
62
70
|
handleDiscoveredDevice(peripheral, manufacturerServiceData) {
|
|
63
71
|
logger.debug(
|
|
@@ -183,12 +191,28 @@ class BleScanner {
|
|
|
183
191
|
}
|
|
184
192
|
return storedRecords.map(({ deviceData }) => deviceData);
|
|
185
193
|
}
|
|
186
|
-
async findCommissionableDevicesContinuously(identifier, callback, timeout
|
|
194
|
+
async findCommissionableDevicesContinuously(identifier, callback, timeout, cancelSignal) {
|
|
187
195
|
const discoveredDevices = /* @__PURE__ */ new Set();
|
|
188
|
-
const discoveryEndTime = Time.nowMs + timeout;
|
|
196
|
+
const discoveryEndTime = timeout ? Time.nowMs + timeout : void 0;
|
|
189
197
|
const queryKey = this.buildCommissionableQueryIdentifier(identifier);
|
|
190
198
|
await this.bleClient.startScanning();
|
|
191
|
-
|
|
199
|
+
let queryResolver;
|
|
200
|
+
if (cancelSignal === void 0) {
|
|
201
|
+
const { promise, resolver } = createPromise();
|
|
202
|
+
cancelSignal = promise;
|
|
203
|
+
queryResolver = resolver;
|
|
204
|
+
}
|
|
205
|
+
let canceled = false;
|
|
206
|
+
cancelSignal?.then(
|
|
207
|
+
() => {
|
|
208
|
+
canceled = true;
|
|
209
|
+
this.finishWaiter(queryKey, true);
|
|
210
|
+
},
|
|
211
|
+
(cause) => {
|
|
212
|
+
logger.error("Unexpected error canceling commissioning", cause);
|
|
213
|
+
}
|
|
214
|
+
);
|
|
215
|
+
while (!canceled) {
|
|
192
216
|
this.getCommissionableDevices(identifier).forEach(({ deviceData }) => {
|
|
193
217
|
const { deviceIdentifier } = deviceData;
|
|
194
218
|
if (!discoveredDevices.has(deviceIdentifier)) {
|
|
@@ -196,11 +220,14 @@ class BleScanner {
|
|
|
196
220
|
callback(deviceData);
|
|
197
221
|
}
|
|
198
222
|
});
|
|
199
|
-
|
|
200
|
-
if (
|
|
201
|
-
|
|
223
|
+
let remainingTime;
|
|
224
|
+
if (discoveryEndTime !== void 0) {
|
|
225
|
+
remainingTime = Millis.ceil(Timespan(Time.nowMs, discoveryEndTime).duration);
|
|
226
|
+
if (remainingTime <= 0) {
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
202
229
|
}
|
|
203
|
-
await this.registerWaiterPromise(queryKey, remainingTime, false);
|
|
230
|
+
await this.registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
|
|
204
231
|
}
|
|
205
232
|
await this.bleClient.stopScanning();
|
|
206
233
|
return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/ble/BleScanner.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,OAAO,aAAa,eAAe,UAAU,QAAQ,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/react-native",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.10-alpha.0-20260218-52b333ceb",
|
|
4
4
|
"description": "Experimental React Native support for matter.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -36,9 +36,9 @@
|
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
38
|
"@craftzdog/react-native-buffer": "6.1.1",
|
|
39
|
-
"@matter/general": "0.16.
|
|
40
|
-
"@matter/nodejs": "0.16.
|
|
41
|
-
"@matter/protocol": "0.16.
|
|
39
|
+
"@matter/general": "0.16.10-alpha.0-20260218-52b333ceb",
|
|
40
|
+
"@matter/nodejs": "0.16.10-alpha.0-20260218-52b333ceb",
|
|
41
|
+
"@matter/protocol": "0.16.10-alpha.0-20260218-52b333ceb",
|
|
42
42
|
"@react-native-async-storage/async-storage": "^2.2.0",
|
|
43
43
|
"@react-native-community/netinfo": "^12.0.1",
|
|
44
44
|
"@types/node": "^25.2.2",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"react-native-udp": "^4.1.7"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@matter/tools": "0.16.
|
|
51
|
+
"@matter/tools": "0.16.10-alpha.0-20260218-52b333ceb"
|
|
52
52
|
},
|
|
53
53
|
"overrides": {
|
|
54
54
|
"brorand": "npm:@matter.js/brorand@1.1.0"
|
package/src/ble/BleScanner.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { Bytes, ChannelType, createPromise, Duration, Logger,
|
|
7
|
+
import { Bytes, ChannelType, createPromise, Duration, Logger, Millis, Seconds, Time, Timer, Timespan } from "#general";
|
|
8
8
|
import { BleError, BtpCodec, CommissionableDevice, CommissionableDeviceIdentifiers, Scanner } from "#protocol";
|
|
9
9
|
import { VendorId } from "#types";
|
|
10
10
|
import { Device } from "react-native-ble-plx";
|
|
@@ -31,8 +31,9 @@ export class BleScanner implements Scanner {
|
|
|
31
31
|
string,
|
|
32
32
|
{
|
|
33
33
|
resolver: () => void;
|
|
34
|
-
timer
|
|
34
|
+
timer?: Timer;
|
|
35
35
|
resolveOnUpdatedRecords: boolean;
|
|
36
|
+
cancelResolver?: (value: void) => void;
|
|
36
37
|
}
|
|
37
38
|
>();
|
|
38
39
|
private readonly discoveredMatterDevices = new Map<string, DiscoveredBleDevice>();
|
|
@@ -55,12 +56,23 @@ export class BleScanner implements Scanner {
|
|
|
55
56
|
* Registers a deferred promise for a specific queryId together with a timeout and return the promise.
|
|
56
57
|
* The promise will be resolved when the timer runs out latest.
|
|
57
58
|
*/
|
|
58
|
-
private async registerWaiterPromise(
|
|
59
|
+
private async registerWaiterPromise(
|
|
60
|
+
queryId: string,
|
|
61
|
+
timeout?: Duration,
|
|
62
|
+
resolveOnUpdatedRecords = true,
|
|
63
|
+
cancelResolver?: (value: void) => void,
|
|
64
|
+
) {
|
|
59
65
|
const { promise, resolver } = createPromise<void>();
|
|
60
|
-
|
|
61
|
-
|
|
66
|
+
let timer;
|
|
67
|
+
if (timeout) {
|
|
68
|
+
timer = Time.getTimer("BLE query timeout", timeout, () => {
|
|
69
|
+
cancelResolver?.();
|
|
70
|
+
this.finishWaiter(queryId, true);
|
|
71
|
+
}).start();
|
|
72
|
+
}
|
|
73
|
+
this.recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords, cancelResolver });
|
|
62
74
|
logger.debug(
|
|
63
|
-
`Registered waiter for query ${queryId} with timeout ${timeout ?
|
|
75
|
+
`Registered waiter for query ${queryId} with timeout ${timeout === undefined ? "(none)" : Duration.format(timeout)}${
|
|
64
76
|
resolveOnUpdatedRecords ? "" : " (not resolving on updated records)"
|
|
65
77
|
}`,
|
|
66
78
|
);
|
|
@@ -77,16 +89,18 @@ export class BleScanner implements Scanner {
|
|
|
77
89
|
const { timer, resolver, resolveOnUpdatedRecords } = waiter;
|
|
78
90
|
if (isUpdatedRecord && !resolveOnUpdatedRecords) return;
|
|
79
91
|
logger.debug(`Finishing waiter for query ${queryId}, resolving: ${resolvePromise}`);
|
|
80
|
-
timer
|
|
92
|
+
timer?.stop();
|
|
81
93
|
if (resolvePromise) {
|
|
82
94
|
resolver();
|
|
83
95
|
}
|
|
84
96
|
this.recordWaiters.delete(queryId);
|
|
85
97
|
}
|
|
86
98
|
|
|
87
|
-
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers) {
|
|
99
|
+
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers, resolvePromise = true) {
|
|
88
100
|
const queryKey = this.buildCommissionableQueryIdentifier(identifier);
|
|
89
|
-
this.
|
|
101
|
+
const { cancelResolver } = this.recordWaiters.get(queryKey) ?? {};
|
|
102
|
+
cancelResolver?.();
|
|
103
|
+
this.finishWaiter(queryKey, resolvePromise);
|
|
90
104
|
}
|
|
91
105
|
|
|
92
106
|
private handleDiscoveredDevice(peripheral: Device, manufacturerServiceData: Bytes) {
|
|
@@ -243,15 +257,34 @@ export class BleScanner implements Scanner {
|
|
|
243
257
|
async findCommissionableDevicesContinuously(
|
|
244
258
|
identifier: CommissionableDeviceIdentifiers,
|
|
245
259
|
callback: (device: CommissionableDevice) => void,
|
|
246
|
-
timeout
|
|
260
|
+
timeout?: Duration,
|
|
261
|
+
cancelSignal?: Promise<void>,
|
|
247
262
|
): Promise<CommissionableDevice[]> {
|
|
248
263
|
const discoveredDevices = new Set<string>();
|
|
249
264
|
|
|
250
|
-
const discoveryEndTime = Time.nowMs + timeout;
|
|
265
|
+
const discoveryEndTime = timeout ? Time.nowMs + timeout : undefined;
|
|
251
266
|
const queryKey = this.buildCommissionableQueryIdentifier(identifier);
|
|
252
267
|
await this.bleClient.startScanning();
|
|
253
268
|
|
|
254
|
-
|
|
269
|
+
let queryResolver: ((value: void) => void) | undefined;
|
|
270
|
+
if (cancelSignal === undefined) {
|
|
271
|
+
const { promise, resolver } = createPromise<void>();
|
|
272
|
+
cancelSignal = promise;
|
|
273
|
+
queryResolver = resolver;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
let canceled = false;
|
|
277
|
+
cancelSignal?.then(
|
|
278
|
+
() => {
|
|
279
|
+
canceled = true;
|
|
280
|
+
this.finishWaiter(queryKey, true);
|
|
281
|
+
},
|
|
282
|
+
cause => {
|
|
283
|
+
logger.error("Unexpected error canceling commissioning", cause);
|
|
284
|
+
},
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
while (!canceled) {
|
|
255
288
|
this.getCommissionableDevices(identifier).forEach(({ deviceData }) => {
|
|
256
289
|
const { deviceIdentifier } = deviceData;
|
|
257
290
|
if (!discoveredDevices.has(deviceIdentifier)) {
|
|
@@ -260,12 +293,15 @@ export class BleScanner implements Scanner {
|
|
|
260
293
|
}
|
|
261
294
|
});
|
|
262
295
|
|
|
263
|
-
|
|
264
|
-
if (
|
|
265
|
-
|
|
296
|
+
let remainingTime;
|
|
297
|
+
if (discoveryEndTime !== undefined) {
|
|
298
|
+
remainingTime = Millis.ceil(Timespan(Time.nowMs, discoveryEndTime).duration);
|
|
299
|
+
if (remainingTime <= 0) {
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
266
302
|
}
|
|
267
303
|
|
|
268
|
-
await this.registerWaiterPromise(queryKey, remainingTime, false);
|
|
304
|
+
await this.registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
|
|
269
305
|
}
|
|
270
306
|
await this.bleClient.stopScanning();
|
|
271
307
|
return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|