matterbridge 2.1.0-dev.10 → 2.1.0-dev.11

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
@@ -21,7 +21,7 @@ For this reason there is no compatibility for old versions of the plugins.
21
21
  You need to update all plugins you use and Matterbridge in the same moment.
22
22
  I suggest to first update all plugins without restarting and then to update Matterbridge so when it restarts, all versions will be the latest.
23
23
 
24
- ## [2.1.0.dev.10] - 2025-01-31
24
+ ## [2.1.0.dev.11] - 2025-02-01
25
25
 
26
26
  ### Added
27
27
 
@@ -29,6 +29,8 @@ I suggest to first update all plugins without restarting and then to update Matt
29
29
  - [matterbridge]: Add MatterbridgeSwitchServer.
30
30
  - [frontend]: Add api/advertise to turn on matter advertising in bridge mode.
31
31
  - [frontend]: Frontend v.2.4.0.
32
+ - [matterbridge]: Added deep memory scan details.
33
+
32
34
 
33
35
  ### Changed
34
36
 
package/dist/frontend.js CHANGED
@@ -7,7 +7,7 @@ import os from 'os';
7
7
  import path from 'path';
8
8
  import { promises as fs } from 'fs';
9
9
  import { AnsiLogger, CYAN, db, debugStringify, er, nf, rs, stringify, UNDERLINE, UNDERLINEOFF, wr, YELLOW } from './logger/export.js';
10
- import { createZip, hasParameter, isValidNumber, isValidObject, isValidString } from './utils/utils.js';
10
+ import { createZip, getIntParameter, hasParameter, isValidNumber, isValidObject, isValidString } from './utils/utils.js';
11
11
  import { plg } from './matterbridgeTypes.js';
12
12
  import { MatterbridgeEndpoint } from './matterbridgeEndpoint.js';
13
13
  export const WS_ID_LOG = 0;
@@ -22,10 +22,16 @@ export class Frontend {
22
22
  httpServer;
23
23
  httpsServer;
24
24
  webSocketServer;
25
+ memoryData = [];
26
+ memoryInterval;
27
+ memoryTimeout;
25
28
  constructor(matterbridge) {
26
29
  this.matterbridge = matterbridge;
27
30
  this.log = new AnsiLogger({ logName: 'Frontend', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
28
31
  }
32
+ set logLevel(logLevel) {
33
+ this.log.logLevel = logLevel;
34
+ }
29
35
  async start(port = 8283) {
30
36
  this.port = port;
31
37
  this.log.debug(`Initializing the frontend ${hasParameter('ssl') ? 'https' : 'http'} server on port ${YELLOW}${this.port}${db}`);
@@ -155,6 +161,9 @@ export class Frontend {
155
161
  this.webSocketServer.on('error', (ws, error) => {
156
162
  this.log.error(`WebSocketServer error: ${error}`);
157
163
  });
164
+ if (hasParameter('memorydump')) {
165
+ this.startMemoryDump();
166
+ }
158
167
  this.expressApp.post('/api/login', express.json(), async (req, res) => {
159
168
  const { password } = req.body;
160
169
  this.log.debug('The frontend sent /api/login', password);
@@ -190,29 +199,24 @@ export class Frontend {
190
199
  });
191
200
  this.expressApp.get('/memory', async (req, res) => {
192
201
  this.log.debug('Express received /memory');
193
- const formatMemoryUsage = (bytes) => {
194
- const kb = bytes / 1024;
195
- const mb = kb / 1024;
196
- return mb >= 1 ? `${mb.toFixed(2)} MB` : `${kb.toFixed(2)} KB`;
197
- };
198
202
  const memoryUsageRaw = process.memoryUsage();
199
203
  const memoryUsage = {
200
- rss: formatMemoryUsage(memoryUsageRaw.rss),
201
- heapTotal: formatMemoryUsage(memoryUsageRaw.heapTotal),
202
- heapUsed: formatMemoryUsage(memoryUsageRaw.heapUsed),
203
- external: formatMemoryUsage(memoryUsageRaw.external),
204
- arrayBuffers: formatMemoryUsage(memoryUsageRaw.arrayBuffers),
204
+ rss: this.formatMemoryUsage(memoryUsageRaw.rss),
205
+ heapTotal: this.formatMemoryUsage(memoryUsageRaw.heapTotal),
206
+ heapUsed: this.formatMemoryUsage(memoryUsageRaw.heapUsed),
207
+ external: this.formatMemoryUsage(memoryUsageRaw.external),
208
+ arrayBuffers: this.formatMemoryUsage(memoryUsageRaw.arrayBuffers),
205
209
  };
206
210
  const { default: v8 } = await import('node:v8');
207
211
  const heapStatsRaw = v8.getHeapStatistics();
208
212
  const heapSpacesRaw = v8.getHeapSpaceStatistics();
209
- const heapStats = Object.fromEntries(Object.entries(heapStatsRaw).map(([key, value]) => [key, formatMemoryUsage(value)]));
213
+ const heapStats = Object.fromEntries(Object.entries(heapStatsRaw).map(([key, value]) => [key, this.formatMemoryUsage(value)]));
210
214
  const heapSpaces = heapSpacesRaw.map((space) => ({
211
215
  ...space,
212
- space_size: formatMemoryUsage(space.space_size),
213
- space_used_size: formatMemoryUsage(space.space_used_size),
214
- space_available_size: formatMemoryUsage(space.space_available_size),
215
- physical_space_size: formatMemoryUsage(space.physical_space_size),
216
+ space_size: this.formatMemoryUsage(space.space_size),
217
+ space_used_size: this.formatMemoryUsage(space.space_used_size),
218
+ space_available_size: this.formatMemoryUsage(space.space_available_size),
219
+ physical_space_size: this.formatMemoryUsage(space.physical_space_size),
216
220
  }));
217
221
  const { default: module } = await import('module');
218
222
  const loadedModules = module._cache ? Object.keys(module._cache).sort() : [];
@@ -478,7 +482,9 @@ export class Frontend {
478
482
  this.log.logLevel = "fatal";
479
483
  }
480
484
  await this.matterbridge.nodeContext?.set('matterbridgeLogLevel', this.log.logLevel);
485
+ this.matterbridge.log.logLevel = this.log.logLevel;
481
486
  MatterbridgeEndpoint.logLevel = this.log.logLevel;
487
+ this.matterbridge.devices.logLevel = this.log.logLevel;
482
488
  this.matterbridge.plugins.logLevel = this.log.logLevel;
483
489
  for (const plugin of this.matterbridge.plugins) {
484
490
  if (!plugin.platform || !plugin.platform.config)
@@ -779,11 +785,58 @@ export class Frontend {
779
785
  });
780
786
  this.webSocketServer = undefined;
781
787
  }
788
+ if (hasParameter('memorydump')) {
789
+ this.stopMemoryDump();
790
+ }
791
+ }
792
+ formatMemoryUsage = (bytes) => {
793
+ const kb = bytes / 1024;
794
+ const mb = kb / 1024;
795
+ return mb >= 1 ? `${mb.toFixed(2)} MB` : `${kb.toFixed(2)} KB`;
796
+ };
797
+ startMemoryDump() {
798
+ clearInterval(this.memoryInterval);
799
+ clearTimeout(this.memoryTimeout);
800
+ const interval = () => {
801
+ const memoryUsageRaw = process.memoryUsage();
802
+ this.memoryData.push(memoryUsageRaw);
803
+ const memoryUsage = {
804
+ rss: this.formatMemoryUsage(memoryUsageRaw.rss),
805
+ heapTotal: this.formatMemoryUsage(memoryUsageRaw.heapTotal),
806
+ heapUsed: this.formatMemoryUsage(memoryUsageRaw.heapUsed),
807
+ external: this.formatMemoryUsage(memoryUsageRaw.external),
808
+ arrayBuffers: this.formatMemoryUsage(memoryUsageRaw.arrayBuffers),
809
+ };
810
+ this.log.debug(`***Memory usage rss ${CYAN}${memoryUsage.rss}${db} heapTotal ${CYAN}${memoryUsage.heapTotal}${db} heapUsed ${CYAN}${memoryUsage.heapUsed}${db} external ${memoryUsage.external} arrayBuffers ${memoryUsage.arrayBuffers}`);
811
+ };
812
+ interval();
813
+ this.memoryInterval = setInterval(interval, getIntParameter('memorydump') ?? 1000);
814
+ this.memoryInterval.unref();
815
+ this.memoryTimeout = setTimeout(() => {
816
+ this.stopMemoryDump();
817
+ }, 360000);
818
+ this.memoryTimeout.unref();
819
+ }
820
+ stopMemoryDump() {
821
+ clearInterval(this.memoryInterval);
822
+ this.memoryInterval = undefined;
823
+ clearTimeout(this.memoryTimeout);
824
+ this.memoryTimeout = undefined;
825
+ for (const memory of this.memoryData) {
826
+ const memoryUsage = {
827
+ rss: this.formatMemoryUsage(memory.rss),
828
+ heapTotal: this.formatMemoryUsage(memory.heapTotal),
829
+ heapUsed: this.formatMemoryUsage(memory.heapUsed),
830
+ external: this.formatMemoryUsage(memory.external),
831
+ arrayBuffers: this.formatMemoryUsage(memory.arrayBuffers),
832
+ };
833
+ this.log.debug(`***Memory usage rss ${CYAN}${memoryUsage.rss}${db} heapTotal ${CYAN}${memoryUsage.heapTotal}${db} heapUsed ${CYAN}${memoryUsage.heapUsed}${db} external ${memoryUsage.external} arrayBuffers ${memoryUsage.arrayBuffers}`);
834
+ }
782
835
  }
783
836
  async getApiSettings() {
784
837
  this.matterbridge.matterbridgeInformation.bridgeMode = this.matterbridge.bridgeMode;
785
838
  this.matterbridge.matterbridgeInformation.restartMode = this.matterbridge.restartMode;
786
- this.matterbridge.matterbridgeInformation.loggerLevel = this.log.logLevel;
839
+ this.matterbridge.matterbridgeInformation.loggerLevel = this.matterbridge.log.logLevel;
787
840
  this.matterbridge.matterbridgeInformation.matterLoggerLevel = Logger.defaultLogLevel;
788
841
  this.matterbridge.matterbridgeInformation.mattermdnsinterface = this.matterbridge.mdnsInterface;
789
842
  this.matterbridge.matterbridgeInformation.matteripv4address = this.matterbridge.ipv4address;
@@ -310,7 +310,9 @@ export class Matterbridge extends EventEmitter {
310
310
  }
311
311
  this.plugins = new PluginManager(this);
312
312
  await this.plugins.loadFromStorage();
313
+ this.plugins.logLevel = this.log.logLevel;
313
314
  this.devices = new DeviceManager(this, this.nodeContext);
315
+ this.devices.logLevel = this.log.logLevel;
314
316
  for (const plugin of this.plugins) {
315
317
  const packageJson = await this.plugins.parse(plugin);
316
318
  if (packageJson === null && !hasParameter('add') && !hasParameter('remove') && !hasParameter('enable') && !hasParameter('disable') && !hasParameter('reset') && !hasParameter('factoryreset')) {
@@ -495,6 +497,7 @@ export class Matterbridge extends EventEmitter {
495
497
  }
496
498
  if (getIntParameter('frontend') !== 0 || getIntParameter('frontend') === undefined)
497
499
  await this.frontend.start(getIntParameter('frontend'));
500
+ this.frontend.logLevel = this.log.logLevel;
498
501
  this.checkUpdateInterval = setInterval(() => {
499
502
  this.getMatterbridgeLatestVersion();
500
503
  for (const plugin of this.plugins) {
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "2.1.0-dev.10",
3
+ "version": "2.1.0-dev.11",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "2.1.0-dev.10",
9
+ "version": "2.1.0-dev.11",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
- "@matter/main": "0.12.1",
12
+ "@matter/main": "^0.12.2-alpha.0-20250201-eb5d40a2f",
13
13
  "archiver": "7.0.1",
14
14
  "express": "4.21.2",
15
15
  "glob": "11.0.1",
@@ -47,65 +47,65 @@
47
47
  }
48
48
  },
49
49
  "node_modules/@matter/general": {
50
- "version": "0.12.1",
51
- "resolved": "https://registry.npmjs.org/@matter/general/-/general-0.12.1.tgz",
52
- "integrity": "sha512-26ZnXpcPeKUJ3xGJvJnkM7dMt32IlJ+5ZCoM8KN2FtXC2Z6EUBJMVxjSxXA4Wbg91wZvj/y/z0xkcEI3gcIOAA==",
50
+ "version": "0.12.2-alpha.0-20250201-eb5d40a2f",
51
+ "resolved": "https://registry.npmjs.org/@matter/general/-/general-0.12.2-alpha.0-20250201-eb5d40a2f.tgz",
52
+ "integrity": "sha512-INFvr428z5WGmTBFPSIoEe6rnqLAtybL12QJTV3wuenu0ubXrSBJb+o8+6gJiKx5AR+eJhfl5uZXnboQvGSMWw==",
53
53
  "license": "Apache-2.0",
54
54
  "dependencies": {
55
55
  "@noble/curves": "^1.8.1"
56
56
  }
57
57
  },
58
58
  "node_modules/@matter/main": {
59
- "version": "0.12.1",
60
- "resolved": "https://registry.npmjs.org/@matter/main/-/main-0.12.1.tgz",
61
- "integrity": "sha512-TQscTaFzgtUy9R+tNDm1aIViW4qDiXVdnYZGTVWjWqPN/7wOtEO2IgwP3xk9c3bHNkEXPux6TfvPoAx7UkYUng==",
59
+ "version": "0.12.2-alpha.0-20250201-eb5d40a2f",
60
+ "resolved": "https://registry.npmjs.org/@matter/main/-/main-0.12.2-alpha.0-20250201-eb5d40a2f.tgz",
61
+ "integrity": "sha512-eyGsbFx1TQztD+57plKQrvVBs9BVXAf+hEYysWCOrHUBRsYPlZw487ySRVWpiP94VspA9K17K721AauFh/uCsg==",
62
62
  "license": "Apache-2.0",
63
63
  "dependencies": {
64
- "@matter/general": "0.12.1",
65
- "@matter/model": "0.12.1",
66
- "@matter/node": "0.12.1",
67
- "@matter/protocol": "0.12.1",
68
- "@matter/types": "0.12.1",
64
+ "@matter/general": "0.12.2-alpha.0-20250201-eb5d40a2f",
65
+ "@matter/model": "0.12.2-alpha.0-20250201-eb5d40a2f",
66
+ "@matter/node": "0.12.2-alpha.0-20250201-eb5d40a2f",
67
+ "@matter/protocol": "0.12.2-alpha.0-20250201-eb5d40a2f",
68
+ "@matter/types": "0.12.2-alpha.0-20250201-eb5d40a2f",
69
69
  "@noble/curves": "^1.8.1"
70
70
  },
71
71
  "optionalDependencies": {
72
- "@matter/nodejs": "0.12.1"
72
+ "@matter/nodejs": "0.12.2-alpha.0-20250201-eb5d40a2f"
73
73
  }
74
74
  },
75
75
  "node_modules/@matter/model": {
76
- "version": "0.12.1",
77
- "resolved": "https://registry.npmjs.org/@matter/model/-/model-0.12.1.tgz",
78
- "integrity": "sha512-UlUR7iRuBRadfuf4Qwo3OYi7WUrXJk4nddqsD2tBq7y1cA5zsnV3E85zVX/8iiiUSqAbx3rcAuWJ+CCjn0ikUA==",
76
+ "version": "0.12.2-alpha.0-20250201-eb5d40a2f",
77
+ "resolved": "https://registry.npmjs.org/@matter/model/-/model-0.12.2-alpha.0-20250201-eb5d40a2f.tgz",
78
+ "integrity": "sha512-roatr/TpFZYzWaq7JQyuKp+UhUWxOqkASTSd2CqvEjuM0TFyKp5NX88HDmoqNDl5bX0MLtdgp4XJAMPNzmYWnw==",
79
79
  "license": "Apache-2.0",
80
80
  "dependencies": {
81
- "@matter/general": "0.12.1",
81
+ "@matter/general": "0.12.2-alpha.0-20250201-eb5d40a2f",
82
82
  "@noble/curves": "^1.8.1"
83
83
  }
84
84
  },
85
85
  "node_modules/@matter/node": {
86
- "version": "0.12.1",
87
- "resolved": "https://registry.npmjs.org/@matter/node/-/node-0.12.1.tgz",
88
- "integrity": "sha512-PtN1pRmMynPwwxaSZklCDwLt4uCz1o/moXi0PX2DU866JdkHaKPgLi+29PcalcDB2dMZbrcJTaimAhXcjPVkog==",
86
+ "version": "0.12.2-alpha.0-20250201-eb5d40a2f",
87
+ "resolved": "https://registry.npmjs.org/@matter/node/-/node-0.12.2-alpha.0-20250201-eb5d40a2f.tgz",
88
+ "integrity": "sha512-WvbWeXymvJqYGltmnipXiOE3N/MNRUgHbgHxd6r0joazOCj4qy13ZhFno/nRpWQp2IjDmBJW77u1a9s8c4YrZw==",
89
89
  "license": "Apache-2.0",
90
90
  "dependencies": {
91
- "@matter/general": "0.12.1",
92
- "@matter/model": "0.12.1",
93
- "@matter/protocol": "0.12.1",
94
- "@matter/types": "0.12.1",
91
+ "@matter/general": "0.12.2-alpha.0-20250201-eb5d40a2f",
92
+ "@matter/model": "0.12.2-alpha.0-20250201-eb5d40a2f",
93
+ "@matter/protocol": "0.12.2-alpha.0-20250201-eb5d40a2f",
94
+ "@matter/types": "0.12.2-alpha.0-20250201-eb5d40a2f",
95
95
  "@noble/curves": "^1.8.1"
96
96
  }
97
97
  },
98
98
  "node_modules/@matter/nodejs": {
99
- "version": "0.12.1",
100
- "resolved": "https://registry.npmjs.org/@matter/nodejs/-/nodejs-0.12.1.tgz",
101
- "integrity": "sha512-G4tPCzaCJMuly0yiIf+eOhz1ezSQQarETFtDuImE+9vicVyKKCL1eq5SviV5nx9DikIcalKMbKh6F6t21sslDA==",
99
+ "version": "0.12.2-alpha.0-20250201-eb5d40a2f",
100
+ "resolved": "https://registry.npmjs.org/@matter/nodejs/-/nodejs-0.12.2-alpha.0-20250201-eb5d40a2f.tgz",
101
+ "integrity": "sha512-vwMNomhvVCFOMc1YJlSYnUAvBngjC4Iw9EJUT4fv7bOLyqk1FsuPGJ/s7Uy/MSz4ko1vTp8kUylztQ1F7ClGLw==",
102
102
  "license": "Apache-2.0",
103
103
  "optional": true,
104
104
  "dependencies": {
105
- "@matter/general": "0.12.1",
106
- "@matter/node": "0.12.1",
107
- "@matter/protocol": "0.12.1",
108
- "@matter/types": "0.12.1",
105
+ "@matter/general": "0.12.2-alpha.0-20250201-eb5d40a2f",
106
+ "@matter/node": "0.12.2-alpha.0-20250201-eb5d40a2f",
107
+ "@matter/protocol": "0.12.2-alpha.0-20250201-eb5d40a2f",
108
+ "@matter/types": "0.12.2-alpha.0-20250201-eb5d40a2f",
109
109
  "node-localstorage": "^3.0.5"
110
110
  },
111
111
  "engines": {
@@ -113,25 +113,25 @@
113
113
  }
114
114
  },
115
115
  "node_modules/@matter/protocol": {
116
- "version": "0.12.1",
117
- "resolved": "https://registry.npmjs.org/@matter/protocol/-/protocol-0.12.1.tgz",
118
- "integrity": "sha512-HOa5OdMsmmSjmtYA+wmBmS2poUeZqlcoA9fUk40kWla6yINJOyHZCgnPKARxXxm1qk95BEoLN3ovUIKoajkstQ==",
116
+ "version": "0.12.2-alpha.0-20250201-eb5d40a2f",
117
+ "resolved": "https://registry.npmjs.org/@matter/protocol/-/protocol-0.12.2-alpha.0-20250201-eb5d40a2f.tgz",
118
+ "integrity": "sha512-Mko5CUNQnOY3yy381Cf6TKeSCTeWzaXt9DRSr2hWmjyT3xNaJYcJlH7N8i4DfXTd4hR1VIM3V3nK3Iqq9DFYWg==",
119
119
  "license": "Apache-2.0",
120
120
  "dependencies": {
121
- "@matter/general": "0.12.1",
122
- "@matter/model": "0.12.1",
123
- "@matter/types": "0.12.1",
121
+ "@matter/general": "0.12.2-alpha.0-20250201-eb5d40a2f",
122
+ "@matter/model": "0.12.2-alpha.0-20250201-eb5d40a2f",
123
+ "@matter/types": "0.12.2-alpha.0-20250201-eb5d40a2f",
124
124
  "@noble/curves": "^1.8.1"
125
125
  }
126
126
  },
127
127
  "node_modules/@matter/types": {
128
- "version": "0.12.1",
129
- "resolved": "https://registry.npmjs.org/@matter/types/-/types-0.12.1.tgz",
130
- "integrity": "sha512-O4zyMGLUnoWQZ7P5TJDWrtTpdaG8xSDq1a5xO3e8pmc3I9w6LSoKciEqrjFvq9lT6gvj3hcts/64c0Rxn7NEIw==",
128
+ "version": "0.12.2-alpha.0-20250201-eb5d40a2f",
129
+ "resolved": "https://registry.npmjs.org/@matter/types/-/types-0.12.2-alpha.0-20250201-eb5d40a2f.tgz",
130
+ "integrity": "sha512-Hs4M77cwNTEz+9sR+PDzJn1ixhXoomXJwOM0Q0P1uram7LdnXOA0x8rSABU3pIpajitAGaezJlpuNmt291/uBw==",
131
131
  "license": "Apache-2.0",
132
132
  "dependencies": {
133
- "@matter/general": "0.12.1",
134
- "@matter/model": "0.12.1",
133
+ "@matter/general": "0.12.2-alpha.0-20250201-eb5d40a2f",
134
+ "@matter/model": "0.12.2-alpha.0-20250201-eb5d40a2f",
135
135
  "@noble/curves": "^1.8.1"
136
136
  }
137
137
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "2.1.0-dev.10",
3
+ "version": "2.1.0-dev.11",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",
@@ -94,7 +94,7 @@
94
94
  }
95
95
  },
96
96
  "dependencies": {
97
- "@matter/main": "0.12.1",
97
+ "@matter/main": "^0.12.2-alpha.0-20250201-eb5d40a2f",
98
98
  "archiver": "7.0.1",
99
99
  "express": "4.21.2",
100
100
  "glob": "11.0.1",