@matterbridge/core 3.9.2-dev-20260620-2b9580a → 3.9.2-dev-20260621-75283ba

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.
@@ -1,5 +1,5 @@
1
1
  import type { EndpointNumber } from '@matter/types/datatype';
2
- import type { ApiMatter, RefreshRequiredChanged, SharedMatterbridge, WsMessageBroadcast } from '@matterbridge/types';
2
+ import type { ApiMatter, BridgeStatus, PluginStatusUpdate, RefreshRequiredChanged, SharedMatterbridge, WsMessageBroadcast } from '@matterbridge/types';
3
3
  import { WebSocketServer } from 'ws';
4
4
  import type { Backend } from './backend.js';
5
5
  export declare class BackendWsServer {
@@ -27,6 +27,8 @@ export declare class BackendWsServer {
27
27
  wssSendRestartNotRequired(snackbar?: boolean): void;
28
28
  wssSendUpdateRequired(version: string, devVersion?: boolean): void;
29
29
  wssSendPluginUpdateRequired(plugin: string, version: string, devVersion?: boolean): void;
30
+ wssSendPluginStatusUpdate(plugin: string, status: PluginStatusUpdate): void;
31
+ wssSendMatterbridgeStatusUpdate(status: BridgeStatus): void;
30
32
  wssSendCpuUpdate(cpuUsage: number, processCpuUsage: number): void;
31
33
  wssSendMemoryUpdate(totalMemory: string, freeMemory: string, rss: string, heapTotal: string, heapUsed: string, external: string, arrayBuffers: string): void;
32
34
  wssSendUptimeUpdate(systemUptime: string, processUptime: string): void;
@@ -236,16 +236,30 @@ export class BackendWsServer {
236
236
  if (!this.hasActiveClients())
237
237
  return;
238
238
  if (this.verbose)
239
- this.log.debug('Sending an update required message to all connected clients');
239
+ this.log.debug('Sending a matterbridge version update required message to all connected clients');
240
240
  this.wssBroadcastMessage({ id: 0, src: 'Matterbridge', dst: 'Frontend', method: 'update_required', success: true, response: { version, devVersion } });
241
241
  }
242
242
  wssSendPluginUpdateRequired(plugin, version, devVersion = false) {
243
243
  if (!this.hasActiveClients())
244
244
  return;
245
245
  if (this.verbose)
246
- this.log.debug('Sending a plugin update required message to all connected clients');
246
+ this.log.debug('Sending a plugin version update required message to all connected clients');
247
247
  this.wssBroadcastMessage({ id: 0, src: 'Matterbridge', dst: 'Frontend', method: 'plugin_update_required', success: true, response: { plugin, version, devVersion } });
248
248
  }
249
+ wssSendPluginStatusUpdate(plugin, status) {
250
+ if (!this.hasActiveClients())
251
+ return;
252
+ if (this.verbose)
253
+ this.log.debug('Sending a plugin status update message to all connected clients');
254
+ this.wssBroadcastMessage({ id: 0, src: 'Matterbridge', dst: 'Frontend', method: 'plugin_status_update', success: true, response: { plugin, status } });
255
+ }
256
+ wssSendMatterbridgeStatusUpdate(status) {
257
+ if (!this.hasActiveClients())
258
+ return;
259
+ if (this.verbose)
260
+ this.log.debug('Sending a matterbridge status update message to all connected clients');
261
+ this.wssBroadcastMessage({ id: 0, src: 'Matterbridge', dst: 'Frontend', method: 'matterbridge_status_update', success: true, response: { status } });
262
+ }
249
263
  wssSendCpuUpdate(cpuUsage, processCpuUsage) {
250
264
  if (!this.hasActiveClients())
251
265
  return;
@@ -1,6 +1,6 @@
1
1
  import EventEmitter from 'node:events';
2
2
  import { type EndpointNumber } from '@matter/types/datatype';
3
- import type { ApiClusters, ApiDevice, ApiMatter, ApiPlugin, ApiSettings, RefreshRequiredChanged, WsMessageBroadcast } from '@matterbridge/types';
3
+ import type { ApiClusters, ApiDevice, ApiMatter, ApiPlugin, ApiSettings, BridgeStatus, PluginStatusUpdate, RefreshRequiredChanged, WsMessageBroadcast } from '@matterbridge/types';
4
4
  import { LogLevel } from 'node-ansi-logger';
5
5
  import type { Matterbridge } from './matterbridge.js';
6
6
  interface FrontendEvents {
@@ -59,6 +59,8 @@ export declare class Frontend extends EventEmitter<FrontendEvents> {
59
59
  wssSendRestartNotRequired(snackbar?: boolean): void;
60
60
  wssSendUpdateRequired(version: string, devVersion?: boolean): void;
61
61
  wssSendPluginUpdateRequired(plugin: string, version: string, devVersion?: boolean): void;
62
+ wssSendPluginStatusUpdate(plugin: string, status: PluginStatusUpdate): void;
63
+ wssSendMatterbridgeStatusUpdate(status: BridgeStatus): void;
62
64
  wssSendCpuUpdate(cpuUsage: number, processCpuUsage: number): void;
63
65
  wssSendMemoryUpdate(totalMemory: string, freeMemory: string, rss: string, heapTotal: string, heapUsed: string, external: string, arrayBuffers: string): void;
64
66
  wssSendUptimeUpdate(systemUptime: string, processUptime: string): void;
package/dist/frontend.js CHANGED
@@ -100,10 +100,22 @@ export class Frontend extends EventEmitter {
100
100
  this.wssSendPluginUpdateRequired(msg.params.plugin, msg.params.version, msg.params.devVersion);
101
101
  this.server.respond({ ...msg, result: { success: true } });
102
102
  break;
103
+ case 'frontend_pluginstatusupdate':
104
+ this.wssSendPluginStatusUpdate(msg.params.plugin, msg.params.status);
105
+ this.server.respond({ ...msg, result: { success: true } });
106
+ break;
107
+ case 'frontend_matterbridgestatusupdate':
108
+ this.wssSendMatterbridgeStatusUpdate(msg.params.status);
109
+ this.server.respond({ ...msg, result: { success: true } });
110
+ break;
103
111
  case 'frontend_snackbarmessage':
104
112
  this.wssSendSnackbarMessage(msg.params.message, msg.params.timeout, msg.params.severity);
105
113
  this.server.respond({ ...msg, result: { success: true } });
106
114
  break;
115
+ case 'frontend_closesnackbarmessage':
116
+ this.wssSendCloseSnackbarMessage(msg.params.message);
117
+ this.server.respond({ ...msg, result: { success: true } });
118
+ break;
107
119
  case 'frontend_attributechanged':
108
120
  this.wssSendAttributeChangedMessage(msg.params.plugin, msg.params.serialNumber, msg.params.uniqueId, msg.params.number, msg.params.id, msg.params.cluster, msg.params.attribute, msg.params.value);
109
121
  this.server.respond({ ...msg, result: { success: true } });
@@ -935,6 +947,7 @@ export class Frontend extends EventEmitter {
935
947
  bridgeMode: this.matterbridge.bridgeMode,
936
948
  restartMode: this.matterbridge.restartMode,
937
949
  virtualMode: this.matterbridge.virtualMode,
950
+ bridgeStatus: this.matterbridge.bridgeStatus,
938
951
  profile: this.matterbridge.profile,
939
952
  loggerLevel: this.matterbridge.logLevel,
940
953
  fileLogger: this.matterbridge.fileLogger,
@@ -2120,16 +2133,28 @@ export class Frontend extends EventEmitter {
2120
2133
  wssSendUpdateRequired(version, devVersion = false) {
2121
2134
  if (!this.listening || this.webSocketServer?.clients.size === 0)
2122
2135
  return;
2123
- this.log.debug('Sending an update required message to all connected clients');
2136
+ this.log.debug('Sending a matterbridge version update required message to all connected clients');
2124
2137
  this.updateRequired = true;
2125
2138
  this.wssBroadcastMessage({ id: 0, src: 'Matterbridge', dst: 'Frontend', method: 'update_required', success: true, response: { version, devVersion } });
2126
2139
  }
2127
2140
  wssSendPluginUpdateRequired(plugin, version, devVersion = false) {
2128
2141
  if (!this.listening || this.webSocketServer?.clients.size === 0)
2129
2142
  return;
2130
- this.log.debug('Sending a plugin update required message to all connected clients');
2143
+ this.log.debug('Sending a plugin version update required message to all connected clients');
2131
2144
  this.wssBroadcastMessage({ id: 0, src: 'Matterbridge', dst: 'Frontend', method: 'plugin_update_required', success: true, response: { plugin, version, devVersion } });
2132
2145
  }
2146
+ wssSendPluginStatusUpdate(plugin, status) {
2147
+ if (!this.listening || this.webSocketServer?.clients.size === 0)
2148
+ return;
2149
+ this.log.debug('Sending a plugin status update message to all connected clients');
2150
+ this.wssBroadcastMessage({ id: 0, src: 'Matterbridge', dst: 'Frontend', method: 'plugin_status_update', success: true, response: { plugin, status } });
2151
+ }
2152
+ wssSendMatterbridgeStatusUpdate(status) {
2153
+ if (!this.listening || this.webSocketServer?.clients.size === 0)
2154
+ return;
2155
+ this.log.debug('Sending a matterbridge status update message to all connected clients');
2156
+ this.wssBroadcastMessage({ id: 0, src: 'Matterbridge', dst: 'Frontend', method: 'matterbridge_status_update', success: true, response: { status } });
2157
+ }
2133
2158
  wssSendCpuUpdate(cpuUsage, processCpuUsage) {
2134
2159
  if (!this.listening || this.webSocketServer?.clients.size === 0)
2135
2160
  return;
package/dist/helpers.js CHANGED
@@ -61,7 +61,7 @@ export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
61
61
  if (matterbridge.virtualMode !== 'disabled' && matterbridge.bridgeMode === 'bridge' && aggregatorEndpoint) {
62
62
  matterbridge.log.notice(`Creating virtual devices for Matterbridge server node...`);
63
63
  await addVirtualDevice(aggregatorEndpoint, 'Restart Matterbridge', matterbridge.virtualMode, async () => {
64
- if (matterbridge.restartMode === '')
64
+ if (matterbridge.restartMode === 'none')
65
65
  await matterbridge.restartProcess();
66
66
  else
67
67
  await matterbridge.shutdownProcess();
@@ -5,7 +5,7 @@ import { Endpoint, ServerNode } from '@matter/node';
5
5
  import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
6
6
  import { type DeviceCertification } from '@matter/protocol';
7
7
  import { DeviceTypeId, VendorId } from '@matter/types/datatype';
8
- import type { ApiMatter, ApiSettings, MaybePromise, PlatformMatterbridge, SharedMatterbridge, SystemInformation } from '@matterbridge/types';
8
+ import type { ApiMatter, ApiSettings, BridgeMode, BridgeStatus, MaybePromise, PlatformMatterbridge, RestartMode, SharedMatterbridge, SystemInformation, VirtualMode } from '@matterbridge/types';
9
9
  import { AnsiLogger, LogLevel } from 'node-ansi-logger';
10
10
  import { type NodeStorage, NodeStorageManager } from 'node-persist-manager';
11
11
  import { DeviceManager } from './deviceManager.js';
@@ -50,9 +50,10 @@ export declare class Matterbridge extends EventEmitter<MatterbridgeEvents> {
50
50
  dockerVersion: string | undefined;
51
51
  dockerLatestVersion: string | undefined;
52
52
  dockerDevVersion: string | undefined;
53
- bridgeMode: 'bridge' | 'childbridge' | 'controller' | '';
54
- restartMode: 'service' | 'docker' | '';
55
- virtualMode: 'disabled' | 'outlet' | 'light' | 'switch' | 'mounted_switch';
53
+ bridgeMode: BridgeMode;
54
+ restartMode: RestartMode;
55
+ virtualMode: VirtualMode;
56
+ bridgeStatus: BridgeStatus;
56
57
  readonly profile: string | undefined;
57
58
  readonly log: AnsiLogger;
58
59
  logLevel: LogLevel;
@@ -135,6 +136,7 @@ export declare class Matterbridge extends EventEmitter<MatterbridgeEvents> {
135
136
  shutdownProcessAndReset(): Promise<void>;
136
137
  shutdownProcessAndFactoryReset(): Promise<void>;
137
138
  private cleanup;
139
+ private sendPluginStatusUpdate;
138
140
  private startBridge;
139
141
  private startChildbridge;
140
142
  private startController;
@@ -72,9 +72,10 @@ export class Matterbridge extends EventEmitter {
72
72
  dockerVersion;
73
73
  dockerLatestVersion;
74
74
  dockerDevVersion;
75
- bridgeMode = '';
76
- restartMode = '';
75
+ bridgeMode = 'none';
76
+ restartMode = 'none';
77
77
  virtualMode = 'outlet';
78
+ bridgeStatus = 'inactive';
78
79
  profile = getParameter('profile');
79
80
  log = new AnsiLogger({
80
81
  logName: 'Matterbridge',
@@ -230,6 +231,7 @@ export class Matterbridge extends EventEmitter {
230
231
  bridgeMode: this.bridgeMode,
231
232
  restartMode: this.restartMode,
232
233
  virtualMode: this.virtualMode,
234
+ bridgeStatus: this.bridgeStatus,
233
235
  profile: this.profile,
234
236
  readOnly: hasParameter('readonly'),
235
237
  shellyBoard: false,
@@ -344,7 +346,7 @@ export class Matterbridge extends EventEmitter {
344
346
  const packageName = msg.result.packageName.replace(/@.*$/, '');
345
347
  if (packageName === 'matterbridge') {
346
348
  this.log.info('Matterbridge has been updated. Full restart required.');
347
- if (this.restartMode !== '')
349
+ if (this.restartMode !== 'none')
348
350
  await this.cleanup('updating...', false);
349
351
  }
350
352
  }
@@ -732,7 +734,7 @@ export class Matterbridge extends EventEmitter {
732
734
  (hasParameter('bridge') || (!hasParameter('childbridge') && (await this.nodeContext?.get('bridgeMode', '')) === 'bridge') ? 'mode bridge ' : '') +
733
735
  (hasParameter('childbridge') || (!hasParameter('bridge') && (await this.nodeContext?.get('bridgeMode', '')) === 'childbridge') ? 'mode childbridge ' : '') +
734
736
  (hasParameter('controller') ? 'mode controller ' : '') +
735
- (this.restartMode === '' ? '' : 'restart mode ' + this.restartMode + ' ') +
737
+ (this.restartMode === 'none' ? '' : 'restart mode ' + this.restartMode + ' ') +
736
738
  'running on ' + this.systemInformation.osType + ' (v.' + this.systemInformation.osRelease + ') platform ' + this.systemInformation.osPlatform + ' arch ' + this.systemInformation.osArch);
737
739
  const minNodeVersion = 20;
738
740
  const nodeVersion = process.versions.node;
@@ -1206,6 +1208,7 @@ export class Matterbridge extends EventEmitter {
1206
1208
  this.emit('cleanup_started');
1207
1209
  this.hasCleanupStarted = true;
1208
1210
  this.log.info(message);
1211
+ this.server.request({ type: 'frontend_matterbridgestatusupdate', src: 'matterbridge', dst: 'frontend', params: { status: (this.bridgeStatus = 'stopping') } });
1209
1212
  if (this.startMatterInterval) {
1210
1213
  clearInterval(this.startMatterInterval);
1211
1214
  this.startMatterInterval = undefined;
@@ -1354,6 +1357,7 @@ export class Matterbridge extends EventEmitter {
1354
1357
  unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_DIR, device.deviceName.replace(/[ .]/g, ''), 'root.subscriptions.subscriptions'), this.log);
1355
1358
  }
1356
1359
  }
1360
+ this.server.request({ type: 'frontend_matterbridgestatusupdate', src: 'matterbridge', dst: 'frontend', params: { status: (this.bridgeStatus = 'stopped') } });
1357
1361
  await this.frontend.stop();
1358
1362
  this.frontend.destroy();
1359
1363
  this.plugins.destroy();
@@ -1442,16 +1446,36 @@ export class Matterbridge extends EventEmitter {
1442
1446
  this.log.debug('Cleanup already started...');
1443
1447
  }
1444
1448
  }
1449
+ sendPluginStatusUpdate(plugin) {
1450
+ this.server.request({
1451
+ type: 'frontend_pluginstatusupdate',
1452
+ src: 'matterbridge',
1453
+ dst: 'frontend',
1454
+ params: {
1455
+ plugin: plugin.name,
1456
+ status: {
1457
+ locked: plugin.locked,
1458
+ error: plugin.error,
1459
+ enabled: plugin.enabled,
1460
+ loaded: plugin.loaded,
1461
+ started: plugin.started,
1462
+ configured: plugin.configured,
1463
+ registeredDevices: plugin.registeredDevices,
1464
+ },
1465
+ },
1466
+ });
1467
+ }
1445
1468
  async startBridge() {
1446
1469
  if (!this.matterStorageManager)
1447
1470
  throw new Error('No storage manager initialized');
1448
1471
  if (!this.matterbridgeContext)
1449
1472
  throw new Error('No storage context initialized');
1473
+ this.server.request({ type: 'frontend_matterbridgestatusupdate', src: 'matterbridge', dst: 'frontend', params: { status: (this.bridgeStatus = 'starting') } });
1450
1474
  this.serverNode = await this.createServerNode(this.matterbridgeContext, this.port ? this.port++ : undefined, this.passcode ? this.passcode++ : undefined, this.discriminator ? this.discriminator++ : undefined);
1451
1475
  this.aggregatorNode = await this.createAggregatorNode(this.matterbridgeContext);
1452
1476
  await this.serverNode.add(this.aggregatorNode);
1453
1477
  await addVirtualDevices(this, this.aggregatorNode);
1454
- await this.startPlugins();
1478
+ await this.startPlugins(false, true);
1455
1479
  this.log.debug('Starting start matter interval in bridge mode...');
1456
1480
  this.frontend.wssSendSnackbarMessage(`The bridge is starting...`, 0, 'info');
1457
1481
  let failCount = 0;
@@ -1459,7 +1483,6 @@ export class Matterbridge extends EventEmitter {
1459
1483
  void (async () => {
1460
1484
  if (failCount && failCount % 10 === 0) {
1461
1485
  this.frontend.wssSendSnackbarMessage(`The bridge is still starting...`, 10, 'info');
1462
- this.frontend.wssSendRefreshRequired('plugins');
1463
1486
  }
1464
1487
  for (const plugin of this.plugins) {
1465
1488
  if (!plugin.enabled)
@@ -1475,8 +1498,10 @@ export class Matterbridge extends EventEmitter {
1475
1498
  this.frontend.wssSendSnackbarMessage(`The bridge is offline. Startup halted due to plugin errors.`, 0, 'error');
1476
1499
  this.frontend.wssSendRefreshRequired('plugins');
1477
1500
  this.frontend.wssSendCloseSnackbarMessage(`The bridge is starting...`);
1501
+ this.server.request({ type: 'frontend_matterbridgestatusupdate', src: 'matterbridge', dst: 'frontend', params: { status: (this.bridgeStatus = 'error') } });
1478
1502
  return;
1479
1503
  }
1504
+ this.sendPluginStatusUpdate(plugin);
1480
1505
  if (!plugin.loaded || !plugin.started) {
1481
1506
  this.log.debug(`Waiting (failSafeCount=${failCount}/${this.failCountLimit}) in startMatterInterval interval for plugin ${plg}${plugin.name}${db} loaded: ${plugin.loaded} started: ${plugin.started}...`);
1482
1507
  failCount++;
@@ -1512,20 +1537,20 @@ export class Matterbridge extends EventEmitter {
1512
1537
  plugin.error = true;
1513
1538
  this.log.error(`Error configuring plugin ${plg}${plugin.name}${er}`, error);
1514
1539
  }
1540
+ this.sendPluginStatusUpdate(plugin);
1515
1541
  }
1516
- this.frontend.wssSendRefreshRequired('plugins');
1517
1542
  })();
1518
1543
  }, 30 * 1000).unref();
1519
1544
  this.reachabilityTimeout = setTimeout(() => {
1520
1545
  this.log.info(`Setting reachability to true for ${plg}Matterbridge${db}`);
1521
1546
  if (this.aggregatorNode)
1522
- fireAndForget(this.setAggregatorReachability(this.aggregatorNode, true), this.log, `Set aggregator node reachability for Matterbridge`);
1547
+ fireAndForget(this.setAggregatorReachability(this.aggregatorNode, true), this.log, `Failed to set aggregator node reachability for Matterbridge`);
1523
1548
  }, 60 * 1000).unref();
1524
1549
  this.emit('bridge_started');
1525
1550
  this.log.notice('Matterbridge bridge started successfully');
1526
- this.frontend.wssSendRefreshRequired('settings');
1527
- this.frontend.wssSendRefreshRequired('plugins');
1528
- this.frontend.wssSendCloseSnackbarMessage(`The bridge is starting...`);
1551
+ this.server.request({ type: 'frontend_matterbridgestatusupdate', src: 'matterbridge', dst: 'frontend', params: { status: (this.bridgeStatus = 'started') } });
1552
+ this.server.request({ type: 'frontend_refreshrequired', src: 'matterbridge', dst: 'frontend', params: { changed: 'plugins' } });
1553
+ this.server.request({ type: 'frontend_closesnackbarmessage', src: 'matterbridge', dst: 'frontend', params: { message: `The bridge is starting...` } });
1529
1554
  })();
1530
1555
  }, Number(process.env['MATTERBRIDGE_START_MATTER_INTERVAL_MS']) || this.startMatterIntervalMs);
1531
1556
  }
@@ -1533,6 +1558,7 @@ export class Matterbridge extends EventEmitter {
1533
1558
  if (!this.matterStorageManager)
1534
1559
  throw new Error('No storage manager initialized');
1535
1560
  const { wait } = await import('@matterbridge/utils/wait');
1561
+ this.server.request({ type: 'frontend_matterbridgestatusupdate', src: 'matterbridge', dst: 'frontend', params: { status: (this.bridgeStatus = 'starting') } });
1536
1562
  this.log.debug('Loading all plugins in childbridge mode...');
1537
1563
  await this.startPlugins(true, false);
1538
1564
  this.log.debug('Creating server nodes for DynamicPlatform plugins and starting all plugins in childbridge mode...');
@@ -1548,7 +1574,6 @@ export class Matterbridge extends EventEmitter {
1548
1574
  void (async () => {
1549
1575
  if (failCount && failCount % 10 === 0) {
1550
1576
  this.frontend.wssSendSnackbarMessage(`The bridge is still starting...`, 10, 'info');
1551
- this.frontend.wssSendRefreshRequired('plugins');
1552
1577
  }
1553
1578
  let allStarted = true;
1554
1579
  for (const plugin of this.plugins.array()) {
@@ -1565,8 +1590,10 @@ export class Matterbridge extends EventEmitter {
1565
1590
  this.frontend.wssSendSnackbarMessage(`The bridge is offline. Startup halted due to plugin errors.`, 0, 'error');
1566
1591
  this.frontend.wssSendRefreshRequired('plugins');
1567
1592
  this.frontend.wssSendCloseSnackbarMessage(`The bridge is starting...`);
1593
+ this.server.request({ type: 'frontend_matterbridgestatusupdate', src: 'matterbridge', dst: 'frontend', params: { status: (this.bridgeStatus = 'error') } });
1568
1594
  return;
1569
1595
  }
1596
+ this.sendPluginStatusUpdate(plugin);
1570
1597
  this.log.debug(`Checking plugin ${plg}${plugin.name}${db} to start matter in childbridge mode...`);
1571
1598
  if (!plugin.loaded || !plugin.started) {
1572
1599
  allStarted = false;
@@ -1600,8 +1627,8 @@ export class Matterbridge extends EventEmitter {
1600
1627
  plugin.error = true;
1601
1628
  this.log.error(`Error configuring plugin ${plg}${plugin.name}${er}`, error);
1602
1629
  }
1630
+ this.sendPluginStatusUpdate(plugin);
1603
1631
  }
1604
- this.frontend.wssSendRefreshRequired('plugins');
1605
1632
  })();
1606
1633
  }, 30 * 1000).unref();
1607
1634
  for (const plugin of this.plugins.array()) {
@@ -1638,9 +1665,9 @@ export class Matterbridge extends EventEmitter {
1638
1665
  }
1639
1666
  this.emit('childbridge_started');
1640
1667
  this.log.notice('Matterbridge childbridge started successfully');
1641
- this.frontend.wssSendRefreshRequired('settings');
1642
- this.frontend.wssSendRefreshRequired('plugins');
1643
- this.frontend.wssSendCloseSnackbarMessage(`The bridge is starting...`);
1668
+ this.server.request({ type: 'frontend_matterbridgestatusupdate', src: 'matterbridge', dst: 'frontend', params: { status: (this.bridgeStatus = 'started') } });
1669
+ this.server.request({ type: 'frontend_refreshrequired', src: 'matterbridge', dst: 'frontend', params: { changed: 'plugins' } });
1670
+ this.server.request({ type: 'frontend_closesnackbarmessage', src: 'matterbridge', dst: 'frontend', params: { message: `The bridge is starting...` } });
1644
1671
  })();
1645
1672
  }, Number(process.env['MATTERBRIDGE_START_MATTER_INTERVAL_MS']) || this.startMatterIntervalMs);
1646
1673
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.9.2-dev-20260620-2b9580a",
3
+ "version": "3.9.2-dev-20260621-75283ba",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -130,10 +130,10 @@
130
130
  ],
131
131
  "dependencies": {
132
132
  "@matter/main": "0.17.3",
133
- "@matterbridge/dgram": "3.9.2-dev-20260620-2b9580a",
134
- "@matterbridge/thread": "3.9.2-dev-20260620-2b9580a",
135
- "@matterbridge/types": "3.9.2-dev-20260620-2b9580a",
136
- "@matterbridge/utils": "3.9.2-dev-20260620-2b9580a",
133
+ "@matterbridge/dgram": "3.9.2-dev-20260621-75283ba",
134
+ "@matterbridge/thread": "3.9.2-dev-20260621-75283ba",
135
+ "@matterbridge/types": "3.9.2-dev-20260621-75283ba",
136
+ "@matterbridge/utils": "3.9.2-dev-20260621-75283ba",
137
137
  "escape-html": "1.0.3",
138
138
  "express": "5.2.1",
139
139
  "express-rate-limit": "8.5.2",