socketv2.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. var server = require("http").createServer();
  2. const EVENT = {
  3. someOneInRoom: 'someOneInRoom',
  4. someOneLeaveRoom: 'someOneLeaveRoom',
  5. startCall: 'startCall',
  6. stopCall: 'stopCall',
  7. webSyncAction: 'webSyncAction',
  8. clientSyncAction: 'clientSyncAction',
  9. action: 'action',
  10. roomClose: 'roomClose',
  11. roomIn: 'roomIn',
  12. changeVoiceStatus: 'changeVoiceStatus'
  13. }
  14. module.exports = class WebSocketServer {
  15. constructor() {
  16. this._pageMap = new Map();
  17. this._roomIDS = new Map();
  18. this._roomPerson = new Map()
  19. }
  20. create() {
  21. this.io = require("socket.io")(server, {
  22. path: "/vr-node",
  23. serveClient: false,
  24. // below are engine.IO options
  25. pingInterval: 10000,
  26. pingTimeout: 5000,
  27. cookie: false,
  28. });
  29. server.listen(3030, { origins: "*" });
  30. this.io.on("connection", (socket) => {
  31. let user = socket.handshake.query
  32. const { roomId, userId, sceneNum, isClient, role } = user
  33. const webRoomId = `${roomId}${sceneNum}`
  34. const clientRoom = userId ? `${userId}` : `${sceneNum}${roomId}`
  35. // 加入客户端与H5单独的通讯房间
  36. socket.join(clientRoom, () => {
  37. console.log('join success', clientRoom, user)
  38. })
  39. // 加入所有连接数的通讯房间
  40. socket.join(roomId, () => {
  41. // 只有h5才能加入H5端的房间
  42. if (!isClient) {
  43. let roomsPerson = this._roomPerson.get(roomId) || []
  44. roomsPerson.push(user)
  45. this._roomPerson.set(roomId, roomsPerson)
  46. }
  47. })
  48. let clientPerson = this._roomPerson.get(clientRoom) || []
  49. if (isClient) {
  50. clientPerson.push(user)
  51. this._roomPerson.set(clientRoom, clientPerson)
  52. } else {
  53. clientPerson.forEach(item => {
  54. if (item.userId === user.userId) {
  55. user.avatar = item.avatar
  56. user.voiceStatus = item.voiceStatus
  57. }
  58. })
  59. }
  60. socket.on(EVENT.startCall, () => {
  61. console.log('startcall', user)
  62. if (!isClient) {
  63. socket.join(webRoomId, () => {
  64. console.log('join webRoom', user)
  65. let roomsPerson = this._roomPerson.get(roomId) || []
  66. socket.emit(EVENT.roomIn, { roomsPerson })
  67. socket.broadcast.to(roomId).emit(EVENT.someOneInRoom, { user, roomsPerson })
  68. })
  69. }
  70. })
  71. socket.on(EVENT.stopCall, () => {
  72. socket.leave(roomId)
  73. if (!isClient) {
  74. socket.leave(webRoomId)
  75. if (role === 'leader') {
  76. socket.broadcast.to(roomId).emit(EVENT.roomClose)
  77. }
  78. let roomsPerson = this._roomPerson.get(roomId) || []
  79. roomsPerson = roomsPerson.filter(item => item.userId !== user.userId)
  80. this._roomPerson.set(roomId, roomsPerson)
  81. socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson })
  82. }
  83. })
  84. socket.on(EVENT.webSyncAction, (data) => {
  85. socket.broadcast.to(webRoomId).emit(EVENT.webSyncAction, data)
  86. })
  87. socket.on(EVENT.action, (data) => {
  88. socket.broadcast.to(roomId).emit(EVENT.action, data)
  89. })
  90. socket.on(EVENT.clientSyncAction, (data) => {
  91. console.log('client', clientRoom, data)
  92. socket.broadcast.to(clientRoom).emit(EVENT.clientSyncAction, data)
  93. })
  94. socket.on(EVENT.changeVoiceStatus, data => {
  95. let _roomPerson = this._roomPerson.get(roomId) || []
  96. user.voiceStatus = data.status
  97. console.log(_roomPerson, '_roomPerson')
  98. _roomPerson.forEach(item => {
  99. if (item.userId === user.userId) {
  100. item.voiceStatus = user.voiceStatus
  101. }
  102. })
  103. this._roomPerson.set(roomId, _roomPerson)
  104. console.log(_roomPerson, data, user)
  105. socket.broadcast.to(roomId).emit(EVENT.changeVoiceStatus, {roomsPerson: _roomPerson})
  106. })
  107. socket.on("disconnect", (reason) => {
  108. socket.leave(roomId)
  109. if (!isClient) {
  110. if (role === 'leader') {
  111. socket.broadcast.to(roomId).emit(EVENT.roomClose)
  112. }
  113. let roomsPerson = this._roomPerson.get(roomId) || []
  114. roomsPerson = roomsPerson.filter(item => item.userId !== user.userId)
  115. this._roomPerson.set(roomId, roomsPerson)
  116. socket.broadcast.to(roomId).emit(EVENT.someOneLeaveRoom, { user, roomsPerson })
  117. socket.leave(webRoomId)
  118. socket.leave(roomId)
  119. }
  120. })
  121. socket.on("error", function (reason) {
  122. console.log("异常关闭", reason)
  123. })
  124. return this;
  125. })
  126. }
  127. close() {
  128. this.server.disconnect(true);
  129. }
  130. };