123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- import { getToken } from '@/utils/auth'
- import { generateUUID } from '@/utils/geek';
- let _socket: UniApp.SocketTask;
- let _callback: { [key: string]: (data: any) => void } = {}
- const enableJSON = true // 开启JSON解析消息,需要开启JSON解析消息才能开启uuid和event
- const enableUUID = true // 需要接收信息中包含uuid字段,uuid优先级高于event
- const enableEvent = true // 需要接收信息中包含event字段
- interface ConnectSocketOption extends UniApp.ConnectSocketOption {
- headers: {
- isToken: boolean
- }
- }
- export default {
- /**
- * 连接websocket
- * 最简单的用法就是传入{url:"ws://demo"}
- * 当连接成功后触发回调函数
- */
- connect(options: ConnectSocketOption) {
- return new Promise((resolve, reject) => {
- const isToken = (options.headers || {}).isToken === false
- options.header = options.header || { 'content-type': 'application/json' }
- if (getToken() && !isToken) {
- options.header['Authorization'] = 'Bearer ' + getToken()
- }
- if(_socket !== undefined){
- _socket.close({})
- }
- _socket = uni.connectSocket({
- url: options.url,
- header: options.header,
- method: options.method || 'GET',
- fail: reject
- });
- _socket.onError(reject)
- _socket.onOpen(resolve)
- _socket.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 (enableUUID && uuid != undefined && uuid != "" && uuid != false) {
- if (uuid == true) {
- msg.uuid = generateUUID()
- _callback[msg.uuid] = resolve
- } else {
- _callback[uuid] = resolve
- }
- }
- _socket.send({
- data: JSON.stringify(msg),
- fail: reject
- })
- })
- },
- /**
- * 关闭连接
- * @returns 关闭连接的Promise,回调函数只会运行一次
- */
- close() {
- return new Promise((resolve, reject) => {
- let onclose = _socket.onClose
- _socket.onClose(res => {
- resolve(res)
- _socket.onClose = onclose
- })
- _socket.close({
- fail: reject
- })
- })
- },
- /**
- * 监听事件
- * @param event 要监听的事件
- * @returns 在回调函数中处理事件
- */
- on(event: string) {
- return new Promise((resolve) => {
- _callback[event] = resolve
- })
- },
- /**
- * 取消监听事件
- * @param event 要取消监听的事件
- */
- off(event: string) {
- delete _callback[event]
- },
- /**
- * 定义默认监听事件
- * @param callback 默认监听事件的处理函数
- */
- onMessage(callback: (data: any) => void) {
- _socket.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) {
- _socket.onError(callback)
- },
- /**
- * 定义关闭事件
- * @param callback 默认关闭事件的处理函数
- */
- onClose(callback: (data: any) => void) {
- _socket.onError(callback)
- }
- };
|