@matterbridge/core 3.5.3
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/LICENSE +202 -0
- package/README.md +22 -0
- package/dist/cli.d.ts +29 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +268 -0
- package/dist/cli.js.map +1 -0
- package/dist/cliEmitter.d.ts +50 -0
- package/dist/cliEmitter.d.ts.map +1 -0
- package/dist/cliEmitter.js +49 -0
- package/dist/cliEmitter.js.map +1 -0
- package/dist/cliHistory.d.ts +48 -0
- package/dist/cliHistory.d.ts.map +1 -0
- package/dist/cliHistory.js +826 -0
- package/dist/cliHistory.js.map +1 -0
- package/dist/clusters/export.d.ts +2 -0
- package/dist/clusters/export.d.ts.map +1 -0
- package/dist/clusters/export.js +3 -0
- package/dist/clusters/export.js.map +1 -0
- package/dist/crypto/attestationDecoder.d.ts +180 -0
- package/dist/crypto/attestationDecoder.d.ts.map +1 -0
- package/dist/crypto/attestationDecoder.js +176 -0
- package/dist/crypto/attestationDecoder.js.map +1 -0
- package/dist/crypto/declarationDecoder.d.ts +72 -0
- package/dist/crypto/declarationDecoder.d.ts.map +1 -0
- package/dist/crypto/declarationDecoder.js +241 -0
- package/dist/crypto/declarationDecoder.js.map +1 -0
- package/dist/crypto/extract/342/200/220cert/342/200/220extensions.d.ts +9 -0
- package/dist/crypto/extract/342/200/220cert/342/200/220extensions.d.ts.map +1 -0
- package/dist/crypto/extract/342/200/220cert/342/200/220extensions.js +120 -0
- package/dist/crypto/extract/342/200/220cert/342/200/220extensions.js.map +1 -0
- package/dist/crypto/read-extensions.d.ts +2 -0
- package/dist/crypto/read-extensions.d.ts.map +1 -0
- package/dist/crypto/read-extensions.js +81 -0
- package/dist/crypto/read-extensions.js.map +1 -0
- package/dist/crypto/testData.d.ts +31 -0
- package/dist/crypto/testData.d.ts.map +1 -0
- package/dist/crypto/testData.js +131 -0
- package/dist/crypto/testData.js.map +1 -0
- package/dist/crypto/walk-der.d.ts +2 -0
- package/dist/crypto/walk-der.d.ts.map +1 -0
- package/dist/crypto/walk-der.js +165 -0
- package/dist/crypto/walk-der.js.map +1 -0
- package/dist/deviceManager.d.ts +135 -0
- package/dist/deviceManager.d.ts.map +1 -0
- package/dist/deviceManager.js +270 -0
- package/dist/deviceManager.js.map +1 -0
- package/dist/devices/airConditioner.d.ts +98 -0
- package/dist/devices/airConditioner.d.ts.map +1 -0
- package/dist/devices/airConditioner.js +74 -0
- package/dist/devices/airConditioner.js.map +1 -0
- package/dist/devices/basicVideoPlayer.d.ts +88 -0
- package/dist/devices/basicVideoPlayer.d.ts.map +1 -0
- package/dist/devices/basicVideoPlayer.js +155 -0
- package/dist/devices/basicVideoPlayer.js.map +1 -0
- package/dist/devices/batteryStorage.d.ts +48 -0
- package/dist/devices/batteryStorage.d.ts.map +1 -0
- package/dist/devices/batteryStorage.js +75 -0
- package/dist/devices/batteryStorage.js.map +1 -0
- package/dist/devices/castingVideoPlayer.d.ts +79 -0
- package/dist/devices/castingVideoPlayer.d.ts.map +1 -0
- package/dist/devices/castingVideoPlayer.js +101 -0
- package/dist/devices/castingVideoPlayer.js.map +1 -0
- package/dist/devices/cooktop.d.ts +61 -0
- package/dist/devices/cooktop.d.ts.map +1 -0
- package/dist/devices/cooktop.js +77 -0
- package/dist/devices/cooktop.js.map +1 -0
- package/dist/devices/dishwasher.d.ts +71 -0
- package/dist/devices/dishwasher.d.ts.map +1 -0
- package/dist/devices/dishwasher.js +130 -0
- package/dist/devices/dishwasher.js.map +1 -0
- package/dist/devices/evse.d.ts +76 -0
- package/dist/devices/evse.d.ts.map +1 -0
- package/dist/devices/evse.js +156 -0
- package/dist/devices/evse.js.map +1 -0
- package/dist/devices/export.d.ts +19 -0
- package/dist/devices/export.d.ts.map +1 -0
- package/dist/devices/export.js +23 -0
- package/dist/devices/export.js.map +1 -0
- package/dist/devices/extractorHood.d.ts +46 -0
- package/dist/devices/extractorHood.d.ts.map +1 -0
- package/dist/devices/extractorHood.js +78 -0
- package/dist/devices/extractorHood.js.map +1 -0
- package/dist/devices/heatPump.d.ts +47 -0
- package/dist/devices/heatPump.d.ts.map +1 -0
- package/dist/devices/heatPump.js +84 -0
- package/dist/devices/heatPump.js.map +1 -0
- package/dist/devices/laundryDryer.d.ts +67 -0
- package/dist/devices/laundryDryer.d.ts.map +1 -0
- package/dist/devices/laundryDryer.js +106 -0
- package/dist/devices/laundryDryer.js.map +1 -0
- package/dist/devices/laundryWasher.d.ts +81 -0
- package/dist/devices/laundryWasher.d.ts.map +1 -0
- package/dist/devices/laundryWasher.js +147 -0
- package/dist/devices/laundryWasher.js.map +1 -0
- package/dist/devices/microwaveOven.d.ts +168 -0
- package/dist/devices/microwaveOven.d.ts.map +1 -0
- package/dist/devices/microwaveOven.js +179 -0
- package/dist/devices/microwaveOven.js.map +1 -0
- package/dist/devices/oven.d.ts +105 -0
- package/dist/devices/oven.d.ts.map +1 -0
- package/dist/devices/oven.js +190 -0
- package/dist/devices/oven.js.map +1 -0
- package/dist/devices/refrigerator.d.ts +118 -0
- package/dist/devices/refrigerator.d.ts.map +1 -0
- package/dist/devices/refrigerator.js +186 -0
- package/dist/devices/refrigerator.js.map +1 -0
- package/dist/devices/roboticVacuumCleaner.d.ts +112 -0
- package/dist/devices/roboticVacuumCleaner.d.ts.map +1 -0
- package/dist/devices/roboticVacuumCleaner.js +268 -0
- package/dist/devices/roboticVacuumCleaner.js.map +1 -0
- package/dist/devices/solarPower.d.ts +40 -0
- package/dist/devices/solarPower.d.ts.map +1 -0
- package/dist/devices/solarPower.js +59 -0
- package/dist/devices/solarPower.js.map +1 -0
- package/dist/devices/speaker.d.ts +87 -0
- package/dist/devices/speaker.d.ts.map +1 -0
- package/dist/devices/speaker.js +120 -0
- package/dist/devices/speaker.js.map +1 -0
- package/dist/devices/temperatureControl.d.ts +166 -0
- package/dist/devices/temperatureControl.d.ts.map +1 -0
- package/dist/devices/temperatureControl.js +78 -0
- package/dist/devices/temperatureControl.js.map +1 -0
- package/dist/devices/waterHeater.d.ts +111 -0
- package/dist/devices/waterHeater.d.ts.map +1 -0
- package/dist/devices/waterHeater.js +166 -0
- package/dist/devices/waterHeater.js.map +1 -0
- package/dist/dgram/export.d.ts +2 -0
- package/dist/dgram/export.d.ts.map +1 -0
- package/dist/dgram/export.js +2 -0
- package/dist/dgram/export.js.map +1 -0
- package/dist/export.d.ts +32 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +39 -0
- package/dist/export.js.map +1 -0
- package/dist/frontend.d.ts +248 -0
- package/dist/frontend.d.ts.map +1 -0
- package/dist/frontend.js +2605 -0
- package/dist/frontend.js.map +1 -0
- package/dist/helpers.d.ts +48 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +161 -0
- package/dist/helpers.js.map +1 -0
- package/dist/jestutils/export.d.ts +2 -0
- package/dist/jestutils/export.d.ts.map +1 -0
- package/dist/jestutils/export.js +2 -0
- package/dist/jestutils/export.js.map +1 -0
- package/dist/jestutils/jestHelpers.d.ts +349 -0
- package/dist/jestutils/jestHelpers.d.ts.map +1 -0
- package/dist/jestutils/jestHelpers.js +980 -0
- package/dist/jestutils/jestHelpers.js.map +1 -0
- package/dist/matter/behaviors.d.ts +2 -0
- package/dist/matter/behaviors.d.ts.map +1 -0
- package/dist/matter/behaviors.js +3 -0
- package/dist/matter/behaviors.js.map +1 -0
- package/dist/matter/clusters.d.ts +2 -0
- package/dist/matter/clusters.d.ts.map +1 -0
- package/dist/matter/clusters.js +3 -0
- package/dist/matter/clusters.js.map +1 -0
- package/dist/matter/devices.d.ts +2 -0
- package/dist/matter/devices.d.ts.map +1 -0
- package/dist/matter/devices.js +3 -0
- package/dist/matter/devices.js.map +1 -0
- package/dist/matter/endpoints.d.ts +2 -0
- package/dist/matter/endpoints.d.ts.map +1 -0
- package/dist/matter/endpoints.js +3 -0
- package/dist/matter/endpoints.js.map +1 -0
- package/dist/matter/export.d.ts +4 -0
- package/dist/matter/export.d.ts.map +1 -0
- package/dist/matter/export.js +5 -0
- package/dist/matter/export.js.map +1 -0
- package/dist/matter/types.d.ts +2 -0
- package/dist/matter/types.d.ts.map +1 -0
- package/dist/matter/types.js +3 -0
- package/dist/matter/types.js.map +1 -0
- package/dist/matterNode.d.ts +341 -0
- package/dist/matterNode.d.ts.map +1 -0
- package/dist/matterNode.js +1329 -0
- package/dist/matterNode.js.map +1 -0
- package/dist/matterbridge.d.ts +544 -0
- package/dist/matterbridge.d.ts.map +1 -0
- package/dist/matterbridge.js +2880 -0
- package/dist/matterbridge.js.map +1 -0
- package/dist/matterbridgeAccessoryPlatform.d.ts +49 -0
- package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -0
- package/dist/matterbridgeAccessoryPlatform.js +80 -0
- package/dist/matterbridgeAccessoryPlatform.js.map +1 -0
- package/dist/matterbridgeBehaviors.d.ts +2428 -0
- package/dist/matterbridgeBehaviors.d.ts.map +1 -0
- package/dist/matterbridgeBehaviors.js +620 -0
- package/dist/matterbridgeBehaviors.js.map +1 -0
- package/dist/matterbridgeDeviceTypes.d.ts +744 -0
- package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
- package/dist/matterbridgeDeviceTypes.js +1312 -0
- package/dist/matterbridgeDeviceTypes.js.map +1 -0
- package/dist/matterbridgeDynamicPlatform.d.ts +49 -0
- package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -0
- package/dist/matterbridgeDynamicPlatform.js +80 -0
- package/dist/matterbridgeDynamicPlatform.js.map +1 -0
- package/dist/matterbridgeEndpoint.d.ts +1548 -0
- package/dist/matterbridgeEndpoint.d.ts.map +1 -0
- package/dist/matterbridgeEndpoint.js +2883 -0
- package/dist/matterbridgeEndpoint.js.map +1 -0
- package/dist/matterbridgeEndpointHelpers.d.ts +1855 -0
- package/dist/matterbridgeEndpointHelpers.d.ts.map +1 -0
- package/dist/matterbridgeEndpointHelpers.js +1270 -0
- package/dist/matterbridgeEndpointHelpers.js.map +1 -0
- package/dist/matterbridgeEndpointTypes.d.ts +172 -0
- package/dist/matterbridgeEndpointTypes.d.ts.map +1 -0
- package/dist/matterbridgeEndpointTypes.js +28 -0
- package/dist/matterbridgeEndpointTypes.js.map +1 -0
- package/dist/matterbridgePlatform.d.ts +520 -0
- package/dist/matterbridgePlatform.d.ts.map +1 -0
- package/dist/matterbridgePlatform.js +921 -0
- package/dist/matterbridgePlatform.js.map +1 -0
- package/dist/mb_coap.d.ts +24 -0
- package/dist/mb_coap.d.ts.map +1 -0
- package/dist/mb_coap.js +89 -0
- package/dist/mb_coap.js.map +1 -0
- package/dist/mb_health.d.ts +77 -0
- package/dist/mb_health.d.ts.map +1 -0
- package/dist/mb_health.js +147 -0
- package/dist/mb_health.js.map +1 -0
- package/dist/mb_mdns.d.ts +24 -0
- package/dist/mb_mdns.d.ts.map +1 -0
- package/dist/mb_mdns.js +285 -0
- package/dist/mb_mdns.js.map +1 -0
- package/dist/pluginManager.d.ts +388 -0
- package/dist/pluginManager.d.ts.map +1 -0
- package/dist/pluginManager.js +1574 -0
- package/dist/pluginManager.js.map +1 -0
- package/dist/spawn.d.ts +33 -0
- package/dist/spawn.d.ts.map +1 -0
- package/dist/spawn.js +165 -0
- package/dist/spawn.js.map +1 -0
- package/dist/utils/export.d.ts +2 -0
- package/dist/utils/export.d.ts.map +1 -0
- package/dist/utils/export.js +2 -0
- package/dist/utils/export.js.map +1 -0
- package/dist/workers/brand.d.ts +25 -0
- package/dist/workers/brand.d.ts.map +1 -0
- package/dist/workers/brand.extend.d.ts +10 -0
- package/dist/workers/brand.extend.d.ts.map +1 -0
- package/dist/workers/brand.extend.js +15 -0
- package/dist/workers/brand.extend.js.map +1 -0
- package/dist/workers/brand.invalid.d.ts +9 -0
- package/dist/workers/brand.invalid.d.ts.map +1 -0
- package/dist/workers/brand.invalid.js +19 -0
- package/dist/workers/brand.invalid.js.map +1 -0
- package/dist/workers/brand.js +67 -0
- package/dist/workers/brand.js.map +1 -0
- package/dist/workers/clusterTypes.d.ts +47 -0
- package/dist/workers/clusterTypes.d.ts.map +1 -0
- package/dist/workers/clusterTypes.js +57 -0
- package/dist/workers/clusterTypes.js.map +1 -0
- package/dist/workers/frontendWorker.d.ts +2 -0
- package/dist/workers/frontendWorker.d.ts.map +1 -0
- package/dist/workers/frontendWorker.js +90 -0
- package/dist/workers/frontendWorker.js.map +1 -0
- package/dist/workers/helloWorld.d.ts +2 -0
- package/dist/workers/helloWorld.d.ts.map +1 -0
- package/dist/workers/helloWorld.js +135 -0
- package/dist/workers/helloWorld.js.map +1 -0
- package/dist/workers/matterWorker.d.ts +2 -0
- package/dist/workers/matterWorker.d.ts.map +1 -0
- package/dist/workers/matterWorker.js +104 -0
- package/dist/workers/matterWorker.js.map +1 -0
- package/dist/workers/matterbridgeWorker.d.ts +2 -0
- package/dist/workers/matterbridgeWorker.d.ts.map +1 -0
- package/dist/workers/matterbridgeWorker.js +75 -0
- package/dist/workers/matterbridgeWorker.js.map +1 -0
- package/dist/workers/messageLab.d.ts +134 -0
- package/dist/workers/messageLab.d.ts.map +1 -0
- package/dist/workers/messageLab.js +129 -0
- package/dist/workers/messageLab.js.map +1 -0
- package/dist/workers/testWorker.d.ts +2 -0
- package/dist/workers/testWorker.d.ts.map +1 -0
- package/dist/workers/testWorker.js +45 -0
- package/dist/workers/testWorker.js.map +1 -0
- package/dist/workers/usage.d.ts +19 -0
- package/dist/workers/usage.d.ts.map +1 -0
- package/dist/workers/usage.js +140 -0
- package/dist/workers/usage.js.map +1 -0
- package/dist/workers/workerManager.d.ts +115 -0
- package/dist/workers/workerManager.d.ts.map +1 -0
- package/dist/workers/workerManager.js +464 -0
- package/dist/workers/workerManager.js.map +1 -0
- package/dist/workers/workerServer.d.ts +126 -0
- package/dist/workers/workerServer.d.ts.map +1 -0
- package/dist/workers/workerServer.js +340 -0
- package/dist/workers/workerServer.js.map +1 -0
- package/dist/workers/workerTypes.d.ts +23 -0
- package/dist/workers/workerTypes.d.ts.map +1 -0
- package/dist/workers/workerTypes.js +3 -0
- package/dist/workers/workerTypes.js.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
// workersManager.ts
|
|
2
|
+
// Manages communication with matterbridge, frontend and plugin workers
|
|
3
|
+
/* eslint-disable n/no-process-exit */
|
|
4
|
+
import { MessageChannel, BroadcastChannel, Worker } from 'node:worker_threads';
|
|
5
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import { AnsiLogger, debugStringify, or } from 'node-ansi-logger';
|
|
10
|
+
import { formatBytes, formatPercent, formatUptime, getInterfaceDetails, hasParameter, inspectError, Tracker } from '@matterbridge/utils';
|
|
11
|
+
const homeDir = path.join('.', '/temp');
|
|
12
|
+
const matterbridgePackageJson = JSON.parse(fs.readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
|
|
13
|
+
const frontendPackageJson = JSON.parse(fs.readFileSync(new URL('../../frontend/package.json', import.meta.url), 'utf8'));
|
|
14
|
+
const nic = getInterfaceDetails();
|
|
15
|
+
const matterbridge = {
|
|
16
|
+
rootDirectory: path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../'),
|
|
17
|
+
homeDirectory: homeDir,
|
|
18
|
+
matterbridgeDirectory: path.join(homeDir, '.matterbridge'),
|
|
19
|
+
matterbridgePluginDirectory: path.join(homeDir, 'Matterbridge'),
|
|
20
|
+
matterbridgeCertDirectory: path.join(homeDir, '.mattercert'),
|
|
21
|
+
globalModulesDirectory: path.join('.', 'node_modules'),
|
|
22
|
+
matterbridgeVersion: matterbridgePackageJson.version,
|
|
23
|
+
matterbridgeLatestVersion: matterbridgePackageJson.version,
|
|
24
|
+
matterbridgeDevVersion: matterbridgePackageJson.version,
|
|
25
|
+
frontendVersion: frontendPackageJson.version,
|
|
26
|
+
bridgeMode: 'bridge',
|
|
27
|
+
restartMode: '',
|
|
28
|
+
virtualMode: 'disabled',
|
|
29
|
+
profile: undefined,
|
|
30
|
+
logLevel: "info" /* LogLevel.INFO */,
|
|
31
|
+
fileLogger: false,
|
|
32
|
+
matterLogLevel: "info" /* LogLevel.INFO */,
|
|
33
|
+
matterFileLogger: false,
|
|
34
|
+
mdnsInterface: undefined,
|
|
35
|
+
ipv4Address: undefined,
|
|
36
|
+
ipv6Address: undefined,
|
|
37
|
+
port: undefined,
|
|
38
|
+
discriminator: undefined,
|
|
39
|
+
passcode: undefined,
|
|
40
|
+
shellySysUpdate: false,
|
|
41
|
+
shellyMainUpdate: false,
|
|
42
|
+
systemInformation: {
|
|
43
|
+
interfaceName: nic?.interfaceName || '',
|
|
44
|
+
macAddress: nic?.macAddress || '',
|
|
45
|
+
ipv4Address: nic?.ipv4Address || '',
|
|
46
|
+
ipv6Address: nic?.ipv6Address || '',
|
|
47
|
+
nodeVersion: process.versions.node,
|
|
48
|
+
hostname: os.hostname(),
|
|
49
|
+
user: os.userInfo().username,
|
|
50
|
+
osType: os.type(),
|
|
51
|
+
osRelease: os.release(),
|
|
52
|
+
osPlatform: os.platform(),
|
|
53
|
+
osArch: os.arch(),
|
|
54
|
+
totalMemory: formatBytes(os.totalmem()),
|
|
55
|
+
freeMemory: formatBytes(os.freemem()),
|
|
56
|
+
systemUptime: formatUptime(os.uptime()),
|
|
57
|
+
processUptime: formatUptime(Math.floor(process.uptime())),
|
|
58
|
+
cpuUsage: formatPercent(0),
|
|
59
|
+
processCpuUsage: formatPercent(0),
|
|
60
|
+
rss: formatBytes(process.memoryUsage().rss),
|
|
61
|
+
heapTotal: formatBytes(process.memoryUsage().heapTotal),
|
|
62
|
+
heapUsed: formatBytes(process.memoryUsage().heapUsed),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Generates a unique ID with range 100000-999999.
|
|
67
|
+
*
|
|
68
|
+
* @returns {number} - A unique ID between 100000 and 999999
|
|
69
|
+
*/
|
|
70
|
+
export function getUniqueId() {
|
|
71
|
+
return Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000; // random int between 100000 and 999999
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Typed helper to create an ESM Worker.
|
|
75
|
+
*
|
|
76
|
+
* @param {string} relativePath - path to the worker file
|
|
77
|
+
* @param {WorkerData} workerData - data to be passed to the worker
|
|
78
|
+
* @returns {Worker} - the created Worker instance
|
|
79
|
+
*
|
|
80
|
+
* @remarks This function uses pathToFileURL to convert the relative path to a file URL,
|
|
81
|
+
* which is necessary for ESM modules. It also sets the worker type to 'module' and transfers
|
|
82
|
+
* the managerPort to the worker for inter-thread communication.
|
|
83
|
+
*
|
|
84
|
+
* WorkerData:
|
|
85
|
+
* - name: string - Name of the worker
|
|
86
|
+
* - managerPort: MessagePort - Port for communication with the manager
|
|
87
|
+
* - matterbridge: Matterbridge - Reference to the Matterbridge instance
|
|
88
|
+
* - debug?: boolean - Optional debug flag for logging
|
|
89
|
+
*/
|
|
90
|
+
function createESMWorker(relativePath, workerData) {
|
|
91
|
+
const fileURL = pathToFileURL(path.resolve(relativePath));
|
|
92
|
+
const options = {
|
|
93
|
+
workerData,
|
|
94
|
+
transferList: [workerData.managerPort],
|
|
95
|
+
type: 'module',
|
|
96
|
+
name: workerData.name,
|
|
97
|
+
argv: process.argv.slice(2), // Pass command line arguments to worker
|
|
98
|
+
env: process.env, // Inherit environment variables
|
|
99
|
+
execArgv: [], // No execArgv to avoid issues with --inspect
|
|
100
|
+
};
|
|
101
|
+
return new Worker(fileURL, options);
|
|
102
|
+
}
|
|
103
|
+
export class WorkerManager {
|
|
104
|
+
log = new AnsiLogger({
|
|
105
|
+
logName: 'WorkerManager',
|
|
106
|
+
logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */,
|
|
107
|
+
logLevel: hasParameter('workerdebug') ? "debug" /* LogLevel.DEBUG */ : "info" /* LogLevel.INFO */,
|
|
108
|
+
});
|
|
109
|
+
matterbridgeWorker;
|
|
110
|
+
frontendWorker;
|
|
111
|
+
matterWorker;
|
|
112
|
+
testWorker;
|
|
113
|
+
broadcastChannel;
|
|
114
|
+
matterbridgeChannel;
|
|
115
|
+
frontendChannel;
|
|
116
|
+
matterChannel;
|
|
117
|
+
testChannel;
|
|
118
|
+
pingIntervalTimeout;
|
|
119
|
+
pingIntervalMs = 30000;
|
|
120
|
+
matterbridgePongTimeout = undefined;
|
|
121
|
+
frontendPongTimeout = undefined;
|
|
122
|
+
matterPongTimeout = undefined;
|
|
123
|
+
testPongTimeout = undefined;
|
|
124
|
+
tracker = new Tracker('WorkerManager', true, false);
|
|
125
|
+
/**
|
|
126
|
+
* Creates an instance of WorkerManager, initializing and managing multiple workers.
|
|
127
|
+
*
|
|
128
|
+
* @remarks
|
|
129
|
+
* The manager sets up communication channels between itself and the workers:
|
|
130
|
+
* - parentPort: manager <-> worker (control with ControlMessage)
|
|
131
|
+
* - port1: manager -> worker (direct communication for messages from manager to worker)
|
|
132
|
+
* - port2: manager <- worker (direct communication for messages from worker to manager)
|
|
133
|
+
* - broadcastChannel: broadcast messages to manager and all workers
|
|
134
|
+
*/
|
|
135
|
+
constructor() {
|
|
136
|
+
// Setup logger color
|
|
137
|
+
this.log.logNameColor = or;
|
|
138
|
+
// Start Cpu Memory usage tracker
|
|
139
|
+
// @ts-expect-error accessing private property
|
|
140
|
+
this.tracker.log.logNameColor = this.log.logNameColor;
|
|
141
|
+
this.tracker.start();
|
|
142
|
+
// Setup broadcast channel
|
|
143
|
+
this.broadcastChannel = new BroadcastChannel('broadcast-channel');
|
|
144
|
+
this.broadcastChannel.onmessage = this.broadcastMessageHandler.bind(this);
|
|
145
|
+
// Create the matterbridge worker
|
|
146
|
+
this.matterbridgeChannel = new MessageChannel();
|
|
147
|
+
this.matterbridgeWorker = createESMWorker('./dist/workers/matterbridgeWorker.js', {
|
|
148
|
+
name: 'Matterbridge',
|
|
149
|
+
managerPort: this.matterbridgeChannel.port2,
|
|
150
|
+
matterbridge: matterbridge,
|
|
151
|
+
color: 115,
|
|
152
|
+
debug: hasParameter('workerdebug'),
|
|
153
|
+
});
|
|
154
|
+
this.matterbridgeChannel.port2.on('message', this.matterbridgeMessageHandler.bind(this));
|
|
155
|
+
this.matterbridgeWorker.on('error', (err) => {
|
|
156
|
+
inspectError(this.log, 'WorkerManager received error from MatterbridgeWorker', err);
|
|
157
|
+
});
|
|
158
|
+
this.matterbridgeWorker.on('exit', (code) => {
|
|
159
|
+
this.log.debug(`WorkerManager received exit from MatterbridgeWorker with code: ${code}`);
|
|
160
|
+
});
|
|
161
|
+
this.matterbridgeWorker.on('message', (msg) => {
|
|
162
|
+
// this.log.debug(`WorkerManager received message from MatterbridgeWorker: ${debugStringify(msg)}`);
|
|
163
|
+
if (msg.type === 'init') {
|
|
164
|
+
this.log.debug(`WorkerManager: MatterbridgeWorker initialized: ${debugStringify(msg)}`);
|
|
165
|
+
this.postToMatterbridgeWorker({ id: getUniqueId(), timestamp: Date.now(), type: 'matterbridge_initialize', src: 'manager', dst: 'matterbridge' });
|
|
166
|
+
}
|
|
167
|
+
else if (msg.type === 'pong') {
|
|
168
|
+
clearTimeout(this.matterbridgePongTimeout);
|
|
169
|
+
this.matterbridgePongTimeout = undefined;
|
|
170
|
+
}
|
|
171
|
+
else if (msg.type === 'exit') {
|
|
172
|
+
this.log.debug(`WorkerManager: MatterbridgeWorker exited: ${debugStringify(msg)}`);
|
|
173
|
+
this.matterbridgeChannel.port1.close();
|
|
174
|
+
this.matterbridgeChannel.port2.close();
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
// Create the frontend worker
|
|
178
|
+
this.frontendChannel = new MessageChannel();
|
|
179
|
+
this.frontendWorker = createESMWorker('./dist/workers/frontendWorker.js', {
|
|
180
|
+
name: 'Frontend',
|
|
181
|
+
managerPort: this.frontendChannel.port2,
|
|
182
|
+
matterbridge: matterbridge,
|
|
183
|
+
color: 97,
|
|
184
|
+
debug: hasParameter('workerdebug'),
|
|
185
|
+
});
|
|
186
|
+
this.frontendChannel.port2.on('message', this.frontendMessageHandler.bind(this));
|
|
187
|
+
this.frontendWorker.on('error', (err) => {
|
|
188
|
+
inspectError(this.log, 'WorkerManager received error from FrontendWorker', err);
|
|
189
|
+
});
|
|
190
|
+
this.frontendWorker.on('exit', (code) => {
|
|
191
|
+
this.log.debug(`WorkerManager received exit from FrontendWorker with code: ${code}`);
|
|
192
|
+
});
|
|
193
|
+
this.frontendWorker.on('message', (msg) => {
|
|
194
|
+
// this.log.debug(`WorkerManager received message from FrontendWorker: ${debugStringify(msg)}`);
|
|
195
|
+
if (msg.type === 'init') {
|
|
196
|
+
this.log.debug(`WorkerManager: FrontendWorker initialized: ${debugStringify(msg)}`);
|
|
197
|
+
this.postToFrontendWorker({ id: getUniqueId(), timestamp: Date.now(), type: 'frontend_start', src: 'manager', dst: 'frontend', params: { port: 8080 } });
|
|
198
|
+
}
|
|
199
|
+
else if (msg.type === 'pong') {
|
|
200
|
+
clearTimeout(this.frontendPongTimeout);
|
|
201
|
+
this.frontendPongTimeout = undefined;
|
|
202
|
+
}
|
|
203
|
+
else if (msg.type === 'exit') {
|
|
204
|
+
this.log.debug(`WorkerManager: FrontendWorker exited: ${debugStringify(msg)}`);
|
|
205
|
+
this.frontendChannel.port1.close();
|
|
206
|
+
this.frontendChannel.port2.close();
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
// Create the matter worker
|
|
210
|
+
this.matterChannel = new MessageChannel();
|
|
211
|
+
this.matterWorker = createESMWorker('./dist/workers/matterWorker.js', {
|
|
212
|
+
name: 'Matter',
|
|
213
|
+
managerPort: this.matterChannel.port2,
|
|
214
|
+
matterbridge: matterbridge,
|
|
215
|
+
color: 65,
|
|
216
|
+
debug: hasParameter('workerdebug'),
|
|
217
|
+
});
|
|
218
|
+
this.matterChannel.port2.on('message', this.matterMessageHandler.bind(this));
|
|
219
|
+
this.matterWorker.on('error', (err) => {
|
|
220
|
+
inspectError(this.log, 'WorkerManager received error from MatterWorker', err);
|
|
221
|
+
});
|
|
222
|
+
this.matterWorker.on('exit', (code) => {
|
|
223
|
+
this.log.debug(`WorkerManager received exit from MatterWorker with code: ${code}`);
|
|
224
|
+
});
|
|
225
|
+
this.matterWorker.on('message', (msg) => {
|
|
226
|
+
// this.log.debug(`WorkerManager received message from MatterWorker: ${debugStringify(msg)}`);
|
|
227
|
+
if (msg.type === 'init') {
|
|
228
|
+
this.log.debug(`WorkerManager: MatterWorker initialized: ${debugStringify(msg)}`);
|
|
229
|
+
this.postToMatterWorker({ id: getUniqueId(), timestamp: Date.now(), type: 'matter_start', src: 'manager', dst: 'matter', params: { storeId: 'Matterbridge' } });
|
|
230
|
+
}
|
|
231
|
+
else if (msg.type === 'pong') {
|
|
232
|
+
clearTimeout(this.matterPongTimeout);
|
|
233
|
+
this.matterPongTimeout = undefined;
|
|
234
|
+
}
|
|
235
|
+
else if (msg.type === 'exit') {
|
|
236
|
+
this.log.debug(`WorkerManager: MatterWorker exited: ${debugStringify(msg)}`);
|
|
237
|
+
this.matterChannel.port1.close();
|
|
238
|
+
this.matterChannel.port2.close();
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
// Create the test worker
|
|
242
|
+
this.testChannel = new MessageChannel();
|
|
243
|
+
this.testWorker = createESMWorker('./dist/workers/testWorker.js', {
|
|
244
|
+
name: 'Test',
|
|
245
|
+
managerPort: this.testChannel.port2,
|
|
246
|
+
debug: hasParameter('workerdebug'),
|
|
247
|
+
matterbridge: matterbridge,
|
|
248
|
+
});
|
|
249
|
+
this.testChannel.port2.on('message', this.testMessageHandler.bind(this));
|
|
250
|
+
this.testWorker.on('error', (err) => {
|
|
251
|
+
inspectError(this.log, 'WorkerManager received error from TestWorker', err);
|
|
252
|
+
});
|
|
253
|
+
this.testWorker.on('exit', (code) => {
|
|
254
|
+
this.log.debug(`WorkerManager received exit from TestWorker with code: ${code}`);
|
|
255
|
+
});
|
|
256
|
+
this.testWorker.on('message', (msg) => {
|
|
257
|
+
// this.log.debug(`WorkerManager received message from TestWorker: ${debugStringify(msg)}`);
|
|
258
|
+
if (msg.type === 'init') {
|
|
259
|
+
this.log.debug(`WorkerManager: TestWorker initialized: ${debugStringify(msg)}`);
|
|
260
|
+
}
|
|
261
|
+
else if (msg.type === 'pong') {
|
|
262
|
+
clearTimeout(this.testPongTimeout);
|
|
263
|
+
this.testPongTimeout = undefined;
|
|
264
|
+
}
|
|
265
|
+
else if (msg.type === 'exit') {
|
|
266
|
+
this.log.debug(`WorkerManager: TestWorker exited: ${debugStringify(msg)}`);
|
|
267
|
+
this.matterChannel.port1.close();
|
|
268
|
+
this.matterChannel.port2.close();
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
// Periodically ping workers to check if they are alive
|
|
272
|
+
this.pingIntervalTimeout = setInterval(() => {
|
|
273
|
+
this.postControlMessageToAll({ type: 'ping' });
|
|
274
|
+
if (this.matterbridgePongTimeout) {
|
|
275
|
+
this.log.error('WorkerManager: No pong received from MatterbridgeWorker within timeout, it may be unresponsive.');
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
this.matterbridgePongTimeout = setTimeout(() => {
|
|
279
|
+
this.log.error('WorkerManager: No pong received from MatterbridgeWorker within timeout, it may be unresponsive.');
|
|
280
|
+
}, this.pingIntervalMs + 500);
|
|
281
|
+
}
|
|
282
|
+
if (this.frontendPongTimeout) {
|
|
283
|
+
this.log.error('WorkerManager: No pong received from FrontendWorker within timeout, it may be unresponsive.');
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
this.frontendPongTimeout = setTimeout(() => {
|
|
287
|
+
this.log.error('WorkerManager: No pong received from FrontendWorker within timeout, it may be unresponsive.');
|
|
288
|
+
}, this.pingIntervalMs + 500);
|
|
289
|
+
}
|
|
290
|
+
if (this.matterPongTimeout) {
|
|
291
|
+
this.log.error('WorkerManager: No pong received from MatterWorker within timeout, it may be unresponsive.');
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
this.matterPongTimeout = setTimeout(() => {
|
|
295
|
+
this.log.error('WorkerManager: No pong received from MatterWorker within timeout, it may be unresponsive.');
|
|
296
|
+
}, this.pingIntervalMs + 500);
|
|
297
|
+
}
|
|
298
|
+
this.tracker.runGarbageCollector('major');
|
|
299
|
+
this.tracker.runGarbageCollector('minor');
|
|
300
|
+
}, this.pingIntervalMs);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Sends a control message to a specific worker.
|
|
304
|
+
*
|
|
305
|
+
* @param {Worker} worker - The worker to send the message to.
|
|
306
|
+
* @param {ControlMessage} msg - The message to send.
|
|
307
|
+
*/
|
|
308
|
+
postControlMessage(worker, msg) {
|
|
309
|
+
worker.postMessage(msg);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Sends a control message to all workers.
|
|
313
|
+
*
|
|
314
|
+
* @param {ControlMessage} msg - The message to send.
|
|
315
|
+
*/
|
|
316
|
+
postControlMessageToAll(msg) {
|
|
317
|
+
this.postControlMessage(this.matterbridgeWorker, msg);
|
|
318
|
+
this.postControlMessage(this.frontendWorker, msg);
|
|
319
|
+
this.postControlMessage(this.matterWorker, msg);
|
|
320
|
+
this.postControlMessage(this.testWorker, msg);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Initializes all workers.
|
|
324
|
+
*/
|
|
325
|
+
initializeAllWorkers() {
|
|
326
|
+
this.postControlMessageToAll({ type: 'init' });
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Shuts down all workers gracefully.
|
|
330
|
+
*/
|
|
331
|
+
shutdownAllWorkers() {
|
|
332
|
+
clearTimeout(this.matterbridgePongTimeout);
|
|
333
|
+
clearTimeout(this.frontendPongTimeout);
|
|
334
|
+
clearTimeout(this.matterPongTimeout);
|
|
335
|
+
clearTimeout(this.testPongTimeout);
|
|
336
|
+
clearInterval(this.pingIntervalTimeout);
|
|
337
|
+
this.postControlMessageToAll({ type: 'exit' });
|
|
338
|
+
this.broadcastChannel.close();
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Sends a message to the Matterbridge worker via the port 1 of the established MessageChannel.
|
|
342
|
+
*
|
|
343
|
+
* @param {MatterbridgeWorkerMessage} message - The message to be posted to the Matterbridge worker.
|
|
344
|
+
*/
|
|
345
|
+
postToMatterbridgeWorker(message) {
|
|
346
|
+
this.matterbridgeChannel.port1.postMessage(message);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Sends a message to the Frontend worker via the port 1 of the established MessageChannel.
|
|
350
|
+
*
|
|
351
|
+
* @param {FrontendWorkerMessage} message - The message to be posted to the Frontend worker.
|
|
352
|
+
*/
|
|
353
|
+
postToFrontendWorker(message) {
|
|
354
|
+
this.frontendChannel.port1.postMessage(message);
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Sends a message to the Plugin worker via the port 1 of the established MessageChannel.
|
|
358
|
+
*
|
|
359
|
+
* @param {PluginWorkerMessage} message - The message to be posted to the Plugin worker.
|
|
360
|
+
*/
|
|
361
|
+
postToMatterWorker(message) {
|
|
362
|
+
this.matterChannel.port1.postMessage(message);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Handle messages from matterbridgeWorker.
|
|
366
|
+
* It uses the port 2 of the matterbridge MessageChannel for direct communication.
|
|
367
|
+
*
|
|
368
|
+
* @param {MatterbridgeWorkerMessage} msg The message from the matterbridgeWorker
|
|
369
|
+
*/
|
|
370
|
+
matterbridgeMessageHandler(msg) {
|
|
371
|
+
// Handle messages from matterbridgeWorker
|
|
372
|
+
switch (msg.type) {
|
|
373
|
+
case 'plugins_apipluginarray':
|
|
374
|
+
this.log.info('WorkerManager received plugins_apipluginarray from matterbridgeWorker:', msg);
|
|
375
|
+
break;
|
|
376
|
+
case 'devices_basearray':
|
|
377
|
+
this.log.info('WorkerManager received devices_basearray from matterbridgeWorker:', msg);
|
|
378
|
+
break;
|
|
379
|
+
default:
|
|
380
|
+
this.log.warn('WorkerManager received unknown message type from matterbridgeWorker:', msg);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Handle messages from frontendWorker.
|
|
385
|
+
* It uses the port 2 of the frontend MessageChannel for direct communication.
|
|
386
|
+
*
|
|
387
|
+
* @param {FrontendWorkerMessage} msg The message from the frontendWorker
|
|
388
|
+
*/
|
|
389
|
+
frontendMessageHandler(msg) {
|
|
390
|
+
// Handle messages from frontendWorker
|
|
391
|
+
switch (msg.type) {
|
|
392
|
+
case 'frontend_start':
|
|
393
|
+
this.log.info('WorkerManager received frontend_start from frontendWorker:', msg);
|
|
394
|
+
break;
|
|
395
|
+
case 'frontend_stop':
|
|
396
|
+
this.log.info('WorkerManager received frontend_stop from frontendWorker:', msg);
|
|
397
|
+
break;
|
|
398
|
+
default:
|
|
399
|
+
this.log.warn('WorkerManager received unknown message type from frontendWorker:', msg);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Handle messages from matterWorker.
|
|
404
|
+
* It uses the port 2 of the matter MessageChannel for direct communication.
|
|
405
|
+
*
|
|
406
|
+
* @param {MatterWorkerMessage} msg The message from the matterWorker
|
|
407
|
+
*/
|
|
408
|
+
matterMessageHandler(msg) {
|
|
409
|
+
// Handle messages from matterWorker
|
|
410
|
+
switch (msg.type) {
|
|
411
|
+
case 'matter_start':
|
|
412
|
+
this.log.info('WorkerManager received matter_start from matterWorker:', msg);
|
|
413
|
+
break;
|
|
414
|
+
case 'matter_stop':
|
|
415
|
+
this.log.info('WorkerManager received matter_stop from matterWorker:', msg);
|
|
416
|
+
break;
|
|
417
|
+
default:
|
|
418
|
+
this.log.warn('WorkerManager received unknown message type from matterWorker:', msg);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Handle messages from testWorker.
|
|
423
|
+
* It uses the port 2 of the test MessageChannel for direct communication.
|
|
424
|
+
*
|
|
425
|
+
* @param {TestWorkerMessage} msg The message from the testWorker
|
|
426
|
+
*/
|
|
427
|
+
testMessageHandler(msg) {
|
|
428
|
+
// Handle messages from testWorker
|
|
429
|
+
switch (msg.type) {
|
|
430
|
+
default:
|
|
431
|
+
this.log.warn('WorkerManager received unknown message type from testWorker:', msg);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Handle broadcast messages from other workers.
|
|
436
|
+
* It uses the BroadcastChannel for communication.
|
|
437
|
+
*
|
|
438
|
+
* @param {MessageEvent} event The message event containing the broadcast message
|
|
439
|
+
*/
|
|
440
|
+
broadcastMessageHandler(event) {
|
|
441
|
+
const data = event.data;
|
|
442
|
+
this.log.debug(`WorkerManager received broadcast message: ${debugStringify(data)}`);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// for (let i = 1; i <= 255; i++) console.log(`\x1b[38;5;${i}mColor: ${i}`);
|
|
446
|
+
const manager = new WorkerManager();
|
|
447
|
+
manager.initializeAllWorkers();
|
|
448
|
+
let count = 0;
|
|
449
|
+
process.on('SIGINT', () => {
|
|
450
|
+
manager.log.notice('WorkerManager received SIGINT, shutting down workers...');
|
|
451
|
+
manager.shutdownAllWorkers();
|
|
452
|
+
// @ts-expect-error accessing private member for graceful shutdown
|
|
453
|
+
manager.tracker.runGarbageCollector('major');
|
|
454
|
+
// @ts-expect-error accessing private member for graceful shutdown
|
|
455
|
+
manager.tracker.runGarbageCollector('minor');
|
|
456
|
+
// Give some time for workers to shutdown gracefully
|
|
457
|
+
count++;
|
|
458
|
+
if (count > 3)
|
|
459
|
+
process.exit(0);
|
|
460
|
+
setTimeout(() => {
|
|
461
|
+
process.exit(0);
|
|
462
|
+
}, 120000).unref();
|
|
463
|
+
});
|
|
464
|
+
//# sourceMappingURL=workerManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerManager.js","sourceRoot":"","sources":["../../src/workers/workerManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { MessagePort } from 'node:worker_threads';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { AnsiLogger } from 'node-ansi-logger';
|
|
4
|
+
import { WorkerMessage, WorkerMessageRequest, WorkerMessageRequestAny, WorkerMessageResponse, WorkerMessageResponseSuccess, WorkerMessageTypes } from '@matterbridge/types';
|
|
5
|
+
import { Matterbridge } from '../matterbridge.js';
|
|
6
|
+
import { ControlMessage, WorkerData } from './workerTypes.js';
|
|
7
|
+
interface WorkerServerEvents {
|
|
8
|
+
control_message: [msg: ControlMessage];
|
|
9
|
+
manager_message: [msg: WorkerMessage];
|
|
10
|
+
broadcast_message: [msg: WorkerMessage];
|
|
11
|
+
}
|
|
12
|
+
export declare class WorkerServer extends EventEmitter<WorkerServerEvents> {
|
|
13
|
+
readonly log: AnsiLogger;
|
|
14
|
+
readonly name: string;
|
|
15
|
+
readonly matterbridge: Matterbridge;
|
|
16
|
+
readonly color: number | undefined;
|
|
17
|
+
private parentPort;
|
|
18
|
+
private managerPort;
|
|
19
|
+
private broadcastChannel;
|
|
20
|
+
private readonly debug;
|
|
21
|
+
private readonly verbose;
|
|
22
|
+
private readonly tracker;
|
|
23
|
+
constructor(name: string, parentPort: MessagePort | null, workerData: WorkerData);
|
|
24
|
+
private controlMessageHandler;
|
|
25
|
+
private managerMessageHandler;
|
|
26
|
+
private broadcastMessageHandler;
|
|
27
|
+
/**
|
|
28
|
+
* Generate a pseudo-random identifier between 100,000,000 and 999,999,999.
|
|
29
|
+
*
|
|
30
|
+
* @returns {number} A nine-digit identifier.
|
|
31
|
+
*/
|
|
32
|
+
getUniqueId(): number;
|
|
33
|
+
/**
|
|
34
|
+
* Type guard to verify a value matches the WorkerMessageRequest structure.
|
|
35
|
+
*
|
|
36
|
+
* @param {unknown} value Value to test.
|
|
37
|
+
* @returns {value is WorkerMessageRequest} True when the value looks like a request message.
|
|
38
|
+
*/
|
|
39
|
+
isWorkerRequest(value: unknown): value is WorkerMessageRequest;
|
|
40
|
+
/**
|
|
41
|
+
* Type guard to verify a value matches a specific WorkerMessageRequest structure.
|
|
42
|
+
*
|
|
43
|
+
* @param {unknown} value Value to test.
|
|
44
|
+
* @param {K} type Worker message type to match.
|
|
45
|
+
* @returns {value is WorkerMessageRequest<K>} True when the value looks like a request message of the requested type.
|
|
46
|
+
*/
|
|
47
|
+
isWorkerRequestOfType<K extends keyof WorkerMessageTypes>(value: unknown, type: K): value is WorkerMessageRequest<K>;
|
|
48
|
+
/**
|
|
49
|
+
* Type guard to verify a value matches the WorkerMessageResponse structure.
|
|
50
|
+
*
|
|
51
|
+
* @param {unknown} value Value to test.
|
|
52
|
+
* @returns {value is WorkerMessageResponse} True when the value looks like a response message.
|
|
53
|
+
*/
|
|
54
|
+
isWorkerResponse(value: unknown): value is WorkerMessageResponse;
|
|
55
|
+
/**
|
|
56
|
+
* Type guard to verify a value matches a specific WorkerMessageResponse structure.
|
|
57
|
+
*
|
|
58
|
+
* @param {unknown} value Value to test.
|
|
59
|
+
* @param {K} type Worker message type to match.
|
|
60
|
+
* @returns {value is WorkerMessageResponse<K>} True when the value looks like a response message of the requested type.
|
|
61
|
+
*/
|
|
62
|
+
isWorkerResponseOfType<K extends keyof WorkerMessageTypes>(value: unknown, type: K): value is WorkerMessageResponse<K>;
|
|
63
|
+
/**
|
|
64
|
+
* Exits the worker process.
|
|
65
|
+
*
|
|
66
|
+
* This method sends an exit message to the parent, closes all ports and channels, and then exits the process with the given code.
|
|
67
|
+
*
|
|
68
|
+
* @param {number} code - The exit code (0 for success, non-zero for failure).
|
|
69
|
+
*/
|
|
70
|
+
exit(code: number): void;
|
|
71
|
+
/**
|
|
72
|
+
* Sends a control message to the parent through parentPort
|
|
73
|
+
*
|
|
74
|
+
* @param {ControlMessage} message - The control message to send.
|
|
75
|
+
*/
|
|
76
|
+
parentPost(message: ControlMessage): void;
|
|
77
|
+
/**
|
|
78
|
+
* Sends a message to the manager
|
|
79
|
+
*
|
|
80
|
+
* @param {WorkerMessage} message - The message to send.
|
|
81
|
+
*/
|
|
82
|
+
managerPost(message: WorkerMessage): void;
|
|
83
|
+
/**
|
|
84
|
+
* Broadcast a message to all workers.
|
|
85
|
+
*
|
|
86
|
+
* @param {WorkerMessage} message - The message to broadcast.
|
|
87
|
+
*/
|
|
88
|
+
broadcast(message: WorkerMessage): void;
|
|
89
|
+
/**
|
|
90
|
+
* Send a request message from the worker implementation.
|
|
91
|
+
*
|
|
92
|
+
* @template K
|
|
93
|
+
* @param {WorkerMessageRequest<K>} message The request message to send.
|
|
94
|
+
* @returns {void}
|
|
95
|
+
*/
|
|
96
|
+
request<K extends keyof WorkerMessageTypes>(message: WorkerMessageRequest<K>): void;
|
|
97
|
+
/**
|
|
98
|
+
* Send a response message from the worker implementation.
|
|
99
|
+
*
|
|
100
|
+
* @template K
|
|
101
|
+
* @param {WorkerMessageResponse<K>} message The response message to send.
|
|
102
|
+
* @returns {void}
|
|
103
|
+
*/
|
|
104
|
+
respond<K extends keyof WorkerMessageTypes>(message: WorkerMessageResponse<K>): void;
|
|
105
|
+
/**
|
|
106
|
+
* Fetch data from a worker.
|
|
107
|
+
* It broadcasts a request message and waits for a valid response with the same id.
|
|
108
|
+
*
|
|
109
|
+
* @template K
|
|
110
|
+
* @param {WorkerMessageRequest<K>} message - The typed request message to fetch.
|
|
111
|
+
* @param {number} timeout - The timeout in milliseconds to wait for a response. Default is 250ms.
|
|
112
|
+
* @returns {Promise<WorkerMessageResponseSuccess<K>>} A promise that resolves with the successful response from the worker or rejects on timeout.
|
|
113
|
+
* @throws {Error} If the fetch operation times out after 250ms or if an error response is received or if the response is malformed.
|
|
114
|
+
*/
|
|
115
|
+
fetch<T extends WorkerMessageRequestAny, K extends Extract<keyof WorkerMessageTypes, T['type']>>(message: T, timeout?: number): Promise<WorkerMessageResponseSuccess<K>>;
|
|
116
|
+
/**
|
|
117
|
+
* Summarize live libuv handles/requests inside a process.
|
|
118
|
+
*
|
|
119
|
+
* @param {AnsiLogger} log - Logger to use for output
|
|
120
|
+
*
|
|
121
|
+
* @returns {number} - The total number of active handles and requests
|
|
122
|
+
*/
|
|
123
|
+
static logKeepAlives(log: AnsiLogger): number;
|
|
124
|
+
}
|
|
125
|
+
export {};
|
|
126
|
+
//# sourceMappingURL=workerServer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerServer.d.ts","sourceRoot":"","sources":["../../src/workers/workerServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAgF,MAAM,kBAAkB,CAAC;AAE5H,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE5K,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9D,UAAU,kBAAkB;IAC1B,eAAe,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACvC,eAAe,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACtC,iBAAiB,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;CACzC;AAED,qBAAa,YAAa,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAChE,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAA6C;IAErE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoD;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,GAAG,IAAI,EAAE,UAAU,EAAE,UAAU;IAsChF,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,uBAAuB;IAK/B;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;;OAKG;IACH,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB;IAmB9D;;;;;;OAMG;IACH,qBAAqB,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,oBAAoB,CAAC,CAAC,CAAC;IAIpH;;;;;OAKG;IACH,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,qBAAqB;IAqBhE;;;;;;OAMG;IACH,sBAAsB,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,qBAAqB,CAAC,CAAC,CAAC;IAItH;;;;;;OAMG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM;IAejB;;;;OAIG;IACH,UAAU,CAAC,OAAO,EAAE,cAAc;IAKlC;;;;OAIG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa;IAIlC;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,aAAa;IAKhC;;;;;;OAMG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI;IAmBnF;;;;;;OAMG;IACH,OAAO,CAAC,CAAC,SAAS,MAAM,kBAAkB,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,IAAI;IAmBpF;;;;;;;;;OASG;IACG,KAAK,CAAC,CAAC,SAAS,uBAAuB,EAAE,CAAC,SAAS,OAAO,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EACnG,OAAO,EAAE,CAAC,EACV,OAAO,GAAE,MAAY,GACpB,OAAO,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC;IAoC3C;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM;CAqC9C"}
|