matterbridge 3.3.1-dev-20251007-4e5eaac → 3.3.1-dev-20251009-edb969d

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
@@ -36,7 +36,13 @@ Advantages:
36
36
  - [network]: Added getInterfaceName() function.
37
37
  - [network]: Optimized code.
38
38
  - [matterbridge]: Added SharedMatterbridge readonly type.
39
- - [thread]: Add BroadcastServer to frontend plugins and devices.
39
+ - [thread]: Added BroadcastServer to frontend, plugins and devices.
40
+ - [cli]: Added cpu and memory history to cli.
41
+ - [cli]: Added cpu and memory peaks history to cli.
42
+ - [cli]: Added host cpu and process cpu to cli.
43
+ - [frontend]: Added process cpu to SystemInformation.
44
+ - [frontend]: Added under 'View' menu the item 'Matterbridge diagnostic log'. It shows the complete matter server nodes.
45
+ - [frontend]: Added under 'View' menu the item 'Matterbridge system history'. It shows the graph page of the last 6h of host cpu, process cpu and memory usage (rss, heap used, heap total with peaks).
40
46
 
41
47
  ### Changed
42
48
 
@@ -46,6 +52,12 @@ Advantages:
46
52
  - [frontend]: Refactored InstallProgressDialog.
47
53
  - [spawn]: Refactored spawnCommand for compatibility with InstallProgressDialog.
48
54
  - [matter.js]: Bumped `matter.js` to 0.15.5. Thanks matter.js!
55
+ - [backend]: Optimized imports.
56
+ - [cli]: Bumped `cli` version to 2.1.0.
57
+
58
+ ### Fixed
59
+
60
+ - [frontend]: Fixed matter log on file not setting correctly.
49
61
 
50
62
  <a href="https://www.buymeacoffee.com/luligugithub">
51
63
  <img src="bmc-button.svg" alt="Buy me a coffee" width="80">
@@ -1,3 +1,5 @@
1
+ if (process.argv.includes('--loader') || process.argv.includes('-loader'))
2
+ console.log('\u001B[32mBroadcastServer loaded.\u001B[40;0m');
1
3
  import { EventEmitter } from 'node:events';
2
4
  import { BroadcastChannel } from 'node:worker_threads';
3
5
  import { debugStringify } from 'node-ansi-logger';
package/dist/cli.js CHANGED
@@ -1,17 +1,30 @@
1
+ if (process.argv.includes('--loader') || process.argv.includes('-loader'))
2
+ console.log('\u001B[32mCLI loaded.\u001B[40;0m');
1
3
  import os from 'node:os';
2
4
  import { inspect } from 'node:util';
3
- import { AnsiLogger, BRIGHT, CYAN, db, YELLOW } from 'node-ansi-logger';
4
- import { getIntParameter, hasParameter } from './utils/export.js';
5
+ import { AnsiLogger, BRIGHT, CYAN, db, RED, YELLOW } from 'node-ansi-logger';
6
+ import { cliEmitter, setLastCpuUsage, setLastProcessCpuUsage } from './cliEmitter.js';
7
+ import { history, historyIndex, historySize, setHistoryIndex } from './cliHistory.js';
8
+ import { getIntParameter, hasParameter } from './utils/commandLine.js';
5
9
  import { Matterbridge } from './matterbridge.js';
6
- import { cliEmitter, lastCpuUsage, setLastCpuUsage } from './cliEmitter.js';
7
10
  export let instance;
8
11
  let session;
9
12
  let snapshotInterval;
13
+ const trace = hasParameter('trace');
10
14
  let memoryCheckInterval;
15
+ const memoryCheckIntervalMs = getIntParameter('memoryinterval') ?? 10 * 1000;
16
+ let memoryPeakResetTimeout;
11
17
  let prevCpus;
18
+ let prevProcessCpu;
12
19
  let peakCpu = 0;
20
+ let peakProcessCpu = 0;
13
21
  let peakRss = 0;
22
+ let peakHeapUsed = 0;
23
+ let peakHeapTotal = 0;
14
24
  const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
25
+ const formatCpuUsage = (percent) => {
26
+ return `${percent.toFixed(2).padStart(5, ' ')} %`;
27
+ };
15
28
  const formatMemoryUsage = (bytes) => {
16
29
  if (bytes >= 1024 ** 3) {
17
30
  return `${(bytes / 1024 ** 3).toFixed(2)} GB`;
@@ -41,6 +54,7 @@ const formatOsUpTime = (seconds) => {
41
54
  async function startCpuMemoryCheck() {
42
55
  log.debug(`Cpu memory check started`);
43
56
  prevCpus = os.cpus();
57
+ prevProcessCpu = process.cpuUsage();
44
58
  clearInterval(memoryCheckInterval);
45
59
  const interval = () => {
46
60
  const systemUptime = formatOsUpTime(Math.floor(os.uptime()));
@@ -54,11 +68,23 @@ async function startCpuMemoryCheck() {
54
68
  const heapUsed = formatMemoryUsage(memoryUsageRaw.heapUsed);
55
69
  const external = formatMemoryUsage(memoryUsageRaw.external);
56
70
  const arrayBuffers = formatMemoryUsage(memoryUsageRaw.arrayBuffers);
57
- if (memoryUsageRaw.rss > peakRss)
71
+ if (memoryUsageRaw.rss > peakRss) {
72
+ if (peakRss && trace)
73
+ log.debug(`****${RED}${BRIGHT}Rss peak detected.${db} Peak rss from ${CYAN}${formatMemoryUsage(peakRss)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.rss)}${db}`);
58
74
  peakRss = memoryUsageRaw.rss;
75
+ }
76
+ if (memoryUsageRaw.heapUsed > peakHeapUsed) {
77
+ if (peakHeapUsed && trace)
78
+ log.debug(`****${RED}${BRIGHT}HeapUsed peak detected.${db} Peak heapUsed from ${CYAN}${formatMemoryUsage(peakHeapUsed)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.heapUsed)}${db}`);
79
+ peakHeapUsed = memoryUsageRaw.heapUsed;
80
+ }
81
+ if (memoryUsageRaw.heapTotal > peakHeapTotal) {
82
+ if (peakHeapTotal && trace)
83
+ log.debug(`****${RED}${BRIGHT}HeapTotal peak detected.${db} Peak heapTotal from ${CYAN}${formatMemoryUsage(peakHeapTotal)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.heapTotal)}${db}`);
84
+ peakHeapTotal = memoryUsageRaw.heapTotal;
85
+ }
59
86
  cliEmitter.emit('memory', totalMememory, freeMemory, rss, heapTotal, heapUsed, external, arrayBuffers);
60
87
  const currCpus = os.cpus();
61
- let cpuUsageLog;
62
88
  if (currCpus.length !== prevCpus.length) {
63
89
  prevCpus = currCpus;
64
90
  log.debug(`Cpu check length failed, resetting previous cpus`);
@@ -74,27 +100,64 @@ async function startCpuMemoryCheck() {
74
100
  });
75
101
  const cpuUsage = 100 - (totalIdle / totalTick) * 100;
76
102
  if (totalTick === 0 || isNaN(cpuUsage) || !isFinite(cpuUsage) || cpuUsage <= 0) {
77
- if (lastCpuUsage != 0)
78
- log.debug(`Cpu check failed, using previous cpus`);
79
- cpuUsageLog = lastCpuUsage.toFixed(2);
103
+ log.debug(`Cpu check failed, using previous cpus`);
80
104
  }
81
105
  else {
82
- cpuUsageLog = cpuUsage.toFixed(2);
83
106
  setLastCpuUsage(cpuUsage);
84
- if (lastCpuUsage > peakCpu)
85
- peakCpu = lastCpuUsage;
86
- cliEmitter.emit('cpu', lastCpuUsage);
107
+ if (cpuUsage > peakCpu) {
108
+ peakCpu = cpuUsage;
109
+ if (peakCpu && trace)
110
+ log.debug(`****${RED}${BRIGHT}Cpu peak detected.${db} Peak cpu from ${CYAN}${formatCpuUsage(peakCpu)}${db} to ${CYAN}${formatCpuUsage(cpuUsage)}${db}`);
111
+ }
87
112
  }
88
113
  prevCpus = currCpus;
89
- log.debug(`***${YELLOW}${BRIGHT}Cpu usage:${db} ${CYAN}${cpuUsageLog.padStart(6, ' ')} %${db} ${YELLOW}${BRIGHT}Memory usage:${db} rss ${CYAN}${rss}${db} heapTotal ${CYAN}${heapTotal}${db} heapUsed ${CYAN}${heapUsed}${db} external ${external} arrayBuffers ${arrayBuffers}`);
114
+ const diff = process.cpuUsage(prevProcessCpu);
115
+ const userMs = diff.user / 1000;
116
+ const systemMs = diff.system / 1000;
117
+ const totalMs = userMs + systemMs;
118
+ const processCpuUsage = Number(((totalMs / memoryCheckIntervalMs) * 100).toFixed(2));
119
+ if (processCpuUsage > peakProcessCpu) {
120
+ peakProcessCpu = processCpuUsage;
121
+ if (peakProcessCpu && trace)
122
+ log.debug(`****${RED}${BRIGHT}Process cpu peak detected.${db} Peak process cpu from ${CYAN}${formatCpuUsage(peakProcessCpu)}${db} to ${CYAN}${formatCpuUsage(processCpuUsage)}${db}`);
123
+ }
124
+ prevProcessCpu = process.cpuUsage();
125
+ setLastProcessCpuUsage(processCpuUsage);
126
+ cliEmitter.emit('cpu', cpuUsage, processCpuUsage);
127
+ const entry = history[historyIndex];
128
+ entry.cpu = cpuUsage;
129
+ entry.peakCpu = peakCpu;
130
+ entry.processCpu = processCpuUsage;
131
+ entry.peakProcessCpu = peakProcessCpu;
132
+ entry.rss = memoryUsageRaw.rss;
133
+ entry.peakRss = peakRss;
134
+ entry.heapUsed = memoryUsageRaw.heapUsed;
135
+ entry.peakHeapUsed = peakHeapUsed;
136
+ entry.heapTotal = memoryUsageRaw.heapTotal;
137
+ entry.peakHeapTotal = peakHeapTotal;
138
+ entry.timestamp = Date.now();
139
+ setHistoryIndex((historyIndex + 1) % historySize);
140
+ if (trace)
141
+ log.debug(`***${YELLOW}${BRIGHT}Host cpu:${db} ${CYAN}${formatCpuUsage(cpuUsage)}${db} (peak ${formatCpuUsage(peakCpu)}) ${YELLOW}${BRIGHT}Process cpu:${db} ${CYAN}${formatCpuUsage(processCpuUsage)}${db} (peak ${formatCpuUsage(peakProcessCpu)}) ${YELLOW}${BRIGHT}Process memory:${db} rss ${CYAN}${rss}${db} (peak ${formatMemoryUsage(peakRss)}) heapUsed ${CYAN}${heapUsed}${db} (peak ${formatMemoryUsage(peakHeapUsed)}) heapTotal ${CYAN}${heapTotal}${db} (peak ${formatMemoryUsage(peakHeapTotal)}) external ${external} arrayBuffers ${arrayBuffers}`);
90
142
  };
91
- interval();
92
143
  clearInterval(memoryCheckInterval);
93
- memoryCheckInterval = setInterval(interval, getIntParameter('memoryinterval') ?? 10 * 1000).unref();
144
+ memoryCheckInterval = setInterval(interval, memoryCheckIntervalMs).unref();
145
+ clearTimeout(memoryPeakResetTimeout);
146
+ memoryPeakResetTimeout = setTimeout(() => {
147
+ log.debug(`****${RED}${BRIGHT}Cpu and memory peaks reset after first 5 minutes.${db}`);
148
+ peakCpu = 0;
149
+ peakProcessCpu = 0;
150
+ peakRss = 0;
151
+ peakHeapUsed = 0;
152
+ peakHeapTotal = 0;
153
+ }, 5 * 60 * 1000).unref();
94
154
  }
95
155
  async function stopCpuMemoryCheck() {
96
- log.debug(`***Cpu memory check stopped. Peak cpu: ${CYAN}${peakCpu.toFixed(2)} %${db}. Peak rss: ${CYAN}${formatMemoryUsage(peakRss)}${db}.`);
156
+ if (trace) {
157
+ log.debug(`***Cpu memory check stopped. Peak cpu: ${CYAN}${peakCpu.toFixed(2)} %${db}. Peak rss: ${CYAN}${formatMemoryUsage(peakRss)}${db}. Peak heapUsed: ${CYAN}${formatMemoryUsage(peakHeapUsed)}${db}. Peak heapTotal: ${CYAN}${formatMemoryUsage(peakHeapTotal)}${db}`);
158
+ }
97
159
  clearInterval(memoryCheckInterval);
160
+ clearTimeout(memoryPeakResetTimeout);
98
161
  }
99
162
  async function startInspector() {
100
163
  const { Session } = await import('node:inspector');
@@ -1,6 +1,12 @@
1
+ if (process.argv.includes('--loader') || process.argv.includes('-loader'))
2
+ console.log('\u001B[32mCli emitter loaded.\u001B[40;0m');
1
3
  import { EventEmitter } from 'node:events';
2
4
  export const cliEmitter = new EventEmitter();
3
5
  export let lastCpuUsage = 0;
6
+ export let lastProcessCpuUsage = 0;
4
7
  export function setLastCpuUsage(val) {
5
8
  lastCpuUsage = val;
6
9
  }
10
+ export function setLastProcessCpuUsage(val) {
11
+ lastProcessCpuUsage = val;
12
+ }