var app = getApp(); const api = require('../config/api.js'); const util = require('../utils/util.js'); var SocketTask var socketOpen = false var badge = 0 /** * 创建websocket连接 */ function wsConnect() { let that = this let userInfo = wx.getStorageSync('userInfo') // 创建Socket return new Promise(function(resolve, reject) { if (!userInfo){ reject("未登录") } var openId = userInfo.openId SocketTask = wx.connectSocket({ url: api.ChatWs + '/' + openId, header: { 'content-type': 'application/json', 'Authorization': wx.getStorageSync('token') }, method: 'post', success: function(res) { console.log('WebSocket连接创建', res) listenBadge() }, fail: function(err) { wx.showToast({ title: '网络异常!', }) console.log("err") reject("网络异常!") }, }) console.log(SocketTask) socketTask(SocketTask) resolve(SocketTask) }) } function wsClose() { wx.closeSocket() } /** * 监听websocket状态 */ function socketTask(SocketTask) { let that = this SocketTask.onOpen(res => { socketOpen = true; console.log('监听 WebSocket 连接打开事件。', res) }) SocketTask.onClose(onClose => { console.log('监听 WebSocket 连接关闭事件。', onClose) socketOpen = false; // that.wsConnect() }) SocketTask.onError(onError => { console.log('监听 WebSocket 错误。错误信息', onError) socketOpen = false }) SocketTask.onMessage(onMessage => { console.log('监听WebSocket接受到服务器的消息事件。服务器返回的消息', JSON.parse(onMessage.data)) }) } function sendMessage(data) { var that = this; return new Promise(function(resolve, reject) { if (socketOpen) { wx.sendSocketMessage({ data: data, success: res => { resolve(res); }, fail: res => { reject(res); } }) } else { reject("未建立websocket连接"); } }) } /** * 监听websocket,接收到消息时改变badge */ function listenBadge() { wx.onSocketMessage(onMessage => { var res = JSON.parse(onMessage.data) if (res.errno === 0) { if (res.data.messageType == 4 && res.data.messageBody != 0) { badge = res.data.messageBody wx.setTabBarBadge({ index: 3, text: badge + "" }) console.log("初始化未读数badge : " + badge) } else if (res.data.messageType == 1) { badge++ wx.setTabBarBadge({ index: 3, text: badge + "" }) console.log("接收到新消息,更新badge : " + badge) } } else if (res.errno == 3002 || res.errno == 3003 || res.errno == 3004 || res.errno == 3005) { console.log(res.errmsg) //TOKEN_IS_EMPTY //需要登录后才可以操作 wx.getSetting({ success: res => { if (res.authSetting['scope.userInfo']) { // // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框 util.getUserInfo().then((res) => { util.backendLogin(res).then((res) => { wsConnect() console.log('再次请求') }) }) } } }) }else { console.log(res) reject(res) } }) } /** * 消息form页监听消息 */ function listenChatForm(chatId) { return new Promise(function(resolve, reject) { wx.onSocketMessage(onMessage => { var res = JSON.parse(onMessage.data) if (res.errno === 0) { if (res.data.messageType == 1 && res.data.chatId == chatId) { console.log("消息Form监听到新消息 : " + res.data.messageBody) util.request(api.ChatFlushUnread + '/' + chatId, {}, "POST").then((res) => { if (res.errno == 0) { console.log("把实时获取的消息设为已读") } else { console.log(res) } }) resolve(res.data) } } else { console.log(res) reject(res) } }) }) } /** * 消息列表页监听消息 */ function listenChatIndex() { return new Promise(function(resolve, reject) { wx.onSocketMessage(onMessage => { var res = JSON.parse(onMessage.data) if (res.errno === 0) { console.log("消息列表监听到新消息 : " + res.data.messageBody) badge++ wx.setTabBarBadge({ index: 3, text: badge + "" }) resolve(res.data) } else { console.log(res) reject(res) } }) }) } function lessBadge(less) { badge = badge - less if (badge <= 0) { badge = 0 wx.removeTabBarBadge({ index: 3, }) } else { wx.setTabBarBadge({ index: 3, text: badge + "" }) } } module.exports = { wsConnect, socketTask, sendMessage, listenChatForm, listenChatIndex, lessBadge, listenBadge, wsClose, };