var server = require("http").createServer(); const EVENT = { someOneInRoom: 'someOneInRoom', someOneLeaveRoom: 'someOneLeaveRoom', startCall: 'startCall', putup: 'putup', webSyncAction: 'webSyncAction', clientSyncAction: 'clientSyncAction', action: 'action', roomClose: 'roomClose' } 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, deviceId, sceneNum, isClient, useId } = user const webRoomId = `${roomId}${sceneNum}` // 加入客户端与H5单独的通讯房间 socket.join(deviceId) // 加入所有连接数的通讯房间 socket.join(roomId, () => { // 只有h5才能加入H5端的房间 }) if (!isClient) { socket.join(webRoomId, () => { }) } socket.on(EVENT.startCall, () => { if (!isClient) { let roomsPerson = this._roomPerson.get(roomId) || [] roomsPerson.push(user) this._roomPerson.set(roomId, roomsPerson) socket.broadcast.to(roomId).emit(EVENT.someOneInRoom, { user, roomsPerson }) } }) socket.on(EVENT.putup, () => { if (!isClient) { let roomsPerson = this._roomPerson.get(roomId) || [] roomsPerson = roomsPerson.fliter(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) => { socket.broadcast.to(deviceId).emit(EVENT.clientSyncAction, data) }) socket.on("disconnect", (reason) => { if (!isClient) { let roomsPerson = this._roomPerson.get(roomId) || [] roomsPerson = roomsPerson.fliter(item => item.userId !== user.userId) this._roomPerson.set(roomId, roomsPerson) socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson }) if (user.isOwner) { socket.broadcast.to(roomId).emit(EVENT.roomClose) } } }) socket.on("error", function (reason) { console.log("异常关闭", reason) }) return this; }) } close() { this.server.disconnect(true); } };