UNPKG

@nestjsvn/swagger-sse

Version:

OpenAPI documentation and interactive Swagger UI for NestJS Server-Sent Events endpoints

99 lines (83 loc) 4.59 kB
// Copy the existing content and replace with Approach 1 // This is the section that needs to be replaced in the main file // APPROACH 1: Proxy-based EventSource Wrapper (most comprehensive) const originalEventSource = new EventSource(url); const capturedEventTypes = new Set(); // Create a Proxy that intercepts ALL interactions with EventSource eventSource = new Proxy(originalEventSource, { get(target, prop) { if (prop === 'addEventListener') { return function(type, listener, options) { console.log(`Enhanced SSE Plugin: Proxy intercepted addEventListener for: ${type}`); // Auto-capture any new event type if (!capturedEventTypes.has(type) && type !== 'open' && type !== 'error') { capturedEventTypes.add(type); console.log(`Enhanced SSE Plugin: Auto-registering universal handler for: ${type}`); // Add universal handler target.addEventListener(type, (event) => { console.log(`Enhanced SSE Plugin: Universal proxy handler caught ${type}:`, event); addEvent(type, event.data, event); }); } // Call original return target.addEventListener(type, listener, options); }; } // Intercept any property access that might be event handlers if (typeof prop === 'string' && prop.startsWith('on') && prop !== 'onopen' && prop !== 'onerror' && prop !== 'onmessage') { const eventType = prop.substring(2); // Remove 'on' prefix if (!capturedEventTypes.has(eventType)) { capturedEventTypes.add(eventType); console.log(`Enhanced SSE Plugin: Auto-detected event type from property access: ${eventType}`); // Pre-register handler target.addEventListener(eventType, (event) => { console.log(`Enhanced SSE Plugin: Property-based handler caught ${eventType}:`, event); addEvent(eventType, event.data, event); }); } } return target[prop]; }, set(target, prop, value) { // Intercept event handler assignments like eventSource.onCustomEvent = handler if (typeof prop === 'string' && prop.startsWith('on') && prop !== 'onopen' && prop !== 'onerror' && prop !== 'onmessage') { const eventType = prop.substring(2); if (!capturedEventTypes.has(eventType)) { capturedEventTypes.add(eventType); console.log(`Enhanced SSE Plugin: Auto-detected event type from assignment: ${eventType}`); // Pre-register universal handler target.addEventListener(eventType, (event) => { console.log(`Enhanced SSE Plugin: Assignment-based handler caught ${eventType}:`, event); addEvent(eventType, event.data, event); }); } } target[prop] = value; return true; } }); // Standard EventSource event handlers eventSource.onopen = event => { console.log('Enhanced SSE Plugin: Connection opened', event); updateStatus('connected'); connectBtn.disabled = true; disconnectBtn.disabled = false; announceToScreenReader('Connected to server'); }; eventSource.onerror = error => { console.error('Enhanced SSE Plugin: Connection error:', error); updateStatus('error'); connectBtn.disabled = false; disconnectBtn.disabled = true; announceToScreenReader('Connection error occurred'); }; eventSource.onmessage = event => { console.log('Enhanced SSE Plugin: Default message received:', event); addEvent('message', event.data, event); }; // Proactively register for common event types to kick-start the proxy const commonEventTypes = ['user-event', 'system-event', 'simple-event']; commonEventTypes.forEach(type => { eventSource.addEventListener(type, () => {}); // This will trigger proxy handler }); console.log('Enhanced SSE Plugin: Proxy-based EventSource wrapper initialized');