@brutalist/mcp 0.5.1 → 0.6.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 (75) hide show
  1. package/README.md +65 -63
  2. package/dist/brutalist-server.d.ts +15 -0
  3. package/dist/brutalist-server.d.ts.map +1 -1
  4. package/dist/brutalist-server.js +405 -357
  5. package/dist/brutalist-server.js.map +1 -1
  6. package/dist/cli-agents.d.ts +8 -3
  7. package/dist/cli-agents.d.ts.map +1 -1
  8. package/dist/cli-agents.js +352 -50
  9. package/dist/cli-agents.js.map +1 -1
  10. package/dist/streaming/circuit-breaker.d.ts +186 -0
  11. package/dist/streaming/circuit-breaker.d.ts.map +1 -0
  12. package/dist/streaming/circuit-breaker.js +463 -0
  13. package/dist/streaming/circuit-breaker.js.map +1 -0
  14. package/dist/streaming/intelligent-buffer.d.ts +141 -0
  15. package/dist/streaming/intelligent-buffer.d.ts.map +1 -0
  16. package/dist/streaming/intelligent-buffer.js +555 -0
  17. package/dist/streaming/intelligent-buffer.js.map +1 -0
  18. package/dist/streaming/output-parser.d.ts +89 -0
  19. package/dist/streaming/output-parser.d.ts.map +1 -0
  20. package/dist/streaming/output-parser.js +349 -0
  21. package/dist/streaming/output-parser.js.map +1 -0
  22. package/dist/streaming/progress-tracker.d.ts +149 -0
  23. package/dist/streaming/progress-tracker.d.ts.map +1 -0
  24. package/dist/streaming/progress-tracker.js +519 -0
  25. package/dist/streaming/progress-tracker.js.map +1 -0
  26. package/dist/streaming/session-manager.d.ts +238 -0
  27. package/dist/streaming/session-manager.d.ts.map +1 -0
  28. package/dist/streaming/session-manager.js +546 -0
  29. package/dist/streaming/session-manager.js.map +1 -0
  30. package/dist/streaming/sse-transport.d.ts +95 -0
  31. package/dist/streaming/sse-transport.d.ts.map +1 -0
  32. package/dist/streaming/sse-transport.js +319 -0
  33. package/dist/streaming/sse-transport.js.map +1 -0
  34. package/dist/streaming/streaming-orchestrator.d.ts +153 -0
  35. package/dist/streaming/streaming-orchestrator.d.ts.map +1 -0
  36. package/dist/streaming/streaming-orchestrator.js +436 -0
  37. package/dist/streaming/streaming-orchestrator.js.map +1 -0
  38. package/dist/test-utils/process-manager.d.ts +61 -0
  39. package/dist/test-utils/process-manager.d.ts.map +1 -0
  40. package/dist/test-utils/process-manager.js +262 -0
  41. package/dist/test-utils/process-manager.js.map +1 -0
  42. package/dist/test-utils/server-harness.d.ts +73 -0
  43. package/dist/test-utils/server-harness.d.ts.map +1 -0
  44. package/dist/test-utils/server-harness.js +296 -0
  45. package/dist/test-utils/server-harness.js.map +1 -0
  46. package/dist/test-utils/streaming-fuzz.d.ts +57 -0
  47. package/dist/test-utils/streaming-fuzz.d.ts.map +1 -0
  48. package/dist/test-utils/streaming-fuzz.js +287 -0
  49. package/dist/test-utils/streaming-fuzz.js.map +1 -0
  50. package/dist/test-utils/test-isolation.d.ts +70 -0
  51. package/dist/test-utils/test-isolation.d.ts.map +1 -0
  52. package/dist/test-utils/test-isolation.js +193 -0
  53. package/dist/test-utils/test-isolation.js.map +1 -0
  54. package/dist/tool-definitions.d.ts +6 -0
  55. package/dist/tool-definitions.d.ts.map +1 -0
  56. package/dist/tool-definitions.js +217 -0
  57. package/dist/tool-definitions.js.map +1 -0
  58. package/dist/types/brutalist.d.ts +3 -19
  59. package/dist/types/brutalist.d.ts.map +1 -1
  60. package/dist/types/tool-config.d.ts +51 -0
  61. package/dist/types/tool-config.d.ts.map +1 -0
  62. package/dist/types/tool-config.js +24 -0
  63. package/dist/types/tool-config.js.map +1 -0
  64. package/dist/utils/pagination.d.ts +2 -2
  65. package/dist/utils/pagination.d.ts.map +1 -1
  66. package/dist/utils/pagination.js +1 -1
  67. package/dist/utils/pagination.js.map +1 -1
  68. package/dist/utils/response-cache.d.ts +96 -0
  69. package/dist/utils/response-cache.d.ts.map +1 -0
  70. package/dist/utils/response-cache.js +371 -0
  71. package/dist/utils/response-cache.js.map +1 -0
  72. package/dist/utils.d.ts.map +1 -1
  73. package/dist/utils.js +22 -3
  74. package/dist/utils.js.map +1 -1
  75. package/package.json +14 -4
@@ -0,0 +1,546 @@
1
+ import { EventEmitter } from 'events';
2
+ import { randomUUID } from 'crypto';
3
+ import { logger } from '../logger.js';
4
+ import { IntelligentBuffer } from './intelligent-buffer.js';
5
+ /**
6
+ * Session channel manager with comprehensive lifecycle management
7
+ *
8
+ * Features:
9
+ * - Session isolation with secure access control
10
+ * - Automatic resource cleanup and garbage collection
11
+ * - Connection pooling and limits
12
+ * - Real-time monitoring and metrics
13
+ * - Event buffering and delivery guarantees
14
+ * - Analysis state tracking
15
+ * - Graceful error handling and recovery
16
+ */
17
+ export class SessionChannelManager extends EventEmitter {
18
+ sessions = new Map();
19
+ cleanupTimers = new Map();
20
+ globalBuffer;
21
+ startTime = Date.now();
22
+ // Configuration
23
+ config;
24
+ DEFAULT_CONFIG = {
25
+ ttl: 2 * 60 * 60 * 1000, // 2 hours
26
+ maxConnections: 5, // 5 concurrent connections
27
+ maxMemoryMB: 100, // 100MB per session
28
+ maxEvents: 10000, // 10k events
29
+ autoCleanup: true, // Auto cleanup
30
+ bufferConfig: {
31
+ enableCoalescence: true,
32
+ adaptiveThrottling: true,
33
+ backpressureThreshold: 1000
34
+ }
35
+ };
36
+ // Metrics tracking
37
+ metrics = {
38
+ totalSessions: 0,
39
+ activeSessions: 0,
40
+ totalEvents: 0,
41
+ totalSubscribers: 0,
42
+ memoryUsage: 0,
43
+ uptime: Date.now()
44
+ };
45
+ constructor(config = {}) {
46
+ super();
47
+ this.config = { ...this.DEFAULT_CONFIG, ...config };
48
+ this.globalBuffer = new IntelligentBuffer();
49
+ // Setup global event handlers
50
+ this.setupEventHandlers();
51
+ // Start periodic maintenance
52
+ this.startMaintenance();
53
+ logger.info('SessionChannelManager initialized', {
54
+ ttl: this.config.ttl,
55
+ maxConnections: this.config.maxConnections,
56
+ autoCleanup: this.config.autoCleanup
57
+ });
58
+ }
59
+ /**
60
+ * Create new session with full context
61
+ */
62
+ createSession(sessionId, metadata = {}) {
63
+ const id = sessionId || randomUUID();
64
+ if (this.sessions.has(id)) {
65
+ throw new Error(`Session ${id} already exists`);
66
+ }
67
+ const context = {
68
+ id,
69
+ startTime: Date.now(),
70
+ lastActivity: Date.now(),
71
+ subscribers: new Set(),
72
+ eventBuffer: new IntelligentBuffer(),
73
+ metadata: { ...metadata, createdAt: Date.now() },
74
+ analysis: {
75
+ status: 'starting',
76
+ activeAgents: new Set(),
77
+ completedAgents: new Set(),
78
+ failedAgents: new Set(),
79
+ findings: [],
80
+ startTime: Date.now(),
81
+ progress: {
82
+ totalPhases: 5, // starting, scanning, analyzing, synthesizing, complete
83
+ currentPhase: 0,
84
+ phaseName: 'starting',
85
+ phaseProgress: 0
86
+ },
87
+ metrics: {
88
+ totalEvents: 0,
89
+ findingsCount: 0,
90
+ errorsCount: 0,
91
+ avgResponseTime: 0
92
+ }
93
+ },
94
+ connectionCount: 0,
95
+ maxConnections: this.config.maxConnections,
96
+ resources: {
97
+ memoryUsage: 0,
98
+ eventCount: 0,
99
+ connectionTime: 0
100
+ },
101
+ cleanup: {
102
+ ttl: this.config.ttl,
103
+ scheduled: false
104
+ }
105
+ };
106
+ this.sessions.set(id, context);
107
+ this.metrics.totalSessions++;
108
+ this.metrics.activeSessions++;
109
+ // Schedule cleanup
110
+ if (this.config.autoCleanup) {
111
+ this.scheduleCleanup(id);
112
+ }
113
+ this.emit('sessionCreated', id, context);
114
+ logger.info(`Session created: ${id}`, {
115
+ metadata: Object.keys(metadata),
116
+ totalSessions: this.metrics.activeSessions
117
+ });
118
+ return context;
119
+ }
120
+ /**
121
+ * Get session context with access validation
122
+ */
123
+ getSession(sessionId, requireActive = true) {
124
+ const session = this.sessions.get(sessionId);
125
+ if (!session) {
126
+ return null;
127
+ }
128
+ if (requireActive && session.analysis.status === 'failed') {
129
+ return null;
130
+ }
131
+ // Update activity
132
+ session.lastActivity = Date.now();
133
+ return session;
134
+ }
135
+ /**
136
+ * Subscribe to session events with connection management
137
+ */
138
+ async subscribe(sessionId, subscriber) {
139
+ const session = this.getSession(sessionId);
140
+ if (!session) {
141
+ logger.warn(`Subscription attempt to non-existent session: ${sessionId}`);
142
+ return false;
143
+ }
144
+ // Check connection limits
145
+ if (session.connectionCount >= session.maxConnections) {
146
+ logger.warn(`Connection limit exceeded for session ${sessionId} (${session.connectionCount}/${session.maxConnections})`);
147
+ return false;
148
+ }
149
+ // Add subscriber
150
+ session.subscribers.add(subscriber);
151
+ session.connectionCount++;
152
+ session.resources.connectionTime = Date.now();
153
+ this.metrics.totalSubscribers++;
154
+ // Send backlog to new subscriber
155
+ const backlog = session.eventBuffer.getBacklog(sessionId, 50); // Last 50 events
156
+ for (const event of backlog) {
157
+ await subscriber.emit(event);
158
+ }
159
+ this.emit('subscriberConnected', { sessionId, subscriber });
160
+ this.emit('sessionActivity', { sessionId, activity: 'subscriber_connected' });
161
+ logger.debug(`Subscriber connected to session ${sessionId} (${session.connectionCount} total)`);
162
+ return true;
163
+ }
164
+ /**
165
+ * Unsubscribe from session events
166
+ */
167
+ unsubscribe(sessionId, subscriberId) {
168
+ const session = this.getSession(sessionId, false);
169
+ if (!session) {
170
+ return false;
171
+ }
172
+ // Find and remove subscriber
173
+ let found = false;
174
+ for (const subscriber of session.subscribers) {
175
+ if (subscriber.id === subscriberId) {
176
+ session.subscribers.delete(subscriber);
177
+ session.connectionCount--;
178
+ this.metrics.totalSubscribers--;
179
+ found = true;
180
+ // Close subscriber connection
181
+ try {
182
+ subscriber.close();
183
+ }
184
+ catch (error) {
185
+ logger.warn(`Error closing subscriber ${subscriberId}:`, error);
186
+ }
187
+ break;
188
+ }
189
+ }
190
+ if (found) {
191
+ this.emit('subscriberDisconnected', { sessionId, subscriberId });
192
+ this.emit('sessionActivity', { sessionId, activity: 'subscriber_disconnected' });
193
+ logger.debug(`Subscriber ${subscriberId} disconnected from session ${sessionId}`);
194
+ }
195
+ return found;
196
+ }
197
+ /**
198
+ * Emit event to session with intelligent buffering
199
+ */
200
+ async emitToSession(sessionId, event) {
201
+ // Use the sessionId parameter, not event.sessionId
202
+ const session = this.getSession(sessionId);
203
+ if (!session) {
204
+ logger.warn(`Event for unknown session: ${sessionId}`);
205
+ return;
206
+ }
207
+ // Update session activity
208
+ session.lastActivity = Date.now();
209
+ session.analysis.metrics.totalEvents++;
210
+ session.resources.eventCount++;
211
+ // Update analysis state
212
+ this.updateAnalysisState(session, event);
213
+ // Add to buffer for intelligent delivery
214
+ session.eventBuffer.add(event);
215
+ // Update memory usage
216
+ session.resources.memoryUsage = session.eventBuffer.getState(sessionId)?.memoryUsage || 0;
217
+ // Update metrics immediately for real-time tracking
218
+ this.updateMetrics();
219
+ // Emit activity event
220
+ this.emit('sessionActivity', { sessionId, activity: 'event_received' });
221
+ logger.debug(`Event emitted to session ${sessionId}: ${event.type} from ${event.agent}`);
222
+ }
223
+ /**
224
+ * Start analysis tracking for session
225
+ */
226
+ startAnalysis(sessionId, agents) {
227
+ const session = this.getSession(sessionId);
228
+ if (!session) {
229
+ return false;
230
+ }
231
+ session.analysis.status = 'running';
232
+ session.analysis.activeAgents = new Set(agents);
233
+ session.analysis.startTime = Date.now();
234
+ this.emit('analysisStarted', { sessionId, agents });
235
+ logger.info(`Analysis started for session ${sessionId} with agents: ${agents.join(', ')}`);
236
+ return true;
237
+ }
238
+ /**
239
+ * Complete analysis for session
240
+ */
241
+ completeAnalysis(sessionId) {
242
+ const session = this.getSession(sessionId);
243
+ if (!session) {
244
+ return false;
245
+ }
246
+ session.analysis.status = 'complete';
247
+ session.analysis.endTime = Date.now();
248
+ session.analysis.progress.currentPhase = session.analysis.progress.totalPhases;
249
+ session.analysis.progress.phaseName = 'complete';
250
+ session.analysis.progress.phaseProgress = 100;
251
+ this.emit('analysisCompleted', { sessionId, analysis: session.analysis });
252
+ logger.info(`Analysis completed for session ${sessionId}`, {
253
+ duration: session.analysis.endTime - session.analysis.startTime,
254
+ findings: session.analysis.findings.length,
255
+ agents: Array.from(session.analysis.completedAgents)
256
+ });
257
+ return true;
258
+ }
259
+ /**
260
+ * Fail analysis for session
261
+ */
262
+ failAnalysis(sessionId, error) {
263
+ const session = this.getSession(sessionId, false);
264
+ if (!session) {
265
+ return false;
266
+ }
267
+ session.analysis.status = 'failed';
268
+ session.analysis.endTime = Date.now();
269
+ this.emit('analysisFailed', { sessionId, error });
270
+ this.emit('sessionError', { sessionId, error });
271
+ logger.error(`Analysis failed for session ${sessionId}:`, error.message);
272
+ return true;
273
+ }
274
+ /**
275
+ * Destroy session and cleanup resources
276
+ */
277
+ destroySession(sessionId) {
278
+ const session = this.sessions.get(sessionId);
279
+ if (!session) {
280
+ return false;
281
+ }
282
+ // Close all subscribers
283
+ for (const subscriber of session.subscribers) {
284
+ try {
285
+ subscriber.close();
286
+ }
287
+ catch (error) {
288
+ logger.warn(`Error closing subscriber during session cleanup:`, error);
289
+ }
290
+ }
291
+ // Cleanup timers
292
+ const timer = this.cleanupTimers.get(sessionId);
293
+ if (timer) {
294
+ clearTimeout(timer);
295
+ this.cleanupTimers.delete(sessionId);
296
+ }
297
+ // Cleanup buffer
298
+ session.eventBuffer.cleanup(sessionId);
299
+ // Remove session
300
+ this.sessions.delete(sessionId);
301
+ this.metrics.activeSessions--;
302
+ this.metrics.totalSubscribers -= session.connectionCount;
303
+ this.emit('sessionDestroyed', { sessionId });
304
+ logger.info(`Session destroyed: ${sessionId}`, {
305
+ lifetime: Date.now() - session.startTime,
306
+ events: session.resources.eventCount,
307
+ connections: session.connectionCount
308
+ });
309
+ return true;
310
+ }
311
+ /**
312
+ * Get all active sessions
313
+ */
314
+ getActiveSessions() {
315
+ return Array.from(this.sessions.values())
316
+ .filter(session => session.analysis.status !== 'failed');
317
+ }
318
+ /**
319
+ * Get session statistics
320
+ */
321
+ /**
322
+ * Get global system metrics
323
+ */
324
+ getGlobalMetrics() {
325
+ const bufferMetrics = this.globalBuffer.getMetrics();
326
+ return {
327
+ ...this.metrics,
328
+ uptime: Date.now() - this.metrics.uptime,
329
+ buffer: bufferMetrics,
330
+ sessions: Array.from(this.sessions.values()).map(s => ({
331
+ id: s.id,
332
+ status: s.analysis.status,
333
+ connections: s.connectionCount,
334
+ events: s.resources.eventCount,
335
+ memoryUsage: s.resources.memoryUsage
336
+ }))
337
+ };
338
+ }
339
+ /**
340
+ * Check if session exists
341
+ */
342
+ hasSession(sessionId) {
343
+ return this.sessions.has(sessionId);
344
+ }
345
+ /**
346
+ * Get session statistics
347
+ */
348
+ getSessionStats(sessionId) {
349
+ const session = this.getSession(sessionId);
350
+ if (!session) {
351
+ return null;
352
+ }
353
+ return {
354
+ eventsEmitted: session.resources.eventCount,
355
+ bufferStats: {
356
+ flushCount: session.eventBuffer.getState(sessionId)?.flushCount || 0
357
+ }
358
+ };
359
+ }
360
+ /**
361
+ * End analysis for session
362
+ */
363
+ endAnalysis(sessionId) {
364
+ const session = this.getSession(sessionId);
365
+ if (!session) {
366
+ return false;
367
+ }
368
+ session.analysis.status = 'complete';
369
+ session.analysis.endTime = Date.now();
370
+ this.emit('analysisCompleted', { sessionId, analysis: session.analysis });
371
+ return true;
372
+ }
373
+ /**
374
+ * Complete session (alias for endAnalysis)
375
+ */
376
+ completeSession(sessionId) {
377
+ return this.endAnalysis(sessionId);
378
+ }
379
+ /**
380
+ * Get global statistics
381
+ */
382
+ getGlobalStats() {
383
+ return {
384
+ ...this.metrics,
385
+ uptime: Date.now() - this.startTime
386
+ };
387
+ }
388
+ /**
389
+ * Shutdown session manager
390
+ */
391
+ shutdown() {
392
+ this.destroy();
393
+ }
394
+ /**
395
+ * Cleanup all resources
396
+ */
397
+ destroy() {
398
+ // Destroy all sessions
399
+ for (const sessionId of this.sessions.keys()) {
400
+ this.destroySession(sessionId);
401
+ }
402
+ // Clear all timers
403
+ for (const timer of this.cleanupTimers.values()) {
404
+ clearTimeout(timer);
405
+ }
406
+ this.cleanupTimers.clear();
407
+ // Remove all listeners
408
+ this.removeAllListeners();
409
+ logger.info('SessionChannelManager destroyed');
410
+ }
411
+ /**
412
+ * Update analysis state based on events
413
+ */
414
+ updateAnalysisState(session, event) {
415
+ const analysis = session.analysis;
416
+ // Track agent activity
417
+ if (event.agent) {
418
+ if (event.type === 'agent_start') {
419
+ analysis.activeAgents.add(event.agent);
420
+ }
421
+ else if (event.type === 'agent_complete') {
422
+ analysis.activeAgents.delete(event.agent);
423
+ analysis.completedAgents.add(event.agent);
424
+ }
425
+ else if (event.type === 'agent_error') {
426
+ analysis.activeAgents.delete(event.agent);
427
+ analysis.failedAgents.add(event.agent);
428
+ analysis.metrics.errorsCount++;
429
+ }
430
+ }
431
+ // Track findings
432
+ if (event.metadata?.contentType === 'finding') {
433
+ analysis.findings.push(event);
434
+ analysis.metrics.findingsCount++;
435
+ }
436
+ // Update progress based on phase
437
+ if (event.metadata?.phase) {
438
+ const phaseMap = {
439
+ 'starting': 0,
440
+ 'scanning': 1,
441
+ 'analyzing': 2,
442
+ 'synthesizing': 3,
443
+ 'complete': 4
444
+ };
445
+ const phaseNumber = phaseMap[event.metadata.phase];
446
+ if (phaseNumber !== undefined && phaseNumber > analysis.progress.currentPhase) {
447
+ analysis.progress.currentPhase = phaseNumber;
448
+ analysis.progress.phaseName = event.metadata.phase;
449
+ analysis.progress.phaseProgress = Math.round((phaseNumber / analysis.progress.totalPhases) * 100);
450
+ this.emit('analysisProgress', { sessionId: session.id, progress: analysis.progress });
451
+ }
452
+ }
453
+ // Update response time
454
+ const now = Date.now();
455
+ analysis.metrics.avgResponseTime = analysis.metrics.totalEvents > 0
456
+ ? (analysis.metrics.avgResponseTime * (analysis.metrics.totalEvents - 1) + (now - event.timestamp)) / analysis.metrics.totalEvents
457
+ : now - event.timestamp;
458
+ }
459
+ /**
460
+ * Schedule session cleanup
461
+ */
462
+ scheduleCleanup(sessionId) {
463
+ const session = this.sessions.get(sessionId);
464
+ if (!session || session.cleanup?.scheduled) {
465
+ return;
466
+ }
467
+ const timer = setTimeout(() => {
468
+ const currentSession = this.sessions.get(sessionId);
469
+ if (currentSession && Date.now() - currentSession.lastActivity > this.config.ttl) {
470
+ logger.info(`Auto-cleaning up inactive session: ${sessionId}`);
471
+ this.destroySession(sessionId);
472
+ }
473
+ }, this.config.ttl);
474
+ session.cleanup.timer = timer;
475
+ session.cleanup.scheduled = true;
476
+ this.cleanupTimers.set(sessionId, timer);
477
+ }
478
+ /**
479
+ * Setup global event handlers
480
+ */
481
+ setupEventHandlers() {
482
+ // Listen for buffer batch events
483
+ process.on('streaming-batch', (batch) => {
484
+ this.deliverBatch(batch);
485
+ });
486
+ // Handle uncaught errors
487
+ this.on('error', (error) => {
488
+ logger.error('SessionChannelManager error:', error);
489
+ });
490
+ }
491
+ /**
492
+ * Deliver event batch to session subscribers
493
+ */
494
+ async deliverBatch(batch) {
495
+ const session = this.getSession(batch.sessionId, false);
496
+ if (!session) {
497
+ return;
498
+ }
499
+ const deliveryPromises = [];
500
+ for (const subscriber of session.subscribers) {
501
+ if (subscriber.isConnected()) {
502
+ deliveryPromises.push(subscriber.emitBatch(batch).catch(error => {
503
+ logger.warn(`Failed to deliver batch to subscriber ${subscriber.id}:`, error);
504
+ // Auto-disconnect failed subscribers
505
+ this.unsubscribe(batch.sessionId, subscriber.id);
506
+ }));
507
+ }
508
+ }
509
+ await Promise.allSettled(deliveryPromises);
510
+ }
511
+ /**
512
+ * Start periodic maintenance tasks
513
+ */
514
+ startMaintenance() {
515
+ // Cleanup stale sessions every 5 minutes
516
+ setInterval(() => {
517
+ const now = Date.now();
518
+ const staleThreshold = this.config.ttl;
519
+ for (const [sessionId, session] of this.sessions.entries()) {
520
+ if (now - session.lastActivity > staleThreshold) {
521
+ logger.info(`Maintenance cleanup: stale session ${sessionId}`);
522
+ this.destroySession(sessionId);
523
+ }
524
+ }
525
+ }, 5 * 60 * 1000);
526
+ // Update metrics every minute
527
+ setInterval(() => {
528
+ this.updateMetrics();
529
+ }, 60 * 1000);
530
+ }
531
+ /**
532
+ * Update internal metrics
533
+ */
534
+ updateMetrics() {
535
+ this.metrics.activeSessions = this.sessions.size;
536
+ this.metrics.totalEvents = Array.from(this.sessions.values())
537
+ .reduce((sum, s) => sum + s.resources.eventCount, 0);
538
+ this.metrics.memoryUsage = Array.from(this.sessions.values())
539
+ .reduce((sum, s) => sum + s.resources.memoryUsage, 0);
540
+ this.metrics.totalSubscribers = Array.from(this.sessions.values())
541
+ .reduce((sum, s) => sum + s.connectionCount, 0);
542
+ }
543
+ }
544
+ // Export SessionManager as alias to SessionChannelManager for compatibility
545
+ export const SessionManager = SessionChannelManager;
546
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/streaming/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { EventEmitter } from 'events';
2
+ import { Request, Response } from 'express';
3
+ import { SessionManager } from './session-manager.js';
4
+ /**
5
+ * SSE connection metadata for tracking active streams
6
+ */
7
+ export interface SSEConnection {
8
+ id: string;
9
+ sessionId: string;
10
+ response: Response;
11
+ clientOrigin: string;
12
+ connectedAt: number;
13
+ lastActivity: number;
14
+ eventsSent: number;
15
+ isActive: boolean;
16
+ }
17
+ /**
18
+ * Enhanced Server-Sent Events transport with session isolation
19
+ *
20
+ * Features:
21
+ * - Session-scoped connections with isolation guarantees
22
+ * - Connection pooling with resource limits
23
+ * - Heartbeat monitoring and automatic cleanup
24
+ * - Graceful connection management
25
+ * - Event filtering and routing by session
26
+ * - Memory-efficient streaming with backpressure
27
+ */
28
+ export declare class EnhancedSSETransport extends EventEmitter {
29
+ private connections;
30
+ private sessionManager;
31
+ private heartbeatInterval;
32
+ private readonly MAX_CONNECTIONS;
33
+ private readonly HEARTBEAT_INTERVAL;
34
+ private readonly CONNECTION_TIMEOUT;
35
+ private readonly MAX_EVENTS_PER_CONNECTION;
36
+ constructor(sessionManager: SessionManager);
37
+ /**
38
+ * Establish SSE connection for a session
39
+ */
40
+ connect(req: Request, res: Response, sessionId: string): Promise<void>;
41
+ /**
42
+ * Handle streaming events from session manager
43
+ */
44
+ private handleSessionEvent;
45
+ /**
46
+ * Handle session completion
47
+ */
48
+ private handleSessionComplete;
49
+ /**
50
+ * Send streaming event to specific connection
51
+ */
52
+ private sendStreamingEvent;
53
+ /**
54
+ * Send buffered events for a newly connected session
55
+ */
56
+ private sendBufferedEvents;
57
+ /**
58
+ * Send raw SSE event
59
+ */
60
+ private sendEvent;
61
+ /**
62
+ * Disconnect and cleanup SSE connection
63
+ */
64
+ private disconnect;
65
+ /**
66
+ * Start heartbeat monitoring
67
+ */
68
+ private startHeartbeat;
69
+ /**
70
+ * Check connection health and cleanup stale connections
71
+ */
72
+ private checkConnectionHealth;
73
+ /**
74
+ * Get connection statistics
75
+ */
76
+ getStats(): {
77
+ totalConnections: number;
78
+ activeConnections: number;
79
+ sessionDistribution: Record<string, number>;
80
+ averageEventsPerConnection: number;
81
+ };
82
+ /**
83
+ * Force disconnect all connections for a session
84
+ */
85
+ disconnectSession(sessionId: string, reason?: string): void;
86
+ /**
87
+ * Cleanup and shutdown transport
88
+ */
89
+ shutdown(): void;
90
+ /**
91
+ * Get active connection for session (for testing)
92
+ */
93
+ getSessionConnections(sessionId: string): SSEConnection[];
94
+ }
95
+ //# sourceMappingURL=sse-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-transport.d.ts","sourceRoot":"","sources":["../../src/streaming/sse-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAkB,MAAM,sBAAsB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAA+B;IAGxD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAO;IACvC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAS;gBAEvC,cAAc,EAAE,cAAc;IAU1C;;OAEG;IACG,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkE5E;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,UAAU;IAsClB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4C7B;;OAEG;IACH,QAAQ,IAAI;QACV,gBAAgB,EAAE,MAAM,CAAC;QACzB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5C,0BAA0B,EAAE,MAAM,CAAC;KACpC;IAuBD;;OAEG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAsB,GAAG,IAAI;IASxE;;OAEG;IACH,QAAQ,IAAI,IAAI;IAiBhB;;OAEG;IACH,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;CAI1D"}