nmtjs 0.16.0 → 0.17.0-beta.1
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.md +1 -1
- package/README.md +41 -1
- package/dist/index.d.ts +22 -121
- package/dist/index.js +24 -53
- package/dist/index.js.map +1 -1
- package/package.json +11 -63
- package/src/index.ts +71 -91
- package/bin/cli.js +0 -2
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -137
- package/dist/cli.js.map +0 -1
- package/dist/codegen.d.ts +0 -5
- package/dist/codegen.js +0 -18
- package/dist/codegen.js.map +0 -1
- package/dist/config.d.ts +0 -47
- package/dist/config.js +0 -16
- package/dist/config.js.map +0 -1
- package/dist/entrypoints/cli.d.ts +0 -1
- package/dist/entrypoints/cli.js +0 -12
- package/dist/entrypoints/cli.js.map +0 -1
- package/dist/entrypoints/main.d.ts +0 -5
- package/dist/entrypoints/main.js +0 -248
- package/dist/entrypoints/main.js.map +0 -1
- package/dist/entrypoints/thread.d.ts +0 -16
- package/dist/entrypoints/thread.js +0 -182
- package/dist/entrypoints/thread.js.map +0 -1
- package/dist/entrypoints/worker.d.ts +0 -9
- package/dist/entrypoints/worker.js +0 -143
- package/dist/entrypoints/worker.js.map +0 -1
- package/dist/resolver.d.ts +0 -2
- package/dist/resolver.js +0 -7
- package/dist/resolver.js.map +0 -1
- package/dist/runtime/application/index.d.ts +0 -1
- package/dist/runtime/application/index.js +0 -2
- package/dist/runtime/application/index.js.map +0 -1
- package/dist/runtime/constants.d.ts +0 -8
- package/dist/runtime/constants.js +0 -5
- package/dist/runtime/constants.js.map +0 -1
- package/dist/runtime/enums.d.ts +0 -10
- package/dist/runtime/enums.js +0 -13
- package/dist/runtime/enums.js.map +0 -1
- package/dist/runtime/hooks.d.ts +0 -1
- package/dist/runtime/hooks.js +0 -2
- package/dist/runtime/hooks.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -28
- package/dist/runtime/index.js +0 -29
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/injectables.d.ts +0 -28
- package/dist/runtime/injectables.js +0 -24
- package/dist/runtime/injectables.js.map +0 -1
- package/dist/runtime/jobs/job.d.ts +0 -146
- package/dist/runtime/jobs/job.js +0 -89
- package/dist/runtime/jobs/job.js.map +0 -1
- package/dist/runtime/jobs/manager.d.ts +0 -131
- package/dist/runtime/jobs/manager.js +0 -309
- package/dist/runtime/jobs/manager.js.map +0 -1
- package/dist/runtime/jobs/router.d.ts +0 -296
- package/dist/runtime/jobs/router.js +0 -458
- package/dist/runtime/jobs/router.js.map +0 -1
- package/dist/runtime/jobs/runner.d.ts +0 -103
- package/dist/runtime/jobs/runner.js +0 -425
- package/dist/runtime/jobs/runner.js.map +0 -1
- package/dist/runtime/jobs/step.d.ts +0 -26
- package/dist/runtime/jobs/step.js +0 -18
- package/dist/runtime/jobs/step.js.map +0 -1
- package/dist/runtime/jobs/types.d.ts +0 -86
- package/dist/runtime/jobs/types.js +0 -5
- package/dist/runtime/jobs/types.js.map +0 -1
- package/dist/runtime/metrics/metric.d.ts +0 -8
- package/dist/runtime/metrics/metric.js +0 -11
- package/dist/runtime/metrics/metric.js.map +0 -1
- package/dist/runtime/metrics/registry.d.ts +0 -3
- package/dist/runtime/metrics/registry.js +0 -5
- package/dist/runtime/metrics/registry.js.map +0 -1
- package/dist/runtime/metrics/server.d.ts +0 -7
- package/dist/runtime/metrics/server.js +0 -53
- package/dist/runtime/metrics/server.js.map +0 -1
- package/dist/runtime/plugin.d.ts +0 -2
- package/dist/runtime/plugin.js +0 -2
- package/dist/runtime/plugin.js.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -27
- package/dist/runtime/runtime.js +0 -77
- package/dist/runtime/runtime.js.map +0 -1
- package/dist/runtime/scheduler/index.d.ts +0 -22
- package/dist/runtime/scheduler/index.js +0 -20
- package/dist/runtime/scheduler/index.js.map +0 -1
- package/dist/runtime/server/applications.d.ts +0 -91
- package/dist/runtime/server/applications.js +0 -171
- package/dist/runtime/server/applications.js.map +0 -1
- package/dist/runtime/server/config.d.ts +0 -148
- package/dist/runtime/server/config.js +0 -33
- package/dist/runtime/server/config.js.map +0 -1
- package/dist/runtime/server/environment.d.ts +0 -43
- package/dist/runtime/server/environment.js +0 -33
- package/dist/runtime/server/environment.js.map +0 -1
- package/dist/runtime/server/error-policy.d.ts +0 -62
- package/dist/runtime/server/error-policy.js +0 -73
- package/dist/runtime/server/error-policy.js.map +0 -1
- package/dist/runtime/server/hmr-coordinator.d.ts +0 -37
- package/dist/runtime/server/hmr-coordinator.js +0 -94
- package/dist/runtime/server/hmr-coordinator.js.map +0 -1
- package/dist/runtime/server/jobs.d.ts +0 -54
- package/dist/runtime/server/jobs.js +0 -176
- package/dist/runtime/server/jobs.js.map +0 -1
- package/dist/runtime/server/lifecycle.d.ts +0 -85
- package/dist/runtime/server/lifecycle.js +0 -177
- package/dist/runtime/server/lifecycle.js.map +0 -1
- package/dist/runtime/server/managed-worker.d.ts +0 -158
- package/dist/runtime/server/managed-worker.js +0 -420
- package/dist/runtime/server/managed-worker.js.map +0 -1
- package/dist/runtime/server/pool-manager.d.ts +0 -85
- package/dist/runtime/server/pool-manager.js +0 -129
- package/dist/runtime/server/pool-manager.js.map +0 -1
- package/dist/runtime/server/proxy.d.ts +0 -21
- package/dist/runtime/server/proxy.js +0 -76
- package/dist/runtime/server/proxy.js.map +0 -1
- package/dist/runtime/server/server.d.ts +0 -60
- package/dist/runtime/server/server.js +0 -163
- package/dist/runtime/server/server.js.map +0 -1
- package/dist/runtime/server/types.d.ts +0 -31
- package/dist/runtime/server/types.js +0 -2
- package/dist/runtime/server/types.js.map +0 -1
- package/dist/runtime/server/worker-pool.d.ts +0 -121
- package/dist/runtime/server/worker-pool.js +0 -171
- package/dist/runtime/server/worker-pool.js.map +0 -1
- package/dist/runtime/store/index.d.ts +0 -3
- package/dist/runtime/store/index.js +0 -23
- package/dist/runtime/store/index.js.map +0 -1
- package/dist/runtime/subscription/manager.d.ts +0 -49
- package/dist/runtime/subscription/manager.js +0 -170
- package/dist/runtime/subscription/manager.js.map +0 -1
- package/dist/runtime/subscription/redis.d.ts +0 -18
- package/dist/runtime/subscription/redis.js +0 -120
- package/dist/runtime/subscription/redis.js.map +0 -1
- package/dist/runtime/types.d.ts +0 -95
- package/dist/runtime/types.js +0 -2
- package/dist/runtime/types.js.map +0 -1
- package/dist/runtime/workers/application.d.ts +0 -29
- package/dist/runtime/workers/application.js +0 -77
- package/dist/runtime/workers/application.js.map +0 -1
- package/dist/runtime/workers/base.d.ts +0 -16
- package/dist/runtime/workers/base.js +0 -46
- package/dist/runtime/workers/base.js.map +0 -1
- package/dist/runtime/workers/cli.d.ts +0 -1
- package/dist/runtime/workers/cli.js +0 -2
- package/dist/runtime/workers/cli.js.map +0 -1
- package/dist/runtime/workers/job.d.ts +0 -20
- package/dist/runtime/workers/job.js +0 -170
- package/dist/runtime/workers/job.js.map +0 -1
- package/dist/vite/builder.d.ts +0 -5
- package/dist/vite/builder.js +0 -79
- package/dist/vite/builder.js.map +0 -1
- package/dist/vite/config.d.ts +0 -28
- package/dist/vite/config.js +0 -22
- package/dist/vite/config.js.map +0 -1
- package/dist/vite/plugins.d.ts +0 -2
- package/dist/vite/plugins.js +0 -43
- package/dist/vite/plugins.js.map +0 -1
- package/dist/vite/runners/worker.d.ts +0 -3
- package/dist/vite/runners/worker.js +0 -34
- package/dist/vite/runners/worker.js.map +0 -1
- package/dist/vite/server.d.ts +0 -3
- package/dist/vite/server.js +0 -36
- package/dist/vite/server.js.map +0 -1
- package/dist/vite/servers/main.d.ts +0 -8
- package/dist/vite/servers/main.js +0 -24
- package/dist/vite/servers/main.js.map +0 -1
- package/dist/vite/servers/worker.d.ts +0 -13
- package/dist/vite/servers/worker.js +0 -124
- package/dist/vite/servers/worker.js.map +0 -1
- package/src/cli.ts +0 -162
- package/src/codegen.ts +0 -30
- package/src/config.ts +0 -69
- package/src/entrypoints/cli.ts +0 -13
- package/src/entrypoints/main.ts +0 -317
- package/src/entrypoints/thread.ts +0 -223
- package/src/entrypoints/worker.ts +0 -174
- package/src/resolver.ts +0 -7
- package/src/runtime/application/index.ts +0 -1
- package/src/runtime/constants.ts +0 -13
- package/src/runtime/enums.ts +0 -12
- package/src/runtime/hooks.ts +0 -1
- package/src/runtime/index.ts +0 -29
- package/src/runtime/injectables.ts +0 -72
- package/src/runtime/jobs/job.ts +0 -467
- package/src/runtime/jobs/manager.ts +0 -454
- package/src/runtime/jobs/router.ts +0 -967
- package/src/runtime/jobs/runner.ts +0 -583
- package/src/runtime/jobs/step.ts +0 -66
- package/src/runtime/jobs/types.ts +0 -116
- package/src/runtime/metrics/metric.ts +0 -18
- package/src/runtime/metrics/registry.ts +0 -11
- package/src/runtime/metrics/server.ts +0 -69
- package/src/runtime/plugin.ts +0 -2
- package/src/runtime/runtime.ts +0 -103
- package/src/runtime/scheduler/index.ts +0 -39
- package/src/runtime/server/applications.ts +0 -264
- package/src/runtime/server/config.ts +0 -199
- package/src/runtime/server/environment.ts +0 -71
- package/src/runtime/server/error-policy.ts +0 -132
- package/src/runtime/server/hmr-coordinator.ts +0 -116
- package/src/runtime/server/jobs.ts +0 -266
- package/src/runtime/server/lifecycle.ts +0 -234
- package/src/runtime/server/managed-worker.ts +0 -546
- package/src/runtime/server/pool-manager.ts +0 -187
- package/src/runtime/server/proxy.ts +0 -119
- package/src/runtime/server/server.ts +0 -218
- package/src/runtime/server/types.ts +0 -32
- package/src/runtime/server/worker-pool.ts +0 -275
- package/src/runtime/store/index.ts +0 -30
- package/src/runtime/subscription/manager.ts +0 -310
- package/src/runtime/subscription/redis.ts +0 -157
- package/src/runtime/types.ts +0 -84
- package/src/runtime/workers/application.ts +0 -133
- package/src/runtime/workers/base.ts +0 -71
- package/src/runtime/workers/cli.ts +0 -0
- package/src/runtime/workers/job.ts +0 -142
- package/src/vite/builder.ts +0 -94
- package/src/vite/config.ts +0 -45
- package/src/vite/plugins.ts +0 -53
- package/src/vite/runners/worker.ts +0 -55
- package/src/vite/server.ts +0 -55
- package/src/vite/servers/main.ts +0 -41
- package/src/vite/servers/worker.ts +0 -177
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import EventEmitter from 'node:events';
|
|
2
|
-
import type { Logger } from '@nmtjs/core';
|
|
3
|
-
import type { RuntimeEnvironment } from './environment.ts';
|
|
4
|
-
import type { ApplicationServer } from './server.ts';
|
|
5
|
-
/**
|
|
6
|
-
* States in the server lifecycle state machine.
|
|
7
|
-
*/
|
|
8
|
-
export type LifecycleState = 'idle' | 'starting' | 'running' | 'reloading' | 'stopping' | 'stopped' | 'failed';
|
|
9
|
-
/**
|
|
10
|
-
* Events emitted by the ServerLifecycle.
|
|
11
|
-
*/
|
|
12
|
-
export interface LifecycleEvents {
|
|
13
|
-
'state-change': [from: LifecycleState, to: LifecycleState];
|
|
14
|
-
error: [error: Error, handled: boolean];
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Factory function type for creating ApplicationServer instances.
|
|
18
|
-
*/
|
|
19
|
-
export type ServerFactory = () => ApplicationServer | Promise<ApplicationServer>;
|
|
20
|
-
/**
|
|
21
|
-
* ServerLifecycle manages the application server lifecycle with a clean state machine.
|
|
22
|
-
*
|
|
23
|
-
* States:
|
|
24
|
-
* - idle: Initial state, server not started
|
|
25
|
-
* - starting: Server is being started
|
|
26
|
-
* - running: Server is running normally
|
|
27
|
-
* - reloading: Server is being reloaded (stop + start)
|
|
28
|
-
* - stopping: Server is being stopped
|
|
29
|
-
* - stopped: Server has been stopped (terminal state)
|
|
30
|
-
* - failed: Server failed to start (can recover via reload in dev mode)
|
|
31
|
-
*
|
|
32
|
-
* Transitions:
|
|
33
|
-
* - idle -> starting (via start())
|
|
34
|
-
* - starting -> running (success) | failed (error)
|
|
35
|
-
* - running -> reloading (via reload()) | stopping (via stop())
|
|
36
|
-
* - reloading -> running (success) | failed (error)
|
|
37
|
-
* - failed -> reloading (via reload()) | stopping (via stop())
|
|
38
|
-
* - stopping -> stopped
|
|
39
|
-
*/
|
|
40
|
-
export declare class ServerLifecycle extends EventEmitter<LifecycleEvents> {
|
|
41
|
-
private readonly env;
|
|
42
|
-
private readonly createServer;
|
|
43
|
-
private state;
|
|
44
|
-
private server;
|
|
45
|
-
private logger;
|
|
46
|
-
constructor(env: RuntimeEnvironment, createServer: ServerFactory, logger: Logger);
|
|
47
|
-
/** Current lifecycle state */
|
|
48
|
-
get currentState(): LifecycleState;
|
|
49
|
-
/** Whether the server is currently running */
|
|
50
|
-
get isRunning(): boolean;
|
|
51
|
-
/** Whether the server can be started */
|
|
52
|
-
get canStart(): boolean;
|
|
53
|
-
/** Whether the server can be stopped */
|
|
54
|
-
get canStop(): boolean;
|
|
55
|
-
/** Whether the server can be reloaded */
|
|
56
|
-
get canReload(): boolean;
|
|
57
|
-
/** Get the current server instance (if running) */
|
|
58
|
-
getServer(): ApplicationServer | null;
|
|
59
|
-
/**
|
|
60
|
-
* Start the server.
|
|
61
|
-
* Can only be called from 'idle' or 'failed' states.
|
|
62
|
-
*/
|
|
63
|
-
start(): Promise<void>;
|
|
64
|
-
/**
|
|
65
|
-
* Stop the server.
|
|
66
|
-
* Can be called from 'running', 'failed', or 'reloading' states.
|
|
67
|
-
* No-op if already stopped or idle.
|
|
68
|
-
*/
|
|
69
|
-
stop(): Promise<void>;
|
|
70
|
-
/**
|
|
71
|
-
* Reload the server (stop current instance and start a new one).
|
|
72
|
-
* Can be called from 'running' or 'failed' states.
|
|
73
|
-
*/
|
|
74
|
-
reload(): Promise<void>;
|
|
75
|
-
private handleStartupError;
|
|
76
|
-
/**
|
|
77
|
-
* Transition to a new state, emitting the state-change event.
|
|
78
|
-
*/
|
|
79
|
-
private transition;
|
|
80
|
-
/**
|
|
81
|
-
* Assert that the current state is one of the allowed states.
|
|
82
|
-
* Throws if not.
|
|
83
|
-
*/
|
|
84
|
-
private assertState;
|
|
85
|
-
}
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import EventEmitter from 'node:events';
|
|
2
|
-
/**
|
|
3
|
-
* ServerLifecycle manages the application server lifecycle with a clean state machine.
|
|
4
|
-
*
|
|
5
|
-
* States:
|
|
6
|
-
* - idle: Initial state, server not started
|
|
7
|
-
* - starting: Server is being started
|
|
8
|
-
* - running: Server is running normally
|
|
9
|
-
* - reloading: Server is being reloaded (stop + start)
|
|
10
|
-
* - stopping: Server is being stopped
|
|
11
|
-
* - stopped: Server has been stopped (terminal state)
|
|
12
|
-
* - failed: Server failed to start (can recover via reload in dev mode)
|
|
13
|
-
*
|
|
14
|
-
* Transitions:
|
|
15
|
-
* - idle -> starting (via start())
|
|
16
|
-
* - starting -> running (success) | failed (error)
|
|
17
|
-
* - running -> reloading (via reload()) | stopping (via stop())
|
|
18
|
-
* - reloading -> running (success) | failed (error)
|
|
19
|
-
* - failed -> reloading (via reload()) | stopping (via stop())
|
|
20
|
-
* - stopping -> stopped
|
|
21
|
-
*/
|
|
22
|
-
export class ServerLifecycle extends EventEmitter {
|
|
23
|
-
env;
|
|
24
|
-
createServer;
|
|
25
|
-
state = 'idle';
|
|
26
|
-
server = null;
|
|
27
|
-
logger;
|
|
28
|
-
constructor(env, createServer, logger) {
|
|
29
|
-
super();
|
|
30
|
-
this.env = env;
|
|
31
|
-
this.createServer = createServer;
|
|
32
|
-
this.logger = logger.child({ component: 'ServerLifecycle' });
|
|
33
|
-
}
|
|
34
|
-
/** Current lifecycle state */
|
|
35
|
-
get currentState() {
|
|
36
|
-
return this.state;
|
|
37
|
-
}
|
|
38
|
-
/** Whether the server is currently running */
|
|
39
|
-
get isRunning() {
|
|
40
|
-
return this.state === 'running';
|
|
41
|
-
}
|
|
42
|
-
/** Whether the server can be started */
|
|
43
|
-
get canStart() {
|
|
44
|
-
return this.state === 'idle' || this.state === 'failed';
|
|
45
|
-
}
|
|
46
|
-
/** Whether the server can be stopped */
|
|
47
|
-
get canStop() {
|
|
48
|
-
return (this.state === 'running' ||
|
|
49
|
-
this.state === 'failed' ||
|
|
50
|
-
this.state === 'reloading');
|
|
51
|
-
}
|
|
52
|
-
/** Whether the server can be reloaded */
|
|
53
|
-
get canReload() {
|
|
54
|
-
return this.state === 'running' || this.state === 'failed';
|
|
55
|
-
}
|
|
56
|
-
/** Get the current server instance (if running) */
|
|
57
|
-
getServer() {
|
|
58
|
-
return this.server;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Start the server.
|
|
62
|
-
* Can only be called from 'idle' or 'failed' states.
|
|
63
|
-
*/
|
|
64
|
-
async start() {
|
|
65
|
-
this.assertState('idle', 'failed');
|
|
66
|
-
this.transition('starting');
|
|
67
|
-
try {
|
|
68
|
-
this.server = await this.createServer();
|
|
69
|
-
await this.server.start();
|
|
70
|
-
this.transition('running');
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
this.transition('failed');
|
|
74
|
-
await this.handleStartupError(error);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Stop the server.
|
|
79
|
-
* Can be called from 'running', 'failed', or 'reloading' states.
|
|
80
|
-
* No-op if already stopped or idle.
|
|
81
|
-
*/
|
|
82
|
-
async stop() {
|
|
83
|
-
if (this.state === 'stopped' || this.state === 'idle')
|
|
84
|
-
return;
|
|
85
|
-
this.assertState('running', 'failed', 'reloading');
|
|
86
|
-
this.transition('stopping');
|
|
87
|
-
try {
|
|
88
|
-
await this.server?.stop();
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
this.logger.error(new Error('Error while stopping server (continuing shutdown)', {
|
|
92
|
-
cause: error,
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
finally {
|
|
96
|
-
this.server = null;
|
|
97
|
-
this.transition('stopped');
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Reload the server (stop current instance and start a new one).
|
|
102
|
-
* Can be called from 'running' or 'failed' states.
|
|
103
|
-
*/
|
|
104
|
-
async reload() {
|
|
105
|
-
this.assertState('running', 'failed');
|
|
106
|
-
this.transition('reloading');
|
|
107
|
-
try {
|
|
108
|
-
// Stop current server if exists
|
|
109
|
-
if (this.server) {
|
|
110
|
-
await this.server.stop();
|
|
111
|
-
this.server = null;
|
|
112
|
-
}
|
|
113
|
-
// Create and start new server
|
|
114
|
-
this.server = await this.createServer();
|
|
115
|
-
await this.server.start();
|
|
116
|
-
this.transition('running');
|
|
117
|
-
}
|
|
118
|
-
catch (error) {
|
|
119
|
-
this.server = null;
|
|
120
|
-
this.transition('failed');
|
|
121
|
-
await this.handleStartupError(error);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Handle startup/reload error according to the error policy.
|
|
126
|
-
*/
|
|
127
|
-
async handleStartupError(error) {
|
|
128
|
-
const action = this.env.errorPolicy.onStartupError(error);
|
|
129
|
-
const handled = action.type !== 'exit';
|
|
130
|
-
this.emit('error', error, handled);
|
|
131
|
-
switch (action.type) {
|
|
132
|
-
case 'exit':
|
|
133
|
-
this.logger.fatal(new Error('Startup failed, exiting', { cause: error }));
|
|
134
|
-
process.exit(action.code);
|
|
135
|
-
break;
|
|
136
|
-
case 'wait':
|
|
137
|
-
// Dev mode: stay alive, HMR will call reload()
|
|
138
|
-
this.logger.error(new Error('Startup failed, waiting for fix via HMR', {
|
|
139
|
-
cause: error,
|
|
140
|
-
}));
|
|
141
|
-
break;
|
|
142
|
-
case 'restart':
|
|
143
|
-
this.logger.warn({ error, delay: action.delay }, 'Startup failed, scheduling restart');
|
|
144
|
-
setTimeout(() => {
|
|
145
|
-
// Only restart if still in failed state
|
|
146
|
-
if (this.state === 'failed') {
|
|
147
|
-
this.start().catch((e) => {
|
|
148
|
-
this.logger.error(new Error('Restart failed', { cause: e }));
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
}, action.delay);
|
|
152
|
-
break;
|
|
153
|
-
case 'ignore':
|
|
154
|
-
this.logger.warn({ error }, 'Startup failed, ignoring');
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Transition to a new state, emitting the state-change event.
|
|
160
|
-
*/
|
|
161
|
-
transition(to) {
|
|
162
|
-
const from = this.state;
|
|
163
|
-
this.state = to;
|
|
164
|
-
this.logger.debug({ from, to }, 'State transition');
|
|
165
|
-
this.emit('state-change', from, to);
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Assert that the current state is one of the allowed states.
|
|
169
|
-
* Throws if not.
|
|
170
|
-
*/
|
|
171
|
-
assertState(...allowed) {
|
|
172
|
-
if (!allowed.includes(this.state)) {
|
|
173
|
-
throw new Error(`Invalid state: ${this.state}, expected one of: ${allowed.join(', ')}`);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/runtime/server/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import type { MessagePort, WorkerOptions } from 'node:worker_threads';
|
|
2
|
-
import EventEmitter from 'node:events';
|
|
3
|
-
import { Worker } from 'node:worker_threads';
|
|
4
|
-
import type { Logger } from '@nmtjs/core';
|
|
5
|
-
import type { WorkerType } from '../enums.ts';
|
|
6
|
-
import type { JobTaskResult, ServerPortMessageTypes, ThreadPortMessageTypes, WorkerJobTask, WorkerThreadError } from '../types.ts';
|
|
7
|
-
import type { ErrorPolicy } from './error-policy.ts';
|
|
8
|
-
/**
|
|
9
|
-
* States in the worker state machine.
|
|
10
|
-
*/
|
|
11
|
-
export type WorkerState = 'idle' | 'starting' | 'ready' | 'error' | 'restarting' | 'stopping' | 'stopped';
|
|
12
|
-
/**
|
|
13
|
-
* Context tracked for each managed worker.
|
|
14
|
-
*/
|
|
15
|
-
export interface ManagedWorkerContext {
|
|
16
|
-
consecutiveFailures: number;
|
|
17
|
-
totalFailures: number;
|
|
18
|
-
lastStableTime: number | null;
|
|
19
|
-
lastError: Error | null;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Configuration for creating a managed worker.
|
|
23
|
-
*/
|
|
24
|
-
export interface ManagedWorkerConfig {
|
|
25
|
-
id: string;
|
|
26
|
-
name: string;
|
|
27
|
-
index: number;
|
|
28
|
-
workerType: WorkerType;
|
|
29
|
-
path: string;
|
|
30
|
-
workerData?: any;
|
|
31
|
-
workerOptions?: Partial<WorkerOptions>;
|
|
32
|
-
onWorker?: (registration: {
|
|
33
|
-
worker: Worker;
|
|
34
|
-
vitePort?: MessagePort;
|
|
35
|
-
}) => void;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Events emitted by ManagedWorker.
|
|
39
|
-
*/
|
|
40
|
-
export interface ManagedWorkerEvents {
|
|
41
|
-
'state-change': [from: WorkerState, to: WorkerState];
|
|
42
|
-
ready: [hosts?: ThreadPortMessageTypes['ready']['hosts']];
|
|
43
|
-
error: [error: WorkerThreadError];
|
|
44
|
-
task: [data: ThreadPortMessageTypes['task']];
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* ManagedWorker wraps a Node.js Worker thread with:
|
|
48
|
-
* - Explicit state machine
|
|
49
|
-
* - Automatic restart with exponential backoff
|
|
50
|
-
* - Error tracking and stability detection
|
|
51
|
-
* - Integration with ErrorPolicy for restart decisions
|
|
52
|
-
*
|
|
53
|
-
* State Machine:
|
|
54
|
-
* - idle: Initial state, worker not created
|
|
55
|
-
* - starting: Worker created, waiting for ready message
|
|
56
|
-
* - ready: Worker is running and healthy
|
|
57
|
-
* - error: Worker crashed or failed to start
|
|
58
|
-
* - restarting: Worker is scheduled for restart (waiting for delay)
|
|
59
|
-
* - stopping: Worker is being terminated
|
|
60
|
-
* - stopped: Worker has been terminated (terminal state)
|
|
61
|
-
*/
|
|
62
|
-
export declare class ManagedWorker extends EventEmitter<ManagedWorkerEvents> {
|
|
63
|
-
readonly config: ManagedWorkerConfig;
|
|
64
|
-
protected readonly policy: ErrorPolicy;
|
|
65
|
-
protected state: WorkerState;
|
|
66
|
-
protected ctx: ManagedWorkerContext;
|
|
67
|
-
protected worker: Worker | null;
|
|
68
|
-
protected port: MessagePort | null;
|
|
69
|
-
protected vitePort: MessagePort | null;
|
|
70
|
-
protected restartTimer: ReturnType<typeof setTimeout> | null;
|
|
71
|
-
protected startPromise: Promise<void> | null;
|
|
72
|
-
protected pendingTaskIds: Set<string>;
|
|
73
|
-
protected logger: Logger;
|
|
74
|
-
constructor(config: ManagedWorkerConfig, policy: ErrorPolicy, logger: Logger);
|
|
75
|
-
/** Current worker state */
|
|
76
|
-
get currentState(): WorkerState;
|
|
77
|
-
/** Whether the worker is healthy (ready state) */
|
|
78
|
-
get isHealthy(): boolean;
|
|
79
|
-
/** Get a copy of the worker context */
|
|
80
|
-
get context(): ManagedWorkerContext;
|
|
81
|
-
/**
|
|
82
|
-
* Reset failure counts. Called when HMR update comes in to give the worker
|
|
83
|
-
* a fresh start after code has been fixed.
|
|
84
|
-
*/
|
|
85
|
-
resetFailureCount(): void;
|
|
86
|
-
/** Get the underlying Worker instance (if exists) */
|
|
87
|
-
getWorker(): Worker | null;
|
|
88
|
-
/**
|
|
89
|
-
* Start the worker.
|
|
90
|
-
* Can only be called from 'idle' or 'error' states.
|
|
91
|
-
*/
|
|
92
|
-
start(): Promise<void>;
|
|
93
|
-
/**
|
|
94
|
-
* Stop the worker.
|
|
95
|
-
* Can be called from any state except 'stopped'.
|
|
96
|
-
* Clears any pending restart timers and rejects pending run() tasks.
|
|
97
|
-
*/
|
|
98
|
-
stop(): Promise<void>;
|
|
99
|
-
/**
|
|
100
|
-
* Run a task on this worker (for job workers).
|
|
101
|
-
* The worker must be in 'ready' state.
|
|
102
|
-
*/
|
|
103
|
-
run(task: WorkerJobTask): Promise<JobTaskResult>;
|
|
104
|
-
/**
|
|
105
|
-
* Send a message to the worker.
|
|
106
|
-
*/
|
|
107
|
-
send<T extends keyof ServerPortMessageTypes>(type: T, ...[data]: ServerPortMessageTypes[T] extends undefined ? [] : [data: ServerPortMessageTypes[T]]): void;
|
|
108
|
-
/**
|
|
109
|
-
* Internal: Start the worker and wait for it to be ready.
|
|
110
|
-
*/
|
|
111
|
-
protected doStart(): Promise<void>;
|
|
112
|
-
/**
|
|
113
|
-
* Wait for the worker to emit a 'ready' message or timeout.
|
|
114
|
-
*/
|
|
115
|
-
protected waitForReady(): Promise<void>;
|
|
116
|
-
/**
|
|
117
|
-
* Attach listeners for port and worker events.
|
|
118
|
-
*/
|
|
119
|
-
protected attachListeners(): void;
|
|
120
|
-
/**
|
|
121
|
-
* Handle worker ready event.
|
|
122
|
-
*/
|
|
123
|
-
protected handleReady(hosts?: ThreadPortMessageTypes['ready']['hosts']): void;
|
|
124
|
-
/**
|
|
125
|
-
* Handle worker error.
|
|
126
|
-
*/
|
|
127
|
-
protected handleError(error: Error): void;
|
|
128
|
-
/**
|
|
129
|
-
* Schedule a restart after the given delay.
|
|
130
|
-
*/
|
|
131
|
-
protected scheduleRestart(delay: number): void;
|
|
132
|
-
/**
|
|
133
|
-
* Clear any pending restart timer.
|
|
134
|
-
*/
|
|
135
|
-
protected clearRestartTimer(): void;
|
|
136
|
-
/**
|
|
137
|
-
* Terminate the underlying worker thread.
|
|
138
|
-
*/
|
|
139
|
-
protected terminateWorker(): Promise<void>;
|
|
140
|
-
/**
|
|
141
|
-
* Cleanup internal state.
|
|
142
|
-
*/
|
|
143
|
-
protected cleanup(): void;
|
|
144
|
-
/**
|
|
145
|
-
* Reject all pending run() calls by emitting an error result
|
|
146
|
-
* for each tracked task id. This unblocks callers waiting on
|
|
147
|
-
* `once(this, 'task-<id>')` so they don't hang during shutdown.
|
|
148
|
-
*/
|
|
149
|
-
protected rejectPendingTasks(): void;
|
|
150
|
-
/**
|
|
151
|
-
* Transition to a new state, emitting the state-change event.
|
|
152
|
-
*/
|
|
153
|
-
protected transition(to: WorkerState): void;
|
|
154
|
-
/**
|
|
155
|
-
* Assert that the current state is one of the allowed states.
|
|
156
|
-
*/
|
|
157
|
-
protected assertState(...allowed: WorkerState[]): void;
|
|
158
|
-
}
|