gaoluyang
3 天以前 92230c9a97dc9ce9df3313d11d26999c04bb6b26
src/plugins/socketclient.ts
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,147 @@
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 å”¯ä¸€æ ‡è¯†,可以传入uuid,也可以传入true自动生成uuid,flase表示该消息不需要单独处理
     * @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)
    }
};