99 lines
2.3 KiB
JavaScript
99 lines
2.3 KiB
JavaScript
|
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
})
|