@matterbridge/thread 3.6.1-dev-20260311-8b3e31c → 3.6.1-dev-20260312-a699c0e

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.
@@ -17,6 +17,7 @@ export declare class ThreadsManager {
17
17
  private msgHandler;
18
18
  private intervalHandler;
19
19
  runThread(name: string, workerData?: WorkerData, argv?: string[], env?: NodeJS.ProcessEnv, execArgv?: string[], pipedOutput?: boolean): Worker;
20
+ runInMainThread(name: string, workerData?: WorkerData | null): Promise<boolean>;
20
21
  resolvePath(fileName: string): string;
21
22
  createESMWorker(name: string, relativePath: string, workerData?: Record<string, boolean | number | string | object>, argv?: string[], env?: NodeJS.ProcessEnv, execArgv?: string[], pipedOutput?: boolean): Worker;
22
23
  }
@@ -69,7 +69,7 @@ export class ThreadsManager {
69
69
  this.server.respond({ ...msg, result: { success: true } });
70
70
  }
71
71
  catch (err) {
72
- this.log.error(`Failed to run thread ${CYAN}${msg.params.name}${db}: ${err.message}`);
72
+ this.log.warn(`Failed to run thread ${CYAN}${msg.params.name}${db}: ${err.message}`);
73
73
  this.server.respond({ ...msg, result: { success: false } });
74
74
  }
75
75
  break;
@@ -143,6 +143,22 @@ export class ThreadsManager {
143
143
  this.log.debug(`Started thread ${threadInfo.name} from path ${path} type ${threadInfo.type} with thread id ${worker.threadId}`);
144
144
  return threadInfo.worker;
145
145
  }
146
+ async runInMainThread(name, workerData = null) {
147
+ const threadInfo = this.threads.find((t) => t.name === name);
148
+ if (!threadInfo) {
149
+ throw new Error(`Thread ${name} not found`);
150
+ }
151
+ this.log.debug(`Running thread ${threadInfo.name} in the main thread...`);
152
+ let success = false;
153
+ const workerWrapper = (await import(this.resolvePath(threadInfo.path))).default;
154
+ if (workerWrapper && typeof workerWrapper === 'object' && workerWrapper.name === name && workerWrapper.callback && typeof workerWrapper.callback === 'function') {
155
+ workerWrapper.workerData = workerData;
156
+ success = await workerWrapper.callback(workerWrapper);
157
+ workerWrapper.destroy(success);
158
+ }
159
+ this.log.debug(`Finished running thread ${threadInfo.name} in the main thread.`);
160
+ return success;
161
+ }
146
162
  resolvePath(fileName) {
147
163
  const currentModuleDirectory = path.dirname(fileURLToPath(import.meta.url));
148
164
  const candidates = [
@@ -1 +1,3 @@
1
- export {};
1
+ import { WorkerWrapper } from './workerWrapper.js';
2
+ declare const _default: WorkerWrapper;
3
+ export default _default;
@@ -1,7 +1,7 @@
1
1
  import { inspectError } from '@matterbridge/utils/error';
2
2
  import { checkUpdates } from './checkUpdates.js';
3
3
  import { WorkerWrapper } from './workerWrapper.js';
4
- new WorkerWrapper('CheckUpdates', async (worker) => {
4
+ export default new WorkerWrapper('CheckUpdates', async (worker) => {
5
5
  worker.logger("info", `Starting check updates...`);
6
6
  let success = false;
7
7
  try {
@@ -1 +1,3 @@
1
- export {};
1
+ import { WorkerWrapper } from './workerWrapper.js';
2
+ declare const _default: WorkerWrapper;
3
+ export default _default;
@@ -1,7 +1,7 @@
1
1
  import { inspectError } from '@matterbridge/utils/error';
2
2
  import { getGlobalNodeModules } from '@matterbridge/utils/npm-prefix';
3
3
  import { WorkerWrapper } from './workerWrapper.js';
4
- new WorkerWrapper('GlobalPrefix', async (worker) => {
4
+ export default new WorkerWrapper('GlobalPrefix', async (worker) => {
5
5
  let prefix;
6
6
  worker.logger("info", `Starting global prefix check...`);
7
7
  let success = false;
@@ -1 +1,3 @@
1
- export {};
1
+ import { WorkerWrapper } from './workerWrapper.js';
2
+ declare const _default: WorkerWrapper;
3
+ export default _default;
@@ -1,7 +1,7 @@
1
1
  import { isSpawnWorkerData } from '@matterbridge/types';
2
2
  import { spawnCommand } from './spawnCommand.js';
3
3
  import { WorkerWrapper } from './workerWrapper.js';
4
- new WorkerWrapper('SpawnCommand', async (worker) => {
4
+ export default new WorkerWrapper('SpawnCommand', async (worker) => {
5
5
  if (!isSpawnWorkerData(worker.workerData)) {
6
6
  worker.logger("error", `SpawnCommand invalid parameters`);
7
7
  return false;
@@ -1 +1,3 @@
1
- export {};
1
+ import { WorkerWrapper } from './workerWrapper.js';
2
+ declare const _default: WorkerWrapper;
3
+ export default _default;
@@ -2,7 +2,7 @@ import os from 'node:os';
2
2
  import { inspectError } from '@matterbridge/utils/error';
3
3
  import { excludedInterfaceNamePattern } from '@matterbridge/utils/network';
4
4
  import { WorkerWrapper } from './workerWrapper.js';
5
- new WorkerWrapper('SystemCheck', async (worker) => {
5
+ export default new WorkerWrapper('SystemCheck', async (worker) => {
6
6
  worker.logger("info", `Starting system check...`);
7
7
  let success = false;
8
8
  try {
@@ -4,6 +4,7 @@ import { AnsiLogger, LogLevel } from 'node-ansi-logger';
4
4
  import { BroadcastServer } from './broadcastServer.js';
5
5
  export declare class WorkerWrapper {
6
6
  name: ThreadNames;
7
+ callback: (worker: WorkerWrapper) => Promise<boolean>;
7
8
  debug: boolean;
8
9
  verbose: boolean;
9
10
  useTracker: boolean;
@@ -8,6 +8,7 @@ import { BroadcastServer } from './broadcastServer.js';
8
8
  import { ThreadsManager } from './threadsManager.js';
9
9
  export class WorkerWrapper {
10
10
  name;
11
+ callback;
11
12
  debug = hasParameter('debug') || hasParameter('verbose') || hasParameter('debug-threads') || hasParameter('verbose-threads');
12
13
  verbose = hasParameter('verbose') || hasParameter('verbose-threads');
13
14
  useTracker = hasParameter('tracker') || hasParameter('tracker-threads');
@@ -17,6 +18,7 @@ export class WorkerWrapper {
17
18
  tracker;
18
19
  constructor(name, callback) {
19
20
  this.name = name;
21
+ this.callback = callback;
20
22
  if (this.workerData) {
21
23
  this.debug = this.workerData.debug || this.debug;
22
24
  this.verbose = this.workerData.verbose || this.verbose;
@@ -65,12 +67,18 @@ export class WorkerWrapper {
65
67
  if (this.debug)
66
68
  this.parentLog(this.name, "info", `Worker ${this.name}:${threadId} initialized.`);
67
69
  }
70
+ else {
71
+ if (this.debug)
72
+ this.log.debug(`Worker ${this.name}:${threadId} initialized in main thread.`);
73
+ }
68
74
  if (this.verbose)
69
75
  this.logWorkerInfo(this.log, false);
70
- setImmediate(async () => {
71
- const success = await callback(this);
72
- this.destroy(success);
73
- });
76
+ if (!isMainThread) {
77
+ setImmediate(async () => {
78
+ const success = await callback(this);
79
+ this.destroy(success);
80
+ });
81
+ }
74
82
  }
75
83
  destroy(success) {
76
84
  if (this.tracker)
@@ -82,6 +90,10 @@ export class WorkerWrapper {
82
90
  this.parentPost({ type: 'exit', threadId, threadName: this.name, memoryUsage: process.memoryUsage(), success });
83
91
  parentPort.close();
84
92
  }
93
+ else {
94
+ if (this.debug)
95
+ this.log.debug(`Worker ${this.name}:${threadId} exiting with success in main thread: ${success}.`);
96
+ }
85
97
  }
86
98
  parentPost(message) {
87
99
  if (!parentPort)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/thread",
3
- "version": "3.6.1-dev-20260311-8b3e31c",
3
+ "version": "3.6.1-dev-20260312-a699c0e",
4
4
  "description": "Matterbridge thread library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -69,8 +69,8 @@
69
69
  "CHANGELOG.md"
70
70
  ],
71
71
  "dependencies": {
72
- "@matterbridge/types": "3.6.1-dev-20260311-8b3e31c",
73
- "@matterbridge/utils": "3.6.1-dev-20260311-8b3e31c",
72
+ "@matterbridge/types": "3.6.1-dev-20260312-a699c0e",
73
+ "@matterbridge/utils": "3.6.1-dev-20260312-a699c0e",
74
74
  "@zip.js/zip.js": "2.8.23",
75
75
  "node-ansi-logger": "3.2.0"
76
76
  }