wujingjing
2025-01-17 7fbce1ecd95b4e12ceda0a5b874ec8f3951625f7
src/utils/sse/SSEClient.ts
@@ -3,6 +3,7 @@
import { SESSION_KEY } from '../request';
import { Local } from '../storage';
import { debounce } from 'lodash-es';
export interface SSEOptions {
   /** 重试延迟(ms) */
   retryDelay?: number;
@@ -28,10 +29,13 @@
   onRetry?: () => void;
}
export type MessageHandler = (data: any) => void;
export class SSEClient {
   private eventSource: EventSource | null = null;
   private reconnectTimeout: number | null = null;
   private abortController: AbortController | null = null;
   private messageHandlers: Set<MessageHandler> = new Set();
   constructor(private url: string, private options: SSEOptions = {}, private callbacks: SSEEventCallbacks = {}) {
      // 设置默认值
@@ -44,6 +48,20 @@
         },
         ...options,
      };
   }
   /**
    * 订阅消息
    */
   subscribe(handler: MessageHandler): void {
      this.messageHandlers.add(handler);
   }
   /**
    * 取消订阅消息
    */
   unsubscribe(handler: MessageHandler): void {
      this.messageHandlers.delete(handler);
   }
   /**
@@ -86,6 +104,9 @@
               this.disconnect();
               return;
            }
            // 通知所有订阅者
            this.messageHandlers.forEach(handler => handler(data));
            // 调用原有的回调
            this.callbacks.onMessage?.(data);
         } catch (error) {
            console.error('Failed to parse SSE data:', error);
@@ -113,8 +134,6 @@
         this.disconnect();
      }
   }
   /**
    * 断开连接