websocket.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. var app = getApp();
  2. const api = require('../config/api.js');
  3. const util = require('../utils/util.js');
  4. var SocketTask
  5. var socketOpen = false
  6. var badge = 0
  7. /**
  8. * 创建websocket连接
  9. */
  10. function wsConnect() {
  11. let that = this
  12. var openId = wx.getStorageSync('userInfo').openId
  13. // 创建Socket
  14. return new Promise(function(resolve, reject) {
  15. SocketTask = wx.connectSocket({
  16. url: api.ChatWs + '/' + openId,
  17. header: {
  18. 'content-type': 'application/json',
  19. 'Authorization': wx.getStorageSync('token')
  20. },
  21. method: 'post',
  22. success: function(res) {
  23. console.log('WebSocket连接创建', res)
  24. listenBadge()
  25. },
  26. fail: function(err) {
  27. wx.showToast({
  28. title: '网络异常!',
  29. })
  30. console.log("err")
  31. reject("网络异常!")
  32. },
  33. })
  34. console.log(SocketTask)
  35. socketTask(SocketTask)
  36. resolve(SocketTask)
  37. })
  38. }
  39. function wsClose() {
  40. wx.closeSocket()
  41. }
  42. /**
  43. * 监听websocket状态
  44. */
  45. function socketTask(SocketTask) {
  46. let that = this
  47. SocketTask.onOpen(res => {
  48. socketOpen = true;
  49. console.log('监听 WebSocket 连接打开事件。', res)
  50. })
  51. SocketTask.onClose(onClose => {
  52. console.log('监听 WebSocket 连接关闭事件。', onClose)
  53. socketOpen = false;
  54. // that.wsConnect()
  55. })
  56. SocketTask.onError(onError => {
  57. console.log('监听 WebSocket 错误。错误信息', onError)
  58. socketOpen = false
  59. })
  60. SocketTask.onMessage(onMessage => {
  61. console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data))
  62. })
  63. }
  64. function sendMessage(data) {
  65. var that = this;
  66. return new Promise(function(resolve, reject) {
  67. if (socketOpen) {
  68. wx.sendSocketMessage({
  69. data: data,
  70. success: res => {
  71. resolve(res);
  72. },
  73. fail: res => {
  74. reject(res);
  75. }
  76. })
  77. } else {
  78. reject("未建立websocket连接");
  79. }
  80. })
  81. }
  82. function listenBadge() {
  83. // return new Promise(function (resolve, reject) {
  84. wx.onSocketMessage(onMessage => {
  85. var res = JSON.parse(onMessage.data)
  86. if (res.errno === 0) {
  87. if (res.data.messageType == 3 && res.data.messageBody != 0) {
  88. badge = res.data.messageBody
  89. wx.setTabBarBadge({
  90. index: 3,
  91. text: badge + ""
  92. })
  93. console.log("初始化未读数badge : " + badge)
  94. } else if (res.data.messageType == 1) {
  95. badge++
  96. wx.setTabBarBadge({
  97. index: 3,
  98. text: badge + ""
  99. })
  100. console.log("接收到新消息,更新badge : " + badge)
  101. }
  102. } else if (res.errno == 3002 || res.errno == 3003 || res.errno == 3004 || res.errno == 3005) {
  103. console.log(res.errmsg)
  104. //TOKEN_IS_EMPTY
  105. //需要登录后才可以操作
  106. wx.getSetting({
  107. success: res => {
  108. if (res.authSetting['scope.userInfo']) {
  109. // // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
  110. util.getUserInfo().then((res) => {
  111. util.backendLogin(res).then((res) => {
  112. wsConnect()
  113. console.log('再次请求')
  114. })
  115. })
  116. }
  117. }
  118. })
  119. }else {
  120. console.log(res)
  121. reject(res)
  122. }
  123. })
  124. // })
  125. }
  126. /**
  127. * 消息form页监听消息
  128. */
  129. function listenChatForm(chatId) {
  130. return new Promise(function(resolve, reject) {
  131. wx.onSocketMessage(onMessage => {
  132. var res = JSON.parse(onMessage.data)
  133. if (res.errno === 0) {
  134. if (res.data.messageType == 1 && res.data.chatId == chatId) {
  135. console.log("消息Form监听到新消息 : " + res.data.messageBody)
  136. // var newMsg = res.data
  137. // newMsgList.push(newMsg)
  138. // console.log(newMsgList)
  139. //test
  140. util.request(api.ChatFlushUnread + '/' + chatId, {}, "POST").then((res) => {
  141. if (res.errno == 0) {
  142. console.log("把unread刷入数据库成功")
  143. } else {
  144. console.log(res)
  145. }
  146. })
  147. resolve(res.data)
  148. }
  149. } else {
  150. console.log(res)
  151. reject(res)
  152. }
  153. })
  154. })
  155. }
  156. // /**
  157. // * 关闭对form页的监听,其实就是把期间收到的消息刷入数据库
  158. // */
  159. // function stopListenForm(chatId) {
  160. // if (newMsgList.length > 0) {
  161. // newMsgList = []
  162. // util.request(api.ChatFlushUnread + '/' + chatId, {}, "POST").then((res) => {
  163. // if (res.errno == 0) {
  164. // console.log("把unread刷入数据库成功")
  165. // } else {
  166. // console.log(res)
  167. // }
  168. // })
  169. // }
  170. // }
  171. /**
  172. * 消息列表页监听消息
  173. */
  174. function listenChatIndex() {
  175. return new Promise(function(resolve, reject) {
  176. wx.onSocketMessage(onMessage => {
  177. var res = JSON.parse(onMessage.data)
  178. if (res.errno === 0) {
  179. if (res.data.messageType == 1) {
  180. console.log("消息列表监听到新消息 : " + res.data.messageBody)
  181. badge++
  182. wx.setTabBarBadge({
  183. index: 3,
  184. text: badge + ""
  185. })
  186. resolve(res.data)
  187. }
  188. } else {
  189. console.log(res)
  190. reject(res)
  191. }
  192. })
  193. })
  194. }
  195. function lessBadge(less) {
  196. badge = badge - less
  197. if (badge <= 0) {
  198. badge = 0
  199. wx.removeTabBarBadge({
  200. index: 3,
  201. })
  202. } else {
  203. wx.setTabBarBadge({
  204. index: 3,
  205. text: badge + ""
  206. })
  207. }
  208. }
  209. module.exports = {
  210. wsConnect,
  211. socketTask,
  212. sendMessage,
  213. listenChatForm,
  214. listenChatIndex,
  215. lessBadge,
  216. listenBadge,
  217. // stopListenForm,
  218. };