@matter/nodejs-ble 0.14.1-alpha.0-20250607-a93593303 → 0.15.0-alpha.0-20250613-a55f991d4
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/BleScanner.d.ts +3 -23
- package/dist/cjs/BleScanner.d.ts.map +1 -1
- package/dist/cjs/BleScanner.js +71 -65
- package/dist/cjs/BleScanner.js.map +2 -2
- package/dist/cjs/NobleBleClient.d.ts.map +1 -1
- package/dist/cjs/NobleBleClient.js +1 -1
- package/dist/cjs/NobleBleClient.js.map +1 -1
- package/dist/esm/BleScanner.d.ts +3 -23
- package/dist/esm/BleScanner.d.ts.map +1 -1
- package/dist/esm/BleScanner.js +71 -65
- package/dist/esm/BleScanner.js.map +2 -2
- package/dist/esm/NobleBleClient.d.ts.map +1 -1
- package/dist/esm/NobleBleClient.js +1 -1
- package/dist/esm/NobleBleClient.js.map +1 -1
- package/package.json +5 -5
- package/src/BleScanner.ts +80 -62
- package/src/NobleBleClient.ts +1 -3
package/dist/cjs/BleScanner.d.ts
CHANGED
|
@@ -16,31 +16,11 @@ type CommissionableDeviceData = CommissionableDevice & {
|
|
|
16
16
|
SD: number;
|
|
17
17
|
};
|
|
18
18
|
export declare class BleScanner implements Scanner {
|
|
19
|
-
private
|
|
20
|
-
|
|
21
|
-
private readonly recordWaiters;
|
|
22
|
-
private readonly discoveredMatterDevices;
|
|
19
|
+
#private;
|
|
20
|
+
readonly type = ChannelType.BLE;
|
|
23
21
|
constructor(nobleClient: NobleBleClient);
|
|
24
22
|
getDiscoveredDevice(address: string): DiscoveredBleDevice;
|
|
25
|
-
|
|
26
|
-
* Registers a deferred promise for a specific queryId together with a timeout and return the promise.
|
|
27
|
-
* The promise will be resolved when the timer runs out latest.
|
|
28
|
-
*/
|
|
29
|
-
private registerWaiterPromise;
|
|
30
|
-
/**
|
|
31
|
-
* Remove a waiter promise for a specific queryId and stop the connected timer. If required also resolve the
|
|
32
|
-
* promise.
|
|
33
|
-
*/
|
|
34
|
-
private finishWaiter;
|
|
35
|
-
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers): void;
|
|
36
|
-
private handleDiscoveredDevice;
|
|
37
|
-
private findCommissionableQueryIdentifier;
|
|
38
|
-
/**
|
|
39
|
-
* Builds an identifier string for commissionable queries based on the given identifier object.
|
|
40
|
-
* Some identifiers are identical to the official DNS-SD identifiers, others are custom.
|
|
41
|
-
*/
|
|
42
|
-
private buildCommissionableQueryIdentifier;
|
|
43
|
-
private getCommissionableDevices;
|
|
23
|
+
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers, resolvePromise?: boolean): void;
|
|
44
24
|
findOperationalDevice(): Promise<undefined>;
|
|
45
25
|
getDiscoveredOperationalDevice(): undefined;
|
|
46
26
|
findCommissionableDevices(identifier: CommissionableDeviceIdentifiers, timeoutSeconds?: number, ignoreExistingRecords?: boolean): Promise<CommissionableDevice[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BleScanner.d.ts","sourceRoot":"","sources":["../../src/BleScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,WAAW,EAAkD,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAsB,oBAAoB,EAAE,+BAA+B,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,wBAAwB,CAAC;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,8BAA8B,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,KAAK,wBAAwB,GAAG,oBAAoB,GAAG;IACnD,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,qBAAa,UAAW,YAAW,OAAO
|
|
1
|
+
{"version":3,"file":"BleScanner.d.ts","sourceRoot":"","sources":["../../src/BleScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,WAAW,EAAkD,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAsB,oBAAoB,EAAE,+BAA+B,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,wBAAwB,CAAC;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,8BAA8B,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,KAAK,wBAAwB,GAAG,oBAAoB,GAAG;IACnD,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,qBAAa,UAAW,YAAW,OAAO;;IACtC,QAAQ,CAAC,IAAI,mBAAmB;gBAcpB,WAAW,EAAE,cAAc;IAOhC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB;IAoDhE,mCAAmC,CAAC,UAAU,EAAE,+BAA+B,EAAE,cAAc,UAAO;IA8HhG,qBAAqB,IAAI,OAAO,CAAC,SAAS,CAAC;IAKjD,8BAA8B,IAAI,SAAS;IAKrC,yBAAyB,CAC3B,UAAU,EAAE,+BAA+B,EAC3C,cAAc,SAAK,EACnB,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,cAAc,CAAC,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAC7B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAmDlC,kCAAkC,CAAC,UAAU,EAAE,+BAA+B,GAAG,oBAAoB,EAAE;IAIjG,KAAK;CAMd"}
|
package/dist/cjs/BleScanner.js
CHANGED
|
@@ -31,19 +31,18 @@ var import_types = require("#types");
|
|
|
31
31
|
*/
|
|
32
32
|
const logger = import_general.Logger.get("BleScanner");
|
|
33
33
|
class BleScanner {
|
|
34
|
+
type = import_general.ChannelType.BLE;
|
|
35
|
+
#nobleClient;
|
|
36
|
+
#recordWaiters = /* @__PURE__ */ new Map();
|
|
37
|
+
#discoveredMatterDevices = /* @__PURE__ */ new Map();
|
|
34
38
|
constructor(nobleClient) {
|
|
35
|
-
this
|
|
36
|
-
this
|
|
37
|
-
(address, manufacturerData) => this
|
|
39
|
+
this.#nobleClient = nobleClient;
|
|
40
|
+
this.#nobleClient.setDiscoveryCallback(
|
|
41
|
+
(address, manufacturerData) => this.#handleDiscoveredDevice(address, manufacturerData)
|
|
38
42
|
);
|
|
39
43
|
}
|
|
40
|
-
get type() {
|
|
41
|
-
return import_general.ChannelType.BLE;
|
|
42
|
-
}
|
|
43
|
-
recordWaiters = /* @__PURE__ */ new Map();
|
|
44
|
-
discoveredMatterDevices = /* @__PURE__ */ new Map();
|
|
45
44
|
getDiscoveredDevice(address) {
|
|
46
|
-
const device = this
|
|
45
|
+
const device = this.#discoveredMatterDevices.get(address);
|
|
47
46
|
if (device === void 0) {
|
|
48
47
|
throw new import_protocol.BleError(`No device found for address ${address}`);
|
|
49
48
|
}
|
|
@@ -53,17 +52,16 @@ class BleScanner {
|
|
|
53
52
|
* Registers a deferred promise for a specific queryId together with a timeout and return the promise.
|
|
54
53
|
* The promise will be resolved when the timer runs out latest.
|
|
55
54
|
*/
|
|
56
|
-
async registerWaiterPromise(queryId, timeoutSeconds, resolveOnUpdatedRecords = true) {
|
|
55
|
+
async #registerWaiterPromise(queryId, timeoutSeconds, resolveOnUpdatedRecords = true, cancelResolver) {
|
|
57
56
|
const { promise, resolver } = (0, import_general.createPromise)();
|
|
58
57
|
let timer;
|
|
59
58
|
if (timeoutSeconds !== void 0) {
|
|
60
|
-
timer = import_general.Time.getTimer(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
).start();
|
|
59
|
+
timer = import_general.Time.getTimer("BLE query timeout", timeoutSeconds * 1e3, () => {
|
|
60
|
+
cancelResolver?.();
|
|
61
|
+
this.#finishWaiter(queryId, true);
|
|
62
|
+
}).start();
|
|
65
63
|
}
|
|
66
|
-
this
|
|
64
|
+
this.#recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords, cancelResolver });
|
|
67
65
|
logger.debug(
|
|
68
66
|
`Registered waiter for query ${queryId} with timeout ${timeoutSeconds} seconds${resolveOnUpdatedRecords ? "" : " (not resolving on updated records)"}`
|
|
69
67
|
);
|
|
@@ -73,8 +71,8 @@ class BleScanner {
|
|
|
73
71
|
* Remove a waiter promise for a specific queryId and stop the connected timer. If required also resolve the
|
|
74
72
|
* promise.
|
|
75
73
|
*/
|
|
76
|
-
finishWaiter(queryId, resolvePromise, isUpdatedRecord = false) {
|
|
77
|
-
const waiter = this
|
|
74
|
+
#finishWaiter(queryId, resolvePromise, isUpdatedRecord = false) {
|
|
75
|
+
const waiter = this.#recordWaiters.get(queryId);
|
|
78
76
|
if (waiter === void 0) return;
|
|
79
77
|
const { timer, resolver, resolveOnUpdatedRecords } = waiter;
|
|
80
78
|
if (isUpdatedRecord && !resolveOnUpdatedRecords) return;
|
|
@@ -83,17 +81,16 @@ class BleScanner {
|
|
|
83
81
|
if (resolvePromise) {
|
|
84
82
|
resolver();
|
|
85
83
|
}
|
|
86
|
-
this
|
|
84
|
+
this.#recordWaiters.delete(queryId);
|
|
87
85
|
}
|
|
88
|
-
cancelCommissionableDeviceDiscovery(identifier) {
|
|
89
|
-
const queryKey = this
|
|
90
|
-
this.
|
|
86
|
+
cancelCommissionableDeviceDiscovery(identifier, resolvePromise = true) {
|
|
87
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
88
|
+
const { cancelResolver } = this.#recordWaiters.get(queryKey) ?? {};
|
|
89
|
+
cancelResolver?.();
|
|
90
|
+
this.#finishWaiter(queryKey, resolvePromise);
|
|
91
91
|
}
|
|
92
|
-
handleDiscoveredDevice(peripheral, manufacturerServiceData) {
|
|
92
|
+
#handleDiscoveredDevice(peripheral, manufacturerServiceData) {
|
|
93
93
|
const address = peripheral.address;
|
|
94
|
-
logger.debug(
|
|
95
|
-
`Discovered device ${address} ${manufacturerServiceData === void 0 ? void 0 : import_general.Bytes.toHex(manufacturerServiceData)}`
|
|
96
|
-
);
|
|
97
94
|
try {
|
|
98
95
|
const { discriminator, vendorId, productId, hasAdditionalAdvertisementData } = import_protocol.BtpCodec.decodeBleAdvertisementServiceData(manufacturerServiceData);
|
|
99
96
|
const deviceData = {
|
|
@@ -105,49 +102,51 @@ class BleScanner {
|
|
|
105
102
|
// Can be no other mode,
|
|
106
103
|
addresses: [{ type: "ble", peripheralAddress: address }]
|
|
107
104
|
};
|
|
108
|
-
const deviceExisting = this
|
|
105
|
+
const deviceExisting = this.#discoveredMatterDevices.has(address);
|
|
109
106
|
logger.debug(
|
|
110
107
|
`${deviceExisting ? "Re-" : ""}Discovered device ${address} data: ${import_general.Diagnostic.json(deviceData)}`
|
|
111
108
|
);
|
|
112
|
-
this
|
|
109
|
+
this.#discoveredMatterDevices.set(address, {
|
|
113
110
|
deviceData,
|
|
114
111
|
peripheral,
|
|
115
112
|
hasAdditionalAdvertisementData
|
|
116
113
|
});
|
|
117
|
-
const queryKey = this
|
|
114
|
+
const queryKey = this.#findCommissionableQueryIdentifier(deviceData);
|
|
118
115
|
if (queryKey !== void 0) {
|
|
119
|
-
this
|
|
116
|
+
this.#finishWaiter(queryKey, true, deviceExisting);
|
|
120
117
|
}
|
|
121
118
|
} catch (error) {
|
|
122
|
-
logger.debug(
|
|
119
|
+
logger.debug(
|
|
120
|
+
`Discovered device ${address} ${manufacturerServiceData === void 0 ? void 0 : import_general.Bytes.toHex(manufacturerServiceData)} does not seem to be a valid Matter device: ${error}`
|
|
121
|
+
);
|
|
123
122
|
}
|
|
124
123
|
}
|
|
125
|
-
findCommissionableQueryIdentifier(record) {
|
|
126
|
-
const longDiscriminatorQueryId = this
|
|
127
|
-
if (this
|
|
124
|
+
#findCommissionableQueryIdentifier(record) {
|
|
125
|
+
const longDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ longDiscriminator: record.D });
|
|
126
|
+
if (this.#recordWaiters.has(longDiscriminatorQueryId)) {
|
|
128
127
|
return longDiscriminatorQueryId;
|
|
129
128
|
}
|
|
130
|
-
const shortDiscriminatorQueryId = this
|
|
131
|
-
if (this
|
|
129
|
+
const shortDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ shortDiscriminator: record.SD });
|
|
130
|
+
if (this.#recordWaiters.has(shortDiscriminatorQueryId)) {
|
|
132
131
|
return shortDiscriminatorQueryId;
|
|
133
132
|
}
|
|
134
133
|
if (record.VP !== void 0) {
|
|
135
|
-
const vendorIdQueryId = this
|
|
134
|
+
const vendorIdQueryId = this.#buildCommissionableQueryIdentifier({
|
|
136
135
|
vendorId: (0, import_types.VendorId)(parseInt(record.VP.split("+")[0]))
|
|
137
136
|
});
|
|
138
|
-
if (this
|
|
137
|
+
if (this.#recordWaiters.has(vendorIdQueryId)) {
|
|
139
138
|
return vendorIdQueryId;
|
|
140
139
|
}
|
|
141
140
|
if (record.VP.includes("+")) {
|
|
142
|
-
const productIdQueryId = this
|
|
141
|
+
const productIdQueryId = this.#buildCommissionableQueryIdentifier({
|
|
143
142
|
vendorId: (0, import_types.VendorId)(parseInt(record.VP.split("+")[1]))
|
|
144
143
|
});
|
|
145
|
-
if (this
|
|
144
|
+
if (this.#recordWaiters.has(productIdQueryId)) {
|
|
146
145
|
return productIdQueryId;
|
|
147
146
|
}
|
|
148
147
|
}
|
|
149
148
|
}
|
|
150
|
-
if (this
|
|
149
|
+
if (this.#recordWaiters.has("*")) {
|
|
151
150
|
return "*";
|
|
152
151
|
}
|
|
153
152
|
return void 0;
|
|
@@ -156,7 +155,7 @@ class BleScanner {
|
|
|
156
155
|
* Builds an identifier string for commissionable queries based on the given identifier object.
|
|
157
156
|
* Some identifiers are identical to the official DNS-SD identifiers, others are custom.
|
|
158
157
|
*/
|
|
159
|
-
buildCommissionableQueryIdentifier(identifier) {
|
|
158
|
+
#buildCommissionableQueryIdentifier(identifier) {
|
|
160
159
|
if ("longDiscriminator" in identifier) {
|
|
161
160
|
return `D:${identifier.longDiscriminator}`;
|
|
162
161
|
} else if ("shortDiscriminator" in identifier) {
|
|
@@ -167,8 +166,8 @@ class BleScanner {
|
|
|
167
166
|
return `P:${identifier.productId}`;
|
|
168
167
|
} else return "*";
|
|
169
168
|
}
|
|
170
|
-
getCommissionableDevices(identifier) {
|
|
171
|
-
const storedRecords = Array.from(this
|
|
169
|
+
#getCommissionableDevices(identifier) {
|
|
170
|
+
const storedRecords = Array.from(this.#discoveredMatterDevices.values());
|
|
172
171
|
const foundRecords = new Array();
|
|
173
172
|
if ("longDiscriminator" in identifier) {
|
|
174
173
|
foundRecords.push(...storedRecords.filter(({ deviceData: { D } }) => D === identifier.longDiscriminator));
|
|
@@ -200,39 +199,47 @@ class BleScanner {
|
|
|
200
199
|
return void 0;
|
|
201
200
|
}
|
|
202
201
|
async findCommissionableDevices(identifier, timeoutSeconds = 10, ignoreExistingRecords = false) {
|
|
203
|
-
let storedRecords = this
|
|
202
|
+
let storedRecords = this.#getCommissionableDevices(identifier);
|
|
204
203
|
if (ignoreExistingRecords) {
|
|
205
204
|
for (const record of storedRecords) {
|
|
206
|
-
this
|
|
205
|
+
this.#discoveredMatterDevices.delete(record.peripheral.address);
|
|
207
206
|
}
|
|
208
207
|
storedRecords = [];
|
|
209
208
|
}
|
|
210
209
|
if (storedRecords.length === 0) {
|
|
211
|
-
const queryKey = this
|
|
212
|
-
await this
|
|
213
|
-
await this
|
|
214
|
-
storedRecords = this
|
|
215
|
-
await this
|
|
210
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
211
|
+
await this.#nobleClient.startScanning();
|
|
212
|
+
await this.#registerWaiterPromise(queryKey, timeoutSeconds);
|
|
213
|
+
storedRecords = this.#getCommissionableDevices(identifier);
|
|
214
|
+
await this.#nobleClient.stopScanning();
|
|
216
215
|
}
|
|
217
216
|
return storedRecords.map(({ deviceData }) => deviceData);
|
|
218
217
|
}
|
|
219
218
|
async findCommissionableDevicesContinuously(identifier, callback, timeoutSeconds, cancelSignal) {
|
|
220
219
|
const discoveredDevices = /* @__PURE__ */ new Set();
|
|
221
220
|
const discoveryEndTime = timeoutSeconds ? import_general.Time.nowMs() + timeoutSeconds * 1e3 : void 0;
|
|
222
|
-
const queryKey = this
|
|
223
|
-
await this
|
|
221
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
222
|
+
await this.#nobleClient.startScanning();
|
|
223
|
+
let queryResolver;
|
|
224
|
+
if (cancelSignal === void 0) {
|
|
225
|
+
const { promise, resolver } = (0, import_general.createPromise)();
|
|
226
|
+
cancelSignal = promise;
|
|
227
|
+
queryResolver = resolver;
|
|
228
|
+
}
|
|
224
229
|
let canceled = false;
|
|
225
230
|
cancelSignal?.then(
|
|
226
231
|
() => {
|
|
227
232
|
canceled = true;
|
|
228
|
-
|
|
233
|
+
if (queryResolver === void 0) {
|
|
234
|
+
this.#finishWaiter(queryKey, true);
|
|
235
|
+
}
|
|
229
236
|
},
|
|
230
237
|
(cause) => {
|
|
231
238
|
logger.error("Unexpected error canceling commissioning", cause);
|
|
232
239
|
}
|
|
233
240
|
);
|
|
234
241
|
while (!canceled) {
|
|
235
|
-
this
|
|
242
|
+
this.#getCommissionableDevices(identifier).forEach(({ deviceData }) => {
|
|
236
243
|
const { deviceIdentifier } = deviceData;
|
|
237
244
|
if (!discoveredDevices.has(deviceIdentifier)) {
|
|
238
245
|
discoveredDevices.add(deviceIdentifier);
|
|
@@ -241,24 +248,23 @@ class BleScanner {
|
|
|
241
248
|
});
|
|
242
249
|
let remainingTime;
|
|
243
250
|
if (discoveryEndTime !== void 0) {
|
|
244
|
-
|
|
245
|
-
if (
|
|
251
|
+
remainingTime = Math.ceil((discoveryEndTime - import_general.Time.nowMs()) / 1e3);
|
|
252
|
+
if (remainingTime <= 0) {
|
|
246
253
|
break;
|
|
247
254
|
}
|
|
248
255
|
}
|
|
249
|
-
|
|
250
|
-
await waiter;
|
|
256
|
+
await this.#registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
|
|
251
257
|
}
|
|
252
|
-
await this
|
|
253
|
-
return this
|
|
258
|
+
await this.#nobleClient.stopScanning();
|
|
259
|
+
return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|
|
254
260
|
}
|
|
255
261
|
getDiscoveredCommissionableDevices(identifier) {
|
|
256
|
-
return this
|
|
262
|
+
return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|
|
257
263
|
}
|
|
258
264
|
async close() {
|
|
259
|
-
this
|
|
260
|
-
[...this
|
|
261
|
-
(queryId) => this
|
|
265
|
+
this.#nobleClient.close();
|
|
266
|
+
[...this.#recordWaiters.keys()].forEach(
|
|
267
|
+
(queryId) => this.#finishWaiter(queryId, !!this.#recordWaiters.get(queryId)?.timer)
|
|
262
268
|
);
|
|
263
269
|
}
|
|
264
270
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/BleScanner.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAAmF;AACnF,sBAAmG;AACnG,mBAAyB;AARzB;AAAA;AAAA;AAAA;AAAA;AAYA,MAAM,SAAS,sBAAO,IAAI,YAAY;AAY/B,MAAM,WAA8B;AAAA,
|
|
5
|
-
"names": [
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NobleBleClient.d.ts","sourceRoot":"","sources":["../../src/NobleBleClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkB5C,qBAAa,cAAc;;IACvB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAGlC;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,wBAAwB,CAA+E;gBAGnG,OAAO,CAAC,EAAE,UAAU;IAqCzB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,KAAK,IAAI;IAOvF,aAAa;
|
|
1
|
+
{"version":3,"file":"NobleBleClient.d.ts","sourceRoot":"","sources":["../../src/NobleBleClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkB5C,qBAAa,cAAc;;IACvB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAGlC;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,wBAAwB,CAA+E;gBAGnG,OAAO,CAAC,EAAE,UAAU;IAqCzB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,KAAK,IAAI;IAOvF,aAAa;IAcb,YAAY;IASzB,OAAO,CAAC,sBAAsB;IAsC9B,KAAK;CAgBR"}
|
|
@@ -85,7 +85,7 @@ class NobleBleClient {
|
|
|
85
85
|
this.shouldScan = true;
|
|
86
86
|
if (this.nobleState === "poweredOn") {
|
|
87
87
|
logger.debug("Start BLE scanning for Matter Services ...");
|
|
88
|
-
await noble.startScanningAsync(
|
|
88
|
+
await noble.startScanningAsync([import_protocol.BLE_MATTER_SERVICE_UUID], true);
|
|
89
89
|
} else {
|
|
90
90
|
logger.debug("noble state is not poweredOn ... delay scanning till poweredOn");
|
|
91
91
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/NobleBleClient.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAAmC;AACnC,sBAAwC;AACxC,qBAAwB;AAExB,0BAAyB;AAVzB;AAAA;AAAA;AAAA;AAAA;AAaA,MAAM,SAAS,sBAAO,IAAI,gBAAgB;AAC1C,IAAI;AAEJ,SAAS,UAAU,OAAgB;AAE/B,MAAI,UAAU,QAAW;AACrB,YAAQ,IAAI,sBAAsB,MAAM,SAAS;AAAA,EACrD;AACA,cAAQ,wBAAQ,mBAAmB;AACnC,MAAI,OAAO,MAAM,OAAO,YAAY;AAGhC,YAAS,MAAc,EAAE,UAAU,MAAM,CAAC;AAAA,EAC9C;AACJ;AAEO,MAAM,eAAe;AAAA,EACP,wBAAwB,oBAAI,IAG3C;AAAA,EACM,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACR,WAAW;AAAA,EAEX,YAAY,SAAsB;AAC9B,UAAM,EAAE,YAAY,IAAI,WAAW,CAAC;AACpC,iBAAa,QAAQ,IAAI,IAAI;AAE7B,cAAU,SAAS,KAAK;AAUxB,UAAM,GAAG,eAAe,WAAS;AAC7B,WAAK,aAAa;AAClB,aAAO,MAAM,0BAA0B,KAAK,EAAE;AAC9C,UAAI,UAAU,aAAa;AACvB,YAAI,KAAK,YAAY;AACjB,eAAK,KAAK,cAAc;AAAA,QAC5B;AAAA,MACJ,OAAO;AACH,aAAK,KAAK,aAAa;AAAA,MAC3B;AAAA,IACJ,CAAC;AACD,UAAM,GAAG,YAAY,gBAAc,KAAK,uBAAuB,UAAU,CAAC;AAC1E,UAAM,GAAG,aAAa,MAAM;AACxB,UAAI,CAAC,KAAK,YAAY;AAGlB;AAAA,MACJ;AACA,WAAK,aAAa;AAAA,IACtB,CAAC;AACD,UAAM,GAAG,YAAY,MAAO,KAAK,aAAa,KAAM;AAAA,EACxD;AAAA,EAEO,qBAAqB,UAA0E;AAClG,SAAK,2BAA2B;AAChC,eAAW,EAAE,YAAY,kBAAkB,KAAK,KAAK,sBAAsB,OAAO,GAAG;AACjF,WAAK,yBAAyB,YAAY,iBAAiB;AAAA,IAC/D;AAAA,EACJ;AAAA,EAEA,MAAa,gBAAgB;AACzB,QAAI,KAAK,YAAY;AACjB;AAAA,IACJ;AAEA,SAAK,aAAa;AAClB,QAAI,KAAK,eAAe,aAAa;AACjC,aAAO,MAAM,4CAA4C;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/dist/esm/BleScanner.d.ts
CHANGED
|
@@ -16,31 +16,11 @@ type CommissionableDeviceData = CommissionableDevice & {
|
|
|
16
16
|
SD: number;
|
|
17
17
|
};
|
|
18
18
|
export declare class BleScanner implements Scanner {
|
|
19
|
-
private
|
|
20
|
-
|
|
21
|
-
private readonly recordWaiters;
|
|
22
|
-
private readonly discoveredMatterDevices;
|
|
19
|
+
#private;
|
|
20
|
+
readonly type = ChannelType.BLE;
|
|
23
21
|
constructor(nobleClient: NobleBleClient);
|
|
24
22
|
getDiscoveredDevice(address: string): DiscoveredBleDevice;
|
|
25
|
-
|
|
26
|
-
* Registers a deferred promise for a specific queryId together with a timeout and return the promise.
|
|
27
|
-
* The promise will be resolved when the timer runs out latest.
|
|
28
|
-
*/
|
|
29
|
-
private registerWaiterPromise;
|
|
30
|
-
/**
|
|
31
|
-
* Remove a waiter promise for a specific queryId and stop the connected timer. If required also resolve the
|
|
32
|
-
* promise.
|
|
33
|
-
*/
|
|
34
|
-
private finishWaiter;
|
|
35
|
-
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers): void;
|
|
36
|
-
private handleDiscoveredDevice;
|
|
37
|
-
private findCommissionableQueryIdentifier;
|
|
38
|
-
/**
|
|
39
|
-
* Builds an identifier string for commissionable queries based on the given identifier object.
|
|
40
|
-
* Some identifiers are identical to the official DNS-SD identifiers, others are custom.
|
|
41
|
-
*/
|
|
42
|
-
private buildCommissionableQueryIdentifier;
|
|
43
|
-
private getCommissionableDevices;
|
|
23
|
+
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers, resolvePromise?: boolean): void;
|
|
44
24
|
findOperationalDevice(): Promise<undefined>;
|
|
45
25
|
getDiscoveredOperationalDevice(): undefined;
|
|
46
26
|
findCommissionableDevices(identifier: CommissionableDeviceIdentifiers, timeoutSeconds?: number, ignoreExistingRecords?: boolean): Promise<CommissionableDevice[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BleScanner.d.ts","sourceRoot":"","sources":["../../src/BleScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,WAAW,EAAkD,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAsB,oBAAoB,EAAE,+BAA+B,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,wBAAwB,CAAC;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,8BAA8B,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,KAAK,wBAAwB,GAAG,oBAAoB,GAAG;IACnD,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,qBAAa,UAAW,YAAW,OAAO
|
|
1
|
+
{"version":3,"file":"BleScanner.d.ts","sourceRoot":"","sources":["../../src/BleScanner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,WAAW,EAAkD,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAsB,oBAAoB,EAAE,+BAA+B,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/G,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAIrD,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,wBAAwB,CAAC;IACrC,UAAU,EAAE,UAAU,CAAC;IACvB,8BAA8B,EAAE,OAAO,CAAC;CAC3C,CAAC;AAEF,KAAK,wBAAwB,GAAG,oBAAoB,GAAG;IACnD,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,qBAAa,UAAW,YAAW,OAAO;;IACtC,QAAQ,CAAC,IAAI,mBAAmB;gBAcpB,WAAW,EAAE,cAAc;IAOhC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB;IAoDhE,mCAAmC,CAAC,UAAU,EAAE,+BAA+B,EAAE,cAAc,UAAO;IA8HhG,qBAAqB,IAAI,OAAO,CAAC,SAAS,CAAC;IAKjD,8BAA8B,IAAI,SAAS;IAKrC,yBAAyB,CAC3B,UAAU,EAAE,+BAA+B,EAC3C,cAAc,SAAK,EACnB,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,cAAc,CAAC,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAC7B,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAmDlC,kCAAkC,CAAC,UAAU,EAAE,+BAA+B,GAAG,oBAAoB,EAAE;IAIjG,KAAK;CAMd"}
|
package/dist/esm/BleScanner.js
CHANGED
|
@@ -8,19 +8,18 @@ import { BleError, BtpCodec } from "#protocol";
|
|
|
8
8
|
import { VendorId } from "#types";
|
|
9
9
|
const logger = Logger.get("BleScanner");
|
|
10
10
|
class BleScanner {
|
|
11
|
+
type = ChannelType.BLE;
|
|
12
|
+
#nobleClient;
|
|
13
|
+
#recordWaiters = /* @__PURE__ */ new Map();
|
|
14
|
+
#discoveredMatterDevices = /* @__PURE__ */ new Map();
|
|
11
15
|
constructor(nobleClient) {
|
|
12
|
-
this
|
|
13
|
-
this
|
|
14
|
-
(address, manufacturerData) => this
|
|
16
|
+
this.#nobleClient = nobleClient;
|
|
17
|
+
this.#nobleClient.setDiscoveryCallback(
|
|
18
|
+
(address, manufacturerData) => this.#handleDiscoveredDevice(address, manufacturerData)
|
|
15
19
|
);
|
|
16
20
|
}
|
|
17
|
-
get type() {
|
|
18
|
-
return ChannelType.BLE;
|
|
19
|
-
}
|
|
20
|
-
recordWaiters = /* @__PURE__ */ new Map();
|
|
21
|
-
discoveredMatterDevices = /* @__PURE__ */ new Map();
|
|
22
21
|
getDiscoveredDevice(address) {
|
|
23
|
-
const device = this
|
|
22
|
+
const device = this.#discoveredMatterDevices.get(address);
|
|
24
23
|
if (device === void 0) {
|
|
25
24
|
throw new BleError(`No device found for address ${address}`);
|
|
26
25
|
}
|
|
@@ -30,17 +29,16 @@ class BleScanner {
|
|
|
30
29
|
* Registers a deferred promise for a specific queryId together with a timeout and return the promise.
|
|
31
30
|
* The promise will be resolved when the timer runs out latest.
|
|
32
31
|
*/
|
|
33
|
-
async registerWaiterPromise(queryId, timeoutSeconds, resolveOnUpdatedRecords = true) {
|
|
32
|
+
async #registerWaiterPromise(queryId, timeoutSeconds, resolveOnUpdatedRecords = true, cancelResolver) {
|
|
34
33
|
const { promise, resolver } = createPromise();
|
|
35
34
|
let timer;
|
|
36
35
|
if (timeoutSeconds !== void 0) {
|
|
37
|
-
timer = Time.getTimer(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
).start();
|
|
36
|
+
timer = Time.getTimer("BLE query timeout", timeoutSeconds * 1e3, () => {
|
|
37
|
+
cancelResolver?.();
|
|
38
|
+
this.#finishWaiter(queryId, true);
|
|
39
|
+
}).start();
|
|
42
40
|
}
|
|
43
|
-
this
|
|
41
|
+
this.#recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords, cancelResolver });
|
|
44
42
|
logger.debug(
|
|
45
43
|
`Registered waiter for query ${queryId} with timeout ${timeoutSeconds} seconds${resolveOnUpdatedRecords ? "" : " (not resolving on updated records)"}`
|
|
46
44
|
);
|
|
@@ -50,8 +48,8 @@ class BleScanner {
|
|
|
50
48
|
* Remove a waiter promise for a specific queryId and stop the connected timer. If required also resolve the
|
|
51
49
|
* promise.
|
|
52
50
|
*/
|
|
53
|
-
finishWaiter(queryId, resolvePromise, isUpdatedRecord = false) {
|
|
54
|
-
const waiter = this
|
|
51
|
+
#finishWaiter(queryId, resolvePromise, isUpdatedRecord = false) {
|
|
52
|
+
const waiter = this.#recordWaiters.get(queryId);
|
|
55
53
|
if (waiter === void 0) return;
|
|
56
54
|
const { timer, resolver, resolveOnUpdatedRecords } = waiter;
|
|
57
55
|
if (isUpdatedRecord && !resolveOnUpdatedRecords) return;
|
|
@@ -60,17 +58,16 @@ class BleScanner {
|
|
|
60
58
|
if (resolvePromise) {
|
|
61
59
|
resolver();
|
|
62
60
|
}
|
|
63
|
-
this
|
|
61
|
+
this.#recordWaiters.delete(queryId);
|
|
64
62
|
}
|
|
65
|
-
cancelCommissionableDeviceDiscovery(identifier) {
|
|
66
|
-
const queryKey = this
|
|
67
|
-
this.
|
|
63
|
+
cancelCommissionableDeviceDiscovery(identifier, resolvePromise = true) {
|
|
64
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
65
|
+
const { cancelResolver } = this.#recordWaiters.get(queryKey) ?? {};
|
|
66
|
+
cancelResolver?.();
|
|
67
|
+
this.#finishWaiter(queryKey, resolvePromise);
|
|
68
68
|
}
|
|
69
|
-
handleDiscoveredDevice(peripheral, manufacturerServiceData) {
|
|
69
|
+
#handleDiscoveredDevice(peripheral, manufacturerServiceData) {
|
|
70
70
|
const address = peripheral.address;
|
|
71
|
-
logger.debug(
|
|
72
|
-
`Discovered device ${address} ${manufacturerServiceData === void 0 ? void 0 : Bytes.toHex(manufacturerServiceData)}`
|
|
73
|
-
);
|
|
74
71
|
try {
|
|
75
72
|
const { discriminator, vendorId, productId, hasAdditionalAdvertisementData } = BtpCodec.decodeBleAdvertisementServiceData(manufacturerServiceData);
|
|
76
73
|
const deviceData = {
|
|
@@ -82,49 +79,51 @@ class BleScanner {
|
|
|
82
79
|
// Can be no other mode,
|
|
83
80
|
addresses: [{ type: "ble", peripheralAddress: address }]
|
|
84
81
|
};
|
|
85
|
-
const deviceExisting = this
|
|
82
|
+
const deviceExisting = this.#discoveredMatterDevices.has(address);
|
|
86
83
|
logger.debug(
|
|
87
84
|
`${deviceExisting ? "Re-" : ""}Discovered device ${address} data: ${Diagnostic.json(deviceData)}`
|
|
88
85
|
);
|
|
89
|
-
this
|
|
86
|
+
this.#discoveredMatterDevices.set(address, {
|
|
90
87
|
deviceData,
|
|
91
88
|
peripheral,
|
|
92
89
|
hasAdditionalAdvertisementData
|
|
93
90
|
});
|
|
94
|
-
const queryKey = this
|
|
91
|
+
const queryKey = this.#findCommissionableQueryIdentifier(deviceData);
|
|
95
92
|
if (queryKey !== void 0) {
|
|
96
|
-
this
|
|
93
|
+
this.#finishWaiter(queryKey, true, deviceExisting);
|
|
97
94
|
}
|
|
98
95
|
} catch (error) {
|
|
99
|
-
logger.debug(
|
|
96
|
+
logger.debug(
|
|
97
|
+
`Discovered device ${address} ${manufacturerServiceData === void 0 ? void 0 : Bytes.toHex(manufacturerServiceData)} does not seem to be a valid Matter device: ${error}`
|
|
98
|
+
);
|
|
100
99
|
}
|
|
101
100
|
}
|
|
102
|
-
findCommissionableQueryIdentifier(record) {
|
|
103
|
-
const longDiscriminatorQueryId = this
|
|
104
|
-
if (this
|
|
101
|
+
#findCommissionableQueryIdentifier(record) {
|
|
102
|
+
const longDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ longDiscriminator: record.D });
|
|
103
|
+
if (this.#recordWaiters.has(longDiscriminatorQueryId)) {
|
|
105
104
|
return longDiscriminatorQueryId;
|
|
106
105
|
}
|
|
107
|
-
const shortDiscriminatorQueryId = this
|
|
108
|
-
if (this
|
|
106
|
+
const shortDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ shortDiscriminator: record.SD });
|
|
107
|
+
if (this.#recordWaiters.has(shortDiscriminatorQueryId)) {
|
|
109
108
|
return shortDiscriminatorQueryId;
|
|
110
109
|
}
|
|
111
110
|
if (record.VP !== void 0) {
|
|
112
|
-
const vendorIdQueryId = this
|
|
111
|
+
const vendorIdQueryId = this.#buildCommissionableQueryIdentifier({
|
|
113
112
|
vendorId: VendorId(parseInt(record.VP.split("+")[0]))
|
|
114
113
|
});
|
|
115
|
-
if (this
|
|
114
|
+
if (this.#recordWaiters.has(vendorIdQueryId)) {
|
|
116
115
|
return vendorIdQueryId;
|
|
117
116
|
}
|
|
118
117
|
if (record.VP.includes("+")) {
|
|
119
|
-
const productIdQueryId = this
|
|
118
|
+
const productIdQueryId = this.#buildCommissionableQueryIdentifier({
|
|
120
119
|
vendorId: VendorId(parseInt(record.VP.split("+")[1]))
|
|
121
120
|
});
|
|
122
|
-
if (this
|
|
121
|
+
if (this.#recordWaiters.has(productIdQueryId)) {
|
|
123
122
|
return productIdQueryId;
|
|
124
123
|
}
|
|
125
124
|
}
|
|
126
125
|
}
|
|
127
|
-
if (this
|
|
126
|
+
if (this.#recordWaiters.has("*")) {
|
|
128
127
|
return "*";
|
|
129
128
|
}
|
|
130
129
|
return void 0;
|
|
@@ -133,7 +132,7 @@ class BleScanner {
|
|
|
133
132
|
* Builds an identifier string for commissionable queries based on the given identifier object.
|
|
134
133
|
* Some identifiers are identical to the official DNS-SD identifiers, others are custom.
|
|
135
134
|
*/
|
|
136
|
-
buildCommissionableQueryIdentifier(identifier) {
|
|
135
|
+
#buildCommissionableQueryIdentifier(identifier) {
|
|
137
136
|
if ("longDiscriminator" in identifier) {
|
|
138
137
|
return `D:${identifier.longDiscriminator}`;
|
|
139
138
|
} else if ("shortDiscriminator" in identifier) {
|
|
@@ -144,8 +143,8 @@ class BleScanner {
|
|
|
144
143
|
return `P:${identifier.productId}`;
|
|
145
144
|
} else return "*";
|
|
146
145
|
}
|
|
147
|
-
getCommissionableDevices(identifier) {
|
|
148
|
-
const storedRecords = Array.from(this
|
|
146
|
+
#getCommissionableDevices(identifier) {
|
|
147
|
+
const storedRecords = Array.from(this.#discoveredMatterDevices.values());
|
|
149
148
|
const foundRecords = new Array();
|
|
150
149
|
if ("longDiscriminator" in identifier) {
|
|
151
150
|
foundRecords.push(...storedRecords.filter(({ deviceData: { D } }) => D === identifier.longDiscriminator));
|
|
@@ -177,39 +176,47 @@ class BleScanner {
|
|
|
177
176
|
return void 0;
|
|
178
177
|
}
|
|
179
178
|
async findCommissionableDevices(identifier, timeoutSeconds = 10, ignoreExistingRecords = false) {
|
|
180
|
-
let storedRecords = this
|
|
179
|
+
let storedRecords = this.#getCommissionableDevices(identifier);
|
|
181
180
|
if (ignoreExistingRecords) {
|
|
182
181
|
for (const record of storedRecords) {
|
|
183
|
-
this
|
|
182
|
+
this.#discoveredMatterDevices.delete(record.peripheral.address);
|
|
184
183
|
}
|
|
185
184
|
storedRecords = [];
|
|
186
185
|
}
|
|
187
186
|
if (storedRecords.length === 0) {
|
|
188
|
-
const queryKey = this
|
|
189
|
-
await this
|
|
190
|
-
await this
|
|
191
|
-
storedRecords = this
|
|
192
|
-
await this
|
|
187
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
188
|
+
await this.#nobleClient.startScanning();
|
|
189
|
+
await this.#registerWaiterPromise(queryKey, timeoutSeconds);
|
|
190
|
+
storedRecords = this.#getCommissionableDevices(identifier);
|
|
191
|
+
await this.#nobleClient.stopScanning();
|
|
193
192
|
}
|
|
194
193
|
return storedRecords.map(({ deviceData }) => deviceData);
|
|
195
194
|
}
|
|
196
195
|
async findCommissionableDevicesContinuously(identifier, callback, timeoutSeconds, cancelSignal) {
|
|
197
196
|
const discoveredDevices = /* @__PURE__ */ new Set();
|
|
198
197
|
const discoveryEndTime = timeoutSeconds ? Time.nowMs() + timeoutSeconds * 1e3 : void 0;
|
|
199
|
-
const queryKey = this
|
|
200
|
-
await this
|
|
198
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
199
|
+
await this.#nobleClient.startScanning();
|
|
200
|
+
let queryResolver;
|
|
201
|
+
if (cancelSignal === void 0) {
|
|
202
|
+
const { promise, resolver } = createPromise();
|
|
203
|
+
cancelSignal = promise;
|
|
204
|
+
queryResolver = resolver;
|
|
205
|
+
}
|
|
201
206
|
let canceled = false;
|
|
202
207
|
cancelSignal?.then(
|
|
203
208
|
() => {
|
|
204
209
|
canceled = true;
|
|
205
|
-
|
|
210
|
+
if (queryResolver === void 0) {
|
|
211
|
+
this.#finishWaiter(queryKey, true);
|
|
212
|
+
}
|
|
206
213
|
},
|
|
207
214
|
(cause) => {
|
|
208
215
|
logger.error("Unexpected error canceling commissioning", cause);
|
|
209
216
|
}
|
|
210
217
|
);
|
|
211
218
|
while (!canceled) {
|
|
212
|
-
this
|
|
219
|
+
this.#getCommissionableDevices(identifier).forEach(({ deviceData }) => {
|
|
213
220
|
const { deviceIdentifier } = deviceData;
|
|
214
221
|
if (!discoveredDevices.has(deviceIdentifier)) {
|
|
215
222
|
discoveredDevices.add(deviceIdentifier);
|
|
@@ -218,24 +225,23 @@ class BleScanner {
|
|
|
218
225
|
});
|
|
219
226
|
let remainingTime;
|
|
220
227
|
if (discoveryEndTime !== void 0) {
|
|
221
|
-
|
|
222
|
-
if (
|
|
228
|
+
remainingTime = Math.ceil((discoveryEndTime - Time.nowMs()) / 1e3);
|
|
229
|
+
if (remainingTime <= 0) {
|
|
223
230
|
break;
|
|
224
231
|
}
|
|
225
232
|
}
|
|
226
|
-
|
|
227
|
-
await waiter;
|
|
233
|
+
await this.#registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
|
|
228
234
|
}
|
|
229
|
-
await this
|
|
230
|
-
return this
|
|
235
|
+
await this.#nobleClient.stopScanning();
|
|
236
|
+
return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|
|
231
237
|
}
|
|
232
238
|
getDiscoveredCommissionableDevices(identifier) {
|
|
233
|
-
return this
|
|
239
|
+
return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|
|
234
240
|
}
|
|
235
241
|
async close() {
|
|
236
|
-
this
|
|
237
|
-
[...this
|
|
238
|
-
(queryId) => this
|
|
242
|
+
this.#nobleClient.close();
|
|
243
|
+
[...this.#recordWaiters.keys()].forEach(
|
|
244
|
+
(queryId) => this.#finishWaiter(queryId, !!this.#recordWaiters.get(queryId)?.timer)
|
|
239
245
|
);
|
|
240
246
|
}
|
|
241
247
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/BleScanner.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,OAAO,aAAa,eAAe,YAAY,QAAQ,YAAmB;AACnF,SAAS,UAAU,gBAAgF;AACnG,SAAS,gBAAgB;AAIzB,MAAM,SAAS,OAAO,IAAI,YAAY;AAY/B,MAAM,WAA8B;AAAA,
|
|
5
|
-
"names": [
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NobleBleClient.d.ts","sourceRoot":"","sources":["../../src/NobleBleClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkB5C,qBAAa,cAAc;;IACvB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAGlC;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,wBAAwB,CAA+E;gBAGnG,OAAO,CAAC,EAAE,UAAU;IAqCzB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,KAAK,IAAI;IAOvF,aAAa;
|
|
1
|
+
{"version":3,"file":"NobleBleClient.d.ts","sourceRoot":"","sources":["../../src/NobleBleClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkB5C,qBAAa,cAAc;;IACvB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAGlC;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,wBAAwB,CAA+E;gBAGnG,OAAO,CAAC,EAAE,UAAU;IAqCzB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,KAAK,IAAI;IAOvF,aAAa;IAcb,YAAY;IASzB,OAAO,CAAC,sBAAsB;IAsC9B,KAAK;CAgBR"}
|
|
@@ -62,7 +62,7 @@ class NobleBleClient {
|
|
|
62
62
|
this.shouldScan = true;
|
|
63
63
|
if (this.nobleState === "poweredOn") {
|
|
64
64
|
logger.debug("Start BLE scanning for Matter Services ...");
|
|
65
|
-
await noble.startScanningAsync(
|
|
65
|
+
await noble.startScanningAsync([BLE_MATTER_SERVICE_UUID], true);
|
|
66
66
|
} else {
|
|
67
67
|
logger.debug("noble state is not poweredOn ... delay scanning till poweredOn");
|
|
68
68
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/NobleBleClient.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,YAAY,cAAc;AACnC,SAAS,+BAA+B;AACxC,SAAS,WAAAA,gBAAe;AAExB,SAAS,gBAAgB;AAGzB,MAAM,SAAS,OAAO,IAAI,gBAAgB;AAC1C,IAAI;AAEJ,SAAS,UAAU,OAAgB;AAE/B,MAAI,UAAU,QAAW;AACrB,YAAQ,IAAI,sBAAsB,MAAM,SAAS;AAAA,EACrD;AACA,UAAQA,SAAQ,mBAAmB;AACnC,MAAI,OAAO,MAAM,OAAO,YAAY;AAGhC,YAAS,MAAc,EAAE,UAAU,MAAM,CAAC;AAAA,EAC9C;AACJ;AAEO,MAAM,eAAe;AAAA,EACP,wBAAwB,oBAAI,IAG3C;AAAA,EACM,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACR,WAAW;AAAA,EAEX,YAAY,SAAsB;AAC9B,UAAM,EAAE,YAAY,IAAI,WAAW,CAAC;AACpC,iBAAa,QAAQ,IAAI,IAAI;AAE7B,cAAU,SAAS,KAAK;AAUxB,UAAM,GAAG,eAAe,WAAS;AAC7B,WAAK,aAAa;AAClB,aAAO,MAAM,0BAA0B,KAAK,EAAE;AAC9C,UAAI,UAAU,aAAa;AACvB,YAAI,KAAK,YAAY;AACjB,eAAK,KAAK,cAAc;AAAA,QAC5B;AAAA,MACJ,OAAO;AACH,aAAK,KAAK,aAAa;AAAA,MAC3B;AAAA,IACJ,CAAC;AACD,UAAM,GAAG,YAAY,gBAAc,KAAK,uBAAuB,UAAU,CAAC;AAC1E,UAAM,GAAG,aAAa,MAAM;AACxB,UAAI,CAAC,KAAK,YAAY;AAGlB;AAAA,MACJ;AACA,WAAK,aAAa;AAAA,IACtB,CAAC;AACD,UAAM,GAAG,YAAY,MAAO,KAAK,aAAa,KAAM;AAAA,EACxD;AAAA,EAEO,qBAAqB,UAA0E;AAClG,SAAK,2BAA2B;AAChC,eAAW,EAAE,YAAY,kBAAkB,KAAK,KAAK,sBAAsB,OAAO,GAAG;AACjF,WAAK,yBAAyB,YAAY,iBAAiB;AAAA,IAC/D;AAAA,EACJ;AAAA,EAEA,MAAa,gBAAgB;AACzB,QAAI,KAAK,YAAY;AACjB;AAAA,IACJ;AAEA,SAAK,aAAa;AAClB,QAAI,KAAK,eAAe,aAAa;AACjC,aAAO,MAAM,4CAA4C;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["require"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/nodejs-ble",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0-alpha.0-20250613-a55f991d4",
|
|
4
4
|
"description": "Matter BLE support for node.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -28,12 +28,12 @@
|
|
|
28
28
|
"build-clean": "matter-build --clean"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@matter/general": "0.
|
|
32
|
-
"@matter/protocol": "0.
|
|
33
|
-
"@matter/types": "0.
|
|
31
|
+
"@matter/general": "0.15.0-alpha.0-20250613-a55f991d4",
|
|
32
|
+
"@matter/protocol": "0.15.0-alpha.0-20250613-a55f991d4",
|
|
33
|
+
"@matter/types": "0.15.0-alpha.0-20250613-a55f991d4"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
|
-
"@matter/tools": "0.
|
|
36
|
+
"@matter/tools": "0.15.0-alpha.0-20250613-a55f991d4"
|
|
37
37
|
},
|
|
38
38
|
"optionalDependencies": {
|
|
39
39
|
"@stoprocent/bleno": "^0.11.4",
|
package/src/BleScanner.ts
CHANGED
|
@@ -23,28 +23,29 @@ type CommissionableDeviceData = CommissionableDevice & {
|
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
export class BleScanner implements Scanner {
|
|
26
|
-
|
|
27
|
-
return ChannelType.BLE;
|
|
28
|
-
}
|
|
26
|
+
readonly type = ChannelType.BLE;
|
|
29
27
|
|
|
30
|
-
|
|
28
|
+
readonly #nobleClient: NobleBleClient;
|
|
29
|
+
readonly #recordWaiters = new Map<
|
|
31
30
|
string,
|
|
32
31
|
{
|
|
33
32
|
resolver: () => void;
|
|
34
33
|
timer?: Timer;
|
|
35
34
|
resolveOnUpdatedRecords: boolean;
|
|
35
|
+
cancelResolver?: (value: void) => void;
|
|
36
36
|
}
|
|
37
37
|
>();
|
|
38
|
-
|
|
38
|
+
readonly #discoveredMatterDevices = new Map<string, DiscoveredBleDevice>();
|
|
39
39
|
|
|
40
|
-
constructor(
|
|
41
|
-
this
|
|
42
|
-
|
|
40
|
+
constructor(nobleClient: NobleBleClient) {
|
|
41
|
+
this.#nobleClient = nobleClient;
|
|
42
|
+
this.#nobleClient.setDiscoveryCallback((address, manufacturerData) =>
|
|
43
|
+
this.#handleDiscoveredDevice(address, manufacturerData),
|
|
43
44
|
);
|
|
44
45
|
}
|
|
45
46
|
|
|
46
47
|
public getDiscoveredDevice(address: string): DiscoveredBleDevice {
|
|
47
|
-
const device = this
|
|
48
|
+
const device = this.#discoveredMatterDevices.get(address);
|
|
48
49
|
if (device === undefined) {
|
|
49
50
|
throw new BleError(`No device found for address ${address}`);
|
|
50
51
|
}
|
|
@@ -55,15 +56,21 @@ 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
|
-
|
|
59
|
+
async #registerWaiterPromise(
|
|
60
|
+
queryId: string,
|
|
61
|
+
timeoutSeconds?: number,
|
|
62
|
+
resolveOnUpdatedRecords = true,
|
|
63
|
+
cancelResolver?: (value: void) => void,
|
|
64
|
+
) {
|
|
59
65
|
const { promise, resolver } = createPromise<void>();
|
|
60
66
|
let timer;
|
|
61
67
|
if (timeoutSeconds !== undefined) {
|
|
62
|
-
timer = Time.getTimer("BLE query timeout", timeoutSeconds * 1000, () =>
|
|
63
|
-
|
|
64
|
-
|
|
68
|
+
timer = Time.getTimer("BLE query timeout", timeoutSeconds * 1000, () => {
|
|
69
|
+
cancelResolver?.();
|
|
70
|
+
this.#finishWaiter(queryId, true);
|
|
71
|
+
}).start();
|
|
65
72
|
}
|
|
66
|
-
this
|
|
73
|
+
this.#recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords, cancelResolver });
|
|
67
74
|
logger.debug(
|
|
68
75
|
`Registered waiter for query ${queryId} with timeout ${timeoutSeconds} seconds${
|
|
69
76
|
resolveOnUpdatedRecords ? "" : " (not resolving on updated records)"
|
|
@@ -76,8 +83,8 @@ export class BleScanner implements Scanner {
|
|
|
76
83
|
* Remove a waiter promise for a specific queryId and stop the connected timer. If required also resolve the
|
|
77
84
|
* promise.
|
|
78
85
|
*/
|
|
79
|
-
|
|
80
|
-
const waiter = this
|
|
86
|
+
#finishWaiter(queryId: string, resolvePromise: boolean, isUpdatedRecord = false) {
|
|
87
|
+
const waiter = this.#recordWaiters.get(queryId);
|
|
81
88
|
if (waiter === undefined) return;
|
|
82
89
|
const { timer, resolver, resolveOnUpdatedRecords } = waiter;
|
|
83
90
|
if (isUpdatedRecord && !resolveOnUpdatedRecords) return;
|
|
@@ -86,19 +93,19 @@ export class BleScanner implements Scanner {
|
|
|
86
93
|
if (resolvePromise) {
|
|
87
94
|
resolver();
|
|
88
95
|
}
|
|
89
|
-
this
|
|
96
|
+
this.#recordWaiters.delete(queryId);
|
|
90
97
|
}
|
|
91
98
|
|
|
92
|
-
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers) {
|
|
93
|
-
const queryKey = this
|
|
94
|
-
this.
|
|
99
|
+
cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers, resolvePromise = true) {
|
|
100
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
101
|
+
const { cancelResolver } = this.#recordWaiters.get(queryKey) ?? {};
|
|
102
|
+
// Mark as canceled to not loop further in discovery, if cancel-resolver is used
|
|
103
|
+
cancelResolver?.();
|
|
104
|
+
this.#finishWaiter(queryKey, resolvePromise);
|
|
95
105
|
}
|
|
96
106
|
|
|
97
|
-
|
|
107
|
+
#handleDiscoveredDevice(peripheral: Peripheral, manufacturerServiceData: Uint8Array) {
|
|
98
108
|
const address = peripheral.address;
|
|
99
|
-
logger.debug(
|
|
100
|
-
`Discovered device ${address} ${manufacturerServiceData === undefined ? undefined : Bytes.toHex(manufacturerServiceData)}`,
|
|
101
|
-
);
|
|
102
109
|
|
|
103
110
|
try {
|
|
104
111
|
const { discriminator, vendorId, productId, hasAdditionalAdvertisementData } =
|
|
@@ -112,56 +119,58 @@ export class BleScanner implements Scanner {
|
|
|
112
119
|
CM: 1, // Can be no other mode,
|
|
113
120
|
addresses: [{ type: "ble", peripheralAddress: address }],
|
|
114
121
|
};
|
|
115
|
-
const deviceExisting = this
|
|
122
|
+
const deviceExisting = this.#discoveredMatterDevices.has(address);
|
|
116
123
|
|
|
117
124
|
logger.debug(
|
|
118
125
|
`${deviceExisting ? "Re-" : ""}Discovered device ${address} data: ${Diagnostic.json(deviceData)}`,
|
|
119
126
|
);
|
|
120
127
|
|
|
121
|
-
this
|
|
128
|
+
this.#discoveredMatterDevices.set(address, {
|
|
122
129
|
deviceData,
|
|
123
130
|
peripheral,
|
|
124
131
|
hasAdditionalAdvertisementData,
|
|
125
132
|
});
|
|
126
133
|
|
|
127
|
-
const queryKey = this
|
|
134
|
+
const queryKey = this.#findCommissionableQueryIdentifier(deviceData);
|
|
128
135
|
if (queryKey !== undefined) {
|
|
129
|
-
this
|
|
136
|
+
this.#finishWaiter(queryKey, true, deviceExisting);
|
|
130
137
|
}
|
|
131
138
|
} catch (error) {
|
|
132
|
-
logger.debug(
|
|
139
|
+
logger.debug(
|
|
140
|
+
`Discovered device ${address} ${manufacturerServiceData === undefined ? undefined : Bytes.toHex(manufacturerServiceData)} does not seem to be a valid Matter device: ${error}`,
|
|
141
|
+
);
|
|
133
142
|
}
|
|
134
143
|
}
|
|
135
144
|
|
|
136
|
-
|
|
137
|
-
const longDiscriminatorQueryId = this
|
|
138
|
-
if (this
|
|
145
|
+
#findCommissionableQueryIdentifier(record: CommissionableDeviceData) {
|
|
146
|
+
const longDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ longDiscriminator: record.D });
|
|
147
|
+
if (this.#recordWaiters.has(longDiscriminatorQueryId)) {
|
|
139
148
|
return longDiscriminatorQueryId;
|
|
140
149
|
}
|
|
141
150
|
|
|
142
|
-
const shortDiscriminatorQueryId = this
|
|
143
|
-
if (this
|
|
151
|
+
const shortDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ shortDiscriminator: record.SD });
|
|
152
|
+
if (this.#recordWaiters.has(shortDiscriminatorQueryId)) {
|
|
144
153
|
return shortDiscriminatorQueryId;
|
|
145
154
|
}
|
|
146
155
|
|
|
147
156
|
if (record.VP !== undefined) {
|
|
148
|
-
const vendorIdQueryId = this
|
|
157
|
+
const vendorIdQueryId = this.#buildCommissionableQueryIdentifier({
|
|
149
158
|
vendorId: VendorId(parseInt(record.VP.split("+")[0])),
|
|
150
159
|
});
|
|
151
|
-
if (this
|
|
160
|
+
if (this.#recordWaiters.has(vendorIdQueryId)) {
|
|
152
161
|
return vendorIdQueryId;
|
|
153
162
|
}
|
|
154
163
|
if (record.VP.includes("+")) {
|
|
155
|
-
const productIdQueryId = this
|
|
164
|
+
const productIdQueryId = this.#buildCommissionableQueryIdentifier({
|
|
156
165
|
vendorId: VendorId(parseInt(record.VP.split("+")[1])),
|
|
157
166
|
});
|
|
158
|
-
if (this
|
|
167
|
+
if (this.#recordWaiters.has(productIdQueryId)) {
|
|
159
168
|
return productIdQueryId;
|
|
160
169
|
}
|
|
161
170
|
}
|
|
162
171
|
}
|
|
163
172
|
|
|
164
|
-
if (this
|
|
173
|
+
if (this.#recordWaiters.has("*")) {
|
|
165
174
|
return "*";
|
|
166
175
|
}
|
|
167
176
|
|
|
@@ -172,7 +181,7 @@ export class BleScanner implements Scanner {
|
|
|
172
181
|
* Builds an identifier string for commissionable queries based on the given identifier object.
|
|
173
182
|
* Some identifiers are identical to the official DNS-SD identifiers, others are custom.
|
|
174
183
|
*/
|
|
175
|
-
|
|
184
|
+
#buildCommissionableQueryIdentifier(identifier: CommissionableDeviceIdentifiers) {
|
|
176
185
|
if ("longDiscriminator" in identifier) {
|
|
177
186
|
return `D:${identifier.longDiscriminator}`;
|
|
178
187
|
} else if ("shortDiscriminator" in identifier) {
|
|
@@ -185,8 +194,8 @@ export class BleScanner implements Scanner {
|
|
|
185
194
|
} else return "*";
|
|
186
195
|
}
|
|
187
196
|
|
|
188
|
-
|
|
189
|
-
const storedRecords = Array.from(this
|
|
197
|
+
#getCommissionableDevices(identifier: CommissionableDeviceIdentifiers) {
|
|
198
|
+
const storedRecords = Array.from(this.#discoveredMatterDevices.values());
|
|
190
199
|
|
|
191
200
|
const foundRecords = new Array<DiscoveredBleDevice>();
|
|
192
201
|
if ("longDiscriminator" in identifier) {
|
|
@@ -228,22 +237,22 @@ export class BleScanner implements Scanner {
|
|
|
228
237
|
timeoutSeconds = 10,
|
|
229
238
|
ignoreExistingRecords = false,
|
|
230
239
|
): Promise<CommissionableDevice[]> {
|
|
231
|
-
let storedRecords = this
|
|
240
|
+
let storedRecords = this.#getCommissionableDevices(identifier);
|
|
232
241
|
if (ignoreExistingRecords) {
|
|
233
242
|
// We want to have a fresh discovery result, so clear out the stored records because they might be outdated
|
|
234
243
|
for (const record of storedRecords) {
|
|
235
|
-
this
|
|
244
|
+
this.#discoveredMatterDevices.delete(record.peripheral.address);
|
|
236
245
|
}
|
|
237
246
|
storedRecords = [];
|
|
238
247
|
}
|
|
239
248
|
if (storedRecords.length === 0) {
|
|
240
|
-
const queryKey = this
|
|
249
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
241
250
|
|
|
242
|
-
await this
|
|
243
|
-
await this
|
|
251
|
+
await this.#nobleClient.startScanning();
|
|
252
|
+
await this.#registerWaiterPromise(queryKey, timeoutSeconds);
|
|
244
253
|
|
|
245
|
-
storedRecords = this
|
|
246
|
-
await this
|
|
254
|
+
storedRecords = this.#getCommissionableDevices(identifier);
|
|
255
|
+
await this.#nobleClient.stopScanning();
|
|
247
256
|
}
|
|
248
257
|
return storedRecords.map(({ deviceData }) => deviceData);
|
|
249
258
|
}
|
|
@@ -257,14 +266,24 @@ export class BleScanner implements Scanner {
|
|
|
257
266
|
const discoveredDevices = new Set<string>();
|
|
258
267
|
|
|
259
268
|
const discoveryEndTime = timeoutSeconds ? Time.nowMs() + timeoutSeconds * 1000 : undefined;
|
|
260
|
-
const queryKey = this
|
|
261
|
-
await this
|
|
269
|
+
const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
|
|
270
|
+
await this.#nobleClient.startScanning();
|
|
271
|
+
|
|
272
|
+
let queryResolver: ((value: void) => void) | undefined;
|
|
273
|
+
if (cancelSignal === undefined) {
|
|
274
|
+
const { promise, resolver } = createPromise<void>();
|
|
275
|
+
cancelSignal = promise;
|
|
276
|
+
queryResolver = resolver;
|
|
277
|
+
}
|
|
262
278
|
|
|
263
279
|
let canceled = false;
|
|
264
280
|
cancelSignal?.then(
|
|
265
281
|
() => {
|
|
266
282
|
canceled = true;
|
|
267
|
-
|
|
283
|
+
if (queryResolver === undefined) {
|
|
284
|
+
// Always finish when cancelSignal parameter was used, else cancelling is done separately
|
|
285
|
+
this.#finishWaiter(queryKey, true);
|
|
286
|
+
}
|
|
268
287
|
},
|
|
269
288
|
cause => {
|
|
270
289
|
logger.error("Unexpected error canceling commissioning", cause);
|
|
@@ -272,7 +291,7 @@ export class BleScanner implements Scanner {
|
|
|
272
291
|
);
|
|
273
292
|
|
|
274
293
|
while (!canceled) {
|
|
275
|
-
this
|
|
294
|
+
this.#getCommissionableDevices(identifier).forEach(({ deviceData }) => {
|
|
276
295
|
const { deviceIdentifier } = deviceData;
|
|
277
296
|
if (!discoveredDevices.has(deviceIdentifier)) {
|
|
278
297
|
discoveredDevices.add(deviceIdentifier);
|
|
@@ -282,27 +301,26 @@ export class BleScanner implements Scanner {
|
|
|
282
301
|
|
|
283
302
|
let remainingTime;
|
|
284
303
|
if (discoveryEndTime !== undefined) {
|
|
285
|
-
|
|
304
|
+
remainingTime = Math.ceil((discoveryEndTime - Time.nowMs()) / 1000);
|
|
286
305
|
if (remainingTime <= 0) {
|
|
287
306
|
break;
|
|
288
307
|
}
|
|
289
308
|
}
|
|
290
309
|
|
|
291
|
-
|
|
292
|
-
await waiter;
|
|
310
|
+
await this.#registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
|
|
293
311
|
}
|
|
294
|
-
await this
|
|
295
|
-
return this
|
|
312
|
+
await this.#nobleClient.stopScanning();
|
|
313
|
+
return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|
|
296
314
|
}
|
|
297
315
|
|
|
298
316
|
getDiscoveredCommissionableDevices(identifier: CommissionableDeviceIdentifiers): CommissionableDevice[] {
|
|
299
|
-
return this
|
|
317
|
+
return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
|
|
300
318
|
}
|
|
301
319
|
|
|
302
320
|
async close() {
|
|
303
|
-
this
|
|
304
|
-
[...this
|
|
305
|
-
this
|
|
321
|
+
this.#nobleClient.close();
|
|
322
|
+
[...this.#recordWaiters.keys()].forEach(queryId =>
|
|
323
|
+
this.#finishWaiter(queryId, !!this.#recordWaiters.get(queryId)?.timer),
|
|
306
324
|
);
|
|
307
325
|
}
|
|
308
326
|
}
|
package/src/NobleBleClient.ts
CHANGED
|
@@ -90,9 +90,7 @@ export class NobleBleClient {
|
|
|
90
90
|
this.shouldScan = true;
|
|
91
91
|
if (this.nobleState === "poweredOn") {
|
|
92
92
|
logger.debug("Start BLE scanning for Matter Services ...");
|
|
93
|
-
|
|
94
|
-
// see https://github.com/stoprocent/noble/issues/20
|
|
95
|
-
await noble.startScanningAsync(process.platform !== "win32" ? [BLE_MATTER_SERVICE_UUID] : undefined, true);
|
|
93
|
+
await noble.startScanningAsync([BLE_MATTER_SERVICE_UUID], true);
|
|
96
94
|
} else {
|
|
97
95
|
logger.debug("noble state is not poweredOn ... delay scanning till poweredOn");
|
|
98
96
|
}
|