@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 CHANGED
@@ -1,4 +1,5 @@
1
- import { Inspector, Tracker } from '@matterbridge/utils';
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 { formatBytes, formatUptime, hasAnyParameter, hasParameter, inspectError, Inspector, Tracker } from '@matterbridge/utils';
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
  }
@@ -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();
@@ -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 { createZip, formatBytes, formatPercent, formatUptime, getParameter, hasParameter, inspectError, isValidArray, isValidBoolean, isValidNumber, isValidObject, isValidString, wait, withTimeout, } from '@matterbridge/utils';
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
- const { createESMWorker } = await import('@matterbridge/thread');
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('jest', NAME));
186
- expect(matterbridge.matterbridgeDirectory).toBe(path.join('jest', NAME, '.matterbridge'));
187
- expect(matterbridge.matterbridgePluginDirectory).toBe(path.join('jest', NAME, 'Matterbridge'));
188
- expect(matterbridge.matterbridgeCertDirectory).toBe(path.join('jest', NAME, '.mattercert'));
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.0';
258
+ matterbridge.matterbridgeVersion = '3.6.1';
259
259
  matterbridge.bridgeMode = 'bridge';
260
- matterbridge.rootDirectory = path.join('jest', name);
261
- matterbridge.homeDirectory = path.join('jest', name);
262
- matterbridge.matterbridgeDirectory = path.join('jest', name, '.matterbridge');
263
- matterbridge.matterbridgePluginDirectory = path.join('jest', name, 'Matterbridge');
264
- matterbridge.matterbridgeCertDirectory = path.join('jest', name, '.mattercert');
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('jest', name), { recursive: true, force: true });
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('jest', name, '.matterbridge', MATTER_STORAGE_NAME));
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)
@@ -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 { copyDirectory, getIntParameter, getParameter, hasParameter, inspectError, isValidNumber, isValidString, parseVersionString, wait, withTimeout } from '@matterbridge/utils';
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';
@@ -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';
@@ -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 { copyDirectory, createDirectory, excludedInterfaceNamePattern, formatBytes, formatPercent, formatUptime, getIntParameter, getParameter, hasParameter, isValidNumber, isValidObject, isValidString, parseVersionString, } from '@matterbridge/utils';
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
- const { createESMWorker } = await import('@matterbridge/thread');
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
- const { createESMWorker } = await import('@matterbridge/thread');
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
- const { createESMWorker } = await import('@matterbridge/thread');
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
- const { createESMWorker } = await import('@matterbridge/thread');
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
- this.log.debug(`Cleaning matter storage context for ${GREEN}Matterbridge${db}...`);
1178
- unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, 'Matterbridge', 'sessions.resumptionRecords'), this.log);
1179
- unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, 'Matterbridge', 'root.subscriptions.subscriptions'), this.log);
1180
- for (const plugin of this.plugins.array()) {
1181
- this.log.debug(`Cleaning matter storage context for plugin ${plg}${plugin.name}${db}...`);
1182
- unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, plugin.name, 'sessions.resumptionRecords'), this.log);
1183
- unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, plugin.name, 'root.subscriptions.subscriptions'), this.log);
1184
- }
1185
- for (const device of this.devices.array().filter((d) => d.mode === 'server')) {
1186
- if (!device.deviceName)
1187
- continue;
1188
- this.log.debug(`Cleaning matter storage context for server node device ${dev}${device.deviceName}${db}...`);
1189
- unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, device.deviceName.replace(/[ .]/g, ''), 'sessions.resumptionRecords'), this.log);
1190
- unlinkSafe(path.join(this.matterbridgeDirectory, MATTER_STORAGE_NAME, device.deviceName.replace(/[ .]/g, ''), 'root.subscriptions.subscriptions'), this.log);
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, isValidNumber, isValidObject, isValidString } from '@matterbridge/utils';
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, deepEqual, isValidArray } from '@matterbridge/utils';
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, isValidArray, isValidObject, isValidString } from '@matterbridge/utils';
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';
@@ -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, inspectError, logError } from '@matterbridge/utils';
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.0",
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.0",
126
- "@matterbridge/thread": "3.6.0",
127
- "@matterbridge/types": "3.6.0",
128
- "@matterbridge/utils": "3.6.0",
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.0",
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"