nmtjs 0.16.1 → 0.17.0-beta.2
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 -161
- 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 -69
- package/dist/runtime/injectables.js +0 -40
- 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 -119
- 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 -14
- package/dist/runtime/workers/base.js +0 -41
- 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 -101
- 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 -307
- package/src/runtime/subscription/redis.ts +0 -159
- package/src/runtime/types.ts +0 -84
- package/src/runtime/workers/application.ts +0 -133
- package/src/runtime/workers/base.ts +0 -65
- 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,33 +0,0 @@
|
|
|
1
|
-
import { kServerConfig } from '../constants.js';
|
|
2
|
-
export function defineServer(options) {
|
|
3
|
-
const { deploymentId, logger, commands, proxy, store, applications, subscription, metrics, } = options;
|
|
4
|
-
let jobs;
|
|
5
|
-
if (options.jobs) {
|
|
6
|
-
const map = new Map();
|
|
7
|
-
for (const job of options.jobs.jobs ?? [])
|
|
8
|
-
map.set(job.name, job);
|
|
9
|
-
for (const { job } of options.jobs.scheduler?.entries ?? [])
|
|
10
|
-
map.set(job.name, job);
|
|
11
|
-
jobs = {
|
|
12
|
-
pools: options.jobs.pools,
|
|
13
|
-
jobs: map,
|
|
14
|
-
scheduler: options.jobs.scheduler,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
return Object.freeze({
|
|
18
|
-
[kServerConfig]: true,
|
|
19
|
-
deploymentId,
|
|
20
|
-
logger,
|
|
21
|
-
commands,
|
|
22
|
-
proxy,
|
|
23
|
-
store,
|
|
24
|
-
applications,
|
|
25
|
-
subscription,
|
|
26
|
-
jobs,
|
|
27
|
-
metrics,
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
export function isServerConfig(value) {
|
|
31
|
-
return Boolean(value?.[kServerConfig]);
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/runtime/server/config.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AA+I/C,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,MAAM,EACJ,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,OAAO,GACR,GAAG,OAAO,CAAA;IAEX,IAAI,IAAsC,CAAA;IAC1C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAA;QACrC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACjE,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,EAAE;YACzD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACxB,IAAI,GAAG;YACL,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;YACzB,IAAI,EAAE,GAAG;YACT,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS;SAClC,CAAA;IACH,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,CAAC,aAAa,CAAC,EAAE,IAAI;QACrB,YAAY;QACZ,MAAM;QACN,QAAQ;QACR,KAAK;QACL,KAAK;QACL,YAAY;QACZ,YAAY;QACZ,IAAI;QACJ,OAAO;KACC,CAAC,CAAA;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAU;IACvC,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;AACxC,CAAC"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { ViteDevServer } from 'vite';
|
|
2
|
-
import type { ErrorPolicy } from './error-policy.ts';
|
|
3
|
-
import type { HMRCoordinator } from './hmr-coordinator.ts';
|
|
4
|
-
/**
|
|
5
|
-
* Encapsulates everything that differs between Dev and Prod environments.
|
|
6
|
-
* This provides a clean abstraction over environment-specific behavior.
|
|
7
|
-
*/
|
|
8
|
-
export interface RuntimeEnvironment {
|
|
9
|
-
readonly mode: 'development' | 'production';
|
|
10
|
-
readonly errorPolicy: ErrorPolicy;
|
|
11
|
-
readonly hmr: HMRCoordinator | null;
|
|
12
|
-
readonly vite: ViteDevServer | null;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Options for creating a development environment.
|
|
16
|
-
*/
|
|
17
|
-
export interface DevEnvironmentOptions {
|
|
18
|
-
vite?: ViteDevServer;
|
|
19
|
-
hmr?: HMRCoordinator;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Creates a RuntimeEnvironment for the given mode.
|
|
23
|
-
*
|
|
24
|
-
* @param mode - 'development' or 'production'
|
|
25
|
-
* @param options - Optional configuration (vite server for dev mode)
|
|
26
|
-
*/
|
|
27
|
-
export declare function createRuntimeEnvironment(mode: 'development' | 'production', options?: DevEnvironmentOptions): RuntimeEnvironment;
|
|
28
|
-
/**
|
|
29
|
-
* Type guard to check if environment is development mode.
|
|
30
|
-
*/
|
|
31
|
-
export declare function isDevEnvironment(env: RuntimeEnvironment): env is RuntimeEnvironment & {
|
|
32
|
-
mode: 'development';
|
|
33
|
-
hmr: HMRCoordinator | null;
|
|
34
|
-
vite: ViteDevServer | null;
|
|
35
|
-
};
|
|
36
|
-
/**
|
|
37
|
-
* Type guard to check if environment is production mode.
|
|
38
|
-
*/
|
|
39
|
-
export declare function isProdEnvironment(env: RuntimeEnvironment): env is RuntimeEnvironment & {
|
|
40
|
-
mode: 'production';
|
|
41
|
-
hmr: null;
|
|
42
|
-
vite: null;
|
|
43
|
-
};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { getErrorPolicy } from './error-policy.js';
|
|
2
|
-
/**
|
|
3
|
-
* Creates a RuntimeEnvironment for the given mode.
|
|
4
|
-
*
|
|
5
|
-
* @param mode - 'development' or 'production'
|
|
6
|
-
* @param options - Optional configuration (vite server for dev mode)
|
|
7
|
-
*/
|
|
8
|
-
export function createRuntimeEnvironment(mode, options) {
|
|
9
|
-
const errorPolicy = getErrorPolicy(mode);
|
|
10
|
-
if (mode === 'development') {
|
|
11
|
-
return {
|
|
12
|
-
mode,
|
|
13
|
-
errorPolicy,
|
|
14
|
-
hmr: options?.hmr ?? null,
|
|
15
|
-
vite: options?.vite ?? null,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
// Production mode - no HMR or Vite
|
|
19
|
-
return { mode, errorPolicy, hmr: null, vite: null };
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Type guard to check if environment is development mode.
|
|
23
|
-
*/
|
|
24
|
-
export function isDevEnvironment(env) {
|
|
25
|
-
return env.mode === 'development';
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Type guard to check if environment is production mode.
|
|
29
|
-
*/
|
|
30
|
-
export function isProdEnvironment(env) {
|
|
31
|
-
return env.mode === 'production';
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=environment.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/runtime/server/environment.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAqBlD;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,IAAkC,EAClC,OAA+B;IAE/B,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;IAExC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI;YACJ,WAAW;YACX,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI;YACzB,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;SAC5B,CAAA;IACH,CAAC;IAED,mCAAmC;IACnC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAuB;IAMvB,OAAO,GAAG,CAAC,IAAI,KAAK,aAAa,CAAA;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAuB;IAEvB,OAAO,GAAG,CAAC,IAAI,KAAK,YAAY,CAAA;AAClC,CAAC"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import type { WorkerType } from '../enums.ts';
|
|
2
|
-
/**
|
|
3
|
-
* Context provided to error policy decisions about worker failures.
|
|
4
|
-
*/
|
|
5
|
-
export interface WorkerErrorContext {
|
|
6
|
-
workerId: string;
|
|
7
|
-
workerType: WorkerType;
|
|
8
|
-
consecutiveFailures: number;
|
|
9
|
-
totalFailures: number;
|
|
10
|
-
lastStableTime: number | null;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Actions that can be taken in response to errors.
|
|
14
|
-
*/
|
|
15
|
-
export type ErrorAction = {
|
|
16
|
-
type: 'exit';
|
|
17
|
-
code: number;
|
|
18
|
-
} | {
|
|
19
|
-
type: 'restart';
|
|
20
|
-
delay: number;
|
|
21
|
-
} | {
|
|
22
|
-
type: 'wait';
|
|
23
|
-
} | {
|
|
24
|
-
type: 'ignore';
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* Interface defining error handling behavior for different environments.
|
|
28
|
-
* Dev and Prod modes have different requirements and this interface makes those explicit.
|
|
29
|
-
*/
|
|
30
|
-
export interface ErrorPolicy {
|
|
31
|
-
/** How to handle server startup failure */
|
|
32
|
-
onStartupError(error: Error): ErrorAction;
|
|
33
|
-
/** How to handle worker crash */
|
|
34
|
-
onWorkerError(error: Error, context: WorkerErrorContext): ErrorAction;
|
|
35
|
-
/** Delay before restarting a failed worker */
|
|
36
|
-
getRestartDelay(consecutiveFailures: number): number;
|
|
37
|
-
/** Whether to continue if some workers are down */
|
|
38
|
-
readonly allowDegradedMode: boolean;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Development Error Policy
|
|
42
|
-
*
|
|
43
|
-
* - Startup errors: Wait for HMR fix (don't exit)
|
|
44
|
-
* - Worker errors: Restart with exponential backoff
|
|
45
|
-
* - After 10 consecutive failures: Stop retrying, wait for HMR fix
|
|
46
|
-
* - Stability window: Reset failure count if worker was stable for 30s+
|
|
47
|
-
* - Degraded mode: Allowed (keep serving with partial workers)
|
|
48
|
-
*/
|
|
49
|
-
export declare const DevErrorPolicy: ErrorPolicy;
|
|
50
|
-
/**
|
|
51
|
-
* Production Error Policy
|
|
52
|
-
*
|
|
53
|
-
* - Startup errors: Exit immediately with code 1
|
|
54
|
-
* - Worker errors: Restart up to 3 times, then exit
|
|
55
|
-
* - No stability window consideration (each failure counts)
|
|
56
|
-
* - Degraded mode: Not allowed (all workers must be healthy)
|
|
57
|
-
*/
|
|
58
|
-
export declare const ProdErrorPolicy: ErrorPolicy;
|
|
59
|
-
/**
|
|
60
|
-
* Get the appropriate error policy for the given mode.
|
|
61
|
-
*/
|
|
62
|
-
export declare function getErrorPolicy(mode: 'development' | 'production'): ErrorPolicy;
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Calculates exponential backoff delay with a cap.
|
|
3
|
-
* @param failures - Number of consecutive failures
|
|
4
|
-
* @param base - Base delay in ms (default: 100)
|
|
5
|
-
* @param maxDelay - Maximum delay in ms (default: 5000)
|
|
6
|
-
*/
|
|
7
|
-
function exponentialBackoff(failures, base = 100, maxDelay = 5000) {
|
|
8
|
-
return Math.min(base * 2 ** Math.max(0, failures - 1), maxDelay);
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Time window in ms after which a worker is considered "stable".
|
|
12
|
-
* If stable, consecutive failure count is reset on next error.
|
|
13
|
-
*/
|
|
14
|
-
const STABILITY_WINDOW_MS = 30_000;
|
|
15
|
-
/**
|
|
16
|
-
* Maximum retries before giving up in dev mode.
|
|
17
|
-
*/
|
|
18
|
-
const DEV_MAX_RETRIES = 1;
|
|
19
|
-
/**
|
|
20
|
-
* Maximum retries before exiting in prod mode.
|
|
21
|
-
*/
|
|
22
|
-
const PROD_MAX_RETRIES = 3;
|
|
23
|
-
/**
|
|
24
|
-
* Development Error Policy
|
|
25
|
-
*
|
|
26
|
-
* - Startup errors: Wait for HMR fix (don't exit)
|
|
27
|
-
* - Worker errors: Restart with exponential backoff
|
|
28
|
-
* - After 10 consecutive failures: Stop retrying, wait for HMR fix
|
|
29
|
-
* - Stability window: Reset failure count if worker was stable for 30s+
|
|
30
|
-
* - Degraded mode: Allowed (keep serving with partial workers)
|
|
31
|
-
*/
|
|
32
|
-
export const DevErrorPolicy = {
|
|
33
|
-
onStartupError: () => ({ type: 'wait' }),
|
|
34
|
-
onWorkerError: (_error, ctx) => {
|
|
35
|
-
// Check if worker was stable before this failure
|
|
36
|
-
const wasStable = ctx.lastStableTime !== null &&
|
|
37
|
-
Date.now() - ctx.lastStableTime > STABILITY_WINDOW_MS;
|
|
38
|
-
// Reset failure count if was stable
|
|
39
|
-
const effectiveFailures = wasStable ? 1 : ctx.consecutiveFailures;
|
|
40
|
-
if (effectiveFailures >= DEV_MAX_RETRIES) {
|
|
41
|
-
return { type: 'wait' }; // Stop trying, wait for HMR fix
|
|
42
|
-
}
|
|
43
|
-
return { type: 'restart', delay: exponentialBackoff(effectiveFailures) };
|
|
44
|
-
},
|
|
45
|
-
getRestartDelay: (n) => exponentialBackoff(n),
|
|
46
|
-
allowDegradedMode: true,
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* Production Error Policy
|
|
50
|
-
*
|
|
51
|
-
* - Startup errors: Exit immediately with code 1
|
|
52
|
-
* - Worker errors: Restart up to 3 times, then exit
|
|
53
|
-
* - No stability window consideration (each failure counts)
|
|
54
|
-
* - Degraded mode: Not allowed (all workers must be healthy)
|
|
55
|
-
*/
|
|
56
|
-
export const ProdErrorPolicy = {
|
|
57
|
-
onStartupError: () => ({ type: 'exit', code: 1 }),
|
|
58
|
-
onWorkerError: (_error, ctx) => {
|
|
59
|
-
if (ctx.consecutiveFailures >= PROD_MAX_RETRIES) {
|
|
60
|
-
return { type: 'exit', code: 1 };
|
|
61
|
-
}
|
|
62
|
-
return { type: 'restart', delay: 1000 };
|
|
63
|
-
},
|
|
64
|
-
getRestartDelay: () => 1000,
|
|
65
|
-
allowDegradedMode: false,
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* Get the appropriate error policy for the given mode.
|
|
69
|
-
*/
|
|
70
|
-
export function getErrorPolicy(mode) {
|
|
71
|
-
return mode === 'development' ? DevErrorPolicy : ProdErrorPolicy;
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=error-policy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"error-policy.js","sourceRoot":"","sources":["../../../src/runtime/server/error-policy.ts"],"names":[],"mappings":"AAwCA;;;;;GAKG;AACH,SAAS,kBAAkB,CACzB,QAAgB,EAChB,IAAI,GAAG,GAAG,EACV,QAAQ,GAAG,IAAI;IAEf,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAElC;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB;;GAEG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAE1B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAExC,aAAa,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7B,iDAAiD;QACjD,MAAM,SAAS,GACb,GAAG,CAAC,cAAc,KAAK,IAAI;YAC3B,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,cAAc,GAAG,mBAAmB,CAAA;QAEvD,oCAAoC;QACpC,MAAM,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAA;QAEjE,IAAI,iBAAiB,IAAI,eAAe,EAAE,CAAC;YACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA,CAAC,gCAAgC;QAC1D,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAAA;IAC1E,CAAC;IAED,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC7C,iBAAiB,EAAE,IAAI;CACxB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAgB;IAC1C,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAEjD,aAAa,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QAC7B,IAAI,GAAG,CAAC,mBAAmB,IAAI,gBAAgB,EAAE,CAAC;YAChD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;QAClC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACzC,CAAC;IAED,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;IAC3B,iBAAiB,EAAE,KAAK;CACzB,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,IAAkC;IAElC,OAAO,IAAI,KAAK,aAAa,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAA;AAClE,CAAC"}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { Logger } from '@nmtjs/core';
|
|
2
|
-
import type { ServerLifecycle } from './lifecycle.ts';
|
|
3
|
-
/**
|
|
4
|
-
* HMRCoordinator handles HMR (Hot Module Replacement) with proper supersede logic.
|
|
5
|
-
*
|
|
6
|
-
* When a reload is in progress and another HMR event arrives, the pending reload
|
|
7
|
-
* is superseded by the latest - only the most recent config is applied.
|
|
8
|
-
*
|
|
9
|
-
* This component is only used in development mode.
|
|
10
|
-
*/
|
|
11
|
-
export declare class HMRCoordinator {
|
|
12
|
-
private readonly lifecycle;
|
|
13
|
-
/** Currently executing reload, if any */
|
|
14
|
-
private active;
|
|
15
|
-
/** Pending reload - only the latest request is kept */
|
|
16
|
-
private pendingResolvers;
|
|
17
|
-
/** Whether a reload is pending after the current one completes */
|
|
18
|
-
private hasPending;
|
|
19
|
-
private logger;
|
|
20
|
-
constructor(lifecycle: ServerLifecycle, logger: Logger);
|
|
21
|
-
/**
|
|
22
|
-
* Schedule a reload. If a reload is already in progress, supersedes any pending reload.
|
|
23
|
-
*
|
|
24
|
-
* @returns Promise that resolves when this reload completes (or is superseded)
|
|
25
|
-
*/
|
|
26
|
-
scheduleReload(): Promise<void>;
|
|
27
|
-
private executeReload;
|
|
28
|
-
private doReload;
|
|
29
|
-
/**
|
|
30
|
-
* Check if a reload is currently in progress.
|
|
31
|
-
*/
|
|
32
|
-
get isReloading(): boolean;
|
|
33
|
-
/**
|
|
34
|
-
* Check if there's a pending reload waiting.
|
|
35
|
-
*/
|
|
36
|
-
get isPending(): boolean;
|
|
37
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HMRCoordinator handles HMR (Hot Module Replacement) with proper supersede logic.
|
|
3
|
-
*
|
|
4
|
-
* When a reload is in progress and another HMR event arrives, the pending reload
|
|
5
|
-
* is superseded by the latest - only the most recent config is applied.
|
|
6
|
-
*
|
|
7
|
-
* This component is only used in development mode.
|
|
8
|
-
*/
|
|
9
|
-
export class HMRCoordinator {
|
|
10
|
-
lifecycle;
|
|
11
|
-
/** Currently executing reload, if any */
|
|
12
|
-
active = null;
|
|
13
|
-
/** Pending reload - only the latest request is kept */
|
|
14
|
-
pendingResolvers = null;
|
|
15
|
-
/** Whether a reload is pending after the current one completes */
|
|
16
|
-
hasPending = false;
|
|
17
|
-
logger;
|
|
18
|
-
constructor(lifecycle, logger) {
|
|
19
|
-
this.lifecycle = lifecycle;
|
|
20
|
-
this.logger = logger.child({ component: 'HMRCoordinator' });
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Schedule a reload. If a reload is already in progress, supersedes any pending reload.
|
|
24
|
-
*
|
|
25
|
-
* @returns Promise that resolves when this reload completes (or is superseded)
|
|
26
|
-
*/
|
|
27
|
-
async scheduleReload() {
|
|
28
|
-
// If no active reload, execute immediately
|
|
29
|
-
if (!this.active) {
|
|
30
|
-
return this.executeReload();
|
|
31
|
-
}
|
|
32
|
-
// Supersede any existing pending reload - resolve previous waiter
|
|
33
|
-
if (this.pendingResolvers) {
|
|
34
|
-
this.logger.debug('Superseding pending reload with new request');
|
|
35
|
-
this.pendingResolvers.resolve();
|
|
36
|
-
}
|
|
37
|
-
// Mark that we have a pending reload
|
|
38
|
-
this.hasPending = true;
|
|
39
|
-
// Create new pending promise for this caller
|
|
40
|
-
return new Promise((resolve, reject) => {
|
|
41
|
-
this.pendingResolvers = { resolve, reject };
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Execute a reload, handling the pending queue.
|
|
46
|
-
*/
|
|
47
|
-
async executeReload() {
|
|
48
|
-
this.logger.debug('HMR reload starting');
|
|
49
|
-
this.active = this.doReload();
|
|
50
|
-
try {
|
|
51
|
-
await this.active;
|
|
52
|
-
this.logger.debug('HMR reload complete');
|
|
53
|
-
}
|
|
54
|
-
finally {
|
|
55
|
-
this.active = null;
|
|
56
|
-
// If there's a pending reload, execute it now
|
|
57
|
-
if (this.hasPending && this.pendingResolvers) {
|
|
58
|
-
const { resolve, reject } = this.pendingResolvers;
|
|
59
|
-
this.pendingResolvers = null;
|
|
60
|
-
this.hasPending = false;
|
|
61
|
-
this.executeReload().then(resolve, reject);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Perform the actual reload via the lifecycle.
|
|
67
|
-
*/
|
|
68
|
-
async doReload() {
|
|
69
|
-
// Check if lifecycle can reload
|
|
70
|
-
if (this.lifecycle.canReload) {
|
|
71
|
-
await this.lifecycle.reload();
|
|
72
|
-
}
|
|
73
|
-
else if (this.lifecycle.canStart) {
|
|
74
|
-
// If in failed/idle state, try to start
|
|
75
|
-
await this.lifecycle.start();
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
this.logger.warn({ state: this.lifecycle.currentState }, 'Cannot reload in current state');
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Check if a reload is currently in progress.
|
|
83
|
-
*/
|
|
84
|
-
get isReloading() {
|
|
85
|
-
return this.active !== null;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Check if there's a pending reload waiting.
|
|
89
|
-
*/
|
|
90
|
-
get isPending() {
|
|
91
|
-
return this.hasPending;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=hmr-coordinator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hmr-coordinator.js","sourceRoot":"","sources":["../../../src/runtime/server/hmr-coordinator.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IAgBN,SAAS;IAf5B,yCAAyC;IACjC,MAAM,GAAyB,IAAI,CAAA;IAE3C,uDAAuD;IAC/C,gBAAgB,GAGb,IAAI,CAAA;IAEf,kEAAkE;IAC1D,UAAU,GAAG,KAAK,CAAA;IAElB,MAAM,CAAQ;IAEtB,YACmB,SAA0B,EAC3C,MAAc;yBADG,SAAS;QAG1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc;QAClB,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAA;QAC7B,CAAC;QAED,kEAAkE;QAClE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAA;YAChE,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAA;QACjC,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QAEtB,6CAA6C;QAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,gBAAgB,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;QAC7C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QAExC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAE7B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAA;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;QAC1C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;YAElB,8CAA8C;YAC9C,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC7C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAA;gBACjD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;gBAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;gBACvB,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ;QACpB,gCAAgC;QAChC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAA;QAC/B,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACnC,wCAAwC;YACxC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,EACtC,gCAAgC,CACjC,CAAA;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAA;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;CACF"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { Logger } from '@nmtjs/core';
|
|
2
|
-
import { Worker } from 'bullmq';
|
|
3
|
-
import type { AnyJob } from '../jobs/job.ts';
|
|
4
|
-
import type { Store } from '../types.ts';
|
|
5
|
-
import type { ServerConfig } from './config.ts';
|
|
6
|
-
import type { ErrorPolicy } from './error-policy.ts';
|
|
7
|
-
import type { ApplicationServerWorkerConfig } from './types.ts';
|
|
8
|
-
import type { ManagedWorkerFactory, WorkerPoolFactory } from './worker-pool.ts';
|
|
9
|
-
import { JobRunnersPool } from './worker-pool.ts';
|
|
10
|
-
/**
|
|
11
|
-
* ApplicationServerJobs manages job worker pools and BullMQ queue workers.
|
|
12
|
-
*
|
|
13
|
-
* Changes from the old Pool-based implementation:
|
|
14
|
-
* - Uses JobRunnersPool (extends WorkerPool) for worker management
|
|
15
|
-
* - Uses ManagedWorker for restart logic and state tracking
|
|
16
|
-
* - Integrates with ErrorPolicy for restart decisions
|
|
17
|
-
* - Proper health tracking per job pool
|
|
18
|
-
*/
|
|
19
|
-
export declare class ApplicationServerJobs {
|
|
20
|
-
readonly params: {
|
|
21
|
-
logger: Logger;
|
|
22
|
-
serverConfig: ServerConfig;
|
|
23
|
-
workerConfig: ApplicationServerWorkerConfig;
|
|
24
|
-
store: Store;
|
|
25
|
-
errorPolicy: ErrorPolicy;
|
|
26
|
-
workerFactory: ManagedWorkerFactory;
|
|
27
|
-
poolFactory: WorkerPoolFactory;
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* BullMQ workers - one per job (dedicated queues)
|
|
31
|
-
*/
|
|
32
|
-
queueWorkers: Set<Worker<any, any, string>>;
|
|
33
|
-
jobs: Map<string, AnyJob>;
|
|
34
|
-
/**
|
|
35
|
-
* Shared resource pools by configured pool name.
|
|
36
|
-
* All jobs using the same pool name share the same pool for resource management.
|
|
37
|
-
*/
|
|
38
|
-
protected pools: Map<string, JobRunnersPool>;
|
|
39
|
-
constructor(params: {
|
|
40
|
-
logger: Logger;
|
|
41
|
-
serverConfig: ServerConfig;
|
|
42
|
-
workerConfig: ApplicationServerWorkerConfig;
|
|
43
|
-
store: Store;
|
|
44
|
-
errorPolicy: ErrorPolicy;
|
|
45
|
-
workerFactory: ManagedWorkerFactory;
|
|
46
|
-
poolFactory: WorkerPoolFactory;
|
|
47
|
-
});
|
|
48
|
-
start(): Promise<void>;
|
|
49
|
-
stop(): Promise<void>;
|
|
50
|
-
/**
|
|
51
|
-
* Get a job pool by name.
|
|
52
|
-
*/
|
|
53
|
-
getPool(poolName: string): JobRunnersPool | undefined;
|
|
54
|
-
}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { inspect } from 'node:util';
|
|
2
|
-
import { UnrecoverableError, Worker } from 'bullmq';
|
|
3
|
-
import { WorkerType } from '../enums.js';
|
|
4
|
-
import { getJobQueueName } from '../jobs/manager.js';
|
|
5
|
-
import { JobRunnersPool } from './worker-pool.js';
|
|
6
|
-
function enrichBullMqErrorStack(error) {
|
|
7
|
-
const normalized = error instanceof Error
|
|
8
|
-
? error
|
|
9
|
-
: new Error(typeof error === 'string' ? error : inspect(error, false, 20, false));
|
|
10
|
-
normalized.stack = inspect(normalized, false, 20, false);
|
|
11
|
-
return normalized;
|
|
12
|
-
}
|
|
13
|
-
function getJobsByPool(jobs) {
|
|
14
|
-
const jobsByPool = new Map();
|
|
15
|
-
for (const job of jobs) {
|
|
16
|
-
const poolJobs = jobsByPool.get(job.options.pool);
|
|
17
|
-
if (poolJobs) {
|
|
18
|
-
poolJobs.push(job);
|
|
19
|
-
}
|
|
20
|
-
else {
|
|
21
|
-
jobsByPool.set(job.options.pool, [job]);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return jobsByPool;
|
|
25
|
-
}
|
|
26
|
-
function assertActiveJobPoolsConfigured(jobsByPool, pools) {
|
|
27
|
-
const missingPoolMessages = [...jobsByPool]
|
|
28
|
-
.filter(([poolName]) => !pools[poolName])
|
|
29
|
-
.flatMap(([poolName, jobs]) => jobs.map((job) => `${job.name} -> ${poolName}`));
|
|
30
|
-
if (missingPoolMessages.length > 0) {
|
|
31
|
-
throw new Error(`Invalid jobs pool configuration: missing pool config for jobs: ${missingPoolMessages.join(', ')}`);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* ApplicationServerJobs manages job worker pools and BullMQ queue workers.
|
|
36
|
-
*
|
|
37
|
-
* Changes from the old Pool-based implementation:
|
|
38
|
-
* - Uses JobRunnersPool (extends WorkerPool) for worker management
|
|
39
|
-
* - Uses ManagedWorker for restart logic and state tracking
|
|
40
|
-
* - Integrates with ErrorPolicy for restart decisions
|
|
41
|
-
* - Proper health tracking per job pool
|
|
42
|
-
*/
|
|
43
|
-
export class ApplicationServerJobs {
|
|
44
|
-
params;
|
|
45
|
-
/**
|
|
46
|
-
* BullMQ workers - one per job (dedicated queues)
|
|
47
|
-
*/
|
|
48
|
-
queueWorkers = new Set();
|
|
49
|
-
jobs;
|
|
50
|
-
/**
|
|
51
|
-
* Shared resource pools by configured pool name.
|
|
52
|
-
* All jobs using the same pool name share the same pool for resource management.
|
|
53
|
-
*/
|
|
54
|
-
pools = new Map();
|
|
55
|
-
constructor(params) {
|
|
56
|
-
this.params = params;
|
|
57
|
-
this.jobs = params.serverConfig.jobs
|
|
58
|
-
? params.serverConfig.jobs.jobs
|
|
59
|
-
: new Map();
|
|
60
|
-
}
|
|
61
|
-
async start() {
|
|
62
|
-
const { logger, serverConfig, workerConfig, store, errorPolicy, workerFactory, } = this.params;
|
|
63
|
-
const jobsConfig = serverConfig.jobs;
|
|
64
|
-
if (!jobsConfig) {
|
|
65
|
-
logger.debug('Jobs are not configured, skipping');
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
const jobsByPool = getJobsByPool(this.jobs.values());
|
|
69
|
-
assertActiveJobPoolsConfigured(jobsByPool, jobsConfig.pools);
|
|
70
|
-
// Step 1: Initialize shared resource pools used by active jobs
|
|
71
|
-
for (const poolName of jobsByPool.keys()) {
|
|
72
|
-
const poolConfig = jobsConfig.pools[poolName];
|
|
73
|
-
// Create a JobRunnersPool for this pool
|
|
74
|
-
const config = {
|
|
75
|
-
name: `job-pool-${poolName}`,
|
|
76
|
-
workerType: WorkerType.Job,
|
|
77
|
-
path: workerConfig.path,
|
|
78
|
-
workerData: { ...workerConfig.workerData },
|
|
79
|
-
onWorker: workerConfig.worker,
|
|
80
|
-
};
|
|
81
|
-
const pool = new JobRunnersPool(config, errorPolicy, workerFactory, logger);
|
|
82
|
-
// Add workers to the pool
|
|
83
|
-
for (let i = 0; i < poolConfig.threads; i++) {
|
|
84
|
-
pool.add({ runtime: { type: 'jobs', jobWorkerPool: poolName } }, i);
|
|
85
|
-
}
|
|
86
|
-
await pool.startAll();
|
|
87
|
-
this.pools.set(poolName, pool);
|
|
88
|
-
logger.info({
|
|
89
|
-
pool: poolName,
|
|
90
|
-
threads: poolConfig.threads,
|
|
91
|
-
jobsPerThread: poolConfig.jobs,
|
|
92
|
-
}, 'Job runner pool started');
|
|
93
|
-
}
|
|
94
|
-
// Step 2: Create a dedicated BullMQ Worker for each job
|
|
95
|
-
// Calculate how many jobs use each pool for fair concurrency distribution
|
|
96
|
-
for (const job of this.jobs.values()) {
|
|
97
|
-
const queueName = getJobQueueName(job);
|
|
98
|
-
const poolName = job.options.pool;
|
|
99
|
-
const pool = this.pools.get(poolName);
|
|
100
|
-
if (!pool) {
|
|
101
|
-
throw new Error(`Job "${job.name}" pool "${poolName}" is not started`);
|
|
102
|
-
}
|
|
103
|
-
const poolConfig = jobsConfig.pools[poolName];
|
|
104
|
-
const poolCapacity = poolConfig.threads * poolConfig.jobs;
|
|
105
|
-
const jobCountInPool = jobsByPool.get(poolName)?.length ?? 1;
|
|
106
|
-
// Use job-specific concurrency if provided, otherwise distribute pool capacity evenly
|
|
107
|
-
const defaultConcurrency = Math.max(1, Math.floor(poolCapacity / jobCountInPool));
|
|
108
|
-
const concurrency = job.options.concurrency ?? defaultConcurrency;
|
|
109
|
-
const queueWorker = new Worker(queueName, async (bullJob) => {
|
|
110
|
-
const task = {
|
|
111
|
-
jobId: String(bullJob.id ?? ''),
|
|
112
|
-
jobName: bullJob.name,
|
|
113
|
-
data: bullJob.data,
|
|
114
|
-
};
|
|
115
|
-
const result = await pool.run(task);
|
|
116
|
-
switch (result.type) {
|
|
117
|
-
case 'success':
|
|
118
|
-
return result.result;
|
|
119
|
-
case 'unrecoverable_error': {
|
|
120
|
-
const error = enrichBullMqErrorStack(result.error);
|
|
121
|
-
const unrecoverableError = new UnrecoverableError(error.message);
|
|
122
|
-
unrecoverableError.stack = error.stack;
|
|
123
|
-
throw unrecoverableError;
|
|
124
|
-
}
|
|
125
|
-
case 'job_not_found':
|
|
126
|
-
case 'queue_job_not_found':
|
|
127
|
-
throw new UnrecoverableError(result.type);
|
|
128
|
-
case 'error':
|
|
129
|
-
console.error(result.error);
|
|
130
|
-
throw enrichBullMqErrorStack(result.error);
|
|
131
|
-
default:
|
|
132
|
-
throw new UnrecoverableError('Unknown job task result');
|
|
133
|
-
}
|
|
134
|
-
}, { connection: store, concurrency });
|
|
135
|
-
this.queueWorkers.add(queueWorker);
|
|
136
|
-
logger.info({ job: job.name, queue: queueName, pool: poolName, concurrency }, 'Job queue worker started');
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
async stop() {
|
|
140
|
-
const { logger } = this.params;
|
|
141
|
-
// Force-close BullMQ workers immediately — stops accepting new jobs
|
|
142
|
-
// and doesn't wait for in-flight processor callbacks.
|
|
143
|
-
// We must use force=true on the first call because BullMQ caches the
|
|
144
|
-
// closing promise: a second call with force=true returns the original
|
|
145
|
-
// (non-force) promise, making it ineffective.
|
|
146
|
-
// Interrupted jobs will be retried via BullMQ's stalled job mechanism.
|
|
147
|
-
await Promise.all([...this.queueWorkers].map(async (worker) => {
|
|
148
|
-
try {
|
|
149
|
-
await worker.close(true);
|
|
150
|
-
}
|
|
151
|
-
catch (error) {
|
|
152
|
-
logger.warn({ error }, 'Failed to close BullMQ worker');
|
|
153
|
-
}
|
|
154
|
-
}));
|
|
155
|
-
this.queueWorkers.clear();
|
|
156
|
-
// Stop job runner thread pools — sends 'stop' to threads, waits for
|
|
157
|
-
// graceful exit with timeout, force-kills if needed.
|
|
158
|
-
// Pending pool.run() calls will be rejected by ManagedWorker.stop().
|
|
159
|
-
await Promise.all(Array.from(this.pools.values()).map(async (pool) => {
|
|
160
|
-
try {
|
|
161
|
-
await pool.stopAll();
|
|
162
|
-
}
|
|
163
|
-
catch (error) {
|
|
164
|
-
logger.warn({ error }, 'Failed to stop job pool');
|
|
165
|
-
}
|
|
166
|
-
}));
|
|
167
|
-
this.pools.clear();
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Get a job pool by name.
|
|
171
|
-
*/
|
|
172
|
-
getPool(poolName) {
|
|
173
|
-
return this.pools.get(poolName);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
//# sourceMappingURL=jobs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../../src/runtime/server/jobs.ts"],"names":[],"mappings":"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"}
|