var server = require("http").createServer(); const EVENT = { someOneInRoom: 'someOneInRoom', someOneLeaveRoom: 'someOneLeaveRoom', startCall: 'startCall', stopCall: 'stopCall', webSyncAction: 'webSyncAction', clientSyncAction: 'clientSyncAction', action: 'action', roomClose: 'roomClose', roomIn: 'roomIn', changeVoiceStatus: 'changeVoiceStatus' } module.exports = class WebSocketServer { constructor() { this._pageMap = new Map(); this._roomIDS = new Map(); this._roomPerson = new Map() } create() { this.io = require("socket.io")(server, { path: "/vr-node", serveClient: false, // below are engine.IO options pingInterval: 10000, pingTimeout: 5000, cookie: false, }); server.listen(3030, { origins: "*" }); this.io.on("connection", (socket) => { let user = socket.handshake.query const { roomId, userId, sceneNum, isClient, role, userLimitNum } = user const webRoomId = `${roomId}${sceneNum}` const clientRoom = userId ? `${userId}` : `${sceneNum}${roomId}` // 加入客户端与H5单独的通讯房间 socket.join(clientRoom, () => { console.log('join success', clientRoom, user) }) // 若有房间人数限制 if (userLimitNum && this._roomPerson.get(roomId) && this._roomPerson.get(roomId).length >= userLimitNum) { socket.emit('roomInFail', { type: 'full', msg: '房间人数已满' }) return this } // 若已结束、房间已关闭 if ( this._roomPerson.get(roomId) && !this._roomPerson.get(roomId).find(item => item.role === 'leader')) { socket.broadcast.to(roomId).emit(EVENT.roomClose) return } // 加入所有连接数的通讯房间 socket.join(roomId, () => { // 只有h5才能加入H5端的房间 if (!isClient) { let roomsPerson = this._roomPerson.get(roomId) || [] roomsPerson.push(user) this._roomPerson.set(roomId, roomsPerson) } }) let clientPerson = this._roomPerson.get(clientRoom) || [] if (isClient) { clientPerson.push(user) this._roomPerson.set(clientRoom, clientPerson) } else { clientPerson.forEach(item => { if (item.userId === user.userId) { user.avatar = item.avatar user.voiceStatus = item.voiceStatus } }) } socket.on(EVENT.startCall, () => { console.log('startcall', user) if (!isClient) { socket.join(webRoomId, () => { console.log('join webRoom', user) let roomsPerson = this._roomPerson.get(roomId) || [] socket.emit(EVENT.roomIn, { roomsPerson }) socket.broadcast.to(roomId).emit(EVENT.someOneInRoom, { user, roomsPerson }) }) } }) socket.on(EVENT.stopCall, () => { console.log('stopCall', user) socket.leave(roomId) if (role === 'leader') { socket.broadcast.to(roomId).emit(EVENT.roomClose) } if (!isClient) { socket.leave(webRoomId) let roomsPerson = this._roomPerson.get(roomId) || [] roomsPerson = roomsPerson.filter(item => item.userId !== user.userId) this._roomPerson.set(roomId, roomsPerson) socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson }) } }) socket.on(EVENT.webSyncAction, (data) => { socket.broadcast.to(webRoomId).emit(EVENT.webSyncAction, data) }) socket.on(EVENT.action, (data) => { socket.broadcast.to(roomId).emit(EVENT.action, data) }) socket.on(EVENT.clientSyncAction, (data) => { console.log('client', clientRoom, data) socket.broadcast.to(clientRoom).emit(EVENT.clientSyncAction, data) }) socket.on(EVENT.changeVoiceStatus, data => { let _roomPerson = this._roomPerson.get(roomId) || [] user.voiceStatus = data.status console.log(_roomPerson, '_roomPerson') _roomPerson.forEach(item => { if (item.userId === user.userId) { item.voiceStatus = user.voiceStatus } }) this._roomPerson.set(roomId, _roomPerson) console.log(_roomPerson, data, user) socket.broadcast.to(roomId).emit(EVENT.changeVoiceStatus, {roomsPerson: _roomPerson}) }) socket.on("disconnect", (reason) => { console.log(reason, 'reason') socket.leave(roomId) if (!isClient) { // if (role === 'leader' && reason !== 'ping timeout') { // socket.broadcast.to(roomId).emit(EVENT.roomClose) // } let roomsPerson = this._roomPerson.get(roomId) || [] roomsPerson = roomsPerson.filter(item => item.userId !== user.userId) this._roomPerson.set(roomId, roomsPerson) // socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson }) socket.leave(webRoomId) socket.leave(roomId) } }) socket.on('reconnect', () => { console.log('重连', user) socket.join(roomId) if (!isClient) { let roomsPerson = this._roomPerson.get(roomId) || [] roomsPerson.push(user) this._roomPerson.set(roomId, roomsPerson) socket.join(webRoomId) socket.join(roomId) } }) socket.on("error", function (reason) { console.log("异常关闭", reason) }) return this; }) } close() { this.server.disconnect(true); } };