new-ruoyi-geek/ruoyi-geek-app/plugins/socketclient.ts

147 lines
4.7 KiB
TypeScript
Raw Normal View History

2025-11-15 13:07:57 +00:00
import { getToken } from '@/utils/auth'
import { generateUUID } from '@/utils/geek';
let _client: UniApp.SocketTask;
let _callback: { [key: string]: (data: any) => void } = {}
const enableJSON = true // 开启JSON解析消息需要开启JSON解析消息才能开启uuid和event
const enableJSONEncoding = true // 开启JSON消息编码
const enableUUID = true // 需要接收信息中包含uuid字段uuid优先级高于event
const enableEvent = true // 需要接收信息中包含event字段
export interface SocketConnectConfig extends UniApp.ConnectSocketOption {
headers: {
isToken: boolean
}
}
export default {
/**
* websocket
* {url:"ws://demo"}
*
*/
connect(config: SocketConnectConfig) {
return new Promise((resolve, reject) => {
const isToken = (config.headers || {}).isToken === false
config.header = config.header || { 'content-type': 'application/json' }
if (getToken() && !isToken) {
config.header['Authorization'] = 'Bearer ' + getToken()
}
if(_client !== undefined){
_client.close({})
}
_client = uni.connectSocket({
url: config.url,
header: config.header,
method: config.method || 'GET',
fail: reject
});
_client.onError(reject)
_client.onOpen(resolve)
_client.onMessage(res => {
if(enableJSON){
let data = JSON.parse((res || {}).data)
if (enableUUID && (data || {}).uuid !== undefined) {
_callback[data.uuid](data)
} else if (enableEvent && (data || {}).event !== undefined) {
_callback[data.event](data)
}
}
})
})
},
/**
*
* @param msg json字符串
* @param uuid ,uuidtrue自动生成uuidflase表示该消息不需要单独处理
* @returns
*/
send(msg: any, uuid: string | boolean = false) {
return new Promise((resolve, reject) => {
if(enableJSONEncoding){
msg = JSON.stringify(msg)
}
if (enableUUID && uuid != undefined && uuid != "" && uuid != false) {
if (uuid === true) {
msg.uuid = generateUUID()
_callback[msg.uuid] = resolve
} else {
_callback[uuid] = resolve
}
}
_client.send({
data: JSON.stringify(msg),
fail: reject
})
})
},
/**
*
* @returns Promise
*/
close() {
return new Promise((resolve, reject) => {
let onclose = _client.onClose
_client.onClose(res => {
resolve(res)
_client.onClose = onclose
})
_client.close({
fail: reject
})
})
},
/**
*
* @param event
* @returns
*/
subscribe(event: string) {
return new Promise((resolve) => {
_callback[event] = resolve
})
},
/**
*
* @param event
*/
unsubscribe(event: string) {
delete _callback[event]
},
/**
*
* @param callback
*/
onMessage(callback: (data: any) => void) {
_client.onMessage(res => {
if(enableJSON){
let data = JSON.parse((res || {}).data)
if (enableUUID && (data || {}).uuid !== undefined) {
_callback[data.uuid](res)
delete _callback[data.uuid]
} else if (enableEvent && (data || {}).event !== undefined) {
_callback[data.event](res)
} else {
callback(data)
}
}else{
callback(res.data)
}
})
},
/**
*
* @param callback
*/
onError(callback: (data: any) => void) {
_client.onError(callback)
},
/**
*
* @param callback
*/
onClose(callback: () => void) {
_client.onError(callback)
}
};