@nestjsvn/swagger-sse
Version:
OpenAPI documentation and interactive Swagger UI for NestJS Server-Sent Events endpoints
99 lines (83 loc) • 4.59 kB
JavaScript
// 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');