@cisco_open/linting-orchestrator 1.0.0-rc.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 (197) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/README.md +43 -0
  4. package/build/cli/api-client.d.ts +170 -0
  5. package/build/cli/api-client.d.ts.map +1 -0
  6. package/build/cli/api-client.js +284 -0
  7. package/build/cli/api-client.js.map +1 -0
  8. package/build/cli/commands/agents.d.ts +7 -0
  9. package/build/cli/commands/agents.d.ts.map +1 -0
  10. package/build/cli/commands/agents.js +694 -0
  11. package/build/cli/commands/agents.js.map +1 -0
  12. package/build/cli/commands/completion.d.ts +9 -0
  13. package/build/cli/commands/completion.d.ts.map +1 -0
  14. package/build/cli/commands/completion.js +177 -0
  15. package/build/cli/commands/completion.js.map +1 -0
  16. package/build/cli/commands/config.d.ts +10 -0
  17. package/build/cli/commands/config.d.ts.map +1 -0
  18. package/build/cli/commands/config.js +284 -0
  19. package/build/cli/commands/config.js.map +1 -0
  20. package/build/cli/commands/health.d.ts +11 -0
  21. package/build/cli/commands/health.d.ts.map +1 -0
  22. package/build/cli/commands/health.js +38 -0
  23. package/build/cli/commands/health.js.map +1 -0
  24. package/build/cli/commands/help.d.ts +6 -0
  25. package/build/cli/commands/help.d.ts.map +1 -0
  26. package/build/cli/commands/help.js +20 -0
  27. package/build/cli/commands/help.js.map +1 -0
  28. package/build/cli/commands/history.d.ts +11 -0
  29. package/build/cli/commands/history.d.ts.map +1 -0
  30. package/build/cli/commands/history.js +50 -0
  31. package/build/cli/commands/history.js.map +1 -0
  32. package/build/cli/commands/jobs.d.ts +12 -0
  33. package/build/cli/commands/jobs.d.ts.map +1 -0
  34. package/build/cli/commands/jobs.js +84 -0
  35. package/build/cli/commands/jobs.js.map +1 -0
  36. package/build/cli/commands/lint.d.ts +15 -0
  37. package/build/cli/commands/lint.d.ts.map +1 -0
  38. package/build/cli/commands/lint.js +384 -0
  39. package/build/cli/commands/lint.js.map +1 -0
  40. package/build/cli/commands/ps.d.ts +8 -0
  41. package/build/cli/commands/ps.d.ts.map +1 -0
  42. package/build/cli/commands/ps.js +74 -0
  43. package/build/cli/commands/ps.js.map +1 -0
  44. package/build/cli/commands/reproduce.d.ts +9 -0
  45. package/build/cli/commands/reproduce.d.ts.map +1 -0
  46. package/build/cli/commands/reproduce.js +31 -0
  47. package/build/cli/commands/reproduce.js.map +1 -0
  48. package/build/cli/commands/reset.d.ts +5 -0
  49. package/build/cli/commands/reset.d.ts.map +1 -0
  50. package/build/cli/commands/reset.js +13 -0
  51. package/build/cli/commands/reset.js.map +1 -0
  52. package/build/cli/commands/results.d.ts +13 -0
  53. package/build/cli/commands/results.d.ts.map +1 -0
  54. package/build/cli/commands/results.js +129 -0
  55. package/build/cli/commands/results.js.map +1 -0
  56. package/build/cli/commands/rulesets/check.d.ts +12 -0
  57. package/build/cli/commands/rulesets/check.d.ts.map +1 -0
  58. package/build/cli/commands/rulesets/check.js +226 -0
  59. package/build/cli/commands/rulesets/check.js.map +1 -0
  60. package/build/cli/commands/rulesets/index.d.ts +5 -0
  61. package/build/cli/commands/rulesets/index.d.ts.map +1 -0
  62. package/build/cli/commands/rulesets/index.js +6 -0
  63. package/build/cli/commands/rulesets/index.js.map +1 -0
  64. package/build/cli/commands/rulesets/view.d.ts +16 -0
  65. package/build/cli/commands/rulesets/view.d.ts.map +1 -0
  66. package/build/cli/commands/rulesets/view.js +100 -0
  67. package/build/cli/commands/rulesets/view.js.map +1 -0
  68. package/build/cli/commands/start.d.ts +16 -0
  69. package/build/cli/commands/start.d.ts.map +1 -0
  70. package/build/cli/commands/start.js +167 -0
  71. package/build/cli/commands/start.js.map +1 -0
  72. package/build/cli/commands/status.d.ts +9 -0
  73. package/build/cli/commands/status.d.ts.map +1 -0
  74. package/build/cli/commands/status.js +46 -0
  75. package/build/cli/commands/status.js.map +1 -0
  76. package/build/cli/commands/stop.d.ts +11 -0
  77. package/build/cli/commands/stop.d.ts.map +1 -0
  78. package/build/cli/commands/stop.js +78 -0
  79. package/build/cli/commands/stop.js.map +1 -0
  80. package/build/cli/config-manager.d.ts +134 -0
  81. package/build/cli/config-manager.d.ts.map +1 -0
  82. package/build/cli/config-manager.js +288 -0
  83. package/build/cli/config-manager.js.map +1 -0
  84. package/build/cli/formatters.d.ts +62 -0
  85. package/build/cli/formatters.d.ts.map +1 -0
  86. package/build/cli/formatters.js +715 -0
  87. package/build/cli/formatters.js.map +1 -0
  88. package/build/cli/history-manager.d.ts +97 -0
  89. package/build/cli/history-manager.d.ts.map +1 -0
  90. package/build/cli/history-manager.js +201 -0
  91. package/build/cli/history-manager.js.map +1 -0
  92. package/build/cli/index.d.ts +16 -0
  93. package/build/cli/index.d.ts.map +1 -0
  94. package/build/cli/index.js +335 -0
  95. package/build/cli/index.js.map +1 -0
  96. package/build/cli/list-rulesets.d.ts +15 -0
  97. package/build/cli/list-rulesets.d.ts.map +1 -0
  98. package/build/cli/list-rulesets.js +193 -0
  99. package/build/cli/list-rulesets.js.map +1 -0
  100. package/build/cli/utils/connection-error.d.ts +9 -0
  101. package/build/cli/utils/connection-error.d.ts.map +1 -0
  102. package/build/cli/utils/connection-error.js +30 -0
  103. package/build/cli/utils/connection-error.js.map +1 -0
  104. package/build/cli/utils/embedded-server.d.ts +21 -0
  105. package/build/cli/utils/embedded-server.d.ts.map +1 -0
  106. package/build/cli/utils/embedded-server.js +61 -0
  107. package/build/cli/utils/embedded-server.js.map +1 -0
  108. package/build/cli/utils/mode-validator.d.ts +13 -0
  109. package/build/cli/utils/mode-validator.d.ts.map +1 -0
  110. package/build/cli/utils/mode-validator.js +31 -0
  111. package/build/cli/utils/mode-validator.js.map +1 -0
  112. package/build/cli/utils/port-checker.d.ts +20 -0
  113. package/build/cli/utils/port-checker.d.ts.map +1 -0
  114. package/build/cli/utils/port-checker.js +49 -0
  115. package/build/cli/utils/port-checker.js.map +1 -0
  116. package/build/config.d.ts +57 -0
  117. package/build/config.d.ts.map +1 -0
  118. package/build/config.js +527 -0
  119. package/build/config.js.map +1 -0
  120. package/build/document-accessor.d.ts +79 -0
  121. package/build/document-accessor.d.ts.map +1 -0
  122. package/build/document-accessor.js +148 -0
  123. package/build/document-accessor.js.map +1 -0
  124. package/build/formatters/reproduce-markdown.d.ts +14 -0
  125. package/build/formatters/reproduce-markdown.d.ts.map +1 -0
  126. package/build/formatters/reproduce-markdown.js +182 -0
  127. package/build/formatters/reproduce-markdown.js.map +1 -0
  128. package/build/formatters/sarif-builder.d.ts +86 -0
  129. package/build/formatters/sarif-builder.d.ts.map +1 -0
  130. package/build/formatters/sarif-builder.js +276 -0
  131. package/build/formatters/sarif-builder.js.map +1 -0
  132. package/build/index.d.ts +3 -0
  133. package/build/index.d.ts.map +1 -0
  134. package/build/index.js +174 -0
  135. package/build/index.js.map +1 -0
  136. package/build/logger.d.ts +38 -0
  137. package/build/logger.d.ts.map +1 -0
  138. package/build/logger.js +105 -0
  139. package/build/logger.js.map +1 -0
  140. package/build/mock-server.d.ts +2 -0
  141. package/build/mock-server.d.ts.map +1 -0
  142. package/build/mock-server.js +290 -0
  143. package/build/mock-server.js.map +1 -0
  144. package/build/orchestrator.d.ts +149 -0
  145. package/build/orchestrator.d.ts.map +1 -0
  146. package/build/orchestrator.js +874 -0
  147. package/build/orchestrator.js.map +1 -0
  148. package/build/ruleset-loader.d.ts +79 -0
  149. package/build/ruleset-loader.d.ts.map +1 -0
  150. package/build/ruleset-loader.js +514 -0
  151. package/build/ruleset-loader.js.map +1 -0
  152. package/build/schemas.d.ts +2568 -0
  153. package/build/schemas.d.ts.map +1 -0
  154. package/build/schemas.js +674 -0
  155. package/build/schemas.js.map +1 -0
  156. package/build/server.d.ts +39 -0
  157. package/build/server.d.ts.map +1 -0
  158. package/build/server.js +834 -0
  159. package/build/server.js.map +1 -0
  160. package/build/storage/memory-storage.d.ts +190 -0
  161. package/build/storage/memory-storage.d.ts.map +1 -0
  162. package/build/storage/memory-storage.js +629 -0
  163. package/build/storage/memory-storage.js.map +1 -0
  164. package/build/storage/redis-storage.d.ts +134 -0
  165. package/build/storage/redis-storage.d.ts.map +1 -0
  166. package/build/storage/redis-storage.js +236 -0
  167. package/build/storage/redis-storage.js.map +1 -0
  168. package/build/storage/storage-adapter.d.ts +189 -0
  169. package/build/storage/storage-adapter.d.ts.map +1 -0
  170. package/build/storage/storage-adapter.js +36 -0
  171. package/build/storage/storage-adapter.js.map +1 -0
  172. package/build/types.d.ts +981 -0
  173. package/build/types.d.ts.map +1 -0
  174. package/build/types.js +5 -0
  175. package/build/types.js.map +1 -0
  176. package/build/utils/version.d.ts +40 -0
  177. package/build/utils/version.d.ts.map +1 -0
  178. package/build/utils/version.js +94 -0
  179. package/build/utils/version.js.map +1 -0
  180. package/build/validation.d.ts +95 -0
  181. package/build/validation.d.ts.map +1 -0
  182. package/build/validation.js +150 -0
  183. package/build/validation.js.map +1 -0
  184. package/build/worker-pool.d.ts +137 -0
  185. package/build/worker-pool.d.ts.map +1 -0
  186. package/build/worker-pool.js +549 -0
  187. package/build/worker-pool.js.map +1 -0
  188. package/build/worker.d.ts +2 -0
  189. package/build/worker.d.ts.map +1 -0
  190. package/build/worker.js +427 -0
  191. package/build/worker.js.map +1 -0
  192. package/package.json +110 -0
  193. package/rulesets/CHANGELOG.md +25 -0
  194. package/rulesets/config/rulesets.yaml +96 -0
  195. package/rulesets/sources/README.md +47 -0
  196. package/rulesets/sources/example/oas-recommended/v1.0.0/ruleset.yaml +6 -0
  197. package/rulesets/sources/example/oas-recommended/v2.0.0/ruleset.yaml +14 -0
@@ -0,0 +1,549 @@
1
+ // Copyright 2026 Cisco Systems, Inc. and its affiliates
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ /**
5
+ * Worker Pool Manager
6
+ *
7
+ * Manages a pool of worker threads for parallel OpenAPI document linting.
8
+ *
9
+ * Architecture:
10
+ * - Worker-per-ruleset: Each worker is dedicated to a specific ruleset
11
+ * - Document affinity: Routes tasks to workers that have the document cached
12
+ * - Dynamic scaling: Scales up/down based on queue depth and load
13
+ * - Health monitoring: Auto-restarts failed workers
14
+ *
15
+ * Workflow:
16
+ * 1. Initialize: Create min workers per ruleset
17
+ * 2. Execute: Route task to appropriate worker based on ruleset + document affinity
18
+ * 3. Scale: Add/remove workers based on load
19
+ * 4. Monitor: Health checks, restart failures
20
+ *
21
+ * @module worker-pool
22
+ */
23
+ import { Worker } from 'worker_threads';
24
+ import path from 'path';
25
+ import os from 'os';
26
+ import { fileURLToPath } from 'url';
27
+ const __filename = fileURLToPath(import.meta.url);
28
+ const __dirname = path.dirname(__filename);
29
+ // ============================================
30
+ // Worker Pool Manager
31
+ // ============================================
32
+ export class WorkerPoolManager {
33
+ config;
34
+ rulesetLoader;
35
+ documentStore;
36
+ resolverPath;
37
+ workers = new Map();
38
+ workersByRuleset = new Map(); // ruleset -> Set<workerId>
39
+ pendingTasks = new Map(); // taskId -> resolver
40
+ workerReadyCallbacks = []; // Bounded wait queue for tasks waiting on a free worker
41
+ initialized = false;
42
+ totalTasksExecuted = 0;
43
+ totalExecutionTime = 0;
44
+ scalingMonitorInterval = null;
45
+ constructor(config, rulesetLoader, documentStore, resolverPath) {
46
+ this.config = config;
47
+ this.rulesetLoader = rulesetLoader;
48
+ this.documentStore = documentStore;
49
+ this.resolverPath = resolverPath;
50
+ }
51
+ /**
52
+ * Initialize worker pool with minimum workers per ruleset
53
+ */
54
+ async initialize() {
55
+ if (this.initialized) {
56
+ throw new Error('Worker pool already initialized');
57
+ }
58
+ console.log('šŸ”§ Initializing Worker Pool...');
59
+ // Get all available rulesets
60
+ const rulesets = this.rulesetLoader.listRulesets();
61
+ if (rulesets.length === 0) {
62
+ throw new Error('No rulesets available - cannot initialize worker pool');
63
+ }
64
+ // Calculate optimal worker count
65
+ const cpuCount = os.cpus().length;
66
+ const maxWorkersTotal = Math.min(this.config.totalMaxWorkers, cpuCount * 2);
67
+ const minWorkersPerRuleset = Math.max(1, Math.floor(maxWorkersTotal / rulesets.length));
68
+ console.log(` CPU cores: ${cpuCount}`);
69
+ console.log(` Rulesets: ${rulesets.length}`);
70
+ console.log(` Workers per ruleset: ${minWorkersPerRuleset}`);
71
+ console.log(` Total max workers: ${maxWorkersTotal}`);
72
+ // Create minimum workers for each ruleset
73
+ const workerPromises = [];
74
+ const failedRulesets = [];
75
+ for (const ruleset of rulesets) {
76
+ const workersToCreate = Math.min(minWorkersPerRuleset, this.config.minWorkersPerRuleset);
77
+ for (let i = 0; i < workersToCreate; i++) {
78
+ workerPromises.push(this.createWorker(ruleset.name, ruleset.defaultVersion).catch(error => {
79
+ console.error(` āŒ Failed to create worker for ${ruleset.name}: ${error.message}`);
80
+ failedRulesets.push(ruleset.name);
81
+ }));
82
+ }
83
+ }
84
+ // Wait for all workers to initialize
85
+ await Promise.all(workerPromises);
86
+ if (this.workers.size === 0) {
87
+ throw new Error('Failed to initialize any workers - check ruleset configurations');
88
+ }
89
+ if (failedRulesets.length > 0) {
90
+ console.warn(` āš ļø Some rulesets failed to load: ${[...new Set(failedRulesets)].join(', ')}`);
91
+ }
92
+ this.initialized = true;
93
+ console.log(`āœ… Worker Pool initialized with ${this.workers.size} workers`);
94
+ this.logPoolStatus();
95
+ // Start dynamic scaling monitor
96
+ this.startScalingMonitor();
97
+ }
98
+ /**
99
+ * Execute task on appropriate worker
100
+ */
101
+ async executeTask(request) {
102
+ if (!this.initialized) {
103
+ throw new Error('Worker pool not initialized');
104
+ }
105
+ const { taskId, documentId, rulesetName, rulesetVersion, ruleOverrides, timeout } = request;
106
+ // Resolve ruleset version
107
+ const version = rulesetVersion || this.rulesetLoader.getMetadata(rulesetName).defaultVersion;
108
+ // Get document path (zero-copy architecture!)
109
+ const documentPath = await this.documentStore.getDocumentPath(documentId);
110
+ // Verify document exists
111
+ const exists = await this.documentStore.documentExists(documentId);
112
+ if (!exists) {
113
+ throw new Error(`Document not found: ${documentId}`);
114
+ }
115
+ // Find appropriate worker
116
+ const worker = await this.selectWorker(rulesetName, version, documentId);
117
+ if (!worker) {
118
+ throw new Error(`No available worker for ruleset: ${rulesetName}@${version}`);
119
+ }
120
+ // Execute task
121
+ return this.executeOnWorker(worker, {
122
+ taskId,
123
+ documentId,
124
+ documentPath,
125
+ ruleOverrides,
126
+ timeout: timeout || this.config.taskTimeout
127
+ });
128
+ }
129
+ /**
130
+ * Select best worker for task (document affinity routing)
131
+ */
132
+ async selectWorker(rulesetName, rulesetVersion, documentId) {
133
+ const rulesetKey = `${rulesetName}@${rulesetVersion}`;
134
+ const workerIds = this.workersByRuleset.get(rulesetKey);
135
+ if (!workerIds || workerIds.size === 0) {
136
+ // No workers for this ruleset - try to create one
137
+ await this.createWorker(rulesetName, rulesetVersion);
138
+ return this.selectWorker(rulesetName, rulesetVersion, documentId);
139
+ }
140
+ // Get candidate workers
141
+ const candidates = [];
142
+ for (const workerId of workerIds) {
143
+ const worker = this.workers.get(workerId);
144
+ if (worker && worker.status !== 'error' && worker.status !== 'terminated') {
145
+ candidates.push(worker);
146
+ }
147
+ }
148
+ if (candidates.length === 0) {
149
+ return null;
150
+ }
151
+ // Priority 1: Workers with cached document (document affinity)
152
+ const withDocument = candidates.filter(w => w.status === 'ready' && w.cachedDocumentId === documentId);
153
+ if (withDocument.length > 0) {
154
+ // Return least busy worker with document cached
155
+ return withDocument.reduce((best, current) => current.taskCount < best.taskCount ? current : best);
156
+ }
157
+ // Priority 2: Ready workers (no cache hit)
158
+ const readyWorkers = candidates.filter(w => w.status === 'ready');
159
+ if (readyWorkers.length > 0) {
160
+ // Return least busy ready worker
161
+ return readyWorkers.reduce((best, current) => current.taskCount < best.taskCount ? current : best);
162
+ }
163
+ // Priority 3: Wait for a busy worker to become ready (bounded wait)
164
+ const waitTimeout = this.config.workerWaitTimeout ?? 30000;
165
+ return new Promise((resolve) => {
166
+ const timer = setTimeout(() => {
167
+ // Remove from queue on timeout
168
+ const idx = this.workerReadyCallbacks.findIndex(cb => cb.resolve === resolve);
169
+ if (idx !== -1)
170
+ this.workerReadyCallbacks.splice(idx, 1);
171
+ resolve(null);
172
+ }, waitTimeout);
173
+ this.workerReadyCallbacks.push({
174
+ rulesetKey,
175
+ resolve,
176
+ timer
177
+ });
178
+ });
179
+ }
180
+ /**
181
+ * Execute task on specific worker
182
+ */
183
+ executeOnWorker(workerInfo, task) {
184
+ return new Promise((resolve, reject) => {
185
+ const { taskId, documentId, documentPath, ruleOverrides, timeout } = task;
186
+ // Mark worker as busy
187
+ workerInfo.status = 'busy';
188
+ workerInfo.currentTaskId = taskId;
189
+ // Set up result handler
190
+ const resultHandler = (msg) => {
191
+ if (msg.type === 'result' && msg.payload.taskId === taskId) {
192
+ // Clean up
193
+ workerInfo.worker.off('message', resultHandler);
194
+ this.pendingTasks.delete(taskId);
195
+ // Update worker status
196
+ workerInfo.status = 'ready';
197
+ workerInfo.currentTaskId = undefined;
198
+ workerInfo.taskCount++;
199
+ // Drain worker-ready queue: notify first waiter for this ruleset
200
+ this.notifyWorkerReady(workerInfo);
201
+ if (msg.payload.success) {
202
+ // Update metrics
203
+ this.totalTasksExecuted++;
204
+ this.totalExecutionTime += msg.payload.executionTime;
205
+ workerInfo.averageExecutionTime =
206
+ (workerInfo.averageExecutionTime * (workerInfo.taskCount - 1) + msg.payload.executionTime) /
207
+ workerInfo.taskCount;
208
+ // Update cache tracking
209
+ if (msg.payload.cacheHit) {
210
+ workerInfo.cachedDocumentId = documentId;
211
+ workerInfo.cachedAt = new Date();
212
+ }
213
+ resolve({
214
+ taskId,
215
+ success: true,
216
+ results: msg.payload.results,
217
+ executionTime: msg.payload.executionTime,
218
+ workerId: workerInfo.workerId,
219
+ cacheHit: msg.payload.cacheHit
220
+ });
221
+ }
222
+ else {
223
+ reject(new Error(msg.payload.error || 'Task execution failed'));
224
+ }
225
+ }
226
+ };
227
+ // Set up error handler
228
+ const errorHandler = (error) => {
229
+ workerInfo.worker.off('message', resultHandler);
230
+ workerInfo.worker.off('error', errorHandler);
231
+ this.pendingTasks.delete(taskId);
232
+ workerInfo.status = 'error';
233
+ workerInfo.currentTaskId = undefined;
234
+ reject(new Error(`Worker error: ${error.message}`));
235
+ // Try to restart worker
236
+ this.handleWorkerFailure(workerInfo);
237
+ };
238
+ // Set up timeout
239
+ const timer = setTimeout(() => {
240
+ workerInfo.worker.off('message', resultHandler);
241
+ workerInfo.worker.off('error', errorHandler);
242
+ this.pendingTasks.delete(taskId);
243
+ workerInfo.status = 'ready';
244
+ workerInfo.currentTaskId = undefined;
245
+ // Drain worker-ready queue on timeout (worker becomes available)
246
+ this.notifyWorkerReady(workerInfo);
247
+ const timeoutError = new Error(`Task timeout after ${timeout}ms`);
248
+ timeoutError.code = 'TIMEOUT';
249
+ reject(timeoutError);
250
+ }, timeout);
251
+ // Register handlers
252
+ workerInfo.worker.on('message', resultHandler);
253
+ workerInfo.worker.on('error', errorHandler);
254
+ this.pendingTasks.set(taskId, (result) => {
255
+ clearTimeout(timer);
256
+ resolve(result);
257
+ });
258
+ // Send execute message to worker
259
+ workerInfo.worker.postMessage({
260
+ type: 'execute',
261
+ payload: {
262
+ taskId,
263
+ documentId,
264
+ documentPath,
265
+ timeout,
266
+ ruleOverrides
267
+ }
268
+ });
269
+ });
270
+ }
271
+ /**
272
+ * Create new worker for ruleset
273
+ */
274
+ async createWorker(rulesetName, rulesetVersion) {
275
+ const workerId = `${rulesetName}-${rulesetVersion}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
276
+ const rulesetKey = `${rulesetName}@${rulesetVersion}`;
277
+ // Check total worker limit
278
+ if (this.workers.size >= this.config.totalMaxWorkers) {
279
+ throw new Error(`Worker pool at max capacity: ${this.config.totalMaxWorkers}`);
280
+ }
281
+ // Load ruleset to get path
282
+ const ruleset = await this.rulesetLoader.loadVersion(rulesetName, rulesetVersion);
283
+ const rulesetPath = ruleset.rulesetPath;
284
+ // Create worker thread
285
+ const workerScriptPath = path.join(__dirname, 'worker.js');
286
+ const worker = new Worker(workerScriptPath, {
287
+ workerData: {
288
+ workerId,
289
+ rulesetName,
290
+ rulesetVersion,
291
+ rulesetPath,
292
+ rulesetLoader: ruleset.loader ?? 'bundler',
293
+ resolverPath: this.resolverPath,
294
+ config: {
295
+ documentCache: this.config.documentCache,
296
+ taskTimeout: this.config.taskTimeout
297
+ }
298
+ }
299
+ });
300
+ // Create worker info
301
+ const workerInfo = {
302
+ workerId,
303
+ worker,
304
+ rulesetName,
305
+ rulesetVersion,
306
+ status: 'initializing',
307
+ taskCount: 0,
308
+ averageExecutionTime: 0,
309
+ lastHeartbeat: new Date(),
310
+ createdAt: new Date(),
311
+ restartCount: 0
312
+ };
313
+ // Wait for worker to become ready
314
+ await new Promise((resolve, reject) => {
315
+ const timeout = setTimeout(() => {
316
+ reject(new Error(`Worker ${workerId} initialization timeout`));
317
+ }, 30000); // 30s timeout
318
+ const messageHandler = (msg) => {
319
+ if (msg.type === 'ready') {
320
+ clearTimeout(timeout);
321
+ worker.off('message', messageHandler);
322
+ worker.off('error', errorHandler);
323
+ workerInfo.status = 'ready';
324
+ resolve();
325
+ }
326
+ else if (msg.type === 'error') {
327
+ clearTimeout(timeout);
328
+ worker.off('message', messageHandler);
329
+ worker.off('error', errorHandler);
330
+ reject(new Error(msg.payload.error || 'Worker initialization failed'));
331
+ }
332
+ };
333
+ const errorHandler = (error) => {
334
+ clearTimeout(timeout);
335
+ worker.off('message', messageHandler);
336
+ worker.off('error', errorHandler);
337
+ reject(error);
338
+ };
339
+ worker.on('message', messageHandler);
340
+ worker.on('error', errorHandler);
341
+ });
342
+ // Register worker
343
+ this.workers.set(workerId, workerInfo);
344
+ if (!this.workersByRuleset.has(rulesetKey)) {
345
+ this.workersByRuleset.set(rulesetKey, new Set());
346
+ }
347
+ this.workersByRuleset.get(rulesetKey).add(workerId);
348
+ console.log(` āœ… Worker ${workerId} ready (${rulesetName}@${rulesetVersion})`);
349
+ }
350
+ /**
351
+ * Notify the first waiter in the worker-ready queue that a worker is available.
352
+ * Called when a worker transitions back to 'ready' after completing a task or timing out.
353
+ */
354
+ notifyWorkerReady(workerInfo) {
355
+ const rulesetKey = `${workerInfo.rulesetName}@${workerInfo.rulesetVersion}`;
356
+ // Find the first callback waiting for this ruleset
357
+ const idx = this.workerReadyCallbacks.findIndex(cb => cb.rulesetKey === rulesetKey);
358
+ if (idx !== -1) {
359
+ const callback = this.workerReadyCallbacks.splice(idx, 1)[0];
360
+ clearTimeout(callback.timer);
361
+ callback.resolve(workerInfo);
362
+ }
363
+ }
364
+ /**
365
+ * Handle worker failure (auto-restart)
366
+ */
367
+ async handleWorkerFailure(workerInfo) {
368
+ console.error(`āŒ Worker ${workerInfo.workerId} failed`);
369
+ // Check restart limit
370
+ if (workerInfo.restartCount >= this.config.maxRetries) {
371
+ console.error(` Maximum retries exceeded for ${workerInfo.workerId}`);
372
+ workerInfo.status = 'terminated';
373
+ return;
374
+ }
375
+ // Terminate failed worker
376
+ try {
377
+ await workerInfo.worker.terminate();
378
+ }
379
+ catch (error) {
380
+ // Ignore termination errors
381
+ }
382
+ // Remove from maps
383
+ this.workers.delete(workerInfo.workerId);
384
+ const rulesetKey = `${workerInfo.rulesetName}@${workerInfo.rulesetVersion}`;
385
+ this.workersByRuleset.get(rulesetKey)?.delete(workerInfo.workerId);
386
+ // Create replacement worker
387
+ try {
388
+ console.log(` šŸ”„ Restarting worker for ${workerInfo.rulesetName}@${workerInfo.rulesetVersion}`);
389
+ await this.createWorker(workerInfo.rulesetName, workerInfo.rulesetVersion);
390
+ }
391
+ catch (error) {
392
+ console.error(` Failed to restart worker: ${error instanceof Error ? error.message : String(error)}`);
393
+ }
394
+ }
395
+ /**
396
+ * Dynamic scaling monitor — checks queue pressure every 2 seconds.
397
+ *
398
+ * Scale-up: If pending waiters for a ruleset >= scaleUpThreshold and
399
+ * current workers < maxWorkersPerRuleset, spawn a new worker.
400
+ * Scale-down: If all workers for a ruleset are idle (ready) and
401
+ * current workers > minWorkersPerRuleset, terminate one.
402
+ */
403
+ startScalingMonitor() {
404
+ const SCALING_CHECK_INTERVAL_MS = 2000;
405
+ this.scalingMonitorInterval = setInterval(() => {
406
+ for (const [rulesetKey, workerIds] of this.workersByRuleset) {
407
+ const currentWorkers = workerIds.size;
408
+ if (currentWorkers === 0)
409
+ continue;
410
+ // Count pending waiters for this ruleset
411
+ const pendingForRuleset = this.workerReadyCallbacks
412
+ .filter(cb => cb.rulesetKey === rulesetKey).length;
413
+ // Count busy workers for this ruleset
414
+ let busyCount = 0;
415
+ let readyCount = 0;
416
+ for (const workerId of workerIds) {
417
+ const worker = this.workers.get(workerId);
418
+ if (worker?.status === 'busy')
419
+ busyCount++;
420
+ if (worker?.status === 'ready')
421
+ readyCount++;
422
+ }
423
+ // Scale UP: queue pressure exceeds threshold and we have capacity
424
+ if (pendingForRuleset >= this.config.scaleUpThreshold
425
+ && currentWorkers < this.config.maxWorkersPerRuleset
426
+ && this.workers.size < this.config.totalMaxWorkers) {
427
+ // Parse rulesetName@rulesetVersion
428
+ const [rulesetName, rulesetVersion] = rulesetKey.split('@');
429
+ console.log(`šŸ“ˆ Scaling up ${rulesetKey}: ${currentWorkers} workers, ${pendingForRuleset} pending waiters`);
430
+ this.createWorker(rulesetName, rulesetVersion).catch(err => {
431
+ console.error(` āš ļø Scale-up failed for ${rulesetKey}: ${err instanceof Error ? err.message : String(err)}`);
432
+ });
433
+ }
434
+ // Scale DOWN: all workers idle, we have more than minimum
435
+ if (readyCount === currentWorkers && busyCount === 0 && pendingForRuleset === 0
436
+ && currentWorkers > this.config.minWorkersPerRuleset) {
437
+ this.scaleDownOne(rulesetKey);
438
+ }
439
+ }
440
+ }, SCALING_CHECK_INTERVAL_MS);
441
+ // Don't let the interval prevent process exit
442
+ if (this.scalingMonitorInterval.unref) {
443
+ this.scalingMonitorInterval.unref();
444
+ }
445
+ }
446
+ /**
447
+ * Terminate one idle worker for a ruleset (scale down).
448
+ * Picks the worker with the lowest task count (least utilized).
449
+ */
450
+ async scaleDownOne(rulesetKey) {
451
+ const workerIds = this.workersByRuleset.get(rulesetKey);
452
+ if (!workerIds)
453
+ return;
454
+ // Find the least-utilized ready worker
455
+ let target = null;
456
+ for (const workerId of workerIds) {
457
+ const worker = this.workers.get(workerId);
458
+ if (worker?.status === 'ready') {
459
+ if (!target || worker.taskCount < target.taskCount) {
460
+ target = worker;
461
+ }
462
+ }
463
+ }
464
+ if (!target)
465
+ return;
466
+ console.log(`šŸ“‰ Scaling down ${rulesetKey}: removing worker ${target.workerId} (${workerIds.size} → ${workerIds.size - 1})`);
467
+ try {
468
+ await target.worker.terminate();
469
+ }
470
+ catch {
471
+ // Ignore termination errors
472
+ }
473
+ this.workers.delete(target.workerId);
474
+ workerIds.delete(target.workerId);
475
+ }
476
+ /**
477
+ * Get pool statistics
478
+ */
479
+ getStats() {
480
+ const stats = {
481
+ totalWorkers: this.workers.size,
482
+ readyWorkers: 0,
483
+ busyWorkers: 0,
484
+ errorWorkers: 0,
485
+ workersByRuleset: new Map(),
486
+ totalTasksExecuted: this.totalTasksExecuted,
487
+ averageExecutionTime: this.totalTasksExecuted > 0 ? this.totalExecutionTime / this.totalTasksExecuted : 0,
488
+ pendingWaiters: this.workerReadyCallbacks.length
489
+ };
490
+ for (const worker of this.workers.values()) {
491
+ if (worker.status === 'ready')
492
+ stats.readyWorkers++;
493
+ if (worker.status === 'busy')
494
+ stats.busyWorkers++;
495
+ if (worker.status === 'error')
496
+ stats.errorWorkers++;
497
+ const rulesetKey = `${worker.rulesetName}@${worker.rulesetVersion}`;
498
+ stats.workersByRuleset.set(rulesetKey, (stats.workersByRuleset.get(rulesetKey) || 0) + 1);
499
+ }
500
+ return stats;
501
+ }
502
+ /**
503
+ * Shutdown all workers
504
+ */
505
+ async shutdown() {
506
+ console.log('šŸ›‘ Shutting down worker pool...');
507
+ // Stop scaling monitor
508
+ if (this.scalingMonitorInterval) {
509
+ clearInterval(this.scalingMonitorInterval);
510
+ this.scalingMonitorInterval = null;
511
+ }
512
+ const shutdownPromises = [];
513
+ for (const workerInfo of this.workers.values()) {
514
+ const terminatePromise = workerInfo.worker.terminate()
515
+ .then(() => { })
516
+ .catch(error => {
517
+ console.error(`Error terminating worker ${workerInfo.workerId}:`, error);
518
+ });
519
+ shutdownPromises.push(terminatePromise);
520
+ }
521
+ await Promise.all(shutdownPromises);
522
+ // Clear all pending waiters (resolve with null so they don't hang)
523
+ for (const cb of this.workerReadyCallbacks) {
524
+ clearTimeout(cb.timer);
525
+ cb.resolve(null);
526
+ }
527
+ this.workerReadyCallbacks = [];
528
+ this.workers.clear();
529
+ this.workersByRuleset.clear();
530
+ this.pendingTasks.clear();
531
+ this.initialized = false;
532
+ console.log('āœ… Worker pool shutdown complete');
533
+ }
534
+ /**
535
+ * Log current pool status
536
+ */
537
+ logPoolStatus() {
538
+ const stats = this.getStats();
539
+ console.log(`\nšŸ“Š Worker Pool Status:`);
540
+ console.log(` Total workers: ${stats.totalWorkers}`);
541
+ console.log(` Ready: ${stats.readyWorkers}, Busy: ${stats.busyWorkers}, Error: ${stats.errorWorkers}`);
542
+ console.log(` Workers by ruleset:`);
543
+ for (const [ruleset, count] of stats.workersByRuleset.entries()) {
544
+ console.log(` ${ruleset}: ${count}`);
545
+ }
546
+ console.log();
547
+ }
548
+ }
549
+ //# sourceMappingURL=worker-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../src/worker-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":""}