From a762b59c2c4b459f72ede19716d476bb3513f622 Mon Sep 17 00:00:00 2001 From: gerson <1405270578@qq.com> Date: 星期四, 20 二月 2025 08:27:57 +0800 Subject: [PATCH] 获取位置 --- src/utils/sse/SSEClient.ts | 45 +++++++++++++++++++++++++++------------------ 1 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/utils/sse/SSEClient.ts b/src/utils/sse/SSEClient.ts index 2812458..5e727f7 100644 --- a/src/utils/sse/SSEClient.ts +++ b/src/utils/sse/SSEClient.ts @@ -1,9 +1,10 @@ import type { AxiosRequestConfig } from 'axios'; -import { EventSourcePolyfill } from 'event-source-polyfill'; import { accessSessionKey } from '../request'; 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; @@ -29,22 +30,39 @@ 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 = {}) { // 璁剧疆榛樿鍊� this.options = { retryDelay: 1000, autoReconnect: true, - timeout: 24 * 60 * 60 * 1000, + timeout: 3000, headers: { [SESSION_KEY]: Local.get(accessSessionKey), }, ...options, }; + } + + /** + * 璁㈤槄娑堟伅 + */ + subscribe(handler: MessageHandler): void { + this.messageHandlers.add(handler); + } + + /** + * 鍙栨秷璁㈤槄娑堟伅 + */ + unsubscribe(handler: MessageHandler): void { + this.messageHandlers.delete(handler); } /** @@ -58,19 +76,13 @@ // 鍒涘缓 AbortController 鐢ㄤ簬瓒呮椂鎺у埗 // this.abortController = new AbortController(); - // 鍒涘缓 EventSource 骞舵坊鍔� headers - this.eventSource = new EventSourcePolyfill(fullUrl, { - headers: this.options.headers, - heartbeatTimeout: this.options.timeout, - - }); + this.eventSource = new EventSource(fullUrl); // 缁戝畾浜嬩欢澶勭悊 this.bindEvents(); } catch (error) { console.log('catch error'); - await this.debounceHandleError.call(this, error); } } @@ -81,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); // 妫�鏌ユ槸鍚︽槸缁撴潫鏍囪 @@ -93,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); @@ -101,9 +117,7 @@ }; this.eventSource.onerror = async (error) => { - console.log('on error'); - - await this.debounceHandleError.call(this, error); + Logger.error('eventSource onerror锛歕n\n'+ error); }; } @@ -111,7 +125,6 @@ * 閿欒澶勭悊 */ private async handleError(error: any): Promise<void> { - console.log('馃殌 ~ error:', error); this.callbacks.onError?.(error); if (this.options.autoReconnect) { this.callbacks.onRetry?.(); @@ -124,10 +137,6 @@ this.disconnect(); } } - - private debounceHandleError = debounce((error: any) => { - this.handleError(error); - }, 500); /** * 鏂紑杩炴帴 -- Gitblit v1.9.3