Files
cunkebao_v3/Backend/src/$ws.js
2025-03-18 14:39:17 +08:00

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)
})*/