@trentapps/manager-protocol 1.1.3 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/README.md +164 -17
  2. package/dist/analyzers/CSSAnalyzer.d.ts +180 -8
  3. package/dist/analyzers/CSSAnalyzer.d.ts.map +1 -1
  4. package/dist/analyzers/CSSAnalyzer.js +561 -105
  5. package/dist/analyzers/CSSAnalyzer.js.map +1 -1
  6. package/dist/config/dashboard.d.ts +55 -0
  7. package/dist/config/dashboard.d.ts.map +1 -0
  8. package/dist/config/dashboard.js +103 -0
  9. package/dist/config/dashboard.js.map +1 -0
  10. package/dist/config/index.d.ts +7 -0
  11. package/dist/config/index.d.ts.map +1 -0
  12. package/dist/config/index.js +7 -0
  13. package/dist/config/index.js.map +1 -0
  14. package/dist/dashboard/httpDashboard.d.ts +100 -0
  15. package/dist/dashboard/httpDashboard.d.ts.map +1 -0
  16. package/dist/dashboard/httpDashboard.js +1276 -0
  17. package/dist/dashboard/httpDashboard.js.map +1 -0
  18. package/dist/dashboard/index.d.ts +6 -0
  19. package/dist/dashboard/index.d.ts.map +1 -0
  20. package/dist/dashboard/index.js +7 -0
  21. package/dist/dashboard/index.js.map +1 -0
  22. package/dist/engine/AuditLogger.d.ts +370 -2
  23. package/dist/engine/AuditLogger.d.ts.map +1 -1
  24. package/dist/engine/AuditLogger.js +1064 -24
  25. package/dist/engine/AuditLogger.js.map +1 -1
  26. package/dist/engine/GitHubClient.d.ts +183 -0
  27. package/dist/engine/GitHubClient.d.ts.map +1 -0
  28. package/dist/engine/GitHubClient.js +411 -0
  29. package/dist/engine/GitHubClient.js.map +1 -0
  30. package/dist/engine/RateLimiter.d.ts +5 -3
  31. package/dist/engine/RateLimiter.d.ts.map +1 -1
  32. package/dist/engine/RateLimiter.js +49 -72
  33. package/dist/engine/RateLimiter.js.map +1 -1
  34. package/dist/engine/RuleDependencyAnalyzer.d.ts +73 -0
  35. package/dist/engine/RuleDependencyAnalyzer.d.ts.map +1 -0
  36. package/dist/engine/RuleDependencyAnalyzer.js +475 -0
  37. package/dist/engine/RuleDependencyAnalyzer.js.map +1 -0
  38. package/dist/engine/RulesEngine.d.ts +102 -3
  39. package/dist/engine/RulesEngine.d.ts.map +1 -1
  40. package/dist/engine/RulesEngine.js +326 -21
  41. package/dist/engine/RulesEngine.js.map +1 -1
  42. package/dist/engine/TaskManager.d.ts +10 -14
  43. package/dist/engine/TaskManager.d.ts.map +1 -1
  44. package/dist/engine/TaskManager.js +169 -197
  45. package/dist/engine/TaskManager.js.map +1 -1
  46. package/dist/engine/index.d.ts +3 -0
  47. package/dist/engine/index.d.ts.map +1 -1
  48. package/dist/engine/index.js +5 -0
  49. package/dist/engine/index.js.map +1 -1
  50. package/dist/rules/azure.d.ts.map +1 -1
  51. package/dist/rules/azure.js +12 -14
  52. package/dist/rules/azure.js.map +1 -1
  53. package/dist/rules/compliance.d.ts.map +1 -1
  54. package/dist/rules/compliance.js +23 -41
  55. package/dist/rules/compliance.js.map +1 -1
  56. package/dist/rules/condition-optimizer.d.ts +151 -0
  57. package/dist/rules/condition-optimizer.d.ts.map +1 -0
  58. package/dist/rules/condition-optimizer.js +479 -0
  59. package/dist/rules/condition-optimizer.js.map +1 -0
  60. package/dist/rules/css.d.ts.map +1 -1
  61. package/dist/rules/css.js +538 -0
  62. package/dist/rules/css.js.map +1 -1
  63. package/dist/rules/field-standards.d.ts +1172 -0
  64. package/dist/rules/field-standards.d.ts.map +1 -0
  65. package/dist/rules/field-standards.js +908 -0
  66. package/dist/rules/field-standards.js.map +1 -0
  67. package/dist/rules/flask.d.ts.map +1 -1
  68. package/dist/rules/flask.js +18 -31
  69. package/dist/rules/flask.js.map +1 -1
  70. package/dist/rules/index.d.ts +220 -0
  71. package/dist/rules/index.d.ts.map +1 -1
  72. package/dist/rules/index.js +155 -0
  73. package/dist/rules/index.js.map +1 -1
  74. package/dist/rules/ml-ai.d.ts.map +1 -1
  75. package/dist/rules/ml-ai.js +11 -13
  76. package/dist/rules/ml-ai.js.map +1 -1
  77. package/dist/rules/patterns.d.ts +568 -0
  78. package/dist/rules/patterns.d.ts.map +1 -0
  79. package/dist/rules/patterns.js +1359 -0
  80. package/dist/rules/patterns.js.map +1 -0
  81. package/dist/rules/security.d.ts.map +1 -1
  82. package/dist/rules/security.js +580 -19
  83. package/dist/rules/security.js.map +1 -1
  84. package/dist/rules/shared-patterns.d.ts +268 -0
  85. package/dist/rules/shared-patterns.d.ts.map +1 -0
  86. package/dist/rules/shared-patterns.js +556 -0
  87. package/dist/rules/shared-patterns.js.map +1 -0
  88. package/dist/rules/storage.d.ts +8 -2
  89. package/dist/rules/storage.d.ts.map +1 -1
  90. package/dist/rules/storage.js +541 -3
  91. package/dist/rules/storage.js.map +1 -1
  92. package/dist/rules/stripe.d.ts.map +1 -1
  93. package/dist/rules/stripe.js +19 -26
  94. package/dist/rules/stripe.js.map +1 -1
  95. package/dist/rules/websocket.d.ts.map +1 -1
  96. package/dist/rules/websocket.js +32 -40
  97. package/dist/rules/websocket.js.map +1 -1
  98. package/dist/supervisor/AgentSupervisor.d.ts +52 -0
  99. package/dist/supervisor/AgentSupervisor.d.ts.map +1 -1
  100. package/dist/supervisor/AgentSupervisor.js +120 -1
  101. package/dist/supervisor/AgentSupervisor.js.map +1 -1
  102. package/dist/supervisor/ManagedServerRegistry.d.ts +139 -2
  103. package/dist/supervisor/ManagedServerRegistry.d.ts.map +1 -1
  104. package/dist/supervisor/ManagedServerRegistry.js +590 -6
  105. package/dist/supervisor/ManagedServerRegistry.js.map +1 -1
  106. package/dist/supervisor/ProjectTracker.d.ts +2 -1
  107. package/dist/supervisor/ProjectTracker.d.ts.map +1 -1
  108. package/dist/supervisor/ProjectTracker.js +5 -9
  109. package/dist/supervisor/ProjectTracker.js.map +1 -1
  110. package/dist/testing/index.d.ts +11 -0
  111. package/dist/testing/index.d.ts.map +1 -0
  112. package/dist/testing/index.js +12 -0
  113. package/dist/testing/index.js.map +1 -0
  114. package/dist/testing/rule-tester.d.ts +217 -0
  115. package/dist/testing/rule-tester.d.ts.map +1 -0
  116. package/dist/testing/rule-tester.examples.d.ts +57 -0
  117. package/dist/testing/rule-tester.examples.d.ts.map +1 -0
  118. package/dist/testing/rule-tester.examples.js +375 -0
  119. package/dist/testing/rule-tester.examples.js.map +1 -0
  120. package/dist/testing/rule-tester.js +381 -0
  121. package/dist/testing/rule-tester.js.map +1 -0
  122. package/dist/testing/rule-validator.d.ts +141 -0
  123. package/dist/testing/rule-validator.d.ts.map +1 -0
  124. package/dist/testing/rule-validator.js +640 -0
  125. package/dist/testing/rule-validator.js.map +1 -0
  126. package/dist/types/index.d.ts +265 -4
  127. package/dist/types/index.d.ts.map +1 -1
  128. package/dist/types/index.js +57 -2
  129. package/dist/types/index.js.map +1 -1
  130. package/dist/utils/index.d.ts +2 -0
  131. package/dist/utils/index.d.ts.map +1 -1
  132. package/dist/utils/index.js +2 -0
  133. package/dist/utils/index.js.map +1 -1
  134. package/dist/utils/rate-limiting.d.ts +268 -0
  135. package/dist/utils/rate-limiting.d.ts.map +1 -0
  136. package/dist/utils/rate-limiting.js +403 -0
  137. package/dist/utils/rate-limiting.js.map +1 -0
  138. package/dist/utils/shared.d.ts +306 -0
  139. package/dist/utils/shared.d.ts.map +1 -0
  140. package/dist/utils/shared.js +464 -0
  141. package/dist/utils/shared.js.map +1 -0
  142. package/package.json +3 -2
@@ -2,18 +2,458 @@
2
2
  * Managed Server Registry
3
3
  *
4
4
  * Allows registering servers (ip + sourceDir) and checking online status.
5
+ * Features:
6
+ * - Connection pooling for TCP checks (reuse connections, timeout limits)
7
+ * - Caching for health check results (short TTL for success, no cache for failures)
8
+ * - Rate limiting with exponential backoff for repeated failures
5
9
  */
6
10
  import { promises as fsp } from 'fs';
7
11
  import fs from 'fs';
8
12
  import path from 'path';
9
13
  import net from 'net';
10
14
  import { v4 as uuidv4 } from 'uuid';
15
+ /**
16
+ * TCP Connection Pool
17
+ * Manages reusable TCP connections with automatic cleanup
18
+ */
19
+ class TCPConnectionPool {
20
+ pools = new Map();
21
+ config;
22
+ cleanupTimer = null;
23
+ constructor(config = {}) {
24
+ this.config = {
25
+ maxConnectionsPerEndpoint: config.maxConnectionsPerEndpoint ?? 5,
26
+ connectionIdleTimeoutMs: config.connectionIdleTimeoutMs ?? 30000,
27
+ maxConnectionAgeMs: config.maxConnectionAgeMs ?? 60000,
28
+ cleanupIntervalMs: config.cleanupIntervalMs ?? 10000
29
+ };
30
+ this.startCleanupTimer();
31
+ }
32
+ getKey(host, port) {
33
+ return `${host}:${port}`;
34
+ }
35
+ startCleanupTimer() {
36
+ if (this.cleanupTimer)
37
+ return;
38
+ this.cleanupTimer = setInterval(() => {
39
+ this.cleanupStaleConnections();
40
+ }, this.config.cleanupIntervalMs);
41
+ // Don't block process exit
42
+ this.cleanupTimer.unref();
43
+ }
44
+ /**
45
+ * Clean up stale and idle connections
46
+ */
47
+ cleanupStaleConnections() {
48
+ const now = Date.now();
49
+ let cleaned = 0;
50
+ for (const [key, connections] of this.pools.entries()) {
51
+ const validConnections = [];
52
+ for (const conn of connections) {
53
+ const age = now - conn.createdAt;
54
+ const idle = now - conn.lastUsedAt;
55
+ // Remove if too old, too idle, or in error state
56
+ if (age > this.config.maxConnectionAgeMs ||
57
+ idle > this.config.connectionIdleTimeoutMs ||
58
+ conn.socket.destroyed) {
59
+ this.destroyConnection(conn);
60
+ cleaned++;
61
+ }
62
+ else if (!conn.inUse) {
63
+ validConnections.push(conn);
64
+ }
65
+ else {
66
+ validConnections.push(conn);
67
+ }
68
+ }
69
+ if (validConnections.length === 0) {
70
+ this.pools.delete(key);
71
+ }
72
+ else {
73
+ this.pools.set(key, validConnections);
74
+ }
75
+ }
76
+ return cleaned;
77
+ }
78
+ destroyConnection(conn) {
79
+ try {
80
+ if (!conn.socket.destroyed) {
81
+ conn.socket.destroy();
82
+ }
83
+ }
84
+ catch {
85
+ // Ignore destruction errors
86
+ }
87
+ }
88
+ /**
89
+ * Get or create a connection to the specified endpoint
90
+ */
91
+ async getConnection(host, port, timeoutMs) {
92
+ const key = this.getKey(host, port);
93
+ const pool = this.pools.get(key) || [];
94
+ // Try to find an available connection
95
+ for (const conn of pool) {
96
+ if (!conn.inUse && !conn.socket.destroyed) {
97
+ conn.inUse = true;
98
+ conn.lastUsedAt = Date.now();
99
+ return { socket: conn.socket, reused: true };
100
+ }
101
+ }
102
+ // Create new connection if under limit
103
+ if (pool.length < this.config.maxConnectionsPerEndpoint) {
104
+ const socket = await this.createConnection(host, port, timeoutMs);
105
+ const conn = {
106
+ socket,
107
+ host,
108
+ port,
109
+ createdAt: Date.now(),
110
+ lastUsedAt: Date.now(),
111
+ inUse: true
112
+ };
113
+ pool.push(conn);
114
+ this.pools.set(key, pool);
115
+ return { socket, reused: false };
116
+ }
117
+ // All connections in use, create a temporary one (won't be pooled)
118
+ const socket = await this.createConnection(host, port, timeoutMs);
119
+ return { socket, reused: false };
120
+ }
121
+ createConnection(host, port, timeoutMs) {
122
+ return new Promise((resolve, reject) => {
123
+ const socket = new net.Socket();
124
+ let settled = false;
125
+ const settle = (error) => {
126
+ if (settled)
127
+ return;
128
+ settled = true;
129
+ if (error) {
130
+ try {
131
+ socket.destroy();
132
+ }
133
+ catch { /* noop */ }
134
+ reject(error);
135
+ }
136
+ else {
137
+ resolve(socket);
138
+ }
139
+ };
140
+ socket.setTimeout(timeoutMs);
141
+ socket.once('connect', () => settle());
142
+ socket.once('timeout', () => settle(new Error('Connection timeout')));
143
+ socket.once('error', (err) => settle(err));
144
+ try {
145
+ socket.connect(port, host);
146
+ }
147
+ catch (err) {
148
+ settle(err instanceof Error ? err : new Error(String(err)));
149
+ }
150
+ });
151
+ }
152
+ /**
153
+ * Release a connection back to the pool
154
+ */
155
+ releaseConnection(host, port, socket, keepAlive = true) {
156
+ const key = this.getKey(host, port);
157
+ const pool = this.pools.get(key);
158
+ if (!pool) {
159
+ // Connection wasn't pooled, destroy it
160
+ try {
161
+ socket.destroy();
162
+ }
163
+ catch { /* noop */ }
164
+ return;
165
+ }
166
+ const conn = pool.find(c => c.socket === socket);
167
+ if (conn) {
168
+ conn.inUse = false;
169
+ conn.lastUsedAt = Date.now();
170
+ if (!keepAlive || socket.destroyed) {
171
+ // Remove from pool and destroy
172
+ const idx = pool.indexOf(conn);
173
+ if (idx !== -1)
174
+ pool.splice(idx, 1);
175
+ this.destroyConnection(conn);
176
+ }
177
+ }
178
+ else {
179
+ // Not a pooled connection, destroy it
180
+ try {
181
+ socket.destroy();
182
+ }
183
+ catch { /* noop */ }
184
+ }
185
+ }
186
+ /**
187
+ * Get pool statistics
188
+ */
189
+ getStats() {
190
+ let total = 0;
191
+ let active = 0;
192
+ for (const pool of this.pools.values()) {
193
+ total += pool.length;
194
+ active += pool.filter(c => c.inUse).length;
195
+ }
196
+ return {
197
+ totalConnections: total,
198
+ activeConnections: active,
199
+ endpoints: this.pools.size
200
+ };
201
+ }
202
+ /**
203
+ * Destroy all connections and stop cleanup timer
204
+ */
205
+ destroy() {
206
+ if (this.cleanupTimer) {
207
+ clearInterval(this.cleanupTimer);
208
+ this.cleanupTimer = null;
209
+ }
210
+ for (const pool of this.pools.values()) {
211
+ for (const conn of pool) {
212
+ this.destroyConnection(conn);
213
+ }
214
+ }
215
+ this.pools.clear();
216
+ }
217
+ }
218
+ /**
219
+ * Health Check Cache
220
+ * Caches successful TCP check results with LRU eviction
221
+ */
222
+ class HealthCheckCache {
223
+ cache = new Map();
224
+ config;
225
+ constructor(config = {}) {
226
+ this.config = {
227
+ successTtlMs: config.successTtlMs ?? 5000,
228
+ cacheFailures: config.cacheFailures ?? false,
229
+ failureTtlMs: config.failureTtlMs ?? 1000,
230
+ maxEntries: config.maxEntries ?? 1000
231
+ };
232
+ }
233
+ getKey(host, port) {
234
+ return `${host}:${port}`;
235
+ }
236
+ /**
237
+ * Get cached result if valid
238
+ */
239
+ get(host, port) {
240
+ const key = this.getKey(host, port);
241
+ const entry = this.cache.get(key);
242
+ if (!entry)
243
+ return null;
244
+ const now = Date.now();
245
+ const age = now - entry.timestamp;
246
+ const ttl = entry.result ? this.config.successTtlMs : this.config.failureTtlMs;
247
+ if (age > ttl) {
248
+ this.cache.delete(key);
249
+ return null;
250
+ }
251
+ // Update access tracking for LRU
252
+ entry.accessCount++;
253
+ entry.lastAccessedAt = now;
254
+ return { result: entry.result, ageMs: age };
255
+ }
256
+ /**
257
+ * Store a result in cache
258
+ */
259
+ set(host, port, result) {
260
+ // Don't cache failures unless configured to
261
+ if (!result && !this.config.cacheFailures) {
262
+ return;
263
+ }
264
+ // Enforce max entries with LRU eviction
265
+ if (this.cache.size >= this.config.maxEntries) {
266
+ this.evictLRU();
267
+ }
268
+ const key = this.getKey(host, port);
269
+ const now = Date.now();
270
+ this.cache.set(key, {
271
+ result,
272
+ timestamp: now,
273
+ accessCount: 1,
274
+ lastAccessedAt: now
275
+ });
276
+ }
277
+ /**
278
+ * Evict least recently used entries
279
+ */
280
+ evictLRU() {
281
+ // Evict 10% of entries
282
+ const toEvict = Math.ceil(this.config.maxEntries * 0.1);
283
+ const entries = Array.from(this.cache.entries())
284
+ .sort((a, b) => a[1].lastAccessedAt - b[1].lastAccessedAt);
285
+ for (let i = 0; i < toEvict && i < entries.length; i++) {
286
+ this.cache.delete(entries[i][0]);
287
+ }
288
+ }
289
+ /**
290
+ * Invalidate cache for a specific endpoint
291
+ */
292
+ invalidate(host, port) {
293
+ return this.cache.delete(this.getKey(host, port));
294
+ }
295
+ /**
296
+ * Clear all cached entries
297
+ */
298
+ clear() {
299
+ this.cache.clear();
300
+ }
301
+ /**
302
+ * Get cache statistics
303
+ */
304
+ getStats() {
305
+ let totalAccesses = 0;
306
+ for (const entry of this.cache.values()) {
307
+ totalAccesses += entry.accessCount;
308
+ }
309
+ return {
310
+ entries: this.cache.size,
311
+ hitRate: this.cache.size > 0 ? totalAccesses / this.cache.size : undefined
312
+ };
313
+ }
314
+ }
315
+ /**
316
+ * Rate Limiter with Exponential Backoff
317
+ * Prevents hammering unhealthy servers
318
+ */
319
+ class TCPRateLimiter {
320
+ states = new Map();
321
+ config;
322
+ constructor(config = {}) {
323
+ this.config = {
324
+ initialDelayMs: config.initialDelayMs ?? 1000,
325
+ maxDelayMs: config.maxDelayMs ?? 60000,
326
+ backoffMultiplier: config.backoffMultiplier ?? 2,
327
+ failureThreshold: config.failureThreshold ?? 3,
328
+ failureWindowMs: config.failureWindowMs ?? 60000
329
+ };
330
+ }
331
+ getKey(host, port) {
332
+ return `${host}:${port}`;
333
+ }
334
+ /**
335
+ * Check if an endpoint is currently rate limited
336
+ * Returns remaining wait time in ms, or 0 if not limited
337
+ */
338
+ isRateLimited(host, port) {
339
+ const key = this.getKey(host, port);
340
+ const state = this.states.get(key);
341
+ if (!state)
342
+ return 0;
343
+ const now = Date.now();
344
+ // Reset if outside failure window
345
+ if (now - state.lastFailureAt > this.config.failureWindowMs) {
346
+ this.states.delete(key);
347
+ return 0;
348
+ }
349
+ // Check if still blocked
350
+ if (now < state.blockedUntil) {
351
+ return state.blockedUntil - now;
352
+ }
353
+ return 0;
354
+ }
355
+ /**
356
+ * Record a successful check - resets failure tracking
357
+ */
358
+ recordSuccess(host, port) {
359
+ const key = this.getKey(host, port);
360
+ this.states.delete(key);
361
+ }
362
+ /**
363
+ * Record a failed check - may trigger rate limiting
364
+ */
365
+ recordFailure(host, port) {
366
+ const key = this.getKey(host, port);
367
+ const now = Date.now();
368
+ let state = this.states.get(key);
369
+ if (!state) {
370
+ state = {
371
+ consecutiveFailures: 0,
372
+ lastFailureAt: now,
373
+ currentDelayMs: this.config.initialDelayMs,
374
+ blockedUntil: 0
375
+ };
376
+ this.states.set(key, state);
377
+ }
378
+ // Reset if outside failure window
379
+ if (now - state.lastFailureAt > this.config.failureWindowMs) {
380
+ state.consecutiveFailures = 0;
381
+ state.currentDelayMs = this.config.initialDelayMs;
382
+ }
383
+ state.consecutiveFailures++;
384
+ state.lastFailureAt = now;
385
+ // Apply rate limiting after threshold
386
+ if (state.consecutiveFailures >= this.config.failureThreshold) {
387
+ state.blockedUntil = now + state.currentDelayMs;
388
+ // Exponential backoff for next failure
389
+ state.currentDelayMs = Math.min(state.currentDelayMs * this.config.backoffMultiplier, this.config.maxDelayMs);
390
+ }
391
+ }
392
+ /**
393
+ * Get rate limit state for an endpoint
394
+ */
395
+ getState(host, port) {
396
+ return this.states.get(this.getKey(host, port));
397
+ }
398
+ /**
399
+ * Clear rate limiting for an endpoint
400
+ */
401
+ clear(host, port) {
402
+ return this.states.delete(this.getKey(host, port));
403
+ }
404
+ /**
405
+ * Clear all rate limiting states
406
+ */
407
+ clearAll() {
408
+ this.states.clear();
409
+ }
410
+ /**
411
+ * Get statistics
412
+ */
413
+ getStats() {
414
+ const now = Date.now();
415
+ let rateLimited = 0;
416
+ for (const state of this.states.values()) {
417
+ if (now < state.blockedUntil) {
418
+ rateLimited++;
419
+ }
420
+ }
421
+ return {
422
+ trackedEndpoints: this.states.size,
423
+ rateLimitedEndpoints: rateLimited
424
+ };
425
+ }
426
+ }
11
427
  export class ManagedServerRegistry {
12
428
  filePath;
13
429
  servers = new Map();
14
430
  loaded = false;
15
- constructor(filePath) {
16
- this.filePath = filePath || path.join(process.cwd(), 'managed-servers.json');
431
+ // Connection pooling, caching, and rate limiting
432
+ connectionPool;
433
+ healthCache;
434
+ rateLimiter;
435
+ enablePooling;
436
+ enableCaching;
437
+ enableRateLimiting;
438
+ // Statistics tracking
439
+ stats = {
440
+ totalChecks: 0,
441
+ cacheHits: 0,
442
+ cacheMisses: 0,
443
+ pooledConnections: 0,
444
+ newConnections: 0,
445
+ rateLimitedChecks: 0
446
+ };
447
+ constructor(config = {}) {
448
+ this.filePath = config.filePath || path.join(process.cwd(), 'managed-servers.json');
449
+ // Initialize components with provided config or defaults
450
+ this.connectionPool = new TCPConnectionPool(config.connectionPool);
451
+ this.healthCache = new HealthCheckCache(config.cache);
452
+ this.rateLimiter = new TCPRateLimiter(config.rateLimit);
453
+ // Feature flags
454
+ this.enablePooling = config.enablePooling ?? true;
455
+ this.enableCaching = config.enableCaching ?? true;
456
+ this.enableRateLimiting = config.enableRateLimiting ?? true;
17
457
  }
18
458
  async ensureLoaded() {
19
459
  if (this.loaded)
@@ -95,9 +535,16 @@ export class ManagedServerRegistry {
95
535
  }
96
536
  const ports = input.ports && input.ports.length > 0 ? input.ports : defaultPorts;
97
537
  const byPort = {};
538
+ let usedCache = false;
539
+ let maxCacheAge = 0;
98
540
  // Try TCP connect to each port with short timeout
99
541
  await Promise.all(ports.map(async (port) => {
100
- byPort[port] = await this.tcpCheck(ip, port, 1000);
542
+ const { result, cached, cacheAgeMs } = await this.tcpCheckWithFeatures(ip, port, 1000, input.skipCache);
543
+ byPort[port] = result;
544
+ if (cached) {
545
+ usedCache = true;
546
+ maxCacheAge = Math.max(maxCacheAge, cacheAgeMs || 0);
547
+ }
101
548
  }));
102
549
  const online = Object.values(byPort).some(Boolean);
103
550
  const sourceDirExists = fs.existsSync(sourceDir);
@@ -108,10 +555,84 @@ export class ManagedServerRegistry {
108
555
  ports: byPort,
109
556
  sourceDir,
110
557
  sourceDirExists,
111
- checkedAt: new Date().toISOString()
558
+ checkedAt: new Date().toISOString(),
559
+ cached: usedCache ? true : undefined,
560
+ cacheAgeMs: usedCache ? maxCacheAge : undefined
112
561
  };
113
562
  }
114
- tcpCheck(host, port, timeoutMs) {
563
+ /**
564
+ * TCP check with connection pooling, caching, and rate limiting
565
+ */
566
+ async tcpCheckWithFeatures(host, port, timeoutMs, skipCache) {
567
+ this.stats.totalChecks++;
568
+ // Check cache first (unless skipped)
569
+ if (this.enableCaching && !skipCache) {
570
+ const cached = this.healthCache.get(host, port);
571
+ if (cached !== null) {
572
+ this.stats.cacheHits++;
573
+ return { result: cached.result, cached: true, cacheAgeMs: cached.ageMs };
574
+ }
575
+ this.stats.cacheMisses++;
576
+ }
577
+ // Check rate limiting
578
+ if (this.enableRateLimiting) {
579
+ const waitTime = this.rateLimiter.isRateLimited(host, port);
580
+ if (waitTime > 0) {
581
+ this.stats.rateLimitedChecks++;
582
+ // Return false immediately for rate-limited endpoints
583
+ // Don't cache this - it's not a real check result
584
+ return { result: false, cached: false };
585
+ }
586
+ }
587
+ // Perform actual TCP check
588
+ let result;
589
+ if (this.enablePooling) {
590
+ result = await this.tcpCheckPooled(host, port, timeoutMs);
591
+ }
592
+ else {
593
+ result = await this.tcpCheckDirect(host, port, timeoutMs);
594
+ }
595
+ // Update rate limiter
596
+ if (this.enableRateLimiting) {
597
+ if (result) {
598
+ this.rateLimiter.recordSuccess(host, port);
599
+ }
600
+ else {
601
+ this.rateLimiter.recordFailure(host, port);
602
+ }
603
+ }
604
+ // Cache the result
605
+ if (this.enableCaching) {
606
+ this.healthCache.set(host, port, result);
607
+ }
608
+ return { result, cached: false };
609
+ }
610
+ /**
611
+ * TCP check using connection pool
612
+ */
613
+ async tcpCheckPooled(host, port, timeoutMs) {
614
+ try {
615
+ const { socket, reused } = await this.connectionPool.getConnection(host, port, timeoutMs);
616
+ if (reused) {
617
+ this.stats.pooledConnections++;
618
+ }
619
+ else {
620
+ this.stats.newConnections++;
621
+ }
622
+ // For health check, we just need to verify connection works
623
+ // Release connection back to pool (keep alive for reuse)
624
+ this.connectionPool.releaseConnection(host, port, socket, true);
625
+ return true;
626
+ }
627
+ catch {
628
+ return false;
629
+ }
630
+ }
631
+ /**
632
+ * Direct TCP check without pooling (original implementation)
633
+ */
634
+ tcpCheckDirect(host, port, timeoutMs) {
635
+ this.stats.newConnections++;
115
636
  return new Promise((resolve) => {
116
637
  const socket = new net.Socket();
117
638
  let done = false;
@@ -129,7 +650,7 @@ export class ManagedServerRegistry {
129
650
  socket.once('connect', () => finalize(true));
130
651
  socket.once('timeout', () => finalize(false));
131
652
  socket.once('error', () => finalize(false));
132
- // Some hosts may refuse connection quickly still indicates reachability
653
+ // Some hosts may refuse connection quickly - still indicates reachability
133
654
  socket.once('close', (hadError) => finalize(!hadError));
134
655
  try {
135
656
  socket.connect(port, host);
@@ -139,6 +660,69 @@ export class ManagedServerRegistry {
139
660
  }
140
661
  });
141
662
  }
663
+ /**
664
+ * Get comprehensive statistics about TCP checks
665
+ */
666
+ getCheckStats() {
667
+ const totalConnections = this.stats.pooledConnections + this.stats.newConnections;
668
+ return {
669
+ ...this.stats,
670
+ cacheHitRate: this.stats.totalChecks > 0
671
+ ? this.stats.cacheHits / this.stats.totalChecks
672
+ : 0,
673
+ poolReuseRate: totalConnections > 0
674
+ ? this.stats.pooledConnections / totalConnections
675
+ : 0,
676
+ pool: this.connectionPool.getStats(),
677
+ cache: this.healthCache.getStats(),
678
+ rateLimit: this.rateLimiter.getStats()
679
+ };
680
+ }
681
+ /**
682
+ * Invalidate cache for a specific endpoint
683
+ */
684
+ invalidateCache(host, port) {
685
+ return this.healthCache.invalidate(host, port);
686
+ }
687
+ /**
688
+ * Clear all caches
689
+ */
690
+ clearCache() {
691
+ this.healthCache.clear();
692
+ }
693
+ /**
694
+ * Clear rate limiting for an endpoint
695
+ */
696
+ clearRateLimit(host, port) {
697
+ return this.rateLimiter.clear(host, port);
698
+ }
699
+ /**
700
+ * Clear all rate limiting
701
+ */
702
+ clearAllRateLimits() {
703
+ this.rateLimiter.clearAll();
704
+ }
705
+ /**
706
+ * Reset all statistics
707
+ */
708
+ resetStats() {
709
+ this.stats = {
710
+ totalChecks: 0,
711
+ cacheHits: 0,
712
+ cacheMisses: 0,
713
+ pooledConnections: 0,
714
+ newConnections: 0,
715
+ rateLimitedChecks: 0
716
+ };
717
+ }
718
+ /**
719
+ * Clean up resources (connection pool, timers)
720
+ */
721
+ destroy() {
722
+ this.connectionPool.destroy();
723
+ this.healthCache.clear();
724
+ this.rateLimiter.clearAll();
725
+ }
142
726
  }
143
727
  // Singleton default registry
144
728
  export const managedServerRegistry = new ManagedServerRegistry();
@@ -1 +1 @@
1
- {"version":3,"file":"ManagedServerRegistry.js","sourceRoot":"","sources":["../../src/supervisor/ManagedServerRegistry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ManagedServerRegistry.js","sourceRoot":"","sources":["../../src/supervisor/ManagedServerRegistry.ts"],"names":[],"mappings":"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"}