function newUUID () { /* eslint-disable */ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = Math.random() * 16 | 0, v = c === 'x' ? r : r & 0x3 | 0x8; return v.toString(16); }); /* eslint-enable */ } const store = new Vuex.Store({ state: { socket: { _session: localStorage.getItem('session'), isConnected: false, reconnectError: false, eventMSGID: {}, eventTo: {}, } }, mutations:{ SOCKET_ONOPEN (state, event) { state.socket.isConnected = true }, SOCKET_ONCLOSE (state, event) { state.socket.isConnected = false }, SOCKET_ONERROR (state, event) { console.error(state, event) }, // default handler called for all methods SOCKET_ONMESSAGE (state, msg) { if (msg.subject === 'session_init') { if (state.socket._session === null) { state.socket._session = newUUID(); localStorage.setItem('session', state.socket._session); } msg.id = state.socket._session; Vue.prototype.$socket.sendObj(msg); return; } const msgFunc = eventMSGID[msg.id]; if (msgFunc) { msgFunc(msg); delete eventMSGID[msg.id]; return; } const eventFuncs = eventTo[msg.subject]; if (typeof eventFuncs === 'object' && eventFuncs.length > 0) { for (const key in eventFuncs) { const func = eventFuncs[key]; if (func) { func(msg); } } return; } console.log(`unable to identify message: ${msg.subject}`); }, // mutations for reconnect methods SOCKET_RECONNECT(state, count) { console.info(state, count) }, SOCKET_RECONNECT_ERROR(state) { state.socket.reconnectError = true; }, setEvent (state, to, func) { state.socket.eventTo[to] = [func]; }, addEvent (state, to, func) { if (typeof state.socket.eventTo[to] !== 'object') { state.socket.eventTo[to] = []; } state.socket.eventTo[to].push(func); }, delEvent (state, to, func) { if (typeof state.socket.eventTo[to] === 'object' && eventTo[to].length > 1) { state.socket.eventTo[to].pop(func); } else { state.socket.eventTo[to] = []; } }, call (state, msg, callback) { if (!msg.id) { msg.id = newUUID(); } const ret = Vue.prototype.$socket.sendObj(msg); if (typeof callback === 'function') { state.socket.eventMSGID[msg.id] = callback; } return ret; } } })