mediasfu-shared 1.0.6 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/HEADLESS_GUIDE.md +156 -0
  2. package/README.md +130 -62
  3. package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts +23 -0
  4. package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts.map +1 -0
  5. package/dist/ProducerClient/producerClientEmits/joinRoomClient.d.ts +22 -0
  6. package/dist/ProducerClient/producerClientEmits/joinRoomClient.d.ts.map +1 -0
  7. package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts +85 -0
  8. package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts.map +1 -0
  9. package/dist/consumers/addVideosGrid.d.ts +10 -0
  10. package/dist/consumers/addVideosGrid.d.ts.map +1 -0
  11. package/dist/consumers/autoAdjust.d.ts +41 -0
  12. package/dist/consumers/autoAdjust.d.ts.map +1 -0
  13. package/dist/consumers/calculateRowsAndColumns.d.ts +24 -0
  14. package/dist/consumers/calculateRowsAndColumns.d.ts.map +1 -0
  15. package/dist/consumers/changeVids.d.ts +252 -0
  16. package/dist/consumers/changeVids.d.ts.map +1 -0
  17. package/dist/consumers/checkGrid.d.ts +42 -0
  18. package/dist/consumers/checkGrid.d.ts.map +1 -0
  19. package/dist/consumers/checkPermission.d.ts +42 -0
  20. package/dist/consumers/checkPermission.d.ts.map +1 -0
  21. package/dist/consumers/checkScreenShare.d.ts +59 -0
  22. package/dist/consumers/checkScreenShare.d.ts.map +1 -0
  23. package/dist/consumers/closeAndResize.d.ts +157 -0
  24. package/dist/consumers/closeAndResize.d.ts.map +1 -0
  25. package/dist/consumers/compareActiveNames.d.ts +50 -0
  26. package/dist/consumers/compareActiveNames.d.ts.map +1 -0
  27. package/dist/consumers/compareScreenStates.d.ts +55 -0
  28. package/dist/consumers/compareScreenStates.d.ts.map +1 -0
  29. package/dist/consumers/connectIps.d.ts +66 -0
  30. package/dist/consumers/connectIps.d.ts.map +1 -0
  31. package/dist/consumers/connectLocalIps.d.ts +52 -0
  32. package/dist/consumers/connectLocalIps.d.ts.map +1 -0
  33. package/dist/consumers/connectRecvTransport.d.ts +64 -0
  34. package/dist/consumers/connectRecvTransport.d.ts.map +1 -0
  35. package/dist/consumers/connectSendTransport.d.ts +75 -0
  36. package/dist/consumers/connectSendTransport.d.ts.map +1 -0
  37. package/dist/consumers/connectSendTransportAudio.d.ts +62 -0
  38. package/dist/consumers/connectSendTransportAudio.d.ts.map +1 -0
  39. package/dist/consumers/connectSendTransportScreen.d.ts +72 -0
  40. package/dist/consumers/connectSendTransportScreen.d.ts.map +1 -0
  41. package/dist/consumers/connectSendTransportVideo.d.ts +75 -0
  42. package/dist/consumers/connectSendTransportVideo.d.ts.map +1 -0
  43. package/dist/consumers/consumerResume.d.ts +16 -0
  44. package/dist/consumers/consumerResume.d.ts.map +1 -0
  45. package/dist/consumers/controlMedia.d.ts +61 -0
  46. package/dist/consumers/controlMedia.d.ts.map +1 -0
  47. package/dist/consumers/createSendTransport.d.ts +80 -0
  48. package/dist/consumers/createSendTransport.d.ts.map +1 -0
  49. package/dist/consumers/disconnectSendTransportAudio.d.ts +79 -0
  50. package/dist/consumers/disconnectSendTransportAudio.d.ts.map +1 -0
  51. package/dist/consumers/disconnectSendTransportScreen.d.ts +61 -0
  52. package/dist/consumers/disconnectSendTransportScreen.d.ts.map +1 -0
  53. package/dist/consumers/disconnectSendTransportVideo.d.ts +72 -0
  54. package/dist/consumers/disconnectSendTransportVideo.d.ts.map +1 -0
  55. package/dist/consumers/dispStreams.d.ts +189 -0
  56. package/dist/consumers/dispStreams.d.ts.map +1 -0
  57. package/dist/consumers/frameworkConsumerContract.d.ts +2 -0
  58. package/dist/consumers/frameworkConsumerContract.d.ts.map +1 -0
  59. package/dist/consumers/generatePageContent.d.ts +68 -0
  60. package/dist/consumers/generatePageContent.d.ts.map +1 -0
  61. package/dist/consumers/getEstimate.d.ts +62 -0
  62. package/dist/consumers/getEstimate.d.ts.map +1 -0
  63. package/dist/consumers/getPipedProducersAlt.d.ts +62 -0
  64. package/dist/consumers/getPipedProducersAlt.d.ts.map +1 -0
  65. package/dist/consumers/getProducersPiped.d.ts +49 -0
  66. package/dist/consumers/getProducersPiped.d.ts.map +1 -0
  67. package/dist/consumers/getVideos.d.ts +49 -0
  68. package/dist/consumers/getVideos.d.ts.map +1 -0
  69. package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts +19 -0
  70. package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts.map +1 -0
  71. package/dist/consumers/gridLayout/prepopulateUserMedia.engine.d.ts +138 -0
  72. package/dist/consumers/gridLayout/prepopulateUserMedia.engine.d.ts.map +1 -0
  73. package/dist/consumers/index.cjs +80 -0
  74. package/dist/consumers/index.cjs.map +1 -0
  75. package/dist/consumers/index.d.ts +62 -0
  76. package/dist/consumers/index.d.ts.map +1 -0
  77. package/dist/consumers/index.js +80 -0
  78. package/dist/consumers/index.js.map +1 -0
  79. package/dist/consumers/mixStreams.d.ts +37 -0
  80. package/dist/consumers/mixStreams.d.ts.map +1 -0
  81. package/dist/consumers/onScreenChanges.d.ts +62 -0
  82. package/dist/consumers/onScreenChanges.d.ts.map +1 -0
  83. package/dist/consumers/prepopulateUserMedia.d.ts +10 -0
  84. package/dist/consumers/prepopulateUserMedia.d.ts.map +1 -0
  85. package/dist/consumers/processConsumerTransports.d.ts +73 -0
  86. package/dist/consumers/processConsumerTransports.d.ts.map +1 -0
  87. package/dist/consumers/processConsumerTransportsAudio.d.ts +57 -0
  88. package/dist/consumers/processConsumerTransportsAudio.d.ts.map +1 -0
  89. package/dist/consumers/rePort.d.ts +63 -0
  90. package/dist/consumers/rePort.d.ts.map +1 -0
  91. package/dist/consumers/reUpdateInter.d.ts +142 -0
  92. package/dist/consumers/reUpdateInter.d.ts.map +1 -0
  93. package/dist/consumers/readjust.d.ts +68 -0
  94. package/dist/consumers/readjust.d.ts.map +1 -0
  95. package/dist/consumers/receiveAllPipedTransports.d.ts +44 -0
  96. package/dist/consumers/receiveAllPipedTransports.d.ts.map +1 -0
  97. package/dist/consumers/receiveRoomMessages.d.ts +31 -0
  98. package/dist/consumers/receiveRoomMessages.d.ts.map +1 -0
  99. package/dist/consumers/reorderStreams.d.ts +98 -0
  100. package/dist/consumers/reorderStreams.d.ts.map +1 -0
  101. package/dist/consumers/requestScreenShare.d.ts +47 -0
  102. package/dist/consumers/requestScreenShare.d.ts.map +1 -0
  103. package/dist/consumers/resumePauseAudioStreams.d.ts +85 -0
  104. package/dist/consumers/resumePauseAudioStreams.d.ts.map +1 -0
  105. package/dist/consumers/resumePauseStreams.d.ts +68 -0
  106. package/dist/consumers/resumePauseStreams.d.ts.map +1 -0
  107. package/dist/consumers/resumeSendTransportAudio.d.ts +65 -0
  108. package/dist/consumers/resumeSendTransportAudio.d.ts.map +1 -0
  109. package/dist/consumers/signalNewConsumerTransport.d.ts +59 -0
  110. package/dist/consumers/signalNewConsumerTransport.d.ts.map +1 -0
  111. package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts +76 -0
  112. package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts.map +1 -0
  113. package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts +119 -0
  114. package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts.map +1 -0
  115. package/dist/consumers/socketReceiveMethods/producerClosed.d.ts +53 -0
  116. package/dist/consumers/socketReceiveMethods/producerClosed.d.ts.map +1 -0
  117. package/dist/consumers/startShareScreen.d.ts +58 -0
  118. package/dist/consumers/startShareScreen.d.ts.map +1 -0
  119. package/dist/consumers/stopShareScreen.d.ts +127 -0
  120. package/dist/consumers/stopShareScreen.d.ts.map +1 -0
  121. package/dist/consumers/streamSuccessAudio.d.ts +149 -0
  122. package/dist/consumers/streamSuccessAudio.d.ts.map +1 -0
  123. package/dist/consumers/streamSuccessAudioSwitch.d.ts +131 -0
  124. package/dist/consumers/streamSuccessAudioSwitch.d.ts.map +1 -0
  125. package/dist/consumers/streamSuccessScreen.d.ts +109 -0
  126. package/dist/consumers/streamSuccessScreen.d.ts.map +1 -0
  127. package/dist/consumers/streamSuccessVideo.d.ts +160 -0
  128. package/dist/consumers/streamSuccessVideo.d.ts.map +1 -0
  129. package/dist/consumers/switchUserAudio.d.ts +56 -0
  130. package/dist/consumers/switchUserAudio.d.ts.map +1 -0
  131. package/dist/consumers/switchUserVideo.d.ts +77 -0
  132. package/dist/consumers/switchUserVideo.d.ts.map +1 -0
  133. package/dist/consumers/switchUserVideoAlt.d.ts +69 -0
  134. package/dist/consumers/switchUserVideoAlt.d.ts.map +1 -0
  135. package/dist/consumers/translationConsumerSwitch.d.ts +67 -0
  136. package/dist/consumers/translationConsumerSwitch.d.ts.map +1 -0
  137. package/dist/consumers/trigger.d.ts +71 -0
  138. package/dist/consumers/trigger.d.ts.map +1 -0
  139. package/dist/consumers/updateMiniCardsGrid.d.ts +65 -0
  140. package/dist/consumers/updateMiniCardsGrid.d.ts.map +1 -0
  141. package/dist/consumers/updateParticipantAudioDecibels.d.ts +31 -0
  142. package/dist/consumers/updateParticipantAudioDecibels.d.ts.map +1 -0
  143. package/dist/getParticipantMedia-B0JS6d2b.js +3555 -0
  144. package/dist/getParticipantMedia-B0JS6d2b.js.map +1 -0
  145. package/dist/getParticipantMedia-CdcYqcbD.cjs +3554 -0
  146. package/dist/getParticipantMedia-CdcYqcbD.cjs.map +1 -0
  147. package/dist/index.cjs +2727 -13252
  148. package/dist/index.cjs.map +1 -1
  149. package/dist/index.d.ts +192 -11233
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +2636 -13143
  152. package/dist/index.js.map +1 -1
  153. package/dist/index.native.cjs +352 -0
  154. package/dist/index.native.cjs.map +1 -0
  155. package/dist/index.native.d.ts +204 -0
  156. package/dist/index.native.d.ts.map +1 -0
  157. package/dist/index.native.js +352 -0
  158. package/dist/index.native.js.map +1 -0
  159. package/dist/joinLocalRoom-BdM1msQt.cjs +673 -0
  160. package/dist/joinLocalRoom-BdM1msQt.cjs.map +1 -0
  161. package/dist/joinLocalRoom-CvteNe4R.js +657 -0
  162. package/dist/joinLocalRoom-CvteNe4R.js.map +1 -0
  163. package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs +1222 -0
  164. package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs.map +1 -0
  165. package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js +1223 -0
  166. package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js.map +1 -0
  167. package/dist/methods/background/launchBackground.d.ts +10 -0
  168. package/dist/methods/background/launchBackground.d.ts.map +1 -0
  169. package/dist/methods/breakoutRooms/breakoutRoomUpdated.d.ts +67 -0
  170. package/dist/methods/breakoutRooms/breakoutRoomUpdated.d.ts.map +1 -0
  171. package/dist/methods/breakoutRooms/handleStartBreakout.d.ts +42 -0
  172. package/dist/methods/breakoutRooms/handleStartBreakout.d.ts.map +1 -0
  173. package/dist/methods/breakoutRooms/handleStopBreakout.d.ts +33 -0
  174. package/dist/methods/breakoutRooms/handleStopBreakout.d.ts.map +1 -0
  175. package/dist/methods/breakoutRooms/index.d.ts +5 -0
  176. package/dist/methods/breakoutRooms/index.d.ts.map +1 -0
  177. package/dist/methods/breakoutRooms/launchBreakoutRooms.d.ts +25 -0
  178. package/dist/methods/breakoutRooms/launchBreakoutRooms.d.ts.map +1 -0
  179. package/dist/methods/coHost/launchCoHost.d.ts +25 -0
  180. package/dist/methods/coHost/launchCoHost.d.ts.map +1 -0
  181. package/dist/methods/coHostMethods/index.d.ts +3 -0
  182. package/dist/methods/coHostMethods/index.d.ts.map +1 -0
  183. package/dist/methods/coHostMethods/modifyCoHostSettings.d.ts +49 -0
  184. package/dist/methods/coHostMethods/modifyCoHostSettings.d.ts.map +1 -0
  185. package/dist/methods/displaySettings/index.d.ts +2 -0
  186. package/dist/methods/displaySettings/index.d.ts.map +1 -0
  187. package/dist/methods/displaySettings/launchDisplaySettings.d.ts +25 -0
  188. package/dist/methods/displaySettings/launchDisplaySettings.d.ts.map +1 -0
  189. package/dist/methods/displaySettings/modifyDisplaySettings.d.ts +106 -0
  190. package/dist/methods/displaySettings/modifyDisplaySettings.d.ts.map +1 -0
  191. package/dist/methods/exit/confirmExit.d.ts +38 -0
  192. package/dist/methods/exit/confirmExit.d.ts.map +1 -0
  193. package/dist/methods/exit/index.d.ts +3 -0
  194. package/dist/methods/exit/index.d.ts.map +1 -0
  195. package/dist/methods/exit/launchConfirmExit.d.ts +23 -0
  196. package/dist/methods/exit/launchConfirmExit.d.ts.map +1 -0
  197. package/dist/methods/index.cjs +3975 -0
  198. package/dist/methods/index.cjs.map +1 -0
  199. package/dist/methods/index.d.ts +66 -0
  200. package/dist/methods/index.d.ts.map +1 -0
  201. package/dist/methods/index.js +3976 -0
  202. package/dist/methods/index.js.map +1 -0
  203. package/dist/methods/mediaSettings/launchMediaSettings.d.ts +38 -0
  204. package/dist/methods/mediaSettings/launchMediaSettings.d.ts.map +1 -0
  205. package/dist/methods/menu/launchMenuModal.d.ts +22 -0
  206. package/dist/methods/menu/launchMenuModal.d.ts.map +1 -0
  207. package/dist/methods/message/index.d.ts +2 -0
  208. package/dist/methods/message/index.d.ts.map +1 -0
  209. package/dist/methods/message/launchMessages.d.ts +24 -0
  210. package/dist/methods/message/launchMessages.d.ts.map +1 -0
  211. package/dist/methods/message/sendMessage.d.ts +63 -0
  212. package/dist/methods/message/sendMessage.d.ts.map +1 -0
  213. package/dist/methods/panelists/focusPanelists.d.ts +24 -0
  214. package/dist/methods/panelists/focusPanelists.d.ts.map +1 -0
  215. package/dist/methods/panelists/index.d.ts +4 -0
  216. package/dist/methods/panelists/index.d.ts.map +1 -0
  217. package/dist/methods/panelists/launchPanelists.d.ts +7 -0
  218. package/dist/methods/panelists/launchPanelists.d.ts.map +1 -0
  219. package/dist/methods/panelists/updatePanelists.d.ts +35 -0
  220. package/dist/methods/panelists/updatePanelists.d.ts.map +1 -0
  221. package/dist/methods/participants/index.d.ts +4 -0
  222. package/dist/methods/participants/index.d.ts.map +1 -0
  223. package/dist/methods/participants/launchParticipants.d.ts +22 -0
  224. package/dist/methods/participants/launchParticipants.d.ts.map +1 -0
  225. package/dist/methods/participants/messageParticipants.d.ts +43 -0
  226. package/dist/methods/participants/messageParticipants.d.ts.map +1 -0
  227. package/dist/methods/participants/muteParticipants.d.ts +41 -0
  228. package/dist/methods/participants/muteParticipants.d.ts.map +1 -0
  229. package/dist/methods/participants/removeParticipants.d.ts +47 -0
  230. package/dist/methods/participants/removeParticipants.d.ts.map +1 -0
  231. package/dist/methods/permissions/index.d.ts +4 -0
  232. package/dist/methods/permissions/index.d.ts.map +1 -0
  233. package/dist/methods/permissions/launchPermissions.d.ts +7 -0
  234. package/dist/methods/permissions/launchPermissions.d.ts.map +1 -0
  235. package/dist/methods/permissions/updateParticipantPermission.d.ts +25 -0
  236. package/dist/methods/permissions/updateParticipantPermission.d.ts.map +1 -0
  237. package/dist/methods/permissions/updatePermissionConfig.d.ts +22 -0
  238. package/dist/methods/permissions/updatePermissionConfig.d.ts.map +1 -0
  239. package/dist/methods/polls/handleCreatePoll.d.ts +39 -0
  240. package/dist/methods/polls/handleCreatePoll.d.ts.map +1 -0
  241. package/dist/methods/polls/handleEndPoll.d.ts +34 -0
  242. package/dist/methods/polls/handleEndPoll.d.ts.map +1 -0
  243. package/dist/methods/polls/handleVotePoll.d.ts +39 -0
  244. package/dist/methods/polls/handleVotePoll.d.ts.map +1 -0
  245. package/dist/methods/polls/index.d.ts +4 -0
  246. package/dist/methods/polls/index.d.ts.map +1 -0
  247. package/dist/methods/polls/launchPoll.d.ts +22 -0
  248. package/dist/methods/polls/launchPoll.d.ts.map +1 -0
  249. package/dist/methods/polls/pollUpdated.d.ts +38 -0
  250. package/dist/methods/polls/pollUpdated.d.ts.map +1 -0
  251. package/dist/methods/prejoin/handleCreateRoom.d.ts +77 -0
  252. package/dist/methods/prejoin/handleCreateRoom.d.ts.map +1 -0
  253. package/dist/methods/prejoin/handleJoinRoom.d.ts +56 -0
  254. package/dist/methods/prejoin/handleJoinRoom.d.ts.map +1 -0
  255. package/dist/methods/prejoin/index.d.ts +5 -0
  256. package/dist/methods/prejoin/index.d.ts.map +1 -0
  257. package/dist/methods/recording/checkPauseState.d.ts +34 -0
  258. package/dist/methods/recording/checkPauseState.d.ts.map +1 -0
  259. package/dist/methods/recording/checkResumeState.d.ts +30 -0
  260. package/dist/methods/recording/checkResumeState.d.ts.map +1 -0
  261. package/dist/methods/recording/confirmRecording.d.ts +46 -0
  262. package/dist/methods/recording/confirmRecording.d.ts.map +1 -0
  263. package/dist/methods/recording/launchRecording.d.ts +56 -0
  264. package/dist/methods/recording/launchRecording.d.ts.map +1 -0
  265. package/dist/methods/recording/recordPauseTimer.d.ts +31 -0
  266. package/dist/methods/recording/recordPauseTimer.d.ts.map +1 -0
  267. package/dist/methods/recording/recordResumeTimer.d.ts +29 -0
  268. package/dist/methods/recording/recordResumeTimer.d.ts.map +1 -0
  269. package/dist/methods/recording/recordStartTimer.d.ts +45 -0
  270. package/dist/methods/recording/recordStartTimer.d.ts.map +1 -0
  271. package/dist/methods/recording/recordUpdateTimer.d.ts +29 -0
  272. package/dist/methods/recording/recordUpdateTimer.d.ts.map +1 -0
  273. package/dist/methods/recording/startRecording.d.ts +122 -0
  274. package/dist/methods/recording/startRecording.d.ts.map +1 -0
  275. package/dist/methods/recording/stopRecording.d.ts +36 -0
  276. package/dist/methods/recording/stopRecording.d.ts.map +1 -0
  277. package/dist/methods/recording/timeLeftRecording.d.ts +13 -0
  278. package/dist/methods/recording/timeLeftRecording.d.ts.map +1 -0
  279. package/dist/methods/recording/updateRecording.d.ts +49 -0
  280. package/dist/methods/recording/updateRecording.d.ts.map +1 -0
  281. package/dist/methods/requests/hostRequestResponse.d.ts +33 -0
  282. package/dist/methods/requests/hostRequestResponse.d.ts.map +1 -0
  283. package/dist/methods/requests/index.d.ts +2 -0
  284. package/dist/methods/requests/index.d.ts.map +1 -0
  285. package/dist/methods/requests/launchRequests.d.ts +22 -0
  286. package/dist/methods/requests/launchRequests.d.ts.map +1 -0
  287. package/dist/methods/requests/respondToRequests.d.ts +38 -0
  288. package/dist/methods/requests/respondToRequests.d.ts.map +1 -0
  289. package/dist/methods/settings/index.d.ts +3 -0
  290. package/dist/methods/settings/index.d.ts.map +1 -0
  291. package/dist/methods/settings/launchSettings.d.ts +22 -0
  292. package/dist/methods/settings/launchSettings.d.ts.map +1 -0
  293. package/dist/methods/settings/modifySettings.d.ts +45 -0
  294. package/dist/methods/settings/modifySettings.d.ts.map +1 -0
  295. package/dist/methods/socketReceive/allMembers.d.ts +117 -0
  296. package/dist/methods/socketReceive/allMembers.d.ts.map +1 -0
  297. package/dist/methods/socketReceive/allMembersRest.d.ts +122 -0
  298. package/dist/methods/socketReceive/allMembersRest.d.ts.map +1 -0
  299. package/dist/methods/socketReceive/allWaitingRoomMembers.d.ts +24 -0
  300. package/dist/methods/socketReceive/allWaitingRoomMembers.d.ts.map +1 -0
  301. package/dist/methods/socketReceive/banParticipant.d.ts +44 -0
  302. package/dist/methods/socketReceive/banParticipant.d.ts.map +1 -0
  303. package/dist/methods/socketReceive/controlMediaHost.d.ts +62 -0
  304. package/dist/methods/socketReceive/controlMediaHost.d.ts.map +1 -0
  305. package/dist/methods/socketReceive/disconnect.d.ts +24 -0
  306. package/dist/methods/socketReceive/disconnect.d.ts.map +1 -0
  307. package/dist/methods/socketReceive/disconnectUserSelf.d.ts +29 -0
  308. package/dist/methods/socketReceive/disconnectUserSelf.d.ts.map +1 -0
  309. package/dist/methods/socketReceive/getDomains.d.ts +48 -0
  310. package/dist/methods/socketReceive/getDomains.d.ts.map +1 -0
  311. package/dist/methods/socketReceive/meetingEnded.d.ts +27 -0
  312. package/dist/methods/socketReceive/meetingEnded.d.ts.map +1 -0
  313. package/dist/methods/socketReceive/meetingStillThere.d.ts +19 -0
  314. package/dist/methods/socketReceive/meetingStillThere.d.ts.map +1 -0
  315. package/dist/methods/socketReceive/panelistReceiveMethods.d.ts +66 -0
  316. package/dist/methods/socketReceive/panelistReceiveMethods.d.ts.map +1 -0
  317. package/dist/methods/socketReceive/participantRequested.d.ts +28 -0
  318. package/dist/methods/socketReceive/participantRequested.d.ts.map +1 -0
  319. package/dist/methods/socketReceive/permissionReceiveMethods.d.ts +23 -0
  320. package/dist/methods/socketReceive/permissionReceiveMethods.d.ts.map +1 -0
  321. package/dist/methods/socketReceive/personJoined.d.ts +24 -0
  322. package/dist/methods/socketReceive/personJoined.d.ts.map +1 -0
  323. package/dist/methods/socketReceive/producerMediaClosed.d.ts +66 -0
  324. package/dist/methods/socketReceive/producerMediaClosed.d.ts.map +1 -0
  325. package/dist/methods/socketReceive/producerMediaPaused.d.ts +70 -0
  326. package/dist/methods/socketReceive/producerMediaPaused.d.ts.map +1 -0
  327. package/dist/methods/socketReceive/producerMediaResumed.d.ts +53 -0
  328. package/dist/methods/socketReceive/producerMediaResumed.d.ts.map +1 -0
  329. package/dist/methods/socketReceive/reInitiateRecording.d.ts +33 -0
  330. package/dist/methods/socketReceive/reInitiateRecording.d.ts.map +1 -0
  331. package/dist/methods/socketReceive/receiveMessage.d.ts +36 -0
  332. package/dist/methods/socketReceive/receiveMessage.d.ts.map +1 -0
  333. package/dist/methods/socketReceive/recordingNotice.d.ts +98 -0
  334. package/dist/methods/socketReceive/recordingNotice.d.ts.map +1 -0
  335. package/dist/methods/socketReceive/roomRecordParams.d.ts +60 -0
  336. package/dist/methods/socketReceive/roomRecordParams.d.ts.map +1 -0
  337. package/dist/methods/socketReceive/screenProducerId.d.ts +36 -0
  338. package/dist/methods/socketReceive/screenProducerId.d.ts.map +1 -0
  339. package/dist/methods/socketReceive/startRecords.d.ts +31 -0
  340. package/dist/methods/socketReceive/startRecords.d.ts.map +1 -0
  341. package/dist/methods/socketReceive/stoppedRecording.d.ts +24 -0
  342. package/dist/methods/socketReceive/stoppedRecording.d.ts.map +1 -0
  343. package/dist/methods/socketReceive/translationReceiveMethods.d.ts +227 -0
  344. package/dist/methods/socketReceive/translationReceiveMethods.d.ts.map +1 -0
  345. package/dist/methods/socketReceive/updateConsumingDomains.d.ts +60 -0
  346. package/dist/methods/socketReceive/updateConsumingDomains.d.ts.map +1 -0
  347. package/dist/methods/socketReceive/updateMediaSettings.d.ts +28 -0
  348. package/dist/methods/socketReceive/updateMediaSettings.d.ts.map +1 -0
  349. package/dist/methods/socketReceive/updatedCoHost.d.ts +38 -0
  350. package/dist/methods/socketReceive/updatedCoHost.d.ts.map +1 -0
  351. package/dist/methods/socketReceive/userWaiting.d.ts +30 -0
  352. package/dist/methods/socketReceive/userWaiting.d.ts.map +1 -0
  353. package/dist/methods/stream/clickAudio.d.ts +71 -0
  354. package/dist/methods/stream/clickAudio.d.ts.map +1 -0
  355. package/dist/methods/stream/clickChat.d.ts +11 -0
  356. package/dist/methods/stream/clickChat.d.ts.map +1 -0
  357. package/dist/methods/stream/clickScreenShare.d.ts +45 -0
  358. package/dist/methods/stream/clickScreenShare.d.ts.map +1 -0
  359. package/dist/methods/stream/clickVideo.d.ts +101 -0
  360. package/dist/methods/stream/clickVideo.d.ts.map +1 -0
  361. package/dist/methods/stream/index.d.ts +5 -0
  362. package/dist/methods/stream/index.d.ts.map +1 -0
  363. package/dist/methods/stream/switchAudio.d.ts +40 -0
  364. package/dist/methods/stream/switchAudio.d.ts.map +1 -0
  365. package/dist/methods/stream/switchVideo.d.ts +56 -0
  366. package/dist/methods/stream/switchVideo.d.ts.map +1 -0
  367. package/dist/methods/stream/switchVideoAlt.d.ts +55 -0
  368. package/dist/methods/stream/switchVideoAlt.d.ts.map +1 -0
  369. package/dist/methods/utils/SoundPlayer.d.ts +19 -0
  370. package/dist/methods/utils/SoundPlayer.d.ts.map +1 -0
  371. package/dist/methods/utils/checkLimitsAndMakeRequest.d.ts +30 -0
  372. package/dist/methods/utils/checkLimitsAndMakeRequest.d.ts.map +1 -0
  373. package/dist/methods/utils/createResponseJoinRoom.d.ts +24 -0
  374. package/dist/methods/utils/createResponseJoinRoom.d.ts.map +1 -0
  375. package/dist/methods/utils/createRoomOnMediaSFU.d.ts +28 -0
  376. package/dist/methods/utils/createRoomOnMediaSFU.d.ts.map +1 -0
  377. package/dist/methods/utils/formatNumber.d.ts +21 -0
  378. package/dist/methods/utils/formatNumber.d.ts.map +1 -0
  379. package/dist/methods/utils/generateRandomMessages.d.ts +11 -0
  380. package/dist/methods/utils/generateRandomMessages.d.ts.map +1 -0
  381. package/dist/methods/utils/generateRandomParticipants.d.ts +10 -0
  382. package/dist/methods/utils/generateRandomParticipants.d.ts.map +1 -0
  383. package/dist/methods/utils/generateRandomPolls.d.ts +7 -0
  384. package/dist/methods/utils/generateRandomPolls.d.ts.map +1 -0
  385. package/dist/methods/utils/generateRandomRequestList.d.ts +10 -0
  386. package/dist/methods/utils/generateRandomRequestList.d.ts.map +1 -0
  387. package/dist/methods/utils/generateRandomWaitingRoomList.d.ts +4 -0
  388. package/dist/methods/utils/generateRandomWaitingRoomList.d.ts.map +1 -0
  389. package/dist/methods/utils/getModalPosition.d.ts +7 -0
  390. package/dist/methods/utils/getModalPosition.d.ts.map +1 -0
  391. package/dist/methods/utils/getOverlayPosition.d.ts +22 -0
  392. package/dist/methods/utils/getOverlayPosition.d.ts.map +1 -0
  393. package/dist/methods/utils/getParticipantMedia.d.ts +55 -0
  394. package/dist/methods/utils/getParticipantMedia.d.ts.map +1 -0
  395. package/dist/methods/utils/headless/getCurrentParams.d.ts +27 -0
  396. package/dist/methods/utils/headless/getCurrentParams.d.ts.map +1 -0
  397. package/dist/methods/utils/headless/getMediaStreams.d.ts +96 -0
  398. package/dist/methods/utils/headless/getMediaStreams.d.ts.map +1 -0
  399. package/dist/methods/utils/headless/getRoomReadiness.d.ts +25 -0
  400. package/dist/methods/utils/headless/getRoomReadiness.d.ts.map +1 -0
  401. package/dist/methods/utils/headless/headlessTypes.d.ts +89 -0
  402. package/dist/methods/utils/headless/headlessTypes.d.ts.map +1 -0
  403. package/dist/methods/utils/headless/index.d.ts +29 -0
  404. package/dist/methods/utils/headless/index.d.ts.map +1 -0
  405. package/dist/methods/utils/headless/mediaPermissions.d.ts +53 -0
  406. package/dist/methods/utils/headless/mediaPermissions.d.ts.map +1 -0
  407. package/dist/methods/utils/headless/mediaProduction.d.ts +177 -0
  408. package/dist/methods/utils/headless/mediaProduction.d.ts.map +1 -0
  409. package/dist/methods/utils/headless/moderation.d.ts +157 -0
  410. package/dist/methods/utils/headless/moderation.d.ts.map +1 -0
  411. package/dist/methods/utils/headless/participantState.d.ts +128 -0
  412. package/dist/methods/utils/headless/participantState.d.ts.map +1 -0
  413. package/dist/methods/utils/headless/playback.d.ts +106 -0
  414. package/dist/methods/utils/headless/playback.d.ts.map +1 -0
  415. package/dist/methods/utils/headless/roomActions.d.ts +88 -0
  416. package/dist/methods/utils/headless/roomActions.d.ts.map +1 -0
  417. package/dist/methods/utils/headless/sessionControls.d.ts +159 -0
  418. package/dist/methods/utils/headless/sessionControls.d.ts.map +1 -0
  419. package/dist/methods/utils/headless/sessionExtras.d.ts +291 -0
  420. package/dist/methods/utils/headless/sessionExtras.d.ts.map +1 -0
  421. package/dist/methods/utils/headless/sessionFeatures.d.ts +159 -0
  422. package/dist/methods/utils/headless/sessionFeatures.d.ts.map +1 -0
  423. package/dist/methods/utils/headless/viewerSession.d.ts +125 -0
  424. package/dist/methods/utils/headless/viewerSession.d.ts.map +1 -0
  425. package/dist/methods/utils/headless/virtualBackground.d.ts +72 -0
  426. package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -0
  427. package/dist/methods/utils/initialValuesState.d.ts +388 -0
  428. package/dist/methods/utils/initialValuesState.d.ts.map +1 -0
  429. package/dist/methods/utils/joinRoomOnMediaSFU.d.ts +56 -0
  430. package/dist/methods/utils/joinRoomOnMediaSFU.d.ts.map +1 -0
  431. package/dist/methods/utils/liveSubtitle.d.ts +36 -0
  432. package/dist/methods/utils/liveSubtitle.d.ts.map +1 -0
  433. package/dist/methods/utils/meetingTimeRemaining.d.ts +15 -0
  434. package/dist/methods/utils/meetingTimeRemaining.d.ts.map +1 -0
  435. package/dist/methods/utils/meetingTimer/startMeetingProgressTimer.d.ts +35 -0
  436. package/dist/methods/utils/meetingTimer/startMeetingProgressTimer.d.ts.map +1 -0
  437. package/dist/methods/utils/producer/aParams.d.ts +3 -0
  438. package/dist/methods/utils/producer/aParams.d.ts.map +1 -0
  439. package/dist/methods/utils/producer/hParams.d.ts +3 -0
  440. package/dist/methods/utils/producer/hParams.d.ts.map +1 -0
  441. package/dist/methods/utils/producer/screenParams.d.ts +3 -0
  442. package/dist/methods/utils/producer/screenParams.d.ts.map +1 -0
  443. package/dist/methods/utils/producer/vParams.d.ts +3 -0
  444. package/dist/methods/utils/producer/vParams.d.ts.map +1 -0
  445. package/dist/methods/utils/producer/videoCaptureConstraints.d.ts +145 -0
  446. package/dist/methods/utils/producer/videoCaptureConstraints.d.ts.map +1 -0
  447. package/dist/methods/utils/resolveMediaSFURoomApi.d.ts +4 -0
  448. package/dist/methods/utils/resolveMediaSFURoomApi.d.ts.map +1 -0
  449. package/dist/methods/utils/sleep.d.ts +21 -0
  450. package/dist/methods/utils/sleep.d.ts.map +1 -0
  451. package/dist/methods/utils/translationLanguages.d.ts +100 -0
  452. package/dist/methods/utils/translationLanguages.d.ts.map +1 -0
  453. package/dist/methods/utils/validateAlphanumeric.d.ts +21 -0
  454. package/dist/methods/utils/validateAlphanumeric.d.ts.map +1 -0
  455. package/dist/methods/utils/virtualBackgroundCompositor.d.ts +21 -0
  456. package/dist/methods/utils/virtualBackgroundCompositor.d.ts.map +1 -0
  457. package/dist/methods/utils/webrtc.d.ts +18 -0
  458. package/dist/methods/utils/webrtc.d.ts.map +1 -0
  459. package/dist/methods/waiting/index.d.ts +2 -0
  460. package/dist/methods/waiting/index.d.ts.map +1 -0
  461. package/dist/methods/waiting/launchWaiting.d.ts +23 -0
  462. package/dist/methods/waiting/launchWaiting.d.ts.map +1 -0
  463. package/dist/methods/waiting/respondToWaiting.d.ts +40 -0
  464. package/dist/methods/waiting/respondToWaiting.d.ts.map +1 -0
  465. package/dist/methods/welcome/handleWelcomeRequest.d.ts +47 -0
  466. package/dist/methods/welcome/handleWelcomeRequest.d.ts.map +1 -0
  467. package/dist/methods/welcome/index.d.ts +3 -0
  468. package/dist/methods/welcome/index.d.ts.map +1 -0
  469. package/dist/methods/whiteboard/captureCanvasStream.d.ts +38 -0
  470. package/dist/methods/whiteboard/captureCanvasStream.d.ts.map +1 -0
  471. package/dist/methods/whiteboard/handleStartWhiteboard.d.ts +31 -0
  472. package/dist/methods/whiteboard/handleStartWhiteboard.d.ts.map +1 -0
  473. package/dist/methods/whiteboard/handleStopWhiteboard.d.ts +25 -0
  474. package/dist/methods/whiteboard/handleStopWhiteboard.d.ts.map +1 -0
  475. package/dist/methods/whiteboard/index.d.ts +5 -0
  476. package/dist/methods/whiteboard/index.d.ts.map +1 -0
  477. package/dist/methods/whiteboard/launchConfigureWhiteboard.d.ts +23 -0
  478. package/dist/methods/whiteboard/launchConfigureWhiteboard.d.ts.map +1 -0
  479. package/dist/producers/producerEmits/joinConRoom.d.ts +54 -0
  480. package/dist/producers/producerEmits/joinConRoom.d.ts.map +1 -0
  481. package/dist/producers/producerEmits/joinLocalRoom.d.ts +30 -0
  482. package/dist/producers/producerEmits/joinLocalRoom.d.ts.map +1 -0
  483. package/dist/producers/producerEmits/joinRoom.d.ts +35 -0
  484. package/dist/producers/producerEmits/joinRoom.d.ts.map +1 -0
  485. package/dist/readme/mediasfu-platform-capabilities.webp +0 -0
  486. package/dist/sockets/SocketManager.d.ts +102 -0
  487. package/dist/sockets/SocketManager.d.ts.map +1 -0
  488. package/dist/translationConsumerSwitch-C20MfNNq.cjs +509 -0
  489. package/dist/translationConsumerSwitch-C20MfNNq.cjs.map +1 -0
  490. package/dist/translationConsumerSwitch-zKuS5wgH.js +510 -0
  491. package/dist/translationConsumerSwitch-zKuS5wgH.js.map +1 -0
  492. package/dist/types/index.cjs +85 -0
  493. package/dist/types/index.cjs.map +1 -0
  494. package/dist/types/index.d.ts +2 -0
  495. package/dist/types/index.d.ts.map +1 -0
  496. package/dist/types/index.js +85 -0
  497. package/dist/types/index.js.map +1 -0
  498. package/dist/types/shared-base-types.d.ts +656 -0
  499. package/dist/types/shared-base-types.d.ts.map +1 -0
  500. package/dist/types/types.d.ts +124 -0
  501. package/dist/types/types.d.ts.map +1 -0
  502. package/dist/updateParticipantAudioDecibels-DLd8Y-Fh.js +5392 -0
  503. package/dist/updateParticipantAudioDecibels-DLd8Y-Fh.js.map +1 -0
  504. package/dist/updateParticipantAudioDecibels-DPmHiy3K.cjs +5391 -0
  505. package/dist/updateParticipantAudioDecibels-DPmHiy3K.cjs.map +1 -0
  506. package/dist/validateAlphanumeric-DKn5BsUP.cjs +15 -0
  507. package/dist/validateAlphanumeric-DKn5BsUP.cjs.map +1 -0
  508. package/dist/validateAlphanumeric-Dk1JB80W.js +16 -0
  509. package/dist/validateAlphanumeric-Dk1JB80W.js.map +1 -0
  510. package/package.json +106 -99
  511. package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +1 -2
  512. package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +1 -1
  513. package/src/consumers/connectIps.ts +1 -1
  514. package/src/consumers/connectRecvTransport.ts +1 -1
  515. package/src/consumers/connectSendTransport.ts +1 -1
  516. package/src/consumers/connectSendTransportAudio.ts +1 -1
  517. package/src/consumers/connectSendTransportScreen.ts +5 -2
  518. package/src/consumers/connectSendTransportVideo.ts +1 -1
  519. package/src/consumers/createSendTransport.ts +34 -29
  520. package/src/consumers/disconnectSendTransportAudio.ts +1 -1
  521. package/src/consumers/disconnectSendTransportScreen.ts +1 -1
  522. package/src/consumers/disconnectSendTransportVideo.ts +1 -1
  523. package/src/consumers/index.ts +61 -0
  524. package/src/consumers/resumeSendTransportAudio.ts +1 -1
  525. package/src/consumers/signalNewConsumerTransport.ts +1 -2
  526. package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +1 -1
  527. package/src/consumers/socketReceiveMethods/newPipeProducer.ts +1 -1
  528. package/src/consumers/streamSuccessAudio.ts +1 -2
  529. package/src/consumers/streamSuccessAudioSwitch.ts +1 -2
  530. package/src/consumers/streamSuccessVideo.ts +35 -6
  531. package/src/index.native.ts +24 -1
  532. package/src/index.ts +7 -0
  533. package/src/methods/exit/confirmExit.ts +11 -4
  534. package/src/methods/socketReceive/getDomains.ts +1 -1
  535. package/src/methods/utils/getParticipantMedia.ts +112 -0
  536. package/src/methods/utils/headless/getCurrentParams.ts +44 -0
  537. package/src/methods/utils/headless/getMediaStreams.ts +256 -0
  538. package/src/methods/utils/headless/getRoomReadiness.ts +49 -0
  539. package/src/methods/utils/headless/headlessTypes.ts +102 -0
  540. package/src/methods/utils/headless/index.ts +28 -0
  541. package/src/methods/utils/headless/mediaPermissions.ts +124 -0
  542. package/src/methods/utils/headless/mediaProduction.ts +505 -0
  543. package/src/methods/utils/headless/moderation.ts +455 -0
  544. package/src/methods/utils/headless/participantState.ts +254 -0
  545. package/src/methods/utils/headless/playback.ts +336 -0
  546. package/src/methods/utils/headless/roomActions.ts +230 -0
  547. package/src/methods/utils/headless/sessionControls.ts +335 -0
  548. package/src/methods/utils/headless/sessionExtras.ts +593 -0
  549. package/src/methods/utils/headless/sessionFeatures.ts +480 -0
  550. package/src/methods/utils/headless/viewerSession.ts +246 -0
  551. package/src/methods/utils/headless/virtualBackground.ts +280 -0
  552. package/src/methods/utils/resolveMediaSFURoomApi.ts +2 -2
  553. package/src/methods/utils/virtualBackgroundCompositor.ts +53 -0
  554. package/src/methods/whiteboard/captureCanvasStream.ts +2 -2
  555. package/src/producers/producerEmits/joinConRoom.ts +1 -1
  556. package/src/producers/producerEmits/joinRoom.ts +1 -1
  557. package/src/types/index.ts +1 -0
  558. package/src/types/shared-base-types.ts +2 -3
@@ -0,0 +1,3975 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const joinRoomOnMediaSFU = require("../joinRoomOnMediaSFU-CC8RVJgr.cjs");
4
+ const validateAlphanumeric$1 = require("../validateAlphanumeric-DKn5BsUP.cjs");
5
+ const launchPanelists = ({
6
+ updateIsPanelistsModalVisible,
7
+ isPanelistsModalVisible
8
+ }) => {
9
+ updateIsPanelistsModalVisible(!isPanelistsModalVisible);
10
+ };
11
+ const updatePanelists = async ({
12
+ socket,
13
+ panelists,
14
+ roomName,
15
+ member: _member,
16
+ islevel,
17
+ showAlert
18
+ }) => {
19
+ if (islevel !== "2") {
20
+ showAlert?.({ message: "Only the host can update panelists", type: "danger", duration: 3e3 });
21
+ return;
22
+ }
23
+ socket.emit(
24
+ "updatePanelists",
25
+ {
26
+ panelists: panelists.map((p) => ({ id: p.id, name: p.name })),
27
+ roomName
28
+ },
29
+ (response) => {
30
+ if (!response?.success) {
31
+ showAlert?.({ message: response?.reason || "Failed to update panelists", type: "danger", duration: 3e3 });
32
+ }
33
+ }
34
+ );
35
+ };
36
+ const addPanelist = async ({
37
+ socket,
38
+ participant,
39
+ currentPanelists,
40
+ maxPanelists,
41
+ roomName,
42
+ member: _member,
43
+ islevel,
44
+ showAlert
45
+ }) => {
46
+ if (islevel !== "2") {
47
+ showAlert?.({ message: "Only the host can add panelists", type: "danger", duration: 3e3 });
48
+ return false;
49
+ }
50
+ if (currentPanelists.some((p) => p.id === participant.id)) {
51
+ showAlert?.({ message: `${participant.name} is already a panelist`, type: "success", duration: 3e3 });
52
+ return false;
53
+ }
54
+ if (currentPanelists.length >= maxPanelists) {
55
+ showAlert?.({ message: `Maximum panelist limit (${maxPanelists}) reached`, type: "danger", duration: 3e3 });
56
+ return false;
57
+ }
58
+ return new Promise((resolve) => {
59
+ socket.emit(
60
+ "addPanelist",
61
+ {
62
+ participantId: participant.id,
63
+ participantName: participant.name,
64
+ roomName
65
+ },
66
+ (response) => {
67
+ if (!response?.success) {
68
+ showAlert?.({ message: response?.reason || "Failed to add panelist", type: "danger", duration: 3e3 });
69
+ resolve(false);
70
+ } else {
71
+ resolve(true);
72
+ }
73
+ }
74
+ );
75
+ });
76
+ };
77
+ const removePanelist = async ({
78
+ socket,
79
+ participant,
80
+ roomName,
81
+ member: _member,
82
+ islevel,
83
+ showAlert
84
+ }) => {
85
+ if (islevel !== "2") {
86
+ showAlert?.({ message: "Only the host can remove panelists", type: "danger", duration: 3e3 });
87
+ return;
88
+ }
89
+ socket.emit(
90
+ "removePanelist",
91
+ {
92
+ participantId: participant.id,
93
+ participantName: participant.name,
94
+ roomName
95
+ },
96
+ (response) => {
97
+ if (!response?.success) {
98
+ showAlert?.({ message: response?.reason || "Failed to remove panelist", type: "danger", duration: 3e3 });
99
+ }
100
+ }
101
+ );
102
+ };
103
+ const focusPanelists = async ({
104
+ socket,
105
+ roomName,
106
+ member: _member,
107
+ islevel,
108
+ focusEnabled,
109
+ muteOthersMic = false,
110
+ muteOthersCamera = false,
111
+ showAlert
112
+ }) => {
113
+ if (islevel !== "2") {
114
+ showAlert?.({ message: "Only the host can focus panelists", type: "danger", duration: 3e3 });
115
+ return;
116
+ }
117
+ socket.emit(
118
+ "focusPanelists",
119
+ {
120
+ roomName,
121
+ focusEnabled,
122
+ muteOthersMic,
123
+ muteOthersCamera
124
+ },
125
+ (response) => {
126
+ if (!response?.success) {
127
+ showAlert?.({ message: response?.reason || "Failed to focus panelists", type: "danger", duration: 3e3 });
128
+ }
129
+ }
130
+ );
131
+ };
132
+ const unfocusPanelists = async ({
133
+ socket,
134
+ roomName,
135
+ member: _member,
136
+ islevel,
137
+ showAlert
138
+ }) => {
139
+ if (islevel !== "2") {
140
+ showAlert?.({ message: "Only the host can unfocus panelists", type: "danger", duration: 3e3 });
141
+ return;
142
+ }
143
+ socket.emit(
144
+ "focusPanelists",
145
+ {
146
+ roomName,
147
+ focusEnabled: false,
148
+ muteOthersMic: false,
149
+ muteOthersCamera: false
150
+ },
151
+ (response) => {
152
+ if (!response?.success) {
153
+ showAlert?.({ message: response?.reason || "Failed to unfocus panelists", type: "danger", duration: 3e3 });
154
+ }
155
+ }
156
+ );
157
+ };
158
+ const launchPermissions = ({
159
+ updateIsPermissionsModalVisible,
160
+ isPermissionsModalVisible
161
+ }) => {
162
+ updateIsPermissionsModalVisible(!isPermissionsModalVisible);
163
+ };
164
+ const updateParticipantPermission = async ({
165
+ socket,
166
+ participant,
167
+ newLevel,
168
+ member: _member,
169
+ islevel,
170
+ roomName,
171
+ showAlert
172
+ }) => {
173
+ if (islevel !== "2") {
174
+ showAlert?.({ message: "Only the host can update participant permissions", type: "danger", duration: 3e3 });
175
+ return;
176
+ }
177
+ if (participant.islevel === "2") {
178
+ showAlert?.({ message: "Cannot change the host's permission level", type: "danger", duration: 3e3 });
179
+ return;
180
+ }
181
+ if (participant.islevel === newLevel) return;
182
+ return new Promise((resolve) => {
183
+ socket.emit(
184
+ "updateParticipantPermission",
185
+ {
186
+ participantId: participant.id,
187
+ participantName: participant.name,
188
+ newLevel,
189
+ roomName
190
+ },
191
+ (response) => {
192
+ if (!response?.success) {
193
+ showAlert?.({ message: response?.reason || "Failed to update permission", type: "danger", duration: 3e3 });
194
+ }
195
+ resolve();
196
+ }
197
+ );
198
+ });
199
+ };
200
+ const bulkUpdateParticipantPermissions = async ({
201
+ socket,
202
+ participants,
203
+ newLevel,
204
+ member: _member,
205
+ islevel,
206
+ roomName,
207
+ showAlert,
208
+ maxBatchSize = 50
209
+ }) => {
210
+ if (islevel !== "2") {
211
+ showAlert?.({ message: "Only the host can update participant permissions", type: "danger", duration: 3e3 });
212
+ return;
213
+ }
214
+ const eligibleParticipants = participants.filter(
215
+ (p) => p.islevel !== "2" && p.islevel !== newLevel
216
+ );
217
+ if (eligibleParticipants.length === 0) {
218
+ showAlert?.({
219
+ message: "No participants to update",
220
+ type: "info",
221
+ duration: 3e3
222
+ });
223
+ return;
224
+ }
225
+ const batch = eligibleParticipants.slice(0, maxBatchSize);
226
+ return new Promise((resolve) => {
227
+ socket.emit(
228
+ "bulkUpdateParticipantPermissions",
229
+ {
230
+ updates: batch.map((p) => ({
231
+ participantId: p.id,
232
+ participantName: p.name,
233
+ newLevel
234
+ })),
235
+ roomName
236
+ },
237
+ (response) => {
238
+ if (!response?.success) {
239
+ showAlert?.({
240
+ message: response?.reason || "Failed to update permissions",
241
+ type: "danger",
242
+ duration: 3e3
243
+ });
244
+ } else if (eligibleParticipants.length > maxBatchSize) {
245
+ showAlert?.({
246
+ message: `Updated ${batch.length} participants. ${eligibleParticipants.length - maxBatchSize} remaining.`,
247
+ type: "info",
248
+ duration: 3e3
249
+ });
250
+ }
251
+ resolve();
252
+ }
253
+ );
254
+ });
255
+ };
256
+ const updatePermissionConfig = async ({
257
+ socket,
258
+ config,
259
+ islevel,
260
+ roomName,
261
+ showAlert
262
+ }) => {
263
+ if (islevel !== "2") {
264
+ showAlert?.({ message: "Only the host can update permission configuration", type: "danger", duration: 3e3 });
265
+ return;
266
+ }
267
+ return new Promise((resolve) => {
268
+ socket.emit(
269
+ "updatePermissionConfig",
270
+ {
271
+ config,
272
+ roomName
273
+ },
274
+ (response) => {
275
+ if (!response?.success) {
276
+ showAlert?.({ message: response?.reason || "Failed to update permission config", type: "danger", duration: 3e3 });
277
+ }
278
+ resolve();
279
+ }
280
+ );
281
+ });
282
+ };
283
+ const pollUpdated = async ({
284
+ data,
285
+ polls,
286
+ poll,
287
+ member,
288
+ islevel,
289
+ showAlert,
290
+ updatePolls,
291
+ updatePoll,
292
+ updateIsPollModalVisible
293
+ }) => {
294
+ try {
295
+ if (data.polls) {
296
+ polls = data.polls;
297
+ updatePolls(data.polls);
298
+ } else {
299
+ polls = [data.poll];
300
+ updatePolls(polls);
301
+ }
302
+ let tempPoll = { id: "" };
303
+ if (poll) {
304
+ tempPoll = { ...poll };
305
+ }
306
+ if (data.status !== "ended") {
307
+ poll = data.poll;
308
+ updatePoll(data.poll);
309
+ }
310
+ if (data.status === "started" && islevel !== "2") {
311
+ if (!poll.voters || poll.voters && !poll.voters[member]) {
312
+ showAlert?.({
313
+ message: "New poll started",
314
+ type: "success",
315
+ duration: 3e3
316
+ });
317
+ updateIsPollModalVisible(true);
318
+ }
319
+ } else if (data.status === "ended") {
320
+ if (tempPoll.id === data.poll.id) {
321
+ showAlert?.({ message: "Poll ended", type: "danger", duration: 3e3 });
322
+ updatePoll(data.poll);
323
+ }
324
+ }
325
+ } catch {
326
+ }
327
+ };
328
+ async function handleCreateRoom({
329
+ payload,
330
+ localLink = "",
331
+ connectMediaSFU = true,
332
+ apiUserName,
333
+ apiKey,
334
+ validate = true,
335
+ parameters,
336
+ initSocket,
337
+ localData,
338
+ createMediaSFURoom
339
+ }) {
340
+ const {
341
+ updateIsLoadingModalVisible,
342
+ updateSocket,
343
+ updateApiUserName,
344
+ updateApiToken,
345
+ updateLink,
346
+ updateRoomName,
347
+ updateMember,
348
+ updateValidated,
349
+ showAlert
350
+ } = parameters;
351
+ const createLocalRoom = async ({
352
+ createData,
353
+ link = localLink
354
+ }) => {
355
+ initSocket?.emit("createRoom", createData, (response) => {
356
+ if (response.success) {
357
+ updateSocket(initSocket);
358
+ updateApiUserName(localData?.apiUserName || "");
359
+ updateApiToken(response.secret);
360
+ updateLink(link);
361
+ updateRoomName(createData.eventID);
362
+ updateMember(createData.userName + "_2");
363
+ updateIsLoadingModalVisible(false);
364
+ updateValidated(true);
365
+ } else {
366
+ updateIsLoadingModalVisible(false);
367
+ showAlert?.({
368
+ message: `Unable to create room. ${response.reason}`,
369
+ type: "danger",
370
+ duration: 3e3
371
+ });
372
+ }
373
+ });
374
+ };
375
+ const roomCreator = async ({
376
+ payload: createPayload,
377
+ apiUserName: userName,
378
+ apiKey: key,
379
+ validate: shouldValidate = true
380
+ }) => {
381
+ const response = await createMediaSFURoom({
382
+ payload: createPayload,
383
+ apiUserName: userName,
384
+ apiKey: key,
385
+ localLink
386
+ });
387
+ if (response.success && response.data && "roomName" in response.data) {
388
+ await joinRoomOnMediaSFU.checkLimitsAndMakeRequest({
389
+ apiUserName: response.data.roomName,
390
+ apiToken: response.data.secret,
391
+ link: response.data.link,
392
+ userName: createPayload.userName,
393
+ parameters,
394
+ validate: shouldValidate
395
+ });
396
+ return response;
397
+ } else {
398
+ updateIsLoadingModalVisible(false);
399
+ showAlert?.({
400
+ message: `Unable to create room. ${response.data ? "error" in response.data ? response.data.error : "" : ""}`,
401
+ type: "danger",
402
+ duration: 3e3
403
+ });
404
+ }
405
+ };
406
+ updateIsLoadingModalVisible(true);
407
+ if (localLink.length > 0) {
408
+ const secureCode = Math.random().toString(30).substring(2, 14) + Math.random().toString(30).substring(2, 14);
409
+ let eventID = (/* @__PURE__ */ new Date()).getTime().toString(30) + (/* @__PURE__ */ new Date()).getUTCMilliseconds() + Math.floor(10 + Math.random() * 99).toString();
410
+ eventID = "m" + eventID;
411
+ const eventRoomParams = localData?.meetingRoomParams_;
412
+ if (eventRoomParams && payload.eventType) {
413
+ eventRoomParams.type = payload.eventType;
414
+ }
415
+ const createData = {
416
+ eventID,
417
+ duration: payload.duration,
418
+ capacity: payload.capacity,
419
+ userName: payload.userName,
420
+ scheduledDate: /* @__PURE__ */ new Date(),
421
+ secureCode,
422
+ waitRoom: false,
423
+ recordingParams: localData?.recordingParams_,
424
+ eventRoomParams,
425
+ videoPreference: null,
426
+ audioPreference: null,
427
+ audioOutputPreference: null,
428
+ mediasfuURL: ""
429
+ };
430
+ if (connectMediaSFU && initSocket && localData && localData.apiUserName && localData.apiKey) {
431
+ const localApiUserName = localData.apiUserName;
432
+ const localApiKey = localData.apiKey;
433
+ const roomIdentifier = `local_create_${payload.userName}_${payload.duration}_${payload.capacity}`;
434
+ const pendingKey = `prejoin_pending_${roomIdentifier}`;
435
+ const PENDING_TIMEOUT = 30 * 1e3;
436
+ try {
437
+ const pendingRequest = localStorage.getItem(pendingKey);
438
+ if (pendingRequest) {
439
+ const pendingData = JSON.parse(pendingRequest);
440
+ const timeSincePending = Date.now() - (pendingData?.timestamp ?? 0);
441
+ if (timeSincePending < PENDING_TIMEOUT) {
442
+ updateIsLoadingModalVisible(false);
443
+ showAlert?.({
444
+ message: "Room creation already in progress",
445
+ type: "danger",
446
+ duration: 3e3
447
+ });
448
+ return;
449
+ } else {
450
+ try {
451
+ localStorage.removeItem(pendingKey);
452
+ } catch {
453
+ }
454
+ }
455
+ }
456
+ } catch {
457
+ }
458
+ try {
459
+ localStorage.setItem(
460
+ pendingKey,
461
+ JSON.stringify({
462
+ timestamp: Date.now(),
463
+ payload: {
464
+ action: "create",
465
+ userName: payload.userName,
466
+ duration: payload.duration,
467
+ capacity: payload.capacity
468
+ }
469
+ })
470
+ );
471
+ setTimeout(() => {
472
+ try {
473
+ localStorage.removeItem(pendingKey);
474
+ } catch {
475
+ }
476
+ }, PENDING_TIMEOUT);
477
+ } catch {
478
+ }
479
+ payload.recordOnly = true;
480
+ try {
481
+ const response = await roomCreator({
482
+ payload,
483
+ apiUserName: localApiUserName,
484
+ apiKey: localApiKey,
485
+ validate: false
486
+ });
487
+ try {
488
+ localStorage.removeItem(pendingKey);
489
+ } catch {
490
+ }
491
+ if (response && response.success && response.data && "roomName" in response.data) {
492
+ createData.eventID = response.data.roomName;
493
+ createData.secureCode = response.data.secureCode || "";
494
+ createData.mediasfuURL = response.data.publicURL;
495
+ await createLocalRoom({
496
+ createData,
497
+ link: response.data.link
498
+ });
499
+ } else {
500
+ updateIsLoadingModalVisible(false);
501
+ showAlert?.({
502
+ message: `Unable to create room on MediaSFU.`,
503
+ type: "danger",
504
+ duration: 3e3
505
+ });
506
+ try {
507
+ updateSocket(initSocket);
508
+ await createLocalRoom({ createData });
509
+ } catch (error) {
510
+ updateIsLoadingModalVisible(false);
511
+ showAlert?.({
512
+ message: `Unable to create room. ${error}`,
513
+ type: "danger",
514
+ duration: 3e3
515
+ });
516
+ }
517
+ }
518
+ } catch (error) {
519
+ try {
520
+ localStorage.removeItem(pendingKey);
521
+ } catch {
522
+ }
523
+ updateIsLoadingModalVisible(false);
524
+ showAlert?.({
525
+ message: `Unable to create room on MediaSFU. ${error}`,
526
+ type: "danger",
527
+ duration: 3e3
528
+ });
529
+ }
530
+ } else {
531
+ try {
532
+ updateSocket(initSocket);
533
+ await createLocalRoom({ createData });
534
+ } catch (error) {
535
+ updateIsLoadingModalVisible(false);
536
+ showAlert?.({
537
+ message: `Unable to create room. ${error}`,
538
+ type: "danger",
539
+ duration: 3e3
540
+ });
541
+ }
542
+ }
543
+ } else {
544
+ const roomIdentifier = `mediasfu_create_${payload.userName}_${payload.duration}_${payload.capacity}`;
545
+ const pendingKey = `prejoin_pending_${roomIdentifier}`;
546
+ const PENDING_TIMEOUT = 30 * 1e3;
547
+ try {
548
+ const pendingRequest = localStorage.getItem(pendingKey);
549
+ if (pendingRequest) {
550
+ const pendingData = JSON.parse(pendingRequest);
551
+ const timeSincePending = Date.now() - (pendingData?.timestamp ?? 0);
552
+ if (timeSincePending < PENDING_TIMEOUT) {
553
+ updateIsLoadingModalVisible(false);
554
+ showAlert?.({
555
+ message: "Room creation already in progress",
556
+ type: "danger",
557
+ duration: 3e3
558
+ });
559
+ return;
560
+ } else {
561
+ try {
562
+ localStorage.removeItem(pendingKey);
563
+ } catch {
564
+ }
565
+ }
566
+ }
567
+ } catch {
568
+ }
569
+ try {
570
+ localStorage.setItem(
571
+ pendingKey,
572
+ JSON.stringify({
573
+ timestamp: Date.now(),
574
+ payload: {
575
+ action: "create",
576
+ userName: payload.userName,
577
+ duration: payload.duration,
578
+ capacity: payload.capacity
579
+ }
580
+ })
581
+ );
582
+ setTimeout(() => {
583
+ try {
584
+ localStorage.removeItem(pendingKey);
585
+ } catch {
586
+ }
587
+ }, PENDING_TIMEOUT);
588
+ } catch {
589
+ }
590
+ try {
591
+ await roomCreator({
592
+ payload,
593
+ apiUserName,
594
+ apiKey,
595
+ validate
596
+ });
597
+ try {
598
+ localStorage.removeItem(pendingKey);
599
+ } catch {
600
+ }
601
+ } catch (error) {
602
+ try {
603
+ localStorage.removeItem(pendingKey);
604
+ } catch {
605
+ }
606
+ updateIsLoadingModalVisible(false);
607
+ showAlert?.({
608
+ message: `Unable to create room. ${error}`,
609
+ type: "danger",
610
+ duration: 3e3
611
+ });
612
+ }
613
+ }
614
+ }
615
+ async function handleJoinRoom({
616
+ payload,
617
+ localLink = "",
618
+ apiUserName,
619
+ apiKey,
620
+ parameters,
621
+ initSocket,
622
+ localData,
623
+ joinMediaSFURoom
624
+ }) {
625
+ const {
626
+ updateIsLoadingModalVisible,
627
+ updateSocket,
628
+ updateApiUserName,
629
+ updateApiToken,
630
+ updateLink,
631
+ updateRoomName,
632
+ updateMember,
633
+ updateValidated,
634
+ showAlert
635
+ } = parameters;
636
+ const joinLocalRoom = async ({ joinData, link = localLink }) => {
637
+ initSocket?.emit("joinEventRoom", joinData, (response2) => {
638
+ if (response2.success) {
639
+ updateSocket(initSocket);
640
+ updateApiUserName(localData?.apiUserName || "");
641
+ updateApiToken(response2.secret);
642
+ updateLink(link);
643
+ updateRoomName(joinData.eventID);
644
+ updateMember(joinData.userName);
645
+ updateIsLoadingModalVisible(false);
646
+ updateValidated(true);
647
+ } else {
648
+ updateIsLoadingModalVisible(false);
649
+ showAlert?.({
650
+ message: `Unable to join room. ${response2.reason}`,
651
+ type: "danger",
652
+ duration: 3e3
653
+ });
654
+ }
655
+ });
656
+ };
657
+ if (localLink.length > 0 && !localLink.includes("mediasfu.com")) {
658
+ const joinData = {
659
+ eventID: payload.meetingID,
660
+ userName: payload.userName,
661
+ secureCode: "",
662
+ videoPreference: null,
663
+ audioPreference: null,
664
+ audioOutputPreference: null
665
+ };
666
+ await joinLocalRoom({ joinData });
667
+ return;
668
+ }
669
+ updateIsLoadingModalVisible(true);
670
+ const response = await joinMediaSFURoom({
671
+ payload,
672
+ apiUserName,
673
+ apiKey,
674
+ localLink
675
+ });
676
+ if (response.success && response.data && "roomName" in response.data) {
677
+ await joinRoomOnMediaSFU.checkLimitsAndMakeRequest({
678
+ apiUserName: response.data.roomName,
679
+ apiToken: response.data.secret,
680
+ link: response.data.link,
681
+ userName: payload.userName,
682
+ parameters
683
+ });
684
+ } else {
685
+ updateIsLoadingModalVisible(false);
686
+ showAlert?.({
687
+ message: `Unable to join room. ${response.data ? "error" in response.data ? response.data.error : "" : ""}`,
688
+ type: "danger",
689
+ duration: 3e3
690
+ });
691
+ }
692
+ }
693
+ const clickChat = async ({
694
+ isMessagesModalVisible,
695
+ updateIsMessagesModalVisible,
696
+ chatSetting,
697
+ islevel,
698
+ showAlert
699
+ }) => {
700
+ if (isMessagesModalVisible) {
701
+ updateIsMessagesModalVisible(false);
702
+ return;
703
+ }
704
+ if (chatSetting !== "allow" && islevel !== "2") {
705
+ updateIsMessagesModalVisible(false);
706
+ showAlert?.({
707
+ message: "Chat is disabled for this event.",
708
+ type: "danger",
709
+ duration: 3e3
710
+ });
711
+ return;
712
+ }
713
+ updateIsMessagesModalVisible(true);
714
+ };
715
+ const createLiveSubtitle = (params) => {
716
+ const timestamp = params.timestamp ?? Date.now();
717
+ const duration = Math.min(8e3, Math.max(3e3, 3e3 + params.text.length * 50));
718
+ return {
719
+ text: params.text,
720
+ language: params.language,
721
+ timestamp,
722
+ expiresAt: timestamp + duration,
723
+ speakerId: params.speakerId,
724
+ speakerName: params.speakerName
725
+ };
726
+ };
727
+ const isSubtitleExpired = (subtitle, now = Date.now()) => {
728
+ return now >= subtitle.expiresAt;
729
+ };
730
+ const pruneExpiredSubtitles = (subtitles, now = Date.now()) => {
731
+ const next = new Map(subtitles);
732
+ for (const [key, subtitle] of next.entries()) {
733
+ if (isSubtitleExpired(subtitle, now)) {
734
+ next.delete(key);
735
+ }
736
+ }
737
+ return next;
738
+ };
739
+ const updateLiveSubtitlesFromTranscript = ({
740
+ currentSubtitles,
741
+ transcript,
742
+ now
743
+ }) => {
744
+ const subtitle = createLiveSubtitle({
745
+ text: transcript.translatedText || transcript.originalText,
746
+ language: transcript.language,
747
+ speakerId: transcript.speakerId,
748
+ speakerName: transcript.speakerName,
749
+ timestamp: now ?? transcript.timestamp
750
+ });
751
+ const next = pruneExpiredSubtitles(currentSubtitles, subtitle.timestamp);
752
+ next.set(transcript.speakerId, subtitle);
753
+ if (transcript.speakerName) {
754
+ next.set(transcript.speakerName, subtitle);
755
+ }
756
+ return next;
757
+ };
758
+ const getSubtitleForSpeaker = (subtitles, speakerId, speakerName, now = Date.now()) => {
759
+ const activeSubtitles = pruneExpiredSubtitles(subtitles, now);
760
+ if (speakerId && activeSubtitles.has(speakerId)) {
761
+ return activeSubtitles.get(speakerId) || null;
762
+ }
763
+ if (speakerName && activeSubtitles.has(speakerName)) {
764
+ return activeSubtitles.get(speakerName) || null;
765
+ }
766
+ return null;
767
+ };
768
+ const SUPPORTED_LANGUAGE_CODES = [
769
+ "en",
770
+ "es",
771
+ "fr",
772
+ "de",
773
+ "it",
774
+ "pt",
775
+ "ru",
776
+ "zh",
777
+ "ja",
778
+ "ko",
779
+ "ar",
780
+ "hi",
781
+ "bn",
782
+ "pa",
783
+ "te",
784
+ "mr",
785
+ "ta",
786
+ "ur",
787
+ "gu",
788
+ "kn",
789
+ "ml",
790
+ "ne",
791
+ "si",
792
+ "nl",
793
+ "pl",
794
+ "tr",
795
+ "cs",
796
+ "el",
797
+ "hu",
798
+ "ro",
799
+ "sv",
800
+ "da",
801
+ "fi",
802
+ "no",
803
+ "sk",
804
+ "uk",
805
+ "bg",
806
+ "hr",
807
+ "et",
808
+ "lt",
809
+ "lv",
810
+ "sl",
811
+ "sr",
812
+ "bs",
813
+ "mk",
814
+ "is",
815
+ "ga",
816
+ "cy",
817
+ "mt",
818
+ "lb",
819
+ "sq",
820
+ "be",
821
+ "he",
822
+ "fa",
823
+ "ps",
824
+ "ku",
825
+ "vi",
826
+ "th",
827
+ "id",
828
+ "ms",
829
+ "tl",
830
+ "km",
831
+ "lo",
832
+ "my",
833
+ "sw",
834
+ "yo",
835
+ "ig",
836
+ "ha",
837
+ "zu",
838
+ "xh",
839
+ "af",
840
+ "st",
841
+ "tn",
842
+ "sn",
843
+ "am",
844
+ "so",
845
+ "rw",
846
+ "mg",
847
+ "ny",
848
+ "ee",
849
+ "tw",
850
+ "gaa",
851
+ "ka",
852
+ "hy",
853
+ "az",
854
+ "eu",
855
+ "gl",
856
+ "ca",
857
+ "la",
858
+ "eo",
859
+ "kk",
860
+ "uz",
861
+ "tg",
862
+ "ky",
863
+ "tk",
864
+ "mn",
865
+ "auto"
866
+ ];
867
+ const REGION_BY_LANGUAGE = {
868
+ en: "global",
869
+ es: "global",
870
+ fr: "europe",
871
+ de: "europe",
872
+ it: "europe",
873
+ pt: "global",
874
+ ru: "europe",
875
+ zh: "asia",
876
+ ja: "asia",
877
+ ko: "asia",
878
+ ar: "mena",
879
+ hi: "south-asia",
880
+ bn: "south-asia",
881
+ pa: "south-asia",
882
+ te: "south-asia",
883
+ mr: "south-asia",
884
+ ta: "south-asia",
885
+ ur: "south-asia",
886
+ gu: "south-asia",
887
+ kn: "south-asia",
888
+ ml: "south-asia",
889
+ ne: "south-asia",
890
+ si: "south-asia",
891
+ nl: "europe",
892
+ pl: "europe",
893
+ tr: "europe",
894
+ cs: "europe",
895
+ el: "europe",
896
+ hu: "europe",
897
+ ro: "europe",
898
+ sv: "europe",
899
+ da: "europe",
900
+ fi: "europe",
901
+ no: "europe",
902
+ sk: "europe",
903
+ uk: "europe",
904
+ bg: "europe",
905
+ hr: "europe",
906
+ et: "europe",
907
+ lt: "europe",
908
+ lv: "europe",
909
+ sl: "europe",
910
+ sr: "europe",
911
+ bs: "europe",
912
+ mk: "europe",
913
+ is: "europe",
914
+ ga: "europe",
915
+ cy: "europe",
916
+ mt: "europe",
917
+ lb: "europe",
918
+ sq: "europe",
919
+ be: "europe",
920
+ he: "mena",
921
+ fa: "mena",
922
+ ps: "mena",
923
+ ku: "mena",
924
+ vi: "asia",
925
+ th: "asia",
926
+ id: "asia",
927
+ ms: "asia",
928
+ tl: "asia",
929
+ km: "asia",
930
+ lo: "asia",
931
+ my: "asia",
932
+ sw: "africa",
933
+ yo: "africa",
934
+ ig: "africa",
935
+ ha: "africa",
936
+ zu: "africa",
937
+ xh: "africa",
938
+ af: "africa",
939
+ st: "africa",
940
+ tn: "africa",
941
+ sn: "africa",
942
+ am: "africa",
943
+ so: "africa",
944
+ rw: "africa",
945
+ mg: "africa",
946
+ ny: "africa",
947
+ ee: "africa",
948
+ tw: "africa",
949
+ gaa: "africa",
950
+ ka: "caucasus",
951
+ hy: "caucasus",
952
+ az: "caucasus",
953
+ eu: "europe",
954
+ gl: "europe",
955
+ ca: "europe",
956
+ la: "europe",
957
+ eo: "constructed",
958
+ kk: "central-asia",
959
+ uz: "central-asia",
960
+ tg: "central-asia",
961
+ ky: "central-asia",
962
+ tk: "central-asia",
963
+ mn: "central-asia",
964
+ auto: "special"
965
+ };
966
+ const TTS_SUPPORT_BY_LANGUAGE = {
967
+ en: "excellent",
968
+ es: "excellent",
969
+ fr: "excellent",
970
+ de: "excellent",
971
+ it: "excellent",
972
+ pt: "excellent",
973
+ ru: "excellent",
974
+ zh: "excellent",
975
+ ja: "excellent",
976
+ ko: "excellent",
977
+ ar: "excellent",
978
+ hi: "good",
979
+ bn: "good",
980
+ te: "good",
981
+ mr: "good",
982
+ ta: "good",
983
+ ur: "good",
984
+ nl: "excellent",
985
+ pl: "excellent",
986
+ tr: "excellent",
987
+ cs: "good",
988
+ el: "good",
989
+ hu: "good",
990
+ ro: "good",
991
+ sv: "excellent",
992
+ da: "good",
993
+ fi: "good",
994
+ no: "good",
995
+ uk: "good",
996
+ he: "good",
997
+ vi: "good",
998
+ th: "good",
999
+ id: "good",
1000
+ ms: "good",
1001
+ af: "good",
1002
+ ca: "good",
1003
+ auto: "n/a"
1004
+ };
1005
+ const LANGUAGE_NAMES_EN = {
1006
+ en: "English",
1007
+ es: "Spanish",
1008
+ fr: "French",
1009
+ de: "German",
1010
+ it: "Italian",
1011
+ pt: "Portuguese",
1012
+ nl: "Dutch",
1013
+ ru: "Russian",
1014
+ zh: "Chinese",
1015
+ ja: "Japanese",
1016
+ ko: "Korean",
1017
+ ar: "Arabic",
1018
+ hi: "Hindi",
1019
+ bn: "Bengali",
1020
+ pa: "Punjabi",
1021
+ te: "Telugu",
1022
+ mr: "Marathi",
1023
+ ta: "Tamil",
1024
+ ur: "Urdu",
1025
+ gu: "Gujarati",
1026
+ kn: "Kannada",
1027
+ ml: "Malayalam",
1028
+ ne: "Nepali",
1029
+ si: "Sinhala",
1030
+ tr: "Turkish",
1031
+ pl: "Polish",
1032
+ vi: "Vietnamese",
1033
+ th: "Thai",
1034
+ id: "Indonesian",
1035
+ ms: "Malay",
1036
+ tl: "Filipino",
1037
+ km: "Khmer",
1038
+ lo: "Lao",
1039
+ my: "Burmese",
1040
+ sw: "Swahili",
1041
+ yo: "Yoruba",
1042
+ ha: "Hausa",
1043
+ ig: "Igbo",
1044
+ zu: "Zulu",
1045
+ xh: "Xhosa",
1046
+ af: "Afrikaans",
1047
+ st: "Sesotho",
1048
+ tn: "Tswana",
1049
+ sn: "Shona",
1050
+ am: "Amharic",
1051
+ so: "Somali",
1052
+ rw: "Kinyarwanda",
1053
+ mg: "Malagasy",
1054
+ ny: "Chichewa",
1055
+ ee: "Ewe",
1056
+ tw: "Twi",
1057
+ gaa: "Ga",
1058
+ he: "Hebrew",
1059
+ fa: "Persian",
1060
+ ps: "Pashto",
1061
+ ku: "Kurdish",
1062
+ uk: "Ukrainian",
1063
+ el: "Greek",
1064
+ cs: "Czech",
1065
+ ro: "Romanian",
1066
+ hu: "Hungarian",
1067
+ sv: "Swedish",
1068
+ da: "Danish",
1069
+ no: "Norwegian",
1070
+ fi: "Finnish",
1071
+ sk: "Slovak",
1072
+ bg: "Bulgarian",
1073
+ hr: "Croatian",
1074
+ et: "Estonian",
1075
+ lt: "Lithuanian",
1076
+ lv: "Latvian",
1077
+ sl: "Slovenian",
1078
+ sr: "Serbian",
1079
+ bs: "Bosnian",
1080
+ mk: "Macedonian",
1081
+ is: "Icelandic",
1082
+ ga: "Irish",
1083
+ cy: "Welsh",
1084
+ mt: "Maltese",
1085
+ lb: "Luxembourgish",
1086
+ sq: "Albanian",
1087
+ be: "Belarusian",
1088
+ ka: "Georgian",
1089
+ hy: "Armenian",
1090
+ az: "Azerbaijani",
1091
+ eu: "Basque",
1092
+ gl: "Galician",
1093
+ ca: "Catalan",
1094
+ la: "Latin",
1095
+ eo: "Esperanto",
1096
+ kk: "Kazakh",
1097
+ uz: "Uzbek",
1098
+ tg: "Tajik",
1099
+ ky: "Kyrgyz",
1100
+ tk: "Turkmen",
1101
+ mn: "Mongolian"
1102
+ };
1103
+ const getDisplayName = (code, locale, fallback) => {
1104
+ try {
1105
+ const displayNames = new Intl.DisplayNames([locale], { type: "language" });
1106
+ const result = displayNames.of(code);
1107
+ if (result) return result;
1108
+ } catch {
1109
+ }
1110
+ return LANGUAGE_NAMES_EN[code] ?? fallback;
1111
+ };
1112
+ const normalizeLanguageCode = (code) => {
1113
+ if (!code || typeof code !== "string") {
1114
+ return "en";
1115
+ }
1116
+ return code.trim().toLowerCase().split("-")[0];
1117
+ };
1118
+ const isLanguageSupported = (code) => {
1119
+ const normalized = normalizeLanguageCode(code);
1120
+ return SUPPORTED_LANGUAGE_CODES.includes(normalized);
1121
+ };
1122
+ const getLanguageName = (code, displayLocale = "en") => {
1123
+ const normalized = normalizeLanguageCode(code);
1124
+ if (normalized === "auto") {
1125
+ return "Auto-detect";
1126
+ }
1127
+ return getDisplayName(normalized, displayLocale, normalized.toUpperCase());
1128
+ };
1129
+ const getLanguageNativeName = (code) => {
1130
+ const normalized = normalizeLanguageCode(code);
1131
+ if (normalized === "auto") {
1132
+ return "Auto";
1133
+ }
1134
+ return getDisplayName(normalized, normalized, getLanguageName(normalized));
1135
+ };
1136
+ const getLanguageMetadata = (code) => {
1137
+ const normalized = normalizeLanguageCode(code);
1138
+ return {
1139
+ name: getLanguageName(normalized),
1140
+ nativeName: getLanguageNativeName(normalized),
1141
+ region: REGION_BY_LANGUAGE[normalized] || "other",
1142
+ ttsSupport: TTS_SUPPORT_BY_LANGUAGE[normalized] || "unknown"
1143
+ };
1144
+ };
1145
+ const getSupportedLanguages = (displayLocale = "en") => {
1146
+ return SUPPORTED_LANGUAGE_CODES.map((code) => {
1147
+ const metadata = getLanguageMetadata(code);
1148
+ return {
1149
+ code,
1150
+ name: getLanguageName(code, displayLocale),
1151
+ nativeName: metadata.nativeName,
1152
+ region: metadata.region,
1153
+ ttsSupport: metadata.ttsSupport
1154
+ };
1155
+ }).sort((left, right) => left.name.localeCompare(right.name));
1156
+ };
1157
+ const COMMON_LANGUAGE_CODES = [
1158
+ "en",
1159
+ "es",
1160
+ "fr",
1161
+ "de",
1162
+ "it",
1163
+ "pt",
1164
+ "nl",
1165
+ "ru",
1166
+ "zh",
1167
+ "ja",
1168
+ "ko",
1169
+ "ar",
1170
+ "hi",
1171
+ "bn",
1172
+ "tr",
1173
+ "pl",
1174
+ "vi",
1175
+ "th",
1176
+ "id",
1177
+ "ms",
1178
+ "sw",
1179
+ "yo",
1180
+ "ha",
1181
+ "ig",
1182
+ "zu",
1183
+ "am",
1184
+ "tw",
1185
+ "he",
1186
+ "fa",
1187
+ "uk",
1188
+ "el",
1189
+ "cs",
1190
+ "ro",
1191
+ "hu",
1192
+ "sv",
1193
+ "da",
1194
+ "no",
1195
+ "fi"
1196
+ ];
1197
+ const getCommonLanguages = (displayLocale = "en") => {
1198
+ return COMMON_LANGUAGE_CODES.map((code) => {
1199
+ const metadata = getLanguageMetadata(code);
1200
+ return {
1201
+ code,
1202
+ name: getLanguageName(code, displayLocale),
1203
+ nativeName: metadata.nativeName,
1204
+ region: metadata.region,
1205
+ ttsSupport: metadata.ttsSupport
1206
+ };
1207
+ }).sort((left, right) => left.name.localeCompare(right.name));
1208
+ };
1209
+ const TTS_PROVIDERS = {
1210
+ deepgram: { name: "Deepgram Aura", supportsSSML: false, isDefault: true },
1211
+ openai: { name: "OpenAI TTS", supportsSSML: false, multilingual: true },
1212
+ azure: { name: "Azure Neural TTS", supportsSSML: true },
1213
+ google: { name: "Google Cloud TTS", supportsSSML: true },
1214
+ aws: { name: "AWS Polly", supportsSSML: true },
1215
+ elevenlabs: { name: "ElevenLabs", supportsSSML: false, multilingual: true },
1216
+ playht: { name: "PlayHT", supportsSSML: false, multilingual: true },
1217
+ cartesia: { name: "Cartesia Sonic", supportsSSML: false, multilingual: true },
1218
+ rime: { name: "Rime AI", supportsSSML: false, multilingual: true },
1219
+ kokoro: { name: "Kokoro", supportsSSML: false, multilingual: true },
1220
+ gemini: { name: "Google Gemini TTS", supportsSSML: false, multilingual: true },
1221
+ assemblyai: { name: "AssemblyAI", supportsSSML: false }
1222
+ };
1223
+ const buildFallbackVoices = (langCode, provider) => {
1224
+ const normalizedLanguage = normalizeLanguageCode(langCode === "auto" ? "en" : langCode);
1225
+ const providerKey = provider.toLowerCase();
1226
+ const providerName = TTS_PROVIDERS[providerKey]?.name || provider;
1227
+ const languageName = getLanguageName(normalizedLanguage);
1228
+ return {
1229
+ female: [
1230
+ {
1231
+ id: `${providerKey}-${normalizedLanguage}-female-1`,
1232
+ name: `${providerName} ${languageName} Female`,
1233
+ gender: "female",
1234
+ provider: providerKey,
1235
+ language: normalizedLanguage
1236
+ },
1237
+ {
1238
+ id: `${providerKey}-${normalizedLanguage}-female-2`,
1239
+ name: `${providerName} ${languageName} Female 2`,
1240
+ gender: "female",
1241
+ provider: providerKey,
1242
+ language: normalizedLanguage
1243
+ }
1244
+ ],
1245
+ male: [
1246
+ {
1247
+ id: `${providerKey}-${normalizedLanguage}-male-1`,
1248
+ name: `${providerName} ${languageName} Male`,
1249
+ gender: "male",
1250
+ provider: providerKey,
1251
+ language: normalizedLanguage
1252
+ },
1253
+ {
1254
+ id: `${providerKey}-${normalizedLanguage}-male-2`,
1255
+ name: `${providerName} ${languageName} Male 2`,
1256
+ gender: "male",
1257
+ provider: providerKey,
1258
+ language: normalizedLanguage
1259
+ }
1260
+ ]
1261
+ };
1262
+ };
1263
+ const getAvailableVoices = (langCode, provider = "deepgram") => {
1264
+ return buildFallbackVoices(langCode, provider.toString());
1265
+ };
1266
+ const fetchVoicesViaSocket = (socket, provider = "deepgram", language = "en") => {
1267
+ return new Promise((resolve) => {
1268
+ const providerName = provider.toString();
1269
+ const fallbackVoices = getAvailableVoices(language, providerName);
1270
+ const timeout = setTimeout(() => {
1271
+ resolve({
1272
+ provider: providerName,
1273
+ language,
1274
+ voices: fallbackVoices,
1275
+ error: "Request timed out, using shared fallback voices"
1276
+ });
1277
+ }, 5e3);
1278
+ socket.emit("translation:getVoices", { provider, language }, (response) => {
1279
+ clearTimeout(timeout);
1280
+ if (response?.voices) {
1281
+ resolve(response);
1282
+ return;
1283
+ }
1284
+ resolve({
1285
+ provider: response?.provider || providerName,
1286
+ language: response?.language || language,
1287
+ voices: fallbackVoices,
1288
+ error: response?.error || "No voices returned, using shared fallback voices"
1289
+ });
1290
+ });
1291
+ });
1292
+ };
1293
+ const fetchLanguagesViaSocket = (socket, displayLocale = "en") => {
1294
+ return new Promise((resolve) => {
1295
+ const timeout = setTimeout(() => {
1296
+ resolve(getSupportedLanguages(displayLocale));
1297
+ }, 5e3);
1298
+ socket.emit("translation:getLanguages", { displayLocale }, (response) => {
1299
+ clearTimeout(timeout);
1300
+ resolve(response?.languages?.length ? response.languages : getSupportedLanguages(displayLocale));
1301
+ });
1302
+ });
1303
+ };
1304
+ const SoundPlayer = async ({ soundUrl }) => {
1305
+ if (!soundUrl || typeof Audio === "undefined") {
1306
+ return;
1307
+ }
1308
+ try {
1309
+ const audio = new Audio(soundUrl);
1310
+ await audio.play();
1311
+ } catch (error) {
1312
+ console.error("Error playing sound:", error);
1313
+ }
1314
+ };
1315
+ const getOverlayPosition = ({ position }) => {
1316
+ switch (position) {
1317
+ case "topLeft":
1318
+ return { top: 0, left: 0 };
1319
+ case "topRight":
1320
+ return { top: 0, right: 0 };
1321
+ case "bottomLeft":
1322
+ return { bottom: 0, left: 0 };
1323
+ case "bottomRight":
1324
+ return { bottom: 0, right: 0 };
1325
+ default:
1326
+ return {};
1327
+ }
1328
+ };
1329
+ function sleep({ ms }) {
1330
+ return new Promise((resolve) => setTimeout(resolve, ms));
1331
+ }
1332
+ const formatNumber = async ({ number }) => {
1333
+ if (number) {
1334
+ if (number < 1e3) {
1335
+ return number.toString();
1336
+ }
1337
+ if (number < 1e6) {
1338
+ return `${(number / 1e3).toFixed(1)}K`;
1339
+ }
1340
+ if (number < 1e9) {
1341
+ return `${(number / 1e6).toFixed(1)}M`;
1342
+ }
1343
+ if (number < 1e12) {
1344
+ return `${(number / 1e9).toFixed(1)}B`;
1345
+ }
1346
+ }
1347
+ return void 0;
1348
+ };
1349
+ const generateRandomMessages = ({
1350
+ participants,
1351
+ member,
1352
+ coHost = "",
1353
+ host,
1354
+ forChatBroadcast = false
1355
+ }) => {
1356
+ const messages = [];
1357
+ const getRandomReceiver = (sender) => {
1358
+ const potentialReceivers = participants.filter((participant) => participant.name !== sender);
1359
+ const randomReceiver = potentialReceivers[Math.floor(Math.random() * potentialReceivers.length)];
1360
+ return randomReceiver?.name || "";
1361
+ };
1362
+ let refNames = [];
1363
+ if (forChatBroadcast) {
1364
+ refNames = [member, host];
1365
+ } else if (coHost) {
1366
+ refNames = [
1367
+ member,
1368
+ coHost,
1369
+ host,
1370
+ ...participants.map((participant) => participant.name).filter((name) => name !== void 0)
1371
+ ];
1372
+ } else {
1373
+ refNames = [
1374
+ member,
1375
+ host,
1376
+ ...participants.map((participant) => participant.name).filter((name) => name !== void 0)
1377
+ ];
1378
+ }
1379
+ refNames = [...new Set(refNames)];
1380
+ let timeIncrement = 0;
1381
+ refNames.forEach((sender) => {
1382
+ messages.push({
1383
+ sender,
1384
+ receivers: [getRandomReceiver(sender)],
1385
+ message: `Direct message from ${sender}`,
1386
+ timestamp: new Date(Date.now() + timeIncrement).toLocaleTimeString(),
1387
+ group: false
1388
+ });
1389
+ messages.push({
1390
+ sender,
1391
+ receivers: participants.map((participant) => participant.name).filter((name) => name !== void 0),
1392
+ message: `Group message from ${sender}`,
1393
+ timestamp: new Date(Date.now() + timeIncrement).toLocaleTimeString(),
1394
+ group: true
1395
+ });
1396
+ timeIncrement += 15e3;
1397
+ });
1398
+ return messages;
1399
+ };
1400
+ const generateRandomParticipants = ({
1401
+ member,
1402
+ coHost = "",
1403
+ host,
1404
+ forChatBroadcast = false
1405
+ }) => {
1406
+ const participants = [];
1407
+ let names = [
1408
+ "Alice",
1409
+ "Bob",
1410
+ "Charlie",
1411
+ "David",
1412
+ "Eve",
1413
+ "Frank",
1414
+ "Grace",
1415
+ "Hank",
1416
+ "Ivy",
1417
+ "Jack",
1418
+ "Kate",
1419
+ "Liam",
1420
+ "Mia",
1421
+ "Nina",
1422
+ "Olivia",
1423
+ "Pete",
1424
+ "Quinn",
1425
+ "Rachel",
1426
+ "Steve",
1427
+ "Tina",
1428
+ "Ursula",
1429
+ "Vince",
1430
+ "Wendy",
1431
+ "Xander",
1432
+ "Yvonne",
1433
+ "Zack"
1434
+ ];
1435
+ if (forChatBroadcast) {
1436
+ names.splice(2);
1437
+ }
1438
+ if (!names.includes(member)) {
1439
+ names.unshift(member);
1440
+ }
1441
+ if (!names.includes(coHost) && !forChatBroadcast) {
1442
+ names.unshift(coHost);
1443
+ }
1444
+ if (!names.includes(host)) {
1445
+ names.unshift(host);
1446
+ }
1447
+ if (forChatBroadcast) {
1448
+ names.splice(2);
1449
+ }
1450
+ names = names.filter((name) => name.length > 1);
1451
+ const shuffledNames = [...names];
1452
+ for (let index = shuffledNames.length - 1; index > 0; index -= 1) {
1453
+ const randomIndex = Math.floor(Math.random() * (index + 1));
1454
+ [shuffledNames[index], shuffledNames[randomIndex]] = [shuffledNames[randomIndex], shuffledNames[index]];
1455
+ }
1456
+ let hasLevel2Participant = false;
1457
+ for (let index = 0; index < shuffledNames.length; index += 1) {
1458
+ const randomName = shuffledNames[index];
1459
+ const randomLevel = hasLevel2Participant ? "1" : randomName === host ? "2" : "1";
1460
+ const randomMuted = forChatBroadcast ? true : Math.random() < 0.5;
1461
+ if (randomLevel === "2") {
1462
+ hasLevel2Participant = true;
1463
+ }
1464
+ participants.push({
1465
+ name: randomName,
1466
+ islevel: randomLevel,
1467
+ muted: randomMuted,
1468
+ id: index.toString(),
1469
+ audioID: `audio-${index}`,
1470
+ videoID: `video-${index}`
1471
+ });
1472
+ }
1473
+ return participants;
1474
+ };
1475
+ const generateRandomPolls = ({ numberOfPolls }) => {
1476
+ const pollTypes = ["trueFalse", "yesNo", "custom"];
1477
+ const polls = [];
1478
+ for (let index = 0; index < numberOfPolls; index += 1) {
1479
+ const type = pollTypes[Math.floor(Math.random() * pollTypes.length)];
1480
+ let options;
1481
+ switch (type) {
1482
+ case "trueFalse":
1483
+ options = ["True", "False"];
1484
+ break;
1485
+ case "yesNo":
1486
+ options = ["Yes", "No"];
1487
+ break;
1488
+ case "custom":
1489
+ options = Array.from({ length: Math.floor(Math.random() * 5) + 2 }, (_, optionIndex) => `Option ${optionIndex + 1}`);
1490
+ break;
1491
+ default:
1492
+ options = [];
1493
+ }
1494
+ polls.push({
1495
+ id: `${index + 1}`,
1496
+ question: `Random Question ${index + 1}`,
1497
+ type,
1498
+ options,
1499
+ votes: Array(options.length).fill(0),
1500
+ status: "inactive",
1501
+ voters: {}
1502
+ });
1503
+ }
1504
+ return polls;
1505
+ };
1506
+ const generateRandomRequestList = ({
1507
+ participants,
1508
+ hostName,
1509
+ coHostName,
1510
+ numberOfRequests
1511
+ }) => {
1512
+ const filteredParticipants = participants.filter(
1513
+ (participant) => participant.name !== hostName && participant.name !== coHostName
1514
+ );
1515
+ const requestIcons = ["fa-video", "fa-desktop", "fa-microphone"];
1516
+ for (let index = requestIcons.length - 1; index > 0; index -= 1) {
1517
+ const randomIndex = Math.floor(Math.random() * (index + 1));
1518
+ [requestIcons[index], requestIcons[randomIndex]] = [requestIcons[randomIndex], requestIcons[index]];
1519
+ }
1520
+ return filteredParticipants.flatMap((participant) => {
1521
+ const uniqueIcons = /* @__PURE__ */ new Set();
1522
+ const requests = [];
1523
+ for (let index = 0; index < numberOfRequests; index += 1) {
1524
+ let randomIcon;
1525
+ do {
1526
+ randomIcon = requestIcons[Math.floor(Math.random() * requestIcons.length)];
1527
+ } while (uniqueIcons.has(randomIcon));
1528
+ uniqueIcons.add(randomIcon);
1529
+ requests.push({
1530
+ id: participant.id || "",
1531
+ name: participant.name ? participant.name.toLowerCase().replace(/\s/g, "_") : "",
1532
+ icon: randomIcon,
1533
+ username: participant.name ? participant.name.toLowerCase().replace(/\s/g, "_") : ""
1534
+ });
1535
+ }
1536
+ return requests;
1537
+ });
1538
+ };
1539
+ const generateRandomWaitingRoomList = () => {
1540
+ const names = ["Dimen", "Nore", "Ker", "Lor", "Mik"];
1541
+ const waitingRoomList = [];
1542
+ for (let index = 0; index < names.length; index += 1) {
1543
+ waitingRoomList.push({
1544
+ name: names[index],
1545
+ id: index.toString()
1546
+ });
1547
+ }
1548
+ return waitingRoomList;
1549
+ };
1550
+ const initialValuesState = {
1551
+ // The following are the initial values
1552
+ roomName: "",
1553
+ member: "",
1554
+ adminPasscode: "",
1555
+ islevel: "1",
1556
+ coHost: "No coHost",
1557
+ coHostResponsibility: [
1558
+ { name: "participants", value: false, dedicated: false },
1559
+ { name: "media", value: false, dedicated: false },
1560
+ { name: "waiting", value: false, dedicated: false },
1561
+ { name: "chat", value: false, dedicated: false }
1562
+ ],
1563
+ youAreCoHost: false,
1564
+ youAreHost: false,
1565
+ confirmedToRecord: false,
1566
+ meetingDisplayType: "media",
1567
+ meetingVideoOptimized: false,
1568
+ eventType: "webinar",
1569
+ participants: [],
1570
+ filteredParticipants: [],
1571
+ participantsCounter: 0,
1572
+ participantsFilter: "",
1573
+ validated: false,
1574
+ localUIMode: false,
1575
+ socket: {},
1576
+ localSocket: void 0,
1577
+ roomData: null,
1578
+ device: null,
1579
+ apiKey: "",
1580
+ apiUserName: "",
1581
+ apiToken: "",
1582
+ link: "",
1583
+ consume_sockets: [],
1584
+ rtpCapabilities: null,
1585
+ roomRecvIPs: [],
1586
+ meetingRoomParams: null,
1587
+ itemPageLimit: 4,
1588
+ audioOnlyRoom: false,
1589
+ addForBasic: false,
1590
+ screenPageLimit: 4,
1591
+ shareScreenStarted: false,
1592
+ shared: false,
1593
+ targetOrientation: "landscape",
1594
+ targetResolution: "sd",
1595
+ targetResolutionHost: "sd",
1596
+ vidCons: { width: 640, height: 360 },
1597
+ frameRate: 10,
1598
+ hParams: {},
1599
+ vParams: {},
1600
+ screenParams: {},
1601
+ aParams: {},
1602
+ // Initial Values for New Recording Fields
1603
+ recordingAudioPausesLimit: 0,
1604
+ recordingAudioPausesCount: 0,
1605
+ recordingAudioSupport: false,
1606
+ recordingAudioPeopleLimit: 0,
1607
+ recordingAudioParticipantsTimeLimit: 0,
1608
+ recordingVideoPausesCount: 0,
1609
+ recordingVideoPausesLimit: 0,
1610
+ recordingVideoSupport: false,
1611
+ recordingVideoPeopleLimit: 0,
1612
+ recordingVideoParticipantsTimeLimit: 0,
1613
+ recordingAllParticipantsSupport: false,
1614
+ recordingVideoParticipantsSupport: false,
1615
+ recordingAllParticipantsFullRoomSupport: false,
1616
+ recordingVideoParticipantsFullRoomSupport: false,
1617
+ recordingPreferredOrientation: "landscape",
1618
+ recordingSupportForOtherOrientation: false,
1619
+ recordingMultiFormatsSupport: false,
1620
+ userRecordingParams: {
1621
+ mainSpecs: {
1622
+ mediaOptions: "video",
1623
+ audioOptions: "all",
1624
+ videoOptions: "all",
1625
+ videoType: "fullDisplay",
1626
+ videoOptimized: false,
1627
+ recordingDisplayType: "media",
1628
+ addHLS: false
1629
+ },
1630
+ dispSpecs: {
1631
+ nameTags: true,
1632
+ backgroundColor: "#000000",
1633
+ nameTagsColor: "#ffffff",
1634
+ orientationVideo: "portrait"
1635
+ }
1636
+ },
1637
+ canRecord: false,
1638
+ startReport: false,
1639
+ endReport: false,
1640
+ recordTimerInterval: null,
1641
+ recordStartTime: 0,
1642
+ recordElapsedTime: 0,
1643
+ isTimerRunning: false,
1644
+ canPauseResume: false,
1645
+ recordChangeSeconds: 15e3,
1646
+ pauseLimit: 0,
1647
+ pauseRecordCount: 0,
1648
+ canLaunchRecord: true,
1649
+ stopLaunchRecord: false,
1650
+ // Room properties
1651
+ participantsAll: [],
1652
+ firstAll: false,
1653
+ updateMainWindow: false,
1654
+ first_round: false,
1655
+ landScaped: false,
1656
+ lock_screen: false,
1657
+ screenId: "",
1658
+ allVideoStreams: [],
1659
+ newLimitedStreams: [],
1660
+ newLimitedStreamsIDs: [],
1661
+ activeSounds: [],
1662
+ screenShareIDStream: "",
1663
+ screenShareNameStream: "",
1664
+ adminIDStream: "",
1665
+ adminNameStream: "",
1666
+ youYouStream: [],
1667
+ youYouStreamIDs: [],
1668
+ localStream: null,
1669
+ recordStarted: false,
1670
+ recordResumed: false,
1671
+ recordPaused: false,
1672
+ recordStopped: false,
1673
+ adminRestrictSetting: false,
1674
+ videoRequestState: null,
1675
+ videoRequestTime: 0,
1676
+ videoAction: false,
1677
+ localStreamVideo: null,
1678
+ userDefaultVideoInputDevice: "",
1679
+ currentFacingMode: "user",
1680
+ prevFacingMode: "user",
1681
+ defVideoID: "",
1682
+ allowed: false,
1683
+ dispActiveNames: [],
1684
+ activeNames: [],
1685
+ prevActiveNames: [],
1686
+ p_activeNames: [],
1687
+ p_dispActiveNames: [],
1688
+ membersReceived: false,
1689
+ deferScreenReceived: false,
1690
+ hostFirstSwitch: false,
1691
+ micAction: false,
1692
+ screenAction: false,
1693
+ chatAction: false,
1694
+ audioRequestState: null,
1695
+ screenRequestState: null,
1696
+ chatRequestState: null,
1697
+ audioRequestTime: 0,
1698
+ screenRequestTime: 0,
1699
+ chatRequestTime: 0,
1700
+ updateRequestIntervalSeconds: 240,
1701
+ oldSoundIds: [],
1702
+ hostLabel: "Host",
1703
+ mainScreenFilled: false,
1704
+ localStreamScreen: null,
1705
+ screenAlreadyOn: false,
1706
+ chatAlreadyOn: false,
1707
+ redirectURL: "",
1708
+ oldAllStreams: [],
1709
+ adminVidID: "",
1710
+ streamNames: [],
1711
+ non_alVideoStreams: [],
1712
+ sortAudioLoudness: false,
1713
+ audioDecibels: [],
1714
+ mixed_alVideoStreams: [],
1715
+ non_alVideoStreams_muted: [],
1716
+ paginatedStreams: [],
1717
+ localStreamAudio: null,
1718
+ defAudioID: "",
1719
+ userDefaultAudioInputDevice: "",
1720
+ userDefaultAudioOutputDevice: "",
1721
+ prevAudioInputDevice: "",
1722
+ prevVideoInputDevice: "",
1723
+ audioPaused: false,
1724
+ mainScreenPerson: "",
1725
+ adminOnMainScreen: false,
1726
+ screenStates: [{
1727
+ mainScreenPerson: "",
1728
+ mainScreenProducerId: "",
1729
+ mainScreenFilled: false,
1730
+ adminOnMainScreen: false
1731
+ }],
1732
+ prevScreenStates: [{
1733
+ mainScreenPerson: "",
1734
+ mainScreenProducerId: "",
1735
+ mainScreenFilled: false,
1736
+ adminOnMainScreen: false
1737
+ }],
1738
+ updateDateState: null,
1739
+ lastUpdate: null,
1740
+ nForReadjustRecord: 0,
1741
+ fixedPageLimit: 4,
1742
+ removeAltGrid: false,
1743
+ nForReadjust: 0,
1744
+ reorderInterval: 3e4,
1745
+ fastReorderInterval: 1e4,
1746
+ lastReorderTime: 0,
1747
+ audStreamNames: [],
1748
+ currentUserPage: 0,
1749
+ mainHeightWidth: 0,
1750
+ prevMainHeightWidth: 0,
1751
+ prevDoPaginate: false,
1752
+ doPaginate: false,
1753
+ shareEnded: false,
1754
+ lStreams: [],
1755
+ chatRefStreams: [],
1756
+ controlHeight: 0,
1757
+ isWideScreen: false,
1758
+ isMediumScreen: false,
1759
+ isSmallScreen: false,
1760
+ addGrid: false,
1761
+ addAltGrid: false,
1762
+ gridRows: 0,
1763
+ gridCols: 0,
1764
+ altGridRows: 0,
1765
+ altGridCols: 0,
1766
+ numberPages: 0,
1767
+ currentStreams: [],
1768
+ showMiniView: false,
1769
+ nStream: null,
1770
+ defer_receive: false,
1771
+ allAudioStreams: [],
1772
+ remoteScreenStream: [],
1773
+ screenProducer: null,
1774
+ localScreenProducer: null,
1775
+ gotAllVids: false,
1776
+ paginationHeightWidth: 40,
1777
+ paginationDirection: "horizontal",
1778
+ gridSizes: {
1779
+ gridWidth: 0,
1780
+ gridHeight: 0,
1781
+ altGridWidth: 0,
1782
+ altGridHeight: 0
1783
+ },
1784
+ screenForceFullDisplay: false,
1785
+ mainGridStream: [],
1786
+ otherGridStreams: [[], []],
1787
+ audioOnlyStreams: [],
1788
+ videoInputs: [],
1789
+ audioInputs: [],
1790
+ meetingProgressTime: "00:00:00",
1791
+ meetingElapsedTime: 0,
1792
+ ref_participants: [],
1793
+ // Messaging, event, modals, and other UI states
1794
+ messages: [],
1795
+ startDirectMessage: false,
1796
+ directMessageDetails: null,
1797
+ showMessagesBadge: false,
1798
+ audioSetting: "allow",
1799
+ videoSetting: "allow",
1800
+ screenshareSetting: "allow",
1801
+ chatSetting: "allow",
1802
+ displayOption: "media",
1803
+ autoWave: true,
1804
+ forceFullDisplay: true,
1805
+ prevForceFullDisplay: false,
1806
+ prevMeetingDisplayType: "video",
1807
+ waitingRoomFilter: "",
1808
+ waitingRoomList: [],
1809
+ waitingRoomCounter: 0,
1810
+ filteredWaitingRoomList: [],
1811
+ requestFilter: "",
1812
+ requestList: [],
1813
+ requestCounter: 0,
1814
+ filteredRequestList: [],
1815
+ totalReqWait: 0,
1816
+ alertVisible: false,
1817
+ alertMessage: "",
1818
+ alertType: "success",
1819
+ alertDuration: 3e3,
1820
+ progressTimerVisible: true,
1821
+ progressTimerValue: 0,
1822
+ isMenuModalVisible: false,
1823
+ isRecordingModalVisible: false,
1824
+ isSettingsModalVisible: false,
1825
+ isRequestsModalVisible: false,
1826
+ isWaitingModalVisible: false,
1827
+ isCoHostModalVisible: false,
1828
+ isMediaSettingsModalVisible: false,
1829
+ isDisplaySettingsModalVisible: false,
1830
+ isParticipantsModalVisible: false,
1831
+ isMessagesModalVisible: false,
1832
+ isConfirmExitModalVisible: false,
1833
+ isConfirmHereModalVisible: false,
1834
+ isShareEventModalVisible: false,
1835
+ isLoadingModalVisible: false,
1836
+ recordingMediaOptions: "video",
1837
+ recordingAudioOptions: "all",
1838
+ recordingVideoOptions: "all",
1839
+ recordingVideoType: "fullDisplay",
1840
+ recordingVideoOptimized: false,
1841
+ recordingDisplayType: "video",
1842
+ recordingAddHLS: true,
1843
+ recordingNameTags: true,
1844
+ recordingBackgroundColor: "#83c0e9",
1845
+ recordingNameTagsColor: "#ffffff",
1846
+ recordingAddText: false,
1847
+ recordingCustomText: "Add Text",
1848
+ recordingCustomTextPosition: "top",
1849
+ recordingCustomTextColor: "#ffffff",
1850
+ recordingOrientationVideo: "landscape",
1851
+ clearedToResume: true,
1852
+ clearedToRecord: true,
1853
+ recordState: "green",
1854
+ showRecordButtons: false,
1855
+ recordingProgressTime: "00:00:00",
1856
+ audioSwitching: false,
1857
+ videoSwitching: false,
1858
+ videoAlreadyOn: false,
1859
+ audioAlreadyOn: false,
1860
+ componentSizes: {
1861
+ mainHeight: 0,
1862
+ otherHeight: 0,
1863
+ mainWidth: 0,
1864
+ otherWidth: 0
1865
+ },
1866
+ hasCameraPermission: false,
1867
+ hasAudioPermission: false,
1868
+ transportCreated: false,
1869
+ localTransportCreated: false,
1870
+ transportCreatedVideo: false,
1871
+ transportCreatedAudio: false,
1872
+ transportCreatedScreen: false,
1873
+ producerTransport: null,
1874
+ localProducerTransport: null,
1875
+ videoProducer: null,
1876
+ localVideoProducer: null,
1877
+ params: {},
1878
+ videoParams: {},
1879
+ audioParams: {},
1880
+ audioProducer: null,
1881
+ localAudioProducer: null,
1882
+ consumerTransports: [],
1883
+ consumingTransports: [],
1884
+ // Polls
1885
+ polls: [],
1886
+ poll: null,
1887
+ isPollModalVisible: false,
1888
+ // Background
1889
+ customImage: "",
1890
+ selectedImage: "",
1891
+ segmentVideo: null,
1892
+ selfieSegmentation: null,
1893
+ pauseSegmentation: false,
1894
+ processedStream: null,
1895
+ keepBackground: false,
1896
+ backgroundHasChanged: false,
1897
+ virtualStream: null,
1898
+ mainCanvas: null,
1899
+ prevKeepBackground: false,
1900
+ appliedBackground: false,
1901
+ isBackgroundModalVisible: false,
1902
+ autoClickBackground: false,
1903
+ // Breakout Rooms
1904
+ breakoutRooms: [],
1905
+ currentRoomIndex: 0,
1906
+ canStartBreakout: false,
1907
+ breakOutRoomStarted: false,
1908
+ breakOutRoomEnded: false,
1909
+ hostNewRoom: -1,
1910
+ limitedBreakRoom: [],
1911
+ mainRoomsLength: 0,
1912
+ memberRoom: -1,
1913
+ isBreakoutRoomsModalVisible: false,
1914
+ // Whiteboard
1915
+ whiteboardUsers: [],
1916
+ currentWhiteboardIndex: 0,
1917
+ canStartWhiteboard: false,
1918
+ whiteboardStarted: false,
1919
+ whiteboardEnded: false,
1920
+ whiteboardLimit: 4,
1921
+ isWhiteboardModalVisible: false,
1922
+ isConfigureWhiteboardModalVisible: false,
1923
+ shapes: [],
1924
+ useImageBackground: true,
1925
+ redoStack: [],
1926
+ undoStack: [],
1927
+ canvasStream: null,
1928
+ canvasWhiteboard: null,
1929
+ // Screenboard
1930
+ canvasScreenboard: null,
1931
+ processedScreenStream: null,
1932
+ annotateScreenStream: false,
1933
+ mainScreenCanvas: null,
1934
+ isScreenboardModalVisible: false,
1935
+ // Control Buttons
1936
+ micActive: false,
1937
+ videoActive: false,
1938
+ screenShareActive: false,
1939
+ endCallActive: false,
1940
+ participantsActive: false,
1941
+ menuActive: false,
1942
+ commentsActive: false
1943
+ };
1944
+ const mediaDevices = {
1945
+ getUserMedia: async (_constraints) => {
1946
+ console.warn("getUserMedia is not implemented in this environment.");
1947
+ return new MediaStream();
1948
+ },
1949
+ getDisplayMedia: async (_constraints) => {
1950
+ console.warn("getDisplayMedia is not implemented in this environment.");
1951
+ return new MediaStream();
1952
+ },
1953
+ enumerateDevices: async () => {
1954
+ console.warn("enumerateDevices is not implemented in this environment.");
1955
+ return [];
1956
+ }
1957
+ };
1958
+ function registerGlobals() {
1959
+ }
1960
+ class MediaStream {
1961
+ tracks;
1962
+ constructor(tracks = []) {
1963
+ this.tracks = tracks;
1964
+ }
1965
+ }
1966
+ class MediaStreamTrack {
1967
+ }
1968
+ class RTCView {
1969
+ render() {
1970
+ return null;
1971
+ }
1972
+ }
1973
+ const createResponseJoinRoom = async ({
1974
+ localRoom
1975
+ }) => {
1976
+ return {
1977
+ rtpCapabilities: localRoom.rtpCapabilities ?? null,
1978
+ success: localRoom.rtpCapabilities !== null,
1979
+ roomRecvIPs: [],
1980
+ meetingRoomParams: localRoom.eventRoomParams,
1981
+ recordingParams: localRoom.recordingParams,
1982
+ secureCode: localRoom.secureCode,
1983
+ recordOnly: false,
1984
+ isHost: localRoom.isHost,
1985
+ safeRoom: false,
1986
+ autoStartSafeRoom: false,
1987
+ safeRoomStarted: false,
1988
+ safeRoomEnded: false,
1989
+ reason: localRoom.isBanned ? "User is banned from the room." : void 0,
1990
+ banned: localRoom.isBanned,
1991
+ suspended: false,
1992
+ noAdmin: localRoom.hostNotJoined
1993
+ };
1994
+ };
1995
+ const readResponseError = async (response) => {
1996
+ const fallbackMessage = `HTTP error! Status: ${response.status}`;
1997
+ try {
1998
+ const responseText = await response.text();
1999
+ if (!responseText) {
2000
+ return fallbackMessage;
2001
+ }
2002
+ const parsedResponse = JSON.parse(responseText);
2003
+ return parsedResponse.error || parsedResponse.message || responseText;
2004
+ } catch {
2005
+ return fallbackMessage;
2006
+ }
2007
+ };
2008
+ const createBrowserPendingRequestStorage = () => {
2009
+ if (typeof localStorage === "undefined") {
2010
+ return void 0;
2011
+ }
2012
+ return {
2013
+ getItem: async (key) => localStorage.getItem(key),
2014
+ setItem: async (key, value) => {
2015
+ localStorage.setItem(key, value);
2016
+ },
2017
+ removeItem: async (key) => {
2018
+ localStorage.removeItem(key);
2019
+ }
2020
+ };
2021
+ };
2022
+ const createRoomOnMediaSFU = async ({
2023
+ payload,
2024
+ apiUserName,
2025
+ apiKey,
2026
+ localLink = "",
2027
+ pendingRequestStorage
2028
+ }) => {
2029
+ const storage = pendingRequestStorage ?? createBrowserPendingRequestStorage();
2030
+ const roomIdentifier = `create_${payload.userName}_${payload.duration}_${payload.capacity}`;
2031
+ const pendingKey = `mediasfu_pending_${roomIdentifier}`;
2032
+ const pendingTimeout = 30 * 1e3;
2033
+ try {
2034
+ const pendingRequest = storage ? await storage.getItem(pendingKey) : null;
2035
+ if (storage && pendingRequest) {
2036
+ const pendingData = JSON.parse(pendingRequest);
2037
+ const timeSincePending = Date.now() - pendingData.timestamp;
2038
+ if (timeSincePending < pendingTimeout) {
2039
+ return {
2040
+ data: { error: "Room creation already in progress" },
2041
+ success: false
2042
+ };
2043
+ }
2044
+ await storage.removeItem(pendingKey);
2045
+ }
2046
+ if (!apiUserName || !apiKey || apiUserName === "yourAPIUSERNAME" || apiKey === "yourAPIKEY" || apiKey.length !== 64 || apiUserName.length < 6) {
2047
+ return { data: { error: "Invalid credentials" }, success: false };
2048
+ }
2049
+ const finalLink = joinRoomOnMediaSFU.resolveMediaSFURoomApi(localLink, "createRoom");
2050
+ if (storage) {
2051
+ await storage.setItem(pendingKey, JSON.stringify({
2052
+ timestamp: Date.now(),
2053
+ payload: {
2054
+ action: payload.action,
2055
+ userName: payload.userName,
2056
+ meetingID: "create"
2057
+ }
2058
+ }));
2059
+ setTimeout(() => {
2060
+ storage.removeItem(pendingKey).catch(() => {
2061
+ });
2062
+ }, pendingTimeout);
2063
+ }
2064
+ const response = await fetch(finalLink, {
2065
+ method: "POST",
2066
+ headers: {
2067
+ "Content-Type": "application/json",
2068
+ Authorization: `Bearer ${apiUserName}:${apiKey}`
2069
+ },
2070
+ body: JSON.stringify(payload)
2071
+ });
2072
+ if (!response.ok) {
2073
+ throw new Error(await readResponseError(response));
2074
+ }
2075
+ const data = await response.json();
2076
+ if (storage) {
2077
+ await storage.removeItem(pendingKey);
2078
+ }
2079
+ return { data, success: true };
2080
+ } catch (error) {
2081
+ if (storage) {
2082
+ try {
2083
+ await storage.removeItem(pendingKey);
2084
+ } catch {
2085
+ }
2086
+ }
2087
+ const errorMessage = error.message || "unknown error";
2088
+ return {
2089
+ data: { error: `Unable to create room, ${errorMessage}` },
2090
+ success: false
2091
+ };
2092
+ }
2093
+ };
2094
+ function startMeetingProgressTimer({
2095
+ startTime,
2096
+ parameters
2097
+ }) {
2098
+ let { updateMeetingProgressTime, getUpdatedAllParams } = parameters;
2099
+ function calculateElapsedTime(currentStartTime) {
2100
+ const currentTime = Math.floor((/* @__PURE__ */ new Date()).getTime() / 1e3);
2101
+ return currentTime - currentStartTime;
2102
+ }
2103
+ function padNumber2(value) {
2104
+ return value.toString().padStart(2, "0");
2105
+ }
2106
+ function formatTime(time) {
2107
+ const hours = Math.floor(time / 3600);
2108
+ const minutes = Math.floor(time % 3600 / 60);
2109
+ const seconds = Math.floor(time % 60);
2110
+ return `${padNumber2(hours)}:${padNumber2(minutes)}:${padNumber2(seconds)}`;
2111
+ }
2112
+ let elapsedTime = calculateElapsedTime(startTime);
2113
+ let timeProgress = setInterval(() => {
2114
+ elapsedTime++;
2115
+ updateMeetingProgressTime(formatTime(elapsedTime));
2116
+ parameters = getUpdatedAllParams();
2117
+ if (!parameters.validated || !parameters.roomName) {
2118
+ clearInterval(timeProgress);
2119
+ timeProgress = null;
2120
+ }
2121
+ }, 1e3);
2122
+ }
2123
+ const meetingTimeRemaining = async ({
2124
+ timeRemaining,
2125
+ showAlert,
2126
+ eventType
2127
+ }) => {
2128
+ const minutes = Math.floor(timeRemaining / 6e4);
2129
+ const seconds = Math.floor(timeRemaining % 6e4 / 1e3);
2130
+ const timeRemainingString = `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`;
2131
+ if (eventType !== "chat") {
2132
+ showAlert?.({
2133
+ message: `The event will end in ${timeRemainingString} minutes.`,
2134
+ type: "success",
2135
+ duration: 3e3
2136
+ });
2137
+ }
2138
+ };
2139
+ const allWaitingRoomMembers = async ({
2140
+ waitingParticipants,
2141
+ updateWaitingRoomList,
2142
+ updateTotalReqWait
2143
+ }) => {
2144
+ updateWaitingRoomList(waitingParticipants);
2145
+ updateTotalReqWait(waitingParticipants.length);
2146
+ };
2147
+ const allMembers = async ({
2148
+ members,
2149
+ requestss,
2150
+ coHoste,
2151
+ coHostRes,
2152
+ parameters,
2153
+ consume_sockets,
2154
+ apiUserName,
2155
+ apiKey,
2156
+ apiToken
2157
+ }) => {
2158
+ let {
2159
+ participantsAll,
2160
+ participants,
2161
+ dispActiveNames,
2162
+ requestList,
2163
+ lock_screen,
2164
+ firstAll,
2165
+ membersReceived,
2166
+ roomRecvIPs,
2167
+ deferScreenReceived,
2168
+ screenId,
2169
+ shareScreenStarted,
2170
+ meetingDisplayType,
2171
+ hostFirstSwitch,
2172
+ waitingRoomList,
2173
+ islevel,
2174
+ socket,
2175
+ updateParticipantsAll,
2176
+ updateParticipants,
2177
+ updateRequestList,
2178
+ updateCoHost,
2179
+ updateCoHostResponsibility,
2180
+ updateFirstAll,
2181
+ updateMembersReceived,
2182
+ updateDeferScreenReceived,
2183
+ updateShareScreenStarted,
2184
+ updateHostFirstSwitch,
2185
+ updateConsume_sockets,
2186
+ updateRoomRecvIPs,
2187
+ updateIsLoadingModalVisible,
2188
+ updateTotalReqWait,
2189
+ onScreenChanges,
2190
+ connectIps,
2191
+ connectLocalIps,
2192
+ sleep: sleep2,
2193
+ reorderStreams
2194
+ } = parameters;
2195
+ participantsAll = members.map(({ isBanned, isSuspended, name, audioID, videoID }) => ({
2196
+ isBanned,
2197
+ isSuspended,
2198
+ name,
2199
+ audioID,
2200
+ videoID
2201
+ }));
2202
+ updateParticipantsAll(participantsAll);
2203
+ participants = members.filter(
2204
+ (participant) => !participant.isBanned && !participant.isSuspended
2205
+ );
2206
+ updateParticipants(participants);
2207
+ if (dispActiveNames.length > 0) {
2208
+ const missingDisplayedParticipants = dispActiveNames.filter(
2209
+ (name) => !participants.some((participant) => participant.name === name)
2210
+ );
2211
+ if (missingDisplayedParticipants.length > 0) {
2212
+ await reorderStreams({ add: false, screenChanged: true, parameters });
2213
+ }
2214
+ }
2215
+ const onLocal = roomRecvIPs.length === 1 && roomRecvIPs[0] === "none";
2216
+ if (!membersReceived && !onLocal) {
2217
+ if (roomRecvIPs.length < 1) {
2218
+ const checkIPs = setInterval(async () => {
2219
+ if (roomRecvIPs.length > 0) {
2220
+ clearInterval(checkIPs);
2221
+ if (deferScreenReceived && screenId) {
2222
+ shareScreenStarted = true;
2223
+ updateShareScreenStarted(shareScreenStarted);
2224
+ }
2225
+ const [sockets_, ips_] = await connectIps({
2226
+ consume_sockets,
2227
+ remIP: roomRecvIPs,
2228
+ parameters,
2229
+ apiUserName,
2230
+ apiKey,
2231
+ apiToken
2232
+ });
2233
+ updateConsume_sockets(sockets_);
2234
+ updateRoomRecvIPs(ips_);
2235
+ membersReceived = true;
2236
+ updateMembersReceived(membersReceived);
2237
+ await sleep2({ ms: 250 });
2238
+ updateIsLoadingModalVisible(false);
2239
+ deferScreenReceived = false;
2240
+ updateDeferScreenReceived(deferScreenReceived);
2241
+ }
2242
+ }, 10);
2243
+ } else {
2244
+ const [sockets_, ips_] = await connectIps({
2245
+ consume_sockets,
2246
+ remIP: roomRecvIPs,
2247
+ parameters,
2248
+ apiUserName,
2249
+ apiKey,
2250
+ apiToken
2251
+ });
2252
+ updateConsume_sockets(sockets_);
2253
+ updateRoomRecvIPs(ips_);
2254
+ membersReceived = true;
2255
+ updateMembersReceived(membersReceived);
2256
+ if (deferScreenReceived && screenId) {
2257
+ shareScreenStarted = true;
2258
+ updateShareScreenStarted(shareScreenStarted);
2259
+ }
2260
+ await sleep2({ ms: 250 });
2261
+ updateIsLoadingModalVisible(false);
2262
+ deferScreenReceived = false;
2263
+ updateDeferScreenReceived(deferScreenReceived);
2264
+ }
2265
+ }
2266
+ if (onLocal && !membersReceived) {
2267
+ if (connectLocalIps) {
2268
+ await connectLocalIps({ socket, parameters });
2269
+ }
2270
+ await sleep2({ ms: 50 });
2271
+ updateIsLoadingModalVisible(false);
2272
+ }
2273
+ requestList = requestss.filter(
2274
+ (request) => participants.some((participant) => participant.id === request.id)
2275
+ );
2276
+ updateRequestList(requestList);
2277
+ updateTotalReqWait(requestList.length + waitingRoomList.length);
2278
+ updateCoHost(coHoste);
2279
+ updateCoHostResponsibility(coHostRes);
2280
+ if (!lock_screen && !firstAll) {
2281
+ await onScreenChanges({ parameters });
2282
+ if (meetingDisplayType !== "all") {
2283
+ updateFirstAll(true);
2284
+ }
2285
+ } else if (islevel === "2" && !hostFirstSwitch) {
2286
+ await onScreenChanges({ parameters });
2287
+ updateHostFirstSwitch(true);
2288
+ }
2289
+ };
2290
+ const allMembersRest = async ({
2291
+ members,
2292
+ settings,
2293
+ coHoste,
2294
+ coHostRes,
2295
+ parameters,
2296
+ consume_sockets,
2297
+ apiUserName,
2298
+ apiKey,
2299
+ apiToken
2300
+ }) => {
2301
+ let {
2302
+ participantsAll,
2303
+ participants,
2304
+ dispActiveNames,
2305
+ requestList,
2306
+ coHost,
2307
+ coHostResponsibility,
2308
+ lock_screen,
2309
+ firstAll,
2310
+ membersReceived,
2311
+ roomRecvIPs,
2312
+ deferScreenReceived,
2313
+ screenId,
2314
+ shareScreenStarted,
2315
+ meetingDisplayType,
2316
+ audioSetting,
2317
+ videoSetting,
2318
+ screenshareSetting,
2319
+ chatSetting,
2320
+ socket,
2321
+ updateParticipantsAll,
2322
+ updateParticipants,
2323
+ updateRequestList,
2324
+ updateCoHost,
2325
+ updateCoHostResponsibility,
2326
+ updateFirstAll,
2327
+ updateMembersReceived,
2328
+ updateDeferScreenReceived,
2329
+ updateShareScreenStarted,
2330
+ updateAudioSetting,
2331
+ updateVideoSetting,
2332
+ updateScreenshareSetting,
2333
+ updateChatSetting,
2334
+ updateConsume_sockets,
2335
+ updateRoomRecvIPs,
2336
+ updateIsLoadingModalVisible,
2337
+ onScreenChanges,
2338
+ connectIps,
2339
+ connectLocalIps,
2340
+ sleep: sleep2,
2341
+ reorderStreams
2342
+ } = parameters;
2343
+ participantsAll = members.map((participant) => ({
2344
+ isBanned: participant.isBanned,
2345
+ isSuspended: participant.isSuspended,
2346
+ name: participant.name,
2347
+ audioID: participant.audioID,
2348
+ videoID: participant.videoID
2349
+ }));
2350
+ updateParticipantsAll(participantsAll);
2351
+ participants = members.filter(
2352
+ (participant) => !participant.isBanned && !participant.isSuspended
2353
+ );
2354
+ updateParticipants(participants);
2355
+ if (dispActiveNames.length > 0) {
2356
+ const missingDisplayedParticipants = dispActiveNames.filter(
2357
+ (name) => !participants.some((participant) => participant.name === name)
2358
+ );
2359
+ if (missingDisplayedParticipants.length > 0 && membersReceived) {
2360
+ await reorderStreams({ add: false, screenChanged: true, parameters });
2361
+ }
2362
+ }
2363
+ const onLocal = roomRecvIPs.length === 1 && roomRecvIPs[0] === "none";
2364
+ if (!onLocal) {
2365
+ if (!membersReceived) {
2366
+ if (roomRecvIPs.length < 1) {
2367
+ const checkIPs = setInterval(async () => {
2368
+ if (roomRecvIPs.length > 0) {
2369
+ clearInterval(checkIPs);
2370
+ if (deferScreenReceived && screenId) {
2371
+ shareScreenStarted = true;
2372
+ updateShareScreenStarted(shareScreenStarted);
2373
+ }
2374
+ const [sockets_, ips_] = await connectIps({
2375
+ consume_sockets,
2376
+ remIP: roomRecvIPs,
2377
+ parameters,
2378
+ apiUserName,
2379
+ apiKey,
2380
+ apiToken
2381
+ });
2382
+ if (sockets_ && ips_) {
2383
+ updateConsume_sockets(sockets_);
2384
+ updateRoomRecvIPs(ips_);
2385
+ }
2386
+ membersReceived = true;
2387
+ updateMembersReceived(membersReceived);
2388
+ await sleep2({ ms: 250 });
2389
+ updateIsLoadingModalVisible(false);
2390
+ deferScreenReceived = false;
2391
+ updateDeferScreenReceived(deferScreenReceived);
2392
+ }
2393
+ }, 10);
2394
+ } else {
2395
+ const [sockets_, ips_] = await connectIps({
2396
+ consume_sockets,
2397
+ remIP: roomRecvIPs,
2398
+ parameters,
2399
+ apiUserName,
2400
+ apiKey,
2401
+ apiToken
2402
+ });
2403
+ if (sockets_ && ips_) {
2404
+ updateConsume_sockets(sockets_);
2405
+ updateRoomRecvIPs(ips_);
2406
+ }
2407
+ membersReceived = true;
2408
+ updateMembersReceived(membersReceived);
2409
+ if (deferScreenReceived && screenId) {
2410
+ shareScreenStarted = true;
2411
+ updateShareScreenStarted(shareScreenStarted);
2412
+ }
2413
+ await sleep2({ ms: 250 });
2414
+ updateIsLoadingModalVisible(false);
2415
+ deferScreenReceived = false;
2416
+ updateDeferScreenReceived(deferScreenReceived);
2417
+ }
2418
+ } else if (screenId) {
2419
+ const host = participants.find(
2420
+ (participant) => participant.ScreenID === screenId && participant.ScreenOn === true
2421
+ );
2422
+ if (deferScreenReceived && host) {
2423
+ shareScreenStarted = true;
2424
+ updateShareScreenStarted(shareScreenStarted);
2425
+ }
2426
+ }
2427
+ }
2428
+ if (onLocal && !membersReceived) {
2429
+ if (connectLocalIps) {
2430
+ await connectLocalIps({ socket, parameters });
2431
+ }
2432
+ await sleep2({ ms: 50 });
2433
+ updateIsLoadingModalVisible(false);
2434
+ }
2435
+ requestList = requestList.filter(
2436
+ (request) => participants.some((participant) => participant.id === request.id)
2437
+ );
2438
+ updateRequestList(requestList);
2439
+ coHost = coHoste;
2440
+ updateCoHost(coHost);
2441
+ coHostResponsibility = coHostRes;
2442
+ updateCoHostResponsibility(coHostResponsibility);
2443
+ if (!lock_screen && !firstAll) {
2444
+ await onScreenChanges({ parameters });
2445
+ if (meetingDisplayType !== "all") {
2446
+ firstAll = true;
2447
+ updateFirstAll(firstAll);
2448
+ }
2449
+ }
2450
+ try {
2451
+ if (membersReceived) {
2452
+ [audioSetting, videoSetting, screenshareSetting, chatSetting] = settings;
2453
+ updateAudioSetting(audioSetting);
2454
+ updateVideoSetting(videoSetting);
2455
+ updateScreenshareSetting(screenshareSetting);
2456
+ updateChatSetting(chatSetting);
2457
+ }
2458
+ } catch {
2459
+ }
2460
+ };
2461
+ const banParticipant = async ({
2462
+ name,
2463
+ parameters
2464
+ }) => {
2465
+ const {
2466
+ activeNames,
2467
+ dispActiveNames,
2468
+ participants,
2469
+ updateParticipants,
2470
+ reorderStreams
2471
+ } = parameters;
2472
+ if (activeNames.includes(name) || dispActiveNames.includes(name)) {
2473
+ updateParticipants(
2474
+ participants.filter((participant) => participant.name !== name)
2475
+ );
2476
+ await reorderStreams({ add: false, screenChanged: true, parameters });
2477
+ }
2478
+ };
2479
+ const controlMediaHost = async ({
2480
+ type,
2481
+ parameters
2482
+ }) => {
2483
+ const {
2484
+ updateAdminRestrictSetting,
2485
+ updateLocalStream,
2486
+ updateAudioAlreadyOn,
2487
+ updateLocalStreamScreen,
2488
+ updateLocalStreamVideo,
2489
+ updateScreenAlreadyOn,
2490
+ updateVideoAlreadyOn,
2491
+ updateChatAlreadyOn,
2492
+ onScreenChanges,
2493
+ stopShareScreen,
2494
+ disconnectSendTransportVideo,
2495
+ disconnectSendTransportAudio,
2496
+ disconnectSendTransportScreen
2497
+ } = parameters;
2498
+ const { localStream, localStreamScreen, localStreamVideo } = parameters.getUpdatedAllParams();
2499
+ const disableTrack = (stream, kind) => {
2500
+ const getTracks = kind === "audio" ? stream?.getAudioTracks : stream?.getVideoTracks;
2501
+ const tracks = typeof getTracks === "function" ? getTracks.call(stream) : stream?.tracks?.filter((track2) => track2.kind === kind) ?? [];
2502
+ const track = tracks && tracks[0];
2503
+ if (track) {
2504
+ track.enabled = false;
2505
+ return true;
2506
+ }
2507
+ return false;
2508
+ };
2509
+ try {
2510
+ updateAdminRestrictSetting(true);
2511
+ if (type === "audio") {
2512
+ disableTrack(localStream, "audio");
2513
+ updateLocalStream(localStream ?? null);
2514
+ await disconnectSendTransportAudio({ parameters });
2515
+ updateAudioAlreadyOn(false);
2516
+ } else if (type === "video") {
2517
+ disableTrack(localStream, "video");
2518
+ updateLocalStream(localStream ?? null);
2519
+ await disconnectSendTransportVideo({ parameters });
2520
+ await onScreenChanges({ changed: true, parameters });
2521
+ disableTrack(localStreamVideo, "video");
2522
+ updateLocalStreamVideo(localStreamVideo ?? null);
2523
+ await disconnectSendTransportVideo({ parameters });
2524
+ await onScreenChanges({ changed: true, parameters });
2525
+ updateVideoAlreadyOn(false);
2526
+ } else if (type === "screenshare") {
2527
+ disableTrack(localStreamScreen, "video");
2528
+ updateLocalStreamScreen(localStreamScreen ?? null);
2529
+ await disconnectSendTransportScreen({ parameters });
2530
+ await stopShareScreen({ parameters });
2531
+ updateScreenAlreadyOn(false);
2532
+ } else if (type === "chat") {
2533
+ updateChatAlreadyOn(false);
2534
+ } else if (type === "all") {
2535
+ disableTrack(localStream, "audio");
2536
+ updateLocalStream(localStream ?? null);
2537
+ await disconnectSendTransportAudio({ parameters });
2538
+ updateAudioAlreadyOn(false);
2539
+ disableTrack(localStreamScreen, "video");
2540
+ updateLocalStreamScreen(localStreamScreen ?? null);
2541
+ await disconnectSendTransportScreen({ parameters });
2542
+ await stopShareScreen({ parameters });
2543
+ updateScreenAlreadyOn(false);
2544
+ disableTrack(localStream, "video");
2545
+ updateLocalStream(localStream ?? null);
2546
+ await disconnectSendTransportVideo({ parameters });
2547
+ await onScreenChanges({ changed: true, parameters });
2548
+ disableTrack(localStreamVideo, "video");
2549
+ updateLocalStreamVideo(localStreamVideo ?? null);
2550
+ await disconnectSendTransportVideo({ parameters });
2551
+ await onScreenChanges({ changed: true, parameters });
2552
+ updateVideoAlreadyOn(false);
2553
+ }
2554
+ } catch (error) {
2555
+ console.error("Error in controlMediaHost:", error);
2556
+ }
2557
+ };
2558
+ const disconnect = async ({
2559
+ showAlert,
2560
+ redirectURL,
2561
+ onWeb
2562
+ }) => {
2563
+ if (onWeb && redirectURL && typeof window !== "undefined") {
2564
+ window.location.href = redirectURL;
2565
+ } else {
2566
+ showAlert?.({
2567
+ message: "You have been disconnected from the session.",
2568
+ type: "danger",
2569
+ duration: 2e3
2570
+ });
2571
+ }
2572
+ };
2573
+ async function disconnectUserSelf({
2574
+ member,
2575
+ roomName,
2576
+ socket,
2577
+ localSocket
2578
+ }) {
2579
+ socket.emit("disconnectUser", {
2580
+ member,
2581
+ roomName,
2582
+ ban: true
2583
+ });
2584
+ try {
2585
+ if (localSocket?.id) {
2586
+ localSocket.emit("disconnectUser", {
2587
+ member,
2588
+ roomName,
2589
+ ban: true
2590
+ });
2591
+ }
2592
+ } catch {
2593
+ }
2594
+ }
2595
+ const getDomains = async ({
2596
+ domains,
2597
+ alt_domains,
2598
+ apiUserName,
2599
+ apiKey,
2600
+ apiToken,
2601
+ parameters
2602
+ }) => {
2603
+ let { roomRecvIPs, consume_sockets, connectIps } = parameters;
2604
+ const ipsToConnect = [];
2605
+ try {
2606
+ consume_sockets = parameters.getUpdatedAllParams().consume_sockets;
2607
+ for (const domain of domains) {
2608
+ const ipToCheck = alt_domains[domain] || domain;
2609
+ if (!roomRecvIPs.includes(ipToCheck)) {
2610
+ ipsToConnect.push(ipToCheck);
2611
+ }
2612
+ }
2613
+ await connectIps({
2614
+ consume_sockets,
2615
+ remIP: ipsToConnect,
2616
+ parameters,
2617
+ apiUserName,
2618
+ apiKey,
2619
+ apiToken
2620
+ });
2621
+ } catch (error) {
2622
+ console.error("Error in getDomains: ", error);
2623
+ }
2624
+ };
2625
+ const meetingEnded = async ({
2626
+ showAlert,
2627
+ redirectURL,
2628
+ onWeb,
2629
+ eventType
2630
+ }) => {
2631
+ if (eventType !== "chat") {
2632
+ showAlert?.({
2633
+ message: "The event has ended. You will be redirected to the home page in 2 seconds.",
2634
+ type: "danger",
2635
+ duration: 2e3
2636
+ });
2637
+ }
2638
+ if (onWeb && redirectURL) {
2639
+ setTimeout(() => {
2640
+ window.location.href = redirectURL;
2641
+ }, 2e3);
2642
+ }
2643
+ };
2644
+ const meetingStillThere = async ({
2645
+ updateIsConfirmHereModalVisible
2646
+ }) => {
2647
+ updateIsConfirmHereModalVisible(true);
2648
+ };
2649
+ const panelistsUpdated = async ({
2650
+ data,
2651
+ updatePanelists: updatePanelists2
2652
+ }) => {
2653
+ try {
2654
+ const { panelists } = data;
2655
+ if (updatePanelists2) {
2656
+ updatePanelists2(
2657
+ panelists.map((panelist) => ({
2658
+ id: panelist.id,
2659
+ name: panelist.name,
2660
+ audioID: "",
2661
+ videoID: ""
2662
+ }))
2663
+ );
2664
+ }
2665
+ } catch (error) {
2666
+ console.error("Error handling panelistsUpdated:", error);
2667
+ }
2668
+ };
2669
+ const panelistFocusChanged = async ({
2670
+ data,
2671
+ updatePanelistsFocused,
2672
+ updateMuteOthersMic,
2673
+ updateMuteOthersCamera,
2674
+ updatePanelists: updatePanelists2,
2675
+ currentPanelistsFocused,
2676
+ currentPanelists,
2677
+ onScreenChanges
2678
+ }) => {
2679
+ try {
2680
+ const { focusEnabled, panelists, muteOthersMic, muteOthersCamera } = data;
2681
+ const focusChanged = currentPanelistsFocused !== void 0 && currentPanelistsFocused !== focusEnabled;
2682
+ const currentPanelistIds = (currentPanelists || []).map((panelist) => panelist.id).sort().join(",");
2683
+ const newPanelistIds = panelists.map((panelist) => panelist.id).sort().join(",");
2684
+ const panelistsChanged = currentPanelistIds !== newPanelistIds;
2685
+ updatePanelistsFocused?.(focusEnabled);
2686
+ updateMuteOthersMic?.(muteOthersMic);
2687
+ updateMuteOthersCamera?.(muteOthersCamera);
2688
+ if (updatePanelists2) {
2689
+ updatePanelists2(
2690
+ panelists.map((panelist) => ({
2691
+ id: panelist.id,
2692
+ name: panelist.name,
2693
+ audioID: "",
2694
+ videoID: ""
2695
+ }))
2696
+ );
2697
+ }
2698
+ if ((focusChanged || panelistsChanged) && onScreenChanges) {
2699
+ await onScreenChanges();
2700
+ }
2701
+ } catch (error) {
2702
+ console.error("Error handling panelistFocusChanged:", error);
2703
+ }
2704
+ };
2705
+ const panelistControlMedia = async ({
2706
+ data,
2707
+ showAlert,
2708
+ clickAudio,
2709
+ clickVideo,
2710
+ audioAlreadyOn,
2711
+ videoAlreadyOn
2712
+ }) => {
2713
+ try {
2714
+ const { type, action, reason } = data;
2715
+ if (action === "mute") {
2716
+ if (type === "audio" && audioAlreadyOn && clickAudio) {
2717
+ clickAudio();
2718
+ } else if (type === "video" && videoAlreadyOn && clickVideo) {
2719
+ clickVideo();
2720
+ }
2721
+ if (showAlert && reason) {
2722
+ showAlert({
2723
+ message: `Your ${type === "audio" ? "microphone" : "camera"} has been muted. ${reason}`,
2724
+ type: "info",
2725
+ duration: 3e3
2726
+ });
2727
+ }
2728
+ }
2729
+ } catch (error) {
2730
+ console.error("Error handling controlMedia:", error);
2731
+ }
2732
+ };
2733
+ const addedAsPanelist = async ({
2734
+ data,
2735
+ showAlert
2736
+ }) => {
2737
+ try {
2738
+ showAlert?.({
2739
+ message: data.message || "You have been added as a panelist",
2740
+ type: "success",
2741
+ duration: 3e3
2742
+ });
2743
+ } catch (error) {
2744
+ console.error("Error handling addedAsPanelist:", error);
2745
+ }
2746
+ };
2747
+ const removedFromPanelists = async ({
2748
+ data,
2749
+ showAlert
2750
+ }) => {
2751
+ try {
2752
+ showAlert?.({
2753
+ message: data.message || "You have been removed from panelists",
2754
+ type: "info",
2755
+ duration: 3e3
2756
+ });
2757
+ } catch (error) {
2758
+ console.error("Error handling removedFromPanelists:", error);
2759
+ }
2760
+ };
2761
+ const participantRequested = async ({
2762
+ userRequest,
2763
+ requestList,
2764
+ waitingRoomList,
2765
+ updateTotalReqWait,
2766
+ updateRequestList
2767
+ }) => {
2768
+ const hasMatchingRequest = requestList.some(
2769
+ (request) => request.id === userRequest.id && request.icon === userRequest.icon
2770
+ );
2771
+ const updatedRequestList = hasMatchingRequest ? requestList : [...requestList, userRequest];
2772
+ updateRequestList(updatedRequestList);
2773
+ updateTotalReqWait(updatedRequestList.length + waitingRoomList.length);
2774
+ };
2775
+ const permissionUpdated = async ({
2776
+ data,
2777
+ showAlert,
2778
+ updateIslevel
2779
+ }) => {
2780
+ try {
2781
+ const { newLevel, message } = data;
2782
+ updateIslevel?.(newLevel);
2783
+ if (showAlert && message) {
2784
+ showAlert({
2785
+ message,
2786
+ type: newLevel === "1" ? "success" : "info",
2787
+ duration: 3e3
2788
+ });
2789
+ }
2790
+ } catch (error) {
2791
+ console.error("Error handling permissionUpdated:", error);
2792
+ }
2793
+ };
2794
+ const permissionConfigUpdated = async ({
2795
+ data,
2796
+ updatePermissionConfig: updatePermissionConfig2
2797
+ }) => {
2798
+ try {
2799
+ updatePermissionConfig2?.(data.config);
2800
+ } catch (error) {
2801
+ console.error("Error handling permissionConfigUpdated:", error);
2802
+ }
2803
+ };
2804
+ const personJoined = async ({
2805
+ name,
2806
+ showAlert
2807
+ }) => {
2808
+ showAlert?.({
2809
+ message: `${name} joined the event.`,
2810
+ type: "success",
2811
+ duration: 3e3
2812
+ });
2813
+ };
2814
+ const producerMediaClosed = async ({
2815
+ producerId,
2816
+ kind,
2817
+ parameters
2818
+ }) => {
2819
+ const updatedParameters = parameters.getUpdatedAllParams();
2820
+ const {
2821
+ consumerTransports,
2822
+ updateConsumerTransports,
2823
+ hostLabel,
2824
+ shared,
2825
+ updateShared,
2826
+ updateShareScreenStarted,
2827
+ updateScreenId,
2828
+ updateShareEnded,
2829
+ closeAndResize,
2830
+ prepopulateUserMedia,
2831
+ reorderStreams
2832
+ } = updatedParameters;
2833
+ const producerToClose = consumerTransports.find(
2834
+ (transportData) => transportData.producerId === producerId
2835
+ );
2836
+ if (producerToClose) {
2837
+ try {
2838
+ await producerToClose.consumerTransport?.close();
2839
+ } catch (error) {
2840
+ console.error("Error closing consumer transport:", error);
2841
+ }
2842
+ try {
2843
+ producerToClose.consumer.close();
2844
+ } catch (error) {
2845
+ console.error("Error closing consumer:", error);
2846
+ }
2847
+ const updatedTransports = consumerTransports.filter(
2848
+ (transportData) => transportData.producerId !== producerId
2849
+ );
2850
+ updateConsumerTransports(updatedTransports);
2851
+ await closeAndResize({
2852
+ producerId,
2853
+ kind,
2854
+ parameters: updatedParameters
2855
+ });
2856
+ } else if (kind === "screenshare" || kind === "screen") {
2857
+ if (shared) {
2858
+ updateShared(false);
2859
+ } else {
2860
+ updateShareScreenStarted(false);
2861
+ updateScreenId("");
2862
+ }
2863
+ updateShareEnded(true);
2864
+ await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });
2865
+ await reorderStreams({
2866
+ add: false,
2867
+ screenChanged: true,
2868
+ parameters: updatedParameters
2869
+ });
2870
+ }
2871
+ };
2872
+ const producerMediaPaused = async ({
2873
+ producerId,
2874
+ kind,
2875
+ name,
2876
+ parameters
2877
+ }) => {
2878
+ parameters = parameters.getUpdatedAllParams();
2879
+ let {
2880
+ activeSounds,
2881
+ meetingDisplayType,
2882
+ meetingVideoOptimized,
2883
+ participants,
2884
+ oldSoundIds,
2885
+ shared,
2886
+ shareScreenStarted,
2887
+ updateMainWindow,
2888
+ hostLabel,
2889
+ islevel,
2890
+ updateActiveSounds,
2891
+ updateUpdateMainWindow,
2892
+ reorderStreams,
2893
+ prepopulateUserMedia,
2894
+ reUpdateInter
2895
+ } = parameters;
2896
+ await Promise.all(
2897
+ participants.map(async (participant) => {
2898
+ if (participant.muted) {
2899
+ try {
2900
+ if (participant.islevel === "2" && !participant.videoID && !shared && !shareScreenStarted && islevel !== "2") {
2901
+ updateMainWindow = true;
2902
+ updateUpdateMainWindow(updateMainWindow);
2903
+ await prepopulateUserMedia({ name: hostLabel, parameters });
2904
+ updateMainWindow = false;
2905
+ updateUpdateMainWindow(updateMainWindow);
2906
+ }
2907
+ } catch {
2908
+ }
2909
+ if (shareScreenStarted || shared) {
2910
+ if (participant.name && activeSounds.includes(participant.name)) {
2911
+ activeSounds = activeSounds.filter(
2912
+ (audioStream) => audioStream !== participant.name
2913
+ );
2914
+ updateActiveSounds(activeSounds);
2915
+ }
2916
+ reUpdateInter({
2917
+ name: participant.name,
2918
+ add: false,
2919
+ force: true,
2920
+ parameters
2921
+ });
2922
+ }
2923
+ }
2924
+ })
2925
+ );
2926
+ if (meetingDisplayType === "media" || meetingDisplayType === "video" && !meetingVideoOptimized) {
2927
+ const participant = participants.find((item) => item.name === name);
2928
+ const hasVideo = participant?.videoID !== null && participant?.videoID !== "";
2929
+ if (!hasVideo && !(shareScreenStarted || shared)) {
2930
+ await reorderStreams({ add: false, screenChanged: true, parameters });
2931
+ }
2932
+ }
2933
+ if (kind === "audio") {
2934
+ try {
2935
+ const participant = participants.find((item) => item.audioID === producerId) || participants.find((item) => item.name === name);
2936
+ if (participant && (participant.name && oldSoundIds.includes(participant.name) || name && oldSoundIds.includes(name))) {
2937
+ reUpdateInter({
2938
+ name: participant.name,
2939
+ add: false,
2940
+ force: true,
2941
+ parameters
2942
+ });
2943
+ }
2944
+ } catch {
2945
+ }
2946
+ }
2947
+ };
2948
+ const producerMediaResumed = async ({
2949
+ name,
2950
+ parameters
2951
+ }) => {
2952
+ const {
2953
+ meetingDisplayType,
2954
+ participants,
2955
+ shared,
2956
+ shareScreenStarted,
2957
+ mainScreenFilled,
2958
+ hostLabel,
2959
+ updateUpdateMainWindow,
2960
+ reorderStreams,
2961
+ prepopulateUserMedia
2962
+ } = parameters;
2963
+ const participant = participants.find((item) => item.name === name);
2964
+ if (participant && !mainScreenFilled && participant.islevel === "2") {
2965
+ updateUpdateMainWindow(true);
2966
+ await prepopulateUserMedia({ name: hostLabel, parameters });
2967
+ updateUpdateMainWindow(false);
2968
+ }
2969
+ if (meetingDisplayType === "media" && participant) {
2970
+ const hasVideo = participant.videoID !== null && participant.videoID !== "";
2971
+ if (!hasVideo && !(shareScreenStarted || shared)) {
2972
+ await reorderStreams({ add: false, screenChanged: true, parameters });
2973
+ }
2974
+ }
2975
+ };
2976
+ const receiveMessage = async ({
2977
+ message,
2978
+ messages,
2979
+ participantsAll,
2980
+ member,
2981
+ eventType,
2982
+ islevel,
2983
+ coHost,
2984
+ updateMessages,
2985
+ updateShowMessagesBadge
2986
+ }) => {
2987
+ const { sender, receivers, message: content, timestamp, group } = message;
2988
+ const oldMessages = messages;
2989
+ messages = [...messages, { sender, receivers, message: content, timestamp, group }];
2990
+ if (eventType !== "broadcast" && eventType !== "chat") {
2991
+ messages = messages.filter(
2992
+ (msg) => participantsAll.some(
2993
+ (participant) => participant.name === msg.sender && !participant.isBanned
2994
+ )
2995
+ );
2996
+ } else {
2997
+ messages = messages.filter((msg) => {
2998
+ const participant = participantsAll.find((p) => p.name === msg.sender);
2999
+ return !participant || !participant.isBanned;
3000
+ });
3001
+ }
3002
+ updateMessages(messages);
3003
+ const oldGroupMessages = oldMessages.filter((msg) => msg.group);
3004
+ const oldDirectMessages = oldMessages.filter((msg) => !msg.group);
3005
+ const groupMessages = messages.filter((msg) => msg.group);
3006
+ const directMessages = messages.filter((msg) => !msg.group);
3007
+ if (eventType !== "broadcast" && eventType !== "chat") {
3008
+ if (oldGroupMessages.length !== groupMessages.length) {
3009
+ const newGroupMessages = groupMessages.filter(
3010
+ (msg) => !oldGroupMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp)
3011
+ );
3012
+ const relevantGroupMessages = newGroupMessages.filter(
3013
+ (msg) => msg.sender === member || msg.receivers.includes(member)
3014
+ );
3015
+ const selfSentGroupMessages = relevantGroupMessages.filter(
3016
+ (msg) => msg.sender === member
3017
+ );
3018
+ if (newGroupMessages.length > 0 && relevantGroupMessages.length > selfSentGroupMessages.length) {
3019
+ updateShowMessagesBadge(true);
3020
+ }
3021
+ }
3022
+ if (oldDirectMessages.length !== directMessages.length) {
3023
+ const newDirectMessages = directMessages.filter(
3024
+ (msg) => !oldDirectMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp)
3025
+ );
3026
+ const relevantDirectMessages = newDirectMessages.filter(
3027
+ (msg) => msg.sender === member || msg.receivers.includes(member)
3028
+ );
3029
+ const selfSentDirectMessages = relevantDirectMessages.filter(
3030
+ (msg) => msg.sender === member
3031
+ );
3032
+ const isPrivileged = islevel === "2" || coHost === member;
3033
+ const hasRelevantDirectMessages = isPrivileged ? newDirectMessages.length > 0 : relevantDirectMessages.length > 0;
3034
+ if (hasRelevantDirectMessages && newDirectMessages.length > selfSentDirectMessages.length) {
3035
+ updateShowMessagesBadge(true);
3036
+ }
3037
+ }
3038
+ }
3039
+ };
3040
+ const recordingNotice = async ({
3041
+ state,
3042
+ userRecordingParam,
3043
+ pauseCount,
3044
+ timeDone,
3045
+ parameters,
3046
+ soundPlayer
3047
+ }) => {
3048
+ let {
3049
+ islevel,
3050
+ userRecordingParams,
3051
+ pauseRecordCount,
3052
+ recordElapsedTime,
3053
+ recordStartTime,
3054
+ recordStarted,
3055
+ recordPaused,
3056
+ canLaunchRecord,
3057
+ stopLaunchRecord,
3058
+ recordStopped,
3059
+ isTimerRunning,
3060
+ canPauseResume,
3061
+ eventType,
3062
+ updateRecordingProgressTime,
3063
+ updateShowRecordButtons,
3064
+ updateUserRecordingParams,
3065
+ updateRecordingMediaOptions,
3066
+ updateRecordingAudioOptions,
3067
+ updateRecordingVideoOptions,
3068
+ updateRecordingVideoType,
3069
+ updateRecordingVideoOptimized,
3070
+ updateRecordingDisplayType,
3071
+ updateRecordingAddHLS,
3072
+ updateRecordingNameTags,
3073
+ updateRecordingBackgroundColor,
3074
+ updateRecordingNameTagsColor,
3075
+ updateRecordingOrientationVideo,
3076
+ updateRecordingAddText,
3077
+ updateRecordingCustomText,
3078
+ updateRecordingCustomTextPosition,
3079
+ updateRecordingCustomTextColor,
3080
+ updatePauseRecordCount,
3081
+ updateRecordElapsedTime,
3082
+ updateRecordStartTime,
3083
+ updateRecordStarted,
3084
+ updateRecordPaused,
3085
+ updateCanLaunchRecord,
3086
+ updateStopLaunchRecord,
3087
+ updateRecordStopped,
3088
+ updateIsTimerRunning,
3089
+ updateCanPauseResume,
3090
+ updateRecordState
3091
+ } = parameters;
3092
+ const playSound = async (soundUrl) => {
3093
+ await (soundPlayer ?? SoundPlayer)({ soundUrl });
3094
+ };
3095
+ try {
3096
+ if (islevel !== "2") {
3097
+ if (state === "pause") {
3098
+ updateRecordStarted(true);
3099
+ updateRecordPaused(true);
3100
+ updateRecordState("yellow");
3101
+ if (eventType !== "broadcast") {
3102
+ await playSound("https://www.mediasfu.com/sounds/record-paused.mp3");
3103
+ }
3104
+ } else if (state === "stop") {
3105
+ updateRecordStarted(true);
3106
+ updateRecordStopped(true);
3107
+ updateRecordState("green");
3108
+ if (eventType !== "broadcast") {
3109
+ await playSound("https://www.mediasfu.com/sounds/record-stopped.mp3");
3110
+ }
3111
+ } else {
3112
+ updateRecordState("red");
3113
+ updateRecordStarted(true);
3114
+ updateRecordPaused(false);
3115
+ if (eventType !== "broadcast") {
3116
+ await playSound("https://www.mediasfu.com/sounds/record-progress.mp3");
3117
+ }
3118
+ }
3119
+ } else {
3120
+ if (state === "pause") {
3121
+ updateRecordState("yellow");
3122
+ if (userRecordingParam) {
3123
+ userRecordingParams.mainSpecs = userRecordingParam.mainSpecs;
3124
+ userRecordingParams.dispSpecs = userRecordingParam.dispSpecs;
3125
+ userRecordingParams.textSpecs = userRecordingParam.textSpecs;
3126
+ updateUserRecordingParams(userRecordingParams);
3127
+ updateRecordingMediaOptions(userRecordingParams.mainSpecs.mediaOptions);
3128
+ updateRecordingAudioOptions(userRecordingParams.mainSpecs.audioOptions);
3129
+ updateRecordingVideoOptions(userRecordingParams.mainSpecs.videoOptions);
3130
+ updateRecordingVideoType(userRecordingParams.mainSpecs.videoType);
3131
+ updateRecordingVideoOptimized(userRecordingParams.mainSpecs.videoOptimized);
3132
+ updateRecordingDisplayType(userRecordingParams.mainSpecs.recordingDisplayType);
3133
+ updateRecordingAddHLS(userRecordingParams.mainSpecs.addHLS);
3134
+ updateRecordingNameTags(userRecordingParams.dispSpecs.nameTags);
3135
+ updateRecordingBackgroundColor(userRecordingParams.dispSpecs.backgroundColor);
3136
+ updateRecordingNameTagsColor(userRecordingParams.dispSpecs.nameTagsColor);
3137
+ updateRecordingOrientationVideo(userRecordingParams.dispSpecs.orientationVideo);
3138
+ updateRecordingAddText(userRecordingParams.textSpecs?.addText ?? false);
3139
+ updateRecordingCustomText(userRecordingParams.textSpecs?.customText ?? "");
3140
+ updateRecordingCustomTextPosition(
3141
+ userRecordingParams.textSpecs?.customTextPosition ?? ""
3142
+ );
3143
+ updateRecordingCustomTextColor(
3144
+ userRecordingParams.textSpecs?.customTextColor ?? ""
3145
+ );
3146
+ pauseRecordCount = pauseCount;
3147
+ updatePauseRecordCount(pauseRecordCount);
3148
+ recordElapsedTime = Math.floor(timeDone / 1e3);
3149
+ recordStartTime = Math.floor(Date.now() / 1e3) - recordElapsedTime;
3150
+ updateRecordStartTime(recordStartTime);
3151
+ updateRecordElapsedTime(recordElapsedTime);
3152
+ recordStarted = true;
3153
+ recordPaused = true;
3154
+ canLaunchRecord = false;
3155
+ recordStopped = false;
3156
+ updateRecordStarted(recordStarted);
3157
+ updateRecordPaused(recordPaused);
3158
+ updateCanLaunchRecord(canLaunchRecord);
3159
+ updateRecordStopped(recordStopped);
3160
+ updateShowRecordButtons(true);
3161
+ isTimerRunning = false;
3162
+ canPauseResume = true;
3163
+ updateIsTimerRunning(isTimerRunning);
3164
+ updateCanPauseResume(canPauseResume);
3165
+ updateRecordingProgressTime(formatElapsedTime(recordElapsedTime));
3166
+ }
3167
+ await playSound("https://www.mediasfu.com/sounds/record-paused.mp3");
3168
+ } else if (state === "stop") {
3169
+ recordStarted = true;
3170
+ recordStopped = true;
3171
+ canLaunchRecord = false;
3172
+ stopLaunchRecord = true;
3173
+ updateRecordStarted(recordStarted);
3174
+ updateRecordStopped(recordStopped);
3175
+ updateCanLaunchRecord(canLaunchRecord);
3176
+ updateStopLaunchRecord(stopLaunchRecord);
3177
+ updateShowRecordButtons(false);
3178
+ updateRecordState("green");
3179
+ await playSound("https://www.mediasfu.com/sounds/record-stopped.mp3");
3180
+ } else {
3181
+ updateRecordState("red");
3182
+ updateRecordStarted(true);
3183
+ updateRecordPaused(false);
3184
+ await playSound("https://www.mediasfu.com/sounds/record-progress.mp3");
3185
+ }
3186
+ }
3187
+ } catch (error) {
3188
+ console.log("Error in RecordingNotice: ", error);
3189
+ }
3190
+ };
3191
+ const formatElapsedTime = (recordElapsedTime) => {
3192
+ const hours = Math.floor(recordElapsedTime / 3600);
3193
+ const minutes = Math.floor(recordElapsedTime % 3600 / 60);
3194
+ const seconds = recordElapsedTime % 60;
3195
+ return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`;
3196
+ };
3197
+ const padNumber = (value) => value.toString().padStart(2, "0");
3198
+ const reInitiateRecording = async ({
3199
+ roomName,
3200
+ member,
3201
+ socket,
3202
+ adminRestrictSetting
3203
+ }) => {
3204
+ if (!adminRestrictSetting) {
3205
+ socket.emit(
3206
+ "startRecordIng",
3207
+ { roomName, member },
3208
+ ({ success }) => {
3209
+ }
3210
+ );
3211
+ }
3212
+ };
3213
+ const roomRecordParams = async ({
3214
+ recordParams,
3215
+ parameters
3216
+ }) => {
3217
+ const {
3218
+ updateRecordingAudioPausesLimit,
3219
+ updateRecordingAudioPausesCount,
3220
+ updateRecordingAudioSupport,
3221
+ updateRecordingAudioPeopleLimit,
3222
+ updateRecordingAudioParticipantsTimeLimit,
3223
+ updateRecordingVideoPausesCount,
3224
+ updateRecordingVideoPausesLimit,
3225
+ updateRecordingVideoSupport,
3226
+ updateRecordingVideoPeopleLimit,
3227
+ updateRecordingVideoParticipantsTimeLimit,
3228
+ updateRecordingAllParticipantsSupport,
3229
+ updateRecordingVideoParticipantsSupport,
3230
+ updateRecordingAllParticipantsFullRoomSupport,
3231
+ updateRecordingVideoParticipantsFullRoomSupport,
3232
+ updateRecordingPreferredOrientation,
3233
+ updateRecordingSupportForOtherOrientation,
3234
+ updateRecordingMultiFormatsSupport
3235
+ } = parameters;
3236
+ updateRecordingAudioPausesLimit(recordParams.recordingAudioPausesLimit);
3237
+ updateRecordingAudioPausesCount(recordParams.recordingAudioPausesCount);
3238
+ updateRecordingAudioSupport(recordParams.recordingAudioSupport);
3239
+ updateRecordingAudioPeopleLimit(recordParams.recordingAudioPeopleLimit);
3240
+ updateRecordingAudioParticipantsTimeLimit(
3241
+ recordParams.recordingAudioParticipantsTimeLimit
3242
+ );
3243
+ updateRecordingVideoPausesCount(recordParams.recordingVideoPausesCount);
3244
+ updateRecordingVideoPausesLimit(recordParams.recordingVideoPausesLimit);
3245
+ updateRecordingVideoSupport(recordParams.recordingVideoSupport);
3246
+ updateRecordingVideoPeopleLimit(recordParams.recordingVideoPeopleLimit);
3247
+ updateRecordingVideoParticipantsTimeLimit(
3248
+ recordParams.recordingVideoParticipantsTimeLimit
3249
+ );
3250
+ updateRecordingAllParticipantsSupport(
3251
+ recordParams.recordingAllParticipantsSupport
3252
+ );
3253
+ updateRecordingVideoParticipantsSupport(
3254
+ recordParams.recordingVideoParticipantsSupport
3255
+ );
3256
+ updateRecordingAllParticipantsFullRoomSupport(
3257
+ recordParams.recordingAllParticipantsFullRoomSupport
3258
+ );
3259
+ updateRecordingVideoParticipantsFullRoomSupport(
3260
+ recordParams.recordingVideoParticipantsFullRoomSupport
3261
+ );
3262
+ updateRecordingPreferredOrientation(
3263
+ recordParams.recordingPreferredOrientation
3264
+ );
3265
+ updateRecordingSupportForOtherOrientation(
3266
+ recordParams.recordingSupportForOtherOrientation
3267
+ );
3268
+ updateRecordingMultiFormatsSupport(recordParams.recordingMultiFormatsSupport);
3269
+ };
3270
+ const screenProducerId = ({
3271
+ producerId,
3272
+ screenId,
3273
+ membersReceived,
3274
+ participants,
3275
+ updateScreenId,
3276
+ updateShareScreenStarted,
3277
+ updateDeferScreenReceived
3278
+ }) => {
3279
+ const host = participants.find(
3280
+ (participant) => participant.ScreenID === screenId && participant.ScreenOn === true
3281
+ );
3282
+ if (host && membersReceived) {
3283
+ updateScreenId(producerId);
3284
+ updateShareScreenStarted(true);
3285
+ updateDeferScreenReceived(false);
3286
+ return;
3287
+ }
3288
+ updateScreenId(producerId);
3289
+ updateDeferScreenReceived(true);
3290
+ };
3291
+ const startRecords = async ({
3292
+ roomName,
3293
+ member,
3294
+ socket
3295
+ }) => {
3296
+ socket.emit(
3297
+ "startRecordIng",
3298
+ { roomName, member },
3299
+ ({ success }) => {
3300
+ }
3301
+ );
3302
+ };
3303
+ const stoppedRecording = async ({
3304
+ state,
3305
+ reason,
3306
+ showAlert
3307
+ }) => {
3308
+ try {
3309
+ if (state === "stop") {
3310
+ showAlert?.({
3311
+ message: `The recording has stopped - ${reason}.`,
3312
+ duration: 3e3,
3313
+ type: "danger"
3314
+ });
3315
+ }
3316
+ } catch (error) {
3317
+ console.log("Error in stoppedRecording: ", error);
3318
+ }
3319
+ };
3320
+ const translationRoomConfig = async ({
3321
+ data,
3322
+ updateTranslationConfig,
3323
+ updateTranslationSupported
3324
+ }) => {
3325
+ try {
3326
+ const { config } = data;
3327
+ updateTranslationSupported?.(config.supportTranslation);
3328
+ if (updateTranslationConfig && config.supportTranslation) {
3329
+ updateTranslationConfig(config);
3330
+ }
3331
+ } catch (error) {
3332
+ console.error("Error handling translation:roomConfig:", error);
3333
+ }
3334
+ };
3335
+ const translationConfigUpdated = async ({
3336
+ data,
3337
+ updateTranslationConfig,
3338
+ showAlert
3339
+ }) => {
3340
+ try {
3341
+ updateTranslationConfig?.(data.config);
3342
+ showAlert?.({
3343
+ message: "Translation settings updated by host",
3344
+ type: "info",
3345
+ duration: 2e3
3346
+ });
3347
+ } catch (error) {
3348
+ console.error("Error handling translation:configUpdated:", error);
3349
+ }
3350
+ };
3351
+ const translationLanguageSet = async ({
3352
+ data,
3353
+ updateMySpokenLanguage,
3354
+ updateMySpokenLanguageEnabled,
3355
+ showAlert
3356
+ }) => {
3357
+ try {
3358
+ if (data.success) {
3359
+ updateMySpokenLanguage?.(data.language);
3360
+ updateMySpokenLanguageEnabled?.(data.enabled);
3361
+ } else if (showAlert && data.error) {
3362
+ showAlert({
3363
+ message: data.error,
3364
+ type: "danger",
3365
+ duration: 3e3
3366
+ });
3367
+ }
3368
+ } catch (error) {
3369
+ console.error("Error handling translation:languageSet:", error);
3370
+ }
3371
+ };
3372
+ const translationSubscribed = async ({
3373
+ data,
3374
+ updateListenPreferences,
3375
+ updateTranslationProducerMap,
3376
+ startConsumingTranslation,
3377
+ showAlert
3378
+ }) => {
3379
+ try {
3380
+ const { speakerId, language, channelCreated, producerId, originalProducerId } = data;
3381
+ updateListenPreferences?.((prev) => {
3382
+ const next = new Map(prev);
3383
+ next.set(speakerId, language);
3384
+ return next;
3385
+ });
3386
+ if (producerId && originalProducerId && updateTranslationProducerMap) {
3387
+ updateTranslationProducerMap((prev) => ({
3388
+ ...prev,
3389
+ [originalProducerId]: {
3390
+ ...prev[originalProducerId] || {},
3391
+ [language]: producerId
3392
+ }
3393
+ }));
3394
+ }
3395
+ if (producerId && startConsumingTranslation) {
3396
+ await startConsumingTranslation(producerId, speakerId, language, originalProducerId);
3397
+ }
3398
+ if (showAlert && channelCreated) {
3399
+ showAlert({
3400
+ message: `Translation channel created for ${language}`,
3401
+ type: "success",
3402
+ duration: 2e3
3403
+ });
3404
+ }
3405
+ } catch (error) {
3406
+ console.error("Error handling translation:subscribed:", error);
3407
+ }
3408
+ };
3409
+ const translationUnsubscribed = async ({
3410
+ data,
3411
+ updateListenPreferences,
3412
+ stopConsumingTranslation
3413
+ }) => {
3414
+ try {
3415
+ updateListenPreferences?.((prev) => {
3416
+ const next = new Map(prev);
3417
+ next.delete(data.speakerId);
3418
+ return next;
3419
+ });
3420
+ if (stopConsumingTranslation) {
3421
+ await stopConsumingTranslation(data.speakerId, data.language);
3422
+ }
3423
+ } catch (error) {
3424
+ console.error("Error handling translation:unsubscribed:", error);
3425
+ }
3426
+ };
3427
+ const translationProducerReady = async ({
3428
+ data,
3429
+ updateTranslationProducerMap,
3430
+ pauseOriginalProducer
3431
+ }) => {
3432
+ try {
3433
+ updateTranslationProducerMap?.((prev) => ({
3434
+ ...prev,
3435
+ [data.originalProducerId]: {
3436
+ ...prev[data.originalProducerId] || {},
3437
+ [data.language]: data.producerId
3438
+ }
3439
+ }));
3440
+ if (pauseOriginalProducer) {
3441
+ await pauseOriginalProducer(data.originalProducerId);
3442
+ }
3443
+ } catch (error) {
3444
+ console.error("Error handling translation:producerReady:", error);
3445
+ }
3446
+ };
3447
+ const translationProducerClosed = async ({
3448
+ data,
3449
+ updateTranslationProducerMap,
3450
+ stopConsumingTranslation,
3451
+ resumeOriginalProducer,
3452
+ showAlert
3453
+ }) => {
3454
+ try {
3455
+ if (updateTranslationProducerMap) {
3456
+ updateTranslationProducerMap((prev) => {
3457
+ const next = { ...prev };
3458
+ for (const [originalProducerId, languageMap] of Object.entries(next)) {
3459
+ if (languageMap[data.language] === data.producerId) {
3460
+ delete languageMap[data.language];
3461
+ if (Object.keys(languageMap).length === 0) {
3462
+ delete next[originalProducerId];
3463
+ }
3464
+ }
3465
+ }
3466
+ return next;
3467
+ });
3468
+ }
3469
+ if (stopConsumingTranslation) {
3470
+ await stopConsumingTranslation(data.producerId);
3471
+ }
3472
+ if (resumeOriginalProducer) {
3473
+ await resumeOriginalProducer(data.speakerId);
3474
+ }
3475
+ if (showAlert && data.reason) {
3476
+ showAlert({
3477
+ message: `Translation stopped: ${data.reason}`,
3478
+ type: "info",
3479
+ duration: 2e3
3480
+ });
3481
+ }
3482
+ } catch (error) {
3483
+ console.error("Error handling translation:producerClosed:", error);
3484
+ }
3485
+ };
3486
+ const translationChannelsAvailable = async ({
3487
+ data,
3488
+ updateAvailableTranslationChannels,
3489
+ myDefaultListenLanguage,
3490
+ socket,
3491
+ roomName
3492
+ }) => {
3493
+ try {
3494
+ updateAvailableTranslationChannels?.(data.speakerId, data.languages, data.originalProducerId);
3495
+ if (myDefaultListenLanguage && data.languages.includes(myDefaultListenLanguage) && socket && roomName) {
3496
+ socket.emit("translation:subscribe", {
3497
+ roomName,
3498
+ speakerId: data.speakerId,
3499
+ language: myDefaultListenLanguage,
3500
+ originalProducerId: data.originalProducerId
3501
+ });
3502
+ }
3503
+ } catch (error) {
3504
+ console.error("Error handling translation:channelsAvailable:", error);
3505
+ }
3506
+ };
3507
+ const translationMemberState = async ({
3508
+ data,
3509
+ updateParticipantTranslationState
3510
+ }) => {
3511
+ try {
3512
+ updateParticipantTranslationState?.(data.memberId, data.state);
3513
+ } catch (error) {
3514
+ console.error("Error handling translation:memberState:", error);
3515
+ }
3516
+ };
3517
+ const translationError = async ({
3518
+ data,
3519
+ showAlert
3520
+ }) => {
3521
+ try {
3522
+ if (showAlert) {
3523
+ let message = data.error;
3524
+ switch (data.code) {
3525
+ case "max_channels":
3526
+ if (data.availableChannels && data.availableChannels.length > 0) {
3527
+ message = `Maximum ${data.maxChannels || 5} translation channels reached. Available: ${data.availableChannels.join(", ")}`;
3528
+ } else {
3529
+ message = data.message || "Maximum translation channels reached. Please wait for a slot to open.";
3530
+ }
3531
+ break;
3532
+ case "speaker_not_found":
3533
+ message = "Speaker not found or has left the meeting.";
3534
+ break;
3535
+ case "language_not_allowed":
3536
+ message = "This language is not available for translation in this room.";
3537
+ break;
3538
+ default:
3539
+ message = data.error || "Translation error occurred";
3540
+ }
3541
+ showAlert({
3542
+ message,
3543
+ type: "danger",
3544
+ duration: 5e3
3545
+ });
3546
+ }
3547
+ } catch (err) {
3548
+ console.error("Error handling translation:error:", err);
3549
+ }
3550
+ };
3551
+ const translationTranscript = async ({
3552
+ data,
3553
+ updateTranscripts,
3554
+ onTranscriptReceived,
3555
+ maxTranscripts = 100
3556
+ }) => {
3557
+ try {
3558
+ if (updateTranscripts) {
3559
+ updateTranscripts((prev) => {
3560
+ const next = [...prev, data];
3561
+ return next.length > maxTranscripts ? next.slice(-maxTranscripts) : next;
3562
+ });
3563
+ }
3564
+ onTranscriptReceived?.(data);
3565
+ } catch (err) {
3566
+ console.error("Error handling translation:transcript:", err);
3567
+ }
3568
+ };
3569
+ const translationSpeakerOutputChanged = async ({
3570
+ data,
3571
+ pauseOriginalProducer,
3572
+ resumeOriginalProducer,
3573
+ stopConsumingTranslationForSpeaker,
3574
+ updateSpeakerTranslationState,
3575
+ showAlert,
3576
+ listenerOverride
3577
+ }) => {
3578
+ try {
3579
+ updateSpeakerTranslationState?.(data.speakerId, data.outputLanguage, data.originalProducerId);
3580
+ const listenerWantsOriginal = listenerOverride?.wantOriginal === true;
3581
+ const listenerWantsDifferentLanguage = Boolean(
3582
+ listenerOverride?.preferredLanguage && listenerOverride.preferredLanguage.toLowerCase() !== data.outputLanguage?.toLowerCase()
3583
+ );
3584
+ if (listenerWantsOriginal) {
3585
+ showAlert?.({
3586
+ message: `${data.speakerName} is speaking in ${data.outputLanguage ? getLanguageName(data.outputLanguage) : "translated"} but you're hearing original`,
3587
+ type: "info",
3588
+ duration: 3e3
3589
+ });
3590
+ return;
3591
+ }
3592
+ if (listenerWantsDifferentLanguage) {
3593
+ if (pauseOriginalProducer && data.originalProducerId) {
3594
+ await pauseOriginalProducer(data.originalProducerId, data.speakerId);
3595
+ }
3596
+ return;
3597
+ }
3598
+ if (data.enabled && data.outputLanguage && data.originalProducerId) {
3599
+ if (pauseOriginalProducer) {
3600
+ await pauseOriginalProducer(data.originalProducerId, data.speakerId);
3601
+ }
3602
+ showAlert?.({
3603
+ message: `${data.speakerName} is now speaking in ${getLanguageName(data.outputLanguage)}`,
3604
+ type: "info",
3605
+ duration: 3e3
3606
+ });
3607
+ } else if (!data.enabled || !data.outputLanguage) {
3608
+ if (stopConsumingTranslationForSpeaker) {
3609
+ await stopConsumingTranslationForSpeaker(data.speakerId);
3610
+ }
3611
+ if (resumeOriginalProducer && data.originalProducerId) {
3612
+ await resumeOriginalProducer(data.originalProducerId, data.speakerId);
3613
+ }
3614
+ if (showAlert && !data.enabled) {
3615
+ showAlert({
3616
+ message: `${data.speakerName} returned to original language`,
3617
+ type: "info",
3618
+ duration: 3e3
3619
+ });
3620
+ }
3621
+ }
3622
+ } catch (err) {
3623
+ console.error("Error handling translation:speakerOutputChanged:", err);
3624
+ }
3625
+ };
3626
+ const updateMediaSettings = ({
3627
+ settings,
3628
+ updateAudioSetting,
3629
+ updateVideoSetting,
3630
+ updateScreenshareSetting,
3631
+ updateChatSetting
3632
+ }) => {
3633
+ const [audioSetting, videoSetting, screenshareSetting, chatSetting] = settings;
3634
+ updateAudioSetting(audioSetting);
3635
+ updateVideoSetting(videoSetting);
3636
+ updateScreenshareSetting(screenshareSetting);
3637
+ updateChatSetting(chatSetting);
3638
+ };
3639
+ const updateConsumingDomains = async ({
3640
+ domains,
3641
+ alt_domains,
3642
+ parameters,
3643
+ apiUserName,
3644
+ apiKey,
3645
+ apiToken
3646
+ }) => {
3647
+ let { participants, getDomains: getDomains2, consume_sockets, connectIps } = parameters;
3648
+ consume_sockets = parameters.getUpdatedAllParams().consume_sockets;
3649
+ try {
3650
+ if (participants.length > 0) {
3651
+ if (Object.keys(alt_domains).length > 0) {
3652
+ await getDomains2({
3653
+ domains,
3654
+ alt_domains,
3655
+ apiUserName,
3656
+ apiKey,
3657
+ apiToken,
3658
+ parameters
3659
+ });
3660
+ } else {
3661
+ await connectIps({
3662
+ consume_sockets,
3663
+ remIP: domains,
3664
+ parameters,
3665
+ apiUserName,
3666
+ apiKey,
3667
+ apiToken
3668
+ });
3669
+ }
3670
+ }
3671
+ } catch (error) {
3672
+ console.log("Error in updateConsumingDomains: ", error);
3673
+ }
3674
+ };
3675
+ const updatedCoHost = async ({
3676
+ coHost,
3677
+ coHostResponsibility,
3678
+ showAlert,
3679
+ eventType,
3680
+ islevel,
3681
+ member,
3682
+ youAreCoHost,
3683
+ updateCoHost,
3684
+ updateCoHostResponsibility,
3685
+ updateYouAreCoHost
3686
+ }) => {
3687
+ if (eventType !== "broadcast" && eventType !== "chat") {
3688
+ updateCoHost(coHost);
3689
+ updateCoHostResponsibility(coHostResponsibility);
3690
+ if (member === coHost) {
3691
+ if (!youAreCoHost) {
3692
+ updateYouAreCoHost(true);
3693
+ showAlert?.({
3694
+ message: "You are now a co-host.",
3695
+ type: "success",
3696
+ duration: 3e3
3697
+ });
3698
+ }
3699
+ } else {
3700
+ updateYouAreCoHost(false);
3701
+ }
3702
+ } else if (islevel !== "2") {
3703
+ updateYouAreCoHost(true);
3704
+ }
3705
+ };
3706
+ const userWaiting = async ({
3707
+ name,
3708
+ showAlert,
3709
+ totalReqWait,
3710
+ updateTotalReqWait
3711
+ }) => {
3712
+ showAlert?.({
3713
+ message: `${name} joined the waiting room.`,
3714
+ type: "success",
3715
+ duration: 3e3
3716
+ });
3717
+ updateTotalReqWait(totalReqWait + 1);
3718
+ };
3719
+ const cookies = new joinRoomOnMediaSFU.Cookies();
3720
+ const MAX_ATTEMPTS = 10;
3721
+ const RATE_LIMIT_DURATION = 3 * 60 * 60 * 1e3;
3722
+ const hasConnectedSocketId = (socket) => {
3723
+ if (!socket || typeof socket !== "object") {
3724
+ return false;
3725
+ }
3726
+ const candidate = socket;
3727
+ return typeof candidate.id === "string" && candidate.id.length > 0;
3728
+ };
3729
+ function validateAlphanumeric(str) {
3730
+ if (str.length === 0) return true;
3731
+ const alphanumericRegex = /^[a-zA-Z0-9]+$/;
3732
+ return alphanumericRegex.test(str);
3733
+ }
3734
+ function validateWelcomeInputs({
3735
+ name,
3736
+ secret,
3737
+ eventID,
3738
+ link
3739
+ }) {
3740
+ if (name.length === 0 || secret.length === 0 || eventID.length === 0 || link.length === 0) {
3741
+ return { valid: false, message: "Please fill all the fields." };
3742
+ }
3743
+ if (!validateAlphanumeric(name) || !validateAlphanumeric(secret) || !validateAlphanumeric(eventID) || !link.includes("mediasfu.com") || eventID.toLowerCase().startsWith("d")) {
3744
+ return { valid: false, message: "Please enter valid details." };
3745
+ }
3746
+ if (secret.length != 64 || name.length > 12 || name.length < 2 || eventID.length > 32 || eventID.length < 8 || link.length < 12) {
3747
+ return { valid: false, message: "Please enter valid details." };
3748
+ }
3749
+ return { valid: true };
3750
+ }
3751
+ async function handleWelcomeRequest({
3752
+ apiUserName,
3753
+ apiToken,
3754
+ link,
3755
+ userName,
3756
+ parameters
3757
+ }) {
3758
+ const {
3759
+ showAlert,
3760
+ updateIsLoadingModalVisible,
3761
+ connectSocket,
3762
+ updateSocket,
3763
+ updateValidated,
3764
+ updateApiUserName,
3765
+ updateApiToken,
3766
+ updateLink,
3767
+ updateRoomName,
3768
+ updateMember
3769
+ } = parameters;
3770
+ const TIMEOUT_DURATION = 1e4;
3771
+ let unsuccessfulAttempts = parseInt(cookies.get("unsuccessfulAttempts") || "0");
3772
+ let lastRequestTimestamp = parseInt(cookies.get("lastRequestTimestamp") || "0");
3773
+ if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
3774
+ if (Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {
3775
+ showAlert?.({
3776
+ message: "Too many unsuccessful attempts. Please try again later.",
3777
+ type: "danger",
3778
+ duration: 3e3
3779
+ });
3780
+ cookies.set("lastRequestTimestamp", Date.now().toString());
3781
+ return;
3782
+ } else {
3783
+ unsuccessfulAttempts = 0;
3784
+ cookies.set("unsuccessfulAttempts", unsuccessfulAttempts.toString());
3785
+ cookies.set("lastRequestTimestamp", Date.now().toString());
3786
+ }
3787
+ }
3788
+ try {
3789
+ updateIsLoadingModalVisible(true);
3790
+ const socketPromise = connectSocket({
3791
+ apiUserName,
3792
+ apiKey: "",
3793
+ apiToken,
3794
+ link
3795
+ });
3796
+ const timeoutPromise = new Promise(
3797
+ (_, reject) => setTimeout(() => reject(new Error("Request timed out")), TIMEOUT_DURATION)
3798
+ );
3799
+ const socket = await Promise.race([socketPromise, timeoutPromise]);
3800
+ if (hasConnectedSocketId(socket)) {
3801
+ unsuccessfulAttempts = 0;
3802
+ cookies.set("unsuccessfulAttempts", unsuccessfulAttempts.toString());
3803
+ cookies.set("lastRequestTimestamp", Date.now().toString());
3804
+ updateSocket(socket);
3805
+ updateApiUserName(apiUserName);
3806
+ updateApiToken(apiToken);
3807
+ updateLink(link);
3808
+ updateRoomName(apiUserName);
3809
+ updateMember(userName);
3810
+ updateValidated(true);
3811
+ } else {
3812
+ unsuccessfulAttempts += 1;
3813
+ cookies.set("unsuccessfulAttempts", unsuccessfulAttempts.toString());
3814
+ cookies.set("lastRequestTimestamp", Date.now().toString());
3815
+ updateIsLoadingModalVisible(false);
3816
+ if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
3817
+ showAlert?.({
3818
+ message: "Too many unsuccessful attempts. Please try again later.",
3819
+ type: "danger",
3820
+ duration: 3e3
3821
+ });
3822
+ } else {
3823
+ showAlert?.({
3824
+ message: "Invalid credentials.",
3825
+ type: "danger",
3826
+ duration: 3e3
3827
+ });
3828
+ }
3829
+ }
3830
+ } catch {
3831
+ showAlert?.({
3832
+ message: "Unable to connect. Check your credentials and try again.",
3833
+ type: "danger",
3834
+ duration: 3e3
3835
+ });
3836
+ unsuccessfulAttempts += 1;
3837
+ cookies.set("unsuccessfulAttempts", unsuccessfulAttempts.toString());
3838
+ cookies.set("lastRequestTimestamp", Date.now().toString());
3839
+ updateIsLoadingModalVisible(false);
3840
+ }
3841
+ }
3842
+ exports.QnHDCons = joinRoomOnMediaSFU.QnHDCons;
3843
+ exports.QnHDConsNeu = joinRoomOnMediaSFU.QnHDConsNeu;
3844
+ exports.QnHDConsPort = joinRoomOnMediaSFU.QnHDConsPort;
3845
+ exports.QnHDFrameRate = joinRoomOnMediaSFU.QnHDFrameRate;
3846
+ exports.aParams = joinRoomOnMediaSFU.aParams;
3847
+ exports.captureCanvasStream = joinRoomOnMediaSFU.captureCanvasStream;
3848
+ exports.checkLimitsAndMakeRequest = joinRoomOnMediaSFU.checkLimitsAndMakeRequest;
3849
+ exports.checkLimitsAndMakeRequestWithStorage = joinRoomOnMediaSFU.checkLimitsAndMakeRequestWithStorage;
3850
+ exports.clickAudio = joinRoomOnMediaSFU.clickAudio;
3851
+ exports.clickScreenShare = joinRoomOnMediaSFU.clickScreenShare;
3852
+ exports.fhdCons = joinRoomOnMediaSFU.fhdCons;
3853
+ exports.fhdConsNeu = joinRoomOnMediaSFU.fhdConsNeu;
3854
+ exports.fhdConsPort = joinRoomOnMediaSFU.fhdConsPort;
3855
+ exports.fhdFrameRate = joinRoomOnMediaSFU.fhdFrameRate;
3856
+ exports.hParams = joinRoomOnMediaSFU.hParams;
3857
+ exports.hdCons = joinRoomOnMediaSFU.hdCons;
3858
+ exports.hdConsNeu = joinRoomOnMediaSFU.hdConsNeu;
3859
+ exports.hdConsPort = joinRoomOnMediaSFU.hdConsPort;
3860
+ exports.hdFrameRate = joinRoomOnMediaSFU.hdFrameRate;
3861
+ exports.hostRequestResponse = joinRoomOnMediaSFU.hostRequestResponse;
3862
+ exports.joinRoomOnMediaSFU = joinRoomOnMediaSFU.joinRoomOnMediaSFU;
3863
+ exports.qhdCons = joinRoomOnMediaSFU.qhdCons;
3864
+ exports.qhdConsNeu = joinRoomOnMediaSFU.qhdConsNeu;
3865
+ exports.qhdConsPort = joinRoomOnMediaSFU.qhdConsPort;
3866
+ exports.qhdFrameRate = joinRoomOnMediaSFU.qhdFrameRate;
3867
+ exports.screenFrameRate = joinRoomOnMediaSFU.screenFrameRate;
3868
+ exports.screenParams = joinRoomOnMediaSFU.screenParams;
3869
+ exports.sdCons = joinRoomOnMediaSFU.sdCons;
3870
+ exports.sdConsNeu = joinRoomOnMediaSFU.sdConsNeu;
3871
+ exports.sdConsPort = joinRoomOnMediaSFU.sdConsPort;
3872
+ exports.sdFrameRate = joinRoomOnMediaSFU.sdFrameRate;
3873
+ exports.timeLeftRecording = joinRoomOnMediaSFU.timeLeftRecording;
3874
+ exports.vParams = joinRoomOnMediaSFU.vParams;
3875
+ exports.validateAlphanumeric = validateAlphanumeric$1.validateAlphanumeric;
3876
+ exports.COMMON_LANGUAGE_CODES = COMMON_LANGUAGE_CODES;
3877
+ exports.MediaStream = MediaStream;
3878
+ exports.MediaStreamTrack = MediaStreamTrack;
3879
+ exports.RTCView = RTCView;
3880
+ exports.SUPPORTED_LANGUAGE_CODES = SUPPORTED_LANGUAGE_CODES;
3881
+ exports.SoundPlayer = SoundPlayer;
3882
+ exports.TTS_PROVIDERS = TTS_PROVIDERS;
3883
+ exports.addPanelist = addPanelist;
3884
+ exports.addedAsPanelist = addedAsPanelist;
3885
+ exports.allMembers = allMembers;
3886
+ exports.allMembersRest = allMembersRest;
3887
+ exports.allWaitingRoomMembers = allWaitingRoomMembers;
3888
+ exports.banParticipant = banParticipant;
3889
+ exports.bulkUpdateParticipantPermissions = bulkUpdateParticipantPermissions;
3890
+ exports.clickChat = clickChat;
3891
+ exports.controlMediaHost = controlMediaHost;
3892
+ exports.createLiveSubtitle = createLiveSubtitle;
3893
+ exports.createResponseJoinRoom = createResponseJoinRoom;
3894
+ exports.createRoomOnMediaSFU = createRoomOnMediaSFU;
3895
+ exports.disconnect = disconnect;
3896
+ exports.disconnectUserSelf = disconnectUserSelf;
3897
+ exports.fetchLanguagesViaSocket = fetchLanguagesViaSocket;
3898
+ exports.fetchVoicesViaSocket = fetchVoicesViaSocket;
3899
+ exports.focusPanelists = focusPanelists;
3900
+ exports.formatNumber = formatNumber;
3901
+ exports.generateRandomMessages = generateRandomMessages;
3902
+ exports.generateRandomParticipants = generateRandomParticipants;
3903
+ exports.generateRandomPolls = generateRandomPolls;
3904
+ exports.generateRandomRequestList = generateRandomRequestList;
3905
+ exports.generateRandomWaitingRoomList = generateRandomWaitingRoomList;
3906
+ exports.getAvailableVoices = getAvailableVoices;
3907
+ exports.getCommonLanguages = getCommonLanguages;
3908
+ exports.getDomains = getDomains;
3909
+ exports.getLanguageMetadata = getLanguageMetadata;
3910
+ exports.getLanguageName = getLanguageName;
3911
+ exports.getLanguageNativeName = getLanguageNativeName;
3912
+ exports.getOverlayPosition = getOverlayPosition;
3913
+ exports.getSubtitleForSpeaker = getSubtitleForSpeaker;
3914
+ exports.getSupportedLanguages = getSupportedLanguages;
3915
+ exports.handleCreateRoom = handleCreateRoom;
3916
+ exports.handleJoinRoom = handleJoinRoom;
3917
+ exports.handleWelcomeRequest = handleWelcomeRequest;
3918
+ exports.initialValuesState = initialValuesState;
3919
+ exports.isLanguageSupported = isLanguageSupported;
3920
+ exports.isSubtitleExpired = isSubtitleExpired;
3921
+ exports.launchPanelists = launchPanelists;
3922
+ exports.launchPermissions = launchPermissions;
3923
+ exports.mediaDevices = mediaDevices;
3924
+ exports.meetingEnded = meetingEnded;
3925
+ exports.meetingStillThere = meetingStillThere;
3926
+ exports.meetingTimeRemaining = meetingTimeRemaining;
3927
+ exports.normalizeLanguageCode = normalizeLanguageCode;
3928
+ exports.panelistControlMedia = panelistControlMedia;
3929
+ exports.panelistFocusChanged = panelistFocusChanged;
3930
+ exports.panelistsUpdated = panelistsUpdated;
3931
+ exports.participantRequested = participantRequested;
3932
+ exports.permissionConfigUpdated = permissionConfigUpdated;
3933
+ exports.permissionUpdated = permissionUpdated;
3934
+ exports.personJoined = personJoined;
3935
+ exports.pollUpdated = pollUpdated;
3936
+ exports.producerMediaClosed = producerMediaClosed;
3937
+ exports.producerMediaPaused = producerMediaPaused;
3938
+ exports.producerMediaResumed = producerMediaResumed;
3939
+ exports.pruneExpiredSubtitles = pruneExpiredSubtitles;
3940
+ exports.reInitiateRecording = reInitiateRecording;
3941
+ exports.receiveMessage = receiveMessage;
3942
+ exports.recordingNotice = recordingNotice;
3943
+ exports.registerGlobals = registerGlobals;
3944
+ exports.removePanelist = removePanelist;
3945
+ exports.removedFromPanelists = removedFromPanelists;
3946
+ exports.roomRecordParams = roomRecordParams;
3947
+ exports.screenProducerId = screenProducerId;
3948
+ exports.sleep = sleep;
3949
+ exports.startMeetingProgressTimer = startMeetingProgressTimer;
3950
+ exports.startRecords = startRecords;
3951
+ exports.stoppedRecording = stoppedRecording;
3952
+ exports.translationChannelsAvailable = translationChannelsAvailable;
3953
+ exports.translationConfigUpdated = translationConfigUpdated;
3954
+ exports.translationError = translationError;
3955
+ exports.translationLanguageSet = translationLanguageSet;
3956
+ exports.translationMemberState = translationMemberState;
3957
+ exports.translationProducerClosed = translationProducerClosed;
3958
+ exports.translationProducerReady = translationProducerReady;
3959
+ exports.translationRoomConfig = translationRoomConfig;
3960
+ exports.translationSpeakerOutputChanged = translationSpeakerOutputChanged;
3961
+ exports.translationSubscribed = translationSubscribed;
3962
+ exports.translationTranscript = translationTranscript;
3963
+ exports.translationUnsubscribed = translationUnsubscribed;
3964
+ exports.unfocusPanelists = unfocusPanelists;
3965
+ exports.updateConsumingDomains = updateConsumingDomains;
3966
+ exports.updateLiveSubtitlesFromTranscript = updateLiveSubtitlesFromTranscript;
3967
+ exports.updateMediaSettings = updateMediaSettings;
3968
+ exports.updatePanelists = updatePanelists;
3969
+ exports.updateParticipantPermission = updateParticipantPermission;
3970
+ exports.updatePermissionConfig = updatePermissionConfig;
3971
+ exports.updatedCoHost = updatedCoHost;
3972
+ exports.userWaiting = userWaiting;
3973
+ exports.validateWelcomeAlphanumeric = validateAlphanumeric;
3974
+ exports.validateWelcomeInputs = validateWelcomeInputs;
3975
+ //# sourceMappingURL=index.cjs.map