gerson
2025-02-20 a762b59c2c4b459f72ede19716d476bb3513f622
src/utils/sse/SSEClient.ts
@@ -3,6 +3,8 @@
import { SESSION_KEY } from '../request';
import { Local } from '../storage';
import { debounce } from 'lodash-es';
import { Logger } from '/@/model/logger/Logger';
export interface SSEOptions {
   /** 重试延迟(ms) */
   retryDelay?: number;
@@ -28,10 +30,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 +49,20 @@
         },
         ...options,
      };
   }
   /**
    * 订阅消息
    */
   subscribe(handler: MessageHandler): void {
      this.messageHandlers.add(handler);
   }
   /**
    * 取消订阅消息
    */
   unsubscribe(handler: MessageHandler): void {
      this.messageHandlers.delete(handler);
   }
   /**
@@ -74,11 +93,12 @@
      if (!this.eventSource) return;
      this.eventSource.onopen = () => {
         console.log('连接成功');
         Logger.info('eventSource onopen:连接成功');
         this.callbacks.onOpen?.();
      };
      this.eventSource.onmessage = (event) => {
         Logger.info('eventSource onmessage:\n\n'+ event.data);
         try {
            const data = JSON.parse(event.data);
            // 检查是否是结束标记
@@ -86,6 +106,9 @@
               this.disconnect();
               return;
            }
            // 通知所有订阅者
            this.messageHandlers.forEach(handler => handler(data));
            // 调用原有的回调
            this.callbacks.onMessage?.(data);
         } catch (error) {
            console.error('Failed to parse SSE data:', error);
@@ -94,6 +117,7 @@
      };
      this.eventSource.onerror = async (error) => {
         Logger.error('eventSource onerror:\n\n'+ error);
      };
   }
@@ -113,8 +137,6 @@
         this.disconnect();
      }
   }
   /**
    * 断开连接