@matterbridge/core 3.10.13-dev-20261007-320f739 → 3.10.13-dev-20261009-7fc645a

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.
@@ -170,6 +170,13 @@ export class Matterbridge extends EventEmitter {
170
170
  this.server.close();
171
171
  }
172
172
  getPlatformMatterbridge() {
173
+ this.systemInformation.totalMemory = formatBytes(os.totalmem());
174
+ this.systemInformation.freeMemory = formatBytes(os.freemem());
175
+ this.systemInformation.systemUptime = formatUptime(os.uptime());
176
+ this.systemInformation.processUptime = formatUptime(Math.floor(process.uptime()));
177
+ this.systemInformation.rss = formatBytes(memoryFootprint());
178
+ this.systemInformation.heapTotal = formatBytes(process.memoryUsage().heapTotal);
179
+ this.systemInformation.heapUsed = formatBytes(process.memoryUsage().heapUsed);
173
180
  return {
174
181
  systemInformation: { ...this.systemInformation },
175
182
  uuid: this.uuid,
@@ -193,6 +200,13 @@ export class Matterbridge extends EventEmitter {
193
200
  };
194
201
  }
195
202
  getSharedMatterbridge() {
203
+ this.systemInformation.totalMemory = formatBytes(os.totalmem());
204
+ this.systemInformation.freeMemory = formatBytes(os.freemem());
205
+ this.systemInformation.systemUptime = formatUptime(os.uptime());
206
+ this.systemInformation.processUptime = formatUptime(Math.floor(process.uptime()));
207
+ this.systemInformation.rss = formatBytes(memoryFootprint());
208
+ this.systemInformation.heapTotal = formatBytes(process.memoryUsage().heapTotal);
209
+ this.systemInformation.heapUsed = formatBytes(process.memoryUsage().heapUsed);
196
210
  return {
197
211
  systemInformation: { ...this.systemInformation },
198
212
  uuid: this.uuid,
@@ -318,6 +332,15 @@ export class Matterbridge extends EventEmitter {
318
332
  await this.nodeContext?.set('globalModulesDirectory', msg.params.prefix);
319
333
  this.server.respond({ ...msg, result: { success: true } });
320
334
  break;
335
+ case 'matterbridge_matterdata':
336
+ this.server.respond({ ...msg, result: { port: this.port, passcode: this.passcode, discriminator: this.discriminator } });
337
+ if (this.port !== undefined)
338
+ this.port++;
339
+ if (this.passcode !== undefined)
340
+ this.passcode++;
341
+ if (this.discriminator !== undefined)
342
+ this.discriminator++;
343
+ break;
321
344
  case 'matterbridge_platform':
322
345
  this.server.respond({ ...msg, result: { data: this.getPlatformMatterbridge(), success: true } });
323
346
  break;
@@ -750,6 +773,8 @@ export class Matterbridge extends EventEmitter {
750
773
  }
751
774
  else {
752
775
  this.globalModulesDirectory = await this.nodeContext.get('globalModulesDirectory', '');
776
+ if (this.globalModulesDirectory.includes('.bun'))
777
+ this.globalModulesDirectory = '';
753
778
  }
754
779
  if (this.globalModulesDirectory === '') {
755
780
  this.log.debug(`Getting global node_modules directory...`);
@@ -924,7 +949,7 @@ export class Matterbridge extends EventEmitter {
924
949
  this.shutdown = true;
925
950
  return;
926
951
  }
927
- if (getIntParameter('frontend') !== 0 || getIntParameter('frontend') === undefined)
952
+ if ((getIntParameter('frontend') !== 0 || getIntParameter('frontend') === undefined) && !hasParameter('experimental-backend'))
928
953
  await this.frontend.start(getIntParameter('frontend'));
929
954
  try {
930
955
  await this.startMatterStorage();
@@ -1017,15 +1042,45 @@ export class Matterbridge extends EventEmitter {
1017
1042
  this.log.warn('Fixed delay switch found. Waiting for ' + delay + ' seconds before starting matterbridge...');
1018
1043
  await wait(delay * 1000, 'Fixed race condition delay', true);
1019
1044
  }
1045
+ if (hasParameter('experimental-tracker')) {
1046
+ this.log.notice('***Experimental tracker enabled for Threads');
1047
+ for (let i = 0; i < 10; i++) {
1048
+ this.server.request({ type: 'manager_run', src: 'matterbridge', dst: 'manager', params: { name: 'Tracker' } });
1049
+ }
1050
+ }
1020
1051
  if (hasParameter('bridge') || (!hasParameter('childbridge') && (await this.nodeContext?.get('bridgeMode', '')) === 'bridge')) {
1021
1052
  this.bridgeMode = 'bridge';
1022
1053
  this.log.debug(`Starting matterbridge in mode ${this.bridgeMode}`);
1054
+ if (hasParameter('experimental-node')) {
1055
+ this.log.notice(`***Starting experimental MatterNode in ${this.bridgeMode} mode...`);
1056
+ this.server.request({
1057
+ type: 'manager_run',
1058
+ src: 'matterbridge',
1059
+ dst: 'manager',
1060
+ params: { name: 'RootNode', workerData: { threadName: 'RootNode', sharedMatterbridge: this.getSharedMatterbridge() } },
1061
+ });
1062
+ this.log.notice(`***Started experimental MatterNode in ${this.bridgeMode} mode`);
1063
+ return;
1064
+ }
1023
1065
  await this.startBridge();
1024
1066
  return;
1025
1067
  }
1026
1068
  if (hasParameter('childbridge') || (!hasParameter('bridge') && (await this.nodeContext?.get('bridgeMode', '')) === 'childbridge')) {
1027
1069
  this.bridgeMode = 'childbridge';
1028
1070
  this.log.debug(`Starting matterbridge in mode ${this.bridgeMode}`);
1071
+ if (hasParameter('experimental-node')) {
1072
+ this.log.notice(`***Starting experimental MatterNode in ${this.bridgeMode} mode...`);
1073
+ for (const plugin of this.plugins.array().filter((p) => p.enabled)) {
1074
+ this.server.request({
1075
+ type: 'manager_run',
1076
+ src: 'matterbridge',
1077
+ dst: 'manager',
1078
+ params: { name: 'RootNode', workerData: { threadName: 'RootNode', sharedMatterbridge: this.getSharedMatterbridge(), pluginName: plugin.name } },
1079
+ });
1080
+ }
1081
+ this.log.notice(`***Started experimental MatterNode in ${this.bridgeMode} mode`);
1082
+ return;
1083
+ }
1029
1084
  await this.startChildbridge();
1030
1085
  return;
1031
1086
  }
@@ -1478,6 +1533,8 @@ export class Matterbridge extends EventEmitter {
1478
1533
  this.frontend.destroy();
1479
1534
  this.plugins.destroy();
1480
1535
  this.devices.destroy();
1536
+ this.server.request({ type: 'manager_shutdown', src: 'matterbridge', dst: 'manager', params: {} });
1537
+ await wait(100);
1481
1538
  this.server.close();
1482
1539
  if (this.nodeStorage && this.nodeContext) {
1483
1540
  this.log.debug(`Closing node storage context for ${plg}Matterbridge${db}...`);
@@ -0,0 +1,3 @@
1
+ import { ThreadsWrapper } from '@matterbridge/thread/wrapper';
2
+ declare const _default: ThreadsWrapper;
3
+ export default _default;
@@ -0,0 +1,24 @@
1
+ import { ThreadsWrapper } from '@matterbridge/thread/wrapper';
2
+ import { inspectError } from '@matterbridge/utils/error';
3
+ import { logModuleLoaded } from '@matterbridge/utils/loader';
4
+ logModuleLoaded('Backend', '\u001B[35m');
5
+ export default new ThreadsWrapper('Backend', async (worker) => {
6
+ worker.logger("info", 'Creating backend...');
7
+ try {
8
+ worker.logger("debug", 'Fetching shared Matterbridge state...');
9
+ const shared = (await worker.server.fetch({ type: 'matterbridge_shared', src: 'matterbridge', dst: 'matterbridge' }, 1000)).result.data;
10
+ worker.logger("debug", 'Shared Matterbridge state fetched; importing Backend...');
11
+ const { Backend } = await import('../backend.js');
12
+ worker.logger("debug", 'Backend imported; creating instance...');
13
+ const backend = new Backend(shared);
14
+ worker.logger("debug", 'Starting Backend...');
15
+ await backend.start();
16
+ worker.logger("debug", 'Backend started');
17
+ return true;
18
+ }
19
+ catch (error) {
20
+ const errorMessage = inspectError(worker.log, 'Failed to create backend', error);
21
+ worker.logger("error", errorMessage);
22
+ return false;
23
+ }
24
+ });
@@ -0,0 +1,3 @@
1
+ import { ThreadsWrapper } from '@matterbridge/thread/wrapper';
2
+ declare const _default: ThreadsWrapper;
3
+ export default _default;
@@ -0,0 +1,30 @@
1
+ import { ThreadsWrapper } from '@matterbridge/thread/wrapper';
2
+ import { isRootNodeWorkerData } from '@matterbridge/types';
3
+ import { inspectError } from '@matterbridge/utils/error';
4
+ import { logModuleLoaded } from '@matterbridge/utils/loader';
5
+ logModuleLoaded('RootNode', '\u001B[35m');
6
+ export default new ThreadsWrapper('RootNode', async (worker) => {
7
+ worker.logger("info", 'Creating root node...');
8
+ try {
9
+ if (!isRootNodeWorkerData(worker.workerData)) {
10
+ worker.logger("error", 'Invalid root node worker data');
11
+ return false;
12
+ }
13
+ const { sharedMatterbridge, pluginName } = worker.workerData;
14
+ const target = pluginName ? `plugin ${pluginName}` : 'bridge';
15
+ worker.logger("debug", `Importing MatterNode for ${target}...`);
16
+ const { MatterNode } = await import('../matterNode.js');
17
+ worker.logger("debug", 'MatterNode imported; creating instance...');
18
+ const matterNode = new MatterNode(sharedMatterbridge, pluginName);
19
+ await matterNode.create();
20
+ worker.logger("debug", 'Starting MatterNode...');
21
+ await matterNode.start();
22
+ worker.logger("debug", `Root node for ${target} started`);
23
+ return true;
24
+ }
25
+ catch (error) {
26
+ const errorMessage = inspectError(worker.log, 'Failed to create root node', error);
27
+ worker.logger("error", errorMessage);
28
+ return false;
29
+ }
30
+ });
@@ -0,0 +1,3 @@
1
+ import { ThreadsWrapper } from '@matterbridge/thread/wrapper';
2
+ declare const _default: ThreadsWrapper;
3
+ export default _default;
@@ -0,0 +1,26 @@
1
+ import { ThreadsWrapper } from '@matterbridge/thread/wrapper';
2
+ import { inspectError } from '@matterbridge/utils/error';
3
+ import { logModuleLoaded } from '@matterbridge/utils/loader';
4
+ import { Tracker } from '@matterbridge/utils/tracker';
5
+ logModuleLoaded('Tracker', '\u001B[35m');
6
+ export default new ThreadsWrapper('Tracker', async (worker) => {
7
+ worker.logger("info", 'Creating tracker...');
8
+ try {
9
+ const tracker = new Tracker('Tracker', true, false, true);
10
+ worker.on('startup', () => {
11
+ worker.logger("notice", 'Tracker received startup');
12
+ tracker.start();
13
+ });
14
+ worker.on('shutdown', () => {
15
+ worker.logger("notice", 'Tracker received shutdown');
16
+ tracker.stop();
17
+ });
18
+ worker.logger("debug", 'Tracker created');
19
+ return true;
20
+ }
21
+ catch (error) {
22
+ const errorMessage = inspectError(worker.log, 'Failed to create tracker', error);
23
+ worker.logger("error", errorMessage);
24
+ return false;
25
+ }
26
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/core",
3
- "version": "3.10.13-dev-20261007-320f739",
3
+ "version": "3.10.13-dev-20261009-7fc645a",
4
4
  "description": "Matterbridge core library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -136,10 +136,10 @@
136
136
  },
137
137
  "dependencies": {
138
138
  "@matter/main": "0.17.9",
139
- "@matterbridge/dgram": "3.10.13-dev-20261007-320f739",
140
- "@matterbridge/thread": "3.10.13-dev-20261007-320f739",
141
- "@matterbridge/types": "3.10.13-dev-20261007-320f739",
142
- "@matterbridge/utils": "3.10.13-dev-20261007-320f739",
139
+ "@matterbridge/dgram": "3.10.13-dev-20261009-7fc645a",
140
+ "@matterbridge/thread": "3.10.13-dev-20261009-7fc645a",
141
+ "@matterbridge/types": "3.10.13-dev-20261009-7fc645a",
142
+ "@matterbridge/utils": "3.10.13-dev-20261009-7fc645a",
143
143
  "escape-html": "1.0.3",
144
144
  "express": "5.2.1",
145
145
  "express-rate-limit": "8.7.0",