matterbridge 3.3.1-dev-20251008-e61b8db → 3.3.1-dev-20251009-008da25

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
 
@@ -47,6 +53,7 @@ Advantages:
47
53
  - [spawn]: Refactored spawnCommand for compatibility with InstallProgressDialog.
48
54
  - [matter.js]: Bumped `matter.js` to 0.15.5. Thanks matter.js!
49
55
  - [backend]: Optimized imports.
56
+ - [cli]: Bumped `cli` version to 2.1.0.
50
57
 
51
58
  ### Fixed
52
59
 
@@ -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,22 +1,30 @@
1
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
2
- console.log('\u001B[32mCli loaded.\u001B[40;0m');
2
+ console.log('\u001B[32mCLI loaded.\u001B[40;0m');
3
3
  import os from 'node:os';
4
4
  import { inspect } from 'node:util';
5
5
  import { AnsiLogger, BRIGHT, CYAN, db, RED, YELLOW } from 'node-ansi-logger';
6
- import { getIntParameter, hasParameter } from './utils/export.js';
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';
7
9
  import { Matterbridge } from './matterbridge.js';
8
- import { cliEmitter, lastCpuUsage, setLastCpuUsage } from './cliEmitter.js';
9
10
  export let instance;
10
11
  let session;
11
12
  let snapshotInterval;
13
+ const trace = hasParameter('trace');
12
14
  let memoryCheckInterval;
15
+ const memoryCheckIntervalMs = getIntParameter('memoryinterval') ?? 10 * 1000;
13
16
  let memoryPeakResetTimeout;
14
17
  let prevCpus;
18
+ let prevProcessCpu;
15
19
  let peakCpu = 0;
20
+ let peakProcessCpu = 0;
16
21
  let peakRss = 0;
17
22
  let peakHeapUsed = 0;
18
23
  let peakHeapTotal = 0;
19
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
+ };
20
28
  const formatMemoryUsage = (bytes) => {
21
29
  if (bytes >= 1024 ** 3) {
22
30
  return `${(bytes / 1024 ** 3).toFixed(2)} GB`;
@@ -46,6 +54,7 @@ const formatOsUpTime = (seconds) => {
46
54
  async function startCpuMemoryCheck() {
47
55
  log.debug(`Cpu memory check started`);
48
56
  prevCpus = os.cpus();
57
+ prevProcessCpu = process.cpuUsage();
49
58
  clearInterval(memoryCheckInterval);
50
59
  const interval = () => {
51
60
  const systemUptime = formatOsUpTime(Math.floor(os.uptime()));
@@ -60,23 +69,22 @@ async function startCpuMemoryCheck() {
60
69
  const external = formatMemoryUsage(memoryUsageRaw.external);
61
70
  const arrayBuffers = formatMemoryUsage(memoryUsageRaw.arrayBuffers);
62
71
  if (memoryUsageRaw.rss > peakRss) {
63
- if (peakRss)
72
+ if (peakRss && trace)
64
73
  log.debug(`****${RED}${BRIGHT}Rss peak detected.${db} Peak rss from ${CYAN}${formatMemoryUsage(peakRss)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.rss)}${db}`);
65
74
  peakRss = memoryUsageRaw.rss;
66
75
  }
67
76
  if (memoryUsageRaw.heapUsed > peakHeapUsed) {
68
- if (peakHeapUsed)
77
+ if (peakHeapUsed && trace)
69
78
  log.debug(`****${RED}${BRIGHT}HeapUsed peak detected.${db} Peak heapUsed from ${CYAN}${formatMemoryUsage(peakHeapUsed)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.heapUsed)}${db}`);
70
79
  peakHeapUsed = memoryUsageRaw.heapUsed;
71
80
  }
72
81
  if (memoryUsageRaw.heapTotal > peakHeapTotal) {
73
- if (peakHeapTotal)
82
+ if (peakHeapTotal && trace)
74
83
  log.debug(`****${RED}${BRIGHT}HeapTotal peak detected.${db} Peak heapTotal from ${CYAN}${formatMemoryUsage(peakHeapTotal)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.heapTotal)}${db}`);
75
84
  peakHeapTotal = memoryUsageRaw.heapTotal;
76
85
  }
77
86
  cliEmitter.emit('memory', totalMememory, freeMemory, rss, heapTotal, heapUsed, external, arrayBuffers);
78
87
  const currCpus = os.cpus();
79
- let cpuUsageLog;
80
88
  if (currCpus.length !== prevCpus.length) {
81
89
  prevCpus = currCpus;
82
90
  log.debug(`Cpu check length failed, resetting previous cpus`);
@@ -93,34 +101,61 @@ async function startCpuMemoryCheck() {
93
101
  const cpuUsage = 100 - (totalIdle / totalTick) * 100;
94
102
  if (totalTick === 0 || isNaN(cpuUsage) || !isFinite(cpuUsage) || cpuUsage <= 0) {
95
103
  log.debug(`Cpu check failed, using previous cpus`);
96
- cpuUsageLog = lastCpuUsage.toFixed(2);
97
104
  }
98
105
  else {
99
- cpuUsageLog = cpuUsage.toFixed(2);
100
106
  setLastCpuUsage(cpuUsage);
101
- if (lastCpuUsage > peakCpu) {
102
- peakCpu = lastCpuUsage;
103
- if (peakCpu)
104
- log.debug(`****${RED}${BRIGHT}Cpu peak detected.${db} Peak cpu from ${CYAN}${peakCpu.toFixed(2)}%${db} to ${CYAN}${lastCpuUsage.toFixed(2)}%${db}`);
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}`);
105
111
  }
106
- cliEmitter.emit('cpu', lastCpuUsage);
107
112
  }
108
113
  prevCpus = currCpus;
109
- log.debug(`***${YELLOW}${BRIGHT}Cpu usage:${db} ${CYAN}${cpuUsageLog.padStart(6, ' ')}%${db} (peak ${peakCpu.toFixed(2)}%) ${YELLOW}${BRIGHT}Memory usage:${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}`);
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}`);
110
142
  };
111
143
  clearInterval(memoryCheckInterval);
112
- memoryCheckInterval = setInterval(interval, getIntParameter('memoryinterval') ?? 10 * 1000).unref();
144
+ memoryCheckInterval = setInterval(interval, memoryCheckIntervalMs).unref();
113
145
  clearTimeout(memoryPeakResetTimeout);
114
146
  memoryPeakResetTimeout = setTimeout(() => {
115
147
  log.debug(`****${RED}${BRIGHT}Cpu and memory peaks reset after first 5 minutes.${db}`);
116
148
  peakCpu = 0;
149
+ peakProcessCpu = 0;
117
150
  peakRss = 0;
118
151
  peakHeapUsed = 0;
119
152
  peakHeapTotal = 0;
120
153
  }, 5 * 60 * 1000).unref();
121
154
  }
122
155
  async function stopCpuMemoryCheck() {
123
- 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}`);
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
+ }
124
159
  clearInterval(memoryCheckInterval);
125
160
  clearTimeout(memoryPeakResetTimeout);
126
161
  }
@@ -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
+ }