websocket.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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. var newMsgList = []
  8. /**
  9. * 创建websocket连接
  10. */
  11. function wsConnect() {
  12. let that = this
  13. var openId = wx.getStorageSync('userInfo').openId
  14. // 创建Socket
  15. return new Promise(function(resolve, reject) {
  16. SocketTask = wx.connectSocket({
  17. url: api.ChatWs + '/' + openId,
  18. data: 'data',
  19. header: {
  20. 'content-type': 'application/json'
  21. },
  22. method: 'post',
  23. success: function(res) {
  24. console.log('WebSocket连接创建', res)
  25. listenBadge()
  26. },
  27. fail: function(err) {
  28. wx.showToast({
  29. title: '网络异常!',
  30. })
  31. console.log("err")
  32. reject("网络异常!")
  33. },
  34. })
  35. console.log(SocketTask)
  36. socketTask(SocketTask)
  37. resolve(SocketTask)
  38. })
  39. }
  40. /**
  41. * 监听websocket状态
  42. */
  43. function socketTask(SocketTask) {
  44. let that = this
  45. SocketTask.onOpen(res => {
  46. socketOpen = true;
  47. console.log('监听 WebSocket 连接打开事件。', res)
  48. })
  49. SocketTask.onClose(onClose => {
  50. console.log('监听 WebSocket 连接关闭事件。', onClose)
  51. socketOpen = false;
  52. that.wsConnect()
  53. })
  54. SocketTask.onError(onError => {
  55. console.log('监听 WebSocket 错误。错误信息', onError)
  56. socketOpen = false
  57. })
  58. SocketTask.onMessage(onMessage => {
  59. // console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data))
  60. })
  61. }
  62. function sendMessage(data) {
  63. var that = this;
  64. return new Promise(function(resolve, reject) {
  65. if (socketOpen) {
  66. wx.sendSocketMessage({
  67. data: data,
  68. success: res => {
  69. resolve(res);
  70. },
  71. fail: res => {
  72. reject(res);
  73. }
  74. })
  75. } else {
  76. reject("未建立websocket连接");
  77. }
  78. })
  79. }
  80. /**
  81. * 初始化badge未读数
  82. */
  83. function initBadge() {
  84. return new Promise(function(resolve, reject) {
  85. wx.onSocketMessage(onMessage => {
  86. var res = JSON.parse(onMessage.data)
  87. if (res.errno === 0) {
  88. if (res.data.messageType == 3 && res.data.messageBody != 0) {
  89. badge = res.data.messageBody
  90. wx.setTabBarBadge({
  91. index: 3,
  92. text: badge
  93. })
  94. resolve("初始化未读数badge : " + badge)
  95. }
  96. } else {
  97. console.log(res)
  98. reject(res)
  99. }
  100. })
  101. })
  102. }
  103. function listenBadge() {
  104. // return new Promise(function (resolve, reject) {
  105. wx.onSocketMessage(onMessage => {
  106. var res = JSON.parse(onMessage.data)
  107. if (res.errno === 0) {
  108. if (res.data.messageType == 3 && res.data.messageBody != 0) {
  109. badge = res.data.messageBody
  110. wx.setTabBarBadge({
  111. index: 3,
  112. text: badge+""
  113. })
  114. console.log("初始化未读数badge : " + badge)
  115. } else if (res.data.messageType == 1){
  116. badge++
  117. wx.setTabBarBadge({
  118. index: 3,
  119. text: badge + ""
  120. })
  121. console.log("接收到新消息,更新badge : " + badge)
  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. resolve(newMsg)
  144. }
  145. } else {
  146. console.log(res)
  147. reject(res)
  148. }
  149. })
  150. })
  151. }
  152. /**
  153. * 关闭对form页的监听,其实就是把期间收到的消息刷入数据库
  154. */
  155. function stopListenForm(chatId){
  156. if (newMsgList.length > 0){
  157. newMsgList = []
  158. util.request(api.ChatFlushUnread + '/' + chatId, {},"POST").then((res) => {
  159. if(res.errno == 0){
  160. console.log("把unread刷入数据库成功")
  161. }else{
  162. console.log(res)
  163. }
  164. })
  165. }
  166. }
  167. /**
  168. * 消息列表页监听消息
  169. */
  170. function listenChatIndex() {
  171. return new Promise(function(resolve, reject) {
  172. wx.onSocketMessage(onMessage => {
  173. var res = JSON.parse(onMessage.data)
  174. if (res.errno === 0) {
  175. if (res.data.messageType == 1) {
  176. console.log("消息列表监听到新消息 : " + res.data.messageBody)
  177. badge++
  178. wx.setTabBarBadge({
  179. index: 3,
  180. text: badge + ""
  181. })
  182. resolve(res.data)
  183. }
  184. } else {
  185. console.log(res)
  186. reject(res)
  187. }
  188. })
  189. })
  190. }
  191. function lessBadge(less) {
  192. badge = badge - less
  193. if (badge == 0) {
  194. wx.removeTabBarBadge({
  195. index: 3,
  196. })
  197. } else {
  198. wx.setTabBarBadge({
  199. index: 3,
  200. text: badge + ""
  201. })
  202. }
  203. }
  204. module.exports = {
  205. wsConnect,
  206. socketTask,
  207. sendMessage,
  208. listenChatForm,
  209. listenChatIndex,
  210. lessBadge,
  211. listenBadge,
  212. stopListenForm,
  213. };