matterbridge 1.6.1 → 1.6.3-dev.1

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 (139) hide show
  1. package/CHANGELOG.md +45 -1
  2. package/README-DEV.md +0 -4
  3. package/README-NGINX.md +63 -0
  4. package/README.md +7 -3
  5. package/dist/cli.js +15 -7
  6. package/dist/cli.js.map +1 -1
  7. package/dist/deviceManager.d.ts +1 -1
  8. package/dist/deviceManager.d.ts.map +1 -1
  9. package/dist/deviceManager.js +1 -1
  10. package/dist/deviceManager.js.map +1 -1
  11. package/dist/index.d.ts +9 -9
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +23 -10
  14. package/dist/index.js.map +1 -1
  15. package/dist/matter/export.d.ts +5 -0
  16. package/dist/matter/export.d.ts.map +1 -0
  17. package/dist/matter/export.js +5 -0
  18. package/dist/matter/export.js.map +1 -0
  19. package/dist/matterbridge.d.ts +12 -7
  20. package/dist/matterbridge.d.ts.map +1 -1
  21. package/dist/matterbridge.js +133 -83
  22. package/dist/matterbridge.js.map +1 -1
  23. package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -1
  24. package/dist/matterbridgeAccessoryPlatform.js.map +1 -1
  25. package/dist/matterbridgeBehaviors.d.ts +1123 -0
  26. package/dist/matterbridgeBehaviors.d.ts.map +1 -0
  27. package/dist/matterbridgeBehaviors.js +281 -0
  28. package/dist/matterbridgeBehaviors.js.map +1 -0
  29. package/dist/matterbridgeDevice.d.ts +2089 -1511
  30. package/dist/matterbridgeDevice.d.ts.map +1 -1
  31. package/dist/matterbridgeDevice.js +243 -209
  32. package/dist/matterbridgeDevice.js.map +1 -1
  33. package/dist/matterbridgeDeviceTypes.d.ts +65 -0
  34. package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
  35. package/dist/matterbridgeDeviceTypes.js +307 -0
  36. package/dist/matterbridgeDeviceTypes.js.map +1 -0
  37. package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -1
  38. package/dist/matterbridgeDynamicPlatform.js.map +1 -1
  39. package/dist/matterbridgeEdge.d.ts +19 -20
  40. package/dist/matterbridgeEdge.d.ts.map +1 -1
  41. package/dist/matterbridgeEdge.js +505 -102
  42. package/dist/matterbridgeEdge.js.map +1 -1
  43. package/dist/matterbridgeEndpoint.d.ts +3554 -2297
  44. package/dist/matterbridgeEndpoint.d.ts.map +1 -1
  45. package/dist/matterbridgeEndpoint.js +709 -476
  46. package/dist/matterbridgeEndpoint.js.map +1 -1
  47. package/dist/matterbridgePlatform.d.ts +4 -3
  48. package/dist/matterbridgePlatform.d.ts.map +1 -1
  49. package/dist/matterbridgePlatform.js +10 -2
  50. package/dist/matterbridgePlatform.js.map +1 -1
  51. package/dist/matterbridgeTypes.d.ts +7 -8
  52. package/dist/matterbridgeTypes.d.ts.map +1 -1
  53. package/dist/matterbridgeTypes.js.map +1 -1
  54. package/dist/matterbridgeWebsocket.d.ts +1 -1
  55. package/dist/matterbridgeWebsocket.d.ts.map +1 -1
  56. package/dist/matterbridgeWebsocket.js +5 -3
  57. package/dist/matterbridgeWebsocket.js.map +1 -1
  58. package/dist/pluginManager.d.ts.map +1 -1
  59. package/dist/pluginManager.js +16 -7
  60. package/dist/pluginManager.js.map +1 -1
  61. package/dist/utils/colorUtils.js +1 -1
  62. package/dist/utils/colorUtils.js.map +1 -1
  63. package/dist/utils/utils.d.ts +21 -0
  64. package/dist/utils/utils.d.ts.map +1 -1
  65. package/dist/utils/utils.js +49 -3
  66. package/dist/utils/utils.js.map +1 -1
  67. package/frontend/build/asset-manifest.json +62 -6
  68. package/frontend/build/index.html +1 -1
  69. package/frontend/build/static/css/main.823e08b6.css +2 -0
  70. package/frontend/build/static/css/main.823e08b6.css.map +1 -0
  71. package/frontend/build/static/js/main.a14c87e7.js +115 -0
  72. package/frontend/build/static/js/{main.045d08f7.js.LICENSE.txt → main.a14c87e7.js.LICENSE.txt} +3 -3
  73. package/frontend/build/static/js/main.a14c87e7.js.map +1 -0
  74. package/frontend/build/static/media/roboto-cyrillic-300-normal.1b79538ccd585c259996.woff2 +0 -0
  75. package/frontend/build/static/media/roboto-cyrillic-300-normal.5f077fd7b977d1715acf.woff +0 -0
  76. package/frontend/build/static/media/roboto-cyrillic-400-normal.5d2930082227d172f62c.woff +0 -0
  77. package/frontend/build/static/media/roboto-cyrillic-400-normal.a9e19870cf6c4b973427.woff2 +0 -0
  78. package/frontend/build/static/media/roboto-cyrillic-500-normal.0ae2428323939af5e1ad.woff2 +0 -0
  79. package/frontend/build/static/media/roboto-cyrillic-500-normal.dd7bc8a52c6c70c5a3f5.woff +0 -0
  80. package/frontend/build/static/media/roboto-cyrillic-700-normal.3f6e1548bd5175a8c342.woff +0 -0
  81. package/frontend/build/static/media/roboto-cyrillic-700-normal.4fdfc29a10e7d4b7c527.woff2 +0 -0
  82. package/frontend/build/static/media/roboto-cyrillic-ext-300-normal.795dbc8140e3fef82983.woff +0 -0
  83. package/frontend/build/static/media/roboto-cyrillic-ext-300-normal.80947a31d23c70204b47.woff2 +0 -0
  84. package/frontend/build/static/media/roboto-cyrillic-ext-400-normal.135d076fa32aa0b4d105.woff +0 -0
  85. package/frontend/build/static/media/roboto-cyrillic-ext-400-normal.5cec61a21cc20180fbe1.woff2 +0 -0
  86. package/frontend/build/static/media/roboto-cyrillic-ext-500-normal.6de16332fda843a3dc3d.woff2 +0 -0
  87. package/frontend/build/static/media/roboto-cyrillic-ext-500-normal.c0a0638f90b31d6454ba.woff +0 -0
  88. package/frontend/build/static/media/roboto-cyrillic-ext-700-normal.4750292c47fa2bc6ac1a.woff2 +0 -0
  89. package/frontend/build/static/media/roboto-cyrillic-ext-700-normal.ca247189fc12d00de361.woff +0 -0
  90. package/frontend/build/static/media/roboto-greek-300-normal.285f3e6261d8eb20417d.woff2 +0 -0
  91. package/frontend/build/static/media/roboto-greek-300-normal.889beddda1c9bd9f97df.woff +0 -0
  92. package/frontend/build/static/media/roboto-greek-400-normal.160a791a8e4f46bca3cc.woff +0 -0
  93. package/frontend/build/static/media/roboto-greek-400-normal.2c32b1315be61477013a.woff2 +0 -0
  94. package/frontend/build/static/media/roboto-greek-500-normal.60810e07c7b0273013aa.woff +0 -0
  95. package/frontend/build/static/media/roboto-greek-500-normal.f95e757c5483310f9c11.woff2 +0 -0
  96. package/frontend/build/static/media/roboto-greek-700-normal.77dd370f2001e184ba0d.woff2 +0 -0
  97. package/frontend/build/static/media/roboto-greek-700-normal.df87b053fae3d7ad5f7a.woff +0 -0
  98. package/frontend/build/static/media/roboto-greek-ext-300-normal.b590dbe5c639944366d1.woff +0 -0
  99. package/frontend/build/static/media/roboto-greek-ext-300-normal.d6049cb54aa6fbe14c42.woff2 +0 -0
  100. package/frontend/build/static/media/roboto-greek-ext-400-normal.16eb83b4a3b1ea994243.woff +0 -0
  101. package/frontend/build/static/media/roboto-greek-ext-400-normal.1df4abad55796d11a0c8.woff2 +0 -0
  102. package/frontend/build/static/media/roboto-greek-ext-500-normal.4a96ba31abcce0f5d52b.woff2 +0 -0
  103. package/frontend/build/static/media/roboto-greek-ext-500-normal.fd28d9c008bf3af1bed7.woff +0 -0
  104. package/frontend/build/static/media/roboto-greek-ext-700-normal.2dd6febad11502dec6a6.woff2 +0 -0
  105. package/frontend/build/static/media/roboto-greek-ext-700-normal.4abdc9fff4507f17d726.woff +0 -0
  106. package/frontend/build/static/media/roboto-latin-300-normal.b850f1ff581ea232fac9.woff2 +0 -0
  107. package/frontend/build/static/media/roboto-latin-300-normal.c4bc0593c9954d79cb3a.woff +0 -0
  108. package/frontend/build/static/media/roboto-latin-400-normal.047a7839f69b209db815.woff +0 -0
  109. package/frontend/build/static/media/roboto-latin-400-normal.297d48e1b5a10c0831a9.woff2 +0 -0
  110. package/frontend/build/static/media/roboto-latin-500-normal.68d40d6d01c6f85d24ba.woff +0 -0
  111. package/frontend/build/static/media/roboto-latin-500-normal.7077203b1982951ecf76.woff2 +0 -0
  112. package/frontend/build/static/media/roboto-latin-700-normal.4535474e1cf8598695ad.woff2 +0 -0
  113. package/frontend/build/static/media/roboto-latin-700-normal.9f6a16a7770c87b2042b.woff +0 -0
  114. package/frontend/build/static/media/roboto-latin-ext-300-normal.14982a9e4857a93b6dce.woff +0 -0
  115. package/frontend/build/static/media/roboto-latin-ext-300-normal.97cbc447d4a8d41a9543.woff2 +0 -0
  116. package/frontend/build/static/media/roboto-latin-ext-400-normal.27da5b36b6d3a16f53f4.woff +0 -0
  117. package/frontend/build/static/media/roboto-latin-ext-400-normal.2eeae187764baf05867d.woff2 +0 -0
  118. package/frontend/build/static/media/roboto-latin-ext-500-normal.06c30711d588145a4541.woff +0 -0
  119. package/frontend/build/static/media/roboto-latin-ext-500-normal.9a18d7bb9ff7a6af7b32.woff2 +0 -0
  120. package/frontend/build/static/media/roboto-latin-ext-700-normal.18841836e391d39e83a8.woff2 +0 -0
  121. package/frontend/build/static/media/roboto-latin-ext-700-normal.3c5bcdd0e69c4c3ffafe.woff +0 -0
  122. package/frontend/build/static/media/roboto-vietnamese-300-normal.c96b16e5c05c7b7c3e89.woff2 +0 -0
  123. package/frontend/build/static/media/roboto-vietnamese-300-normal.f5e7cea32756dfe7af40.woff +0 -0
  124. package/frontend/build/static/media/roboto-vietnamese-400-normal.0dc97c66f9b542d6fa17.woff +0 -0
  125. package/frontend/build/static/media/roboto-vietnamese-400-normal.d3f8e26d6c27de8102b6.woff2 +0 -0
  126. package/frontend/build/static/media/roboto-vietnamese-500-normal.090fabef926bdc0e9b9f.woff2 +0 -0
  127. package/frontend/build/static/media/roboto-vietnamese-500-normal.23b7b8a2524d2d4b637b.woff +0 -0
  128. package/frontend/build/static/media/roboto-vietnamese-700-normal.0a79a9fabfc32e33f360.woff2 +0 -0
  129. package/frontend/build/static/media/roboto-vietnamese-700-normal.35ed0597568ff6f19c16.woff +0 -0
  130. package/npm-shrinkwrap.json +117 -36
  131. package/package.json +8 -3
  132. package/dist/matterbridgeController.d.ts +0 -24
  133. package/dist/matterbridgeController.d.ts.map +0 -1
  134. package/dist/matterbridgeController.js +0 -386
  135. package/dist/matterbridgeController.js.map +0 -1
  136. package/frontend/build/static/css/main.1cf003ae.css +0 -2
  137. package/frontend/build/static/css/main.1cf003ae.css.map +0 -1
  138. package/frontend/build/static/js/main.045d08f7.js +0 -3
  139. package/frontend/build/static/js/main.045d08f7.js.map +0 -1
@@ -25,32 +25,32 @@ import { fileURLToPath } from 'url';
25
25
  import { promises as fs } from 'fs';
26
26
  import { exec, spawn } from 'child_process';
27
27
  import { createServer } from 'http';
28
- import https from 'https';
29
28
  import EventEmitter from 'events';
30
- import express from 'express';
31
29
  import os from 'os';
32
30
  import path from 'path';
31
+ import { randomBytes } from 'crypto';
32
+ // Package modules
33
+ import https from 'https';
34
+ import express from 'express';
33
35
  import WebSocket, { WebSocketServer } from 'ws';
34
36
  // NodeStorage and AnsiLogger modules
35
37
  import { NodeStorageManager } from 'node-persist-manager';
36
- import { AnsiLogger, UNDERLINE, UNDERLINEOFF, YELLOW, db, debugStringify, stringify, BRIGHT, RESET, er, nf, rs, wr, RED, GREEN, zb, hk, or, idn, BLUE, CYAN, nt } from 'node-ansi-logger';
38
+ import { AnsiLogger, UNDERLINE, UNDERLINEOFF, YELLOW, db, debugStringify, stringify, BRIGHT, RESET, er, nf, rs, wr, RED, GREEN, zb, CYAN, nt, idn, or, hk, BLUE } from 'node-ansi-logger';
37
39
  // Matterbridge
38
40
  import { MatterbridgeDevice } from './matterbridgeDevice.js';
39
- import { logInterfaces, wait, waiter, createZip, copyDirectory } from './utils/utils.js';
41
+ import { WS_ID_LOG, WS_ID_REFRESH_NEEDED, WS_ID_RESTART_NEEDED, wsMessageHandler } from './matterbridgeWebsocket.js';
42
+ import { logInterfaces, wait, waiter, createZip, copyDirectory, getParameter, getIntParameter, hasParameter } from './utils/utils.js';
40
43
  import { PluginManager } from './pluginManager.js';
41
44
  import { DeviceManager } from './deviceManager.js';
42
- // @project-chip/matter-node.js
43
- import { CommissioningController, CommissioningServer, MatterServer } from '@project-chip/matter-node.js';
44
- import { BasicInformationCluster, BridgedDeviceBasicInformation, BridgedDeviceBasicInformationCluster, ClusterServer, FixedLabelCluster, GeneralCommissioning, PowerSourceCluster, SwitchCluster, ThreadNetworkDiagnosticsCluster, getClusterNameById, } from '@project-chip/matter-node.js/cluster';
45
- import { DeviceTypeId, VendorId } from '@project-chip/matter-node.js/datatype';
46
- import { Aggregator, DeviceTypes, NodeStateInformation } from '@project-chip/matter-node.js/device';
47
- import { Format, Level, Logger } from '@project-chip/matter-node.js/log';
48
- import { ManualPairingCodeCodec, QrCodeSchema } from '@project-chip/matter-node.js/schema';
49
- import { StorageBackendDisk, StorageBackendJsonFile, StorageManager } from '@project-chip/matter-node.js/storage';
50
- import { getParameter, getIntParameter, hasParameter } from '@project-chip/matter-node.js/util';
51
- import { CryptoNode } from '@project-chip/matter-node.js/crypto';
52
- import { Specification } from '@project-chip/matter-node.js/model';
53
- import { WS_ID_LOG, WS_ID_REFRESH_NEEDED, WS_ID_RESTART_NEEDED, wsMessageHandler } from './matterbridgeWebsocket.js';
45
+ import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
46
+ // @matter
47
+ import { DeviceTypeId, Logger, LogLevel as MatterLogLevel, LogFormat as MatterLogFormat, VendorId, StorageManager } from '@matter/main';
48
+ import { BasicInformationCluster, BridgedDeviceBasicInformation, BridgedDeviceBasicInformationCluster, FixedLabelCluster, GeneralCommissioning, PowerSourceCluster, SwitchCluster, ThreadNetworkDiagnosticsCluster } from '@matter/main/clusters';
49
+ import { getClusterNameById, ManualPairingCodeCodec, QrCodeSchema } from '@matter/main/types';
50
+ import { StorageBackendDisk, StorageBackendJsonFile } from '@matter/nodejs';
51
+ // @project-chip
52
+ import { CommissioningController, CommissioningServer, MatterServer } from '@project-chip/matter.js';
53
+ import { Aggregator, DeviceTypes, NodeStateInformation } from '@project-chip/matter.js/device';
54
54
  // Default colors
55
55
  const plg = '\u001B[38;5;33m';
56
56
  const dev = '\u001B[38;5;79m';
@@ -91,9 +91,11 @@ export class Matterbridge extends EventEmitter {
91
91
  matterbridgeConnected: false,
92
92
  bridgeMode: '',
93
93
  restartMode: '',
94
+ edge: hasParameter('edge'),
95
+ profile: getParameter('profile'),
94
96
  loggerLevel: "info" /* LogLevel.INFO */,
95
97
  fileLogger: false,
96
- matterLoggerLevel: Level.INFO,
98
+ matterLoggerLevel: MatterLogLevel.INFO,
97
99
  matterFileLogger: false,
98
100
  mattermdnsinterface: undefined,
99
101
  matteripv4address: undefined,
@@ -117,6 +119,7 @@ export class Matterbridge extends EventEmitter {
117
119
  bridgeMode = '';
118
120
  restartMode = '';
119
121
  profile = getParameter('profile');
122
+ edge = hasParameter('edge');
120
123
  log;
121
124
  matterbrideLoggerFile = 'matterbridge' + (getParameter('profile') ? '.' + getParameter('profile') : '') + '.log';
122
125
  matterLoggerFile = 'matter' + (getParameter('profile') ? '.' + getParameter('profile') : '') + '.log';
@@ -157,8 +160,8 @@ export class Matterbridge extends EventEmitter {
157
160
  matterAggregator;
158
161
  commissioningServer;
159
162
  commissioningController;
160
- aggregatorVendorId = VendorId(0xfff1);
161
- aggregatorProductId = 0x8000;
163
+ aggregatorVendorId = VendorId(getIntParameter('vendorId') ?? 0xfff1);
164
+ aggregatorProductId = getIntParameter('productId') ?? 0x8000;
162
165
  static instance;
163
166
  // We load asyncronously so is private
164
167
  constructor() {
@@ -315,39 +318,39 @@ export class Matterbridge extends EventEmitter {
315
318
  if (hasParameter('matterlogger')) {
316
319
  const level = getParameter('matterlogger');
317
320
  if (level === 'debug') {
318
- Logger.defaultLogLevel = Level.DEBUG;
321
+ Logger.defaultLogLevel = MatterLogLevel.DEBUG;
319
322
  }
320
323
  else if (level === 'info') {
321
- Logger.defaultLogLevel = Level.INFO;
324
+ Logger.defaultLogLevel = MatterLogLevel.INFO;
322
325
  }
323
326
  else if (level === 'notice') {
324
- Logger.defaultLogLevel = Level.NOTICE;
327
+ Logger.defaultLogLevel = MatterLogLevel.NOTICE;
325
328
  }
326
329
  else if (level === 'warn') {
327
- Logger.defaultLogLevel = Level.WARN;
330
+ Logger.defaultLogLevel = MatterLogLevel.WARN;
328
331
  }
329
332
  else if (level === 'error') {
330
- Logger.defaultLogLevel = Level.ERROR;
333
+ Logger.defaultLogLevel = MatterLogLevel.ERROR;
331
334
  }
332
335
  else if (level === 'fatal') {
333
- Logger.defaultLogLevel = Level.FATAL;
336
+ Logger.defaultLogLevel = MatterLogLevel.FATAL;
334
337
  }
335
338
  else {
336
339
  this.log.warn(`Invalid matter.js logger level: ${level}. Using default level "info".`);
337
- Logger.defaultLogLevel = Level.INFO;
340
+ Logger.defaultLogLevel = MatterLogLevel.INFO;
338
341
  }
339
342
  }
340
343
  else {
341
- Logger.defaultLogLevel = await this.nodeContext.get('matterLogLevel', Level.INFO);
344
+ Logger.defaultLogLevel = await this.nodeContext.get('matterLogLevel', MatterLogLevel.INFO);
342
345
  }
343
- Logger.format = Format.ANSI;
346
+ Logger.format = MatterLogFormat.ANSI;
344
347
  Logger.setLogger('default', this.createMatterLogger());
345
348
  // Create the file logger for matter.js (context: matterFileLog)
346
349
  if (hasParameter('matterfilelogger') || (await this.nodeContext.get('matterFileLog', false))) {
347
350
  this.matterbridgeInformation.matterFileLogger = true;
348
351
  Logger.addLogger('matterfilelogger', await this.createMatterFileLogger(path.join(this.matterbridgeDirectory, this.matterLoggerFile), true), {
349
352
  defaultLogLevel: Logger.defaultLogLevel,
350
- logFormat: Format.PLAIN,
353
+ logFormat: MatterLogFormat.PLAIN,
351
354
  });
352
355
  }
353
356
  this.log.debug(`Matter logLevel: ${Logger.defaultLogLevel} fileLoger: ${this.matterbridgeInformation.matterFileLogger}.`);
@@ -500,6 +503,8 @@ export class Matterbridge extends EventEmitter {
500
503
  this.log.info(` └─ endpoint ${RED}${device.endpoint}${nf} ${typ}${device.endpointName}${nf} ${debugStringify(device.clusterServersId)}`);
501
504
  }
502
505
  });
506
+ await this.cleanup('Exiting...');
507
+ process.exit(0);
503
508
  this.emit('shutdown');
504
509
  return;
505
510
  }
@@ -510,36 +515,48 @@ export class Matterbridge extends EventEmitter {
510
515
  this.log.info(`${plg}${plugin.name}${nf} storage log`);
511
516
  await plugin.nodeContext?.logStorage();
512
517
  }
518
+ await this.cleanup('Exiting...');
519
+ process.exit(0);
513
520
  this.emit('shutdown');
514
521
  return;
515
522
  }
516
523
  if (hasParameter('loginterfaces')) {
517
524
  this.log.info(`${plg}Matterbridge${nf} network interfaces log`);
518
525
  logInterfaces();
526
+ await this.cleanup('Exiting...');
527
+ process.exit(0);
519
528
  this.emit('shutdown');
520
529
  return;
521
530
  }
522
531
  if (getParameter('add')) {
523
532
  this.log.debug(`Adding plugin ${getParameter('add')}`);
524
533
  await this.plugins.add(getParameter('add'));
534
+ await this.cleanup('Exiting...');
535
+ process.exit(0);
525
536
  this.emit('shutdown');
526
537
  return;
527
538
  }
528
539
  if (getParameter('remove')) {
529
540
  this.log.debug(`Removing plugin ${getParameter('remove')}`);
530
541
  await this.plugins.remove(getParameter('remove'));
542
+ await this.cleanup('Exiting...');
543
+ process.exit(0);
531
544
  this.emit('shutdown');
532
545
  return;
533
546
  }
534
547
  if (getParameter('enable')) {
535
548
  this.log.debug(`Enabling plugin ${getParameter('enable')}`);
536
549
  await this.plugins.enable(getParameter('enable'));
550
+ await this.cleanup('Exiting...');
551
+ process.exit(0);
537
552
  this.emit('shutdown');
538
553
  return;
539
554
  }
540
555
  if (getParameter('disable')) {
541
556
  this.log.debug(`Disabling plugin ${getParameter('disable')}`);
542
557
  await this.plugins.disable(getParameter('disable'));
558
+ await this.cleanup('Exiting...');
559
+ process.exit(0);
543
560
  this.emit('shutdown');
544
561
  return;
545
562
  }
@@ -563,6 +580,8 @@ export class Matterbridge extends EventEmitter {
563
580
  this.nodeStorage = undefined;
564
581
  this.plugins.clear();
565
582
  this.devices.clear();
583
+ await this.cleanup('Exiting...');
584
+ process.exit(0);
566
585
  this.emit('shutdown');
567
586
  return;
568
587
  }
@@ -579,6 +598,8 @@ export class Matterbridge extends EventEmitter {
579
598
  await this.matterbridgeContext?.clearAll();
580
599
  await this.stopMatterStorage();
581
600
  this.log.info('Reset done! Remove the device from the controller.');
601
+ await this.cleanup('Exiting...');
602
+ process.exit(0);
582
603
  this.emit('shutdown');
583
604
  return;
584
605
  }
@@ -598,6 +619,8 @@ export class Matterbridge extends EventEmitter {
598
619
  this.log.warn(`Plugin ${plg}${getParameter('reset')}${wr} not registerd in matterbridge`);
599
620
  }
600
621
  await this.stopMatterStorage();
622
+ await this.cleanup('Exiting...');
623
+ process.exit(0);
601
624
  this.emit('shutdown');
602
625
  return;
603
626
  }
@@ -632,6 +655,7 @@ export class Matterbridge extends EventEmitter {
632
655
  if (hasParameter('bridge') || (!hasParameter('childbridge') && (await this.nodeContext?.get('bridgeMode', '')) === 'bridge')) {
633
656
  this.bridgeMode = 'bridge';
634
657
  MatterbridgeDevice.bridgeMode = 'bridge';
658
+ MatterbridgeEndpoint.bridgeMode = 'bridge';
635
659
  this.log.debug(`Starting matterbridge in mode ${this.bridgeMode}`);
636
660
  await this.startBridge();
637
661
  return;
@@ -640,6 +664,7 @@ export class Matterbridge extends EventEmitter {
640
664
  if (hasParameter('childbridge') || (!hasParameter('bridge') && (await this.nodeContext?.get('bridgeMode', '')) === 'childbridge')) {
641
665
  this.bridgeMode = 'childbridge';
642
666
  MatterbridgeDevice.bridgeMode = 'childbridge';
667
+ MatterbridgeEndpoint.bridgeMode = 'childbridge';
643
668
  this.log.debug(`Starting matterbridge in mode ${this.bridgeMode}`);
644
669
  await this.startChildbridge();
645
670
  return;
@@ -695,12 +720,12 @@ export class Matterbridge extends EventEmitter {
695
720
  process.removeAllListeners('unhandledRejection');
696
721
  this.exceptionHandler = async (error) => {
697
722
  this.log.fatal('Unhandled Exception detected at:', error.stack || error, rs);
698
- await this.cleanup('Unhandled Exception detected, cleaning up...');
723
+ // await this.cleanup('Unhandled Exception detected, cleaning up...');
699
724
  };
700
725
  process.on('uncaughtException', this.exceptionHandler);
701
726
  this.rejectionHandler = async (reason, promise) => {
702
727
  this.log.fatal('Unhandled Rejection detected at:', promise, 'reason:', reason instanceof Error ? reason.stack : reason, rs);
703
- await this.cleanup('Unhandled Rejection detected, cleaning up...');
728
+ // await this.cleanup('Unhandled Rejection detected, cleaning up...');
704
729
  };
705
730
  process.on('unhandledRejection', this.rejectionHandler);
706
731
  this.log.debug(`Registering SIGINT and SIGTERM signal handlers...`);
@@ -993,22 +1018,22 @@ export class Matterbridge extends EventEmitter {
993
1018
  const message = formattedLog.slice(65);
994
1019
  matterLogger.logName = logger;
995
1020
  switch (_level) {
996
- case Level.DEBUG:
1021
+ case MatterLogLevel.DEBUG:
997
1022
  matterLogger.log("debug" /* LogLevel.DEBUG */, message);
998
1023
  break;
999
- case Level.INFO:
1024
+ case MatterLogLevel.INFO:
1000
1025
  matterLogger.log("info" /* LogLevel.INFO */, message);
1001
1026
  break;
1002
- case Level.NOTICE:
1027
+ case MatterLogLevel.NOTICE:
1003
1028
  matterLogger.log("notice" /* LogLevel.NOTICE */, message);
1004
1029
  break;
1005
- case Level.WARN:
1030
+ case MatterLogLevel.WARN:
1006
1031
  matterLogger.log("warn" /* LogLevel.WARN */, message);
1007
1032
  break;
1008
- case Level.ERROR:
1033
+ case MatterLogLevel.ERROR:
1009
1034
  matterLogger.log("error" /* LogLevel.ERROR */, message);
1010
1035
  break;
1011
- case Level.FATAL:
1036
+ case MatterLogLevel.FATAL:
1012
1037
  matterLogger.log("fatal" /* LogLevel.FATAL */, message);
1013
1038
  break;
1014
1039
  default:
@@ -1050,22 +1075,22 @@ export class Matterbridge extends EventEmitter {
1050
1075
  const logger = parts[1];
1051
1076
  const finalMessage = parts.slice(2).join(' ') + os.EOL;
1052
1077
  switch (_level) {
1053
- case Level.DEBUG:
1078
+ case MatterLogLevel.DEBUG:
1054
1079
  await fs.appendFile(filePath, `[${timestamp}] [${logger}] [debug] ${finalMessage}`);
1055
1080
  break;
1056
- case Level.INFO:
1081
+ case MatterLogLevel.INFO:
1057
1082
  await fs.appendFile(filePath, `[${timestamp}] [${logger}] [info] ${finalMessage}`);
1058
1083
  break;
1059
- case Level.NOTICE:
1084
+ case MatterLogLevel.NOTICE:
1060
1085
  await fs.appendFile(filePath, `[${timestamp}] [${logger}] [notice] ${finalMessage}`);
1061
1086
  break;
1062
- case Level.WARN:
1087
+ case MatterLogLevel.WARN:
1063
1088
  await fs.appendFile(filePath, `[${timestamp}] [${logger}] [warn] ${finalMessage}`);
1064
1089
  break;
1065
- case Level.ERROR:
1090
+ case MatterLogLevel.ERROR:
1066
1091
  await fs.appendFile(filePath, `[${timestamp}] [${logger}] [error] ${finalMessage}`);
1067
1092
  break;
1068
- case Level.FATAL:
1093
+ case MatterLogLevel.FATAL:
1069
1094
  await fs.appendFile(filePath, `[${timestamp}] [${logger}] [fatal] ${finalMessage}`);
1070
1095
  break;
1071
1096
  default:
@@ -1280,6 +1305,18 @@ export class Matterbridge extends EventEmitter {
1280
1305
  this.initialized = false;
1281
1306
  }
1282
1307
  }
1308
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1309
+ async addBridgedEndpoint(pluginName, device) {
1310
+ // Nothing to do here
1311
+ }
1312
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1313
+ async removeBridgedEndpoint(pluginName, device) {
1314
+ // Nothing to do here
1315
+ }
1316
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1317
+ async removeAllBridgedEndpoints(pluginName) {
1318
+ // Nothing to do here
1319
+ }
1283
1320
  /**
1284
1321
  * Adds a bridged device to the Matterbridge.
1285
1322
  * @param pluginName - The name of the plugin.
@@ -1955,39 +1992,52 @@ export class Matterbridge extends EventEmitter {
1955
1992
  * @param {StorageContext} context - The storage context.
1956
1993
  * @returns {Aggregator} - The created Matter Aggregator.
1957
1994
  */
1995
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1958
1996
  async createMatterAggregator(context, pluginName) {
1959
- const random = 'AG' + CryptoNode.getRandomData(8).toHex();
1997
+ /*
1998
+ const random = randomBytes(8).toString('hex');
1960
1999
  await context.set('aggregatorSerialNumber', await context.get('aggregatorSerialNumber', random));
1961
2000
  await context.set('aggregatorUniqueId', await context.get('aggregatorUniqueId', random));
1962
- this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with uniqueId ${await context.get('aggregatorUniqueId')} serialNumber ${await context.get('aggregatorSerialNumber')}`);
1963
- this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with softwareVersion ${await context.get('softwareVersion', 1)} softwareVersionString ${await context.get('softwareVersionString', '1.0.0')}`);
1964
- this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with hardwareVersion ${await context.get('hardwareVersion', 1)} hardwareVersionString ${await context.get('hardwareVersionString', '1.0.0')}`);
2001
+
2002
+ this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with uniqueId ${await context.get<string>('aggregatorUniqueId')} serialNumber ${await context.get<string>('aggregatorSerialNumber')}`);
2003
+ this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with softwareVersion ${await context.get<number>('softwareVersion', 1)} softwareVersionString ${await context.get<string>('softwareVersionString', '1.0.0')}`);
2004
+ this.log.debug(`Creating matter aggregator for plugin ${plg}${pluginName}${db} with hardwareVersion ${await context.get<number>('hardwareVersion', 1)} hardwareVersionString ${await context.get<string>('hardwareVersionString', '1.0.0')}`);
2005
+ */
1965
2006
  const matterAggregator = new Aggregator();
1966
- matterAggregator.addClusterServer(ClusterServer(BasicInformationCluster, {
1967
- dataModelRevision: 1,
1968
- location: 'FR',
1969
- vendorId: VendorId(0xfff1),
1970
- vendorName: 'Matterbridge',
1971
- productId: 0x8000,
1972
- productName: 'Matterbridge aggregator',
1973
- productLabel: 'Matterbridge aggregator',
1974
- nodeLabel: 'Matterbridge aggregator',
1975
- serialNumber: await context.get('aggregatorSerialNumber'),
1976
- uniqueId: await context.get('aggregatorUniqueId'),
1977
- softwareVersion: await context.get('softwareVersion', 1),
1978
- softwareVersionString: await context.get('softwareVersionString', '1.0.0'),
1979
- hardwareVersion: await context.get('hardwareVersion', 1),
1980
- hardwareVersionString: await context.get('hardwareVersionString', '1.0.0'),
1981
- reachable: true,
1982
- capabilityMinima: { caseSessionsPerFabric: 3, subscriptionsPerFabric: 3 },
1983
- specificationVersion: Specification.SPECIFICATION_VERSION,
1984
- maxPathsPerInvoke: 1,
1985
- }, {}, {
1986
- startUp: true,
1987
- shutDown: true,
1988
- leave: true,
1989
- reachableChanged: true,
1990
- }));
2007
+ /*
2008
+ matterAggregator.addClusterServer(
2009
+ ClusterServer(
2010
+ BasicInformationCluster,
2011
+ {
2012
+ dataModelRevision: 1,
2013
+ location: 'FR',
2014
+ vendorId: VendorId(0xfff1),
2015
+ vendorName: 'Matterbridge',
2016
+ productId: 0x8000,
2017
+ productName: 'Matterbridge aggregator',
2018
+ productLabel: 'Matterbridge aggregator',
2019
+ nodeLabel: 'Matterbridge aggregator',
2020
+ serialNumber: await context.get<string>('aggregatorSerialNumber'),
2021
+ uniqueId: await context.get<string>('aggregatorUniqueId'),
2022
+ softwareVersion: await context.get<number>('softwareVersion', 1),
2023
+ softwareVersionString: await context.get<string>('softwareVersionString', '1.0.0'),
2024
+ hardwareVersion: await context.get<number>('hardwareVersion', 1),
2025
+ hardwareVersionString: await context.get<string>('hardwareVersionString', '1.0.0'),
2026
+ reachable: true,
2027
+ capabilityMinima: { caseSessionsPerFabric: 3, subscriptionsPerFabric: 3 },
2028
+ specificationVersion: Specification.SPECIFICATION_VERSION,
2029
+ maxPathsPerInvoke: 1,
2030
+ },
2031
+ {},
2032
+ {
2033
+ startUp: true,
2034
+ shutDown: true,
2035
+ leave: true,
2036
+ reachableChanged: true,
2037
+ },
2038
+ ),
2039
+ );
2040
+ */
1991
2041
  return matterAggregator;
1992
2042
  }
1993
2043
  /**
@@ -2180,7 +2230,7 @@ export class Matterbridge extends EventEmitter {
2180
2230
  if (!this.storageManager)
2181
2231
  throw new Error('No storage manager initialized');
2182
2232
  this.log.debug(`Creating commissioning server storage context for ${plg}${pluginName}${db}`);
2183
- const random = 'CS' + CryptoNode.getRandomData(8).toHex();
2233
+ const random = randomBytes(8).toString('hex');
2184
2234
  const storageContext = this.storageManager.createContext(pluginName);
2185
2235
  await storageContext.set('deviceName', deviceName);
2186
2236
  await storageContext.set('deviceType', deviceType);
@@ -3122,22 +3172,22 @@ export class Matterbridge extends EventEmitter {
3122
3172
  if (command === 'setmjloglevel') {
3123
3173
  this.log.debug('Matter.js log level:', param);
3124
3174
  if (param === 'Debug') {
3125
- Logger.defaultLogLevel = Level.DEBUG;
3175
+ Logger.defaultLogLevel = MatterLogLevel.DEBUG;
3126
3176
  }
3127
3177
  else if (param === 'Info') {
3128
- Logger.defaultLogLevel = Level.INFO;
3178
+ Logger.defaultLogLevel = MatterLogLevel.INFO;
3129
3179
  }
3130
3180
  else if (param === 'Notice') {
3131
- Logger.defaultLogLevel = Level.NOTICE;
3181
+ Logger.defaultLogLevel = MatterLogLevel.NOTICE;
3132
3182
  }
3133
3183
  else if (param === 'Warn') {
3134
- Logger.defaultLogLevel = Level.WARN;
3184
+ Logger.defaultLogLevel = MatterLogLevel.WARN;
3135
3185
  }
3136
3186
  else if (param === 'Error') {
3137
- Logger.defaultLogLevel = Level.ERROR;
3187
+ Logger.defaultLogLevel = MatterLogLevel.ERROR;
3138
3188
  }
3139
3189
  else if (param === 'Fatal') {
3140
- Logger.defaultLogLevel = Level.FATAL;
3190
+ Logger.defaultLogLevel = MatterLogLevel.FATAL;
3141
3191
  }
3142
3192
  await this.nodeContext?.set('matterLogLevel', Logger.defaultLogLevel);
3143
3193
  res.json({ message: 'Command received' });
@@ -3191,8 +3241,8 @@ export class Matterbridge extends EventEmitter {
3191
3241
  if (param === 'true') {
3192
3242
  try {
3193
3243
  Logger.addLogger('matterfilelogger', await this.createMatterFileLogger(path.join(this.matterbridgeDirectory, this.matterLoggerFile), true), {
3194
- defaultLogLevel: Level.DEBUG,
3195
- logFormat: Format.PLAIN,
3244
+ defaultLogLevel: MatterLogLevel.DEBUG,
3245
+ logFormat: MatterLogFormat.PLAIN,
3196
3246
  });
3197
3247
  }
3198
3248
  catch (error) {
@@ -3480,8 +3530,8 @@ export class Matterbridge extends EventEmitter {
3480
3530
  await this.logNodeAndSystemInfo();
3481
3531
  this.matterbridgeDirectory = dataPath;
3482
3532
  // Set matter.js logger level and format
3483
- Logger.defaultLogLevel = Level.INFO;
3484
- Logger.format = Format.ANSI;
3533
+ Logger.defaultLogLevel = MatterLogLevel.INFO;
3534
+ Logger.format = MatterLogFormat.ANSI;
3485
3535
  // Start the storage and create matterbridgeContext
3486
3536
  await this.startMatterStorage('json', path.join(this.matterbridgeDirectory, this.matterStorageName));
3487
3537
  if (!this.storageManager)