nmtjs 0.15.0-beta.21 → 0.15.0-beta.23

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 (90) hide show
  1. package/dist/entrypoints/main.js +180 -102
  2. package/dist/entrypoints/main.js.map +1 -1
  3. package/dist/entrypoints/worker.d.ts +6 -0
  4. package/dist/entrypoints/worker.js +121 -20
  5. package/dist/entrypoints/worker.js.map +1 -1
  6. package/dist/index.d.ts +2 -0
  7. package/dist/runtime/index.d.ts +9 -0
  8. package/dist/runtime/index.js +9 -0
  9. package/dist/runtime/index.js.map +1 -1
  10. package/dist/runtime/injectables.d.ts +5 -0
  11. package/dist/runtime/injectables.js +4 -0
  12. package/dist/runtime/injectables.js.map +1 -1
  13. package/dist/runtime/jobs/manager.d.ts +20 -27
  14. package/dist/runtime/jobs/manager.js +65 -20
  15. package/dist/runtime/jobs/manager.js.map +1 -1
  16. package/dist/runtime/jobs/router.d.ts +21 -10
  17. package/dist/runtime/jobs/router.js +29 -12
  18. package/dist/runtime/jobs/router.js.map +1 -1
  19. package/dist/runtime/jobs/runner.d.ts +27 -4
  20. package/dist/runtime/jobs/runner.js +74 -11
  21. package/dist/runtime/jobs/runner.js.map +1 -1
  22. package/dist/runtime/jobs/types.d.ts +80 -0
  23. package/dist/runtime/jobs/types.js +5 -0
  24. package/dist/runtime/jobs/types.js.map +1 -0
  25. package/dist/runtime/server/applications.d.ts +48 -9
  26. package/dist/runtime/server/applications.js +85 -50
  27. package/dist/runtime/server/applications.js.map +1 -1
  28. package/dist/runtime/server/environment.d.ts +43 -0
  29. package/dist/runtime/server/environment.js +33 -0
  30. package/dist/runtime/server/environment.js.map +1 -0
  31. package/dist/runtime/server/error-policy.d.ts +62 -0
  32. package/dist/runtime/server/error-policy.js +73 -0
  33. package/dist/runtime/server/error-policy.js.map +1 -0
  34. package/dist/runtime/server/hmr-coordinator.d.ts +43 -0
  35. package/dist/runtime/server/hmr-coordinator.js +94 -0
  36. package/dist/runtime/server/hmr-coordinator.js.map +1 -0
  37. package/dist/runtime/server/jobs.d.ts +24 -7
  38. package/dist/runtime/server/jobs.js +48 -37
  39. package/dist/runtime/server/jobs.js.map +1 -1
  40. package/dist/runtime/server/lifecycle.d.ts +88 -0
  41. package/dist/runtime/server/lifecycle.js +173 -0
  42. package/dist/runtime/server/lifecycle.js.map +1 -0
  43. package/dist/runtime/server/managed-worker.d.ts +147 -0
  44. package/dist/runtime/server/managed-worker.js +373 -0
  45. package/dist/runtime/server/managed-worker.js.map +1 -0
  46. package/dist/runtime/server/pool-manager.d.ts +85 -0
  47. package/dist/runtime/server/pool-manager.js +129 -0
  48. package/dist/runtime/server/pool-manager.js.map +1 -0
  49. package/dist/runtime/server/server.d.ts +35 -29
  50. package/dist/runtime/server/server.js +45 -2
  51. package/dist/runtime/server/server.js.map +1 -1
  52. package/dist/runtime/server/types.d.ts +27 -0
  53. package/dist/runtime/server/types.js +2 -0
  54. package/dist/runtime/server/types.js.map +1 -0
  55. package/dist/runtime/server/worker-pool.d.ts +120 -0
  56. package/dist/runtime/server/worker-pool.js +171 -0
  57. package/dist/runtime/server/worker-pool.js.map +1 -0
  58. package/dist/runtime/workers/job.js.map +1 -1
  59. package/dist/vite/builder.js +3 -32
  60. package/dist/vite/builder.js.map +1 -1
  61. package/dist/vite/servers/worker.d.ts +5 -3
  62. package/dist/vite/servers/worker.js +15 -34
  63. package/dist/vite/servers/worker.js.map +1 -1
  64. package/package.json +12 -12
  65. package/src/entrypoints/main.ts +219 -125
  66. package/src/entrypoints/worker.ts +150 -25
  67. package/src/runtime/index.ts +9 -0
  68. package/src/runtime/injectables.ts +13 -0
  69. package/src/runtime/jobs/manager.ts +89 -45
  70. package/src/runtime/jobs/router.ts +59 -22
  71. package/src/runtime/jobs/runner.ts +120 -15
  72. package/src/runtime/jobs/types.ts +110 -0
  73. package/src/runtime/server/applications.ts +113 -65
  74. package/src/runtime/server/environment.ts +71 -0
  75. package/src/runtime/server/error-policy.ts +132 -0
  76. package/src/runtime/server/hmr-coordinator.ts +116 -0
  77. package/src/runtime/server/jobs.ts +81 -44
  78. package/src/runtime/server/lifecycle.ts +227 -0
  79. package/src/runtime/server/managed-worker.ts +491 -0
  80. package/src/runtime/server/pool-manager.ts +187 -0
  81. package/src/runtime/server/server.ts +72 -39
  82. package/src/runtime/server/types.ts +27 -0
  83. package/src/runtime/server/worker-pool.ts +274 -0
  84. package/src/runtime/workers/job.ts +2 -7
  85. package/src/vite/builder.ts +3 -32
  86. package/src/vite/servers/worker.ts +19 -41
  87. package/dist/runtime/server/pool.d.ts +0 -54
  88. package/dist/runtime/server/pool.js +0 -194
  89. package/dist/runtime/server/pool.js.map +0 -1
  90. package/src/runtime/server/pool.ts +0 -260
@@ -8,7 +8,12 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
8
8
  };
9
9
  import EventEmitter from 'node:events';
10
10
  import { fileURLToPath } from 'node:url';
11
- import { ApplicationServer, isServerConfig } from 'nmtjs/runtime';
11
+ import { createLogger } from '@nmtjs/core';
12
+ import { ApplicationServer, defaultPoolFactory, defaultWorkerFactory, isServerConfig, } from 'nmtjs/runtime';
13
+ import { createRuntimeEnvironment } from "../runtime/server/environment.js";
14
+ import { getErrorPolicy } from "../runtime/server/error-policy.js";
15
+ import { HMRCoordinator } from "../runtime/server/hmr-coordinator.js";
16
+ import { ServerLifecycle } from "../runtime/server/lifecycle.js";
12
17
  class InvalidServerConfigError extends Error {
13
18
  constructor() {
14
19
  super(`Server config file does not have a default export, or it is not a valid server config. Please, make sure the server config is defined using defineServer().`);
@@ -18,30 +23,39 @@ class InvalidServerConfigError extends Error {
18
23
  const _ext = new URL(import.meta.url).pathname.endsWith('.ts') ? '.ts' : '.js';
19
24
  const _vite = __VITE_CONFIG__ ? JSON.parse(__VITE_CONFIG__) : undefined;
20
25
  const applicationsConfig = __APPLICATIONS_CONFIG__ ? JSON.parse(__APPLICATIONS_CONFIG__) : {};
21
- let _viteServerEvents;
22
- let _viteWorkerServer;
23
- let server;
24
- let hasActiveWorkerError = false;
25
- const isDev = _vite?.mode === 'development';
26
- if (import.meta.env.DEV && import.meta.hot) {
27
- import.meta.hot.accept('#server', async (module) => {
28
- await shutdownServer();
29
- await bootWithHandling(module?.default);
30
- });
31
- }
32
- if (_vite) {
33
- const { createWorkerServer } = await import("../vite/servers/worker.js");
34
- const neemataConfig = await import(__rewriteRelativeImportExtension(
35
- /* @vite-ignore */
36
- _vite.options.configPath)).then((m) => m.default);
37
- _viteServerEvents = new EventEmitter();
38
- _viteServerEvents.on('worker-error', handleWorkerError);
39
- _viteServerEvents.on('worker-ready', handleWorkerReady);
40
- _viteWorkerServer = await createWorkerServer(_vite.options, _vite.mode, neemataConfig, _viteServerEvents);
26
+ // Runtime environment setup
27
+ const mode = _vite?.mode === 'development' ? 'development' : 'production';
28
+ const isDev = mode === 'development';
29
+ const errorPolicy = getErrorPolicy(mode);
30
+ // Logger for main process (created lazily with config-based level)
31
+ let logger;
32
+ function getLogger() {
33
+ if (!logger) {
34
+ // Use server config's logger options if available, otherwise default based on mode
35
+ const loggerOptions = currentServerConfig?.logger ?? {
36
+ pinoOptions: { level: isDev ? 'debug' : 'info' },
37
+ };
38
+ logger = createLogger(loggerOptions, 'Main');
39
+ }
40
+ return logger;
41
41
  }
42
- async function bootServer(configValue) {
43
- if (!isServerConfig(configValue))
44
- throw new InvalidServerConfigError();
42
+ // Vite server and events (dev only)
43
+ let _viteServerEvents;
44
+ let _viteServer;
45
+ // Server lifecycle management
46
+ let lifecycle;
47
+ let hmrCoordinator;
48
+ // Current server config (updated on HMR)
49
+ let currentServerConfig;
50
+ // Track termination state
51
+ let isTerminating = false;
52
+ /**
53
+ * Create the ApplicationServer instance using currentServerConfig.
54
+ */
55
+ function createServer() {
56
+ if (!currentServerConfig) {
57
+ throw new Error('Server config not initialized');
58
+ }
45
59
  const workerConfig = {
46
60
  path: fileURLToPath(import.meta.resolve(`./thread${_ext}`)),
47
61
  workerData: { vite: _vite?.mode },
@@ -52,102 +66,166 @@ async function bootServer(configValue) {
52
66
  : undefined,
53
67
  events: _viteServerEvents,
54
68
  };
55
- const appServer = new ApplicationServer(configValue, applicationsConfig, workerConfig);
56
- try {
57
- await appServer.start();
58
- server = appServer;
59
- clearWorkerErrorOverlay();
60
- }
61
- catch (error) {
62
- await appServer.stop().catch(() => { });
63
- throw error;
69
+ return new ApplicationServer(currentServerConfig, applicationsConfig, workerConfig, undefined, // runOptions
70
+ errorPolicy, defaultWorkerFactory, defaultPoolFactory);
71
+ }
72
+ /**
73
+ * Initialize Vite dev server (dev mode only).
74
+ */
75
+ async function initializeVite() {
76
+ if (!_vite)
77
+ return;
78
+ const { createViteServer } = await import("../vite/servers/worker.js");
79
+ const neemataConfig = await import(__rewriteRelativeImportExtension(
80
+ /* @vite-ignore */
81
+ _vite.options.configPath)).then((m) => m.default);
82
+ _viteServerEvents = new EventEmitter();
83
+ _viteServerEvents.on('hmr-update', handleHMRUpdate);
84
+ _viteServer = await createViteServer(_vite.options, _vite.mode, neemataConfig, _viteServerEvents);
85
+ }
86
+ /**
87
+ * Initialize the server lifecycle (called once at startup).
88
+ */
89
+ function initializeLifecycle(configValue) {
90
+ if (!isServerConfig(configValue))
91
+ throw new InvalidServerConfigError();
92
+ // Store initial config
93
+ currentServerConfig = configValue;
94
+ // Create runtime environment
95
+ const env = createRuntimeEnvironment(mode, {
96
+ vite: _viteServer ?? undefined,
97
+ hmr: undefined, // hmrCoordinator created after lifecycle
98
+ });
99
+ // Create lifecycle (singleton)
100
+ lifecycle = new ServerLifecycle(env, createServer, getLogger());
101
+ // Create HMR coordinator (dev only, singleton)
102
+ if (isDev) {
103
+ hmrCoordinator = new HMRCoordinator(lifecycle, getLogger());
64
104
  }
105
+ // Listen for lifecycle errors (once)
106
+ lifecycle.on('error', (error, handled) => {
107
+ if (!handled) {
108
+ getLogger().error({ error }, 'Unhandled lifecycle error');
109
+ }
110
+ });
65
111
  }
66
- async function bootWithHandling(configValue) {
67
- try {
68
- await bootServer(configValue);
112
+ /**
113
+ * Set up HMR acceptance for server config changes.
114
+ */
115
+ function setupHMR() {
116
+ if (!import.meta.env.DEV || !import.meta.hot)
117
+ return;
118
+ import.meta.hot.accept('#server', async (module) => {
119
+ if (!module)
120
+ return;
121
+ if (!isServerConfig(module.default))
122
+ throw new InvalidServerConfigError();
123
+ // Update the config (createServer will use this on next reload)
124
+ currentServerConfig = module.default;
125
+ // Use HMR coordinator to handle the reload
126
+ if (hmrCoordinator) {
127
+ try {
128
+ await hmrCoordinator.scheduleReload();
129
+ }
130
+ catch (cause) {
131
+ console.error(new Error('Error during HMR reload:', { cause }));
132
+ }
133
+ }
134
+ });
135
+ }
136
+ /**
137
+ * Handle HMR update event.
138
+ * When an application file is updated and there are failed workers, restart them.
139
+ */
140
+ async function handleHMRUpdate(_event) {
141
+ // If server is in failed state, try to start it
142
+ if (lifecycle?.currentState === 'failed') {
143
+ try {
144
+ await lifecycle.start();
145
+ }
146
+ catch {
147
+ // Error will be handled by lifecycle
148
+ }
149
+ return;
69
150
  }
70
- catch (error) {
71
- handleStartupError(error);
72
- if (!isDev)
73
- throw error;
151
+ // If server is running, restart any failed workers
152
+ const server = lifecycle?.getServer();
153
+ if (server) {
154
+ try {
155
+ const restarted = await server.restartFailedWorkers();
156
+ if (restarted > 0) {
157
+ getLogger().info({ count: restarted }, 'Restarted failed workers after HMR update');
158
+ }
159
+ }
160
+ catch (error) {
161
+ getLogger().error({ error }, 'Failed to restart workers after HMR update');
162
+ }
74
163
  }
75
164
  }
76
- let isTerminating = false;
165
+ /**
166
+ * Handle startup error.
167
+ */
168
+ function handleStartupError(error) {
169
+ const normalized = error instanceof Error ? error : new Error(String(error));
170
+ getLogger().error(new Error('Failed to start application server', { cause: normalized }));
171
+ }
172
+ /**
173
+ * Handle process termination signals.
174
+ */
77
175
  async function handleTermination() {
78
176
  if (isTerminating)
79
177
  return;
80
178
  isTerminating = true;
81
- await shutdownServer();
82
- _viteWorkerServer?.close();
83
- process.exit(0);
84
- }
85
- function handleUnexpectedError(error) {
86
- console.error(new Error('Unexpected Error:', { cause: error }));
87
- }
88
- async function shutdownServer() {
89
- if (!server)
90
- return;
179
+ getLogger().info('Shutting down...');
91
180
  try {
92
- await server.stop();
181
+ await lifecycle?.stop();
93
182
  }
94
183
  catch (error) {
95
- console.error(new Error('Failed to stop application server', { cause: error }));
184
+ getLogger().error(new Error('Failed to stop server', { cause: error }));
96
185
  }
97
- finally {
98
- server = undefined;
99
- }
100
- }
101
- function handleWorkerError(event) {
102
- hasActiveWorkerError = true;
103
- console.error(new Error(`Worker ${event.application} thread ${event.threadId} error`, {
104
- cause: event.error,
105
- }));
186
+ _viteServer?.close();
187
+ process.exit(0);
106
188
  }
107
- function handleWorkerReady(_) {
108
- clearWorkerErrorOverlay();
189
+ /**
190
+ * Handle unexpected errors.
191
+ */
192
+ function handleUnexpectedError(error) {
193
+ getLogger().error(new Error('Unexpected Error:', { cause: error }));
109
194
  }
110
- function handleStartupError(error) {
111
- const normalized = error instanceof Error ? error : new Error(String(error));
112
- if (_viteServerEvents) {
113
- _viteServerEvents.emit('worker-error', {
114
- application: 'server',
115
- threadId: -1,
116
- error: normalized,
117
- });
195
+ /**
196
+ * Main entry point.
197
+ */
198
+ async function main() {
199
+ // Set up process handlers
200
+ process.once('SIGTERM', handleTermination);
201
+ process.once('SIGINT', handleTermination);
202
+ process.on('uncaughtException', handleUnexpectedError);
203
+ process.on('unhandledRejection', handleUnexpectedError);
204
+ // Initialize Vite (dev mode only)
205
+ await initializeVite();
206
+ // Load server config
207
+ const serverConfig = await import(
208
+ // @ts-expect-error
209
+ '#server').then((m) => m.default);
210
+ // Initialize lifecycle (sync, creates singletons)
211
+ initializeLifecycle(serverConfig);
212
+ // Set up HMR
213
+ setupHMR();
214
+ // Start the server
215
+ try {
216
+ await lifecycle.start();
118
217
  }
119
- else {
120
- hasActiveWorkerError = true;
121
- console.error(new Error('Failed to start application server', { cause: normalized }));
218
+ catch (error) {
219
+ handleStartupError(error);
220
+ if (!isDev) {
221
+ process.exit(1);
222
+ }
122
223
  }
123
224
  }
124
- function clearWorkerErrorOverlay() {
125
- if (!hasActiveWorkerError)
126
- return;
127
- hasActiveWorkerError = false;
128
- }
129
- process.once('SIGTERM', handleTermination);
130
- process.once('SIGINT', handleTermination);
131
- process.on('uncaughtException', handleUnexpectedError);
132
- process.on('unhandledRejection', handleUnexpectedError);
133
- await bootWithHandling(await import(
134
- // @ts-expect-error
135
- '#server').then((m) => m.default)).catch(() => {
136
- if (!isDev)
225
+ main().catch((error) => {
226
+ getLogger().fatal({ error }, 'Fatal error during startup');
227
+ if (!isDev) {
137
228
  process.exit(1);
229
+ }
138
230
  });
139
- const { format } = Intl.NumberFormat('en', {
140
- notation: 'compact',
141
- maximumFractionDigits: 2,
142
- unit: 'byte',
143
- });
144
- const printMem = () => {
145
- globalThis.gc?.();
146
- // print memory usage every 10 seconds
147
- const memoryUsage = process.memoryUsage();
148
- console.log(`Memory Usage: RSS=${format(memoryUsage.rss)}, HeapTotal=${format(memoryUsage.heapTotal)}, HeapUsed=${format(memoryUsage.heapUsed)}, External=${format(memoryUsage.external)}, ArrayBuffers=${format(memoryUsage.arrayBuffers)}`);
149
- };
150
- void printMem;
151
- // printMem()
152
- // setInterval(printMem, 5000)
153
231
  //# sourceMappingURL=main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/entrypoints/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/entrypoints/main.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
1
  import { ApplicationWorkerRuntime, JobWorkerRuntime } from 'nmtjs/runtime';
2
2
  import type { RunWorkerOptions } from './thread.ts';
3
+ /**
4
+ * Worker entry point.
5
+ *
6
+ * Handles initialization of application or job worker runtimes.
7
+ * Includes HMR supersede logic for application workers.
8
+ */
3
9
  export declare function run(options: RunWorkerOptions['runtime']): Promise<ApplicationWorkerRuntime | JobWorkerRuntime>;
@@ -8,35 +8,136 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
8
8
  };
9
9
  import { workerData } from 'node:worker_threads';
10
10
  import { ApplicationWorkerRuntime, isApplicationConfig, JobWorkerRuntime, } from 'nmtjs/runtime';
11
+ /**
12
+ * Worker entry point.
13
+ *
14
+ * Handles initialization of application or job worker runtimes.
15
+ * Includes HMR supersede logic for application workers.
16
+ */
11
17
  export async function run(options) {
12
18
  const serverConfig = await import(
13
19
  // @ts-expect-error
14
20
  '#server').then((m) => m.default);
15
21
  if (options.type === 'application') {
16
- globalThis._hotAccept = (module) => {
17
- if (module) {
18
- if (!isApplicationConfig(module.default))
19
- throw new Error('Invalid application config');
20
- runtime.reload(module.default);
21
- }
22
- };
23
- const { name, path, transportsData } = options;
24
- const appConfig = await import(__rewriteRelativeImportExtension(
25
- /* @vite-ignore */
26
- path)).then((m) => m.default);
27
- const runtime = new ApplicationWorkerRuntime(serverConfig, { name, path, transports: transportsData }, appConfig);
28
- return runtime;
22
+ return initializeApplicationWorker(options, serverConfig);
29
23
  }
30
24
  else if (options.type === 'jobs') {
31
- const { jobWorkerPool } = options;
32
- const runtime = new JobWorkerRuntime(serverConfig, {
33
- poolName: jobWorkerPool,
34
- port: workerData.port,
35
- });
36
- return runtime;
25
+ return initializeJobWorker(options, serverConfig);
37
26
  }
38
27
  else {
39
- throw new Error(`Unknown runtime type: ${workerData.runtime.type}`);
28
+ throw new Error(`Unknown runtime type: ${options.type}`);
29
+ }
30
+ }
31
+ /**
32
+ * Initialize an application worker with HMR support.
33
+ */
34
+ async function initializeApplicationWorker(options, serverConfig) {
35
+ const { name, path, transportsData } = options;
36
+ // Load initial application config
37
+ const appConfig = await import(__rewriteRelativeImportExtension(
38
+ /* @vite-ignore */
39
+ path)).then((m) => m.default);
40
+ if (!isApplicationConfig(appConfig)) {
41
+ throw new Error(`Invalid application config for application: ${name}`);
40
42
  }
43
+ // Create runtime
44
+ const runtime = new ApplicationWorkerRuntime(serverConfig, { name, path, transports: transportsData }, appConfig);
45
+ // Set up HMR with supersede logic
46
+ setupApplicationHMR(runtime);
47
+ return runtime;
48
+ }
49
+ /**
50
+ * Set up HMR acceptance for application config changes with supersede logic.
51
+ *
52
+ * When a reload is in progress and another HMR event arrives, the pending
53
+ * reload is superseded - only the most recent config is applied.
54
+ */
55
+ function setupApplicationHMR(runtime) {
56
+ const logger = runtime.logger.child({ component: 'HMR' });
57
+ // Track active reload
58
+ let activeReload = null;
59
+ // Track pending reload (supersedes previous pending)
60
+ let pendingConfig = null;
61
+ let pendingResolve = null;
62
+ let pendingReject = null;
63
+ /**
64
+ * Execute a reload with the given config.
65
+ */
66
+ const executeReload = async (config) => {
67
+ activeReload = doReload(config);
68
+ try {
69
+ await activeReload;
70
+ }
71
+ finally {
72
+ activeReload = null;
73
+ // If there's a pending reload, execute it now
74
+ if (pendingConfig !== null) {
75
+ const config = pendingConfig;
76
+ const resolve = pendingResolve;
77
+ const reject = pendingReject;
78
+ pendingConfig = null;
79
+ pendingResolve = null;
80
+ pendingReject = null;
81
+ executeReload(config).then(resolve, reject);
82
+ }
83
+ }
84
+ };
85
+ /**
86
+ * Perform the actual reload.
87
+ */
88
+ const doReload = async (config) => {
89
+ try {
90
+ logger.debug('Reloading application...');
91
+ await runtime.reload(config);
92
+ logger.info('Application reloaded successfully');
93
+ }
94
+ catch (error) {
95
+ // Log error but keep worker alive for next HMR update
96
+ logger.error({ error }, 'Error during HMR reload');
97
+ }
98
+ };
99
+ /**
100
+ * Schedule a reload. If reload is in progress, supersedes any pending.
101
+ */
102
+ const scheduleReload = (config) => {
103
+ // If no active reload, execute immediately
104
+ if (!activeReload) {
105
+ return executeReload(config);
106
+ }
107
+ logger.debug('Reload in progress, queuing update...');
108
+ // Supersede any existing pending reload
109
+ if (pendingResolve) {
110
+ logger.debug('Superseding previous pending reload');
111
+ pendingResolve(); // Resolve old pending (it's superseded)
112
+ }
113
+ // Create new pending
114
+ return new Promise((resolve, reject) => {
115
+ pendingConfig = config;
116
+ pendingResolve = resolve;
117
+ pendingReject = reject;
118
+ });
119
+ };
120
+ // Register global hot accept handler
121
+ globalThis._hotAccept = async (module) => {
122
+ logger.debug('Received HMR update');
123
+ if (!module)
124
+ return;
125
+ if (!isApplicationConfig(module.default)) {
126
+ logger.error('Invalid application config during HMR reload');
127
+ return;
128
+ }
129
+ await scheduleReload(module.default);
130
+ };
131
+ }
132
+ /**
133
+ * Initialize a job worker.
134
+ */
135
+ async function initializeJobWorker(options, serverConfig) {
136
+ const { jobWorkerPool } = options;
137
+ const runtime = new JobWorkerRuntime(serverConfig, {
138
+ poolName: jobWorkerPool,
139
+ port: workerData.port,
140
+ });
141
+ return runtime;
41
142
  }
42
143
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/entrypoints/worker.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAGhD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,eAAe,CAAA;AAItB,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAoC;IAC5D,MAAM,YAAY,GAAiB,MAAM,MAAM;IAC7C,mBAAmB;IACnB,SAAS,CACV,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACxB,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACnC,UAAU,CAAC,UAAU,GAAG,CAAC,MAAW,EAAE,EAAE;YACtC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC;oBACtC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;gBAC/C,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAChC,CAAC;QACH,CAAC,CAAA;QAED,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,CAAA;QAC9C,MAAM,SAAS,GAAG,MAAM,MAAM;QAC5B,kBAAkB;QAClB,IAAI,EACL,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QAExB,MAAM,OAAO,GAAG,IAAI,wBAAwB,CAC1C,YAAY,EACZ,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,EAC1C,SAAS,CACV,CAAA;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;SAAM,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACnC,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;QACjC,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,YAAY,EAAE;YACjD,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,UAAU,CAAC,IAAI;SACtB,CAAC,CAAA;QACF,OAAO,OAAO,CAAA;IAChB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,yBAA0B,UAAU,CAAC,OAAe,CAAC,IAAI,EAAE,CAAC,CAAA;IAC9E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/entrypoints/worker.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,8 @@ export declare const neemata: {
13
13
  workerType: import("@nmtjs/core").LazyInjectable<import("./runtime/enums.ts").WorkerType, import("@nmtjs/core").Scope.Global>;
14
14
  jobWorkerPool: import("@nmtjs/core").LazyInjectable<import("./runtime/enums.ts").JobWorkerPool, import("@nmtjs/core").Scope.Global>;
15
15
  jobAbortSignal: import("@nmtjs/core").LazyInjectable<AbortSignal, import("@nmtjs/core").Scope.Global>;
16
+ saveJobProgress: import("@nmtjs/core").LazyInjectable<import("./runtime/index.ts").SaveJobProgress, import("@nmtjs/core").Scope.Global>;
17
+ currentJobInfo: import("@nmtjs/core").LazyInjectable<import("./runtime/index.ts").JobExecutionContext, import("@nmtjs/core").Scope.Global>;
16
18
  connection: import("@nmtjs/core").LazyInjectable<import("@nmtjs/gateway").GatewayConnection, import("@nmtjs/core").Scope.Connection>;
17
19
  connectionId: import("@nmtjs/core").LazyInjectable<string, import("@nmtjs/core").Scope.Connection>;
18
20
  connectionData: import("@nmtjs/core").LazyInjectable<unknown, import("@nmtjs/core").Scope.Connection>;
@@ -9,11 +9,20 @@ export * from './jobs/job.ts';
9
9
  export * from './jobs/manager.ts';
10
10
  export * from './jobs/router.ts';
11
11
  export * from './jobs/step.ts';
12
+ export * from './jobs/types.ts';
12
13
  export * from './pubsub/manager.ts';
13
14
  export * from './pubsub/redis.ts';
14
15
  export * from './scheduler/index.ts';
15
16
  export * from './server/config.ts';
17
+ export * from './server/environment.ts';
18
+ export * from './server/error-policy.ts';
19
+ export * from './server/hmr-coordinator.ts';
20
+ export * from './server/lifecycle.ts';
21
+ export * from './server/managed-worker.ts';
22
+ export * from './server/pool-manager.ts';
16
23
  export * from './server/server.ts';
24
+ export * from './server/types.ts';
25
+ export * from './server/worker-pool.ts';
17
26
  export * from './store/index.ts';
18
27
  export * from './types.ts';
19
28
  export * from './workers/application.ts';
@@ -9,11 +9,20 @@ export * from "./jobs/job.js";
9
9
  export * from "./jobs/manager.js";
10
10
  export * from "./jobs/router.js";
11
11
  export * from "./jobs/step.js";
12
+ export * from "./jobs/types.js";
12
13
  export * from "./pubsub/manager.js";
13
14
  export * from "./pubsub/redis.js";
14
15
  export * from "./scheduler/index.js";
15
16
  export * from "./server/config.js";
17
+ export * from "./server/environment.js";
18
+ export * from "./server/error-policy.js";
19
+ export * from "./server/hmr-coordinator.js";
20
+ export * from "./server/lifecycle.js";
21
+ export * from "./server/managed-worker.js";
22
+ export * from "./server/pool-manager.js";
16
23
  export * from "./server/server.js";
24
+ export * from "./server/types.js";
25
+ export * from "./server/worker-pool.js";
17
26
  export * from "./store/index.js";
18
27
  export * from "./types.js";
19
28
  export * from "./workers/application.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAA;AACtC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,0BAA0B,CAAA;AACxC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA;AAC1B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { Scope } from '@nmtjs/core';
2
2
  import type { JobWorkerPool, WorkerType } from './enums.ts';
3
3
  import type { JobManagerInstance } from './jobs/manager.ts';
4
+ import type { JobExecutionContext, SaveJobProgress } from './jobs/types.ts';
4
5
  import type { PubSubAdapterType, PubSubPublish, PubSubSubscribe } from './pubsub/manager.ts';
5
6
  import type { ServerStoreConfig } from './server/config.ts';
6
7
  export declare const pubSubAdapter: import("@nmtjs/core").LazyInjectable<PubSubAdapterType, Scope.Global>;
@@ -11,6 +12,8 @@ export declare const storeConfig: import("@nmtjs/core").LazyInjectable<ServerSto
11
12
  export declare const workerType: import("@nmtjs/core").LazyInjectable<WorkerType, Scope.Global>;
12
13
  export declare const jobWorkerPool: import("@nmtjs/core").LazyInjectable<JobWorkerPool, Scope.Global>;
13
14
  export declare const jobAbortSignal: import("@nmtjs/core").LazyInjectable<AbortSignal, Scope.Global>;
15
+ export declare const saveJobProgress: import("@nmtjs/core").LazyInjectable<SaveJobProgress, Scope.Global>;
16
+ export declare const currentJobInfo: import("@nmtjs/core").LazyInjectable<JobExecutionContext, Scope.Global>;
14
17
  export declare const RuntimeInjectables: {
15
18
  pubSubAdapter: import("@nmtjs/core").LazyInjectable<PubSubAdapterType, Scope.Global>;
16
19
  pubSubPublish: import("@nmtjs/core").LazyInjectable<PubSubPublish, Scope.Global>;
@@ -20,4 +23,6 @@ export declare const RuntimeInjectables: {
20
23
  workerType: import("@nmtjs/core").LazyInjectable<WorkerType, Scope.Global>;
21
24
  jobWorkerPool: import("@nmtjs/core").LazyInjectable<JobWorkerPool, Scope.Global>;
22
25
  jobAbortSignal: import("@nmtjs/core").LazyInjectable<AbortSignal, Scope.Global>;
26
+ saveJobProgress: import("@nmtjs/core").LazyInjectable<SaveJobProgress, Scope.Global>;
27
+ currentJobInfo: import("@nmtjs/core").LazyInjectable<JobExecutionContext, Scope.Global>;
23
28
  };
@@ -7,6 +7,8 @@ export const storeConfig = createLazyInjectable(Scope.Global, 'StoreConfig');
7
7
  export const workerType = createLazyInjectable(Scope.Global, 'WorkerType');
8
8
  export const jobWorkerPool = createLazyInjectable(Scope.Global, 'JobWorkerPool');
9
9
  export const jobAbortSignal = createLazyInjectable(Scope.Global, 'JobAbortSignal');
10
+ export const saveJobProgress = createLazyInjectable(Scope.Global, 'SaveJobProgress');
11
+ export const currentJobInfo = createLazyInjectable(Scope.Global, 'CurrentJobInfo');
10
12
  export const RuntimeInjectables = {
11
13
  pubSubAdapter,
12
14
  pubSubPublish,
@@ -16,5 +18,7 @@ export const RuntimeInjectables = {
16
18
  workerType,
17
19
  jobWorkerPool,
18
20
  jobAbortSignal,
21
+ saveJobProgress,
22
+ currentJobInfo,
19
23
  };
20
24
  //# sourceMappingURL=injectables.js.map