matterbridge 3.0.1-dev-20250503-71b796a → 3.0.1-dev-20250503-aa33494

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -26,6 +26,7 @@ It is also available the official Matterbridge Home Assistant plugin https://git
26
26
 
27
27
  ### Changed
28
28
 
29
+ - [package]: Updated dependencies.
29
30
  - [docker]: Updated the [Docker configurations](README-DOCKER.md).
30
31
  - [frontend]: Changing configuration for a plugin now only lock configuration on that plugin.
31
32
 
package/dist/frontend.js CHANGED
@@ -364,16 +364,6 @@ export class Frontend {
364
364
  }
365
365
  });
366
366
  });
367
- this.expressApp.get('/api/download-mjstorage', async (req, res) => {
368
- this.log.debug('The frontend sent /api/download-mjstorage');
369
- await createZip(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.matterStorageName}.zip`), path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.matterStorageName));
370
- res.download(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.matterStorageName}.zip`), `matterbridge.${this.matterbridge.matterStorageName}.zip`, (error) => {
371
- if (error) {
372
- this.log.error(`Error downloading the matter storage matterbridge.${this.matterbridge.matterStorageName}.zip: ${error instanceof Error ? error.message : error}`);
373
- res.status(500).send('Error downloading the matter storage zip file');
374
- }
375
- });
376
- });
377
367
  this.expressApp.get('/api/download-mbstorage', async (req, res) => {
378
368
  this.log.debug('The frontend sent /api/download-mbstorage');
379
369
  await createZip(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.nodeStorageName}.zip`), path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.nodeStorageName));
@@ -384,6 +374,16 @@ export class Frontend {
384
374
  }
385
375
  });
386
376
  });
377
+ this.expressApp.get('/api/download-mjstorage', async (req, res) => {
378
+ this.log.debug('The frontend sent /api/download-mjstorage');
379
+ await createZip(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.matterStorageName}.zip`), path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.matterStorageName));
380
+ res.download(path.join(os.tmpdir(), `matterbridge.${this.matterbridge.matterStorageName}.zip`), `matterbridge.${this.matterbridge.matterStorageName}.zip`, (error) => {
381
+ if (error) {
382
+ this.log.error(`Error downloading the matter storage matterbridge.${this.matterbridge.matterStorageName}.zip: ${error instanceof Error ? error.message : error}`);
383
+ res.status(500).send('Error downloading the matter storage zip file');
384
+ }
385
+ });
386
+ });
387
387
  this.expressApp.get('/api/download-pluginstorage', async (req, res) => {
388
388
  this.log.debug('The frontend sent /api/download-pluginstorage');
389
389
  await createZip(path.join(os.tmpdir(), `matterbridge.pluginstorage.zip`), this.matterbridge.matterbridgePluginDirectory);
@@ -909,6 +909,7 @@ export class Frontend {
909
909
  this.wssSendSnackbarMessage(`Removed plugin ${data.params.pluginName}`, 5, 'success');
910
910
  this.wssSendRefreshRequired('plugins');
911
911
  this.wssSendRefreshRequired('devices');
912
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
912
913
  }
913
914
  else if (data.method === '/api/enableplugin') {
914
915
  if (!isValidString(data.params.pluginName, 10) || !this.matterbridge.plugins.has(data.params.pluginName)) {
@@ -933,6 +934,7 @@ export class Frontend {
933
934
  this.wssSendSnackbarMessage(`Started plugin ${data.params.pluginName}`, 5, 'success');
934
935
  });
935
936
  }
937
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
936
938
  }
937
939
  else if (data.method === '/api/disableplugin') {
938
940
  if (!isValidString(data.params.pluginName, 10) || !this.matterbridge.plugins.has(data.params.pluginName)) {
@@ -945,6 +947,7 @@ export class Frontend {
945
947
  this.wssSendSnackbarMessage(`Disabled plugin ${data.params.pluginName}`, 5, 'success');
946
948
  this.wssSendRefreshRequired('plugins');
947
949
  this.wssSendRefreshRequired('devices');
950
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
948
951
  }
949
952
  else if (data.method === '/api/savepluginconfig') {
950
953
  if (!isValidString(data.params.pluginName, 10) || !this.matterbridge.plugins.has(data.params.pluginName)) {
@@ -965,44 +968,54 @@ export class Frontend {
965
968
  this.wssSendSnackbarMessage(`Saved config for plugin ${data.params.pluginName}`);
966
969
  this.wssSendRefreshRequired('plugins');
967
970
  this.wssSendRestartRequired();
971
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
968
972
  }
969
973
  }
970
974
  else if (data.method === '/api/shellysysupdate') {
971
975
  const { triggerShellySysUpdate } = await import('./shelly.js');
972
976
  triggerShellySysUpdate(this.matterbridge);
977
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
973
978
  }
974
979
  else if (data.method === '/api/shellymainupdate') {
975
980
  const { triggerShellyMainUpdate } = await import('./shelly.js');
976
981
  triggerShellyMainUpdate(this.matterbridge);
982
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
977
983
  }
978
984
  else if (data.method === '/api/shellycreatesystemlog') {
979
985
  const { createShellySystemLog } = await import('./shelly.js');
980
986
  createShellySystemLog(this.matterbridge);
987
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
981
988
  }
982
989
  else if (data.method === '/api/shellynetconfig') {
983
990
  this.log.debug('/api/shellynetconfig:', data.params);
984
991
  const { triggerShellyChangeIp: triggerShellyChangeNet } = await import('./shelly.js');
985
992
  triggerShellyChangeNet(this.matterbridge, data.params);
993
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
986
994
  }
987
995
  else if (data.method === '/api/softreset') {
988
996
  const { triggerShellySoftReset } = await import('./shelly.js');
989
997
  triggerShellySoftReset(this.matterbridge);
998
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
990
999
  }
991
1000
  else if (data.method === '/api/hardreset') {
992
1001
  const { triggerShellyHardReset } = await import('./shelly.js');
993
1002
  triggerShellyHardReset(this.matterbridge);
1003
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
994
1004
  }
995
1005
  else if (data.method === '/api/reboot') {
996
1006
  const { triggerShellyReboot } = await import('./shelly.js');
997
1007
  triggerShellyReboot(this.matterbridge);
1008
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
998
1009
  }
999
1010
  else if (data.method === '/api/restart') {
1000
1011
  this.wssSendSnackbarMessage(`Restarting matterbridge...`, 0);
1001
1012
  await this.matterbridge.restartProcess();
1013
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1002
1014
  }
1003
1015
  else if (data.method === '/api/shutdown') {
1004
1016
  this.wssSendSnackbarMessage(`Shutting down matterbridge...`, 0);
1005
1017
  await this.matterbridge.shutdownProcess();
1018
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1006
1019
  }
1007
1020
  else if (data.method === '/api/create-backup') {
1008
1021
  this.wssSendSnackbarMessage('Creating backup...', 0);
@@ -1011,19 +1024,23 @@ export class Frontend {
1011
1024
  this.log.notice(`Backup ready to be downloaded.`);
1012
1025
  this.wssSendCloseSnackbarMessage('Creating backup...');
1013
1026
  this.wssSendSnackbarMessage('Backup ready to be downloaded', 10);
1027
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1014
1028
  }
1015
1029
  else if (data.method === '/api/unregister') {
1016
1030
  this.wssSendSnackbarMessage('Unregistering all bridged devices...', 0);
1017
1031
  await this.matterbridge.unregisterAndShutdownProcess();
1018
1032
  this.wssSendCloseSnackbarMessage('Unregistering all bridged devices...');
1033
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1019
1034
  }
1020
1035
  else if (data.method === '/api/reset') {
1021
1036
  this.wssSendSnackbarMessage('Resetting matterbridge commissioning...', 10);
1022
1037
  await this.matterbridge.shutdownProcessAndReset();
1038
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1023
1039
  }
1024
1040
  else if (data.method === '/api/factoryreset') {
1025
1041
  this.wssSendSnackbarMessage('Factory reset of matterbridge...', 10);
1026
1042
  await this.matterbridge.shutdownProcessAndFactoryReset();
1043
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1027
1044
  }
1028
1045
  else if (data.method === '/api/advertise') {
1029
1046
  const pairingCodes = await this.matterbridge.advertiseServerNode(this.matterbridge.serverNode);
@@ -1039,7 +1056,7 @@ export class Frontend {
1039
1056
  this.matterbridge.matterbridgeInformation.matterbridgeAdvertise = false;
1040
1057
  this.wssSendRefreshRequired('matterbridgeAdvertise');
1041
1058
  this.wssSendSnackbarMessage(`Stopped fabrics share`, 0);
1042
- client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src }));
1059
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1043
1060
  }
1044
1061
  else if (data.method === '/api/settings') {
1045
1062
  client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, response: await this.getApiSettings() }));
@@ -1195,8 +1212,14 @@ export class Frontend {
1195
1212
  return;
1196
1213
  }
1197
1214
  this.log.notice(`Action ${CYAN}${data.params.action}${nt}${data.params.value ? ' with ' + CYAN + data.params.value + nt : ''} for plugin ${CYAN}${plugin.name}${nt}`);
1198
- plugin.platform?.onAction(data.params.action, data.params.value, data.params.id, data.params.formData).catch((error) => {
1215
+ plugin.platform
1216
+ ?.onAction(data.params.action, data.params.value, data.params.id, data.params.formData)
1217
+ .then(() => {
1218
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1219
+ })
1220
+ .catch((error) => {
1199
1221
  this.log.error(`Error in plugin ${plugin.name} action ${data.params.action}: ${error}`);
1222
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: `Error in plugin ${plugin.name} action ${data.params.action}: ${error}` }));
1200
1223
  });
1201
1224
  }
1202
1225
  else if (data.method === '/api/config') {
@@ -1205,17 +1228,18 @@ export class Frontend {
1205
1228
  return;
1206
1229
  }
1207
1230
  this.log.debug(`Received /api/config name ${CYAN}${data.params.name}${db} value ${CYAN}${data.params.value}${db}`);
1208
- this.log.fatal(`Received /api/config name ${CYAN}${data.params.name}${db} value(${typeof data.params.value}) ${CYAN}${data.params.value}${db}`);
1209
1231
  switch (data.params.name) {
1210
1232
  case 'setpassword':
1211
1233
  if (isValidString(data.params.value)) {
1212
1234
  await this.matterbridge.nodeContext?.set('password', data.params.value);
1235
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1213
1236
  }
1214
1237
  break;
1215
1238
  case 'setbridgemode':
1216
- if (isValidString(data.params.value, 5)) {
1239
+ if (isValidString(data.params.value) && ['bridge', 'childbridge'].includes(data.params.value)) {
1217
1240
  await this.matterbridge.nodeContext?.set('bridgeMode', data.params.value);
1218
1241
  this.wssSendRestartRequired();
1242
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1219
1243
  }
1220
1244
  break;
1221
1245
  case 'setmbloglevel':
@@ -1240,6 +1264,7 @@ export class Frontend {
1240
1264
  await this.matterbridge.setLogLevel("fatal");
1241
1265
  }
1242
1266
  await this.matterbridge.nodeContext?.set('matterbridgeLogLevel', this.log.logLevel);
1267
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1243
1268
  }
1244
1269
  break;
1245
1270
  case 'setmblogfile':
@@ -1251,6 +1276,7 @@ export class Frontend {
1251
1276
  AnsiLogger.setGlobalLogfile(path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.matterbrideLoggerFile), this.matterbridge.matterbridgeInformation.loggerLevel, true);
1252
1277
  else
1253
1278
  AnsiLogger.setGlobalLogfile(undefined);
1279
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1254
1280
  }
1255
1281
  break;
1256
1282
  case 'setmjloglevel':
@@ -1276,6 +1302,7 @@ export class Frontend {
1276
1302
  }
1277
1303
  this.matterbridge.matterbridgeInformation.matterLoggerLevel = Logger.level;
1278
1304
  await this.matterbridge.nodeContext?.set('matterLogLevel', Logger.level);
1305
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1279
1306
  }
1280
1307
  break;
1281
1308
  case 'setmjlogfile':
@@ -1302,6 +1329,7 @@ export class Frontend {
1302
1329
  this.log.debug(`Error removing the matterfilelogger for file ${CYAN}${path.join(this.matterbridge.matterbridgeDirectory, this.matterbridge.matterLoggerFile)}${er}: ${error instanceof Error ? error.message : error}`);
1303
1330
  }
1304
1331
  }
1332
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1305
1333
  }
1306
1334
  break;
1307
1335
  case 'setmdnsinterface':
@@ -1311,6 +1339,7 @@ export class Frontend {
1311
1339
  this.matterbridge.matterbridgeInformation.mattermdnsinterface = this.matterbridge.mdnsInterface;
1312
1340
  await this.matterbridge.nodeContext?.set('mattermdnsinterface', data.params.value);
1313
1341
  this.wssSendRestartRequired();
1342
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1314
1343
  }
1315
1344
  break;
1316
1345
  case 'setipv4address':
@@ -1320,6 +1349,7 @@ export class Frontend {
1320
1349
  this.matterbridge.matterbridgeInformation.matteripv4address = this.matterbridge.ipv4address;
1321
1350
  await this.matterbridge.nodeContext?.set('matteripv4address', data.params.value);
1322
1351
  this.wssSendRestartRequired();
1352
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1323
1353
  }
1324
1354
  break;
1325
1355
  case 'setipv6address':
@@ -1329,6 +1359,7 @@ export class Frontend {
1329
1359
  this.matterbridge.matterbridgeInformation.matteripv6address = this.matterbridge.ipv6address;
1330
1360
  await this.matterbridge.nodeContext?.set('matteripv6address', data.params.value);
1331
1361
  this.wssSendRestartRequired();
1362
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1332
1363
  }
1333
1364
  break;
1334
1365
  case 'setmatterport':
@@ -1340,11 +1371,12 @@ export class Frontend {
1340
1371
  this.wssSendRestartRequired();
1341
1372
  }
1342
1373
  else {
1343
- this.log.debug(`Reset matter commissioning port to ${CYAN}5040${db}`);
1344
- this.matterbridge.matterbridgeInformation.matterPort = 5040;
1345
- await this.matterbridge.nodeContext?.set('matterport', 5040);
1374
+ this.log.debug(`Reset matter commissioning port to ${CYAN}5540${db}`);
1375
+ this.matterbridge.matterbridgeInformation.matterPort = 5540;
1376
+ await this.matterbridge.nodeContext?.set('matterport', 5540);
1346
1377
  this.wssSendRestartRequired();
1347
1378
  }
1379
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1348
1380
  break;
1349
1381
  case 'setmatterdiscriminator':
1350
1382
  data.params.value = isValidString(data.params.value) ? parseInt(data.params.value) : 0;
@@ -1360,6 +1392,7 @@ export class Frontend {
1360
1392
  await this.matterbridge.nodeContext?.remove('matterdiscriminator');
1361
1393
  this.wssSendRestartRequired();
1362
1394
  }
1395
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1363
1396
  break;
1364
1397
  case 'setmatterpasscode':
1365
1398
  data.params.value = isValidString(data.params.value) ? parseInt(data.params.value) : 0;
@@ -1375,7 +1408,11 @@ export class Frontend {
1375
1408
  await this.matterbridge.nodeContext?.remove('matterpasscode');
1376
1409
  this.wssSendRestartRequired();
1377
1410
  }
1411
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true }));
1378
1412
  break;
1413
+ default:
1414
+ this.log.warn(`Unknown parameter ${data.params.name} in /api/config`);
1415
+ client.send(JSON.stringify({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, error: `Unknown parameter ${data.params.name} in /api/config` }));
1379
1416
  }
1380
1417
  }
1381
1418
  else if (data.method === '/api/command') {
@@ -1018,6 +1018,7 @@ export class Matterbridge extends EventEmitter {
1018
1018
  }
1019
1019
  async cleanup(message, restart = false) {
1020
1020
  if (this.initialized && !this.hasCleanupStarted) {
1021
+ this.emit('cleanup_started');
1021
1022
  this.hasCleanupStarted = true;
1022
1023
  this.log.info(message);
1023
1024
  if (this.startMatterInterval) {
@@ -1171,6 +1172,7 @@ export class Matterbridge extends EventEmitter {
1171
1172
  }
1172
1173
  this.hasCleanupStarted = false;
1173
1174
  this.initialized = false;
1175
+ this.emit('cleanup_completed');
1174
1176
  }
1175
1177
  else {
1176
1178
  this.log.debug('Cleanup already started...');
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.0.1-dev-20250503-71b796a",
3
+ "version": "3.0.1-dev-20250503-aa33494",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "3.0.1-dev-20250503-71b796a",
9
+ "version": "3.0.1-dev-20250503-aa33494",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@matter/main": "0.13.0",
@@ -16,7 +16,7 @@
16
16
  "multer": "1.4.5-lts.2",
17
17
  "node-ansi-logger": "3.0.1",
18
18
  "node-persist-manager": "1.0.8",
19
- "ws": "8.18.1"
19
+ "ws": "8.18.2"
20
20
  },
21
21
  "bin": {
22
22
  "matterbridge": "dist/cli.js"
@@ -2135,9 +2135,9 @@
2135
2135
  "license": "ISC"
2136
2136
  },
2137
2137
  "node_modules/ws": {
2138
- "version": "8.18.1",
2139
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
2140
- "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
2138
+ "version": "8.18.2",
2139
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz",
2140
+ "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==",
2141
2141
  "license": "MIT",
2142
2142
  "engines": {
2143
2143
  "node": ">=10.0.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.0.1-dev-20250503-71b796a",
3
+ "version": "3.0.1-dev-20250503-aa33494",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",
@@ -101,6 +101,6 @@
101
101
  "multer": "1.4.5-lts.2",
102
102
  "node-ansi-logger": "3.0.1",
103
103
  "node-persist-manager": "1.0.8",
104
- "ws": "8.18.1"
104
+ "ws": "8.18.2"
105
105
  }
106
106
  }