@eggjs/cluster 4.0.0-beta.19 → 4.0.0-beta.21

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.
Files changed (37) hide show
  1. package/dist/agent_worker.d.ts +1 -1
  2. package/dist/agent_worker.js +63 -50
  3. package/dist/app_worker.d.ts +1 -1
  4. package/dist/app_worker.js +165 -127
  5. package/dist/dirname.d.ts +1 -0
  6. package/dist/dirname.js +10 -10
  7. package/dist/error/ClusterAgentWorkerError.d.ts +9 -12
  8. package/dist/error/ClusterAgentWorkerError.js +19 -22
  9. package/dist/error/ClusterWorkerExceptionError.d.ts +6 -9
  10. package/dist/error/ClusterWorkerExceptionError.js +14 -17
  11. package/dist/error/index.d.ts +2 -0
  12. package/dist/error/index.js +3 -0
  13. package/dist/index.d.ts +5 -10
  14. package/dist/index.js +16 -20
  15. package/dist/master.d.ts +86 -92
  16. package/dist/master.js +543 -416
  17. package/dist/utils/messenger.d.ts +44 -48
  18. package/dist/utils/messenger.js +178 -143
  19. package/dist/utils/mode/base/agent.d.ts +35 -42
  20. package/dist/utils/mode/base/agent.js +64 -62
  21. package/dist/utils/mode/base/app.d.ts +45 -53
  22. package/dist/utils/mode/base/app.js +79 -76
  23. package/dist/utils/mode/impl/process/agent.d.ts +16 -20
  24. package/dist/utils/mode/impl/process/agent.js +101 -91
  25. package/dist/utils/mode/impl/process/app.d.ts +20 -11
  26. package/dist/utils/mode/impl/process/app.js +118 -116
  27. package/dist/utils/mode/impl/worker_threads/agent.d.ts +16 -20
  28. package/dist/utils/mode/impl/worker_threads/agent.js +82 -77
  29. package/dist/utils/mode/impl/worker_threads/app.d.ts +25 -12
  30. package/dist/utils/mode/impl/worker_threads/app.js +137 -128
  31. package/dist/utils/options.d.ts +76 -79
  32. package/dist/utils/options.js +80 -55
  33. package/dist/utils/terminate.d.ts +6 -0
  34. package/dist/utils/terminate.js +70 -51
  35. package/dist/utils/worker_manager.d.ts +24 -31
  36. package/dist/utils/worker_manager.js +74 -68
  37. package/package.json +6 -6
@@ -1,117 +1,119 @@
1
- import { BaseAppUtils, BaseAppWorker } from "../../base/app.js";
1
+ import cluster, {} from 'node:cluster';
2
+ import { cfork } from 'cfork';
3
+ import { sendmessage } from 'sendmessage';
4
+ import { graceful as gracefulExit } from 'graceful-process';
5
+ import { BaseAppWorker, BaseAppUtils } from "../../base/app.js";
2
6
  import { terminate } from "../../../terminate.js";
3
- import { sendmessage } from "sendmessage";
4
- import { graceful } from "graceful-process";
5
- import cluster from "node:cluster";
6
- import { cfork } from "cfork";
7
-
8
- //#region src/utils/mode/impl/process/app.ts
9
- var AppProcessWorker = class extends BaseAppWorker {
10
- get id() {
11
- return this.instance.id;
12
- }
13
- get workerId() {
14
- return this.instance.process.pid;
15
- }
16
- get exitedAfterDisconnect() {
17
- return this.instance.exitedAfterDisconnect;
18
- }
19
- get exitCode() {
20
- return this.instance.process.exitCode;
21
- }
22
- send(message) {
23
- sendmessage(this.instance, message);
24
- }
25
- clean() {
26
- this.instance.removeAllListeners();
27
- }
28
- static get workerId() {
29
- return process.pid;
30
- }
31
- static on(event, listener) {
32
- process.on(event, listener);
33
- }
34
- static send(message) {
35
- message.senderWorkerId = String(process.pid);
36
- process.send(message);
37
- }
38
- static kill() {
39
- process.exitCode = 1;
40
- process.kill(process.pid);
41
- }
42
- static gracefulExit(options) {
43
- graceful(options);
44
- }
45
- };
46
- var AppProcessUtils = class extends BaseAppUtils {
47
- fork() {
48
- this.startTime = Date.now();
49
- this.startSuccessCount = 0;
50
- const args = [JSON.stringify(this.options)];
51
- this.log("[master] start appWorker with args %j (process)", args);
52
- cfork({
53
- exec: this.getAppWorkerFile(),
54
- args,
55
- silent: false,
56
- count: this.options.workers,
57
- refork: this.isProduction,
58
- windowsHide: process.platform === "win32"
59
- });
60
- let debugPort = process.debugPort;
61
- cluster.on("fork", (worker) => {
62
- const appWorker = new AppProcessWorker(worker);
63
- this.emit("worker_forked", appWorker);
64
- appWorker.disableRefork = true;
65
- worker.on("message", (msg) => {
66
- if (typeof msg === "string") msg = {
67
- action: msg,
68
- data: msg
69
- };
70
- msg.from = "app";
71
- this.messenger.send(msg);
72
- });
73
- this.log("[master] app_worker#%s:%s start, state: %s, current workers: %j", appWorker.id, appWorker.workerId, appWorker.state, Object.keys(cluster.workers));
74
- if (this.options.isDebug) {
75
- debugPort++;
76
- this.messenger.send({
77
- to: "parent",
78
- from: "app",
79
- action: "debug",
80
- data: {
81
- debugPort,
82
- pid: appWorker.workerId,
83
- workerId: appWorker.workerId
84
- }
85
- });
86
- }
87
- });
88
- cluster.on("disconnect", (worker) => {
89
- const appWorker = new AppProcessWorker(worker);
90
- this.log("[master] app_worker#%s:%s disconnect, suicide: %s, state: %s, current workers: %j", appWorker.id, appWorker.workerId, appWorker.exitedAfterDisconnect, appWorker.state, Object.keys(cluster.workers));
91
- });
92
- cluster.on("exit", (worker, code, signal) => {
93
- const appWorker = new AppProcessWorker(worker);
94
- this.messenger.send({
95
- action: "app-exit",
96
- data: {
97
- workerId: appWorker.workerId,
98
- code,
99
- signal
100
- },
101
- to: "master",
102
- from: "app"
103
- });
104
- });
105
- return this;
106
- }
107
- async kill(timeout) {
108
- await Promise.all(Object.keys(cluster.workers).map((id) => {
109
- const worker = cluster.workers[id];
110
- Reflect.set(worker, "disableRefork", true);
111
- return terminate(worker.process, timeout);
112
- }));
113
- }
114
- };
115
-
116
- //#endregion
117
- export { AppProcessUtils, AppProcessWorker };
7
+ export class AppProcessWorker extends BaseAppWorker {
8
+ get id() {
9
+ return this.instance.id;
10
+ }
11
+ get workerId() {
12
+ return this.instance.process.pid;
13
+ }
14
+ get exitedAfterDisconnect() {
15
+ return this.instance.exitedAfterDisconnect;
16
+ }
17
+ get exitCode() {
18
+ return this.instance.process.exitCode;
19
+ }
20
+ send(message) {
21
+ sendmessage(this.instance, message);
22
+ }
23
+ clean() {
24
+ this.instance.removeAllListeners();
25
+ }
26
+ // static methods use on src/app_worker.ts
27
+ static get workerId() {
28
+ return process.pid;
29
+ }
30
+ static on(event, listener) {
31
+ process.on(event, listener);
32
+ }
33
+ static send(message) {
34
+ message.senderWorkerId = String(process.pid);
35
+ process.send(message);
36
+ }
37
+ static kill() {
38
+ process.exitCode = 1;
39
+ process.kill(process.pid);
40
+ }
41
+ static gracefulExit(options) {
42
+ gracefulExit(options);
43
+ }
44
+ }
45
+ export class AppProcessUtils extends BaseAppUtils {
46
+ fork() {
47
+ this.startTime = Date.now();
48
+ this.startSuccessCount = 0;
49
+ const args = [JSON.stringify(this.options)];
50
+ this.log('[master] start appWorker with args %j (process)', args);
51
+ cfork({
52
+ exec: this.getAppWorkerFile(),
53
+ args,
54
+ silent: false,
55
+ count: this.options.workers,
56
+ // don't refork in local env
57
+ refork: this.isProduction,
58
+ windowsHide: process.platform === 'win32',
59
+ });
60
+ let debugPort = process.debugPort;
61
+ cluster.on('fork', worker => {
62
+ const appWorker = new AppProcessWorker(worker);
63
+ this.emit('worker_forked', appWorker);
64
+ appWorker.disableRefork = true;
65
+ worker.on('message', msg => {
66
+ if (typeof msg === 'string') {
67
+ msg = {
68
+ action: msg,
69
+ data: msg,
70
+ };
71
+ }
72
+ msg.from = 'app';
73
+ this.messenger.send(msg);
74
+ });
75
+ this.log('[master] app_worker#%s:%s start, state: %s, current workers: %j', appWorker.id, appWorker.workerId, appWorker.state, Object.keys(cluster.workers));
76
+ // send debug message, due to `brk` scene, send here instead of app_worker.js
77
+ if (this.options.isDebug) {
78
+ debugPort++;
79
+ this.messenger.send({
80
+ to: 'parent',
81
+ from: 'app',
82
+ action: 'debug',
83
+ data: {
84
+ debugPort,
85
+ // keep compatibility, should use workerId instead
86
+ pid: appWorker.workerId,
87
+ workerId: appWorker.workerId,
88
+ },
89
+ });
90
+ }
91
+ });
92
+ cluster.on('disconnect', worker => {
93
+ const appWorker = new AppProcessWorker(worker);
94
+ this.log('[master] app_worker#%s:%s disconnect, suicide: %s, state: %s, current workers: %j', appWorker.id, appWorker.workerId, appWorker.exitedAfterDisconnect, appWorker.state, Object.keys(cluster.workers));
95
+ });
96
+ cluster.on('exit', (worker, code, signal) => {
97
+ const appWorker = new AppProcessWorker(worker);
98
+ this.messenger.send({
99
+ action: 'app-exit',
100
+ data: {
101
+ workerId: appWorker.workerId,
102
+ code,
103
+ signal,
104
+ },
105
+ to: 'master',
106
+ from: 'app',
107
+ });
108
+ });
109
+ return this;
110
+ }
111
+ async kill(timeout) {
112
+ await Promise.all(Object.keys(cluster.workers).map(id => {
113
+ const worker = cluster.workers[id];
114
+ Reflect.set(worker, 'disableRefork', true);
115
+ return terminate(worker.process, timeout);
116
+ }));
117
+ }
118
+ }
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3V0aWxzL21vZGUvaW1wbC9wcm9jZXNzL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE9BQU8sRUFBRSxFQUF1QyxNQUFNLGNBQWMsQ0FBQztBQUU1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQXVDLE1BQU0sa0JBQWtCLENBQUM7QUFFakcsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHbEQsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGFBQW1DO0lBQ3ZFLElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBSSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBb0I7UUFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELDBDQUEwQztJQUUxQyxNQUFNLEtB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
@@ -1,22 +1,18 @@
1
- import { BaseAgentUtils, BaseAgentWorker } from "../../base/agent.js";
2
- import { MessageBody } from "../../../messenger.js";
3
- import { Worker } from "node:worker_threads";
4
- import { Options } from "graceful-process";
5
-
6
- //#region src/utils/mode/impl/worker_threads/agent.d.ts
7
- declare class AgentThreadWorker extends BaseAgentWorker<Worker> {
8
- get workerId(): number;
9
- send(message: MessageBody): void;
10
- static send(message: MessageBody): void;
11
- static kill(): void;
12
- static gracefulExit(options: Options): void;
1
+ import { type Worker } from 'node:worker_threads';
2
+ import { type Options as gracefulExitOptions } from 'graceful-process';
3
+ import { BaseAgentUtils, BaseAgentWorker } from '../../base/agent.ts';
4
+ import type { MessageBody } from '../../../messenger.ts';
5
+ export declare class AgentThreadWorker extends BaseAgentWorker<Worker> {
6
+ get workerId(): number;
7
+ send(message: MessageBody): void;
8
+ static send(message: MessageBody): void;
9
+ static kill(): void;
10
+ static gracefulExit(options: gracefulExitOptions): void;
13
11
  }
14
- declare class AgentThreadUtils extends BaseAgentUtils {
15
- #private;
16
- instance: AgentThreadWorker;
17
- fork(): void;
18
- clean(): void;
19
- kill(): Promise<void>;
12
+ export declare class AgentThreadUtils extends BaseAgentUtils {
13
+ #private;
14
+ instance: AgentThreadWorker;
15
+ fork(): void;
16
+ clean(): void;
17
+ kill(): Promise<void>;
20
18
  }
21
- //#endregion
22
- export { AgentThreadUtils };
@@ -1,79 +1,84 @@
1
+ import workerThreads, {} from 'node:worker_threads';
2
+ import {} from 'graceful-process';
1
3
  import { BaseAgentUtils, BaseAgentWorker } from "../../base/agent.js";
2
4
  import { ClusterAgentWorkerError } from "../../../../error/ClusterAgentWorkerError.js";
3
- import workerThreads from "node:worker_threads";
4
- import "graceful-process";
5
-
6
- //#region src/utils/mode/impl/worker_threads/agent.ts
7
- var AgentThreadWorker = class extends BaseAgentWorker {
8
- get workerId() {
9
- return this.instance.threadId;
10
- }
11
- send(message) {
12
- this.instance.postMessage(message);
13
- }
14
- static send(message) {
15
- message.senderWorkerId = String(workerThreads.threadId);
16
- workerThreads.parentPort.postMessage(message);
17
- }
18
- static kill() {
19
- process.exit(1);
20
- }
21
- static gracefulExit(options) {
22
- const { beforeExit } = options;
23
- process.on("exit", async (code) => {
24
- if (typeof beforeExit === "function") await beforeExit();
25
- process.exit(code);
26
- });
27
- }
28
- };
29
- var AgentThreadUtils = class extends BaseAgentUtils {
30
- #worker;
31
- #id = 0;
32
- instance;
33
- fork() {
34
- this.startTime = Date.now();
35
- const argv = [JSON.stringify(this.options)];
36
- const agentPath = this.getAgentWorkerFile();
37
- const worker = this.#worker = new workerThreads.Worker(agentPath, { argv });
38
- const agentWorker = this.instance = new AgentThreadWorker(worker);
39
- this.emit("agent_forked", agentWorker);
40
- agentWorker.status = "starting";
41
- agentWorker.id = ++this.#id;
42
- this.log("[master] agent_worker#%s:%s start with worker_threads", agentWorker.id, agentWorker.workerId);
43
- worker.on("message", (msg) => {
44
- if (typeof msg === "string") msg = {
45
- action: msg,
46
- data: msg
47
- };
48
- msg.from = "agent";
49
- this.messenger.send(msg);
50
- });
51
- worker.on("error", (err) => {
52
- this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
53
- });
54
- worker.once("exit", (code, signal) => {
55
- this.messenger.send({
56
- action: "agent-exit",
57
- data: {
58
- code,
59
- signal
60
- },
61
- to: "master",
62
- from: "agent"
63
- });
64
- });
65
- }
66
- clean() {
67
- this.#worker.removeAllListeners();
68
- }
69
- async kill() {
70
- if (this.#worker) {
71
- this.log(`[master] kill agent worker#${this.#id} (worker_threads) by worker.terminate()`);
72
- this.clean();
73
- await this.#worker.terminate();
74
- }
75
- }
76
- };
77
-
78
- //#endregion
79
- export { AgentThreadUtils, AgentThreadWorker };
5
+ export class AgentThreadWorker extends BaseAgentWorker {
6
+ get workerId() {
7
+ return this.instance.threadId;
8
+ }
9
+ send(message) {
10
+ this.instance.postMessage(message);
11
+ }
12
+ static send(message) {
13
+ message.senderWorkerId = String(workerThreads.threadId);
14
+ workerThreads.parentPort.postMessage(message);
15
+ }
16
+ static kill() {
17
+ // in worker_threads, process.exit
18
+ // does not stop the whole program, just the single thread
19
+ process.exit(1);
20
+ }
21
+ static gracefulExit(options) {
22
+ const { beforeExit } = options;
23
+ process.on('exit', async (code) => {
24
+ if (typeof beforeExit === 'function') {
25
+ await beforeExit();
26
+ }
27
+ process.exit(code);
28
+ });
29
+ }
30
+ }
31
+ export class AgentThreadUtils extends BaseAgentUtils {
32
+ #worker;
33
+ #id = 0;
34
+ instance;
35
+ fork() {
36
+ this.startTime = Date.now();
37
+ // start agent worker
38
+ const argv = [JSON.stringify(this.options)];
39
+ const agentPath = this.getAgentWorkerFile();
40
+ const worker = (this.#worker = new workerThreads.Worker(agentPath, { argv }));
41
+ // wrap agent worker
42
+ const agentWorker = (this.instance = new AgentThreadWorker(worker));
43
+ this.emit('agent_forked', agentWorker);
44
+ agentWorker.status = 'starting';
45
+ agentWorker.id = ++this.#id;
46
+ this.log('[master] agent_worker#%s:%s start with worker_threads', agentWorker.id, agentWorker.workerId);
47
+ worker.on('message', msg => {
48
+ if (typeof msg === 'string') {
49
+ msg = {
50
+ action: msg,
51
+ data: msg,
52
+ };
53
+ }
54
+ msg.from = 'agent';
55
+ this.messenger.send(msg);
56
+ });
57
+ worker.on('error', err => {
58
+ this.logger.error(new ClusterAgentWorkerError(agentWorker.id, agentWorker.workerId, agentWorker.status, err));
59
+ });
60
+ // agent exit message
61
+ worker.once('exit', (code, signal) => {
62
+ this.messenger.send({
63
+ action: 'agent-exit',
64
+ data: {
65
+ code,
66
+ signal,
67
+ },
68
+ to: 'master',
69
+ from: 'agent',
70
+ });
71
+ });
72
+ }
73
+ clean() {
74
+ this.#worker.removeAllListeners();
75
+ }
76
+ async kill() {
77
+ if (this.#worker) {
78
+ this.log(`[master] kill agent worker#${this.#id} (worker_threads) by worker.terminate()`);
79
+ this.clean();
80
+ await this.#worker.terminate();
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdXRpbHMvbW9kZS9pbXBsL3dvcmtlcl90aHJlYWRzL2FnZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sYUFBYSxFQUFFLEVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRSxPQUFPLEVBQXVDLE1BQU0sa0JBQWtCLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUV2RixNQUFNLE9BQU8saUJBQWtCLFNBQVEsZUFBdUI7SUFDNUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQW9CO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQW9CO1FBQzlCLE9BQU8sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxhQUFhLENBQUMsVUFBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUk7UUFDVCxrQ0FBa0M7UUFDbEMsMERBQTBEO1FBQzFELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBNEI7UUFDOUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUMvQixPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsSUFBSSxFQUFDLEVBQUU7WUFDOUIsSUFBSSxPQUFP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
@@ -1,13 +1,26 @@
1
- import { BaseAppUtils } from "../../base/app.js";
2
- import { Worker } from "node:worker_threads";
3
- import { Options } from "graceful-process";
4
-
5
- //#region src/utils/mode/impl/worker_threads/app.d.ts
6
-
7
- declare class AppThreadUtils extends BaseAppUtils {
8
- #private;
9
- fork(): this;
10
- kill(): Promise<void>;
1
+ import { Worker as ThreadWorker } from 'node:worker_threads';
2
+ import type { Options as gracefulExitOptions } from 'graceful-process';
3
+ import { BaseAppWorker, BaseAppUtils } from '../../base/app.ts';
4
+ import type { MessageBody } from '../../../messenger.ts';
5
+ export declare class AppThreadWorker extends BaseAppWorker<ThreadWorker> {
6
+ #private;
7
+ constructor(instance: ThreadWorker, id: number);
8
+ get id(): number;
9
+ get workerId(): number;
10
+ get state(): string;
11
+ set state(val: string);
12
+ get exitedAfterDisconnect(): boolean;
13
+ get exitCode(): number;
14
+ send(message: MessageBody): void;
15
+ clean(): void;
16
+ static get workerId(): number;
17
+ static on(event: string, listener: (...args: any[]) => void): void;
18
+ static send(message: MessageBody): void;
19
+ static kill(): void;
20
+ static gracefulExit(options: gracefulExitOptions): void;
21
+ }
22
+ export declare class AppThreadUtils extends BaseAppUtils {
23
+ #private;
24
+ fork(): this;
25
+ kill(): Promise<void>;
11
26
  }
12
- //#endregion
13
- export { AppThreadUtils };