@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.
@@ -16,31 +16,11 @@ type CommissionableDeviceData = CommissionableDevice & {
16
16
  SD: number;
17
17
  };
18
18
  export declare class BleScanner implements Scanner {
19
- private readonly nobleClient;
20
- get type(): ChannelType;
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;IAe1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAdxC,IAAI,IAAI,gBAEP;IAED,OAAO,CAAC,QAAQ,CAAC,aAAa,CAO1B;IACJ,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0C;gBAErD,WAAW,EAAE,cAAc;IAMjD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB;IAQhE;;;OAGG;YACW,qBAAqB;IAiBnC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAapB,mCAAmC,CAAC,UAAU,EAAE,+BAA+B;IAK/E,OAAO,CAAC,sBAAsB;IAuC9B,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,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;IA0ClC,kCAAkC,CAAC,UAAU,EAAE,+BAA+B,GAAG,oBAAoB,EAAE;IAIjG,KAAK;CAMd"}
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"}
@@ -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.nobleClient = nobleClient;
36
- this.nobleClient.setDiscoveryCallback(
37
- (address, manufacturerData) => this.handleDiscoveredDevice(address, manufacturerData)
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.discoveredMatterDevices.get(address);
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
- "BLE query timeout",
62
- timeoutSeconds * 1e3,
63
- () => this.finishWaiter(queryId, true)
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.recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords });
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.recordWaiters.get(queryId);
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.recordWaiters.delete(queryId);
84
+ this.#recordWaiters.delete(queryId);
87
85
  }
88
- cancelCommissionableDeviceDiscovery(identifier) {
89
- const queryKey = this.buildCommissionableQueryIdentifier(identifier);
90
- this.finishWaiter(queryKey, true);
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.discoveredMatterDevices.has(address);
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.discoveredMatterDevices.set(address, {
109
+ this.#discoveredMatterDevices.set(address, {
113
110
  deviceData,
114
111
  peripheral,
115
112
  hasAdditionalAdvertisementData
116
113
  });
117
- const queryKey = this.findCommissionableQueryIdentifier(deviceData);
114
+ const queryKey = this.#findCommissionableQueryIdentifier(deviceData);
118
115
  if (queryKey !== void 0) {
119
- this.finishWaiter(queryKey, true, deviceExisting);
116
+ this.#finishWaiter(queryKey, true, deviceExisting);
120
117
  }
121
118
  } catch (error) {
122
- logger.debug(`Seems not to be a valid Matter device: Failed to decode device data: ${error}`);
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.buildCommissionableQueryIdentifier({ longDiscriminator: record.D });
127
- if (this.recordWaiters.has(longDiscriminatorQueryId)) {
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.buildCommissionableQueryIdentifier({ shortDiscriminator: record.SD });
131
- if (this.recordWaiters.has(shortDiscriminatorQueryId)) {
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.buildCommissionableQueryIdentifier({
134
+ const vendorIdQueryId = this.#buildCommissionableQueryIdentifier({
136
135
  vendorId: (0, import_types.VendorId)(parseInt(record.VP.split("+")[0]))
137
136
  });
138
- if (this.recordWaiters.has(vendorIdQueryId)) {
137
+ if (this.#recordWaiters.has(vendorIdQueryId)) {
139
138
  return vendorIdQueryId;
140
139
  }
141
140
  if (record.VP.includes("+")) {
142
- const productIdQueryId = this.buildCommissionableQueryIdentifier({
141
+ const productIdQueryId = this.#buildCommissionableQueryIdentifier({
143
142
  vendorId: (0, import_types.VendorId)(parseInt(record.VP.split("+")[1]))
144
143
  });
145
- if (this.recordWaiters.has(productIdQueryId)) {
144
+ if (this.#recordWaiters.has(productIdQueryId)) {
146
145
  return productIdQueryId;
147
146
  }
148
147
  }
149
148
  }
150
- if (this.recordWaiters.has("*")) {
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.discoveredMatterDevices.values());
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.getCommissionableDevices(identifier);
202
+ let storedRecords = this.#getCommissionableDevices(identifier);
204
203
  if (ignoreExistingRecords) {
205
204
  for (const record of storedRecords) {
206
- this.discoveredMatterDevices.delete(record.peripheral.address);
205
+ this.#discoveredMatterDevices.delete(record.peripheral.address);
207
206
  }
208
207
  storedRecords = [];
209
208
  }
210
209
  if (storedRecords.length === 0) {
211
- const queryKey = this.buildCommissionableQueryIdentifier(identifier);
212
- await this.nobleClient.startScanning();
213
- await this.registerWaiterPromise(queryKey, timeoutSeconds);
214
- storedRecords = this.getCommissionableDevices(identifier);
215
- await this.nobleClient.stopScanning();
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.buildCommissionableQueryIdentifier(identifier);
223
- await this.nobleClient.startScanning();
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
- this.finishWaiter(queryKey, true);
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.getCommissionableDevices(identifier).forEach(({ deviceData }) => {
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
- const remainingTime2 = Math.ceil((discoveryEndTime - import_general.Time.nowMs()) / 1e3);
245
- if (remainingTime2 <= 0) {
251
+ remainingTime = Math.ceil((discoveryEndTime - import_general.Time.nowMs()) / 1e3);
252
+ if (remainingTime <= 0) {
246
253
  break;
247
254
  }
248
255
  }
249
- const waiter = this.registerWaiterPromise(queryKey, remainingTime, false);
250
- await waiter;
256
+ await this.#registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
251
257
  }
252
- await this.nobleClient.stopScanning();
253
- return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
258
+ await this.#nobleClient.stopScanning();
259
+ return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
254
260
  }
255
261
  getDiscoveredCommissionableDevices(identifier) {
256
- return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
262
+ return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
257
263
  }
258
264
  async close() {
259
- this.nobleClient.close();
260
- [...this.recordWaiters.keys()].forEach(
261
- (queryId) => this.finishWaiter(queryId, !!this.recordWaiters.get(queryId)?.timer)
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,EAevC,YAA6B,aAA6B;AAA7B;AACzB,SAAK,YAAY;AAAA,MAAqB,CAAC,SAAS,qBAC5C,KAAK,uBAAuB,SAAS,gBAAgB;AAAA,IACzD;AAAA,EACJ;AAAA,EAlBA,IAAI,OAAO;AACP,WAAO,2BAAY;AAAA,EACvB;AAAA,EAEiB,gBAAgB,oBAAI,IAOnC;AAAA,EACe,0BAA0B,oBAAI,IAAiC;AAAA,EAQzE,oBAAoB,SAAsC;AAC7D,UAAM,SAAS,KAAK,wBAAwB,IAAI,OAAO;AACvD,QAAI,WAAW,QAAW;AACtB,YAAM,IAAI,yBAAS,+BAA+B,OAAO,EAAE;AAAA,IAC/D;AACA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,sBAAsB,SAAiB,gBAAyB,0BAA0B,MAAM;AAC1G,UAAM,EAAE,SAAS,SAAS,QAAI,8BAAoB;AAClD,QAAI;AACJ,QAAI,mBAAmB,QAAW;AAC9B,cAAQ,oBAAK;AAAA,QAAS;AAAA,QAAqB,iBAAiB;AAAA,QAAM,MAC9D,KAAK,aAAa,SAAS,IAAI;AAAA,MACnC,EAAE,MAAM;AAAA,IACZ;AACA,SAAK,cAAc,IAAI,SAAS,EAAE,UAAU,OAAO,wBAAwB,CAAC;AAC5E,WAAO;AAAA,MACH,+BAA+B,OAAO,iBAAiB,cAAc,WACjE,0BAA0B,KAAK,qCACnC;AAAA,IACJ;AACA,UAAM;AAAA,EACV;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa,SAAiB,gBAAyB,kBAAkB,OAAO;AACpF,UAAM,SAAS,KAAK,cAAc,IAAI,OAAO;AAC7C,QAAI,WAAW,OAAW;AAC1B,UAAM,EAAE,OAAO,UAAU,wBAAwB,IAAI;AACrD,QAAI,mBAAmB,CAAC,wBAAyB;AACjD,WAAO,MAAM,8BAA8B,OAAO,gBAAgB,cAAc,EAAE;AAClF,WAAO,KAAK;AACZ,QAAI,gBAAgB;AAChB,eAAS;AAAA,IACb;AACA,SAAK,cAAc,OAAO,OAAO;AAAA,EACrC;AAAA,EAEA,oCAAoC,YAA6C;AAC7E,UAAM,WAAW,KAAK,mCAAmC,UAAU;AACnE,SAAK,aAAa,UAAU,IAAI;AAAA,EACpC;AAAA,EAEQ,uBAAuB,YAAwB,yBAAqC;AACxF,UAAM,UAAU,WAAW;AAC3B,WAAO;AAAA,MACH,qBAAqB,OAAO,IAAI,4BAA4B,SAAY,SAAY,qBAAM,MAAM,uBAAuB,CAAC;AAAA,IAC5H;AAEA,QAAI;AACA,YAAM,EAAE,eAAe,UAAU,WAAW,+BAA+B,IACvE,yBAAS,kCAAkC,uBAAuB;AAEtE,YAAM,aAAuC;AAAA,QACzC,kBAAkB;AAAA,QAClB,GAAG;AAAA,QACH,IAAK,iBAAiB,IAAK;AAAA,QAC3B,IAAI,GAAG,QAAQ,IAAI,SAAS;AAAA,QAC5B,IAAI;AAAA;AAAA,QACJ,WAAW,CAAC,EAAE,MAAM,OAAO,mBAAmB,QAAQ,CAAC;AAAA,MAC3D;AACA,YAAM,iBAAiB,KAAK,wBAAwB,IAAI,OAAO;AAE/D,aAAO;AAAA,QACH,GAAG,iBAAiB,QAAQ,EAAE,qBAAqB,OAAO,UAAU,0BAAW,KAAK,UAAU,CAAC;AAAA,MACnG;AAEA,WAAK,wBAAwB,IAAI,SAAS;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,MACJ,CAAC;AAED,YAAM,WAAW,KAAK,kCAAkC,UAAU;AAClE,UAAI,aAAa,QAAW;AACxB,aAAK,aAAa,UAAU,MAAM,cAAc;AAAA,MACpD;AAAA,IACJ,SAAS,OAAO;AACZ,aAAO,MAAM,wEAAwE,KAAK,EAAE;AAAA,IAChG;AAAA,EACJ;AAAA,EAEQ,kCAAkC,QAAkC;AACxE,UAAM,2BAA2B,KAAK,mCAAmC,EAAE,mBAAmB,OAAO,EAAE,CAAC;AACxG,QAAI,KAAK,cAAc,IAAI,wBAAwB,GAAG;AAClD,aAAO;AAAA,IACX;AAEA,UAAM,4BAA4B,KAAK,mCAAmC,EAAE,oBAAoB,OAAO,GAAG,CAAC;AAC3G,QAAI,KAAK,cAAc,IAAI,yBAAyB,GAAG;AACnD,aAAO;AAAA,IACX;AAEA,QAAI,OAAO,OAAO,QAAW;AACzB,YAAM,kBAAkB,KAAK,mCAAmC;AAAA,QAC5D,cAAU,uBAAS,SAAS,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,MACxD,CAAC;AACD,UAAI,KAAK,cAAc,IAAI,eAAe,GAAG;AACzC,eAAO;AAAA,MACX;AACA,UAAI,OAAO,GAAG,SAAS,GAAG,GAAG;AACzB,cAAM,mBAAmB,KAAK,mCAAmC;AAAA,UAC7D,cAAU,uBAAS,SAAS,OAAO,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC;AAAA,QACxD,CAAC;AACD,YAAI,KAAK,cAAc,IAAI,gBAAgB,GAAG;AAC1C,iBAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,KAAK,cAAc,IAAI,GAAG,GAAG;AAC7B,aAAO;AAAA,IACX;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mCAAmC,YAA6C;AACpF,QAAI,uBAAuB,YAAY;AACnC,aAAO,KAAK,WAAW,iBAAiB;AAAA,IAC5C,WAAW,wBAAwB,YAAY;AAC3C,aAAO,MAAM,WAAW,kBAAkB;AAAA,IAC9C,WAAW,cAAc,YAAY;AACjC,aAAO,KAAK,WAAW,QAAQ;AAAA,IACnC,WAAW,eAAe,YAAY;AAElC,aAAO,KAAK,WAAW,SAAS;AAAA,IACpC,MAAO,QAAO;AAAA,EAClB;AAAA,EAEQ,yBAAyB,YAA6C;AAC1E,UAAM,gBAAgB,MAAM,KAAK,KAAK,wBAAwB,OAAO,CAAC;AAEtE,UAAM,eAAe,IAAI,MAA2B;AACpD,QAAI,uBAAuB,YAAY;AACnC,mBAAa,KAAK,GAAG,cAAc,OAAO,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,MAAM,WAAW,iBAAiB,CAAC;AAAA,IAC5G,WAAW,wBAAwB,YAAY;AAC3C,mBAAa;AAAA,QACT,GAAG,cAAc,OAAO,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,OAAO,WAAW,kBAAkB;AAAA,MAC5F;AAAA,IACJ,WAAW,cAAc,YAAY;AACjC,mBAAa;AAAA,QACT,GAAG,cAAc;AAAA,UACb,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAClB,OAAO,GAAG,WAAW,QAAQ,MAAM,IAAI,WAAW,GAAG,WAAW,QAAQ,GAAG;AAAA,QACnF;AAAA,MACJ;AAAA,IACJ,WAAW,eAAe,YAAY;AAClC,mBAAa;AAAA,QACT,GAAG,cAAc,OAAO,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,IAAI,SAAS,IAAI,WAAW,SAAS,EAAE,CAAC;AAAA,MAChG;AAAA,IACJ,OAAO;AACH,mBAAa,KAAK,GAAG,cAAc,OAAO,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,OAAO,KAAK,OAAO,CAAC,CAAC;AAAA,IAC/F;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,wBAA4C;AAC9C,WAAO,KAAK,yEAAyE;AACrF,WAAO;AAAA,EACX;AAAA,EAEA,iCAA4C;AACxC,WAAO,KAAK,yEAAyE;AACrF,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,0BACF,YACA,iBAAiB,IACjB,wBAAwB,OACO;AAC/B,QAAI,gBAAgB,KAAK,yBAAyB,UAAU;AAC5D,QAAI,uBAAuB;AAEvB,iBAAW,UAAU,eAAe;AAChC,aAAK,wBAAwB,OAAO,OAAO,WAAW,OAAO;AAAA,MACjE;AACA,sBAAgB,CAAC;AAAA,IACrB;AACA,QAAI,cAAc,WAAW,GAAG;AAC5B,YAAM,WAAW,KAAK,mCAAmC,UAAU;AAEnE,YAAM,KAAK,YAAY,cAAc;AACrC,YAAM,KAAK,sBAAsB,UAAU,cAAc;AAEzD,sBAAgB,KAAK,yBAAyB,UAAU;AACxD,YAAM,KAAK,YAAY,aAAa;AAAA,IACxC;AACA,WAAO,cAAc,IAAI,CAAC,EAAE,WAAW,MAAM,UAAU;AAAA,EAC3D;AAAA,EAEA,MAAM,sCACF,YACA,UACA,gBACA,cAC+B;AAC/B,UAAM,oBAAoB,oBAAI,IAAY;AAE1C,UAAM,mBAAmB,iBAAiB,oBAAK,MAAM,IAAI,iBAAiB,MAAO;AACjF,UAAM,WAAW,KAAK,mCAAmC,UAAU;AACnE,UAAM,KAAK,YAAY,cAAc;AAErC,QAAI,WAAW;AACf,kBAAc;AAAA,MACV,MAAM;AACF,mBAAW;AACX,aAAK,aAAa,UAAU,IAAI;AAAA,MACpC;AAAA,MACA,WAAS;AACL,eAAO,MAAM,4CAA4C,KAAK;AAAA,MAClE;AAAA,IACJ;AAEA,WAAO,CAAC,UAAU;AACd,WAAK,yBAAyB,UAAU,EAAE,QAAQ,CAAC,EAAE,WAAW,MAAM;AAClE,cAAM,EAAE,iBAAiB,IAAI;AAC7B,YAAI,CAAC,kBAAkB,IAAI,gBAAgB,GAAG;AAC1C,4BAAkB,IAAI,gBAAgB;AACtC,mBAAS,UAAU;AAAA,QACvB;AAAA,MACJ,CAAC;AAED,UAAI;AACJ,UAAI,qBAAqB,QAAW;AAChC,cAAMA,iBAAgB,KAAK,MAAM,mBAAmB,oBAAK,MAAM,KAAK,GAAI;AACxE,YAAIA,kBAAiB,GAAG;AACpB;AAAA,QACJ;AAAA,MACJ;AAEA,YAAM,SAAS,KAAK,sBAAsB,UAAU,eAAe,KAAK;AACxE,YAAM;AAAA,IACV;AACA,UAAM,KAAK,YAAY,aAAa;AACpC,WAAO,KAAK,yBAAyB,UAAU,EAAE,IAAI,CAAC,EAAE,WAAW,MAAM,UAAU;AAAA,EACvF;AAAA,EAEA,mCAAmC,YAAqE;AACpG,WAAO,KAAK,yBAAyB,UAAU,EAAE,IAAI,CAAC,EAAE,WAAW,MAAM,UAAU;AAAA,EACvF;AAAA,EAEA,MAAM,QAAQ;AACV,SAAK,YAAY,MAAM;AACvB,KAAC,GAAG,KAAK,cAAc,KAAK,CAAC,EAAE;AAAA,MAAQ,aACnC,KAAK,aAAa,SAAS,CAAC,CAAC,KAAK,cAAc,IAAI,OAAO,GAAG,KAAK;AAAA,IACvE;AAAA,EACJ;AACJ;",
5
- "names": ["remainingTime"]
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;IAgBb,YAAY;IASzB,OAAO,CAAC,sBAAsB;IAsC9B,KAAK;CAgBR"}
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(process.platform !== "win32" ? [import_protocol.BLE_MATTER_SERVICE_UUID] : void 0, true);
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": "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",
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;AACzD,YAAM,MAAM,mBAAmB,CAAC,uCAAuB,GAAG,IAAI;AAAA,IAClE,OAAO;AACH,aAAO,MAAM,gEAAgE;AAAA,IACjF;AAAA,EACJ;AAAA,EAEA,MAAa,eAAe;AACxB,QAAI,KAAK,SAAU;AACnB,SAAK,aAAa;AAClB,QAAI,KAAK,YAAY;AACjB,aAAO,MAAM,2CAA2C;AACxD,YAAM,MAAM,kBAAkB;AAAA,IAClC;AAAA,EACJ;AAAA,EAEQ,uBAAuB,YAAwB;AAOnD,QACI,QAAQ,aAAa,WACrB,CAAC,WAAW,cAAc,YAAY,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,uCAAuB,GAC3F;AACE;AAAA,IACJ;AAEA,UAAM,UAAU,WAAW;AAC3B,WAAO;AAAA,MACH,oBAAoB,OAAO,KAAK,WAAW,cAAc,SAAS,MAAM,0BAAW;AAAA,QAC/E,WAAW;AAAA,MACf,CAAC;AAAA,IACL;AAEA,QAAI,CAAC,WAAW,aAAa;AACzB,aAAO,KAAK,cAAc,OAAO,kCAAkC;AACnE;AAAA,IACJ;AACA,UAAM,oBAAoB,WAAW,cAAc,YAAY;AAAA,MAC3D,CAAC,EAAE,KAAK,MAAM,SAAS;AAAA,IAC3B;AACA,QAAI,sBAAsB,UAAa,kBAAkB,KAAK,WAAW,GAAG;AACxE,aAAO,KAAK,cAAc,OAAO,iDAAiD;AAClF;AAAA,IACJ;AAEA,SAAK,sBAAsB,IAAI,SAAS,EAAE,YAAY,mBAAmB,kBAAkB,KAAK,CAAC;AAEjG,SAAK,2BAA2B,YAAY,kBAAkB,IAAI;AAAA,EACtE;AAAA,EAEA,QAAQ;AACJ,QAAI,KAAK,UAAU;AACf;AAAA,IACJ;AACA,SAAK,WAAW;AAChB,WAAO,MAAM,gBAAgB;AAK7B,QAAI,gCAAY,WAAW,iCAAa,UAAU;AAC9C,YAAM,cAAc;AAAA,IACxB;AAEA,UAAM,KAAK;AAAA,EACf;AACJ;",
5
5
  "names": []
6
6
  }
@@ -16,31 +16,11 @@ type CommissionableDeviceData = CommissionableDevice & {
16
16
  SD: number;
17
17
  };
18
18
  export declare class BleScanner implements Scanner {
19
- private readonly nobleClient;
20
- get type(): ChannelType;
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;IAe1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAdxC,IAAI,IAAI,gBAEP;IAED,OAAO,CAAC,QAAQ,CAAC,aAAa,CAO1B;IACJ,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0C;gBAErD,WAAW,EAAE,cAAc;IAMjD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB;IAQhE;;;OAGG;YACW,qBAAqB;IAiBnC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAapB,mCAAmC,CAAC,UAAU,EAAE,+BAA+B;IAK/E,OAAO,CAAC,sBAAsB;IAuC9B,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,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;IA0ClC,kCAAkC,CAAC,UAAU,EAAE,+BAA+B,GAAG,oBAAoB,EAAE;IAIjG,KAAK;CAMd"}
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"}
@@ -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.nobleClient = nobleClient;
13
- this.nobleClient.setDiscoveryCallback(
14
- (address, manufacturerData) => this.handleDiscoveredDevice(address, manufacturerData)
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.discoveredMatterDevices.get(address);
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
- "BLE query timeout",
39
- timeoutSeconds * 1e3,
40
- () => this.finishWaiter(queryId, true)
41
- ).start();
36
+ timer = Time.getTimer("BLE query timeout", timeoutSeconds * 1e3, () => {
37
+ cancelResolver?.();
38
+ this.#finishWaiter(queryId, true);
39
+ }).start();
42
40
  }
43
- this.recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords });
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.recordWaiters.get(queryId);
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.recordWaiters.delete(queryId);
61
+ this.#recordWaiters.delete(queryId);
64
62
  }
65
- cancelCommissionableDeviceDiscovery(identifier) {
66
- const queryKey = this.buildCommissionableQueryIdentifier(identifier);
67
- this.finishWaiter(queryKey, true);
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.discoveredMatterDevices.has(address);
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.discoveredMatterDevices.set(address, {
86
+ this.#discoveredMatterDevices.set(address, {
90
87
  deviceData,
91
88
  peripheral,
92
89
  hasAdditionalAdvertisementData
93
90
  });
94
- const queryKey = this.findCommissionableQueryIdentifier(deviceData);
91
+ const queryKey = this.#findCommissionableQueryIdentifier(deviceData);
95
92
  if (queryKey !== void 0) {
96
- this.finishWaiter(queryKey, true, deviceExisting);
93
+ this.#finishWaiter(queryKey, true, deviceExisting);
97
94
  }
98
95
  } catch (error) {
99
- logger.debug(`Seems not to be a valid Matter device: Failed to decode device data: ${error}`);
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.buildCommissionableQueryIdentifier({ longDiscriminator: record.D });
104
- if (this.recordWaiters.has(longDiscriminatorQueryId)) {
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.buildCommissionableQueryIdentifier({ shortDiscriminator: record.SD });
108
- if (this.recordWaiters.has(shortDiscriminatorQueryId)) {
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.buildCommissionableQueryIdentifier({
111
+ const vendorIdQueryId = this.#buildCommissionableQueryIdentifier({
113
112
  vendorId: VendorId(parseInt(record.VP.split("+")[0]))
114
113
  });
115
- if (this.recordWaiters.has(vendorIdQueryId)) {
114
+ if (this.#recordWaiters.has(vendorIdQueryId)) {
116
115
  return vendorIdQueryId;
117
116
  }
118
117
  if (record.VP.includes("+")) {
119
- const productIdQueryId = this.buildCommissionableQueryIdentifier({
118
+ const productIdQueryId = this.#buildCommissionableQueryIdentifier({
120
119
  vendorId: VendorId(parseInt(record.VP.split("+")[1]))
121
120
  });
122
- if (this.recordWaiters.has(productIdQueryId)) {
121
+ if (this.#recordWaiters.has(productIdQueryId)) {
123
122
  return productIdQueryId;
124
123
  }
125
124
  }
126
125
  }
127
- if (this.recordWaiters.has("*")) {
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.discoveredMatterDevices.values());
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.getCommissionableDevices(identifier);
179
+ let storedRecords = this.#getCommissionableDevices(identifier);
181
180
  if (ignoreExistingRecords) {
182
181
  for (const record of storedRecords) {
183
- this.discoveredMatterDevices.delete(record.peripheral.address);
182
+ this.#discoveredMatterDevices.delete(record.peripheral.address);
184
183
  }
185
184
  storedRecords = [];
186
185
  }
187
186
  if (storedRecords.length === 0) {
188
- const queryKey = this.buildCommissionableQueryIdentifier(identifier);
189
- await this.nobleClient.startScanning();
190
- await this.registerWaiterPromise(queryKey, timeoutSeconds);
191
- storedRecords = this.getCommissionableDevices(identifier);
192
- await this.nobleClient.stopScanning();
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.buildCommissionableQueryIdentifier(identifier);
200
- await this.nobleClient.startScanning();
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
- this.finishWaiter(queryKey, true);
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.getCommissionableDevices(identifier).forEach(({ deviceData }) => {
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
- const remainingTime2 = Math.ceil((discoveryEndTime - Time.nowMs()) / 1e3);
222
- if (remainingTime2 <= 0) {
228
+ remainingTime = Math.ceil((discoveryEndTime - Time.nowMs()) / 1e3);
229
+ if (remainingTime <= 0) {
223
230
  break;
224
231
  }
225
232
  }
226
- const waiter = this.registerWaiterPromise(queryKey, remainingTime, false);
227
- await waiter;
233
+ await this.#registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
228
234
  }
229
- await this.nobleClient.stopScanning();
230
- return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
235
+ await this.#nobleClient.stopScanning();
236
+ return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
231
237
  }
232
238
  getDiscoveredCommissionableDevices(identifier) {
233
- return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
239
+ return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
234
240
  }
235
241
  async close() {
236
- this.nobleClient.close();
237
- [...this.recordWaiters.keys()].forEach(
238
- (queryId) => this.finishWaiter(queryId, !!this.recordWaiters.get(queryId)?.timer)
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": "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",
5
- "names": ["remainingTime"]
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;IAgBb,YAAY;IASzB,OAAO,CAAC,sBAAsB;IAsC9B,KAAK;CAgBR"}
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(process.platform !== "win32" ? [BLE_MATTER_SERVICE_UUID] : void 0, true);
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": "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",
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.14.1-alpha.0-20250607-a93593303",
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.14.1-alpha.0-20250607-a93593303",
32
- "@matter/protocol": "0.14.1-alpha.0-20250607-a93593303",
33
- "@matter/types": "0.14.1-alpha.0-20250607-a93593303"
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.14.1-alpha.0-20250607-a93593303"
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
- get type() {
27
- return ChannelType.BLE;
28
- }
26
+ readonly type = ChannelType.BLE;
29
27
 
30
- private readonly recordWaiters = new Map<
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
- private readonly discoveredMatterDevices = new Map<string, DiscoveredBleDevice>();
38
+ readonly #discoveredMatterDevices = new Map<string, DiscoveredBleDevice>();
39
39
 
40
- constructor(private readonly nobleClient: NobleBleClient) {
41
- this.nobleClient.setDiscoveryCallback((address, manufacturerData) =>
42
- this.handleDiscoveredDevice(address, manufacturerData),
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.discoveredMatterDevices.get(address);
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
- private async registerWaiterPromise(queryId: string, timeoutSeconds?: number, resolveOnUpdatedRecords = true) {
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
- this.finishWaiter(queryId, true),
64
- ).start();
68
+ timer = Time.getTimer("BLE query timeout", timeoutSeconds * 1000, () => {
69
+ cancelResolver?.();
70
+ this.#finishWaiter(queryId, true);
71
+ }).start();
65
72
  }
66
- this.recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords });
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
- private finishWaiter(queryId: string, resolvePromise: boolean, isUpdatedRecord = false) {
80
- const waiter = this.recordWaiters.get(queryId);
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.recordWaiters.delete(queryId);
96
+ this.#recordWaiters.delete(queryId);
90
97
  }
91
98
 
92
- cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers) {
93
- const queryKey = this.buildCommissionableQueryIdentifier(identifier);
94
- this.finishWaiter(queryKey, true);
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
- private handleDiscoveredDevice(peripheral: Peripheral, manufacturerServiceData: Uint8Array) {
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.discoveredMatterDevices.has(address);
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.discoveredMatterDevices.set(address, {
128
+ this.#discoveredMatterDevices.set(address, {
122
129
  deviceData,
123
130
  peripheral,
124
131
  hasAdditionalAdvertisementData,
125
132
  });
126
133
 
127
- const queryKey = this.findCommissionableQueryIdentifier(deviceData);
134
+ const queryKey = this.#findCommissionableQueryIdentifier(deviceData);
128
135
  if (queryKey !== undefined) {
129
- this.finishWaiter(queryKey, true, deviceExisting);
136
+ this.#finishWaiter(queryKey, true, deviceExisting);
130
137
  }
131
138
  } catch (error) {
132
- logger.debug(`Seems not to be a valid Matter device: Failed to decode device data: ${error}`);
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
- private findCommissionableQueryIdentifier(record: CommissionableDeviceData) {
137
- const longDiscriminatorQueryId = this.buildCommissionableQueryIdentifier({ longDiscriminator: record.D });
138
- if (this.recordWaiters.has(longDiscriminatorQueryId)) {
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.buildCommissionableQueryIdentifier({ shortDiscriminator: record.SD });
143
- if (this.recordWaiters.has(shortDiscriminatorQueryId)) {
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.buildCommissionableQueryIdentifier({
157
+ const vendorIdQueryId = this.#buildCommissionableQueryIdentifier({
149
158
  vendorId: VendorId(parseInt(record.VP.split("+")[0])),
150
159
  });
151
- if (this.recordWaiters.has(vendorIdQueryId)) {
160
+ if (this.#recordWaiters.has(vendorIdQueryId)) {
152
161
  return vendorIdQueryId;
153
162
  }
154
163
  if (record.VP.includes("+")) {
155
- const productIdQueryId = this.buildCommissionableQueryIdentifier({
164
+ const productIdQueryId = this.#buildCommissionableQueryIdentifier({
156
165
  vendorId: VendorId(parseInt(record.VP.split("+")[1])),
157
166
  });
158
- if (this.recordWaiters.has(productIdQueryId)) {
167
+ if (this.#recordWaiters.has(productIdQueryId)) {
159
168
  return productIdQueryId;
160
169
  }
161
170
  }
162
171
  }
163
172
 
164
- if (this.recordWaiters.has("*")) {
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
- private buildCommissionableQueryIdentifier(identifier: CommissionableDeviceIdentifiers) {
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
- private getCommissionableDevices(identifier: CommissionableDeviceIdentifiers) {
189
- const storedRecords = Array.from(this.discoveredMatterDevices.values());
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.getCommissionableDevices(identifier);
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.discoveredMatterDevices.delete(record.peripheral.address);
244
+ this.#discoveredMatterDevices.delete(record.peripheral.address);
236
245
  }
237
246
  storedRecords = [];
238
247
  }
239
248
  if (storedRecords.length === 0) {
240
- const queryKey = this.buildCommissionableQueryIdentifier(identifier);
249
+ const queryKey = this.#buildCommissionableQueryIdentifier(identifier);
241
250
 
242
- await this.nobleClient.startScanning();
243
- await this.registerWaiterPromise(queryKey, timeoutSeconds);
251
+ await this.#nobleClient.startScanning();
252
+ await this.#registerWaiterPromise(queryKey, timeoutSeconds);
244
253
 
245
- storedRecords = this.getCommissionableDevices(identifier);
246
- await this.nobleClient.stopScanning();
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.buildCommissionableQueryIdentifier(identifier);
261
- await this.nobleClient.startScanning();
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
- this.finishWaiter(queryKey, true);
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.getCommissionableDevices(identifier).forEach(({ deviceData }) => {
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
- const remainingTime = Math.ceil((discoveryEndTime - Time.nowMs()) / 1000);
304
+ remainingTime = Math.ceil((discoveryEndTime - Time.nowMs()) / 1000);
286
305
  if (remainingTime <= 0) {
287
306
  break;
288
307
  }
289
308
  }
290
309
 
291
- const waiter = this.registerWaiterPromise(queryKey, remainingTime, false);
292
- await waiter;
310
+ await this.#registerWaiterPromise(queryKey, remainingTime, false, queryResolver);
293
311
  }
294
- await this.nobleClient.stopScanning();
295
- return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
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.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
317
+ return this.#getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
300
318
  }
301
319
 
302
320
  async close() {
303
- this.nobleClient.close();
304
- [...this.recordWaiters.keys()].forEach(queryId =>
305
- this.finishWaiter(queryId, !!this.recordWaiters.get(queryId)?.timer),
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
  }
@@ -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
- // TODO Remove this Windows hack once Noble Windows issue is fixed
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
  }