/* eslint-disable @typescript-eslint/no-explicit-any */ import { WebSocketServer, WebSocket } from 'ws'; import { Server } from 'http'; import { ImportProgress } from './types'; export class ImportProgressServer { private wss: WebSocketServer | null = null; private clients: Set = new Set(); constructor() { // Initialize WebSocket server this.setupWebSocketServer(); } private setupWebSocketServer() { // This will be initialized when the HTTP server is available // For now, we'll create a standalone WebSocket server this.wss = new WebSocketServer({ port: 8080 }); this.wss.on('connection', (ws: WebSocket) => { console.log('New WebSocket connection established'); this.clients.add(ws); ws.on('close', () => { console.log('WebSocket connection closed'); this.clients.delete(ws); }); ws.on('error', (error) => { console.error('WebSocket error:', error); this.clients.delete(ws); }); }); console.log('WebSocket server started on port 8080'); } // Alternative method to attach to existing HTTP server attachToServer(server: Server) { if (this.wss) { this.wss.close(); } this.wss = new WebSocketServer({ server, path: '/api/imports/progress' }); this.wss.on('connection', (ws: WebSocket, request) => { console.log('New WebSocket connection on import progress endpoint'); this.clients.add(ws); // Handle specific import ID subscriptions const url = new URL(request.url || '', `http://${request.headers.host}`); const importId = url.searchParams.get('importId'); if (importId) { ws.send(JSON.stringify({ type: 'connected', importId: parseInt(importId), message: 'Connected to import progress updates' })); } ws.on('close', () => { console.log('WebSocket connection closed'); this.clients.delete(ws); }); ws.on('error', (error) => { console.error('WebSocket error:', error); this.clients.delete(ws); }); }); } broadcastProgress(importId: number, progress: ImportProgress) { const message = JSON.stringify({ type: 'progress', importId, progress }); this.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(message); } }); } broadcastError(importId: number, error: string) { const message = JSON.stringify({ type: 'error', importId, error }); this.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(message); } }); } broadcastComplete(importId: number, result: any) { const message = JSON.stringify({ type: 'complete', importId, result }); this.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) { client.send(message); } }); } close() { if (this.wss) { this.wss.close(); this.clients.clear(); } } } // Export a singleton instance export const progressServer = new ImportProgressServer();