refactor: SSE 连接增加 401/403 不重连、无 token 定时重试、流异常重连

This commit is contained in:
Ray.Hao
2026-07-30 18:43:45 +08:00
parent 1ff46bc33b
commit 4403380d49
8 changed files with 239 additions and 85 deletions

View File

@@ -1,65 +1,61 @@
import { useDictStoreHook } from "@/stores/dict";
import { useSse } from "./useSse";
import { SseTopics } from "./sseTopics";
/** 字典变更消息体 */
export interface DictChangeMessage {
/** 字典编码 */
dictCode: string;
timestamp: number;
}
export type DictMessage = DictChangeMessage;
/** 字典变更回调函数类型 */
export type DictChangeCallback = (message: DictChangeMessage) => void;
let singletonInstance: ReturnType<typeof createDictSyncComposable> | null = null;
let globalInstance: ReturnType<typeof createDictSyncComposable> | null = null;
function createDictSyncComposable() {
const dictStore = useDictStoreHook();
const sse = useSse();
const messageCallbacks = ref<DictChangeCallback[]>([]);
const callbacks: DictChangeCallback[] = [];
let unsubscribe: (() => void) | null = null;
const handleDictChangeMessage = (data: DictChangeMessage) => {
// 处理字典变更消息:清除指定字典缓存,并通知所有已注册回调
const handleDictChange = (data: DictChangeMessage) => {
const { dictCode } = data;
if (!dictCode) {
console.warn("[DictSync] 收到无效的字典变更消息:缺少 dictCode");
return;
}
dictStore.removeDictItem(dictCode);
messageCallbacks.value.forEach((callback) => {
callbacks.forEach((cb) => {
try {
callback(data);
} catch (error) {
console.error("[DictSync] 回调函数执行失败:", error);
cb(data);
} catch (err) {
console.error("[DictSync] 回调执行失败:", err);
}
});
};
// 订阅 SSE 字典变更事件
const initialize = () => {
sse.connect();
unsubscribe = sse.on("dict", handleDictChangeMessage);
unsubscribe = sse.on(SseTopics.DICT, handleDictChange);
};
// 取消 SSE 订阅并清空所有回调
const cleanup = () => {
if (unsubscribe) {
unsubscribe();
unsubscribe = null;
}
messageCallbacks.value = [];
unsubscribe?.();
unsubscribe = null;
callbacks.length = 0;
};
const onDictChange = (callback: DictChangeCallback) => {
messageCallbacks.value.push(callback);
// 注册字典变更回调,返回取消注册函数
const onDictChange = (cb: DictChangeCallback) => {
callbacks.push(cb);
return () => {
const index = messageCallbacks.value.indexOf(callback);
if (index !== -1) {
messageCallbacks.value.splice(index, 1);
}
const idx = callbacks.indexOf(cb);
if (idx !== -1) callbacks.splice(idx, 1);
};
};
@@ -74,10 +70,15 @@ function createDictSyncComposable() {
/**
* 字典同步组合式函数(单例模式)
*
* 监听 SSE 字典变更事件,收到变更时自动清除对应字典缓存,
* 并通知所有已注册的回调函数。
*
* @returns 字典同步实例,包含连接状态、初始化、清理和回调注册方法
*/
export function useDictSync() {
if (!singletonInstance) {
singletonInstance = createDictSyncComposable();
if (!globalInstance) {
globalInstance = createDictSyncComposable();
}
return singletonInstance;
return globalInstance;
}