socket.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import { getToken } from '@/utils/auth'
  2. import { generateUUID } from '@/utils/geek';
  3. let _socket: UniApp.SocketTask;
  4. let _callback: { [key: string]: (data: any) => void } = {}
  5. const enableJSON = true // 开启JSON解析消息,需要开启JSON解析消息才能开启uuid和event
  6. const enableUUID = true // 需要接收信息中包含uuid字段,uuid优先级高于event
  7. const enableEvent = true // 需要接收信息中包含event字段
  8. interface ConnectSocketOption extends UniApp.ConnectSocketOption {
  9. headers: {
  10. isToken: boolean
  11. }
  12. }
  13. export default {
  14. /**
  15. * 连接websocket
  16. * 最简单的用法就是传入{url:"ws://demo"}
  17. * 当连接成功后触发回调函数
  18. */
  19. connect(options: ConnectSocketOption) {
  20. return new Promise((resolve, reject) => {
  21. const isToken = (options.headers || {}).isToken === false
  22. options.header = options.header || { 'content-type': 'application/json' }
  23. if (getToken() && !isToken) {
  24. options.header['Authorization'] = 'Bearer ' + getToken()
  25. }
  26. if(_socket !== undefined){
  27. _socket.close({})
  28. }
  29. _socket = uni.connectSocket({
  30. url: options.url,
  31. header: options.header,
  32. method: options.method || 'GET',
  33. fail: reject
  34. });
  35. _socket.onError(reject)
  36. _socket.onOpen(resolve)
  37. _socket.onMessage(res => {
  38. if(enableJSON){
  39. let data = JSON.parse((res || {}).data)
  40. if (enableUUID && (data || {}).uuid !== undefined) {
  41. _callback[data.uuid](data)
  42. } else if (enableEvent && (data || {}).event !== undefined) {
  43. _callback[data.event](data)
  44. }
  45. }
  46. })
  47. })
  48. },
  49. /**
  50. * 发送信息
  51. * @param msg 消息,会被处理成json字符串
  52. * @param uuid 唯一标识,可以传入uuid,也可以传入true自动生成uuid,flase表示该消息不需要单独处理
  53. * @returns
  54. */
  55. send(msg: any, uuid: string | boolean = false) {
  56. return new Promise((resolve, reject) => {
  57. if (enableUUID && uuid != undefined && uuid != "" && uuid != false) {
  58. if (uuid == true) {
  59. msg.uuid = generateUUID()
  60. _callback[msg.uuid] = resolve
  61. } else {
  62. _callback[uuid] = resolve
  63. }
  64. }
  65. _socket.send({
  66. data: JSON.stringify(msg),
  67. fail: reject
  68. })
  69. })
  70. },
  71. /**
  72. * 关闭连接
  73. * @returns 关闭连接的Promise,回调函数只会运行一次
  74. */
  75. close() {
  76. return new Promise((resolve, reject) => {
  77. let onclose = _socket.onClose
  78. _socket.onClose(res => {
  79. resolve(res)
  80. _socket.onClose = onclose
  81. })
  82. _socket.close({
  83. fail: reject
  84. })
  85. })
  86. },
  87. /**
  88. * 监听事件
  89. * @param event 要监听的事件
  90. * @returns 在回调函数中处理事件
  91. */
  92. on(event: string) {
  93. return new Promise((resolve) => {
  94. _callback[event] = resolve
  95. })
  96. },
  97. /**
  98. * 取消监听事件
  99. * @param event 要取消监听的事件
  100. */
  101. off(event: string) {
  102. delete _callback[event]
  103. },
  104. /**
  105. * 定义默认监听事件
  106. * @param callback 默认监听事件的处理函数
  107. */
  108. onMessage(callback: (data: any) => void) {
  109. _socket.onMessage(res => {
  110. if(enableJSON){
  111. let data = JSON.parse((res || {}).data)
  112. if (enableUUID && (data || {}).uuid !== undefined) {
  113. _callback[data.uuid](res)
  114. delete _callback[data.uuid]
  115. } else if (enableEvent && (data || {}).event !== undefined) {
  116. _callback[data.event](res)
  117. } else {
  118. callback(data)
  119. }
  120. }else{
  121. callback(res.data)
  122. }
  123. })
  124. },
  125. /**
  126. * 定义异常事件
  127. * @param callback 默认异常事件的处理函数
  128. */
  129. onError(callback: (data: any) => void) {
  130. _socket.onError(callback)
  131. },
  132. /**
  133. * 定义关闭事件
  134. * @param callback 默认关闭事件的处理函数
  135. */
  136. onClose(callback: (data: any) => void) {
  137. _socket.onError(callback)
  138. }
  139. };