@matter/nodejs-ble 0.12.0-alpha.0-20250103-ba0c01a01 → 0.12.0-alpha.0-20250107-af5a068c3

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.
Files changed (42) hide show
  1. package/dist/cjs/BleScanner.d.ts +2 -2
  2. package/dist/cjs/BleScanner.d.ts.map +1 -1
  3. package/dist/cjs/BleScanner.js +19 -13
  4. package/dist/cjs/BleScanner.js.map +1 -1
  5. package/dist/cjs/BlenoBleServer.d.ts.map +1 -1
  6. package/dist/cjs/BlenoBleServer.js +4 -4
  7. package/dist/cjs/BlenoBleServer.js.map +1 -1
  8. package/dist/cjs/NobleBleChannel.d.ts +3 -2
  9. package/dist/cjs/NobleBleChannel.d.ts.map +1 -1
  10. package/dist/cjs/NobleBleChannel.js +252 -101
  11. package/dist/cjs/NobleBleChannel.js.map +2 -2
  12. package/dist/cjs/NobleBleClient.d.ts.map +1 -1
  13. package/dist/cjs/NobleBleClient.js +15 -7
  14. package/dist/cjs/NobleBleClient.js.map +1 -1
  15. package/dist/cjs/NodeJsBle.d.ts +1 -2
  16. package/dist/cjs/NodeJsBle.d.ts.map +1 -1
  17. package/dist/cjs/NodeJsBle.js +30 -14
  18. package/dist/cjs/NodeJsBle.js.map +1 -1
  19. package/dist/esm/BleScanner.d.ts +2 -2
  20. package/dist/esm/BleScanner.d.ts.map +1 -1
  21. package/dist/esm/BleScanner.js +19 -13
  22. package/dist/esm/BleScanner.js.map +1 -1
  23. package/dist/esm/BlenoBleServer.d.ts.map +1 -1
  24. package/dist/esm/BlenoBleServer.js +4 -4
  25. package/dist/esm/BlenoBleServer.js.map +1 -1
  26. package/dist/esm/NobleBleChannel.d.ts +3 -2
  27. package/dist/esm/NobleBleChannel.d.ts.map +1 -1
  28. package/dist/esm/NobleBleChannel.js +253 -102
  29. package/dist/esm/NobleBleChannel.js.map +2 -2
  30. package/dist/esm/NobleBleClient.d.ts.map +1 -1
  31. package/dist/esm/NobleBleClient.js +15 -7
  32. package/dist/esm/NobleBleClient.js.map +1 -1
  33. package/dist/esm/NodeJsBle.d.ts +1 -2
  34. package/dist/esm/NodeJsBle.d.ts.map +1 -1
  35. package/dist/esm/NodeJsBle.js +30 -14
  36. package/dist/esm/NodeJsBle.js.map +1 -1
  37. package/package.json +5 -5
  38. package/src/BleScanner.ts +23 -13
  39. package/src/BlenoBleServer.ts +6 -4
  40. package/src/NobleBleChannel.ts +316 -126
  41. package/src/NobleBleClient.ts +17 -7
  42. package/src/NodeJsBle.ts +32 -14
@@ -15,31 +15,47 @@ class NodeJsBle extends Ble {
15
15
  super();
16
16
  this.options = options;
17
17
  }
18
- blePeripheral;
19
- bleCentral;
18
+ #blePeripheralInstance;
19
+ #bleCentralInstance;
20
+ #bleScanner;
21
+ #bleBroadcaster;
22
+ #bleCentralInterface;
23
+ #blePeripheralInterface;
24
+ get #blePeripheralServer() {
25
+ if (this.#blePeripheralInstance === void 0) {
26
+ this.#blePeripheralInstance = new BlenoBleServer(this.options);
27
+ }
28
+ return this.#blePeripheralInstance;
29
+ }
30
+ get #bleCentralClient() {
31
+ if (this.#bleCentralInstance === void 0) {
32
+ this.#bleCentralInstance = new NobleBleClient(this.options);
33
+ }
34
+ return this.#bleCentralInstance;
35
+ }
20
36
  getBlePeripheralInterface() {
21
- if (this.blePeripheral === void 0) {
22
- this.blePeripheral = new BlenoBleServer(this.options);
37
+ if (this.#blePeripheralInterface === void 0) {
38
+ this.#blePeripheralInterface = new BlePeripheralInterface(this.#blePeripheralServer);
23
39
  }
24
- return new BlePeripheralInterface(this.blePeripheral);
40
+ return this.#blePeripheralInterface;
25
41
  }
26
42
  getBleCentralInterface() {
27
- if (this.bleCentral === void 0) {
28
- this.bleCentral = new NobleBleClient(this.options);
43
+ if (this.#bleCentralInterface === void 0) {
44
+ this.#bleCentralInterface = new NobleBleCentralInterface(this.getBleScanner());
29
45
  }
30
- return new NobleBleCentralInterface();
46
+ return this.#bleCentralInterface;
31
47
  }
32
48
  getBleBroadcaster(additionalAdvertisementData) {
33
- if (this.blePeripheral === void 0) {
34
- this.blePeripheral = new BlenoBleServer(this.options);
49
+ if (this.#bleBroadcaster === void 0) {
50
+ this.#bleBroadcaster = new BleBroadcaster(this.#blePeripheralServer, additionalAdvertisementData);
35
51
  }
36
- return new BleBroadcaster(this.blePeripheral, additionalAdvertisementData);
52
+ return this.#bleBroadcaster;
37
53
  }
38
54
  getBleScanner() {
39
- if (this.bleCentral === void 0) {
40
- this.bleCentral = new NobleBleClient(this.options);
55
+ if (this.#bleScanner === void 0) {
56
+ this.#bleScanner = new BleScanner(this.#bleCentralClient);
41
57
  }
42
- return new BleScanner(this.bleCentral);
58
+ return this.#bleScanner;
43
59
  }
44
60
  }
45
61
  export {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/NodeJsBle.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,WAAyC;AAClD,SAAS,sBAAsB;AAC/B,SAAS,8BAA8B;AACvC,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,gCAAgC;AACzC,SAAS,sBAAsB;AAMxB,MAAM,kBAAkB,IAAI;AAAA,EAI/B,YAA6B,SAAsB;AAC/C,UAAM;AADmB;AAAA,EAE7B;AAAA,EALQ;AAAA,EACA;AAAA,EAMR,4BAAgD;AAC5C,QAAI,KAAK,kBAAkB,QAAW;AAClC,WAAK,gBAAgB,IAAI,eAAe,KAAK,OAAO;AAAA,IACxD;AACA,WAAO,IAAI,uBAAuB,KAAK,aAAa;AAAA,EACxD;AAAA,EAEA,yBAAuC;AACnC,QAAI,KAAK,eAAe,QAAW;AAC/B,WAAK,aAAa,IAAI,eAAe,KAAK,OAAO;AAAA,IACrD;AACA,WAAO,IAAI,yBAAyB;AAAA,EACxC;AAAA,EAEA,kBAAkB,6BAA+D;AAC7E,QAAI,KAAK,kBAAkB,QAAW;AAClC,WAAK,gBAAgB,IAAI,eAAe,KAAK,OAAO;AAAA,IACxD;AACA,WAAO,IAAI,eAAe,KAAK,eAAe,2BAA2B;AAAA,EAC7E;AAAA,EAEA,gBAAyB;AACrB,QAAI,KAAK,eAAe,QAAW;AAC/B,WAAK,aAAa,IAAI,eAAe,KAAK,OAAO;AAAA,IACrD;AACA,WAAO,IAAI,WAAW,KAAK,UAAU;AAAA,EACzC;AACJ;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,WAAyC;AAClD,SAAS,sBAAsB;AAC/B,SAAS,8BAA8B;AACvC,SAAS,kBAAkB;AAC3B,SAAS,sBAAsB;AAC/B,SAAS,gCAAgC;AACzC,SAAS,sBAAsB;AAMxB,MAAM,kBAAkB,IAAI;AAAA,EAQ/B,YAA6B,SAAsB;AAC/C,UAAM;AADmB;AAAA,EAE7B;AAAA,EATA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAMA,IAAI,uBAAuB;AACvB,QAAI,KAAK,2BAA2B,QAAW;AAC3C,WAAK,yBAAyB,IAAI,eAAe,KAAK,OAAO;AAAA,IACjE;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,oBAAoB;AACpB,QAAI,KAAK,wBAAwB,QAAW;AACxC,WAAK,sBAAsB,IAAI,eAAe,KAAK,OAAO;AAAA,IAC9D;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,4BAAgD;AAC5C,QAAI,KAAK,4BAA4B,QAAW;AAC5C,WAAK,0BAA0B,IAAI,uBAAuB,KAAK,oBAAoB;AAAA,IACvF;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,yBAAuC;AACnC,QAAI,KAAK,yBAAyB,QAAW;AACzC,WAAK,uBAAuB,IAAI,yBAAyB,KAAK,cAAc,CAAe;AAAA,IAC/F;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,kBAAkB,6BAA+D;AAC7E,QAAI,KAAK,oBAAoB,QAAW;AACpC,WAAK,kBAAkB,IAAI,eAAe,KAAK,sBAAsB,2BAA2B;AAAA,IACpG;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,gBAAyB;AACrB,QAAI,KAAK,gBAAgB,QAAW;AAChC,WAAK,cAAc,IAAI,WAAW,KAAK,iBAAiB;AAAA,IAC5D;AACA,WAAO,KAAK;AAAA,EAChB;AACJ;",
5
5
  "names": []
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/nodejs-ble",
3
- "version": "0.12.0-alpha.0-20250103-ba0c01a01",
3
+ "version": "0.12.0-alpha.0-20250107-af5a068c3",
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.12.0-alpha.0-20250103-ba0c01a01",
32
- "@matter/types": "0.12.0-alpha.0-20250103-ba0c01a01",
33
- "@matter/protocol": "0.12.0-alpha.0-20250103-ba0c01a01"
31
+ "@matter/general": "0.12.0-alpha.0-20250107-af5a068c3",
32
+ "@matter/types": "0.12.0-alpha.0-20250107-af5a068c3",
33
+ "@matter/protocol": "0.12.0-alpha.0-20250107-af5a068c3"
34
34
  },
35
35
  "devDependencies": {
36
- "@matter/tools": "0.12.0-alpha.0-20250103-ba0c01a01"
36
+ "@matter/tools": "0.12.0-alpha.0-20250107-af5a068c3"
37
37
  },
38
38
  "optionalDependencies": {
39
39
  "@stoprocent/bleno": "^0.8.1",
package/src/BleScanner.ts CHANGED
@@ -95,33 +95,42 @@ export class BleScanner implements Scanner {
95
95
  }
96
96
 
97
97
  private handleDiscoveredDevice(peripheral: Peripheral, manufacturerServiceData: Uint8Array) {
98
+ const address = peripheral.address;
98
99
  logger.debug(
99
- `Discovered device ${peripheral.address} ${manufacturerServiceData === undefined ? undefined : Bytes.toHex(manufacturerServiceData)}`,
100
+ `Discovered device ${address} ${manufacturerServiceData === undefined ? undefined : Bytes.toHex(manufacturerServiceData)}`,
100
101
  );
101
102
 
102
103
  try {
103
104
  const { discriminator, vendorId, productId, hasAdditionalAdvertisementData } =
104
105
  BtpCodec.decodeBleAdvertisementServiceData(manufacturerServiceData);
105
106
 
106
- const commissionableDevice: CommissionableDeviceData = {
107
- deviceIdentifier: peripheral.address,
107
+ const deviceData: CommissionableDeviceData = {
108
+ deviceIdentifier: address,
108
109
  D: discriminator,
109
110
  SD: (discriminator >> 8) & 0x0f,
110
111
  VP: `${vendorId}+${productId}`,
111
112
  CM: 1, // Can be no other mode,
112
- addresses: [{ type: "ble", peripheralAddress: peripheral.address }],
113
+ addresses: [{ type: "ble", peripheralAddress: address }],
113
114
  };
114
- logger.debug(`Discovered device ${peripheral.address} data: ${Logger.toJSON(commissionableDevice)}`);
115
+ const deviceExisting = this.discoveredMatterDevices.has(address);
115
116
 
116
- const deviceExisting = this.discoveredMatterDevices.has(peripheral.address);
117
+ logger.debug(
118
+ `${deviceExisting ? "Re-" : ""}Discovered device ${address} data: ${Logger.toJSON(deviceData)}`,
119
+ );
120
+
121
+ if (deviceExisting) {
122
+ // Device got rediscovered, so clear the state
123
+ // TODO: Remove once noble does that by itself
124
+ peripheral.state = "disconnected";
125
+ }
117
126
 
118
- this.discoveredMatterDevices.set(peripheral.address, {
119
- deviceData: commissionableDevice,
120
- peripheral: peripheral,
127
+ this.discoveredMatterDevices.set(address, {
128
+ deviceData,
129
+ peripheral,
121
130
  hasAdditionalAdvertisementData,
122
131
  });
123
132
 
124
- const queryKey = this.findCommissionableQueryIdentifier(commissionableDevice);
133
+ const queryKey = this.findCommissionableQueryIdentifier(deviceData);
125
134
  if (queryKey !== undefined) {
126
135
  this.finishWaiter(queryKey, true, deviceExisting);
127
136
  }
@@ -223,8 +232,9 @@ export class BleScanner implements Scanner {
223
232
  async findCommissionableDevices(
224
233
  identifier: CommissionableDeviceIdentifiers,
225
234
  timeoutSeconds = 10,
235
+ ignoreExistingRecords = false,
226
236
  ): Promise<CommissionableDevice[]> {
227
- let storedRecords = this.getCommissionableDevices(identifier);
237
+ let storedRecords = ignoreExistingRecords ? [] : this.getCommissionableDevices(identifier);
228
238
  if (storedRecords.length === 0) {
229
239
  const queryKey = this.buildCommissionableQueryIdentifier(identifier);
230
240
 
@@ -288,8 +298,8 @@ export class BleScanner implements Scanner {
288
298
  return this.getCommissionableDevices(identifier).map(({ deviceData }) => deviceData);
289
299
  }
290
300
 
291
- close(): void {
292
- void this.nobleClient.stopScanning();
301
+ async close() {
302
+ await this.nobleClient.stopScanning();
293
303
  [...this.recordWaiters.keys()].forEach(queryId =>
294
304
  this.finishWaiter(queryId, !!this.recordWaiters.get(queryId)?.timer),
295
305
  );
@@ -64,15 +64,17 @@ function initializeBleno(server: BlenoBleServer, hciId?: number) {
64
64
  });
65
65
  }
66
66
 
67
- override async onSubscribe(maxValueSize: number, updateValueCallback: (data: Buffer) => void) {
67
+ override onSubscribe(maxValueSize: number, updateValueCallback: (data: Buffer) => void) {
68
68
  logger.debug(`C2 subscribe ${maxValueSize}`);
69
69
 
70
- await server.handleC2SubscribeRequest(maxValueSize, updateValueCallback);
70
+ server
71
+ .handleC2SubscribeRequest(maxValueSize, updateValueCallback)
72
+ .catch(e => logger.warn("Error happened in when handling C2 subscribe", e));
71
73
  }
72
74
 
73
- override async onUnsubscribe() {
75
+ override onUnsubscribe() {
74
76
  logger.debug("C2 unsubscribe");
75
- await server.close();
77
+ server.close().catch(e => logger.warn("Error happened when closing server for C2 unsubscribe", e));
76
78
  }
77
79
 
78
80
  override onIndicate() {