websocket.js 5.6 KB

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