| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- import { WebSocketServer, WebSocket } from 'ws';
- import { Server } from 'http';
- import { ImportProgress } from './types';
- export class ImportProgressServer {
- private wss: WebSocketServer | null = null;
- private clients: Set<WebSocket> = 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();
|