/** * Description: atmosphere服务类 * Author: tiansiyuan * Date: 2020/5/16 13:49:15 */ import store from '@/store' import { updateStatusbyRoomIdAndUserId } from '@/api/plotting/plotting' const atmosphere = window.atmosphere || {} const RoomService = { /** * 创建标绘对象 * url:标绘room的地址 */ create(url) { const service = { showPrompt: true, parent: null, message: { onOpen: '连接标绘房间成功', onClientTimeout: '消息发送失败', onError: '标绘服务器内部错误,请刷新页面重新接入', onReconnect: '掉线重连....请稍候', onTransportFailure: '客户端不支持websocket,请更换浏览器', }, onMessage(msg) {}, onReopen() {}, } let connectedEndPoint = null service.join = function (userType, id, roomId) { debugger // 如果url为空,说明还没有创建协同标绘房间。 // 如果connectedEndPoint不为空,说明当前已经连接到一个协同标绘房间,重新连接需要先退出当前房间。 if (url !== '' && connectedEndPoint == null) { let request = { url: url, transport: 'websocket', fallbackTransport: 'websocket', // 只支持websocket方式 logLevel: 'debug', maxReconnectOnClose: 3, // 重连三次 reconnectInterval: 15000, // 每次重连的时间间隔为2秒 reconnectOnServerError: true, // 成功建立连接回调函数 onOpen(response) { console.log('成功链接', response) if (service.showPrompt) { console.log('标绘房间连接成功!') } switch (userType) { case 'platform': if (id !== store.getters.hostOrgId) { service.send({ id: id, status: 1, userType: userType, roomId: roomId, type: 'status', }) } break case 'app': service.send({ id: id, status: 1, userType: userType, roomId: roomId, type: 'status', }) updateStatusbyRoomIdAndUserId(roomId, id, 1) break default: } }, onReopen(request, response) { location.reload() }, // 收到atmosphere消息的回调函数 onMessage(response) { if ( response.state === 'messageReceived' && response.status === 200 ) { if ( service.onMessage != null && typeof service.onMessage == 'function' ) { service.onMessage(response.responseBody) } } }, // 客户端request超时回调函数 onClientTimeout(request) { if (service.showPrompt) { console.log('onClientTimeout') } }, // 收到未知错误回调函数 onError(response) { console.log('res', response) if (service.showPrompt) { console.log('onError') } }, // 成功重建连接回调函数 onReconnect(request, response) { if (service.showPrompt) { } }, // transport类型不支持回调函数 onTransportFailure(errMsg, request) { if (service.showPrompt) { } }, } connectedEndPoint = atmosphere.subscribe(request) } else { console.log( 'No room has been created or connection has been established already!' ) } } /** * 退出标绘room */ service.leave = function () { atmosphere.unsubscribe() connectedEndPoint = null } /** * 发送标绘内容 */ service.send = function (message) { console.log('通过atmosphere发送的消息:%o', message) if (connectedEndPoint == null) { console.log('please establish the connection before sending message!') return false } if (connectedEndPoint.request.isOpen === false) { console.log('current connection is closed!') return false } const msg = JSON.stringify(message) connectedEndPoint.push(msg) } return service }, } export default RoomService