import { ElMessage } from 'element-plus' // import EventSourcePolyfill from 'event-source-polyfill' import 'event-source-polyfill/src/eventsource' import { getToken } from './cookie' import store from '../../store' export default class Sse { source = null /** * 需在vuex中确认有user对象后才能初始化,否则不连接服务器 * 注意: sse单独走自己的请求路线,不与axios重合,所以axios里面的配置在此处失效 * @param {string} url sse全路径 * @param {Array} events 当前用户可监听的路径 */ constructor(url, events) { /* eslint-disable no-undef */ console.log(url, events) this.source = new EventSourcePolyfill(url, { headers: { Authorization: getToken('access_token'), }, }) this.open() events.forEach(event => { this.addEventListener(event) }) } open() { this.source.onopen = event => { console.log('sse opened', event) } } error() { this.source.onerror = event => { console.log('error', event) } } addEventListener(eventName) { this.source.addEventListener(eventName, event => { // console.log('receive one message: ', event.data) // console.log('receive one message: ', event.lastEventId) store.commit('MARK_UNREAD_MESSAGE', { data: event.data, id: event.lastEventId }) ElMessage.warning(JSON.parse(event.data).message) }) } }