@morojs/moro 1.8.3 → 1.8.4

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 (87) hide show
  1. package/dist/core/config/config-sources.js.map +1 -1
  2. package/dist/core/framework.d.ts +11 -0
  3. package/dist/core/framework.js +107 -36
  4. package/dist/core/framework.js.map +1 -1
  5. package/dist/core/graphql/core.js.map +1 -1
  6. package/dist/core/grpc/types.js.map +1 -1
  7. package/dist/core/http/moro-engine-server.js.map +1 -1
  8. package/dist/core/mail/mail-adapter.js.map +1 -1
  9. package/dist/core/middleware/built-in/cloudwatch/index.d.ts +4 -0
  10. package/dist/core/middleware/built-in/cloudwatch/index.js +5 -0
  11. package/dist/core/middleware/built-in/cloudwatch/index.js.map +1 -0
  12. package/dist/core/middleware/built-in/cloudwatch/middleware.d.ts +31 -0
  13. package/dist/core/middleware/built-in/cloudwatch/middleware.js +52 -0
  14. package/dist/core/middleware/built-in/cloudwatch/middleware.js.map +1 -0
  15. package/dist/core/middleware/built-in/error-tracker/index.d.ts +3 -1
  16. package/dist/core/middleware/built-in/error-tracker/index.js +3 -2
  17. package/dist/core/middleware/built-in/error-tracker/index.js.map +1 -1
  18. package/dist/core/middleware/built-in/error-tracker/middleware.d.ts +6 -3
  19. package/dist/core/middleware/built-in/error-tracker/middleware.js +18 -13
  20. package/dist/core/middleware/built-in/error-tracker/middleware.js.map +1 -1
  21. package/dist/core/middleware/built-in/index.d.ts +43 -7
  22. package/dist/core/middleware/built-in/index.js +37 -7
  23. package/dist/core/middleware/built-in/index.js.map +1 -1
  24. package/dist/core/middleware/built-in/performance-monitor/index.d.ts +3 -1
  25. package/dist/core/middleware/built-in/performance-monitor/index.js +3 -2
  26. package/dist/core/middleware/built-in/performance-monitor/index.js.map +1 -1
  27. package/dist/core/middleware/built-in/performance-monitor/middleware.d.ts +3 -3
  28. package/dist/core/middleware/built-in/performance-monitor/middleware.js +19 -17
  29. package/dist/core/middleware/built-in/performance-monitor/middleware.js.map +1 -1
  30. package/dist/core/middleware/built-in/prometheus/core.d.ts +27 -0
  31. package/dist/core/middleware/built-in/prometheus/core.js +0 -0
  32. package/dist/core/middleware/built-in/prometheus/core.js.map +1 -0
  33. package/dist/core/middleware/built-in/prometheus/index.d.ts +5 -0
  34. package/dist/core/middleware/built-in/prometheus/index.js +6 -0
  35. package/dist/core/middleware/built-in/prometheus/index.js.map +1 -0
  36. package/dist/core/middleware/built-in/prometheus/middleware.d.ts +15 -0
  37. package/dist/core/middleware/built-in/prometheus/middleware.js +30 -0
  38. package/dist/core/middleware/built-in/prometheus/middleware.js.map +1 -0
  39. package/dist/core/middleware/built-in/request-logger/index.d.ts +3 -1
  40. package/dist/core/middleware/built-in/request-logger/index.js +3 -2
  41. package/dist/core/middleware/built-in/request-logger/index.js.map +1 -1
  42. package/dist/core/middleware/built-in/request-logger/middleware.d.ts +4 -4
  43. package/dist/core/middleware/built-in/request-logger/middleware.js +14 -12
  44. package/dist/core/middleware/built-in/request-logger/middleware.js.map +1 -1
  45. package/dist/core/middleware/index.d.ts +1 -1
  46. package/dist/core/middleware/index.js +1 -1
  47. package/dist/core/middleware/index.js.map +1 -1
  48. package/dist/core/pooling/index.d.ts +3 -0
  49. package/dist/core/pooling/index.js +5 -0
  50. package/dist/core/pooling/index.js.map +1 -0
  51. package/dist/core/pooling/lru-cache.d.ts +32 -0
  52. package/dist/core/pooling/lru-cache.js +74 -0
  53. package/dist/core/pooling/lru-cache.js.map +1 -0
  54. package/dist/core/pooling/object-pool-manager.d.ts +3 -1
  55. package/dist/core/pooling/object-pool-manager.js +37 -140
  56. package/dist/core/pooling/object-pool-manager.js.map +1 -1
  57. package/dist/core/pooling/object-pool.d.ts +42 -0
  58. package/dist/core/pooling/object-pool.js +78 -0
  59. package/dist/core/pooling/object-pool.js.map +1 -0
  60. package/dist/core/routing/create-router.js.map +1 -1
  61. package/dist/core/routing/path-matcher.js +1 -43
  62. package/dist/core/routing/path-matcher.js.map +1 -1
  63. package/dist/core/utilities/hooks.d.ts +0 -1
  64. package/dist/core/utilities/hooks.js +0 -2
  65. package/dist/core/utilities/hooks.js.map +1 -1
  66. package/dist/core/utilities/index.d.ts +0 -1
  67. package/dist/core/utilities/index.js +0 -2
  68. package/dist/core/utilities/index.js.map +1 -1
  69. package/dist/core/workers/facade.d.ts +20 -4
  70. package/dist/core/workers/facade.js +15 -7
  71. package/dist/core/workers/facade.js.map +1 -1
  72. package/dist/core/workers/worker-manager.d.ts +12 -0
  73. package/dist/core/workers/worker-manager.js +27 -0
  74. package/dist/core/workers/worker-manager.js.map +1 -1
  75. package/dist/core/workers/worker.d.ts +17 -1
  76. package/dist/core/workers/worker.js +28 -26
  77. package/dist/core/workers/worker.js.map +1 -1
  78. package/dist/index.d.ts +39 -2
  79. package/dist/index.js +14 -2
  80. package/dist/index.js.map +1 -1
  81. package/dist/moro.js +25 -1
  82. package/dist/moro.js.map +1 -1
  83. package/dist/types/config.js.map +1 -1
  84. package/dist/types/core.d.ts +1 -0
  85. package/dist/types/core.js.map +1 -1
  86. package/dist/types/module.js.map +1 -1
  87. package/package.json +3 -3
@@ -20,9 +20,19 @@ export interface WorkerHelpers {
20
20
  verifyJWT(token: string, secret: string, options?: any): Promise<any>;
21
21
  signJWT(payload: any, secret: string, options?: any): Promise<string>;
22
22
  hash(data: string, algorithm?: string): Promise<string>;
23
+ compress(data: string | Buffer | Uint8Array, options?: {
24
+ format?: 'gzip' | 'deflate' | 'brotli';
25
+ }): Promise<Buffer>;
26
+ decompress(data: Buffer | Uint8Array, options?: {
27
+ format?: 'gzip' | 'deflate' | 'brotli';
28
+ }): Promise<Buffer>;
23
29
  heavyComputation(data: any): Promise<any>;
24
30
  transformJSON(data: any, transformer: (data: any) => any): Promise<any>;
25
31
  }
32
+ export interface WorkerPoolOptions {
33
+ workerCount?: number;
34
+ maxQueueSize?: number;
35
+ }
26
36
  /**
27
37
  * Worker Threads Facade - Provides clean access to optional worker functionality
28
38
  */
@@ -32,19 +42,25 @@ export declare class WorkerThreadsFacade {
32
42
  private executeOnWorker;
33
43
  private initialized;
34
44
  /**
35
- * Lazy initialize worker threads
45
+ * Lazy initialize worker threads.
46
+ * Pool options only take effect on the first initialization (the underlying
47
+ * manager is a singleton).
36
48
  */
37
- ensureInitialized(): Promise<void>;
49
+ ensureInitialized(options?: WorkerPoolOptions): Promise<void>;
38
50
  /**
39
51
  * Execute a task on worker threads
40
52
  */
41
53
  executeTask<T = any>(task: WorkerTask): Promise<T>;
42
54
  /**
43
- * Get worker thread statistics
55
+ * Get worker thread statistics.
56
+ * Returns null when workers were never initialized — observing stats
57
+ * must not spawn a pool.
44
58
  */
45
59
  getStats(): Promise<WorkerStats | null>;
46
60
  /**
47
- * Shutdown worker threads
61
+ * Shutdown worker threads.
62
+ * A no-op when workers were never initialized — never spin up a pool
63
+ * just to tear it down.
48
64
  */
49
65
  shutdown(): Promise<void>;
50
66
  /**
@@ -9,14 +9,16 @@ export class WorkerThreadsFacade {
9
9
  executeOnWorker = null;
10
10
  initialized = false;
11
11
  /**
12
- * Lazy initialize worker threads
12
+ * Lazy initialize worker threads.
13
+ * Pool options only take effect on the first initialization (the underlying
14
+ * manager is a singleton).
13
15
  */
14
- async ensureInitialized() {
16
+ async ensureInitialized(options) {
15
17
  if (this.initialized)
16
18
  return;
17
19
  try {
18
20
  const workers = await import('./index.js');
19
- this.workerManager = workers.getWorkerManager();
21
+ this.workerManager = workers.getWorkerManager(options);
20
22
  this.workerTasks = workers.workerTasks;
21
23
  this.executeOnWorker = workers.executeOnWorker;
22
24
  }
@@ -39,17 +41,23 @@ export class WorkerThreadsFacade {
39
41
  return this.workerManager.executeTask(task);
40
42
  }
41
43
  /**
42
- * Get worker thread statistics
44
+ * Get worker thread statistics.
45
+ * Returns null when workers were never initialized — observing stats
46
+ * must not spawn a pool.
43
47
  */
44
48
  async getStats() {
45
- await this.ensureInitialized();
49
+ if (!this.initialized)
50
+ return null;
46
51
  return this.workerManager?.getStats() || null;
47
52
  }
48
53
  /**
49
- * Shutdown worker threads
54
+ * Shutdown worker threads.
55
+ * A no-op when workers were never initialized — never spin up a pool
56
+ * just to tear it down.
50
57
  */
51
58
  async shutdown() {
52
- await this.ensureInitialized();
59
+ if (!this.initialized)
60
+ return;
53
61
  await this.workerManager?.shutdown();
54
62
  }
55
63
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"facade.js","sourceRoot":"","sources":["../../../src/core/workers/facade.ts"],"names":[],"mappings":"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","sourcesContent":["// Worker Threads Facade - Clean API for optional worker thread functionality\n// Provides a clean interface that gracefully degrades when workers aren't available\n\nexport interface WorkerTask {\n id: string;\n type: string;\n data: any;\n priority?: 'low' | 'normal' | 'high';\n timeout?: number;\n}\n\nexport interface WorkerStats {\n workerCount: number;\n activeTasks: number;\n queuedTasks: number;\n isShuttingDown: boolean;\n}\n\nexport interface WorkerAPI {\n executeTask<T = any>(task: WorkerTask): Promise<T>;\n getStats(): WorkerStats;\n shutdown(): Promise<void>;\n}\n\nexport interface WorkerHelpers {\n verifyJWT(token: string, secret: string, options?: any): Promise<any>;\n signJWT(payload: any, secret: string, options?: any): Promise<string>;\n hash(data: string, algorithm?: string): Promise<string>;\n heavyComputation(data: any): Promise<any>;\n transformJSON(data: any, transformer: (data: any) => any): Promise<any>;\n}\n\n/**\n * Worker Threads Facade - Provides clean access to optional worker functionality\n */\nexport class WorkerThreadsFacade {\n private workerManager: WorkerAPI | null = null;\n private workerTasks: WorkerHelpers | null = null;\n private executeOnWorker: ((task: WorkerTask) => Promise<any>) | null = null;\n private initialized = false;\n\n /**\n * Lazy initialize worker threads\n */\n async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n try {\n const workers = await import('./index.js');\n this.workerManager = workers.getWorkerManager();\n this.workerTasks = workers.workerTasks;\n this.executeOnWorker = workers.executeOnWorker;\n } catch {\n // Workers not available - graceful degradation\n this.workerManager = null;\n this.workerTasks = null;\n this.executeOnWorker = null;\n }\n\n this.initialized = true;\n }\n\n /**\n * Execute a task on worker threads\n */\n async executeTask<T = any>(task: WorkerTask): Promise<T> {\n await this.ensureInitialized();\n\n if (!this.workerManager) {\n throw new Error('Worker threads are not available in this environment');\n }\n\n return this.workerManager.executeTask<T>(task);\n }\n\n /**\n * Get worker thread statistics\n */\n async getStats(): Promise<WorkerStats | null> {\n await this.ensureInitialized();\n return this.workerManager?.getStats() || null;\n }\n\n /**\n * Shutdown worker threads\n */\n async shutdown(): Promise<void> {\n await this.ensureInitialized();\n await this.workerManager?.shutdown();\n }\n\n /**\n * JWT operations using worker threads\n */\n async getJwtWorker(): Promise<{\n verify: WorkerHelpers['verifyJWT'];\n sign: WorkerHelpers['signJWT'];\n } | null> {\n await this.ensureInitialized();\n\n if (!this.workerTasks) return null;\n\n return {\n verify: this.workerTasks.verifyJWT.bind(this.workerTasks),\n sign: this.workerTasks.signJWT.bind(this.workerTasks),\n };\n }\n\n /**\n * Crypto operations using worker threads\n */\n async getCryptoWorker(): Promise<{ hash: WorkerHelpers['hash'] } | null> {\n await this.ensureInitialized();\n\n if (!this.workerTasks) return null;\n\n return {\n hash: this.workerTasks.hash.bind(this.workerTasks),\n };\n }\n\n /**\n * Heavy computation operations using worker threads\n */\n async getComputeWorker(): Promise<{\n heavy: WorkerHelpers['heavyComputation'];\n transformJSON: WorkerHelpers['transformJSON'];\n } | null> {\n await this.ensureInitialized();\n\n if (!this.workerTasks) return null;\n\n return {\n heavy: this.workerTasks.heavyComputation.bind(this.workerTasks),\n transformJSON: this.workerTasks.transformJSON.bind(this.workerTasks),\n };\n }\n\n /**\n * Check if worker threads are available\n */\n async isAvailable(): Promise<boolean> {\n await this.ensureInitialized();\n return this.workerManager !== null;\n }\n}\n"]}
1
+ {"version":3,"file":"facade.js","sourceRoot":"","sources":["../../../src/core/workers/facade.ts"],"names":[],"mappings":"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","sourcesContent":["// Worker Threads Facade - Clean API for optional worker thread functionality\n// Provides a clean interface that gracefully degrades when workers aren't available\n\nexport interface WorkerTask {\n id: string;\n type: string;\n data: any;\n priority?: 'low' | 'normal' | 'high';\n timeout?: number;\n}\n\nexport interface WorkerStats {\n workerCount: number;\n activeTasks: number;\n queuedTasks: number;\n isShuttingDown: boolean;\n}\n\nexport interface WorkerAPI {\n executeTask<T = any>(task: WorkerTask): Promise<T>;\n getStats(): WorkerStats;\n shutdown(): Promise<void>;\n}\n\nexport interface WorkerHelpers {\n verifyJWT(token: string, secret: string, options?: any): Promise<any>;\n signJWT(payload: any, secret: string, options?: any): Promise<string>;\n hash(data: string, algorithm?: string): Promise<string>;\n compress(\n data: string | Buffer | Uint8Array,\n options?: { format?: 'gzip' | 'deflate' | 'brotli' }\n ): Promise<Buffer>;\n decompress(\n data: Buffer | Uint8Array,\n options?: { format?: 'gzip' | 'deflate' | 'brotli' }\n ): Promise<Buffer>;\n heavyComputation(data: any): Promise<any>;\n transformJSON(data: any, transformer: (data: any) => any): Promise<any>;\n}\n\nexport interface WorkerPoolOptions {\n workerCount?: number;\n maxQueueSize?: number;\n}\n\n/**\n * Worker Threads Facade - Provides clean access to optional worker functionality\n */\nexport class WorkerThreadsFacade {\n private workerManager: WorkerAPI | null = null;\n private workerTasks: WorkerHelpers | null = null;\n private executeOnWorker: ((task: WorkerTask) => Promise<any>) | null = null;\n private initialized = false;\n\n /**\n * Lazy initialize worker threads.\n * Pool options only take effect on the first initialization (the underlying\n * manager is a singleton).\n */\n async ensureInitialized(options?: WorkerPoolOptions): Promise<void> {\n if (this.initialized) return;\n\n try {\n const workers = await import('./index.js');\n this.workerManager = workers.getWorkerManager(options);\n this.workerTasks = workers.workerTasks;\n this.executeOnWorker = workers.executeOnWorker;\n } catch {\n // Workers not available - graceful degradation\n this.workerManager = null;\n this.workerTasks = null;\n this.executeOnWorker = null;\n }\n\n this.initialized = true;\n }\n\n /**\n * Execute a task on worker threads\n */\n async executeTask<T = any>(task: WorkerTask): Promise<T> {\n await this.ensureInitialized();\n\n if (!this.workerManager) {\n throw new Error('Worker threads are not available in this environment');\n }\n\n return this.workerManager.executeTask<T>(task);\n }\n\n /**\n * Get worker thread statistics.\n * Returns null when workers were never initialized — observing stats\n * must not spawn a pool.\n */\n async getStats(): Promise<WorkerStats | null> {\n if (!this.initialized) return null;\n return this.workerManager?.getStats() || null;\n }\n\n /**\n * Shutdown worker threads.\n * A no-op when workers were never initialized — never spin up a pool\n * just to tear it down.\n */\n async shutdown(): Promise<void> {\n if (!this.initialized) return;\n await this.workerManager?.shutdown();\n }\n\n /**\n * JWT operations using worker threads\n */\n async getJwtWorker(): Promise<{\n verify: WorkerHelpers['verifyJWT'];\n sign: WorkerHelpers['signJWT'];\n } | null> {\n await this.ensureInitialized();\n\n if (!this.workerTasks) return null;\n\n return {\n verify: this.workerTasks.verifyJWT.bind(this.workerTasks),\n sign: this.workerTasks.signJWT.bind(this.workerTasks),\n };\n }\n\n /**\n * Crypto operations using worker threads\n */\n async getCryptoWorker(): Promise<{ hash: WorkerHelpers['hash'] } | null> {\n await this.ensureInitialized();\n\n if (!this.workerTasks) return null;\n\n return {\n hash: this.workerTasks.hash.bind(this.workerTasks),\n };\n }\n\n /**\n * Heavy computation operations using worker threads\n */\n async getComputeWorker(): Promise<{\n heavy: WorkerHelpers['heavyComputation'];\n transformJSON: WorkerHelpers['transformJSON'];\n } | null> {\n await this.ensureInitialized();\n\n if (!this.workerTasks) return null;\n\n return {\n heavy: this.workerTasks.heavyComputation.bind(this.workerTasks),\n transformJSON: this.workerTasks.transformJSON.bind(this.workerTasks),\n };\n }\n\n /**\n * Check if worker threads are available\n */\n async isAvailable(): Promise<boolean> {\n await this.ensureInitialized();\n return this.workerManager !== null;\n }\n}\n"]}
@@ -134,6 +134,18 @@ export declare const workerTasks: {
134
134
  * Crypto hash (CPU-intensive)
135
135
  */
136
136
  hash(data: string, algorithm?: string): Promise<string>;
137
+ /**
138
+ * Data compression (CPU-intensive for large payloads)
139
+ */
140
+ compress(data: string | Buffer | Uint8Array, options?: {
141
+ format?: "gzip" | "deflate" | "brotli";
142
+ }): Promise<Buffer>;
143
+ /**
144
+ * Data decompression (CPU-intensive for large payloads)
145
+ */
146
+ decompress(data: Buffer | Uint8Array, options?: {
147
+ format?: "gzip" | "deflate" | "brotli";
148
+ }): Promise<Buffer>;
137
149
  /**
138
150
  * Heavy computation example
139
151
  */
@@ -372,6 +372,33 @@ export const workerTasks = {
372
372
  timeout: 10000,
373
373
  });
374
374
  },
375
+ /**
376
+ * Data compression (CPU-intensive for large payloads)
377
+ */
378
+ async compress(data, options) {
379
+ const result = await executeOnWorker({
380
+ id: `data-compress-${Date.now()}-${++taskIdCounter}`,
381
+ type: WORKER_TASKS.DATA_COMPRESS,
382
+ data: { input: data, format: options?.format ?? 'gzip' },
383
+ priority: 'normal',
384
+ timeout: 30000,
385
+ });
386
+ // Buffers cross the thread boundary as plain Uint8Array
387
+ return Buffer.isBuffer(result) ? result : Buffer.from(result);
388
+ },
389
+ /**
390
+ * Data decompression (CPU-intensive for large payloads)
391
+ */
392
+ async decompress(data, options) {
393
+ const result = await executeOnWorker({
394
+ id: `data-decompress-${Date.now()}-${++taskIdCounter}`,
395
+ type: WORKER_TASKS.DATA_DECOMPRESS,
396
+ data: { input: data, format: options?.format ?? 'gzip' },
397
+ priority: 'normal',
398
+ timeout: 30000,
399
+ });
400
+ return Buffer.isBuffer(result) ? result : Buffer.from(result);
401
+ },
375
402
  /**
376
403
  * Heavy computation example
377
404
  */
@@ -1 +1 @@
1
- {"version":3,"file":"worker-manager.js","sourceRoot":"","sources":["../../../src/core/workers/worker-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// Worker Thread Manager - Offload CPU-intensive operations\nimport { Worker } from 'worker_threads';\nimport { createFrameworkLogger } from '../logger/index.js';\nimport { cpus } from 'os';\nimport { isPackageAvailable } from '../utilities/package-utils.js';\n// WORKER_ENTRY resolves to worker.js, this file's compiled sibling in dist/**,\n// via import.meta in ./worker-entry.js. That ESM-only syntax is isolated in its\n// own module (mapped to a stub in jest.config) so importing WorkerManager under\n// ts-jest's CommonJS transform never hits a load-time import.meta SyntaxError.\nimport { WORKER_ENTRY } from './worker-entry.js';\n\n// Optional JWT import\nconst jwtAvailable = isPackageAvailable('jsonwebtoken');\n\nconst logger = createFrameworkLogger('WorkerManager');\n\n// Upper bound on the exponential restart backoff\nconst MAX_RESTART_BACKOFF_MS = 5000;\n\n// Hoisted constants — avoids object allocation inside sort comparator on every call\nconst PRIORITY_ORDER: Record<string, number> = { high: 3, normal: 2, low: 1 };\n\n// Simple counter for task IDs — avoids expensive crypto.randomBytes for non-security IDs\nlet taskIdCounter = 0;\n\n/**\n * Worker task definitions\n */\nexport interface WorkerTask {\n id: string;\n type: string;\n data: any;\n priority?: 'low' | 'normal' | 'high';\n timeout?: number;\n}\n\n/**\n * Worker result\n */\nexport interface WorkerResult {\n taskId: string;\n success: boolean;\n data?: any;\n error?: string;\n executionTime: number;\n}\n\n/**\n * Active task tracking\n */\ninterface ActiveTask {\n resolve: CallableFunction;\n reject: CallableFunction;\n timeout: NodeJS.Timeout | null;\n // The worker a task was dispatched to (set once it leaves the queue). Used so a\n // crashed worker only rejects its own in-flight tasks, not everyone else's.\n assignedWorker?: Worker;\n}\n\n/**\n * Built-in worker tasks\n */\nexport const WORKER_TASKS = {\n JWT_VERIFY: 'jwt:verify',\n JWT_SIGN: 'jwt:sign',\n CRYPTO_HASH: 'crypto:hash',\n CRYPTO_ENCRYPT: 'crypto:encrypt',\n CRYPTO_DECRYPT: 'crypto:decrypt',\n DATA_COMPRESS: 'data:compress',\n DATA_DECOMPRESS: 'data:decompress',\n IMAGE_PROCESS: 'image:process',\n HEAVY_COMPUTATION: 'computation:heavy',\n JSON_TRANSFORM: 'json:transform',\n} as const;\n\n/**\n * Worker Thread Manager\n * Manages a pool of worker threads for CPU-intensive operations\n */\nexport class WorkerManager {\n private workers: Map<number, Worker> = new Map();\n private taskQueue: WorkerTask[] = [];\n private activeTasks: Map<string, ActiveTask> = new Map();\n private workerCount: number;\n private maxQueueSize: number;\n private isShuttingDown = false;\n private maxRestartAttempts: number;\n private restartBackoffMs: number;\n private restartAttempts = 0;\n private restartTimers = new Set<NodeJS.Timeout>();\n private handledFailures = new WeakSet<Worker>();\n private poolFailed = false;\n\n constructor(\n options: {\n workerCount?: number;\n maxQueueSize?: number;\n maxRestartAttempts?: number;\n restartBackoffMs?: number;\n } = {}\n ) {\n this.workerCount = options.workerCount || Math.max(1, cpus().length - 1); // Leave 1 core for main thread\n this.maxQueueSize = options.maxQueueSize || 1000;\n this.maxRestartAttempts = options.maxRestartAttempts ?? 10;\n this.restartBackoffMs = options.restartBackoffMs ?? 100;\n\n this.initializeWorkers();\n }\n\n /**\n * Initialize worker threads\n */\n private initializeWorkers(): void {\n for (let i = 0; i < this.workerCount; i++) {\n this.createWorker();\n }\n\n logger.info(`Initialized ${this.workerCount} worker threads`, 'WorkerInit', {\n totalWorkers: this.workerCount,\n maxQueueSize: this.maxQueueSize,\n });\n }\n\n /**\n * Create a single worker thread\n */\n private createWorker(): void {\n if (this.isShuttingDown || this.poolFailed) {\n return;\n }\n\n let worker: Worker;\n try {\n worker = new Worker(WORKER_ENTRY, {\n workerData: { type: 'worker' },\n });\n } catch (error) {\n // Spawning can fail synchronously (e.g. a missing entry file). Treat it the\n // same as a runtime failure so we back off instead of throwing.\n logger.error('Failed to spawn worker thread', 'WorkerSpawn', {\n error: error instanceof Error ? error.message : String(error),\n });\n this.scheduleRestart();\n return;\n }\n\n worker.on('message', (result: WorkerResult) => {\n // A successful message proves the pool is healthy; reset the restart budget.\n this.restartAttempts = 0;\n this.handleWorkerResult(result);\n });\n\n worker.on('error', error => {\n logger.error('Worker thread error', 'WorkerError', { error: error.message });\n this.handleWorkerFailure(worker);\n });\n\n worker.on('exit', code => {\n if (code !== 0 && !this.isShuttingDown) {\n logger.warn(`Worker exited with code ${code}, restarting`, 'WorkerExit');\n this.handleWorkerFailure(worker);\n }\n });\n\n this.workers.set(worker.threadId, worker);\n logger.debug(`Created worker thread ${worker.threadId}`, 'WorkerCreate');\n }\n\n /**\n * Handle a crashed worker: reject only the tasks that were assigned to it and\n * schedule a backed-off restart. A failed worker emits both 'error' and 'exit',\n * so this is guarded to run at most once per worker.\n */\n private handleWorkerFailure(worker: Worker): void {\n if (this.handledFailures.has(worker)) {\n return;\n }\n this.handledFailures.add(worker);\n\n this.workers.delete(worker.threadId);\n\n if (this.isShuttingDown) {\n return;\n }\n\n // Reject only the tasks that were dispatched to this specific worker. Tasks\n // still queued (or running on other workers) are intentionally left alone.\n for (const [taskId, taskInfo] of this.activeTasks.entries()) {\n if (taskInfo.assignedWorker === worker) {\n if (taskInfo.timeout) {\n clearTimeout(taskInfo.timeout);\n }\n taskInfo.reject(new Error('Worker thread failed'));\n this.activeTasks.delete(taskId);\n }\n }\n\n this.scheduleRestart();\n }\n\n /**\n * Schedule a replacement worker with exponential backoff, capping the number of\n * consecutive restart attempts so a persistently broken worker entry can never\n * spin into an unbounded restart loop.\n */\n private scheduleRestart(): void {\n if (this.isShuttingDown || this.poolFailed) {\n return;\n }\n\n this.restartAttempts++;\n\n if (this.restartAttempts > this.maxRestartAttempts) {\n this.failPool();\n return;\n }\n\n const delay = Math.min(\n this.restartBackoffMs * 2 ** (this.restartAttempts - 1),\n MAX_RESTART_BACKOFF_MS\n );\n\n logger.warn(\n `Scheduling worker restart in ${delay}ms (attempt ${this.restartAttempts}/${this.maxRestartAttempts})`,\n 'WorkerRestart'\n );\n\n const timer = setTimeout(() => {\n this.restartTimers.delete(timer);\n this.createWorker();\n }, delay);\n\n // Don't keep the process alive purely for a pending restart\n timer.unref();\n this.restartTimers.add(timer);\n }\n\n /**\n * Give up after too many failed restarts: fail every outstanding task cleanly\n * (rejecting their promises) instead of looping forever.\n */\n private failPool(): void {\n if (this.poolFailed) {\n return;\n }\n this.poolFailed = true;\n\n logger.error(\n `Worker pool failed to recover after ${this.maxRestartAttempts} restart attempts`,\n 'WorkerPoolFailed'\n );\n\n const error = new Error(\n `Worker pool is unavailable after ${this.maxRestartAttempts} failed restart attempts`\n );\n\n // Every queued task also has an activeTasks entry, so this rejects both\n // in-flight and queued work.\n for (const [taskId, taskInfo] of this.activeTasks.entries()) {\n if (taskInfo.timeout) {\n clearTimeout(taskInfo.timeout);\n }\n taskInfo.reject(error);\n this.activeTasks.delete(taskId);\n }\n\n this.taskQueue.length = 0;\n }\n\n /**\n * Execute a task on a worker thread\n */\n async executeTask<T = any>(task: WorkerTask): Promise<T> {\n if (this.isShuttingDown) {\n throw new Error('Worker manager is shutting down');\n }\n\n if (this.poolFailed) {\n throw new Error('Worker pool is unavailable (too many worker failures)');\n }\n\n return new Promise<T>((resolve, reject) => {\n // Check queue size limit\n if (this.taskQueue.length >= this.maxQueueSize) {\n reject(new Error('Worker queue is full'));\n return;\n }\n\n // Add to queue\n this.taskQueue.push(task);\n\n // Set up promise handlers\n const timeout = task.timeout\n ? setTimeout(() => {\n this.activeTasks.delete(task.id);\n reject(new Error(`Task ${task.id} timed out`));\n }, task.timeout)\n : null;\n\n // Don't keep process alive for worker timeouts\n if (timeout) {\n timeout.unref();\n }\n\n this.activeTasks.set(task.id, { resolve, reject, timeout });\n\n // Try to assign task to available worker\n this.processQueue();\n });\n }\n\n /**\n * Process the task queue\n */\n private processQueue(): void {\n // Sort queue by priority (high first)\n this.taskQueue.sort(\n (a, b) =>\n (PRIORITY_ORDER[b.priority || 'normal'] ?? 0) -\n (PRIORITY_ORDER[a.priority || 'normal'] ?? 0)\n );\n\n // Assign tasks to available workers\n for (const [threadId, worker] of this.workers.entries()) {\n if (this.taskQueue.length === 0) break;\n\n // Check if worker is available (not currently processing)\n // For simplicity, we'll send tasks and let workers handle queuing\n const task = this.taskQueue.shift();\n if (task) {\n // Record the assignment so a crashed worker only rejects its own tasks.\n const taskInfo = this.activeTasks.get(task.id);\n if (taskInfo) {\n taskInfo.assignedWorker = worker;\n }\n worker.postMessage(task);\n logger.debug(`Assigned task ${task.id} to worker ${threadId}`, 'TaskAssigned');\n }\n }\n }\n\n /**\n * Handle result from worker thread\n */\n private handleWorkerResult(result: WorkerResult): void {\n const taskInfo = this.activeTasks.get(result.taskId);\n if (!taskInfo) {\n logger.warn(`Received result for unknown task ${result.taskId}`, 'UnknownTaskResult');\n return;\n }\n\n // Clear timeout\n if (taskInfo.timeout) {\n clearTimeout(taskInfo.timeout);\n }\n\n // Remove from active tasks\n this.activeTasks.delete(result.taskId);\n\n // Handle result\n if (result.success) {\n logger.debug(`Task ${result.taskId} completed in ${result.executionTime}ms`, 'TaskCompleted');\n taskInfo.resolve(result.data);\n } else {\n logger.error(`Task ${result.taskId} failed: ${result.error}`, 'TaskFailed');\n taskInfo.reject(new Error(result.error || 'Task failed'));\n }\n\n // Process next task in queue\n this.processQueue();\n }\n\n /**\n * Shutdown all workers\n */\n async shutdown(): Promise<void> {\n this.isShuttingDown = true;\n\n // Cancel any pending worker restarts\n for (const timer of this.restartTimers) {\n clearTimeout(timer);\n }\n this.restartTimers.clear();\n\n // Reject all pending tasks\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [taskId, taskInfo] of this.activeTasks.entries()) {\n if (taskInfo.timeout) {\n clearTimeout(taskInfo.timeout);\n }\n taskInfo.reject(new Error('Worker manager shutting down'));\n }\n\n // Terminate all workers\n const shutdownPromises = Array.from(this.workers.values()).map(\n worker =>\n new Promise<void>(resolve => {\n worker.once('exit', () => resolve());\n void worker.terminate();\n })\n );\n\n await Promise.all(shutdownPromises);\n this.workers.clear();\n this.activeTasks.clear();\n this.taskQueue.length = 0;\n\n logger.info('Worker manager shutdown complete', 'WorkerShutdown');\n }\n\n /**\n * Get worker statistics\n */\n getStats() {\n return {\n workerCount: this.workers.size,\n activeTasks: this.activeTasks.size,\n queuedTasks: this.taskQueue.length,\n isShuttingDown: this.isShuttingDown,\n };\n }\n}\n\n// Singleton instance\nlet workerManagerInstance: WorkerManager | null = null;\n\n/**\n * Get or create the worker manager instance\n */\nexport function getWorkerManager(options?: {\n workerCount?: number;\n maxQueueSize?: number;\n}): WorkerManager {\n if (!workerManagerInstance) {\n workerManagerInstance = new WorkerManager(options);\n }\n return workerManagerInstance;\n}\n\n/**\n * Execute task on worker thread (convenience function)\n */\nexport async function executeOnWorker<T = any>(task: WorkerTask): Promise<T> {\n const manager = getWorkerManager();\n return manager.executeTask<T>(task);\n}\n\n/**\n * Built-in task helpers\n */\nexport const workerTasks = {\n /**\n * JWT verification (CPU-intensive)\n */\n async verifyJWT(token: string, secret: string, options?: any): Promise<any> {\n if (!jwtAvailable) {\n throw new Error(\n 'JWT verification requires the \"jsonwebtoken\" package. Please install it with: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n return executeOnWorker({\n id: `jwt-verify-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.JWT_VERIFY,\n data: { token, secret, options },\n priority: 'high',\n timeout: 5000,\n });\n },\n\n /**\n * JWT signing (CPU-intensive)\n */\n async signJWT(payload: any, secret: string, options?: any): Promise<string> {\n if (!jwtAvailable) {\n throw new Error(\n 'JWT signing requires the \"jsonwebtoken\" package. Please install it with: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n return executeOnWorker({\n id: `jwt-sign-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.JWT_SIGN,\n data: { payload, secret, options },\n priority: 'high',\n timeout: 5000,\n });\n },\n\n /**\n * Crypto hash (CPU-intensive)\n */\n async hash(data: string, algorithm = 'sha256'): Promise<string> {\n return executeOnWorker({\n id: `crypto-hash-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.CRYPTO_HASH,\n data: { data, algorithm },\n priority: 'normal',\n timeout: 10000,\n });\n },\n\n /**\n * Heavy computation example\n */\n async heavyComputation(data: any): Promise<any> {\n return executeOnWorker({\n id: `computation-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.HEAVY_COMPUTATION,\n data,\n priority: 'normal',\n timeout: 30000,\n });\n },\n\n /**\n * JSON transformation (can be CPU-intensive for large objects)\n */\n async transformJSON(data: any, transformer: (data: any) => any): Promise<any> {\n return executeOnWorker({\n id: `json-transform-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.JSON_TRANSFORM,\n data: { data, transformer: transformer.toString() },\n priority: 'normal',\n timeout: 15000,\n });\n },\n};\n"]}
1
+ {"version":3,"file":"worker-manager.js","sourceRoot":"","sources":["../../../src/core/workers/worker-manager.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,+EAA+E;AAC/E,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,sBAAsB;AACtB,MAAM,YAAY,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;AAExD,MAAM,MAAM,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC;AAEtD,iDAAiD;AACjD,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAEpC,oFAAoF;AACpF,MAAM,cAAc,GAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAE9E,yFAAyF;AACzF,IAAI,aAAa,GAAG,CAAC,CAAC;AAoCtB;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,UAAU,EAAE,YAAY;IACxB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,aAAa;IAC1B,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,aAAa,EAAE,eAAe;IAC9B,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,iBAAiB,EAAE,mBAAmB;IACtC,cAAc,EAAE,gBAAgB;CACxB,CAAC;AAEX;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAC;IACzC,SAAS,GAAiB,EAAE,CAAC;IAC7B,WAAW,GAA4B,IAAI,GAAG,EAAE,CAAC;IACjD,WAAW,CAAS;IACpB,YAAY,CAAS;IACrB,cAAc,GAAG,KAAK,CAAC;IACvB,kBAAkB,CAAS;IAC3B,gBAAgB,CAAS;IACzB,eAAe,GAAG,CAAC,CAAC;IACpB,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,eAAe,GAAG,IAAI,OAAO,EAAU,CAAC;IACxC,UAAU,GAAG,KAAK,CAAC;IAE3B,YACE,UAKI,EAAE;QAEN,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,+BAA+B;QACzG,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;QACjD,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,EAAE,CAAC;QAC3D,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC;QAExD,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,WAAW,iBAAiB,EAAE,YAAY,EAAE;YAC1E,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE;gBAChC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC/B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4EAA4E;YAC5E,gEAAgE;YAChE,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,aAAa,EAAE;gBAC3D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAoB,EAAE,EAAE;YAC5C,6EAA6E;YAC7E,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;YACvB,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,cAAc,EAAE,YAAY,CAAC,CAAC;gBACzE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,CAAC,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAC;IAC3E,CAAC;IAED;;;;OAIG;IACK,mBAAmB,CAAC,MAAc;QACxC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEjC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,4EAA4E;QAC5E,2EAA2E;QAC3E,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,QAAQ,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;gBACvC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACjC,CAAC;gBACD,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBACnD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACK,eAAe;QACrB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC,EACvD,sBAAsB,CACvB,CAAC;QAEF,MAAM,CAAC,IAAI,CACT,gCAAgC,KAAK,eAAe,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,kBAAkB,GAAG,EACtG,eAAe,CAChB,CAAC;QAEF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,4DAA4D;QAC5D,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACK,QAAQ;QACd,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,MAAM,CAAC,KAAK,CACV,uCAAuC,IAAI,CAAC,kBAAkB,mBAAmB,EACjF,kBAAkB,CACnB,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,oCAAoC,IAAI,CAAC,kBAAkB,0BAA0B,CACtF,CAAC;QAEF,wEAAwE;QACxE,6BAA6B;QAC7B,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAU,IAAgB;QACzC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,yBAAyB;YACzB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC/C,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,eAAe;YACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE1B,0BAA0B;YAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;gBAC1B,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACjC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;gBACjD,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;gBAClB,CAAC,CAAC,IAAI,CAAC;YAET,+CAA+C;YAC/C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,CAAC;YAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAE5D,yCAAyC;YACzC,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,sCAAsC;QACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAChD,CAAC;QAEF,oCAAoC;QACpC,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAEvC,0DAA0D;YAC1D,kEAAkE;YAClE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACpC,IAAI,IAAI,EAAE,CAAC;gBACT,wEAAwE;gBACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC;gBACnC,CAAC;gBACD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACzB,MAAM,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,EAAE,cAAc,QAAQ,EAAE,EAAE,cAAc,CAAC,CAAC;YACjF,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,MAAoB;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,oCAAoC,MAAM,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACtF,OAAO;QACT,CAAC;QAED,gBAAgB;QAChB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAED,2BAA2B;QAC3B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvC,gBAAgB;QAChB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC,QAAQ,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,aAAa,IAAI,EAAE,eAAe,CAAC,CAAC;YAC9F,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,QAAQ,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC;YAC5E,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAE3B,qCAAqC;QACrC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAE3B,2BAA2B;QAC3B,6DAA6D;QAC7D,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACrB,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YACD,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,wBAAwB;QACxB,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAC5D,MAAM,CAAC,EAAE,CACP,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACrC,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;QAC1B,CAAC,CAAC,CACL,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAE1B,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,gBAAgB,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI;YAClC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM;YAClC,cAAc,EAAE,IAAI,CAAC,cAAc;SACpC,CAAC;IACJ,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,qBAAqB,GAAyB,IAAI,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAGhC;IACC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAU,IAAgB;IAC7D,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,OAAO,OAAO,CAAC,WAAW,CAAI,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,MAAc,EAAE,OAAa;QAC1D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,4HAA4H,CAC7H,CAAC;QACJ,CAAC;QACD,OAAO,eAAe,CAAC;YACrB,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE;YACjD,IAAI,EAAE,YAAY,CAAC,UAAU;YAC7B,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;YAChC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,OAAY,EAAE,MAAc,EAAE,OAAa;QACvD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,uHAAuH,CACxH,CAAC;QACJ,CAAC;QACD,OAAO,eAAe,CAAC;YACrB,EAAE,EAAE,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE;YAC/C,IAAI,EAAE,YAAY,CAAC,QAAQ;YAC3B,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;YAClC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,SAAS,GAAG,QAAQ;QAC3C,OAAO,eAAe,CAAC;YACrB,EAAE,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE;YAClD,IAAI,EAAE,YAAY,CAAC,WAAW;YAC9B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,IAAkC,EAClC,OAAoD;QAEpD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAa;YAC/C,EAAE,EAAE,iBAAiB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE;YACpD,IAAI,EAAE,YAAY,CAAC,aAAa;YAChC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE;YACxD,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,wDAAwD;QACxD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CACd,IAAyB,EACzB,OAAoD;QAEpD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAa;YAC/C,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE;YACtD,IAAI,EAAE,YAAY,CAAC,eAAe;YAClC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE;YACxD,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAAS;QAC9B,OAAO,eAAe,CAAC;YACrB,EAAE,EAAE,eAAe,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE;YAClD,IAAI,EAAE,YAAY,CAAC,iBAAiB;YACpC,IAAI;YACJ,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,IAAS,EAAE,WAA+B;QAC5D,OAAO,eAAe,CAAC;YACrB,EAAE,EAAE,kBAAkB,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE;YACrD,IAAI,EAAE,YAAY,CAAC,cAAc;YACjC,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE;YACnD,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;CACF,CAAC","sourcesContent":["// Worker Thread Manager - Offload CPU-intensive operations\nimport { Worker } from 'worker_threads';\nimport { createFrameworkLogger } from '../logger/index.js';\nimport { cpus } from 'os';\nimport { isPackageAvailable } from '../utilities/package-utils.js';\n// WORKER_ENTRY resolves to worker.js, this file's compiled sibling in dist/**,\n// via import.meta in ./worker-entry.js. That ESM-only syntax is isolated in its\n// own module (mapped to a stub in jest.config) so importing WorkerManager under\n// ts-jest's CommonJS transform never hits a load-time import.meta SyntaxError.\nimport { WORKER_ENTRY } from './worker-entry.js';\n\n// Optional JWT import\nconst jwtAvailable = isPackageAvailable('jsonwebtoken');\n\nconst logger = createFrameworkLogger('WorkerManager');\n\n// Upper bound on the exponential restart backoff\nconst MAX_RESTART_BACKOFF_MS = 5000;\n\n// Hoisted constants — avoids object allocation inside sort comparator on every call\nconst PRIORITY_ORDER: Record<string, number> = { high: 3, normal: 2, low: 1 };\n\n// Simple counter for task IDs — avoids expensive crypto.randomBytes for non-security IDs\nlet taskIdCounter = 0;\n\n/**\n * Worker task definitions\n */\nexport interface WorkerTask {\n id: string;\n type: string;\n data: any;\n priority?: 'low' | 'normal' | 'high';\n timeout?: number;\n}\n\n/**\n * Worker result\n */\nexport interface WorkerResult {\n taskId: string;\n success: boolean;\n data?: any;\n error?: string;\n executionTime: number;\n}\n\n/**\n * Active task tracking\n */\ninterface ActiveTask {\n resolve: CallableFunction;\n reject: CallableFunction;\n timeout: NodeJS.Timeout | null;\n // The worker a task was dispatched to (set once it leaves the queue). Used so a\n // crashed worker only rejects its own in-flight tasks, not everyone else's.\n assignedWorker?: Worker;\n}\n\n/**\n * Built-in worker tasks\n */\nexport const WORKER_TASKS = {\n JWT_VERIFY: 'jwt:verify',\n JWT_SIGN: 'jwt:sign',\n CRYPTO_HASH: 'crypto:hash',\n CRYPTO_ENCRYPT: 'crypto:encrypt',\n CRYPTO_DECRYPT: 'crypto:decrypt',\n DATA_COMPRESS: 'data:compress',\n DATA_DECOMPRESS: 'data:decompress',\n IMAGE_PROCESS: 'image:process',\n HEAVY_COMPUTATION: 'computation:heavy',\n JSON_TRANSFORM: 'json:transform',\n} as const;\n\n/**\n * Worker Thread Manager\n * Manages a pool of worker threads for CPU-intensive operations\n */\nexport class WorkerManager {\n private workers: Map<number, Worker> = new Map();\n private taskQueue: WorkerTask[] = [];\n private activeTasks: Map<string, ActiveTask> = new Map();\n private workerCount: number;\n private maxQueueSize: number;\n private isShuttingDown = false;\n private maxRestartAttempts: number;\n private restartBackoffMs: number;\n private restartAttempts = 0;\n private restartTimers = new Set<NodeJS.Timeout>();\n private handledFailures = new WeakSet<Worker>();\n private poolFailed = false;\n\n constructor(\n options: {\n workerCount?: number;\n maxQueueSize?: number;\n maxRestartAttempts?: number;\n restartBackoffMs?: number;\n } = {}\n ) {\n this.workerCount = options.workerCount || Math.max(1, cpus().length - 1); // Leave 1 core for main thread\n this.maxQueueSize = options.maxQueueSize || 1000;\n this.maxRestartAttempts = options.maxRestartAttempts ?? 10;\n this.restartBackoffMs = options.restartBackoffMs ?? 100;\n\n this.initializeWorkers();\n }\n\n /**\n * Initialize worker threads\n */\n private initializeWorkers(): void {\n for (let i = 0; i < this.workerCount; i++) {\n this.createWorker();\n }\n\n logger.info(`Initialized ${this.workerCount} worker threads`, 'WorkerInit', {\n totalWorkers: this.workerCount,\n maxQueueSize: this.maxQueueSize,\n });\n }\n\n /**\n * Create a single worker thread\n */\n private createWorker(): void {\n if (this.isShuttingDown || this.poolFailed) {\n return;\n }\n\n let worker: Worker;\n try {\n worker = new Worker(WORKER_ENTRY, {\n workerData: { type: 'worker' },\n });\n } catch (error) {\n // Spawning can fail synchronously (e.g. a missing entry file). Treat it the\n // same as a runtime failure so we back off instead of throwing.\n logger.error('Failed to spawn worker thread', 'WorkerSpawn', {\n error: error instanceof Error ? error.message : String(error),\n });\n this.scheduleRestart();\n return;\n }\n\n worker.on('message', (result: WorkerResult) => {\n // A successful message proves the pool is healthy; reset the restart budget.\n this.restartAttempts = 0;\n this.handleWorkerResult(result);\n });\n\n worker.on('error', error => {\n logger.error('Worker thread error', 'WorkerError', { error: error.message });\n this.handleWorkerFailure(worker);\n });\n\n worker.on('exit', code => {\n if (code !== 0 && !this.isShuttingDown) {\n logger.warn(`Worker exited with code ${code}, restarting`, 'WorkerExit');\n this.handleWorkerFailure(worker);\n }\n });\n\n this.workers.set(worker.threadId, worker);\n logger.debug(`Created worker thread ${worker.threadId}`, 'WorkerCreate');\n }\n\n /**\n * Handle a crashed worker: reject only the tasks that were assigned to it and\n * schedule a backed-off restart. A failed worker emits both 'error' and 'exit',\n * so this is guarded to run at most once per worker.\n */\n private handleWorkerFailure(worker: Worker): void {\n if (this.handledFailures.has(worker)) {\n return;\n }\n this.handledFailures.add(worker);\n\n this.workers.delete(worker.threadId);\n\n if (this.isShuttingDown) {\n return;\n }\n\n // Reject only the tasks that were dispatched to this specific worker. Tasks\n // still queued (or running on other workers) are intentionally left alone.\n for (const [taskId, taskInfo] of this.activeTasks.entries()) {\n if (taskInfo.assignedWorker === worker) {\n if (taskInfo.timeout) {\n clearTimeout(taskInfo.timeout);\n }\n taskInfo.reject(new Error('Worker thread failed'));\n this.activeTasks.delete(taskId);\n }\n }\n\n this.scheduleRestart();\n }\n\n /**\n * Schedule a replacement worker with exponential backoff, capping the number of\n * consecutive restart attempts so a persistently broken worker entry can never\n * spin into an unbounded restart loop.\n */\n private scheduleRestart(): void {\n if (this.isShuttingDown || this.poolFailed) {\n return;\n }\n\n this.restartAttempts++;\n\n if (this.restartAttempts > this.maxRestartAttempts) {\n this.failPool();\n return;\n }\n\n const delay = Math.min(\n this.restartBackoffMs * 2 ** (this.restartAttempts - 1),\n MAX_RESTART_BACKOFF_MS\n );\n\n logger.warn(\n `Scheduling worker restart in ${delay}ms (attempt ${this.restartAttempts}/${this.maxRestartAttempts})`,\n 'WorkerRestart'\n );\n\n const timer = setTimeout(() => {\n this.restartTimers.delete(timer);\n this.createWorker();\n }, delay);\n\n // Don't keep the process alive purely for a pending restart\n timer.unref();\n this.restartTimers.add(timer);\n }\n\n /**\n * Give up after too many failed restarts: fail every outstanding task cleanly\n * (rejecting their promises) instead of looping forever.\n */\n private failPool(): void {\n if (this.poolFailed) {\n return;\n }\n this.poolFailed = true;\n\n logger.error(\n `Worker pool failed to recover after ${this.maxRestartAttempts} restart attempts`,\n 'WorkerPoolFailed'\n );\n\n const error = new Error(\n `Worker pool is unavailable after ${this.maxRestartAttempts} failed restart attempts`\n );\n\n // Every queued task also has an activeTasks entry, so this rejects both\n // in-flight and queued work.\n for (const [taskId, taskInfo] of this.activeTasks.entries()) {\n if (taskInfo.timeout) {\n clearTimeout(taskInfo.timeout);\n }\n taskInfo.reject(error);\n this.activeTasks.delete(taskId);\n }\n\n this.taskQueue.length = 0;\n }\n\n /**\n * Execute a task on a worker thread\n */\n async executeTask<T = any>(task: WorkerTask): Promise<T> {\n if (this.isShuttingDown) {\n throw new Error('Worker manager is shutting down');\n }\n\n if (this.poolFailed) {\n throw new Error('Worker pool is unavailable (too many worker failures)');\n }\n\n return new Promise<T>((resolve, reject) => {\n // Check queue size limit\n if (this.taskQueue.length >= this.maxQueueSize) {\n reject(new Error('Worker queue is full'));\n return;\n }\n\n // Add to queue\n this.taskQueue.push(task);\n\n // Set up promise handlers\n const timeout = task.timeout\n ? setTimeout(() => {\n this.activeTasks.delete(task.id);\n reject(new Error(`Task ${task.id} timed out`));\n }, task.timeout)\n : null;\n\n // Don't keep process alive for worker timeouts\n if (timeout) {\n timeout.unref();\n }\n\n this.activeTasks.set(task.id, { resolve, reject, timeout });\n\n // Try to assign task to available worker\n this.processQueue();\n });\n }\n\n /**\n * Process the task queue\n */\n private processQueue(): void {\n // Sort queue by priority (high first)\n this.taskQueue.sort(\n (a, b) =>\n (PRIORITY_ORDER[b.priority || 'normal'] ?? 0) -\n (PRIORITY_ORDER[a.priority || 'normal'] ?? 0)\n );\n\n // Assign tasks to available workers\n for (const [threadId, worker] of this.workers.entries()) {\n if (this.taskQueue.length === 0) break;\n\n // Check if worker is available (not currently processing)\n // For simplicity, we'll send tasks and let workers handle queuing\n const task = this.taskQueue.shift();\n if (task) {\n // Record the assignment so a crashed worker only rejects its own tasks.\n const taskInfo = this.activeTasks.get(task.id);\n if (taskInfo) {\n taskInfo.assignedWorker = worker;\n }\n worker.postMessage(task);\n logger.debug(`Assigned task ${task.id} to worker ${threadId}`, 'TaskAssigned');\n }\n }\n }\n\n /**\n * Handle result from worker thread\n */\n private handleWorkerResult(result: WorkerResult): void {\n const taskInfo = this.activeTasks.get(result.taskId);\n if (!taskInfo) {\n logger.warn(`Received result for unknown task ${result.taskId}`, 'UnknownTaskResult');\n return;\n }\n\n // Clear timeout\n if (taskInfo.timeout) {\n clearTimeout(taskInfo.timeout);\n }\n\n // Remove from active tasks\n this.activeTasks.delete(result.taskId);\n\n // Handle result\n if (result.success) {\n logger.debug(`Task ${result.taskId} completed in ${result.executionTime}ms`, 'TaskCompleted');\n taskInfo.resolve(result.data);\n } else {\n logger.error(`Task ${result.taskId} failed: ${result.error}`, 'TaskFailed');\n taskInfo.reject(new Error(result.error || 'Task failed'));\n }\n\n // Process next task in queue\n this.processQueue();\n }\n\n /**\n * Shutdown all workers\n */\n async shutdown(): Promise<void> {\n this.isShuttingDown = true;\n\n // Cancel any pending worker restarts\n for (const timer of this.restartTimers) {\n clearTimeout(timer);\n }\n this.restartTimers.clear();\n\n // Reject all pending tasks\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [taskId, taskInfo] of this.activeTasks.entries()) {\n if (taskInfo.timeout) {\n clearTimeout(taskInfo.timeout);\n }\n taskInfo.reject(new Error('Worker manager shutting down'));\n }\n\n // Terminate all workers\n const shutdownPromises = Array.from(this.workers.values()).map(\n worker =>\n new Promise<void>(resolve => {\n worker.once('exit', () => resolve());\n void worker.terminate();\n })\n );\n\n await Promise.all(shutdownPromises);\n this.workers.clear();\n this.activeTasks.clear();\n this.taskQueue.length = 0;\n\n logger.info('Worker manager shutdown complete', 'WorkerShutdown');\n }\n\n /**\n * Get worker statistics\n */\n getStats() {\n return {\n workerCount: this.workers.size,\n activeTasks: this.activeTasks.size,\n queuedTasks: this.taskQueue.length,\n isShuttingDown: this.isShuttingDown,\n };\n }\n}\n\n// Singleton instance\nlet workerManagerInstance: WorkerManager | null = null;\n\n/**\n * Get or create the worker manager instance\n */\nexport function getWorkerManager(options?: {\n workerCount?: number;\n maxQueueSize?: number;\n}): WorkerManager {\n if (!workerManagerInstance) {\n workerManagerInstance = new WorkerManager(options);\n }\n return workerManagerInstance;\n}\n\n/**\n * Execute task on worker thread (convenience function)\n */\nexport async function executeOnWorker<T = any>(task: WorkerTask): Promise<T> {\n const manager = getWorkerManager();\n return manager.executeTask<T>(task);\n}\n\n/**\n * Built-in task helpers\n */\nexport const workerTasks = {\n /**\n * JWT verification (CPU-intensive)\n */\n async verifyJWT(token: string, secret: string, options?: any): Promise<any> {\n if (!jwtAvailable) {\n throw new Error(\n 'JWT verification requires the \"jsonwebtoken\" package. Please install it with: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n return executeOnWorker({\n id: `jwt-verify-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.JWT_VERIFY,\n data: { token, secret, options },\n priority: 'high',\n timeout: 5000,\n });\n },\n\n /**\n * JWT signing (CPU-intensive)\n */\n async signJWT(payload: any, secret: string, options?: any): Promise<string> {\n if (!jwtAvailable) {\n throw new Error(\n 'JWT signing requires the \"jsonwebtoken\" package. Please install it with: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n return executeOnWorker({\n id: `jwt-sign-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.JWT_SIGN,\n data: { payload, secret, options },\n priority: 'high',\n timeout: 5000,\n });\n },\n\n /**\n * Crypto hash (CPU-intensive)\n */\n async hash(data: string, algorithm = 'sha256'): Promise<string> {\n return executeOnWorker({\n id: `crypto-hash-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.CRYPTO_HASH,\n data: { data, algorithm },\n priority: 'normal',\n timeout: 10000,\n });\n },\n\n /**\n * Data compression (CPU-intensive for large payloads)\n */\n async compress(\n data: string | Buffer | Uint8Array,\n options?: { format?: 'gzip' | 'deflate' | 'brotli' }\n ): Promise<Buffer> {\n const result = await executeOnWorker<Uint8Array>({\n id: `data-compress-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.DATA_COMPRESS,\n data: { input: data, format: options?.format ?? 'gzip' },\n priority: 'normal',\n timeout: 30000,\n });\n // Buffers cross the thread boundary as plain Uint8Array\n return Buffer.isBuffer(result) ? result : Buffer.from(result);\n },\n\n /**\n * Data decompression (CPU-intensive for large payloads)\n */\n async decompress(\n data: Buffer | Uint8Array,\n options?: { format?: 'gzip' | 'deflate' | 'brotli' }\n ): Promise<Buffer> {\n const result = await executeOnWorker<Uint8Array>({\n id: `data-decompress-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.DATA_DECOMPRESS,\n data: { input: data, format: options?.format ?? 'gzip' },\n priority: 'normal',\n timeout: 30000,\n });\n return Buffer.isBuffer(result) ? result : Buffer.from(result);\n },\n\n /**\n * Heavy computation example\n */\n async heavyComputation(data: any): Promise<any> {\n return executeOnWorker({\n id: `computation-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.HEAVY_COMPUTATION,\n data,\n priority: 'normal',\n timeout: 30000,\n });\n },\n\n /**\n * JSON transformation (can be CPU-intensive for large objects)\n */\n async transformJSON(data: any, transformer: (data: any) => any): Promise<any> {\n return executeOnWorker({\n id: `json-transform-${Date.now()}-${++taskIdCounter}`,\n type: WORKER_TASKS.JSON_TRANSFORM,\n data: { data, transformer: transformer.toString() },\n priority: 'normal',\n timeout: 15000,\n });\n },\n};\n"]}
@@ -1 +1,17 @@
1
- export {};
1
+ export type CompressionFormat = 'gzip' | 'deflate' | 'brotli';
2
+ /**
3
+ * Data compression handler
4
+ * Exported for direct unit testing; normally invoked via the worker task registry.
5
+ */
6
+ export declare function handleDataCompress(data: {
7
+ input: string | Buffer | Uint8Array;
8
+ format?: CompressionFormat;
9
+ }): Promise<Buffer>;
10
+ /**
11
+ * Data decompression handler
12
+ * Exported for direct unit testing; normally invoked via the worker task registry.
13
+ */
14
+ export declare function handleDataDecompress(data: {
15
+ input: Buffer | Uint8Array;
16
+ format?: CompressionFormat;
17
+ }): Promise<Buffer>;
@@ -14,6 +14,10 @@ let jwt = null;
14
14
  const jwtAvailable = isPackageAvailable('jsonwebtoken');
15
15
  const gzip = promisify(zlib.gzip);
16
16
  const gunzip = promisify(zlib.gunzip);
17
+ const deflate = promisify(zlib.deflate);
18
+ const inflate = promisify(zlib.inflate);
19
+ const brotliCompress = promisify(zlib.brotliCompress);
20
+ const brotliDecompress = promisify(zlib.brotliDecompress);
17
21
  // Import task types
18
22
  import { WORKER_TASKS } from './worker-manager.js';
19
23
  /**
@@ -165,40 +169,38 @@ async function handleCryptoDecrypt(data) {
165
169
  }
166
170
  /**
167
171
  * Data compression handler
172
+ * Exported for direct unit testing; normally invoked via the worker task registry.
168
173
  */
169
- async function handleDataCompress(data) {
174
+ export async function handleDataCompress(data) {
170
175
  const { input, format = 'gzip' } = data;
171
- if (format === 'gzip') {
172
- return gzip(Buffer.from(input));
173
- }
174
- else {
175
- return new Promise((resolve, reject) => {
176
- zlib.deflate(Buffer.from(input), (error, result) => {
177
- if (error)
178
- reject(error);
179
- else
180
- resolve(result);
181
- });
182
- });
176
+ const buffer = Buffer.from(input);
177
+ switch (format) {
178
+ case 'gzip':
179
+ return gzip(buffer);
180
+ case 'deflate':
181
+ return deflate(buffer);
182
+ case 'brotli':
183
+ return brotliCompress(buffer);
184
+ default:
185
+ throw new Error(`Unknown compression format: ${format}`);
183
186
  }
184
187
  }
185
188
  /**
186
189
  * Data decompression handler
190
+ * Exported for direct unit testing; normally invoked via the worker task registry.
187
191
  */
188
- async function handleDataDecompress(data) {
192
+ export async function handleDataDecompress(data) {
189
193
  const { input, format = 'gzip' } = data;
190
- if (format === 'gzip') {
191
- return gunzip(input);
192
- }
193
- else {
194
- return new Promise((resolve, reject) => {
195
- zlib.inflate(input, (error, result) => {
196
- if (error)
197
- reject(error);
198
- else
199
- resolve(result);
200
- });
201
- });
194
+ const buffer = Buffer.from(input);
195
+ switch (format) {
196
+ case 'gzip':
197
+ return gunzip(buffer);
198
+ case 'deflate':
199
+ return inflate(buffer);
200
+ case 'brotli':
201
+ return brotliDecompress(buffer);
202
+ default:
203
+ throw new Error(`Unknown compression format: ${format}`);
202
204
  }
203
205
  }
204
206
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/core/workers/worker.ts"],"names":[],"mappings":"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","sourcesContent":["// Worker Thread Implementation\n// Runs in worker threads to execute CPU-intensive operations\n\nimport { parentPort } from 'worker_threads';\nimport * as crypto from 'crypto';\nimport * as zlib from 'zlib';\nimport { promisify } from 'util';\nimport { resolveUserPackage, isPackageAvailable } from '../utilities/package-utils.js';\n\n// Optional isolated-vm for true V8 isolate sandboxing of JSON transforms\nlet isolatedVM: any = null;\nconst isolatedVMAvailable = isPackageAvailable('isolated-vm');\nlet jsonTransformWarningShown = false;\n\n// Optional JWT import (may not be available)\nlet jwt: any = null;\nconst jwtAvailable = isPackageAvailable('jsonwebtoken');\n\nconst gzip = promisify(zlib.gzip);\nconst gunzip = promisify(zlib.gunzip);\n\n// Import task types\nimport { WorkerTask, WorkerResult, WORKER_TASKS } from './worker-manager.js';\n\n/**\n * Execute a worker task\n */\nasync function executeTask(task: WorkerTask): Promise<WorkerResult> {\n const startTime = Date.now();\n\n try {\n let result: any;\n\n switch (task.type) {\n case WORKER_TASKS.JWT_VERIFY:\n result = await handleJWTVerify(task.data);\n break;\n\n case WORKER_TASKS.JWT_SIGN:\n result = await handleJWTSign(task.data);\n break;\n\n case WORKER_TASKS.CRYPTO_HASH:\n result = await handleCryptoHash(task.data);\n break;\n\n case WORKER_TASKS.CRYPTO_ENCRYPT:\n result = await handleCryptoEncrypt(task.data);\n break;\n\n case WORKER_TASKS.CRYPTO_DECRYPT:\n result = await handleCryptoDecrypt(task.data);\n break;\n\n case WORKER_TASKS.DATA_COMPRESS:\n result = await handleDataCompress(task.data);\n break;\n\n case WORKER_TASKS.DATA_DECOMPRESS:\n result = await handleDataDecompress(task.data);\n break;\n\n case WORKER_TASKS.HEAVY_COMPUTATION:\n result = await handleHeavyComputation(task.data);\n break;\n\n case WORKER_TASKS.JSON_TRANSFORM:\n result = await handleJSONTransform(task.data);\n break;\n\n default:\n throw new Error(`Unknown task type: ${task.type}`);\n }\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n executionTime: Date.now() - startTime,\n };\n }\n}\n\n/**\n * JWT verification handler\n */\nasync function handleJWTVerify(data: {\n token: string;\n secret: string;\n options?: any;\n}): Promise<any> {\n if (!jwtAvailable) {\n throw new Error(\n 'JWT verification requires the \"jsonwebtoken\" package. Please install it with: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n\n // Lazy load JWT if needed\n if (!jwt) {\n const jwtPath = resolveUserPackage('jsonwebtoken');\n jwt = await import(jwtPath);\n }\n\n const { token, secret, options } = data;\n return jwt.verify(token, secret, options);\n}\n\n/**\n * JWT signing handler\n */\nasync function handleJWTSign(data: {\n payload: any;\n secret: string;\n options?: any;\n}): Promise<string> {\n if (!jwtAvailable) {\n throw new Error(\n 'JWT signing requires the \"jsonwebtoken\" package. Please install it with: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n\n // Lazy load JWT if needed\n if (!jwt) {\n const jwtPath = resolveUserPackage('jsonwebtoken');\n jwt = await import(jwtPath);\n }\n\n const { payload, secret, options } = data;\n return jwt.sign(payload, secret, options);\n}\n\n/**\n * Crypto hash handler\n */\nasync function handleCryptoHash(data: { data: string; algorithm?: string }): Promise<string> {\n const { data: inputData, algorithm = 'sha256' } = data;\n return crypto.createHash(algorithm).update(inputData).digest('hex');\n}\n\n/**\n * Crypto encryption handler\n * When no IV is provided, auto-generates a random 16-byte IV and prepends it to the output.\n */\nasync function handleCryptoEncrypt(data: {\n data: string;\n algorithm?: string;\n key: string;\n iv?: string;\n}): Promise<string> {\n const { data: inputData, algorithm = 'aes-256-cbc', key, iv } = data;\n\n let effectiveIv: Buffer;\n let prependIv = false;\n\n if (iv) {\n effectiveIv = Buffer.from(iv, 'hex');\n } else {\n // Auto-generate random IV for security — prepend to output for extraction during decryption\n effectiveIv = crypto.randomBytes(16);\n prependIv = true;\n }\n\n const cipher = crypto.createCipheriv(algorithm, key, effectiveIv);\n let encrypted = cipher.update(inputData, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n // Prepend IV to ciphertext so decryption can extract it\n if (prependIv) {\n return effectiveIv.toString('hex') + ':' + encrypted;\n }\n return encrypted;\n}\n\n/**\n * Crypto decryption handler\n * Supports both formats:\n * - New format: \"iv_hex:ciphertext_hex\" (IV prepended, separated by colon)\n * - Legacy format: raw ciphertext_hex (falls back to zero IV for backward compatibility)\n */\nasync function handleCryptoDecrypt(data: {\n data: string;\n algorithm?: string;\n key: string;\n iv?: string;\n}): Promise<string> {\n const { data: encryptedData, algorithm = 'aes-256-cbc', key, iv } = data;\n\n let effectiveIv: Buffer;\n let ciphertext: string;\n\n if (iv) {\n // Explicit IV provided\n effectiveIv = Buffer.from(iv, 'hex');\n ciphertext = encryptedData;\n } else if (encryptedData.includes(':')) {\n // New format: extract prepended IV\n const colonIndex = encryptedData.indexOf(':');\n effectiveIv = Buffer.from(encryptedData.substring(0, colonIndex), 'hex');\n ciphertext = encryptedData.substring(colonIndex + 1);\n } else {\n // Legacy format: fall back to zero IV for backward compatibility\n effectiveIv = Buffer.alloc(16, 0);\n ciphertext = encryptedData;\n }\n\n const decipher = crypto.createDecipheriv(algorithm, key, effectiveIv);\n let decrypted = decipher.update(ciphertext, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n}\n\n/**\n * Data compression handler\n */\nasync function handleDataCompress(data: {\n input: string | Buffer;\n format?: 'gzip' | 'deflate';\n}): Promise<Buffer> {\n const { input, format = 'gzip' } = data;\n\n if (format === 'gzip') {\n return gzip(Buffer.from(input));\n } else {\n return new Promise((resolve, reject) => {\n zlib.deflate(Buffer.from(input), (error, result) => {\n if (error) reject(error);\n else resolve(result);\n });\n });\n }\n}\n\n/**\n * Data decompression handler\n */\nasync function handleDataDecompress(data: {\n input: Buffer;\n format?: 'gzip' | 'deflate';\n}): Promise<Buffer> {\n const { input, format = 'gzip' } = data;\n\n if (format === 'gzip') {\n return gunzip(input);\n } else {\n return new Promise((resolve, reject) => {\n zlib.inflate(input, (error, result) => {\n if (error) reject(error);\n else resolve(result);\n });\n });\n }\n}\n\n/**\n * Heavy computation handler\n */\nasync function handleHeavyComputation(data: any): Promise<any> {\n // This is a placeholder for heavy computation tasks\n // In real applications, this could be:\n // - Complex mathematical calculations\n // - Data processing pipelines\n // - Image processing\n // - Machine learning inference\n // - Large dataset transformations\n\n // Simulate heavy computation\n if (Array.isArray(data)) {\n // Simulate processing a large array\n const result = [];\n for (let i = 0; i < data.length; i++) {\n // Simulate CPU-intensive operation\n let sum = 0;\n for (let j = 0; j < 1000; j++) {\n sum += Math.sin(i) * Math.cos(j) + Math.sqrt(i + j);\n }\n result.push(sum);\n }\n return result;\n }\n\n if (typeof data === 'object' && data.iterations) {\n // Simulate configurable heavy computation\n let result = 0;\n for (let i = 0; i < (data.iterations || 1000000); i++) {\n result += Math.pow(Math.sin(i), 2) + Math.pow(Math.cos(i), 2);\n }\n return { result, iterations: data.iterations };\n }\n\n return data; // Echo back if not recognized\n}\n\n/**\n * Dangerous globals that must be shadowed to prevent access from transformer code.\n * Passed as explicit undefined parameters to new Function() so they shadow the real globals.\n *\n * IMPORTANT: Shadowing alone is NOT sufficient — attackers can bypass it via the prototype\n * chain (e.g., [].constructor.constructor('return process')()). The blocklist patterns\n * below are the primary defense; shadowing is defense-in-depth.\n */\nconst DANGEROUS_GLOBALS = [\n // Node.js core\n 'process',\n 'require',\n 'global',\n 'globalThis',\n 'Buffer',\n 'module',\n // Code execution\n 'eval',\n 'Function',\n // File/module paths\n '__dirname',\n '__filename',\n // Network/IO\n 'fetch',\n 'XMLHttpRequest',\n 'WebSocket',\n // Dynamic import\n 'import',\n // Timer functions (can accept string code like eval)\n 'setTimeout',\n 'setInterval',\n 'setImmediate',\n // Reflection/proxy (can be used to bypass restrictions)\n 'Proxy',\n 'Reflect',\n // Worker thread globals (this file runs in a worker)\n 'parentPort',\n 'workerData',\n // Advanced APIs\n 'WebAssembly',\n 'SharedArrayBuffer',\n];\n\n/**\n * Blocklist patterns that indicate potentially malicious transformer code.\n *\n * These are checked BEFORE execution and are the primary security layer.\n * The prototype chain bypass ([].constructor.constructor) is the #1 attack vector\n * against global shadowing, so we block access to prototype chain navigation.\n */\nconst DANGEROUS_IDENTIFIER_PATTERNS = DANGEROUS_GLOBALS.map(g => new RegExp(`\\\\b${g}\\\\b`));\n\n/**\n * Structural patterns that indicate prototype chain attacks or other bypass attempts.\n * These catch attacks like [].constructor.constructor('return process')().\n */\nconst DANGEROUS_STRUCTURAL_PATTERNS: Array<{ pattern: RegExp; description: string }> = [\n // Prototype chain navigation — the #1 bypass for global shadowing\n // [].constructor.constructor, ''.constructor, ({}).constructor, etc.\n { pattern: /\\.constructor\\b/, description: 'prototype chain access (.constructor)' },\n { pattern: /\\.__proto__\\b/, description: 'prototype chain access (__proto__)' },\n { pattern: /\\.prototype\\b/, description: 'prototype access (.prototype)' },\n // Object reflection methods that can navigate the prototype chain\n { pattern: /\\bgetPrototypeOf\\b/, description: 'prototype chain navigation (getPrototypeOf)' },\n { pattern: /\\bdefineProperty\\b/, description: 'property definition (defineProperty)' },\n { pattern: /\\bsetPrototypeOf\\b/, description: 'prototype mutation (setPrototypeOf)' },\n // Bracket notation with dangerous identifiers — catches obj['constructor'], obj[\"__proto__\"], etc.\n // Narrowly targeted: allows legitimate bracket access like data['first-name'] or ['a','b'] arrays\n {\n pattern:\n /\\[\\s*['\"`]\\s*(constructor|__proto__|prototype|process|require|global|globalThis|eval|Function|import|module|exports|parentPort|workerData)\\s*['\"`]\\s*\\]/,\n description: 'bracket notation access to blocked identifier',\n },\n // String concatenation tricks to reassemble blocked identifiers dynamically\n { pattern: /\\bString\\.fromCharCode\\b/, description: 'dynamic string construction' },\n // Async patterns that could be used for deferred execution\n { pattern: /\\bawait\\b/, description: 'async execution (await)' },\n { pattern: /\\bnew\\s+Promise\\b/, description: 'promise construction' },\n];\n\n/**\n * Validates that transformer code looks like a function expression (arrow or function keyword).\n * Rejects arbitrary statements, assignments to globals, etc.\n */\nfunction validateTransformerShape(code: string): void {\n const trimmed = code.trim();\n\n // Must look like a function expression: starts with ( for arrow/grouped, function keyword,\n // or a single identifier followed by => (arrow shorthand like \"data => data.x\")\n const isArrowShorthand = /^[a-zA-Z_$][a-zA-Z0-9_$]*\\s*=>/.test(trimmed);\n const isArrowParens = trimmed.startsWith('(');\n const isFunctionKeyword = trimmed.startsWith('function');\n\n if (!isArrowShorthand && !isArrowParens && !isFunctionKeyword) {\n throw new Error(\n 'Transformer must be a function expression (arrow function or function keyword)'\n );\n }\n}\n\n/**\n * Checks transformer code against blocklist of dangerous identifiers and structural patterns.\n *\n * Layer 1: Block known dangerous global identifiers (process, require, etc.)\n * Layer 2: Block prototype chain navigation (.constructor, __proto__, etc.)\n * Layer 3: Block bracket notation string access (obj['constructor'] bypass)\n */\nfunction checkDangerousPatterns(code: string): void {\n // Check dangerous global identifiers\n for (let i = 0; i < DANGEROUS_IDENTIFIER_PATTERNS.length; i++) {\n if (DANGEROUS_IDENTIFIER_PATTERNS[i]?.test(code)) {\n throw new Error(\n `Transformer code contains blocked identifier: \"${DANGEROUS_GLOBALS[i]}\". ` +\n 'Transformer functions must be pure data transforms without access to Node.js internals.'\n );\n }\n }\n\n // Check structural bypass patterns (prototype chain, bracket notation, etc.)\n for (const { pattern, description } of DANGEROUS_STRUCTURAL_PATTERNS) {\n if (pattern.test(code)) {\n throw new Error(\n `Transformer code contains blocked pattern: ${description}. ` +\n 'Transformer functions must be pure data transforms using only dot notation on the data parameter.'\n );\n }\n }\n}\n\n/**\n * Execute a transformer in a true V8 isolate sandbox using isolated-vm.\n * This is the secure path — complete memory and CPU isolation.\n *\n * The isolate has no access to Node.js APIs (process, require, fs, etc.)\n * and is limited to 128MB memory with a 10s execution timeout.\n *\n * @see https://www.npmjs.com/package/isolated-vm\n */\nasync function executeInIsolate(inputData: any, transformerCode: string): Promise<any> {\n if (!isolatedVM) {\n const ivmPath = resolveUserPackage('isolated-vm');\n isolatedVM = await import(ivmPath);\n // Handle both default and named exports\n if (isolatedVM.default) {\n isolatedVM = isolatedVM.default;\n }\n }\n\n const isolate = new isolatedVM.Isolate({ memoryLimit: 128 });\n try {\n const context = await isolate.createContext();\n const jail = context.global;\n\n // Copy input data into the isolate via ExternalCopy (deep copy, no shared references).\n // .copyInto() produces a transferable value that can be set on the isolate's global.\n await jail.set('__inputData', new isolatedVM.ExternalCopy(inputData).copyInto());\n\n // Compile the transformer script for execution in the isolate\n const script = await isolate.compileScript(`'use strict'; (${transformerCode})(__inputData);`);\n\n // Execute with timeout and copy the result back out of the isolate.\n // { copy: true } ensures complex objects (arrays, nested objects) are\n // deep-copied back — without it, only primitives transfer.\n const result = await script.run(context, { timeout: 10000, copy: true });\n\n return result;\n } finally {\n isolate.dispose();\n }\n}\n\n/**\n * Execute a transformer using the hardened new Function() path.\n * This is NOT a true sandbox — it is defense-in-depth hardening only.\n */\nfunction executeHardened(inputData: any, transformerCode: string): any {\n // Layer 1: Validate the code looks like a function expression\n validateTransformerShape(transformerCode);\n\n // Layer 2: Check for dangerous global identifiers and structural patterns\n checkDangerousPatterns(transformerCode);\n\n // Layer 3: Create function with dangerous globals explicitly shadowed as undefined\n const transformer = new Function(\n 'data',\n ...DANGEROUS_GLOBALS,\n `'use strict'; return (${transformerCode})(data);`\n );\n\n // Execute with all dangerous globals set to undefined\n return transformer(inputData, ...DANGEROUS_GLOBALS.map(() => undefined));\n}\n\n/**\n * JSON transformation handler.\n *\n * Security model (two paths):\n * 1. If `isolated-vm` is installed: uses a true V8 isolate with memory/CPU limits.\n * This is a real sandbox — the transformer cannot access Node.js APIs.\n * 2. Otherwise: uses a hardened new Function() with layered defenses (shape validation,\n * blocklist, global shadowing, strict mode). This blocks common attacks but is NOT\n * a true sandbox. Do not use this path with untrusted user-provided transformer code.\n *\n * To enable the secure path:\n * npm install isolated-vm\n */\nasync function handleJSONTransform(data: { data: any; transformer: string }): Promise<any> {\n const { data: inputData, transformer: transformerCode } = data;\n\n try {\n if (isolatedVMAvailable) {\n return await executeInIsolate(inputData, transformerCode);\n }\n\n // Hardened fallback — emit a one-time warning\n if (!jsonTransformWarningShown) {\n jsonTransformWarningShown = true;\n // eslint-disable-next-line no-console -- one-time security notice in worker thread\n console.warn(\n '[MoroJS Security] transformJSON is using the hardened fallback (new Function). ' +\n 'This is NOT a secure sandbox for untrusted code. If the transformer or data ' +\n 'originates from user input, install isolated-vm for true V8 isolate sandboxing:\\n' +\n ' npm install isolated-vm\\n' +\n 'See: https://www.npmjs.com/package/isolated-vm'\n );\n }\n\n return executeHardened(inputData, transformerCode);\n } catch (error) {\n throw new Error(\n `Invalid transformer function: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n// Worker thread message handling\nif (parentPort) {\n parentPort.on('message', (task: WorkerTask) => {\n void (async () => {\n const result = await executeTask(task);\n\n if (parentPort) {\n parentPort.postMessage(result);\n }\n })();\n });\n}\n"]}
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/core/workers/worker.ts"],"names":[],"mappings":"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","sourcesContent":["// Worker Thread Implementation\n// Runs in worker threads to execute CPU-intensive operations\n\nimport { parentPort } from 'worker_threads';\nimport * as crypto from 'crypto';\nimport * as zlib from 'zlib';\nimport { promisify } from 'util';\nimport { resolveUserPackage, isPackageAvailable } from '../utilities/package-utils.js';\n\n// Optional isolated-vm for true V8 isolate sandboxing of JSON transforms\nlet isolatedVM: any = null;\nconst isolatedVMAvailable = isPackageAvailable('isolated-vm');\nlet jsonTransformWarningShown = false;\n\n// Optional JWT import (may not be available)\nlet jwt: any = null;\nconst jwtAvailable = isPackageAvailable('jsonwebtoken');\n\nconst gzip = promisify(zlib.gzip);\nconst gunzip = promisify(zlib.gunzip);\nconst deflate = promisify(zlib.deflate);\nconst inflate = promisify(zlib.inflate);\nconst brotliCompress = promisify(zlib.brotliCompress);\nconst brotliDecompress = promisify(zlib.brotliDecompress);\n\n// Import task types\nimport { WorkerTask, WorkerResult, WORKER_TASKS } from './worker-manager.js';\n\n/**\n * Execute a worker task\n */\nasync function executeTask(task: WorkerTask): Promise<WorkerResult> {\n const startTime = Date.now();\n\n try {\n let result: any;\n\n switch (task.type) {\n case WORKER_TASKS.JWT_VERIFY:\n result = await handleJWTVerify(task.data);\n break;\n\n case WORKER_TASKS.JWT_SIGN:\n result = await handleJWTSign(task.data);\n break;\n\n case WORKER_TASKS.CRYPTO_HASH:\n result = await handleCryptoHash(task.data);\n break;\n\n case WORKER_TASKS.CRYPTO_ENCRYPT:\n result = await handleCryptoEncrypt(task.data);\n break;\n\n case WORKER_TASKS.CRYPTO_DECRYPT:\n result = await handleCryptoDecrypt(task.data);\n break;\n\n case WORKER_TASKS.DATA_COMPRESS:\n result = await handleDataCompress(task.data);\n break;\n\n case WORKER_TASKS.DATA_DECOMPRESS:\n result = await handleDataDecompress(task.data);\n break;\n\n case WORKER_TASKS.HEAVY_COMPUTATION:\n result = await handleHeavyComputation(task.data);\n break;\n\n case WORKER_TASKS.JSON_TRANSFORM:\n result = await handleJSONTransform(task.data);\n break;\n\n default:\n throw new Error(`Unknown task type: ${task.type}`);\n }\n\n return {\n taskId: task.id,\n success: true,\n data: result,\n executionTime: Date.now() - startTime,\n };\n } catch (error) {\n return {\n taskId: task.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n executionTime: Date.now() - startTime,\n };\n }\n}\n\n/**\n * JWT verification handler\n */\nasync function handleJWTVerify(data: {\n token: string;\n secret: string;\n options?: any;\n}): Promise<any> {\n if (!jwtAvailable) {\n throw new Error(\n 'JWT verification requires the \"jsonwebtoken\" package. Please install it with: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n\n // Lazy load JWT if needed\n if (!jwt) {\n const jwtPath = resolveUserPackage('jsonwebtoken');\n jwt = await import(jwtPath);\n }\n\n const { token, secret, options } = data;\n return jwt.verify(token, secret, options);\n}\n\n/**\n * JWT signing handler\n */\nasync function handleJWTSign(data: {\n payload: any;\n secret: string;\n options?: any;\n}): Promise<string> {\n if (!jwtAvailable) {\n throw new Error(\n 'JWT signing requires the \"jsonwebtoken\" package. Please install it with: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n\n // Lazy load JWT if needed\n if (!jwt) {\n const jwtPath = resolveUserPackage('jsonwebtoken');\n jwt = await import(jwtPath);\n }\n\n const { payload, secret, options } = data;\n return jwt.sign(payload, secret, options);\n}\n\n/**\n * Crypto hash handler\n */\nasync function handleCryptoHash(data: { data: string; algorithm?: string }): Promise<string> {\n const { data: inputData, algorithm = 'sha256' } = data;\n return crypto.createHash(algorithm).update(inputData).digest('hex');\n}\n\n/**\n * Crypto encryption handler\n * When no IV is provided, auto-generates a random 16-byte IV and prepends it to the output.\n */\nasync function handleCryptoEncrypt(data: {\n data: string;\n algorithm?: string;\n key: string;\n iv?: string;\n}): Promise<string> {\n const { data: inputData, algorithm = 'aes-256-cbc', key, iv } = data;\n\n let effectiveIv: Buffer;\n let prependIv = false;\n\n if (iv) {\n effectiveIv = Buffer.from(iv, 'hex');\n } else {\n // Auto-generate random IV for security — prepend to output for extraction during decryption\n effectiveIv = crypto.randomBytes(16);\n prependIv = true;\n }\n\n const cipher = crypto.createCipheriv(algorithm, key, effectiveIv);\n let encrypted = cipher.update(inputData, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n // Prepend IV to ciphertext so decryption can extract it\n if (prependIv) {\n return effectiveIv.toString('hex') + ':' + encrypted;\n }\n return encrypted;\n}\n\n/**\n * Crypto decryption handler\n * Supports both formats:\n * - New format: \"iv_hex:ciphertext_hex\" (IV prepended, separated by colon)\n * - Legacy format: raw ciphertext_hex (falls back to zero IV for backward compatibility)\n */\nasync function handleCryptoDecrypt(data: {\n data: string;\n algorithm?: string;\n key: string;\n iv?: string;\n}): Promise<string> {\n const { data: encryptedData, algorithm = 'aes-256-cbc', key, iv } = data;\n\n let effectiveIv: Buffer;\n let ciphertext: string;\n\n if (iv) {\n // Explicit IV provided\n effectiveIv = Buffer.from(iv, 'hex');\n ciphertext = encryptedData;\n } else if (encryptedData.includes(':')) {\n // New format: extract prepended IV\n const colonIndex = encryptedData.indexOf(':');\n effectiveIv = Buffer.from(encryptedData.substring(0, colonIndex), 'hex');\n ciphertext = encryptedData.substring(colonIndex + 1);\n } else {\n // Legacy format: fall back to zero IV for backward compatibility\n effectiveIv = Buffer.alloc(16, 0);\n ciphertext = encryptedData;\n }\n\n const decipher = crypto.createDecipheriv(algorithm, key, effectiveIv);\n let decrypted = decipher.update(ciphertext, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n}\n\nexport type CompressionFormat = 'gzip' | 'deflate' | 'brotli';\n\n/**\n * Data compression handler\n * Exported for direct unit testing; normally invoked via the worker task registry.\n */\nexport async function handleDataCompress(data: {\n input: string | Buffer | Uint8Array;\n format?: CompressionFormat;\n}): Promise<Buffer> {\n const { input, format = 'gzip' } = data;\n const buffer = Buffer.from(input as any);\n\n switch (format) {\n case 'gzip':\n return gzip(buffer);\n case 'deflate':\n return deflate(buffer);\n case 'brotli':\n return brotliCompress(buffer);\n default:\n throw new Error(`Unknown compression format: ${format}`);\n }\n}\n\n/**\n * Data decompression handler\n * Exported for direct unit testing; normally invoked via the worker task registry.\n */\nexport async function handleDataDecompress(data: {\n input: Buffer | Uint8Array;\n format?: CompressionFormat;\n}): Promise<Buffer> {\n const { input, format = 'gzip' } = data;\n const buffer = Buffer.from(input as any);\n\n switch (format) {\n case 'gzip':\n return gunzip(buffer);\n case 'deflate':\n return inflate(buffer);\n case 'brotli':\n return brotliDecompress(buffer);\n default:\n throw new Error(`Unknown compression format: ${format}`);\n }\n}\n\n/**\n * Heavy computation handler\n */\nasync function handleHeavyComputation(data: any): Promise<any> {\n // This is a placeholder for heavy computation tasks\n // In real applications, this could be:\n // - Complex mathematical calculations\n // - Data processing pipelines\n // - Image processing\n // - Machine learning inference\n // - Large dataset transformations\n\n // Simulate heavy computation\n if (Array.isArray(data)) {\n // Simulate processing a large array\n const result = [];\n for (let i = 0; i < data.length; i++) {\n // Simulate CPU-intensive operation\n let sum = 0;\n for (let j = 0; j < 1000; j++) {\n sum += Math.sin(i) * Math.cos(j) + Math.sqrt(i + j);\n }\n result.push(sum);\n }\n return result;\n }\n\n if (typeof data === 'object' && data.iterations) {\n // Simulate configurable heavy computation\n let result = 0;\n for (let i = 0; i < (data.iterations || 1000000); i++) {\n result += Math.pow(Math.sin(i), 2) + Math.pow(Math.cos(i), 2);\n }\n return { result, iterations: data.iterations };\n }\n\n return data; // Echo back if not recognized\n}\n\n/**\n * Dangerous globals that must be shadowed to prevent access from transformer code.\n * Passed as explicit undefined parameters to new Function() so they shadow the real globals.\n *\n * IMPORTANT: Shadowing alone is NOT sufficient — attackers can bypass it via the prototype\n * chain (e.g., [].constructor.constructor('return process')()). The blocklist patterns\n * below are the primary defense; shadowing is defense-in-depth.\n */\nconst DANGEROUS_GLOBALS = [\n // Node.js core\n 'process',\n 'require',\n 'global',\n 'globalThis',\n 'Buffer',\n 'module',\n // Code execution\n 'eval',\n 'Function',\n // File/module paths\n '__dirname',\n '__filename',\n // Network/IO\n 'fetch',\n 'XMLHttpRequest',\n 'WebSocket',\n // Dynamic import\n 'import',\n // Timer functions (can accept string code like eval)\n 'setTimeout',\n 'setInterval',\n 'setImmediate',\n // Reflection/proxy (can be used to bypass restrictions)\n 'Proxy',\n 'Reflect',\n // Worker thread globals (this file runs in a worker)\n 'parentPort',\n 'workerData',\n // Advanced APIs\n 'WebAssembly',\n 'SharedArrayBuffer',\n];\n\n/**\n * Blocklist patterns that indicate potentially malicious transformer code.\n *\n * These are checked BEFORE execution and are the primary security layer.\n * The prototype chain bypass ([].constructor.constructor) is the #1 attack vector\n * against global shadowing, so we block access to prototype chain navigation.\n */\nconst DANGEROUS_IDENTIFIER_PATTERNS = DANGEROUS_GLOBALS.map(g => new RegExp(`\\\\b${g}\\\\b`));\n\n/**\n * Structural patterns that indicate prototype chain attacks or other bypass attempts.\n * These catch attacks like [].constructor.constructor('return process')().\n */\nconst DANGEROUS_STRUCTURAL_PATTERNS: Array<{ pattern: RegExp; description: string }> = [\n // Prototype chain navigation — the #1 bypass for global shadowing\n // [].constructor.constructor, ''.constructor, ({}).constructor, etc.\n { pattern: /\\.constructor\\b/, description: 'prototype chain access (.constructor)' },\n { pattern: /\\.__proto__\\b/, description: 'prototype chain access (__proto__)' },\n { pattern: /\\.prototype\\b/, description: 'prototype access (.prototype)' },\n // Object reflection methods that can navigate the prototype chain\n { pattern: /\\bgetPrototypeOf\\b/, description: 'prototype chain navigation (getPrototypeOf)' },\n { pattern: /\\bdefineProperty\\b/, description: 'property definition (defineProperty)' },\n { pattern: /\\bsetPrototypeOf\\b/, description: 'prototype mutation (setPrototypeOf)' },\n // Bracket notation with dangerous identifiers — catches obj['constructor'], obj[\"__proto__\"], etc.\n // Narrowly targeted: allows legitimate bracket access like data['first-name'] or ['a','b'] arrays\n {\n pattern:\n /\\[\\s*['\"`]\\s*(constructor|__proto__|prototype|process|require|global|globalThis|eval|Function|import|module|exports|parentPort|workerData)\\s*['\"`]\\s*\\]/,\n description: 'bracket notation access to blocked identifier',\n },\n // String concatenation tricks to reassemble blocked identifiers dynamically\n { pattern: /\\bString\\.fromCharCode\\b/, description: 'dynamic string construction' },\n // Async patterns that could be used for deferred execution\n { pattern: /\\bawait\\b/, description: 'async execution (await)' },\n { pattern: /\\bnew\\s+Promise\\b/, description: 'promise construction' },\n];\n\n/**\n * Validates that transformer code looks like a function expression (arrow or function keyword).\n * Rejects arbitrary statements, assignments to globals, etc.\n */\nfunction validateTransformerShape(code: string): void {\n const trimmed = code.trim();\n\n // Must look like a function expression: starts with ( for arrow/grouped, function keyword,\n // or a single identifier followed by => (arrow shorthand like \"data => data.x\")\n const isArrowShorthand = /^[a-zA-Z_$][a-zA-Z0-9_$]*\\s*=>/.test(trimmed);\n const isArrowParens = trimmed.startsWith('(');\n const isFunctionKeyword = trimmed.startsWith('function');\n\n if (!isArrowShorthand && !isArrowParens && !isFunctionKeyword) {\n throw new Error(\n 'Transformer must be a function expression (arrow function or function keyword)'\n );\n }\n}\n\n/**\n * Checks transformer code against blocklist of dangerous identifiers and structural patterns.\n *\n * Layer 1: Block known dangerous global identifiers (process, require, etc.)\n * Layer 2: Block prototype chain navigation (.constructor, __proto__, etc.)\n * Layer 3: Block bracket notation string access (obj['constructor'] bypass)\n */\nfunction checkDangerousPatterns(code: string): void {\n // Check dangerous global identifiers\n for (let i = 0; i < DANGEROUS_IDENTIFIER_PATTERNS.length; i++) {\n if (DANGEROUS_IDENTIFIER_PATTERNS[i]?.test(code)) {\n throw new Error(\n `Transformer code contains blocked identifier: \"${DANGEROUS_GLOBALS[i]}\". ` +\n 'Transformer functions must be pure data transforms without access to Node.js internals.'\n );\n }\n }\n\n // Check structural bypass patterns (prototype chain, bracket notation, etc.)\n for (const { pattern, description } of DANGEROUS_STRUCTURAL_PATTERNS) {\n if (pattern.test(code)) {\n throw new Error(\n `Transformer code contains blocked pattern: ${description}. ` +\n 'Transformer functions must be pure data transforms using only dot notation on the data parameter.'\n );\n }\n }\n}\n\n/**\n * Execute a transformer in a true V8 isolate sandbox using isolated-vm.\n * This is the secure path — complete memory and CPU isolation.\n *\n * The isolate has no access to Node.js APIs (process, require, fs, etc.)\n * and is limited to 128MB memory with a 10s execution timeout.\n *\n * @see https://www.npmjs.com/package/isolated-vm\n */\nasync function executeInIsolate(inputData: any, transformerCode: string): Promise<any> {\n if (!isolatedVM) {\n const ivmPath = resolveUserPackage('isolated-vm');\n isolatedVM = await import(ivmPath);\n // Handle both default and named exports\n if (isolatedVM.default) {\n isolatedVM = isolatedVM.default;\n }\n }\n\n const isolate = new isolatedVM.Isolate({ memoryLimit: 128 });\n try {\n const context = await isolate.createContext();\n const jail = context.global;\n\n // Copy input data into the isolate via ExternalCopy (deep copy, no shared references).\n // .copyInto() produces a transferable value that can be set on the isolate's global.\n await jail.set('__inputData', new isolatedVM.ExternalCopy(inputData).copyInto());\n\n // Compile the transformer script for execution in the isolate\n const script = await isolate.compileScript(`'use strict'; (${transformerCode})(__inputData);`);\n\n // Execute with timeout and copy the result back out of the isolate.\n // { copy: true } ensures complex objects (arrays, nested objects) are\n // deep-copied back — without it, only primitives transfer.\n const result = await script.run(context, { timeout: 10000, copy: true });\n\n return result;\n } finally {\n isolate.dispose();\n }\n}\n\n/**\n * Execute a transformer using the hardened new Function() path.\n * This is NOT a true sandbox — it is defense-in-depth hardening only.\n */\nfunction executeHardened(inputData: any, transformerCode: string): any {\n // Layer 1: Validate the code looks like a function expression\n validateTransformerShape(transformerCode);\n\n // Layer 2: Check for dangerous global identifiers and structural patterns\n checkDangerousPatterns(transformerCode);\n\n // Layer 3: Create function with dangerous globals explicitly shadowed as undefined\n const transformer = new Function(\n 'data',\n ...DANGEROUS_GLOBALS,\n `'use strict'; return (${transformerCode})(data);`\n );\n\n // Execute with all dangerous globals set to undefined\n return transformer(inputData, ...DANGEROUS_GLOBALS.map(() => undefined));\n}\n\n/**\n * JSON transformation handler.\n *\n * Security model (two paths):\n * 1. If `isolated-vm` is installed: uses a true V8 isolate with memory/CPU limits.\n * This is a real sandbox — the transformer cannot access Node.js APIs.\n * 2. Otherwise: uses a hardened new Function() with layered defenses (shape validation,\n * blocklist, global shadowing, strict mode). This blocks common attacks but is NOT\n * a true sandbox. Do not use this path with untrusted user-provided transformer code.\n *\n * To enable the secure path:\n * npm install isolated-vm\n */\nasync function handleJSONTransform(data: { data: any; transformer: string }): Promise<any> {\n const { data: inputData, transformer: transformerCode } = data;\n\n try {\n if (isolatedVMAvailable) {\n return await executeInIsolate(inputData, transformerCode);\n }\n\n // Hardened fallback — emit a one-time warning\n if (!jsonTransformWarningShown) {\n jsonTransformWarningShown = true;\n // eslint-disable-next-line no-console -- one-time security notice in worker thread\n console.warn(\n '[MoroJS Security] transformJSON is using the hardened fallback (new Function). ' +\n 'This is NOT a secure sandbox for untrusted code. If the transformer or data ' +\n 'originates from user input, install isolated-vm for true V8 isolate sandboxing:\\n' +\n ' npm install isolated-vm\\n' +\n 'See: https://www.npmjs.com/package/isolated-vm'\n );\n }\n\n return executeHardened(inputData, transformerCode);\n } catch (error) {\n throw new Error(\n `Invalid transformer function: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n// Worker thread message handling\nif (parentPort) {\n parentPort.on('message', (task: WorkerTask) => {\n void (async () => {\n const result = await executeTask(task);\n\n if (parentPort) {\n parentPort.postMessage(result);\n }\n })();\n });\n}\n"]}