@gati-framework/runtime
Version:
Gati runtime execution engine for running handler-based applications
42 lines • 1.6 kB
JavaScript
/**
* @module runtime/websocket-coordinator
* @description WebSocket event coordinator for request synchronization
*/
import { EventEmitter } from 'events';
export class DefaultWebSocketCoordinator {
emitter = new EventEmitter();
pendingRequests = new Map();
async waitForEvent(requestId, eventType, timeout = 30000) {
const eventKey = `${requestId}:${eventType}`;
// Track pending request
if (!this.pendingRequests.has(requestId)) {
this.pendingRequests.set(requestId, new Set());
}
this.pendingRequests.get(requestId).add(eventType);
return new Promise((resolve, reject) => {
const timeoutId = setTimeout(() => {
this.emitter.removeListener(eventKey, resolve);
reject(new Error(`WebSocket event timeout: ${eventType} for request ${requestId}`));
}, timeout);
this.emitter.once(eventKey, (event) => {
clearTimeout(timeoutId);
resolve(event);
});
});
}
emitEvent(event) {
const eventKey = `${event.requestId}:${event.type}`;
this.emitter.emit(eventKey, event);
}
cleanup(requestId) {
const eventTypes = this.pendingRequests.get(requestId);
if (eventTypes) {
eventTypes.forEach(eventType => {
const eventKey = `${requestId}:${eventType}`;
this.emitter.removeAllListeners(eventKey);
});
this.pendingRequests.delete(requestId);
}
}
}
//# sourceMappingURL=websocket-coordinator.js.map