| | |
| | | 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; |
| | |
| | | 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 = {}) { |
| | | // 设置默认值 |
| | |
| | | }, |
| | | ...options, |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * 订阅消息 |
| | | */ |
| | | subscribe(handler: MessageHandler): void { |
| | | this.messageHandlers.add(handler); |
| | | } |
| | | |
| | | /** |
| | | * 取消订阅消息 |
| | | */ |
| | | unsubscribe(handler: MessageHandler): void { |
| | | this.messageHandlers.delete(handler); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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); |
| | | // 检查是否是结束标记 |
| | |
| | | this.disconnect(); |
| | | return; |
| | | } |
| | | // 通知所有订阅者 |
| | | this.messageHandlers.forEach(handler => handler(data)); |
| | | // 调用原有的回调 |
| | | this.callbacks.onMessage?.(data); |
| | | } catch (error) { |
| | | console.error('Failed to parse SSE data:', error); |
| | |
| | | }; |
| | | |
| | | this.eventSource.onerror = async (error) => { |
| | | Logger.error('eventSource onerror:\n\n'+ error); |
| | | }; |
| | | } |
| | | |
| | |
| | | this.disconnect(); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 断开连接 |