130 lines
3.5 KiB
JavaScript
130 lines
3.5 KiB
JavaScript
import Vue from 'vue'
|
|
import config from '@/config/config'
|
|
|
|
var uuid = () => {
|
|
var s = [];
|
|
var hex = '0123456789abcdef'
|
|
for (var i = 0; i < 36; i++) {
|
|
s[i] = hex.substr(Math.floor(Math.random() * 0x10), 1)
|
|
}
|
|
s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
|
|
s[19] = hex.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
|
|
s[8] = s[13] = s[18] = s[23] = '-'
|
|
|
|
return s.join('');
|
|
}
|
|
|
|
var log = (message, contexts = {}, ex = null) => {
|
|
if (config.WS_DEBUG) {
|
|
if (typeof contexts === 'object') {
|
|
for (var k in contexts) {
|
|
message = message.replaceAll('{' + k + '}', typeof contexts[k] === 'object' ? JSON.stringify(contexts[k]) : contexts[k])
|
|
}
|
|
}
|
|
if (ex) {
|
|
console.log('[WebSocket] ' + message, ex)
|
|
} else {
|
|
console.log('[WebSocket] ' + message)
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
var callbacks = {}
|
|
var reqQueues = []
|
|
var connected = false
|
|
var websocket = null
|
|
var logininfo = {}
|
|
|
|
Vue.prototype.$wsConnect = (username, password, callback) => {
|
|
websocket = new WebSocket(config.WS_URL)
|
|
websocket.onmessage = (e) => {
|
|
log('recv: {data}', { data: e.data })
|
|
try {
|
|
var data = JSON.parse(e.data)
|
|
if (data['type'] === 'answer') {
|
|
if (callbacks[data['requestId']]) {
|
|
callbacks[data['requestId']](data['data'])
|
|
delete callbacks[data['requestId']];
|
|
}
|
|
}
|
|
} catch (ex) {
|
|
log('recv error: {data}', { data: e.data }, ex)
|
|
}
|
|
|
|
}
|
|
|
|
websocket.onopen = (e) => {
|
|
log('open: {e}', { e })
|
|
|
|
Vue.prototype.$wsReq('login', {
|
|
username: username,
|
|
password: password,
|
|
}, (ret) => {
|
|
if (typeof callback === 'function') {
|
|
callback(ret)
|
|
}
|
|
if (ret.ok) {
|
|
connected = true
|
|
logininfo = { username, password }
|
|
if (reqQueues.length > 0) {
|
|
for (let i = 0; i < reqQueues.length; i ++) {
|
|
Vue.prototype.$wsSend(reqQueues[i])
|
|
}
|
|
}
|
|
} else {
|
|
websocket.close()
|
|
log('login error: {ret}', { ret })
|
|
}
|
|
}, true)
|
|
}
|
|
websocket.onclose = (e) => {
|
|
connected = false
|
|
|
|
log('close: {e}', { e })
|
|
if (logininfo) {
|
|
log('reconnect in three seconds')
|
|
setTimeout(() => {
|
|
Vue.prototype.$wsConnect(logininfo.username, logininfo.password)
|
|
}, 3000)
|
|
}
|
|
}
|
|
websocket.onerror = (e) => {
|
|
log('error: {e}', { e })
|
|
}
|
|
}
|
|
|
|
Vue.prototype.$wsSend = (message, force = false) => {
|
|
if (connected || force) {
|
|
websocket.send(message)
|
|
} else {
|
|
reqQueues.push(message)
|
|
}
|
|
}
|
|
|
|
Vue.prototype.$wsReq = (type, data, callback, force = false) => {
|
|
var reqId = uuid();
|
|
var message = JSON.stringify(Object.assign(config.WS_REQ_PARAMS, {
|
|
type: type,
|
|
requestId: reqId,
|
|
data: data,
|
|
}))
|
|
|
|
if (typeof callback == 'function') {
|
|
callbacks[reqId] = callback
|
|
}
|
|
|
|
log('send: {message}', { message })
|
|
|
|
Vue.prototype.$wsSend(message, force)
|
|
}
|
|
|
|
Vue.prototype.$wsClose = () => {
|
|
logininfo = { username: '', password: '' }
|
|
connected = false
|
|
websocket.close()
|
|
}
|
|
|
|
/*Vue.prototype.$wsConnect('test', '123456', (ret) => {
|
|
console.log('haha', ret)
|
|
})*/ |