import { watch } from 'vue';
|
import { useEventSource } from '@vueuse/core';
|
import useNoticeStore from '@/store/modules/notice';
|
import { $t } from '@/locales';
|
import { localStg } from './storage';
|
|
/**
|
* 初始化 SSE
|
*
|
* @param url - SSE 地址
|
*/
|
export const initSSE = (url: string) => {
|
const token = localStg.get('token');
|
if (import.meta.env.VITE_APP_SSE === 'N' || !token) {
|
return;
|
}
|
const sseUrl = `${url}?Authorization=Bearer ${token}&clientid=${import.meta.env.VITE_APP_CLIENT_ID}`;
|
const { data, error } = useEventSource(sseUrl, [], {
|
autoReconnect: {
|
retries: 5,
|
delay: 5000,
|
onFailed() {
|
// eslint-disable-next-line no-console
|
console.warn('Failed to connect to SSE after 5 attempts.');
|
}
|
}
|
});
|
|
watch(error, () => {
|
if (!error.value || error.value?.isTrusted) {
|
return;
|
}
|
// eslint-disable-next-line no-console
|
console.error('SSE connection error:\n', error.value);
|
error.value = null;
|
});
|
|
watch(data, () => {
|
if (!data.value) return;
|
useNoticeStore().addNotice({
|
message: data.value,
|
read: false,
|
time: new Date().toLocaleString()
|
});
|
let content = data.value;
|
const noticeType = content.match(/\[dict\.(.*?)\]/)?.[1];
|
if (noticeType) {
|
content = content.replace(`dict.${noticeType}`, $t(`dict.${noticeType}` as App.I18n.I18nKey));
|
}
|
window.$notification?.create({
|
title: '消息',
|
content,
|
type: 'success',
|
duration: 3000
|
});
|
data.value = null;
|
});
|
};
|