@matterbridge/thread 3.5.4-edge-20260211-1ea4e31 → 3.5.4

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.
@@ -1,6 +1,6 @@
1
1
  import { AnsiLogger } from 'node-ansi-logger';
2
2
  import type { ApiPlugin, SharedMatterbridge } from '@matterbridge/types';
3
- import { BroadcastServer } from '@matterbridge/thread';
3
+ import { BroadcastServer } from './broadcastServer.js';
4
4
  export declare function checkUpdates(matterbridge: SharedMatterbridge): Promise<void>;
5
5
  export declare function checkUpdatesAndLog(matterbridge: SharedMatterbridge, log: AnsiLogger, server: BroadcastServer): Promise<void>;
6
6
  export declare function getMatterbridgeLatestVersion(matterbridge: SharedMatterbridge, log: AnsiLogger, server: BroadcastServer): Promise<string | undefined>;
@@ -1,7 +1,7 @@
1
1
  import { AnsiLogger, db, debugStringify, nt, wr } from 'node-ansi-logger';
2
2
  import { isValidString } from '@matterbridge/utils';
3
3
  import { plg } from '@matterbridge/types';
4
- import { BroadcastServer } from '@matterbridge/thread';
4
+ import { BroadcastServer } from './broadcastServer.js';
5
5
  export async function checkUpdates(matterbridge) {
6
6
  const log = new AnsiLogger({ logName: 'MatterbridgeUpdates', logTimestampFormat: 4, logLevel: matterbridge.logLevel });
7
7
  const server = new BroadcastServer('updates', log);
package/dist/export.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './worker.js';
2
2
  export * from './broadcastServer.js';
3
+ export declare function systemCheck(): Promise<void>;
package/dist/export.js CHANGED
@@ -1,2 +1,5 @@
1
1
  export * from './worker.js';
2
2
  export * from './broadcastServer.js';
3
+ export async function systemCheck() {
4
+ await import('./workerSystemCheck.js');
5
+ }
package/dist/worker.d.ts CHANGED
@@ -3,5 +3,6 @@ import { AnsiLogger, LogLevel } from 'node-ansi-logger';
3
3
  import type { ParentPortMessage } from '@matterbridge/types';
4
4
  export declare function parentPost(message: ParentPortMessage): void;
5
5
  export declare function parentLog(logName: string | undefined, logLevel: LogLevel, message: string): void;
6
- export declare function createESMWorker(name: string, relativePath: string, workerData?: Record<string, boolean | number | string | object>, argv?: string[], env?: NodeJS.ProcessEnv, execArgv?: string[]): Worker;
6
+ export declare function threadLogger(threadName: string, level: LogLevel, message: string): void;
7
+ export declare function createESMWorker(name: string, relativePath: string, workerData?: Record<string, boolean | number | string | object>, argv?: string[], env?: NodeJS.ProcessEnv, execArgv?: string[], pipedOutput?: boolean): Worker;
7
8
  export declare function logWorkerInfo(log: AnsiLogger, logEnv?: boolean): void;
package/dist/worker.js CHANGED
@@ -22,7 +22,12 @@ export function parentLog(logName, logLevel, message) {
22
22
  if (debug)
23
23
  log.debug(`Worker ${workerData.threadName}:${threadId} sent log to parent: ${logName} ${logLevel} ${message}`);
24
24
  }
25
- export function createESMWorker(name, relativePath, workerData, argv, env, execArgv) {
25
+ export function threadLogger(threadName, level, message) {
26
+ AnsiLogger.create({ logName: threadName, logNameColor: MAGENTA, logTimestampFormat: 4, logLevel: level }).log(level, message);
27
+ if (!isMainThread && parentPort)
28
+ parentLog(threadName, level, message);
29
+ }
30
+ export function createESMWorker(name, relativePath, workerData, argv, env, execArgv, pipedOutput = false) {
26
31
  const fileURL = pathToFileURL(resolve(relativePath));
27
32
  const options = {
28
33
  workerData: { ...workerData, threadName: name },
@@ -31,6 +36,8 @@ export function createESMWorker(name, relativePath, workerData, argv, env, execA
31
36
  argv: argv ?? process.argv.slice(2),
32
37
  env: env ?? process.env,
33
38
  execArgv,
39
+ stdout: pipedOutput,
40
+ stderr: pipedOutput,
34
41
  };
35
42
  if (verbose)
36
43
  log.debug(`Creating ESM Worker ${name} with file URL: ${fileURL.href} and options: ${debugStringify(options)}`);
@@ -2,17 +2,18 @@ import { threadId, isMainThread, parentPort, workerData } from 'node:worker_thre
2
2
  import { AnsiLogger, MAGENTA } from 'node-ansi-logger';
3
3
  import { hasParameter, inspectError } from '@matterbridge/utils';
4
4
  import { checkUpdates } from './checkUpdates.js';
5
- import { logWorkerInfo, parentLog, parentPost } from './worker.js';
5
+ import { logWorkerInfo, parentLog, parentPost, threadLogger } from './worker.js';
6
6
  import { BroadcastServer } from './broadcastServer.js';
7
7
  const debug = hasParameter('debug') || hasParameter('verbose') || hasParameter('debug-worker') || hasParameter('verbose-worker');
8
8
  const verbose = hasParameter('verbose') || hasParameter('verbose-worker');
9
+ const name = 'MatterbridgeCheckUpdates';
9
10
  if (!isMainThread && parentPort) {
10
11
  parentPost({ type: 'init', threadId, threadName: workerData.threadName, success: true });
11
12
  if (debug)
12
- parentLog('MatterbridgeCheckUpdates', "info", `Worker ${workerData.threadName}:${threadId} initialized.`);
13
+ parentLog(name, "info", `Worker ${workerData.threadName}:${threadId} initialized.`);
13
14
  }
14
15
  const log = new AnsiLogger({
15
- logName: 'MatterbridgeCheckUpdates',
16
+ logName: name,
16
17
  logNameColor: MAGENTA,
17
18
  logTimestampFormat: 4,
18
19
  logLevel: debug ? "debug" : "info",
@@ -20,23 +21,21 @@ const log = new AnsiLogger({
20
21
  const server = new BroadcastServer('matterbridge', log);
21
22
  if (verbose)
22
23
  logWorkerInfo(log, verbose);
24
+ threadLogger(name, "info", `Starting check updates...`);
23
25
  let success = false;
24
26
  try {
25
- const shared = (await server.fetch({ type: 'matterbridge_shared', src: `matterbridge`, dst: 'matterbridge' })).result.data;
27
+ const shared = (await server.fetch({ type: 'matterbridge_shared', src: `matterbridge`, dst: 'matterbridge' }, 1000)).result.data;
26
28
  await checkUpdates(shared);
29
+ threadLogger(name, "info", `Check updates succeeded`);
27
30
  success = true;
28
- log.debug(`Check updates succeeded`);
29
- if (!isMainThread && parentPort)
30
- parentLog('MatterbridgeCheckUpdates', "debug", `Check updates succeeded`);
31
31
  }
32
32
  catch (error) {
33
33
  const errorMessage = inspectError(log, `Failed to check updates`, error);
34
- if (!isMainThread && parentPort)
35
- parentLog('MatterbridgeCheckUpdates', "error", errorMessage);
34
+ threadLogger(name, "error", errorMessage);
36
35
  }
37
36
  server.close();
38
37
  if (!isMainThread && parentPort) {
39
38
  parentPost({ type: 'exit', threadId, threadName: workerData.threadName, success });
40
39
  if (debug)
41
- parentLog('MatterbridgeCheckUpdates', "info", `Worker ${workerData.threadName}:${threadId} exiting with success: ${success}.`);
40
+ parentLog(name, "info", `Worker ${workerData.threadName}:${threadId} exiting with success: ${success}.`);
42
41
  }
@@ -1,17 +1,18 @@
1
1
  import { threadId, isMainThread, parentPort, workerData } from 'node:worker_threads';
2
2
  import { AnsiLogger, MAGENTA } from 'node-ansi-logger';
3
3
  import { getGlobalNodeModules, hasParameter, inspectError } from '@matterbridge/utils';
4
- import { logWorkerInfo, parentLog, parentPost } from './worker.js';
4
+ import { logWorkerInfo, parentLog, parentPost, threadLogger } from './worker.js';
5
5
  import { BroadcastServer } from './broadcastServer.js';
6
6
  const debug = hasParameter('debug') || hasParameter('verbose') || hasParameter('debug-worker') || hasParameter('verbose-worker');
7
7
  const verbose = hasParameter('verbose') || hasParameter('verbose-worker');
8
+ const name = 'MatterbridgeGlobalPrefix';
8
9
  if (!isMainThread && parentPort) {
9
10
  parentPost({ type: 'init', threadId, threadName: workerData.threadName, success: true });
10
11
  if (debug)
11
- parentLog('MatterbridgePrefix', "info", `Worker ${workerData.threadName}:${threadId} initialized.`);
12
+ parentLog(name, "info", `Worker ${workerData.threadName}:${threadId} initialized.`);
12
13
  }
13
14
  const log = new AnsiLogger({
14
- logName: 'MatterbridgePrefix',
15
+ logName: name,
15
16
  logNameColor: MAGENTA,
16
17
  logTimestampFormat: 4,
17
18
  logLevel: debug ? "debug" : "info",
@@ -20,23 +21,21 @@ const server = new BroadcastServer('matterbridge', log);
20
21
  if (verbose)
21
22
  logWorkerInfo(log, verbose);
22
23
  let prefix;
24
+ threadLogger(name, "info", `Starting global prefix check...`);
23
25
  let success = false;
24
26
  try {
25
27
  prefix = await getGlobalNodeModules();
26
- log.debug(`Global node_modules Directory: ${prefix}`);
27
28
  server.request({ type: 'matterbridge_global_prefix', src: `matterbridge`, dst: 'matterbridge', params: { prefix } });
29
+ threadLogger(name, "info", `Global node_modules directory: ${prefix}`);
28
30
  success = true;
29
- if (!isMainThread && parentPort)
30
- parentLog('MatterbridgePrefix', "debug", `Global node_modules Directory: ${prefix}`);
31
31
  }
32
32
  catch (error) {
33
33
  const errorMessage = inspectError(log, `Failed to get global node modules`, error);
34
- if (!isMainThread && parentPort)
35
- parentLog('MatterbridgePrefix', "error", errorMessage);
34
+ threadLogger(name, "error", errorMessage);
36
35
  }
37
36
  server.close();
38
37
  if (!isMainThread && parentPort) {
39
38
  parentPost({ type: 'exit', threadId, threadName: workerData.threadName, success });
40
39
  if (debug)
41
- parentLog('MatterbridgePrefix', "info", `Worker ${workerData.threadName}:${threadId} exiting with success: ${success}.`);
40
+ parentLog(name, "info", `Worker ${workerData.threadName}:${threadId} exiting with success: ${success}.`);
42
41
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,84 @@
1
+ import { threadId, isMainThread, parentPort, workerData } from 'node:worker_threads';
2
+ import os from 'node:os';
3
+ import { AnsiLogger, MAGENTA } from 'node-ansi-logger';
4
+ import { hasParameter, inspectError, excludedInterfaceNamePattern } from '@matterbridge/utils';
5
+ import { logWorkerInfo, parentLog, parentPost, threadLogger } from './worker.js';
6
+ import { BroadcastServer } from './broadcastServer.js';
7
+ const debug = hasParameter('debug') || hasParameter('verbose') || hasParameter('debug-worker') || hasParameter('verbose-worker');
8
+ const verbose = hasParameter('verbose') || hasParameter('verbose-worker');
9
+ const name = 'MatterbridgeSystemCheck';
10
+ if (!isMainThread && parentPort) {
11
+ parentPost({ type: 'init', threadId, threadName: workerData.threadName, success: true });
12
+ if (debug)
13
+ parentLog(name, "info", `Worker ${workerData.threadName}:${threadId} initialized.`);
14
+ }
15
+ const log = new AnsiLogger({
16
+ logName: name,
17
+ logNameColor: MAGENTA,
18
+ logTimestampFormat: 4,
19
+ logLevel: debug ? "debug" : "info",
20
+ });
21
+ const server = new BroadcastServer('matterbridge', log);
22
+ if (verbose)
23
+ logWorkerInfo(log, verbose);
24
+ threadLogger(name, "info", `Starting system check...`);
25
+ let success = false;
26
+ try {
27
+ const shared = (await server.fetch({ type: 'matterbridge_shared', src: `matterbridge`, dst: 'matterbridge' }, 1000)).result.data;
28
+ if (process.env.NVM_BIN && process.env.NVM_DIR)
29
+ threadLogger(name, "error", `NVM is a development tool and is not supported in production. Please install node from https://github.com/nodesource/distributions.`);
30
+ const nodeVersion = process.versions.node;
31
+ const versionMajor = parseInt(nodeVersion.split('.')[0]);
32
+ const versionMinor = parseInt(nodeVersion.split('.')[1]);
33
+ const versionPatch = parseInt(nodeVersion.split('.')[2]);
34
+ threadLogger(name, "debug", `Node.js Version: ${versionMajor}.${versionMinor}.${versionPatch}`);
35
+ if (versionMajor === 20 && versionMinor < 19)
36
+ threadLogger(name, "error", `Node.js version < 20.19.0 is not supported. Please upgrade to Node.js LTS version (24.x).`);
37
+ if (versionMajor === 22 && versionMinor < 13)
38
+ threadLogger(name, "error", `Node.js version < 22.13.0 is not supported. Please upgrade to Node.js LTS version (24.x).`);
39
+ if (versionMajor === 21 || versionMajor === 23 || versionMajor === 25)
40
+ threadLogger(name, "error", `Node.js odd major versions are not supported. Please upgrade to Node.js LTS version (24.x).`);
41
+ if (versionMajor !== 24)
42
+ threadLogger(name, "notice", `You are running Node.js ${versionMajor}.${versionMinor}.${versionPatch}. Please consider upgrading to Node.js LTS version (24.x).`);
43
+ const networkInterfaces = os.networkInterfaces();
44
+ let foundInternal = false;
45
+ let foundExternal = false;
46
+ let foundIpv4 = false;
47
+ let foundIpv6 = false;
48
+ for (const [interfaceName, interfaceDetails] of Object.entries(networkInterfaces)) {
49
+ if (!shared.mdnsInterface && excludedInterfaceNamePattern.test(interfaceName))
50
+ threadLogger(name, "warn", `Found network interface '${interfaceName}'. Please use --mdnsinterface parameter to specify the correct local interface for mDNS.`);
51
+ if (excludedInterfaceNamePattern.test(interfaceName))
52
+ continue;
53
+ for (const detail of interfaceDetails || []) {
54
+ if (detail.internal)
55
+ foundInternal = true;
56
+ if (!detail.internal)
57
+ foundExternal = true;
58
+ if (detail.family === 'IPv4' && !detail.internal && foundIpv4 === false)
59
+ foundIpv4 = true;
60
+ if (detail.family === 'IPv6' && !detail.internal && foundIpv6 === false)
61
+ foundIpv6 = true;
62
+ }
63
+ }
64
+ if (!foundInternal)
65
+ threadLogger(name, "error", `No internal network interface found. Check your network configuration.`);
66
+ if (!foundExternal)
67
+ threadLogger(name, "error", `No external network interface found. Check your network configuration.`);
68
+ if (!foundIpv4)
69
+ threadLogger(name, "error", `No IPv4 network interface found. Check your network configuration.`);
70
+ if (!foundIpv6)
71
+ threadLogger(name, "error", `No IPv6 network interface found. Check your network configuration.`);
72
+ threadLogger(name, "info", `System check succeeded`);
73
+ success = true;
74
+ }
75
+ catch (error) {
76
+ const errorMessage = inspectError(log, `Failed to perform system check`, error);
77
+ threadLogger(name, "error", errorMessage);
78
+ }
79
+ server.close();
80
+ if (!isMainThread && parentPort) {
81
+ parentPost({ type: 'exit', threadId, threadName: workerData.threadName, success });
82
+ if (debug)
83
+ parentLog(name, "info", `Worker ${workerData.threadName}:${threadId} exiting with success: ${success}.`);
84
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/thread",
3
- "version": "3.5.4-edge-20260211-1ea4e31",
3
+ "version": "3.5.4",
4
4
  "description": "Matterbridge thread library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -65,6 +65,8 @@
65
65
  "@eslint/js": "9.39.2"
66
66
  },
67
67
  "dependencies": {
68
- "node-ansi-logger": "3.2.0"
68
+ "node-ansi-logger": "3.2.0",
69
+ "@matterbridge/utils": "3.5.4",
70
+ "@matterbridge/types": "3.5.4"
69
71
  }
70
72
  }