matterbridge 3.3.3 → 3.3.4-dev-20251020-df40d12
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 +22 -0
- package/dist/broadcastServer.js +1 -86
- package/dist/broadcastServerTypes.js +0 -24
- package/dist/cli.js +112 -445
- package/dist/cliEmitter.js +0 -37
- package/dist/cliHistory.js +15 -95
- package/dist/clusters/export.js +0 -2
- package/dist/defaultConfigSchema.js +0 -24
- package/dist/deviceManager.js +1 -124
- package/dist/devices/airConditioner.js +2 -59
- package/dist/devices/batteryStorage.js +4 -51
- package/dist/devices/cooktop.js +0 -55
- package/dist/devices/dishwasher.js +4 -61
- package/dist/devices/evse.js +16 -79
- package/dist/devices/export.js +0 -5
- package/dist/devices/extractorHood.js +1 -43
- package/dist/devices/heatPump.js +4 -52
- package/dist/devices/laundryDryer.js +6 -65
- package/dist/devices/laundryWasher.js +9 -75
- package/dist/devices/microwaveOven.js +10 -93
- package/dist/devices/oven.js +5 -90
- package/dist/devices/refrigerator.js +4 -106
- package/dist/devices/roboticVacuumCleaner.js +20 -111
- package/dist/devices/solarPower.js +2 -40
- package/dist/devices/speaker.js +2 -85
- package/dist/devices/temperatureControl.js +5 -27
- package/dist/devices/waterHeater.js +8 -88
- package/dist/dgram/coap.js +13 -126
- package/dist/dgram/dgram.js +2 -114
- package/dist/dgram/mb_coap.js +3 -41
- package/dist/dgram/mb_mdns.js +15 -80
- package/dist/dgram/mdns.js +137 -299
- package/dist/dgram/multicast.js +1 -62
- package/dist/dgram/unicast.js +0 -54
- package/dist/frontend.js +61 -439
- package/dist/frontendTypes.js +0 -45
- package/dist/helpers.js +1 -54
- package/dist/index.js +0 -25
- package/dist/logger/export.js +0 -1
- package/dist/matter/behaviors.js +0 -2
- package/dist/matter/clusters.js +0 -2
- package/dist/matter/devices.js +0 -2
- package/dist/matter/endpoints.js +0 -2
- package/dist/matter/export.js +0 -3
- package/dist/matter/types.js +0 -3
- package/dist/matterbridge.js +67 -885
- package/dist/matterbridgeAccessoryPlatform.js +2 -36
- package/dist/matterbridgeBehaviors.js +25 -91
- package/dist/matterbridgeDeviceTypes.js +102 -715
- package/dist/matterbridgeDynamicPlatform.js +2 -36
- package/dist/matterbridgeEndpoint.js +122 -1473
- package/dist/matterbridgeEndpointHelpers.js +88 -443
- package/dist/matterbridgePlatform.js +3 -343
- package/dist/matterbridgeTypes.js +0 -26
- package/dist/pluginManager.js +3 -325
- package/dist/shelly.js +7 -168
- package/dist/storage/export.js +0 -1
- package/dist/update.js +1 -70
- package/dist/utils/colorUtils.js +2 -97
- package/dist/utils/commandLine.js +6 -55
- package/dist/utils/copyDirectory.js +1 -38
- package/dist/utils/createDirectory.js +0 -33
- package/dist/utils/createZip.js +2 -47
- package/dist/utils/deepCopy.js +0 -39
- package/dist/utils/deepEqual.js +1 -72
- package/dist/utils/error.js +0 -41
- package/dist/utils/export.js +0 -1
- package/dist/utils/format.js +29 -0
- package/dist/utils/hex.js +0 -124
- package/dist/utils/inspector.js +200 -0
- package/dist/utils/isvalid.js +0 -101
- package/dist/utils/jestHelpers.js +10 -156
- package/dist/utils/network.js +5 -134
- package/dist/utils/spawn.js +0 -71
- package/dist/utils/tracker.js +201 -0
- package/dist/utils/wait.js +8 -60
- package/frontend/build/assets/index.js +4 -4
- package/frontend/build/assets/vendor_mdi.js +1 -1
- package/frontend/package.json +1 -1
- package/npm-shrinkwrap.json +44 -44
- package/package.json +2 -3
- package/dist/broadcastServer.d.ts +0 -105
- package/dist/broadcastServer.d.ts.map +0 -1
- package/dist/broadcastServer.js.map +0 -1
- package/dist/broadcastServerTypes.d.ts +0 -719
- package/dist/broadcastServerTypes.d.ts.map +0 -1
- package/dist/broadcastServerTypes.js.map +0 -1
- package/dist/cli.d.ts +0 -26
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cliEmitter.d.ts +0 -50
- package/dist/cliEmitter.d.ts.map +0 -1
- package/dist/cliEmitter.js.map +0 -1
- package/dist/cliHistory.d.ts +0 -74
- package/dist/cliHistory.d.ts.map +0 -1
- package/dist/cliHistory.js.map +0 -1
- package/dist/clusters/export.d.ts +0 -2
- package/dist/clusters/export.d.ts.map +0 -1
- package/dist/clusters/export.js.map +0 -1
- package/dist/defaultConfigSchema.d.ts +0 -28
- package/dist/defaultConfigSchema.d.ts.map +0 -1
- package/dist/defaultConfigSchema.js.map +0 -1
- package/dist/deviceManager.d.ts +0 -117
- package/dist/deviceManager.d.ts.map +0 -1
- package/dist/deviceManager.js.map +0 -1
- package/dist/devices/airConditioner.d.ts +0 -98
- package/dist/devices/airConditioner.d.ts.map +0 -1
- package/dist/devices/airConditioner.js.map +0 -1
- package/dist/devices/batteryStorage.d.ts +0 -48
- package/dist/devices/batteryStorage.d.ts.map +0 -1
- package/dist/devices/batteryStorage.js.map +0 -1
- package/dist/devices/cooktop.d.ts +0 -60
- package/dist/devices/cooktop.d.ts.map +0 -1
- package/dist/devices/cooktop.js.map +0 -1
- package/dist/devices/dishwasher.d.ts +0 -71
- package/dist/devices/dishwasher.d.ts.map +0 -1
- package/dist/devices/dishwasher.js.map +0 -1
- package/dist/devices/evse.d.ts +0 -75
- package/dist/devices/evse.d.ts.map +0 -1
- package/dist/devices/evse.js.map +0 -1
- package/dist/devices/export.d.ts +0 -17
- package/dist/devices/export.d.ts.map +0 -1
- package/dist/devices/export.js.map +0 -1
- package/dist/devices/extractorHood.d.ts +0 -46
- package/dist/devices/extractorHood.d.ts.map +0 -1
- package/dist/devices/extractorHood.js.map +0 -1
- package/dist/devices/heatPump.d.ts +0 -47
- package/dist/devices/heatPump.d.ts.map +0 -1
- package/dist/devices/heatPump.js.map +0 -1
- package/dist/devices/laundryDryer.d.ts +0 -67
- package/dist/devices/laundryDryer.d.ts.map +0 -1
- package/dist/devices/laundryDryer.js.map +0 -1
- package/dist/devices/laundryWasher.d.ts +0 -81
- package/dist/devices/laundryWasher.d.ts.map +0 -1
- package/dist/devices/laundryWasher.js.map +0 -1
- package/dist/devices/microwaveOven.d.ts +0 -168
- package/dist/devices/microwaveOven.d.ts.map +0 -1
- package/dist/devices/microwaveOven.js.map +0 -1
- package/dist/devices/oven.d.ts +0 -105
- package/dist/devices/oven.d.ts.map +0 -1
- package/dist/devices/oven.js.map +0 -1
- package/dist/devices/refrigerator.d.ts +0 -118
- package/dist/devices/refrigerator.d.ts.map +0 -1
- package/dist/devices/refrigerator.js.map +0 -1
- package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
- package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
- package/dist/devices/roboticVacuumCleaner.js.map +0 -1
- package/dist/devices/solarPower.d.ts +0 -40
- package/dist/devices/solarPower.d.ts.map +0 -1
- package/dist/devices/solarPower.js.map +0 -1
- package/dist/devices/speaker.d.ts +0 -87
- package/dist/devices/speaker.d.ts.map +0 -1
- package/dist/devices/speaker.js.map +0 -1
- package/dist/devices/temperatureControl.d.ts +0 -166
- package/dist/devices/temperatureControl.d.ts.map +0 -1
- package/dist/devices/temperatureControl.js.map +0 -1
- package/dist/devices/waterHeater.d.ts +0 -111
- package/dist/devices/waterHeater.d.ts.map +0 -1
- package/dist/devices/waterHeater.js.map +0 -1
- package/dist/dgram/coap.d.ts +0 -205
- package/dist/dgram/coap.d.ts.map +0 -1
- package/dist/dgram/coap.js.map +0 -1
- package/dist/dgram/dgram.d.ts +0 -141
- package/dist/dgram/dgram.d.ts.map +0 -1
- package/dist/dgram/dgram.js.map +0 -1
- package/dist/dgram/mb_coap.d.ts +0 -24
- package/dist/dgram/mb_coap.d.ts.map +0 -1
- package/dist/dgram/mb_coap.js.map +0 -1
- package/dist/dgram/mb_mdns.d.ts +0 -24
- package/dist/dgram/mb_mdns.d.ts.map +0 -1
- package/dist/dgram/mb_mdns.js.map +0 -1
- package/dist/dgram/mdns.d.ts +0 -290
- package/dist/dgram/mdns.d.ts.map +0 -1
- package/dist/dgram/mdns.js.map +0 -1
- package/dist/dgram/multicast.d.ts +0 -67
- package/dist/dgram/multicast.d.ts.map +0 -1
- package/dist/dgram/multicast.js.map +0 -1
- package/dist/dgram/unicast.d.ts +0 -56
- package/dist/dgram/unicast.d.ts.map +0 -1
- package/dist/dgram/unicast.js.map +0 -1
- package/dist/frontend.d.ts +0 -235
- package/dist/frontend.d.ts.map +0 -1
- package/dist/frontend.js.map +0 -1
- package/dist/frontendTypes.d.ts +0 -529
- package/dist/frontendTypes.d.ts.map +0 -1
- package/dist/frontendTypes.js.map +0 -1
- package/dist/helpers.d.ts +0 -48
- package/dist/helpers.d.ts.map +0 -1
- package/dist/helpers.js.map +0 -1
- package/dist/index.d.ts +0 -33
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logger/export.d.ts +0 -2
- package/dist/logger/export.d.ts.map +0 -1
- package/dist/logger/export.js.map +0 -1
- package/dist/matter/behaviors.d.ts +0 -2
- package/dist/matter/behaviors.d.ts.map +0 -1
- package/dist/matter/behaviors.js.map +0 -1
- package/dist/matter/clusters.d.ts +0 -2
- package/dist/matter/clusters.d.ts.map +0 -1
- package/dist/matter/clusters.js.map +0 -1
- package/dist/matter/devices.d.ts +0 -2
- package/dist/matter/devices.d.ts.map +0 -1
- package/dist/matter/devices.js.map +0 -1
- package/dist/matter/endpoints.d.ts +0 -2
- package/dist/matter/endpoints.d.ts.map +0 -1
- package/dist/matter/endpoints.js.map +0 -1
- package/dist/matter/export.d.ts +0 -5
- package/dist/matter/export.d.ts.map +0 -1
- package/dist/matter/export.js.map +0 -1
- package/dist/matter/types.d.ts +0 -3
- package/dist/matter/types.d.ts.map +0 -1
- package/dist/matter/types.js.map +0 -1
- package/dist/matterbridge.d.ts +0 -469
- package/dist/matterbridge.d.ts.map +0 -1
- package/dist/matterbridge.js.map +0 -1
- package/dist/matterbridgeAccessoryPlatform.d.ts +0 -42
- package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
- package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
- package/dist/matterbridgeBehaviors.d.ts +0 -2399
- package/dist/matterbridgeBehaviors.d.ts.map +0 -1
- package/dist/matterbridgeBehaviors.js.map +0 -1
- package/dist/matterbridgeDeviceTypes.d.ts +0 -761
- package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
- package/dist/matterbridgeDeviceTypes.js.map +0 -1
- package/dist/matterbridgeDynamicPlatform.d.ts +0 -42
- package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
- package/dist/matterbridgeDynamicPlatform.js.map +0 -1
- package/dist/matterbridgeEndpoint.d.ts +0 -1545
- package/dist/matterbridgeEndpoint.d.ts.map +0 -1
- package/dist/matterbridgeEndpoint.js.map +0 -1
- package/dist/matterbridgeEndpointHelpers.d.ts +0 -560
- package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
- package/dist/matterbridgeEndpointHelpers.js.map +0 -1
- package/dist/matterbridgePlatform.d.ts +0 -402
- package/dist/matterbridgePlatform.d.ts.map +0 -1
- package/dist/matterbridgePlatform.js.map +0 -1
- package/dist/matterbridgeTypes.d.ts +0 -209
- package/dist/matterbridgeTypes.d.ts.map +0 -1
- package/dist/matterbridgeTypes.js.map +0 -1
- package/dist/pluginManager.d.ts +0 -353
- package/dist/pluginManager.d.ts.map +0 -1
- package/dist/pluginManager.js.map +0 -1
- package/dist/shelly.d.ts +0 -174
- package/dist/shelly.d.ts.map +0 -1
- package/dist/shelly.js.map +0 -1
- package/dist/storage/export.d.ts +0 -2
- package/dist/storage/export.d.ts.map +0 -1
- package/dist/storage/export.js.map +0 -1
- package/dist/update.d.ts +0 -75
- package/dist/update.d.ts.map +0 -1
- package/dist/update.js.map +0 -1
- package/dist/utils/colorUtils.d.ts +0 -99
- package/dist/utils/colorUtils.d.ts.map +0 -1
- package/dist/utils/colorUtils.js.map +0 -1
- package/dist/utils/commandLine.d.ts +0 -59
- package/dist/utils/commandLine.d.ts.map +0 -1
- package/dist/utils/commandLine.js.map +0 -1
- package/dist/utils/copyDirectory.d.ts +0 -33
- package/dist/utils/copyDirectory.d.ts.map +0 -1
- package/dist/utils/copyDirectory.js.map +0 -1
- package/dist/utils/createDirectory.d.ts +0 -34
- package/dist/utils/createDirectory.d.ts.map +0 -1
- package/dist/utils/createDirectory.js.map +0 -1
- package/dist/utils/createZip.d.ts +0 -39
- package/dist/utils/createZip.d.ts.map +0 -1
- package/dist/utils/createZip.js.map +0 -1
- package/dist/utils/deepCopy.d.ts +0 -32
- package/dist/utils/deepCopy.d.ts.map +0 -1
- package/dist/utils/deepCopy.js.map +0 -1
- package/dist/utils/deepEqual.d.ts +0 -54
- package/dist/utils/deepEqual.d.ts.map +0 -1
- package/dist/utils/deepEqual.js.map +0 -1
- package/dist/utils/error.d.ts +0 -44
- package/dist/utils/error.d.ts.map +0 -1
- package/dist/utils/error.js.map +0 -1
- package/dist/utils/export.d.ts +0 -13
- package/dist/utils/export.d.ts.map +0 -1
- package/dist/utils/export.js.map +0 -1
- package/dist/utils/hex.d.ts +0 -89
- package/dist/utils/hex.d.ts.map +0 -1
- package/dist/utils/hex.js.map +0 -1
- package/dist/utils/isvalid.d.ts +0 -103
- package/dist/utils/isvalid.d.ts.map +0 -1
- package/dist/utils/isvalid.js.map +0 -1
- package/dist/utils/jestHelpers.d.ts +0 -137
- package/dist/utils/jestHelpers.d.ts.map +0 -1
- package/dist/utils/jestHelpers.js.map +0 -1
- package/dist/utils/network.d.ts +0 -115
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js.map +0 -1
- package/dist/utils/spawn.d.ts +0 -35
- package/dist/utils/spawn.d.ts.map +0 -1
- package/dist/utils/spawn.js.map +0 -1
- package/dist/utils/wait.d.ts +0 -54
- package/dist/utils/wait.d.ts.map +0 -1
- package/dist/utils/wait.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,501 +1,168 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file contains the CLI entry point of Matterbridge.
|
|
3
|
-
*
|
|
4
|
-
* @file cli.ts
|
|
5
|
-
* @author Luca Liguori
|
|
6
|
-
* @created 2023-12-29
|
|
7
|
-
* @version 2.1.1
|
|
8
|
-
* @license Apache-2.0
|
|
9
|
-
*
|
|
10
|
-
* Copyright 2023, 2024, 2025 Luca Liguori.
|
|
11
|
-
*
|
|
12
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
-
* you may not use this file except in compliance with the License.
|
|
14
|
-
* You may obtain a copy of the License at
|
|
15
|
-
*
|
|
16
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
-
*
|
|
18
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
-
* See the License for the specific language governing permissions and
|
|
22
|
-
* limitations under the License.
|
|
23
|
-
*/
|
|
24
|
-
// eslint-disable-next-line no-console
|
|
25
1
|
if (process.argv.includes('--loader') || process.argv.includes('-loader'))
|
|
26
|
-
console.log('\u001B[
|
|
27
|
-
import
|
|
28
|
-
import {
|
|
29
|
-
// AnsiLogger module
|
|
30
|
-
import { AnsiLogger, BRIGHT, CYAN, db, RED, YELLOW } from 'node-ansi-logger';
|
|
31
|
-
// Cli
|
|
32
|
-
import { cliEmitter, setLastOsCpuUsage, setLastProcessCpuUsage } from './cliEmitter.js';
|
|
33
|
-
import { history, historyIndex, historySize, setHistoryIndex } from './cliHistory.js';
|
|
34
|
-
// Matterbridge
|
|
35
|
-
import { getIntParameter, hasParameter } from './utils/commandLine.js';
|
|
2
|
+
console.log('\u001B[32mCli loaded.\u001B[40;0m');
|
|
3
|
+
import { AnsiLogger } from 'node-ansi-logger';
|
|
4
|
+
import { cliEmitter } from './cliEmitter.js';
|
|
36
5
|
import { Matterbridge } from './matterbridge.js';
|
|
6
|
+
import { hasParameter, hasAnyParameter } from './utils/commandLine.js';
|
|
7
|
+
import { inspectError } from './utils/error.js';
|
|
8
|
+
import { Tracker } from './utils/tracker.js';
|
|
9
|
+
import { Inspector } from './utils/inspector.js';
|
|
10
|
+
import { formatBytes, formatUptime } from './utils/format.js';
|
|
37
11
|
export let instance;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
let peakHeapUsed = 0;
|
|
52
|
-
let peakHeapTotal = 0;
|
|
53
|
-
let peakExternal = 0;
|
|
54
|
-
let peakArrayBuffers = 0;
|
|
55
|
-
const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logLevel: hasParameter('debug') ? "debug" /* LogLevel.DEBUG */ : "info" /* LogLevel.INFO */ });
|
|
56
|
-
const formatCpuUsage = (percent) => {
|
|
57
|
-
return `${percent.toFixed(2).padStart(5, ' ')} %`;
|
|
58
|
-
};
|
|
59
|
-
const formatMemoryUsage = (bytes) => {
|
|
60
|
-
if (bytes >= 1024 ** 3) {
|
|
61
|
-
return `${(bytes / 1024 ** 3).toFixed(2)} GB`;
|
|
62
|
-
}
|
|
63
|
-
else if (bytes >= 1024 ** 2) {
|
|
64
|
-
return `${(bytes / 1024 ** 2).toFixed(2)} MB`;
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
return `${(bytes / 1024).toFixed(2)} KB`;
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
const formatOsUpTime = (seconds) => {
|
|
71
|
-
if (seconds >= 86400) {
|
|
72
|
-
const days = Math.floor(seconds / 86400);
|
|
73
|
-
return `${days} day${days !== 1 ? 's' : ''}`;
|
|
74
|
-
}
|
|
75
|
-
if (seconds >= 3600) {
|
|
76
|
-
const hours = Math.floor(seconds / 3600);
|
|
77
|
-
return `${hours} hour${hours !== 1 ? 's' : ''}`;
|
|
78
|
-
}
|
|
79
|
-
if (seconds >= 60) {
|
|
80
|
-
const minutes = Math.floor(seconds / 60);
|
|
81
|
-
return `${minutes} minute${minutes !== 1 ? 's' : ''}`;
|
|
82
|
-
}
|
|
83
|
-
return `${seconds} second${seconds !== 1 ? 's' : ''}`;
|
|
84
|
-
};
|
|
85
|
-
/**
|
|
86
|
-
* Starts the CPU and memory check interval.
|
|
87
|
-
*
|
|
88
|
-
* @remarks
|
|
89
|
-
* Debug parameter
|
|
90
|
-
*
|
|
91
|
-
* -memoryinterval <milliseconds> can be used to set the interval. Default is 10 seconds.
|
|
92
|
-
*/
|
|
93
|
-
async function startCpuMemoryCheck() {
|
|
94
|
-
// const os = await import('node:os');
|
|
12
|
+
export const tracker = new Tracker('Cli', false, false);
|
|
13
|
+
export const inspector = new Inspector('Cli', false, false);
|
|
14
|
+
const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
|
|
15
|
+
function startCpuMemoryCheck() {
|
|
16
|
+
log.debug(`Cpu memory check starting...`);
|
|
17
|
+
tracker.start();
|
|
18
|
+
tracker.on('uptime', (os, process) => {
|
|
19
|
+
cliEmitter.emit('uptime', formatUptime(Math.floor(os)), formatUptime(Math.floor(process)));
|
|
20
|
+
});
|
|
21
|
+
tracker.on('snapshot', (snapshot) => {
|
|
22
|
+
cliEmitter.emit('memory', formatBytes(snapshot.totalMemory), formatBytes(snapshot.freeMemory), formatBytes(snapshot.rss), formatBytes(snapshot.heapTotal), formatBytes(snapshot.heapUsed), formatBytes(snapshot.external), formatBytes(snapshot.arrayBuffers));
|
|
23
|
+
cliEmitter.emit('cpu', snapshot.osCpu, snapshot.processCpu);
|
|
24
|
+
});
|
|
95
25
|
log.debug(`Cpu memory check started`);
|
|
96
|
-
prevCpus = os.cpus();
|
|
97
|
-
prevProcessCpu = process.cpuUsage();
|
|
98
|
-
const interval = () => {
|
|
99
|
-
// Get the os uptime
|
|
100
|
-
const systemUptime = formatOsUpTime(Math.floor(os.uptime()));
|
|
101
|
-
const processUptime = formatOsUpTime(Math.floor(process.uptime()));
|
|
102
|
-
cliEmitter.emit('uptime', systemUptime, processUptime);
|
|
103
|
-
// Get the free and total memory
|
|
104
|
-
const totalMemory = formatMemoryUsage(os.totalmem());
|
|
105
|
-
const freeMemory = formatMemoryUsage(os.freemem());
|
|
106
|
-
// Get the memory usage
|
|
107
|
-
const memoryUsageRaw = process.memoryUsage();
|
|
108
|
-
const rss = formatMemoryUsage(memoryUsageRaw.rss);
|
|
109
|
-
const heapTotal = formatMemoryUsage(memoryUsageRaw.heapTotal);
|
|
110
|
-
const heapUsed = formatMemoryUsage(memoryUsageRaw.heapUsed);
|
|
111
|
-
const external = formatMemoryUsage(memoryUsageRaw.external);
|
|
112
|
-
const arrayBuffers = formatMemoryUsage(memoryUsageRaw.arrayBuffers);
|
|
113
|
-
if (memoryUsageRaw.rss > peakRss) {
|
|
114
|
-
if (peakRss && trace)
|
|
115
|
-
log.debug(`****${RED}${BRIGHT}Rss peak detected.${db} Peak rss from ${CYAN}${formatMemoryUsage(peakRss)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.rss)}${db}`);
|
|
116
|
-
peakRss = memoryUsageRaw.rss;
|
|
117
|
-
}
|
|
118
|
-
if (memoryUsageRaw.heapUsed > peakHeapUsed) {
|
|
119
|
-
if (peakHeapUsed && trace)
|
|
120
|
-
log.debug(`****${RED}${BRIGHT}HeapUsed peak detected.${db} Peak heapUsed from ${CYAN}${formatMemoryUsage(peakHeapUsed)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.heapUsed)}${db}`);
|
|
121
|
-
peakHeapUsed = memoryUsageRaw.heapUsed;
|
|
122
|
-
}
|
|
123
|
-
if (memoryUsageRaw.heapTotal > peakHeapTotal) {
|
|
124
|
-
if (peakHeapTotal && trace)
|
|
125
|
-
log.debug(`****${RED}${BRIGHT}HeapTotal peak detected.${db} Peak heapTotal from ${CYAN}${formatMemoryUsage(peakHeapTotal)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.heapTotal)}${db}`);
|
|
126
|
-
peakHeapTotal = memoryUsageRaw.heapTotal;
|
|
127
|
-
}
|
|
128
|
-
if (memoryUsageRaw.external > peakExternal) {
|
|
129
|
-
if (peakExternal && trace)
|
|
130
|
-
log.debug(`****${RED}${BRIGHT}External peak detected.${db} Peak external from ${CYAN}${formatMemoryUsage(peakExternal)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.external)}${db}`);
|
|
131
|
-
peakExternal = memoryUsageRaw.external;
|
|
132
|
-
}
|
|
133
|
-
if (memoryUsageRaw.arrayBuffers > peakArrayBuffers) {
|
|
134
|
-
if (peakArrayBuffers && trace)
|
|
135
|
-
log.debug(`****${RED}${BRIGHT}ArrayBuffers peak detected.${db} Peak arrayBuffers from ${CYAN}${formatMemoryUsage(peakArrayBuffers)}${db} to ${CYAN}${formatMemoryUsage(memoryUsageRaw.arrayBuffers)}${db}`);
|
|
136
|
-
peakArrayBuffers = memoryUsageRaw.arrayBuffers;
|
|
137
|
-
}
|
|
138
|
-
cliEmitter.emit('memory', totalMemory, freeMemory, rss, heapTotal, heapUsed, external, arrayBuffers);
|
|
139
|
-
// Get the host cpu usage
|
|
140
|
-
const currCpus = os.cpus();
|
|
141
|
-
// log.debug(`Cpus: ${JSON.stringify(currCpus)}`);
|
|
142
|
-
if (currCpus.length !== prevCpus.length) {
|
|
143
|
-
prevCpus = currCpus; // Reset the previous cpus
|
|
144
|
-
log.debug(`Cpu check length failed, resetting previous cpus`);
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
let totalIdle = 0, totalTick = 0;
|
|
148
|
-
prevCpus.forEach((prevCpu, i) => {
|
|
149
|
-
const currCpu = currCpus[i];
|
|
150
|
-
const idleDiff = currCpu.times.idle - prevCpu.times.idle;
|
|
151
|
-
const totalDiff = Object.keys(currCpu.times).reduce((acc, key) => acc + (currCpu.times[key] - prevCpu.times[key]), 0);
|
|
152
|
-
totalIdle += idleDiff;
|
|
153
|
-
totalTick += totalDiff;
|
|
154
|
-
});
|
|
155
|
-
const osCpuUsage = 100 - (totalIdle / totalTick) * 100;
|
|
156
|
-
if (totalTick === 0 || isNaN(osCpuUsage) || !isFinite(osCpuUsage) || osCpuUsage <= 0) {
|
|
157
|
-
log.debug(`Cpu check failed, using previous cpus`);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
// istanbul ignore next
|
|
161
|
-
setLastOsCpuUsage(osCpuUsage);
|
|
162
|
-
// istanbul ignore next if
|
|
163
|
-
if (osCpuUsage > peakCpu) {
|
|
164
|
-
peakCpu = osCpuUsage;
|
|
165
|
-
if (peakCpu && trace)
|
|
166
|
-
log.debug(`****${RED}${BRIGHT}Cpu peak detected.${db} Peak cpu from ${CYAN}${formatCpuUsage(peakCpu)}${db} to ${CYAN}${formatCpuUsage(osCpuUsage)}${db}`);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
prevCpus = currCpus;
|
|
170
|
-
// Get the process cpu usage https://cdn.jsdelivr.net/npm/chart.js
|
|
171
|
-
const diff = process.cpuUsage(prevProcessCpu);
|
|
172
|
-
const userMs = diff.user / 1000;
|
|
173
|
-
const systemMs = diff.system / 1000;
|
|
174
|
-
const totalMs = userMs + systemMs;
|
|
175
|
-
const processCpuUsage = Number((((totalMs / memoryCheckIntervalMs) * 100) / currCpus.length).toFixed(2));
|
|
176
|
-
// istanbul ignore next if
|
|
177
|
-
if (processCpuUsage > peakProcessCpu) {
|
|
178
|
-
peakProcessCpu = processCpuUsage;
|
|
179
|
-
if (peakProcessCpu && trace)
|
|
180
|
-
log.debug(`****${RED}${BRIGHT}Process cpu peak detected.${db} Peak process cpu from ${CYAN}${formatCpuUsage(peakProcessCpu)}${db} to ${CYAN}${formatCpuUsage(processCpuUsage)}${db}`);
|
|
181
|
-
}
|
|
182
|
-
prevProcessCpu = process.cpuUsage();
|
|
183
|
-
setLastProcessCpuUsage(processCpuUsage);
|
|
184
|
-
cliEmitter.emit('cpu', osCpuUsage, processCpuUsage);
|
|
185
|
-
// Update preallocated history entry in place to avoid per-interval allocations. Keep the same object reference.
|
|
186
|
-
const entry = history[historyIndex];
|
|
187
|
-
entry.timestamp = Date.now();
|
|
188
|
-
entry.cpu = osCpuUsage;
|
|
189
|
-
entry.peakCpu = peakCpu;
|
|
190
|
-
entry.processCpu = processCpuUsage;
|
|
191
|
-
entry.peakProcessCpu = peakProcessCpu;
|
|
192
|
-
entry.rss = memoryUsageRaw.rss;
|
|
193
|
-
entry.peakRss = peakRss;
|
|
194
|
-
entry.heapUsed = memoryUsageRaw.heapUsed;
|
|
195
|
-
entry.peakHeapUsed = peakHeapUsed;
|
|
196
|
-
entry.heapTotal = memoryUsageRaw.heapTotal;
|
|
197
|
-
entry.peakHeapTotal = peakHeapTotal;
|
|
198
|
-
entry.external = memoryUsageRaw.external;
|
|
199
|
-
entry.peakExternal = peakExternal;
|
|
200
|
-
entry.arrayBuffers = memoryUsageRaw.arrayBuffers;
|
|
201
|
-
entry.peakArrayBuffers = peakArrayBuffers;
|
|
202
|
-
setHistoryIndex((historyIndex + 1) % historySize);
|
|
203
|
-
// Show the cpu and memory usage
|
|
204
|
-
if (trace)
|
|
205
|
-
log.debug(`***${YELLOW}${BRIGHT}Host cpu:${db} ` +
|
|
206
|
-
`${CYAN}${formatCpuUsage(osCpuUsage)}${db} (peak ${formatCpuUsage(peakCpu)}) ` +
|
|
207
|
-
`${YELLOW}${BRIGHT}Process cpu:${db} ` +
|
|
208
|
-
`${CYAN}${formatCpuUsage(processCpuUsage)}${db} (peak ${formatCpuUsage(peakProcessCpu)}) ` +
|
|
209
|
-
`${YELLOW}${BRIGHT}Process memory:${db} ` +
|
|
210
|
-
`rss ${CYAN}${rss}${db} (peak ${formatMemoryUsage(peakRss)}) ` +
|
|
211
|
-
`heapUsed ${CYAN}${heapUsed}${db} (peak ${formatMemoryUsage(peakHeapUsed)}) ` +
|
|
212
|
-
`heapTotal ${CYAN}${heapTotal}${db} (peak ${formatMemoryUsage(peakHeapTotal)}) ` +
|
|
213
|
-
`external ${CYAN}${external}${db} (peak ${formatMemoryUsage(peakExternal)}) ` +
|
|
214
|
-
`arrayBuffers ${CYAN}${arrayBuffers}${db} (peak ${formatMemoryUsage(peakArrayBuffers)})`);
|
|
215
|
-
};
|
|
216
|
-
clearInterval(memoryCheckInterval);
|
|
217
|
-
memoryCheckInterval = setInterval(interval, memoryCheckIntervalMs).unref();
|
|
218
|
-
clearTimeout(memoryPeakResetTimeout);
|
|
219
|
-
// istanbul ignore next
|
|
220
|
-
memoryPeakResetTimeout = setTimeout(() => {
|
|
221
|
-
if (trace)
|
|
222
|
-
log.debug(`****${RED}${BRIGHT}Cpu and memory peaks reset after first 5 minutes.${db}`);
|
|
223
|
-
peakCpu = 0;
|
|
224
|
-
peakProcessCpu = 0;
|
|
225
|
-
peakRss = 0;
|
|
226
|
-
peakHeapUsed = 0;
|
|
227
|
-
peakHeapTotal = 0;
|
|
228
|
-
}, 5 * 60 * 1000).unref(); // Reset peaks every 5 minutes
|
|
229
26
|
}
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
log.debug(`***Cpu memory check stopped. ` +
|
|
236
|
-
`Peak cpu: ${CYAN}${peakCpu.toFixed(2)} %${db}. ` +
|
|
237
|
-
`Peak rss: ${CYAN}${formatMemoryUsage(peakRss)}${db}. ` +
|
|
238
|
-
`Peak heapUsed: ${CYAN}${formatMemoryUsage(peakHeapUsed)}${db}. ` +
|
|
239
|
-
`Peak heapTotal: ${CYAN}${formatMemoryUsage(peakHeapTotal)}${db}. ` +
|
|
240
|
-
`Peak external: ${CYAN}${formatMemoryUsage(peakExternal)}${db}. ` +
|
|
241
|
-
`Peak arrayBuffers: ${CYAN}${formatMemoryUsage(peakArrayBuffers)}${db}.`);
|
|
242
|
-
}
|
|
243
|
-
clearInterval(memoryCheckInterval);
|
|
244
|
-
clearTimeout(memoryPeakResetTimeout);
|
|
27
|
+
function stopCpuMemoryCheck() {
|
|
28
|
+
log.debug(`Cpu memory check stopping...`);
|
|
29
|
+
tracker.stop();
|
|
30
|
+
tracker.removeAllListeners();
|
|
31
|
+
log.debug(`Cpu memory check stopped`);
|
|
245
32
|
}
|
|
246
|
-
/**
|
|
247
|
-
* Starts the inspector for heap sampling.
|
|
248
|
-
* This function is called when the -inspect parameter is passed.
|
|
249
|
-
* The -snapshotinterval parameter can be used to set the heap snapshot interval. Default is undefined. Minimum is 30000 ms.
|
|
250
|
-
* The snapshot is saved in the heap_profile directory that is created in the current working directory.
|
|
251
|
-
* The snapshot can be analyzed using vscode or Chrome DevTools or other tools that support heap snapshots.
|
|
252
|
-
*
|
|
253
|
-
* @remarks To use the inspector, Node.js must be started with --inspect.
|
|
254
|
-
*/
|
|
255
33
|
async function startInspector() {
|
|
256
|
-
|
|
257
|
-
const { mkdirSync } = await import('node:fs');
|
|
258
|
-
log.debug(`***Starting heap sampling...`);
|
|
259
|
-
// Create the heap snapshots directory if it doesn't exist
|
|
260
|
-
mkdirSync('heap_profile', { recursive: true });
|
|
261
|
-
try {
|
|
262
|
-
session = new Session();
|
|
263
|
-
session.connect();
|
|
264
|
-
await new Promise((resolve, reject) => {
|
|
265
|
-
session?.post('HeapProfiler.startSampling', (err) => (err ? reject(err) : resolve()));
|
|
266
|
-
});
|
|
267
|
-
log.debug(`***Started heap sampling`);
|
|
268
|
-
// Set an interval to take heap snapshots
|
|
269
|
-
const interval = getIntParameter('snapshotinterval');
|
|
270
|
-
if (interval && interval >= 30000) {
|
|
271
|
-
log.debug(`***Started heap snapshot interval of ${CYAN}${interval}${db} ms`);
|
|
272
|
-
clearInterval(snapshotInterval);
|
|
273
|
-
snapshotInterval = setInterval(async () => {
|
|
274
|
-
log.debug(`Run heap snapshot interval`);
|
|
275
|
-
await takeHeapSnapshot();
|
|
276
|
-
}, interval).unref();
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
catch (err) {
|
|
280
|
-
log.error(`***Failed to start heap sampling: ${err instanceof Error ? err.message : err}`);
|
|
281
|
-
session?.disconnect();
|
|
282
|
-
session = undefined;
|
|
283
|
-
return;
|
|
284
|
-
}
|
|
34
|
+
await inspector.start();
|
|
285
35
|
}
|
|
286
|
-
/**
|
|
287
|
-
* Stops the heap sampling and saves the profile to a file.
|
|
288
|
-
* This function is called when the inspector is stopped.
|
|
289
|
-
*/
|
|
290
36
|
async function stopInspector() {
|
|
291
|
-
|
|
292
|
-
const path = await import('node:path');
|
|
293
|
-
log.debug(`***Stopping heap sampling...`);
|
|
294
|
-
if (snapshotInterval) {
|
|
295
|
-
log.debug(`***Clearing heap snapshot interval...`);
|
|
296
|
-
// Clear the snapshot interval if it exists
|
|
297
|
-
clearInterval(snapshotInterval);
|
|
298
|
-
// Take a final heap snapshot before stopping
|
|
299
|
-
await takeHeapSnapshot();
|
|
300
|
-
}
|
|
301
|
-
if (!session) {
|
|
302
|
-
log.error('***No active inspector session.');
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
try {
|
|
306
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
307
|
-
const result = await new Promise((resolve, reject) => {
|
|
308
|
-
session?.post('HeapProfiler.stopSampling', (err, result) => (err ? reject(err) : resolve(result)));
|
|
309
|
-
});
|
|
310
|
-
const profile = JSON.stringify(result.profile);
|
|
311
|
-
const filename = path.join('heap_profile', `Heap-profile-${new Date().toISOString().replace(/[:]/g, '-')}.heapprofile`);
|
|
312
|
-
writeFileSync(filename, profile);
|
|
313
|
-
log.debug(`***Heap sampling profile saved to ${CYAN}${filename}${db}`);
|
|
314
|
-
}
|
|
315
|
-
catch (err) {
|
|
316
|
-
log.error(`***Failed to stop heap sampling: ${err instanceof Error ? err.message : err}`);
|
|
317
|
-
}
|
|
318
|
-
finally {
|
|
319
|
-
session.disconnect();
|
|
320
|
-
session = undefined;
|
|
321
|
-
log.debug(`***Stopped heap sampling`);
|
|
322
|
-
}
|
|
37
|
+
await inspector.stop();
|
|
323
38
|
}
|
|
324
|
-
/**
|
|
325
|
-
* Takes a heap snapshot and saves it to the file name Heap-snapshot-<timestamp>.heapsnapshot.
|
|
326
|
-
* This function is called periodically based on the -snapshotinterval parameter.
|
|
327
|
-
* The -snapshotinterval parameter must at least 30000 ms.
|
|
328
|
-
* The snapshot is saved in the heap_profile directory that is created in the current working directory.
|
|
329
|
-
* The snapshot can be analyzed using vscode or Chrome DevTools or other tools that support heap snapshots.
|
|
330
|
-
*/
|
|
331
39
|
async function takeHeapSnapshot() {
|
|
332
|
-
|
|
333
|
-
const path = await import('node:path');
|
|
334
|
-
const filename = path.join('heap_profile', `Heap-snapshot-${new Date().toISOString().replace(/[:]/g, '-')}.heapsnapshot`);
|
|
335
|
-
if (!session) {
|
|
336
|
-
log.error('No active inspector session.');
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
// Trigger a garbage collection before taking the snapshot to reduce noise
|
|
340
|
-
triggerGarbageCollection();
|
|
341
|
-
log.debug(`Taking heap snapshot...`);
|
|
342
|
-
const chunks = [];
|
|
343
|
-
const chunksListener = (notification) => {
|
|
344
|
-
chunks.push(Buffer.from(notification.params.chunk));
|
|
345
|
-
};
|
|
346
|
-
session.on('HeapProfiler.addHeapSnapshotChunk', chunksListener);
|
|
347
|
-
await new Promise((resolve) => {
|
|
348
|
-
session?.post('HeapProfiler.takeHeapSnapshot', (err) => {
|
|
349
|
-
if (!err) {
|
|
350
|
-
session?.off('HeapProfiler.addHeapSnapshotChunk', chunksListener);
|
|
351
|
-
writeFileSync(filename, Buffer.concat(chunks));
|
|
352
|
-
chunks.length = 0; // Clear the chunks array
|
|
353
|
-
log.debug(`***Heap sampling snapshot saved to ${CYAN}${filename}${db}`);
|
|
354
|
-
// Trigger a garbage collection after the snapshot to clean up
|
|
355
|
-
triggerGarbageCollection();
|
|
356
|
-
resolve();
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
session?.off('HeapProfiler.addHeapSnapshotChunk', chunksListener);
|
|
360
|
-
chunks.length = 0; // Clear the chunks array
|
|
361
|
-
log.error(`***Failed to take heap snapshot: ${err instanceof Error ? err.message : err}`);
|
|
362
|
-
// Trigger a garbage collection after the snapshot to clean up
|
|
363
|
-
triggerGarbageCollection();
|
|
364
|
-
resolve();
|
|
365
|
-
}
|
|
366
|
-
});
|
|
367
|
-
});
|
|
40
|
+
await inspector.takeHeapSnapshot();
|
|
368
41
|
}
|
|
369
|
-
/**
|
|
370
|
-
* Triggers a manual garbage collection.
|
|
371
|
-
* This function is working only if the process is started with --expose_gc.
|
|
372
|
-
*
|
|
373
|
-
* @remarks To check the effect of the garbage collection, add --trace_gc or --trace_gc_verbose.
|
|
374
|
-
*/
|
|
375
42
|
function triggerGarbageCollection() {
|
|
376
|
-
|
|
377
|
-
try {
|
|
378
|
-
global.gc({ type: 'major', execution: 'sync' });
|
|
379
|
-
}
|
|
380
|
-
catch {
|
|
381
|
-
// istanbul ignore next
|
|
382
|
-
global.gc();
|
|
383
|
-
}
|
|
384
|
-
log.debug('Manual garbage collection triggered via global.gc().');
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
log.debug('Garbage collection is not exposed. Start Node.js with --expose-gc to enable manual GC.');
|
|
388
|
-
}
|
|
43
|
+
inspector.runGarbageCollector();
|
|
389
44
|
}
|
|
390
|
-
/**
|
|
391
|
-
* Registers event handlers for the Matterbridge instance.
|
|
392
|
-
*/
|
|
393
45
|
function registerHandlers() {
|
|
394
46
|
log.debug('Registering event handlers...');
|
|
395
|
-
if (instance)
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
instance.on('startinspector', async () => startInspector());
|
|
407
|
-
if (instance)
|
|
408
|
-
instance.on('stopinspector', async () => stopInspector());
|
|
409
|
-
if (instance)
|
|
410
|
-
instance.on('takeheapsnapshot', async () => takeHeapSnapshot());
|
|
411
|
-
if (instance)
|
|
412
|
-
instance.on('triggergarbagecollection', async () => triggerGarbageCollection());
|
|
47
|
+
if (!instance)
|
|
48
|
+
return;
|
|
49
|
+
instance.on('shutdown', () => shutdown());
|
|
50
|
+
instance.on('restart', () => restart());
|
|
51
|
+
instance.on('update', () => update());
|
|
52
|
+
instance.on('startmemorycheck', () => start());
|
|
53
|
+
instance.on('stopmemorycheck', () => stop());
|
|
54
|
+
instance.on('startinspector', () => startInspector());
|
|
55
|
+
instance.on('stopinspector', () => stopInspector());
|
|
56
|
+
instance.on('takeheapsnapshot', () => takeHeapSnapshot());
|
|
57
|
+
instance.on('triggergarbagecollection', () => triggerGarbageCollection());
|
|
413
58
|
log.debug('Registered event handlers');
|
|
414
59
|
}
|
|
415
|
-
/**
|
|
416
|
-
* Shuts down the Matterbridge instance and exits the process.
|
|
417
|
-
*/
|
|
418
60
|
async function shutdown() {
|
|
419
61
|
log.debug('Received shutdown event, exiting...');
|
|
420
62
|
if (hasParameter('inspect'))
|
|
421
63
|
await stopInspector();
|
|
422
|
-
|
|
64
|
+
stopCpuMemoryCheck();
|
|
423
65
|
cliEmitter.emit('shutdown');
|
|
424
|
-
// eslint-disable-next-line n/no-process-exit
|
|
425
66
|
process.exit(0);
|
|
426
67
|
}
|
|
427
|
-
/**
|
|
428
|
-
* Restarts the Matterbridge instance.
|
|
429
|
-
*/
|
|
430
68
|
async function restart() {
|
|
431
69
|
log.debug('Received restart event, loading...');
|
|
432
70
|
instance = await Matterbridge.loadInstance(true);
|
|
433
71
|
registerHandlers();
|
|
434
72
|
}
|
|
435
|
-
/**
|
|
436
|
-
* Updates the Matterbridge instance.
|
|
437
|
-
*/
|
|
438
73
|
async function update() {
|
|
439
74
|
log.debug('Received update event, updating...');
|
|
440
|
-
// TODO: Implement update logic outside of matterbridge
|
|
441
75
|
instance = await Matterbridge.loadInstance(true);
|
|
442
76
|
registerHandlers();
|
|
443
77
|
}
|
|
444
|
-
|
|
445
|
-
* Starts the CPU and memory check when the -startmemorycheck parameter is passed.
|
|
446
|
-
*/
|
|
447
|
-
async function start() {
|
|
78
|
+
function start() {
|
|
448
79
|
log.debug('Received start memory check event');
|
|
449
|
-
|
|
80
|
+
startCpuMemoryCheck();
|
|
450
81
|
}
|
|
451
|
-
|
|
452
|
-
* Stops the CPU and memory check when the -stopmemorycheck parameter is passed.
|
|
453
|
-
*/
|
|
454
|
-
async function stop() {
|
|
82
|
+
function stop() {
|
|
455
83
|
log.debug('Received stop memory check event');
|
|
456
|
-
|
|
84
|
+
stopCpuMemoryCheck();
|
|
457
85
|
}
|
|
458
|
-
/**
|
|
459
|
-
* Main function that initializes the Matterbridge instance and starts the CLI.
|
|
460
|
-
*
|
|
461
|
-
* @remarks
|
|
462
|
-
*
|
|
463
|
-
* Debug parameters:
|
|
464
|
-
*
|
|
465
|
-
* --debug enables debug logging.
|
|
466
|
-
*
|
|
467
|
-
* --loader enables loader logging.
|
|
468
|
-
*
|
|
469
|
-
* --trace enables cpu and memory logging and history logging on shutdown.
|
|
470
|
-
*
|
|
471
|
-
* --memoryinterval <milliseconds> can be used to set the CPU and memory check interval. Default is 10 seconds.
|
|
472
|
-
*
|
|
473
|
-
* --inspect enables the inspector for heap sampling.
|
|
474
|
-
*
|
|
475
|
-
* --snapshotinterval <milliseconds> can be used to set the heap snapshot interval. Default is undefined. Minimum is 30000 ms.
|
|
476
|
-
*/
|
|
477
86
|
async function main() {
|
|
478
87
|
log.debug(`Cli main() started`);
|
|
479
|
-
|
|
88
|
+
startCpuMemoryCheck();
|
|
480
89
|
if (hasParameter('inspect'))
|
|
481
90
|
await startInspector();
|
|
482
91
|
log.debug(`***Matterbridge.loadInstance(true) called`);
|
|
483
92
|
instance = await Matterbridge.loadInstance(true);
|
|
484
93
|
log.debug(`***Matterbridge.loadInstance(true) exited`);
|
|
485
|
-
// Check if the instance needs to shut down from parseCommandLine()
|
|
486
94
|
if (!instance || instance.shutdown) {
|
|
487
95
|
shutdown();
|
|
488
96
|
}
|
|
489
97
|
else {
|
|
490
98
|
registerHandlers();
|
|
491
99
|
cliEmitter.emit('ready');
|
|
100
|
+
log.debug(`Cli main() ready`);
|
|
492
101
|
}
|
|
493
102
|
}
|
|
494
|
-
|
|
495
|
-
|
|
103
|
+
if (hasAnyParameter('help', 'h'))
|
|
104
|
+
help();
|
|
105
|
+
if (hasAnyParameter('version', 'v'))
|
|
106
|
+
await version();
|
|
496
107
|
main().catch((error) => {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
log.error(`Matterbridge.loadInstance() failed with error: ${errorMessage}\nstack: ${errorInspect}`);
|
|
108
|
+
inspectError(log, 'Matterbridge.loadInstance() failed with error', error);
|
|
109
|
+
shutdown();
|
|
500
110
|
});
|
|
501
|
-
|
|
111
|
+
async function version() {
|
|
112
|
+
const { default: pkg } = await import('../package.json', { with: { type: 'json' } });
|
|
113
|
+
console.log(`Matterbridge version ${pkg.version}`);
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
function help() {
|
|
117
|
+
console.log(`
|
|
118
|
+
Usage: matterbridge [options] [command]
|
|
119
|
+
|
|
120
|
+
Commands:
|
|
121
|
+
--help: show the help
|
|
122
|
+
--version: show the version
|
|
123
|
+
--add [plugin path]: register the plugin from the given absolute or relative path
|
|
124
|
+
--add [plugin name]: register the globally installed plugin with the given name
|
|
125
|
+
--remove [plugin path]: remove the plugin from the given absolute or relative path
|
|
126
|
+
--remove [plugin name]: remove the globally installed plugin with the given name
|
|
127
|
+
--enable [plugin path]: enable the plugin from the given absolute or relative path
|
|
128
|
+
--enable [plugin name]: enable the globally installed plugin with the given name
|
|
129
|
+
--disable [plugin path]: disable the plugin from the given absolute or relative path
|
|
130
|
+
--disable [plugin name]: disable the globally installed plugin with the given name
|
|
131
|
+
|
|
132
|
+
Reset Commands:
|
|
133
|
+
--reset: remove the commissioning for Matterbridge (bridge mode and childbridge mode). Shutdown Matterbridge before using it!
|
|
134
|
+
--reset [plugin path]: remove the commissioning for the plugin from the given absolute or relative path (childbridge mode). Shutdown Matterbridge before using it!
|
|
135
|
+
--reset [plugin name]: remove the commissioning for the globally installed plugin (childbridge mode). Shutdown Matterbridge before using it!
|
|
136
|
+
--factoryreset: remove all commissioning information and reset all internal storages. Shutdown Matterbridge before using it!
|
|
137
|
+
|
|
138
|
+
Options:
|
|
139
|
+
--bridge: start Matterbridge in bridge mode
|
|
140
|
+
--childbridge: start Matterbridge in childbridge mode
|
|
141
|
+
--port [port]: start the matter commissioning server on the given port (default 5540)
|
|
142
|
+
--mdnsinterface [name]: set the interface to use for the matter server mdnsInterface (default all interfaces)
|
|
143
|
+
--ipv4address [address]: set the ipv4 interface address to use for the matter server listener (default all addresses)
|
|
144
|
+
--ipv6address [address]: set the ipv6 interface address to use for the matter server listener (default all addresses)
|
|
145
|
+
--frontend [port]: start the frontend on the given port (default 8283)
|
|
146
|
+
--logger: set the matterbridge logger level: debug | info | notice | warn | error | fatal (default info)
|
|
147
|
+
--filelogger: enable the matterbridge file logger (matterbridge.log)
|
|
148
|
+
--matterlogger: set the matter.js logger level: debug | info | notice | warn | error | fatal (default info)
|
|
149
|
+
--matterfilelogger: enable the matter.js file logger (matter.log)
|
|
150
|
+
--list: list the registered plugins
|
|
151
|
+
--loginterfaces: log the network interfaces (usefull for finding the name of the interface to use with -mdnsinterface option)
|
|
152
|
+
--logstorage: log the node storage
|
|
153
|
+
--sudo: force the use of sudo to install or update packages if the internal logic fails
|
|
154
|
+
--nosudo: force not to use sudo to install or update packages if the internal logic fails
|
|
155
|
+
--norestore: force not to automatically restore the matterbridge node storage and the matter storage from backup if it is corrupted
|
|
156
|
+
--novirtual: disable the creation of the virtual devices Restart, Update and Reboot Matterbridge
|
|
157
|
+
--ssl: enable SSL for the frontend and the WebSocketServer (the server will use the certificates and switch to https)
|
|
158
|
+
--mtls: enable mTLS for the frontend and the WebSocketServer (both server and client will use and require the certificates and switch to https)
|
|
159
|
+
--vendorId: override the default vendorId 0xfff1
|
|
160
|
+
--vendorName: override the default vendorName "Matterbridge"
|
|
161
|
+
--productId: override the default productId 0x8000
|
|
162
|
+
--productName: override the default productName "Matterbridge aggregator"
|
|
163
|
+
--service: enable the service mode (used in the linux systemctl configuration file and macOS launchctl plist)
|
|
164
|
+
--docker: enable the docker mode (used in the docker image)
|
|
165
|
+
--homedir: override the home directory (default the os homedir)
|
|
166
|
+
`);
|
|
167
|
+
process.exit(0);
|
|
168
|
+
}
|
package/dist/cliEmitter.js
CHANGED
|
@@ -1,49 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This file contains the CLI emitter.
|
|
3
|
-
*
|
|
4
|
-
* @file cliEmitter.ts
|
|
5
|
-
* @author Luca Liguori
|
|
6
|
-
* @created 2025-07-04
|
|
7
|
-
* @version 1.0.2
|
|
8
|
-
* @license Apache-2.0
|
|
9
|
-
*
|
|
10
|
-
* Copyright 2025, 2026, 2027 Luca Liguori.
|
|
11
|
-
*
|
|
12
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
-
* you may not use this file except in compliance with the License.
|
|
14
|
-
* You may obtain a copy of the License at
|
|
15
|
-
*
|
|
16
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
-
*
|
|
18
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
-
* See the License for the specific language governing permissions and
|
|
22
|
-
* limitations under the License.
|
|
23
|
-
*/
|
|
24
|
-
// eslint-disable-next-line no-console
|
|
25
1
|
if (process.argv.includes('--loader') || process.argv.includes('-loader'))
|
|
26
2
|
console.log('\u001B[32mCli emitter loaded.\u001B[40;0m');
|
|
27
3
|
import { EventEmitter } from 'node:events';
|
|
28
4
|
export const cliEmitter = new EventEmitter();
|
|
29
5
|
export let lastOsCpuUsage = 0;
|
|
30
6
|
export let lastProcessCpuUsage = 0;
|
|
31
|
-
/**
|
|
32
|
-
* Sets the last os CPU usage.
|
|
33
|
-
*
|
|
34
|
-
* @param {number} val - The os CPU usage percentage to set.
|
|
35
|
-
* @returns {void}
|
|
36
|
-
*/
|
|
37
7
|
export function setLastOsCpuUsage(val) {
|
|
38
8
|
lastOsCpuUsage = val;
|
|
39
9
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Sets the last process CPU usage.
|
|
42
|
-
*
|
|
43
|
-
* @param {number} val - The process CPU usage percentage to set.
|
|
44
|
-
* @returns {void}
|
|
45
|
-
*/
|
|
46
10
|
export function setLastProcessCpuUsage(val) {
|
|
47
11
|
lastProcessCpuUsage = val;
|
|
48
12
|
}
|
|
49
|
-
//# sourceMappingURL=cliEmitter.js.map
|