159 lines
4.6 KiB
Vue
159 lines
4.6 KiB
Vue
/**
|
||
* 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
|