@matterbridge/core 3.6.0 → 3.6.1-dev-20260309-6341dee
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/dist/cli.d.ts +2 -1
- package/dist/cli.js +8 -1
- package/dist/cliHistory.js +1 -1
- package/dist/deviceManager.js +2 -2
- package/dist/frontend.js +8 -4
- package/dist/helpers.d.ts +1 -1
- package/dist/helpers.js +1 -1
- package/dist/jestutils/jestHelpers.d.ts +1 -1
- package/dist/jestutils/jestHelpers.js +14 -14
- package/dist/matterNode.js +6 -2
- package/dist/matterbridge.d.ts +1 -1
- package/dist/matterbridge.js +40 -36
- package/dist/matterbridgeEndpoint.js +2 -1
- package/dist/matterbridgeEndpointHelpers.js +3 -1
- package/dist/matterbridgePlatform.js +3 -2
- package/dist/pluginManager.js +3 -2
- package/dist/spawn.js +4 -4
- package/package.json +6 -6
package/dist/cli.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Inspector
|
|
1
|
+
import { Inspector } from '@matterbridge/utils/inspector';
|
|
2
|
+
import { Tracker } from '@matterbridge/utils/tracker';
|
|
2
3
|
import type { Matterbridge } from './matterbridge.js';
|
|
3
4
|
export declare let instance: Matterbridge | undefined;
|
|
4
5
|
export declare const tracker: Tracker;
|
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
if (process.argv.includes('--loader') || process.argv.includes('-loader'))
|
|
2
2
|
console.log('\u001B[32mCli loaded.\u001B[40;0m');
|
|
3
|
-
import {
|
|
3
|
+
import { ThreadsManager } from '@matterbridge/thread/manager';
|
|
4
|
+
import { hasAnyParameter, hasParameter } from '@matterbridge/utils/cli';
|
|
5
|
+
import { inspectError } from '@matterbridge/utils/error';
|
|
6
|
+
import { formatBytes, formatUptime } from '@matterbridge/utils/format';
|
|
7
|
+
import { Inspector } from '@matterbridge/utils/inspector';
|
|
8
|
+
import { Tracker } from '@matterbridge/utils/tracker';
|
|
4
9
|
import { AnsiLogger } from 'node-ansi-logger';
|
|
5
10
|
import { cliEmitter } from './cliEmitter.js';
|
|
6
11
|
export let instance;
|
|
7
12
|
export const tracker = new Tracker('Cli', false, false);
|
|
8
13
|
export const inspector = new Inspector('Cli', false, false);
|
|
14
|
+
const manager = new ThreadsManager();
|
|
9
15
|
if (process.argv.includes('--no-ansi') || process.argv.includes('-no-ansi'))
|
|
10
16
|
process.env.NO_COLOR = '1';
|
|
11
17
|
const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
|
|
@@ -59,6 +65,7 @@ async function shutdown() {
|
|
|
59
65
|
if (hasParameter('inspect'))
|
|
60
66
|
await stopInspector();
|
|
61
67
|
stopCpuMemoryCheck();
|
|
68
|
+
manager.destroy();
|
|
62
69
|
cliEmitter.emit('shutdown');
|
|
63
70
|
process.exit(0);
|
|
64
71
|
}
|
package/dist/cliHistory.js
CHANGED
|
@@ -3,7 +3,7 @@ if (process.argv.includes('--loader') || process.argv.includes('-loader'))
|
|
|
3
3
|
import { writeFileSync } from 'node:fs';
|
|
4
4
|
import os from 'node:os';
|
|
5
5
|
import path from 'node:path';
|
|
6
|
-
import { Tracker } from '@matterbridge/utils';
|
|
6
|
+
import { Tracker } from '@matterbridge/utils/tracker';
|
|
7
7
|
export function generateHistoryPage(options = {}) {
|
|
8
8
|
const pageTitle = options.pageTitle ?? 'Matterbridge CPU & Memory History';
|
|
9
9
|
const hostname = options.hostname ?? os.hostname();
|
package/dist/deviceManager.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
if (process.argv.includes('--loader') || process.argv.includes('-loader'))
|
|
2
2
|
console.log('\u001B[32mDevice Manager loaded.\u001B[40;0m');
|
|
3
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
3
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
4
4
|
import { dev } from '@matterbridge/types';
|
|
5
|
-
import { hasParameter } from '@matterbridge/utils';
|
|
5
|
+
import { hasParameter } from '@matterbridge/utils/cli';
|
|
6
6
|
import { AnsiLogger, BLUE, CYAN, db, debugStringify, er } from 'node-ansi-logger';
|
|
7
7
|
export function toBaseDevice(device) {
|
|
8
8
|
return {
|
package/dist/frontend.js
CHANGED
|
@@ -9,9 +9,14 @@ import { BridgedDeviceBasicInformation } from '@matter/types/clusters/bridged-de
|
|
|
9
9
|
import { PowerSource } from '@matter/types/clusters/power-source';
|
|
10
10
|
import { CommissioningOptions } from '@matter/types/commissioning';
|
|
11
11
|
import { FabricIndex } from '@matter/types/datatype';
|
|
12
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
12
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
13
13
|
import { MATTER_LOGGER_FILE, MATTER_STORAGE_NAME, MATTERBRIDGE_DIAGNOSTIC_FILE, MATTERBRIDGE_HISTORY_FILE, MATTERBRIDGE_LOGGER_FILE, NODE_STORAGE_DIR, plg, } from '@matterbridge/types';
|
|
14
|
-
import {
|
|
14
|
+
import { getParameter, hasParameter } from '@matterbridge/utils/cli';
|
|
15
|
+
import { inspectError } from '@matterbridge/utils/error';
|
|
16
|
+
import { formatBytes, formatPercent, formatUptime } from '@matterbridge/utils/format';
|
|
17
|
+
import { isValidArray, isValidBoolean, isValidNumber, isValidObject, isValidString } from '@matterbridge/utils/validate';
|
|
18
|
+
import { wait, withTimeout } from '@matterbridge/utils/wait';
|
|
19
|
+
import { createZip } from '@matterbridge/utils/zip';
|
|
15
20
|
import { AnsiLogger, CYAN, db, debugStringify, er, nf, nt, rs, stringify, UNDERLINE, UNDERLINEOFF, YELLOW } from 'node-ansi-logger';
|
|
16
21
|
import { cliEmitter, lastOsCpuUsage, lastProcessCpuUsage } from './cliEmitter.js';
|
|
17
22
|
import { generateHistoryPage } from './cliHistory.js';
|
|
@@ -1429,8 +1434,7 @@ export class Frontend extends EventEmitter {
|
|
|
1429
1434
|
}
|
|
1430
1435
|
}
|
|
1431
1436
|
else if (data.method === '/api/checkupdates') {
|
|
1432
|
-
|
|
1433
|
-
createESMWorker('CheckUpdates', this.matterbridge.resolveWorkerDistFilePath('workerCheckUpdates.js'));
|
|
1437
|
+
this.server.request({ type: 'manager_run', src: 'matterbridge', dst: 'manager', params: { name: 'CheckUpdates' } });
|
|
1434
1438
|
sendResponse({ id: data.id, method: data.method, src: 'Matterbridge', dst: data.src, success: true });
|
|
1435
1439
|
}
|
|
1436
1440
|
else if (data.method === '/api/shellysysupdate') {
|
package/dist/helpers.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Endpoint } from '@matter/node';
|
|
2
2
|
import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
|
|
3
|
-
import { Matterbridge } from './matterbridge.js';
|
|
3
|
+
import type { Matterbridge } from './matterbridge.js';
|
|
4
4
|
export declare function addVirtualDevice(aggregatorEndpoint: Endpoint<AggregatorEndpoint>, name: string, type: 'light' | 'outlet' | 'switch' | 'mounted_switch', callback: () => Promise<void>): Promise<Endpoint>;
|
|
5
5
|
export declare function addVirtualDevices(matterbridge: Matterbridge, aggregatorEndpoint: Endpoint<AggregatorEndpoint>): Promise<void>;
|
package/dist/helpers.js
CHANGED
|
@@ -12,7 +12,7 @@ import { OnOffPlugInUnitDevice } from '@matter/node/devices/on-off-plug-in-unit'
|
|
|
12
12
|
import { Identify } from '@matter/types/clusters/identify';
|
|
13
13
|
import { OnOff } from '@matter/types/clusters/on-off';
|
|
14
14
|
import { VendorId } from '@matter/types/datatype';
|
|
15
|
-
import { hasParameter } from '@matterbridge/utils';
|
|
15
|
+
import { hasParameter } from '@matterbridge/utils/cli';
|
|
16
16
|
export async function addVirtualDevice(aggregatorEndpoint, name, type, callback) {
|
|
17
17
|
let deviceType;
|
|
18
18
|
switch (type) {
|
|
@@ -5,7 +5,7 @@ import { AggregatorEndpoint } from '@matter/node/endpoints';
|
|
|
5
5
|
import { ColorControl } from '@matter/types/clusters/color-control';
|
|
6
6
|
import { LevelControl } from '@matter/types/clusters/level-control';
|
|
7
7
|
import { DeviceTypeId } from '@matter/types/datatype';
|
|
8
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
8
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
9
9
|
import { AnsiLogger } from 'node-ansi-logger';
|
|
10
10
|
import { DeviceManager } from '../deviceManager.js';
|
|
11
11
|
import { Frontend } from '../frontend.js';
|
|
@@ -7,7 +7,7 @@ import { AggregatorEndpoint } from '@matter/node/endpoints';
|
|
|
7
7
|
import { MdnsService } from '@matter/protocol';
|
|
8
8
|
import { ColorControl } from '@matter/types/clusters/color-control';
|
|
9
9
|
import { DeviceTypeId, VendorId } from '@matter/types/datatype';
|
|
10
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
10
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
11
11
|
import { MATTER_STORAGE_NAME, NODE_STORAGE_DIR } from '@matterbridge/types';
|
|
12
12
|
import { AnsiLogger, er, rs, UNDERLINE, UNDERLINEOFF } from 'node-ansi-logger';
|
|
13
13
|
import { NodeStorageManager } from 'node-persist-manager';
|
|
@@ -76,7 +76,7 @@ export async function setupTest(name, debug = false) {
|
|
|
76
76
|
expect(typeof name).toBe('string');
|
|
77
77
|
expect(name.length).toBeGreaterThanOrEqual(4);
|
|
78
78
|
NAME = name;
|
|
79
|
-
HOMEDIR = path.join('jest', name);
|
|
79
|
+
HOMEDIR = path.join('.cache', 'jest', name);
|
|
80
80
|
rmSync(HOMEDIR, { recursive: true, force: true });
|
|
81
81
|
const { jest } = await import('@jest/globals');
|
|
82
82
|
loggerDebugSpy = jest.spyOn(AnsiLogger.prototype, 'debug');
|
|
@@ -182,10 +182,10 @@ export async function startMatterbridge(bridgeMode = 'bridge', frontendPort = 82
|
|
|
182
182
|
expect(matterbridge.initialized).toBeTruthy();
|
|
183
183
|
expect(matterbridge.log).toBeDefined();
|
|
184
184
|
expect(matterbridge.rootDirectory).toBe(path.resolve('./'));
|
|
185
|
-
expect(matterbridge.homeDirectory).toBe(path.join(
|
|
186
|
-
expect(matterbridge.matterbridgeDirectory).toBe(path.join(
|
|
187
|
-
expect(matterbridge.matterbridgePluginDirectory).toBe(path.join(
|
|
188
|
-
expect(matterbridge.matterbridgeCertDirectory).toBe(path.join(
|
|
185
|
+
expect(matterbridge.homeDirectory).toBe(path.join(HOMEDIR));
|
|
186
|
+
expect(matterbridge.matterbridgeDirectory).toBe(path.join(HOMEDIR, '.matterbridge'));
|
|
187
|
+
expect(matterbridge.matterbridgePluginDirectory).toBe(path.join(HOMEDIR, 'Matterbridge'));
|
|
188
|
+
expect(matterbridge.matterbridgeCertDirectory).toBe(path.join(HOMEDIR, '.mattercert'));
|
|
189
189
|
expect(plugins).toBeDefined();
|
|
190
190
|
expect(plugins.size).toBe(pluginSize);
|
|
191
191
|
expect(devices).toBeDefined();
|
|
@@ -255,13 +255,13 @@ export async function createMatterbridgeEnvironment(name, createOnly = false) {
|
|
|
255
255
|
matterbridge = await Matterbridge.loadInstance(false);
|
|
256
256
|
expect(matterbridge).toBeDefined();
|
|
257
257
|
expect(matterbridge).toBeInstanceOf(Matterbridge);
|
|
258
|
-
matterbridge.matterbridgeVersion = '3.6.
|
|
258
|
+
matterbridge.matterbridgeVersion = '3.6.1';
|
|
259
259
|
matterbridge.bridgeMode = 'bridge';
|
|
260
|
-
matterbridge.rootDirectory = path.join(
|
|
261
|
-
matterbridge.homeDirectory = path.join(
|
|
262
|
-
matterbridge.matterbridgeDirectory = path.join(
|
|
263
|
-
matterbridge.matterbridgePluginDirectory = path.join(
|
|
264
|
-
matterbridge.matterbridgeCertDirectory = path.join(
|
|
260
|
+
matterbridge.rootDirectory = path.join(HOMEDIR);
|
|
261
|
+
matterbridge.homeDirectory = path.join(HOMEDIR);
|
|
262
|
+
matterbridge.matterbridgeDirectory = path.join(HOMEDIR, '.matterbridge');
|
|
263
|
+
matterbridge.matterbridgePluginDirectory = path.join(HOMEDIR, 'Matterbridge');
|
|
264
|
+
matterbridge.matterbridgeCertDirectory = path.join(HOMEDIR, '.mattercert');
|
|
265
265
|
matterbridge.log.logLevel = "debug";
|
|
266
266
|
frontend = matterbridge.frontend;
|
|
267
267
|
plugins = matterbridge.plugins;
|
|
@@ -387,11 +387,11 @@ export function createTestEnvironment(name, createOnly = false) {
|
|
|
387
387
|
expect(typeof name).toBe('string');
|
|
388
388
|
expect(name.length).toBeGreaterThanOrEqual(4);
|
|
389
389
|
log = new AnsiLogger({ logName: name, logTimestampFormat: 4, logLevel: "debug" });
|
|
390
|
-
rmSync(path.join(
|
|
390
|
+
rmSync(path.join(HOMEDIR), { recursive: true, force: true });
|
|
391
391
|
environment = Environment.default;
|
|
392
392
|
environment.vars.set('log.level', MatterLogLevel.DEBUG);
|
|
393
393
|
environment.vars.set('log.format', MatterLogFormat.ANSI);
|
|
394
|
-
environment.vars.set('path.root', path.join(
|
|
394
|
+
environment.vars.set('path.root', path.join(HOMEDIR, '.matterbridge', MATTER_STORAGE_NAME));
|
|
395
395
|
environment.vars.set('runtime.signals', false);
|
|
396
396
|
environment.vars.set('runtime.exitcode', false);
|
|
397
397
|
if (createOnly)
|
package/dist/matterNode.js
CHANGED
|
@@ -9,9 +9,13 @@ import { BridgedDeviceBasicInformationServer } from '@matter/node/behaviors/brid
|
|
|
9
9
|
import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
|
|
10
10
|
import { MdnsService } from '@matter/protocol';
|
|
11
11
|
import { DeviceTypeId, VendorId } from '@matter/types';
|
|
12
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
12
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
13
13
|
import { dev, MATTER_LOGGER_FILE, MATTER_STORAGE_NAME, MATTERBRIDGE_LOGGER_FILE, NODE_STORAGE_DIR, plg } from '@matterbridge/types';
|
|
14
|
-
import {
|
|
14
|
+
import { getIntParameter, getParameter, hasParameter } from '@matterbridge/utils/cli';
|
|
15
|
+
import { copyDirectory } from '@matterbridge/utils/copy-dir';
|
|
16
|
+
import { inspectError } from '@matterbridge/utils/error';
|
|
17
|
+
import { isValidNumber, isValidString, parseVersionString } from '@matterbridge/utils/validate';
|
|
18
|
+
import { wait, withTimeout } from '@matterbridge/utils/wait';
|
|
15
19
|
import { AnsiLogger, BLUE, CYAN, db, debugStringify, er, nf, or, zb } from 'node-ansi-logger';
|
|
16
20
|
import { NodeStorageManager } from 'node-persist-manager';
|
|
17
21
|
import { toBaseDevice } from './deviceManager.js';
|
package/dist/matterbridge.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import '@matter/nodejs';
|
|
|
2
2
|
import EventEmitter from 'node:events';
|
|
3
3
|
import { StorageContext, StorageManager, StorageService } from '@matter/general';
|
|
4
4
|
import { Endpoint, ServerNode } from '@matter/node';
|
|
5
|
-
import { AggregatorEndpoint } from '@matter/node/endpoints';
|
|
5
|
+
import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
|
|
6
6
|
import { DeviceCertification } from '@matter/protocol';
|
|
7
7
|
import { DeviceTypeId, VendorId } from '@matter/types/datatype';
|
|
8
8
|
import type { ApiMatter, MaybePromise, PlatformMatterbridge, SharedMatterbridge, SystemInformation } from '@matterbridge/types';
|
package/dist/matterbridge.js
CHANGED
|
@@ -10,12 +10,17 @@ import { inspect } from 'node:util';
|
|
|
10
10
|
import { Crypto, Environment, LogFormat as MatterLogFormat, Logger, LogLevel as MatterLogLevel, StorageService, UINT16_MAX, UINT32_MAX, } from '@matter/general';
|
|
11
11
|
import { Endpoint, NetworkClient, ServerNode } from '@matter/node';
|
|
12
12
|
import { BasicInformationClient, BasicInformationServer } from '@matter/node/behaviors/basic-information';
|
|
13
|
-
import { AggregatorEndpoint } from '@matter/node/endpoints';
|
|
13
|
+
import { AggregatorEndpoint } from '@matter/node/endpoints/aggregator';
|
|
14
14
|
import { PaseClient, Read, Subscribe } from '@matter/protocol';
|
|
15
15
|
import { DeviceTypeId, VendorId } from '@matter/types/datatype';
|
|
16
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
16
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
17
17
|
import { dev, MATTER_LOGGER_FILE, MATTER_STORAGE_NAME, MATTERBRIDGE_LOGGER_FILE, NODE_STORAGE_DIR, plg, typ } from '@matterbridge/types';
|
|
18
|
-
import {
|
|
18
|
+
import { getIntParameter, getParameter, hasParameter } from '@matterbridge/utils/cli';
|
|
19
|
+
import { copyDirectory } from '@matterbridge/utils/copy-dir';
|
|
20
|
+
import { createDirectory } from '@matterbridge/utils/create-dir';
|
|
21
|
+
import { formatBytes, formatPercent, formatUptime } from '@matterbridge/utils/format';
|
|
22
|
+
import { excludedInterfaceNamePattern } from '@matterbridge/utils/network';
|
|
23
|
+
import { isValidNumber, isValidObject, isValidString, parseVersionString } from '@matterbridge/utils/validate';
|
|
19
24
|
import { AnsiLogger, BLUE, BRIGHT, CYAN, db, debugStringify, er, GREEN, nf, nt, or, RED, RESET, rs, UNDERLINE, UNDERLINEOFF, wr, zb, } from 'node-ansi-logger';
|
|
20
25
|
import { NodeStorageManager } from 'node-persist-manager';
|
|
21
26
|
import { DeviceManager } from './deviceManager.js';
|
|
@@ -353,7 +358,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
353
358
|
this.log.info(`Pairing file ${CYAN}${pairingFilePath}${nf} found. Using passcode ${CYAN}${this.passcode}${nf} and discriminator ${CYAN}${this.discriminator}${nf} from pairing file.`);
|
|
354
359
|
}
|
|
355
360
|
if (pairingFileJson.privateKey && pairingFileJson.certificate && pairingFileJson.intermediateCertificate && pairingFileJson.declaration) {
|
|
356
|
-
const { hexToBuffer } = await import('@matterbridge/utils');
|
|
361
|
+
const { hexToBuffer } = await import('@matterbridge/utils/hex');
|
|
357
362
|
this.certification = {
|
|
358
363
|
privateKey: hexToBuffer(pairingFileJson.privateKey),
|
|
359
364
|
certificate: hexToBuffer(pairingFileJson.certificate),
|
|
@@ -401,6 +406,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
401
406
|
this.logLevel = this.log.logLevel;
|
|
402
407
|
this.frontend.logLevel = this.log.logLevel;
|
|
403
408
|
MatterbridgeEndpoint.logLevel = this.log.logLevel;
|
|
409
|
+
this.server.request({ type: 'set_log_level', params: { logLevel: this.log.logLevel }, dst: 'all', src: 'matterbridge' });
|
|
404
410
|
if (hasParameter('filelogger') || (await this.nodeContext.get('matterbridgeFileLog', false))) {
|
|
405
411
|
AnsiLogger.setGlobalLogfile(path.join(this.matterbridgeDirectory, MATTERBRIDGE_LOGGER_FILE), this.log.logLevel, true);
|
|
406
412
|
this.fileLogger = true;
|
|
@@ -637,7 +643,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
637
643
|
return;
|
|
638
644
|
}
|
|
639
645
|
if (hasParameter('loginterfaces')) {
|
|
640
|
-
const { logInterfaces } = await import('@matterbridge/utils');
|
|
646
|
+
const { logInterfaces } = await import('@matterbridge/utils/network');
|
|
641
647
|
logInterfaces();
|
|
642
648
|
this.shutdown = true;
|
|
643
649
|
return;
|
|
@@ -725,18 +731,15 @@ export class Matterbridge extends EventEmitter {
|
|
|
725
731
|
}
|
|
726
732
|
clearTimeout(this.systemCheckTimeout);
|
|
727
733
|
this.systemCheckTimeout = setTimeout(async () => {
|
|
728
|
-
|
|
729
|
-
createESMWorker('SystemCheck', this.resolveWorkerDistFilePath('workerSystemCheck.js'));
|
|
734
|
+
this.server.request({ type: 'manager_run', src: 'matterbridge', dst: 'manager', params: { name: 'SystemCheck' } });
|
|
730
735
|
}, 120 * 1000).unref();
|
|
731
736
|
clearTimeout(this.checkUpdateTimeout);
|
|
732
737
|
this.checkUpdateTimeout = setTimeout(async () => {
|
|
733
|
-
|
|
734
|
-
createESMWorker('CheckUpdates', this.resolveWorkerDistFilePath('workerCheckUpdates.js'));
|
|
738
|
+
this.server.request({ type: 'manager_run', src: 'matterbridge', dst: 'manager', params: { name: 'CheckUpdates' } });
|
|
735
739
|
}, 300 * 1000).unref();
|
|
736
740
|
clearInterval(this.checkUpdateInterval);
|
|
737
741
|
this.checkUpdateInterval = setInterval(async () => {
|
|
738
|
-
|
|
739
|
-
createESMWorker('CheckUpdates', this.resolveWorkerDistFilePath('workerCheckUpdates.js'));
|
|
742
|
+
this.server.request({ type: 'manager_run', src: 'matterbridge', dst: 'manager', params: { name: 'CheckUpdates' } });
|
|
740
743
|
}, 12 * 60 * 60 * 1000).unref();
|
|
741
744
|
if (hasParameter('test')) {
|
|
742
745
|
this.bridgeMode = 'bridge';
|
|
@@ -752,13 +755,13 @@ export class Matterbridge extends EventEmitter {
|
|
|
752
755
|
await this.nodeContext?.set('bridgeMode', 'bridge');
|
|
753
756
|
}
|
|
754
757
|
if (hasParameter('delay') && os.uptime() <= 60 * 5) {
|
|
755
|
-
const { wait } = await import('@matterbridge/utils');
|
|
758
|
+
const { wait } = await import('@matterbridge/utils/wait');
|
|
756
759
|
const delay = getIntParameter('delay') || 120;
|
|
757
760
|
this.log.warn('Delay switch found with system uptime less then 5 minutes. Waiting for ' + delay + ' seconds before starting matterbridge...');
|
|
758
761
|
await wait(delay * 1000, 'Race condition delay', true);
|
|
759
762
|
}
|
|
760
763
|
if (hasParameter('fixed_delay')) {
|
|
761
|
-
const { wait } = await import('@matterbridge/utils');
|
|
764
|
+
const { wait } = await import('@matterbridge/utils/wait');
|
|
762
765
|
const delay = getIntParameter('fixed_delay') || 120;
|
|
763
766
|
this.log.warn('Fixed delay switch found. Waiting for ' + delay + ' seconds before starting matterbridge...');
|
|
764
767
|
await wait(delay * 1000, 'Fixed race condition delay', true);
|
|
@@ -926,7 +929,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
926
929
|
if (this.globalModulesDirectory === '') {
|
|
927
930
|
this.log.debug(`Getting global node_modules directory...`);
|
|
928
931
|
try {
|
|
929
|
-
const { getGlobalNodeModules } = await import('@matterbridge/utils');
|
|
932
|
+
const { getGlobalNodeModules } = await import('@matterbridge/utils/npm-prefix');
|
|
930
933
|
this.globalModulesDirectory = await getGlobalNodeModules();
|
|
931
934
|
this.log.debug(`Global node_modules Directory: ${this.globalModulesDirectory}`);
|
|
932
935
|
await this.nodeContext?.set('globalModulesDirectory', this.globalModulesDirectory);
|
|
@@ -936,8 +939,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
936
939
|
}
|
|
937
940
|
}
|
|
938
941
|
else {
|
|
939
|
-
|
|
940
|
-
createESMWorker('NpmGlobalPrefix', this.resolveWorkerDistFilePath('workerGlobalPrefix.js'));
|
|
942
|
+
this.server.request({ type: 'manager_run', src: 'matterbridge', dst: 'manager', params: { name: 'GlobalPrefix' } });
|
|
941
943
|
}
|
|
942
944
|
this.log.debug(`Reading matterbridge package.json...`);
|
|
943
945
|
const packageJson = JSON.parse(await fs.promises.readFile(path.join(this.rootDirectory, 'package.json'), 'utf-8'));
|
|
@@ -1035,7 +1037,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
1035
1037
|
await this.cleanup('updating...', false);
|
|
1036
1038
|
}
|
|
1037
1039
|
async unregisterAndShutdownProcess(timeout = 1000) {
|
|
1038
|
-
const { wait } = await import('@matterbridge/utils');
|
|
1040
|
+
const { wait } = await import('@matterbridge/utils/wait');
|
|
1039
1041
|
this.log.info('Unregistering all devices and shutting down...');
|
|
1040
1042
|
if (this.serverNode)
|
|
1041
1043
|
await this.serverNode.setStateOf(BasicInformationServer, { configurationVersion: this.serverNode.state.basicInformation.configurationVersion + 1 });
|
|
@@ -1107,7 +1109,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
1107
1109
|
}
|
|
1108
1110
|
this.log.notice(`Stopping matter server nodes in ${this.bridgeMode} mode...`);
|
|
1109
1111
|
if (pause > 0) {
|
|
1110
|
-
const { wait } = await import('@matterbridge/utils');
|
|
1112
|
+
const { wait } = await import('@matterbridge/utils/wait');
|
|
1111
1113
|
this.log.debug(`Waiting ${pause}ms for the MessageExchange to finish...`);
|
|
1112
1114
|
await wait(pause, `Waiting ${pause}ms for the MessageExchange to finish...`, false);
|
|
1113
1115
|
}
|
|
@@ -1174,20 +1176,22 @@ export class Matterbridge extends EventEmitter {
|
|
|
1174
1176
|
catch {
|
|
1175
1177
|
}
|
|
1176
1178
|
}
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
this.
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1179
|
+
if (getParameter('reset-sessions')) {
|
|
1180
|
+
this.log.debug(`Cleaning matter storage context for ${GREEN}Matterbridge${db}...`);
|
|
1181
|
+
unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, 'Matterbridge', 'sessions.resumptionRecords'), this.log);
|
|
1182
|
+
unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, 'Matterbridge', 'root.subscriptions.subscriptions'), this.log);
|
|
1183
|
+
for (const plugin of this.plugins.array()) {
|
|
1184
|
+
this.log.debug(`Cleaning matter storage context for plugin ${plg}${plugin.name}${db}...`);
|
|
1185
|
+
unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, plugin.name, 'sessions.resumptionRecords'), this.log);
|
|
1186
|
+
unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, plugin.name, 'root.subscriptions.subscriptions'), this.log);
|
|
1187
|
+
}
|
|
1188
|
+
for (const device of this.devices.array().filter((d) => d.mode === 'server')) {
|
|
1189
|
+
if (!device.deviceName)
|
|
1190
|
+
continue;
|
|
1191
|
+
this.log.debug(`Cleaning matter storage context for server node device ${dev}${device.deviceName}${db}...`);
|
|
1192
|
+
unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, device.deviceName.replace(/[ .]/g, ''), 'sessions.resumptionRecords'), this.log);
|
|
1193
|
+
unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, device.deviceName.replace(/[ .]/g, ''), 'root.subscriptions.subscriptions'), this.log);
|
|
1194
|
+
}
|
|
1191
1195
|
}
|
|
1192
1196
|
await this.frontend.stop();
|
|
1193
1197
|
this.frontend.destroy();
|
|
@@ -1363,7 +1367,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
1363
1367
|
async startChildbridge(delay = 1000) {
|
|
1364
1368
|
if (!this.matterStorageManager)
|
|
1365
1369
|
throw new Error('No storage manager initialized');
|
|
1366
|
-
const { wait } = await import('@matterbridge/utils');
|
|
1370
|
+
const { wait } = await import('@matterbridge/utils/wait');
|
|
1367
1371
|
this.log.debug('Loading all plugins in childbridge mode...');
|
|
1368
1372
|
await this.startPlugins(true, false);
|
|
1369
1373
|
this.log.debug('Creating server nodes for DynamicPlatform plugins and starting all plugins in childbridge mode...');
|
|
@@ -1947,7 +1951,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
1947
1951
|
await matterServerNode.start();
|
|
1948
1952
|
}
|
|
1949
1953
|
async stopServerNode(matterServerNode, timeout = 10000) {
|
|
1950
|
-
const { withTimeout } = await import('@matterbridge/utils');
|
|
1954
|
+
const { withTimeout } = await import('@matterbridge/utils/wait');
|
|
1951
1955
|
if (!matterServerNode)
|
|
1952
1956
|
return;
|
|
1953
1957
|
this.log.notice(`Closing ${matterServerNode.id} server node`);
|
|
@@ -2006,7 +2010,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
2006
2010
|
}
|
|
2007
2011
|
}
|
|
2008
2012
|
async addBridgedEndpoint(pluginName, device) {
|
|
2009
|
-
const { waiter } = await import('@matterbridge/utils');
|
|
2013
|
+
const { waiter } = await import('@matterbridge/utils/wait');
|
|
2010
2014
|
const plugin = this.plugins.get(pluginName);
|
|
2011
2015
|
if (!plugin) {
|
|
2012
2016
|
this.log.error(`Error adding bridged endpoint ${dev}${device.deviceName}${er} (${zb}${device.id}${er}) plugin ${plg}${pluginName}${er} not found`);
|
|
@@ -2147,7 +2151,7 @@ export class Matterbridge extends EventEmitter {
|
|
|
2147
2151
|
this.devices.remove(device);
|
|
2148
2152
|
}
|
|
2149
2153
|
async removeAllBridgedEndpoints(pluginName, delay = 0) {
|
|
2150
|
-
const { wait } = await import('@matterbridge/utils');
|
|
2154
|
+
const { wait } = await import('@matterbridge/utils/wait');
|
|
2151
2155
|
this.log.debug(`Removing all bridged endpoints for plugin ${plg}${pluginName}${db}${delay > 0 ? ` with delay ${delay} ms` : ''}`);
|
|
2152
2156
|
for (const device of this.devices.array().filter((device) => device.plugin === pluginName)) {
|
|
2153
2157
|
await this.removeBridgedEndpoint(pluginName, device);
|
|
@@ -59,7 +59,8 @@ import { ThermostatUserInterfaceConfiguration } from '@matter/types/clusters/the
|
|
|
59
59
|
import { ValveConfigurationAndControl } from '@matter/types/clusters/valve-configuration-and-control';
|
|
60
60
|
import { WindowCovering } from '@matter/types/clusters/window-covering';
|
|
61
61
|
import { VendorId } from '@matter/types/datatype';
|
|
62
|
-
import { inspectError
|
|
62
|
+
import { inspectError } from '@matterbridge/utils/error';
|
|
63
|
+
import { isValidNumber, isValidObject, isValidString } from '@matterbridge/utils/validate';
|
|
63
64
|
import { AnsiLogger, CYAN, db, debugStringify, hk, or, YELLOW, zb } from 'node-ansi-logger';
|
|
64
65
|
import { MatterbridgeActivatedCarbonFilterMonitoringServer, MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeEnhancedColorControlServer, MatterbridgeFanControlServer, MatterbridgeHepaFilterMonitoringServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeLiftTiltWindowCoveringServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgePresetThermostatServer, MatterbridgeServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeSwitchServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, } from './matterbridgeBehaviors.js';
|
|
65
66
|
import { addClusterServers, addFixedLabel, addOptionalClusterServers, addRequiredClusterServers, addUserLabel, checkNotLatinCharacters, createUniqueId, featuresFor, generateUniqueId, getApparentElectricalPowerMeasurementClusterServer, getAttribute, getAttributeId, getBehavior, getBehaviourTypesFromClusterClientIds, getBehaviourTypesFromClusterServerIds, getCluster, getClusterId, getDefaultDeviceEnergyManagementClusterServer, getDefaultDeviceEnergyManagementModeClusterServer, getDefaultElectricalEnergyMeasurementClusterServer, getDefaultElectricalPowerMeasurementClusterServer, getDefaultFlowMeasurementClusterServer, getDefaultIlluminanceMeasurementClusterServer, getDefaultOccupancySensingClusterServer, getDefaultOperationalStateClusterServer, getDefaultPowerSourceBatteryClusterServer, getDefaultPowerSourceRechargeableBatteryClusterServer, getDefaultPowerSourceReplaceableBatteryClusterServer, getDefaultPowerSourceWiredClusterServer, getDefaultPressureMeasurementClusterServer, getDefaultRelativeHumidityMeasurementClusterServer, getDefaultTemperatureMeasurementClusterServer, invokeBehaviorCommand, lowercaseFirstLetter, setAttribute, setCluster, subscribeAttribute, triggerEvent, updateAttribute, } from './matterbridgeEndpointHelpers.js';
|
|
@@ -79,7 +79,9 @@ import { UserLabel } from '@matter/types/clusters/user-label';
|
|
|
79
79
|
import { ValveConfigurationAndControl } from '@matter/types/clusters/valve-configuration-and-control';
|
|
80
80
|
import { WindowCovering } from '@matter/types/clusters/window-covering';
|
|
81
81
|
import { MeasurementType } from '@matter/types/globals';
|
|
82
|
-
import { deepCopy
|
|
82
|
+
import { deepCopy } from '@matterbridge/utils/deep-copy';
|
|
83
|
+
import { deepEqual } from '@matterbridge/utils/deep-equal';
|
|
84
|
+
import { isValidArray } from '@matterbridge/utils/validate';
|
|
83
85
|
import { BLUE, CYAN, db, debugStringify, er, hk, or, YELLOW, zb } from 'node-ansi-logger';
|
|
84
86
|
import { MatterbridgeBooleanStateConfigurationServer, MatterbridgeColorControlServer, MatterbridgeDeviceEnergyManagementModeServer, MatterbridgeDeviceEnergyManagementServer, MatterbridgeDoorLockServer, MatterbridgeFanControlServer, MatterbridgeIdentifyServer, MatterbridgeLevelControlServer, MatterbridgeLiftWindowCoveringServer, MatterbridgeModeSelectServer, MatterbridgeOnOffServer, MatterbridgeOperationalStateServer, MatterbridgePowerSourceServer, MatterbridgeSmokeCoAlarmServer, MatterbridgeThermostatServer, MatterbridgeValveConfigurationAndControlServer, } from './matterbridgeBehaviors.js';
|
|
85
87
|
export function capitalizeFirstLetter(name) {
|
|
@@ -3,8 +3,9 @@ if (process.argv.includes('--loader') || process.argv.includes('-loader'))
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { BridgedDeviceBasicInformation } from '@matter/types/clusters/bridged-device-basic-information';
|
|
5
5
|
import { Descriptor } from '@matter/types/clusters/descriptor';
|
|
6
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
7
|
-
import { hasParameter
|
|
6
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
7
|
+
import { hasParameter } from '@matterbridge/utils/cli';
|
|
8
|
+
import { isValidArray, isValidObject, isValidString } from '@matterbridge/utils/validate';
|
|
8
9
|
import { CYAN, db, er, nf, wr } from 'node-ansi-logger';
|
|
9
10
|
import { NodeStorageManager } from 'node-persist-manager';
|
|
10
11
|
import { bridgedNode } from './matterbridgeDeviceTypes.js';
|
package/dist/pluginManager.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
if (process.argv.includes('--loader') || process.argv.includes('-loader'))
|
|
2
2
|
console.log('\u001B[32mPlugin Manager loaded.\u001B[40;0m');
|
|
3
3
|
import EventEmitter from 'node:events';
|
|
4
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
4
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
5
5
|
import { plg, typ } from '@matterbridge/types';
|
|
6
|
-
import { hasParameter
|
|
6
|
+
import { hasParameter } from '@matterbridge/utils/cli';
|
|
7
|
+
import { inspectError, logError } from '@matterbridge/utils/error';
|
|
7
8
|
import { AnsiLogger, BLUE, CYAN, db, debugStringify, er, nf, nt, rs, UNDERLINE, UNDERLINEOFF, wr } from 'node-ansi-logger';
|
|
8
9
|
import { isMatterbridgeAccessoryPlatform } from './matterbridgeAccessoryPlatform.js';
|
|
9
10
|
import { isMatterbridgeDynamicPlatform } from './matterbridgeDynamicPlatform.js';
|
package/dist/spawn.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { BroadcastServer } from '@matterbridge/thread';
|
|
2
|
-
import { hasParameter } from '@matterbridge/utils';
|
|
1
|
+
import { BroadcastServer } from '@matterbridge/thread/server';
|
|
2
|
+
import { hasParameter } from '@matterbridge/utils/cli';
|
|
3
3
|
import { AnsiLogger } from 'node-ansi-logger';
|
|
4
4
|
export async function spawnCommand(command, args, packageCommand, packageName) {
|
|
5
5
|
const { spawn } = await import('node:child_process');
|
|
6
|
-
const debug = hasParameter('debug') || hasParameter('verbose');
|
|
7
|
-
const verbose = hasParameter('verbose');
|
|
6
|
+
const debug = hasParameter('debug') || hasParameter('verbose') || hasParameter('debug-spawn') || hasParameter('verbose-spawn');
|
|
7
|
+
const verbose = hasParameter('verbose') || hasParameter('verbose-spawn');
|
|
8
8
|
const log = new AnsiLogger({ logName: 'Spawn', logTimestampFormat: 4, logLevel: debug ? "debug" : "info" });
|
|
9
9
|
const server = new BroadcastServer('spawn', log);
|
|
10
10
|
const sendLog = (name, message) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matterbridge/core",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.1-dev-20260309-6341dee",
|
|
4
4
|
"description": "Matterbridge core library",
|
|
5
5
|
"author": "https://github.com/Luligu",
|
|
6
6
|
"homepage": "https://matterbridge.io/",
|
|
@@ -122,14 +122,14 @@
|
|
|
122
122
|
],
|
|
123
123
|
"dependencies": {
|
|
124
124
|
"@matter/main": "0.16.10",
|
|
125
|
-
"@matterbridge/dgram": "3.6.
|
|
126
|
-
"@matterbridge/thread": "3.6.
|
|
127
|
-
"@matterbridge/types": "3.6.
|
|
128
|
-
"@matterbridge/utils": "3.6.
|
|
125
|
+
"@matterbridge/dgram": "3.6.1-dev-20260309-6341dee",
|
|
126
|
+
"@matterbridge/thread": "3.6.1-dev-20260309-6341dee",
|
|
127
|
+
"@matterbridge/types": "3.6.1-dev-20260309-6341dee",
|
|
128
|
+
"@matterbridge/utils": "3.6.1-dev-20260309-6341dee",
|
|
129
129
|
"archiver": "7.0.1",
|
|
130
130
|
"express": "5.2.1",
|
|
131
131
|
"glob": "13.0.6",
|
|
132
|
-
"multer": "2.1.
|
|
132
|
+
"multer": "2.1.1",
|
|
133
133
|
"node-ansi-logger": "3.2.0",
|
|
134
134
|
"node-persist-manager": "2.0.1",
|
|
135
135
|
"ws": "8.19.0"
|