mediasfu-shared 1.0.1 → 1.0.2
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.
- package/LICENSE +21 -21
- package/README.md +103 -222
- package/dist/index.cjs +7500 -2163
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4203 -273
- package/dist/index.js +7521 -2184
- package/dist/index.js.map +1 -1
- package/package.json +85 -78
- package/src/ProducerClient/producerClientEmits/joinRoomClient.ts +57 -0
- package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +401 -0
- package/src/consumers/addVideosGrid.ts +3 -2
- package/src/consumers/changeVids.ts +111 -41
- package/src/consumers/checkPermission.ts +35 -1
- package/src/consumers/connectRecvTransport.ts +42 -1
- package/src/consumers/consumerResume.ts +2 -2
- package/src/consumers/dispStreams.ts +83 -37
- package/src/consumers/frameworkConsumerContract.ts +6 -0
- package/src/consumers/generatePageContent.ts +24 -10
- package/src/consumers/getPipedProducersAlt.ts +112 -16
- package/src/consumers/gridLayout/addVideosGrid.engine.ts +42 -0
- package/src/consumers/gridLayout/prepopulateUserMedia.engine.ts +444 -0
- package/src/consumers/mixStreams.ts +45 -14
- package/src/consumers/onScreenChanges.ts +25 -10
- package/src/consumers/prepopulateUserMedia.ts +3 -2
- package/src/consumers/processConsumerTransports.ts +68 -23
- package/src/consumers/processConsumerTransportsAudio.ts +53 -16
- package/src/consumers/reUpdateInter.ts +61 -21
- package/src/consumers/readjust.ts +30 -14
- package/src/consumers/reorderStreams.ts +76 -42
- package/src/consumers/resumePauseAudioStreams.ts +66 -17
- package/src/consumers/resumePauseStreams.ts +53 -10
- package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +8 -0
- package/src/consumers/socketReceiveMethods/newPipeProducer.ts +114 -0
- package/src/consumers/socketReceiveMethods/producerClosed.ts +13 -0
- package/src/consumers/streamSuccessScreen.ts +2 -2
- package/src/consumers/streamSuccessVideo.ts +5 -0
- package/src/consumers/translationConsumerSwitch.ts +299 -0
- package/src/index.ts +85 -1
- package/src/methods/coHostMethods/modifyCoHostSettings.ts +9 -9
- package/src/methods/displaySettings/modifyDisplaySettings.ts +5 -0
- package/src/methods/index.ts +66 -0
- package/src/methods/message/sendMessage.ts +12 -29
- package/src/methods/panelists/focusPanelists.ts +83 -0
- package/src/methods/panelists/index.ts +3 -0
- package/src/methods/panelists/launchPanelists.ts +13 -0
- package/src/methods/panelists/updatePanelists.ts +135 -0
- package/src/methods/permissions/index.ts +3 -0
- package/src/methods/permissions/launchPermissions.ts +13 -0
- package/src/methods/permissions/updateParticipantPermission.ts +127 -0
- package/src/methods/permissions/updatePermissionConfig.ts +52 -0
- package/src/methods/polls/pollUpdated.ts +88 -0
- package/src/methods/recording/confirmRecording.ts +15 -12
- package/src/methods/recording/recordResumeTimer.ts +2 -2
- package/src/methods/recording/recordStartTimer.ts +2 -2
- package/src/methods/recording/timeLeftRecording.ts +25 -0
- package/src/methods/requests/hostRequestResponse.ts +153 -0
- package/src/methods/settings/modifySettings.ts +17 -17
- package/src/methods/socketReceive/allMembers.ts +450 -0
- package/src/methods/socketReceive/allMembersRest.ts +480 -0
- package/src/methods/socketReceive/allWaitingRoomMembers.ts +35 -0
- package/src/methods/socketReceive/banParticipant.ts +73 -0
- package/src/methods/socketReceive/controlMediaHost.ts +280 -0
- package/src/methods/socketReceive/disconnect.ts +40 -0
- package/src/methods/socketReceive/disconnectUserSelf.ts +56 -0
- package/src/methods/socketReceive/getDomains.ts +112 -0
- package/src/methods/socketReceive/meetingEnded.ts +49 -0
- package/src/methods/socketReceive/meetingStillThere.ts +26 -0
- package/src/methods/socketReceive/panelistReceiveMethods.ts +195 -0
- package/src/methods/socketReceive/participantRequested.ts +48 -0
- package/src/methods/socketReceive/permissionReceiveMethods.ts +59 -0
- package/src/methods/socketReceive/personJoined.ts +35 -0
- package/src/methods/socketReceive/producerMediaClosed.ts +223 -0
- package/src/methods/socketReceive/producerMediaPaused.ts +267 -0
- package/src/methods/socketReceive/producerMediaResumed.ts +157 -0
- package/src/methods/socketReceive/reInitiateRecording.ts +53 -0
- package/src/methods/socketReceive/receiveMessage.ts +117 -0
- package/src/methods/socketReceive/recordingNotice.ts +286 -0
- package/src/methods/socketReceive/roomRecordParams.ts +122 -0
- package/src/methods/socketReceive/screenProducerId.ts +61 -0
- package/src/methods/socketReceive/startRecords.ts +46 -0
- package/src/methods/socketReceive/stoppedRecording.ts +44 -0
- package/src/methods/socketReceive/translationReceiveMethods.ts +581 -0
- package/src/methods/socketReceive/updateConsumingDomains.ts +128 -0
- package/src/methods/socketReceive/updateMediaSettings.ts +45 -0
- package/src/methods/socketReceive/updatedCoHost.ts +75 -0
- package/src/methods/socketReceive/userWaiting.ts +45 -0
- package/src/methods/stream/clickAudio.ts +380 -0
- package/src/methods/stream/clickChat.ts +36 -0
- package/src/methods/stream/clickScreenShare.ts +173 -0
- package/src/methods/stream/clickVideo.ts +22 -5
- package/src/methods/stream/index.ts +1 -0
- package/src/methods/utils/SoundPlayer.ts +31 -0
- package/src/methods/utils/checkLimitsAndMakeRequest.ts +156 -2
- package/src/methods/utils/createResponseJoinRoom.ts +47 -0
- package/src/methods/utils/createRoomOnMediaSFU.ts +160 -0
- package/src/methods/utils/formatNumber.ts +42 -0
- package/src/methods/utils/generateRandomMessages.ts +70 -0
- package/src/methods/utils/generateRandomParticipants.ts +100 -0
- package/src/methods/utils/generateRandomPolls.ts +43 -0
- package/src/methods/utils/generateRandomRequestList.ts +51 -0
- package/src/methods/utils/generateRandomWaitingRoomList.ts +17 -0
- package/src/methods/utils/getModalPosition.ts +23 -0
- package/src/methods/utils/getOverlayPosition.ts +37 -0
- package/src/methods/utils/initialValuesState.ts +405 -0
- package/src/methods/utils/joinRoomOnMediaSFU.ts +124 -0
- package/src/methods/utils/liveSubtitle.ts +107 -0
- package/src/methods/utils/meetingTimeRemaining.ts +33 -0
- package/src/methods/utils/meetingTimer/startMeetingProgressTimer.ts +72 -0
- package/src/methods/utils/producer/aParams.ts +10 -0
- package/src/methods/utils/producer/hParams.ts +26 -0
- package/src/methods/utils/producer/screenParams.ts +13 -0
- package/src/methods/utils/producer/vParams.ts +26 -0
- package/src/methods/utils/producer/videoCaptureConstraints.ts +65 -0
- package/src/methods/utils/resolveMediaSFURoomApi.ts +16 -0
- package/src/methods/utils/sleep.ts +24 -0
- package/src/methods/utils/translationLanguages.ts +308 -0
- package/src/methods/utils/webrtc.ts +44 -0
- package/src/methods/welcome/handleWelcomeRequest.ts +11 -2
- package/src/methods/welcome/index.ts +5 -1
- package/src/methods/whiteboard/captureCanvasStream.ts +128 -0
- package/src/producers/producerEmits/joinConRoom.ts +2 -2
- package/src/producers/producerEmits/joinLocalRoom.ts +240 -0
- package/src/producers/producerEmits/joinRoom.ts +129 -0
- package/src/types/shared-base-types.ts +14 -3
- package/src/types/types.ts +255 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/consumers/addVideosGrid.ts","../src/consumers/consumerResume.ts","../src/consumers/changeVids.ts","../src/consumers/checkScreenShare.ts","../src/consumers/closeAndResize.ts","../src/consumers/compareActiveNames.ts","../src/consumers/compareScreenStates.ts","../src/sockets/SocketManager.ts","../src/consumers/signalNewConsumerTransport.ts","../src/consumers/socketReceiveMethods/newPipeProducer.ts","../src/consumers/socketReceiveMethods/producerClosed.ts","../src/methods/utils/validateAlphanumeric.ts","../src/producers/producerEmits/joinConRoom.ts","../src/consumers/socketReceiveMethods/joinConsumeRoom.ts","../src/consumers/connectIps.ts","../src/consumers/connectLocalIps.ts","../src/consumers/connectRecvTransport.ts","../src/consumers/connectSendTransport.ts","../src/consumers/connectSendTransportAudio.ts","../src/consumers/connectSendTransportScreen.ts","../src/consumers/connectSendTransportVideo.ts","../src/consumers/createSendTransport.ts","../src/consumers/disconnectSendTransportAudio.ts","../src/consumers/disconnectSendTransportScreen.ts","../src/consumers/disconnectSendTransportVideo.ts","../src/consumers/dispStreams.ts","../src/consumers/generatePageContent.ts","../src/consumers/getVideos.ts","../src/consumers/mixStreams.ts","../src/consumers/onScreenChanges.ts","../src/consumers/prepopulateUserMedia.ts","../src/consumers/processConsumerTransports.ts","../src/consumers/processConsumerTransportsAudio.ts","../src/consumers/readjust.ts","../src/consumers/receiveAllPipedTransports.ts","../src/consumers/reorderStreams.ts","../src/consumers/rePort.ts","../src/consumers/requestScreenShare.ts","../src/consumers/resumePauseAudioStreams.ts","../src/consumers/resumePauseStreams.ts","../src/consumers/reUpdateInter.ts","../src/consumers/startShareScreen.ts","../src/consumers/stopShareScreen.ts","../src/consumers/streamSuccessAudio.ts","../src/consumers/streamSuccessAudioSwitch.ts","../src/consumers/streamSuccessScreen.ts","../src/consumers/streamSuccessVideo.ts","../src/consumers/switchUserAudio.ts","../src/methods/stream/clickVideo.ts","../src/consumers/switchUserVideo.ts","../src/consumers/switchUserVideoAlt.ts","../src/consumers/trigger.ts","../src/methods/breakoutRooms/breakoutRoomUpdated.ts","../src/methods/settings/modifySettings.ts","../node_modules/universal-cookie/esm/index.mjs","../src/methods/utils/checkLimitsAndMakeRequest.ts","../src/ProducerClient/producerClientEmits/createDeviceClient.ts","../src/consumers/autoAdjust.ts","../src/consumers/calculateRowsAndColumns.ts","../src/consumers/checkGrid.ts","../src/consumers/checkPermission.ts","../src/consumers/controlMedia.ts","../src/consumers/getEstimate.ts","../src/consumers/getPipedProducersAlt.ts","../src/consumers/getProducersPiped.ts","../src/consumers/receiveRoomMessages.ts","../src/consumers/resumeSendTransportAudio.ts","../src/consumers/updateMiniCardsGrid.ts","../src/consumers/updateParticipantAudioDecibels.ts","../src/methods/background/launchBackground.ts","../src/methods/breakoutRooms/handleStartBreakout.ts","../src/methods/breakoutRooms/handleStopBreakout.ts","../src/methods/breakoutRooms/launchBreakoutRooms.ts","../src/methods/coHost/launchCoHost.ts","../src/methods/coHostMethods/modifyCoHostSettings.ts","../src/methods/displaySettings/launchDisplaySettings.ts","../src/methods/displaySettings/modifyDisplaySettings.ts","../src/methods/exit/confirmExit.ts","../src/methods/exit/launchConfirmExit.ts","../src/methods/mediaSettings/launchMediaSettings.ts","../src/methods/menu/launchMenuModal.ts","../src/methods/message/launchMessages.ts","../src/methods/message/sendMessage.ts","../src/methods/participants/launchParticipants.ts","../src/methods/participants/messageParticipants.ts","../src/methods/participants/muteParticipants.ts","../src/methods/participants/removeParticipants.ts","../src/methods/polls/handleCreatePoll.ts","../src/methods/polls/handleEndPoll.ts","../src/methods/polls/handleVotePoll.ts","../src/methods/polls/launchPoll.ts","../src/methods/prejoin/handleCreateRoom.ts","../src/methods/prejoin/handleJoinRoom.ts","../src/methods/recording/checkPauseState.ts","../src/methods/recording/checkResumeState.ts","../src/methods/recording/confirmRecording.ts","../src/methods/recording/launchRecording.ts","../src/methods/recording/recordPauseTimer.ts","../src/methods/recording/recordUpdateTimer.ts","../src/methods/recording/recordResumeTimer.ts","../src/methods/recording/recordStartTimer.ts","../src/methods/recording/startRecording.ts","../src/methods/recording/stopRecording.ts","../src/methods/recording/updateRecording.ts","../src/methods/requests/launchRequests.ts","../src/methods/requests/respondToRequests.ts","../src/methods/settings/launchSettings.ts","../src/methods/stream/switchAudio.ts","../src/methods/stream/switchVideo.ts","../src/methods/stream/switchVideoAlt.ts","../src/methods/waiting/launchWaiting.ts","../src/methods/waiting/respondToWaiting.ts","../src/methods/welcome/handleWelcomeRequest.ts","../src/methods/whiteboard/handleStartWhiteboard.ts","../src/methods/whiteboard/handleStopWhiteboard.ts","../src/methods/whiteboard/launchConfigureWhiteboard.ts"],"sourcesContent":["// Stub export for addVideosGrid\n// This is a React component in the original and not needed for the shared package\n\nexport interface AddVideosGridParameters {\n [key: string]: any;\n}\n\nexport interface AddVideosGridOptions {\n parameters: AddVideosGridParameters;\n [key: string]: any; // Accept any additional properties\n}\n\nexport type AddVideosGridType = (options: AddVideosGridOptions) => Promise<void>;\n\nexport const addVideosGrid: AddVideosGridType = async () => {\n // Stub implementation - actual logic handled in framework-specific packages\n console.warn('addVideosGrid called on shared package - should be implemented in framework package');\n};\n","// Stub export for consumerResume\n// This is a React component in the original and not needed for the shared package\n\nimport { Socket } from 'socket.io-client';\n\nexport interface ConsumerResumeParameters {\n [key: string]: any;\n}\n\nexport interface ConsumerResumeOptions {\n track: MediaStreamTrack;\n kind: string;\n remoteProducerId: string;\n params: any;\n parameters: ConsumerResumeParameters;\n nsock: Socket;\n consumer?: any; // mediasoup Consumer\n}\n\nexport type ConsumerResumeType = (options: ConsumerResumeOptions) => Promise<void>;\n\nexport const consumerResume: ConsumerResumeType = async () => {\n // Stub implementation - actual logic handled in framework-specific packages\n console.warn('consumerResume called on shared package - should be implemented in framework package');\n};\n","\n \nimport { Stream, Participant, DispStreamsType, DispStreamsParameters, AudioDecibels, MixStreamsType, BreakoutParticipant, EventType } from \"../types/types\";\n\nexport interface ChangeVidsParameters extends DispStreamsParameters {\n\n allVideoStreams: (Stream | Participant)[];\n p_activeNames: string[];\n activeNames: string[];\n dispActiveNames: string[];\n shareScreenStarted: boolean;\n shared: boolean;\n newLimitedStreams: (Stream | Participant)[];\n non_alVideoStreams: Participant[];\n ref_participants: Participant[];\n participants: Participant[];\n eventType: EventType;\n islevel: string;\n member: string;\n sortAudioLoudness: boolean;\n audioDecibels: AudioDecibels[];\n mixed_alVideoStreams: (Stream | Participant)[];\n non_alVideoStreams_muted: Participant[];\n remoteProducerId?: string;\n localStreamVideo: MediaStream | null;\n oldAllStreams: (Stream | Participant)[];\n screenPageLimit: number;\n meetingDisplayType: string;\n meetingVideoOptimized: boolean;\n recordingVideoOptimized: boolean;\n recordingDisplayType: \"video\" | \"media\" | \"all\";\n paginatedStreams: (Stream | Participant)[][];\n itemPageLimit: number;\n doPaginate: boolean;\n prevDoPaginate: boolean;\n currentUserPage: number;\n breakoutRooms: BreakoutParticipant[][];\n hostNewRoom: number;\n breakOutRoomStarted: boolean;\n breakOutRoomEnded: boolean;\n virtualStream: MediaStream | null;\n mainRoomsLength: number;\n memberRoom: number;\n updateP_activeNames: (names: string[]) => void;\n updateActiveNames: (names: string[]) => void;\n updateDispActiveNames: (names: string[]) => void;\n updateNewLimitedStreams: (streams: (Stream | Participant)[]) => void;\n updateNon_alVideoStreams: (participants: Participant[]) => void;\n updateRef_participants: (participants: Participant[]) => void;\n updateSortAudioLoudness: (sort: boolean) => void;\n updateMixed_alVideoStreams: (streams: (Stream | Participant)[]) => void;\n updateNon_alVideoStreams_muted: (participants: Participant[]) => void;\n updatePaginatedStreams: (streams: (Stream | Participant)[][]) => void;\n updateDoPaginate: (paginate: boolean) => void;\n updatePrevDoPaginate: (paginate: boolean) => void;\n updateCurrentUserPage: (page: number) => void;\n updateNumberPages: (pages: number) => void;\n updateMainRoomsLength: (length: number) => void;\n updateMemberRoom: (room: number) => void;\n\n // mediasfu functions\n mixStreams: MixStreamsType;\n dispStreams: DispStreamsType;\n getUpdatedAllParams: () => ChangeVidsParameters;\n [key: string]: any;\n\n}\n\nexport interface ChangeVidsOptions {\n screenChanged?: boolean;\n parameters: ChangeVidsParameters;\n}\n\n// Export the type definition for the function\nexport type ChangeVidsType = (options: ChangeVidsOptions) => Promise<void>;\n\n/**\n * Asynchronously changes the video streams based on the provided options.\n *\n * @function\n * @param {ChangeVidsOptions} options - The options for changing video streams.\n * @param {boolean} [options.screenChanged=false] - Indicates if the screen has changed.\n * @param {ChangeVidsParameters} options.parameters - The parameters for changing video streams.\n * @returns {Promise<void>} A promise that resolves when the video streams have been changed.\n *\n * @typedef {Object} ChangeVidsOptions\n * @property {Function} getUpdatedAllParams - Function to get updated parameters.\n * @property {Array} allVideoStreams - Array of all video streams.\n * @property {Array} p_activeNames - Array of active participant names.\n * @property {Array} activeNames - Array of active names.\n * @property {Array} dispActiveNames - Array of displayed active names.\n * @property {boolean} shareScreenStarted - Indicates if screen sharing has started.\n * @property {boolean} shared - Indicates if the screen is shared.\n * @property {Array} newLimitedStreams - Array of new limited streams.\n * @property {Array} non_alVideoStreams - Array of non-al video streams.\n * @property {Array} ref_participants - Array of reference participants.\n * @property {Array} participants - Array of participants.\n * @property {string} eventType - Type of the event.\n * @property {string} islevel - Level of the participant.\n * @property {string} member - Name of the member.\n * @property {boolean} sortAudioLoudness - Indicates if audio loudness should be sorted.\n * @property {Array} audioDecibels - Array of audio decibels.\n * @property {Array} mixed_alVideoStreams - Array of mixed al video streams.\n * @property {Array} non_alVideoStreams_muted - Array of muted non-al video streams.\n * @property {string} remoteProducerId - ID of the remote producer.\n * @property {Object} localStreamVideo - Local stream video object.\n * @property {Array} oldAllStreams - Array of old all streams.\n * @property {number} screenPageLimit - Limit of streams per screen page.\n * @property {string} meetingDisplayType - Type of meeting display.\n * @property {boolean} meetingVideoOptimized - Indicates if meeting video is optimized.\n * @property {boolean} recordingVideoOptimized - Indicates if recording video is optimized.\n * @property {string} recordingDisplayType - Type of recording display.\n * @property {Array} paginatedStreams - Array of paginated streams.\n * @property {number} itemPageLimit - Limit of items per page.\n * @property {boolean} doPaginate - Indicates if pagination should be done.\n * @property {boolean} prevDoPaginate - Indicates if pagination was previously done.\n * @property {number} currentUserPage - Current user page number.\n * @property {Array} breakoutRooms - Array of breakout rooms.\n * @property {number} hostNewRoom - Index of the new room for the host.\n * @property {boolean} breakOutRoomStarted - Indicates if breakout room has started.\n * @property {boolean} breakOutRoomEnded - Indicates if breakout room has ended.\n * @property {Object} virtualStream - Virtual stream object.\n * @property {number} mainRoomsLength - Length of main rooms.\n * @property {number} memberRoom - Room of the member.\n * @property {Function} updateP_activeNames - Function to update active participant names.\n * @property {Function} updateActiveNames - Function to update active names.\n * @property {Function} updateDispActiveNames - Function to update displayed active names.\n * @property {Function} updateNewLimitedStreams - Function to update new limited streams.\n * @property {Function} updateNon_alVideoStreams - Function to update non-al video streams.\n * @property {Function} updateRef_participants - Function to update reference participants.\n * @property {Function} updateSortAudioLoudness - Function to update audio loudness sorting.\n * @property {Function} updateMixed_alVideoStreams - Function to update mixed al video streams.\n * @property {Function} updateNon_alVideoStreams_muted - Function to update muted non-al video streams.\n * @property {Function} updatePaginatedStreams - Function to update paginated streams.\n * @property {Function} updateDoPaginate - Function to update pagination status.\n * @property {Function} updatePrevDoPaginate - Function to update previous pagination status.\n * @property {Function} updateCurrentUserPage - Function to update current user page.\n * @property {Function} updateNumberPages - Function to update number of pages.\n * @property {Function} updateMainRoomsLength - Function to update main rooms length.\n * @property {Function} updateMemberRoom - Function to update member room.\n * @property {Function} mixStreams - Function to mix streams.\n * @property {Function} dispStreams - Function to display streams.\n * \n * @example\n * const options = {\n * screenChanged: false,\n * parameters: {\n * getUpdatedAllParams: () => updatedParameters,\n * allVideoStreams: allStreams,\n * p_activeNames: activeNames,\n * activeNames: activeNames,\n * dispActiveNames: displayedActiveNames,\n * shareScreenStarted: false,\n * shared: false,\n * newLimitedStreams: limitedStreams,\n * non_alVideoStreams: nonAlStreams,\n * ref_participants: referenceParticipants,\n * participants: participants,\n * eventType: \"conference\",\n * islevel: \"2\",\n * member: \"John Doe\",\n * sortAudioLoudness: true,\n * audioDecibels: audioLevels,\n * mixed_alVideoStreams: mixedStreams,\n * non_alVideoStreams_muted: mutedNonAlStreams,\n * remoteProducerId: \"12345\",\n * localStreamVideo: localStream,\n * oldAllStreams: oldStreams,\n * screenPageLimit: 10,\n * meetingDisplayType: \"video\",\n * meetingVideoOptimized: true,\n * recordingVideoOptimized: false,\n * recordingDisplayType: \"video\",\n * paginatedStreams: paginatedStreams,\n * itemPageLimit: 10,\n * doPaginate: true,\n * prevDoPaginate: false,\n * currentUserPage: 1,\n * breakoutRooms: breakoutRooms,\n * hostNewRoom: 0,\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: false,\n * virtualStream: virtualStream,\n * mainRoomsLength: 2,\n * memberRoom: 0,\n * updateP_activeNames: (names) => updateActiveNames(names),\n * updateActiveNames: (names) => updateActiveNames(names),\n * updateDispActiveNames: (names) => updateDispActiveNames(names),\n * updateNewLimitedStreams: (streams) => updateNewLimitedStreams(streams),\n * updateNon_alVideoStreams: (participants) => updateNon_alVideoStreams(participants),\n * updateRef_participants: (participants) => updateRef_participants(participants),\n * updateSortAudioLoudness: (sort) => updateSortAudioLoudness(sort),\n * updateMixed_alVideoStreams: (streams) => updateMixed_alVideoStreams(streams),\n * updateNon_alVideoStreams_muted: (participants) => updateNon_alVideoStreams_muted(participants),\n * updatePaginatedStreams: (streams) => updatePaginatedStreams(streams),\n * updateDoPaginate: (paginate) => updateDoPaginate(paginate),\n * updatePrevDoPaginate: (paginate) => updatePrevDoPaginate(paginate),\n * updateCurrentUserPage: (page) => updateCurrentUserPage(page),\n * updateNumberPages: (pages) => updateNumberPages(pages),\n * updateMainRoomsLength: (length) => updateMainRoomsLength(length),\n * updateMemberRoom: (room) => updateMemberRoom(room),\n * mixStreams: mixStreams,\n * dispStreams: dispStreams,\n * },\n * };\n * \n * changeVids(options)\n * .then(() => {\n * console.log('Video streams changed successfully');\n * });\n */\n\nexport const changeVids = async ({ screenChanged = false, parameters }: ChangeVidsOptions): Promise<void> => {\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n allVideoStreams,\n p_activeNames,\n activeNames,\n dispActiveNames,\n shareScreenStarted,\n shared,\n newLimitedStreams,\n non_alVideoStreams,\n ref_participants,\n participants,\n eventType,\n islevel,\n member,\n sortAudioLoudness,\n audioDecibels,\n mixed_alVideoStreams,\n non_alVideoStreams_muted,\n remoteProducerId,\n localStreamVideo,\n oldAllStreams,\n screenPageLimit,\n meetingDisplayType,\n meetingVideoOptimized,\n recordingVideoOptimized,\n recordingDisplayType,\n paginatedStreams,\n itemPageLimit,\n doPaginate,\n prevDoPaginate,\n currentUserPage,\n breakoutRooms,\n hostNewRoom,\n breakOutRoomStarted,\n breakOutRoomEnded,\n virtualStream,\n mainRoomsLength,\n memberRoom,\n updateP_activeNames,\n updateActiveNames,\n updateDispActiveNames,\n updateNewLimitedStreams,\n updateNon_alVideoStreams,\n updateRef_participants,\n updateSortAudioLoudness,\n updateMixed_alVideoStreams,\n updateNon_alVideoStreams_muted,\n updatePaginatedStreams,\n updateDoPaginate,\n updatePrevDoPaginate,\n updateCurrentUserPage,\n updateNumberPages,\n updateMainRoomsLength,\n updateMemberRoom,\n mixStreams,\n dispStreams,\n } = parameters;\n\n try {\n let alVideoStreams = [...allVideoStreams];\n p_activeNames = [...activeNames];\n\n let streame;\n\n if (shareScreenStarted || shared) {\n alVideoStreams = [...newLimitedStreams];\n activeNames = [];\n }\n\n activeNames = [];\n dispActiveNames = [];\n ref_participants = participants;\n\n let temp = alVideoStreams;\n\n await Promise.all(\n temp.map(async (stream) => {\n let participant = ref_participants.find(\n (obj) => obj.videoID === stream.producerId\n );\n if (!participant && stream.producerId !== \"youyou\" && stream.producerId !== \"youyouyou\") {\n alVideoStreams = alVideoStreams.filter(\n (obj) => obj.producerId !== stream.producerId\n );\n }\n })\n );\n\n if (eventType === \"broadcast\" || eventType === \"chat\") {\n sortAudioLoudness = false;\n }\n\n if (shareScreenStarted || shared) {\n non_alVideoStreams = [];\n non_alVideoStreams_muted = [];\n mixed_alVideoStreams = [];\n } else {\n if (alVideoStreams.length > screenPageLimit) {\n alVideoStreams = alVideoStreams.filter(\n (obj) => obj.producerId !== \"youyou\" && obj.producerId !== \"youyouyou\"\n );\n\n ref_participants = ref_participants.sort((a, b) => (a.muted ?? false) > (b.muted ?? false) ? 1 : -1\n );\n\n let temp: (Stream | Participant)[] = [];\n await Promise.all(\n ref_participants.map((participant) => {\n let stream = alVideoStreams.find(\n (obj) => obj.producerId === participant.videoID\n );\n if (stream) {\n temp.push(stream);\n }\n })\n );\n\n alVideoStreams = temp;\n\n let youyou = allVideoStreams.find(\n (obj) => obj.producerId === \"youyou\"\n );\n if (!youyou) {\n let youyouyou = allVideoStreams.find(\n (obj) => obj.producerId === \"youyouyou\"\n );\n alVideoStreams.unshift(youyouyou!);\n } else {\n alVideoStreams.unshift(youyou!);\n }\n }\n\n const admin = participants.filter(\n (participant) => participant.islevel === \"2\"\n );\n let adminName = \"\";\n if (admin.length > 0) {\n adminName = admin[0].name || \"\";\n }\n\n non_alVideoStreams = [];\n\n await Promise.all(\n ref_participants.map(async (participant) => {\n let stream = alVideoStreams.find(\n (obj) => obj.producerId === participant.videoID\n );\n if (eventType !== \"chat\" && eventType !== \"conference\") {\n if (!stream && participant.name !== member && !participant.muted && participant.name !== adminName) {\n non_alVideoStreams.push(participant);\n }\n } else {\n if (!stream && participant.name !== member && !participant.muted) {\n non_alVideoStreams.push(participant);\n }\n }\n })\n );\n\n if (sortAudioLoudness) {\n non_alVideoStreams.sort((a, b) => {\n const avgLoudnessA =\n audioDecibels.find((obj) => obj.name === a.name)?.averageLoudness || 127;\n const avgLoudnessB =\n audioDecibels.find((obj) => obj.name === b.name)?.averageLoudness || 127;\n return avgLoudnessB - avgLoudnessA;\n });\n\n if (\n !(meetingDisplayType === \"video\" && meetingVideoOptimized) ||\n !(recordingVideoOptimized && recordingDisplayType === \"video\")\n ) {\n mixed_alVideoStreams = await mixStreams({\n alVideoStreams,\n non_alVideoStreams,\n ref_participants\n });\n }\n }\n\n non_alVideoStreams_muted = [];\n await Promise.all(\n ref_participants.map(async (participant) => {\n let stream = alVideoStreams.find(\n (obj) => obj.producerId === participant.videoID\n );\n if (eventType !== \"chat\" && eventType !== \"conference\") {\n if (!stream && participant.name !== member && participant.muted && participant.name !== adminName) {\n non_alVideoStreams_muted.push(participant);\n }\n } else {\n if (!stream && participant.name !== member && participant.muted) {\n non_alVideoStreams_muted.push(participant);\n }\n }\n })\n );\n }\n\n if (eventType === \"conference\" && islevel !== \"2\") {\n let host = participants.find((obj) => obj.islevel === \"2\");\n if (host) {\n remoteProducerId = host.videoID!;\n if (islevel === \"2\") {\n host.stream = virtualStream || localStreamVideo;\n } else {\n let hostVideo = alVideoStreams.find(\n (obj) => obj.producerId === remoteProducerId\n );\n if (!hostVideo) {\n streame = oldAllStreams.find(\n (streame) => streame.producerId === remoteProducerId\n );\n if (streame) {\n alVideoStreams = alVideoStreams.filter(\n (obj) => obj.producerId !== host.videoID\n );\n non_alVideoStreams = non_alVideoStreams.filter(\n (obj) => obj.name !== host.name\n );\n non_alVideoStreams_muted = non_alVideoStreams_muted.filter(\n (obj) => obj.name !== host.name\n );\n if (sortAudioLoudness) {\n mixed_alVideoStreams = mixed_alVideoStreams.filter(\n (obj) => obj.name !== host.name\n );\n non_alVideoStreams_muted = non_alVideoStreams_muted.filter(\n (obj) => obj.name !== host.name\n );\n if (meetingDisplayType == \"video\" && meetingVideoOptimized) {\n alVideoStreams.unshift(streame);\n } else {\n mixed_alVideoStreams.unshift(streame);\n }\n } else {\n alVideoStreams.unshift(streame);\n }\n } else {\n await Promise.all(\n ref_participants.map(async (participant) => {\n let stream = alVideoStreams.find(\n (obj) =>\n obj.producerId == participant.videoID &&\n participant.name == host.name\n );\n if (stream) {\n if (sortAudioLoudness) {\n mixed_alVideoStreams = mixed_alVideoStreams.filter(\n (obj) => obj.name !== host.name\n );\n non_alVideoStreams_muted =\n non_alVideoStreams_muted.filter(\n (obj) => obj.name !== host.name\n );\n mixed_alVideoStreams.unshift(participant);\n } else {\n non_alVideoStreams = non_alVideoStreams.filter(\n (obj) => obj.name !== host.name\n );\n non_alVideoStreams.unshift(participant);\n return;\n }\n }\n })\n );\n }\n }\n }\n }\n }\n\n let allStreamsPaged: (Stream | Participant)[] = [];\n if (sortAudioLoudness) {\n if (meetingDisplayType === \"video\") {\n if (meetingVideoOptimized) {\n allStreamsPaged = [...alVideoStreams];\n } else {\n allStreamsPaged = [...mixed_alVideoStreams];\n }\n } else if (meetingDisplayType === \"media\") {\n allStreamsPaged = [...mixed_alVideoStreams];\n } else if (meetingDisplayType === \"all\") {\n allStreamsPaged = [...mixed_alVideoStreams, ...non_alVideoStreams_muted];\n }\n } else {\n if (meetingDisplayType === \"video\") {\n allStreamsPaged = [...alVideoStreams];\n } else if (meetingDisplayType === \"media\") {\n allStreamsPaged = [...alVideoStreams, ...non_alVideoStreams];\n } else if (meetingDisplayType === \"all\") {\n allStreamsPaged = [\n ...alVideoStreams,\n ...non_alVideoStreams,\n ...non_alVideoStreams_muted,\n ];\n }\n }\n\n paginatedStreams = [];\n let limit = itemPageLimit;\n\n if (shareScreenStarted || shared) {\n limit = screenPageLimit;\n }\n\n let firstPage: (Stream | Participant)[] = [];\n let page: (Stream | Participant)[] = [];\n let limit_ = limit + 1;\n\n if (eventType === \"conference\" && !shared && !shareScreenStarted) {\n limit_ = limit_ - 1;\n }\n\n // Create pagination\n let memberInRoom = false;\n let filterHost = false;\n if (breakOutRoomStarted && !breakOutRoomEnded) {\n let tempBreakoutRooms = JSON.parse(JSON.stringify(breakoutRooms));\n let host = participants.find((obj) => obj.islevel == \"2\");\n for (let room of tempBreakoutRooms) {\n try {\n let currentStreams: (Stream | Participant)[] = [];\n const roomIndex = tempBreakoutRooms.indexOf(room);\n if (hostNewRoom != -1 && roomIndex == hostNewRoom) {\n if (host) {\n if (!room.map((obj: any) => obj.name).includes(host.name)) {\n room = [...room, { name: host.name, breakRoom: roomIndex }];\n filterHost = true;\n }\n }\n }\n for (let participant of room) {\n if (participant.name == member && !memberInRoom) {\n memberInRoom = true;\n memberRoom = participant.breakRoom;\n updateMemberRoom(memberRoom);\n }\n let streams = allStreamsPaged.filter((stream) => {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream['audioID'] != null &&\n stream['audioID'] !== \"\")) {\n let producerId = stream.producerId || stream['audioID'];\n let matchingParticipant = ref_participants.find(\n (obj) => obj['audioID'] === producerId ||\n obj.videoID === producerId ||\n ((producerId == \"youyou\" || producerId == \"youyouyou\") &&\n member == participant.name)\n );\n return (\n (matchingParticipant &&\n matchingParticipant.name === participant.name) ||\n (participant.name == member &&\n (producerId == \"youyou\" || producerId == \"youyouyou\"))\n );\n } else {\n return (\n Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name == participant.name\n );\n }\n });\n for (let stream of streams) {\n if (currentStreams.length < limit_) {\n currentStreams.push(stream);\n }\n }\n }\n paginatedStreams.push(currentStreams);\n } catch {\n // handle error\n }\n }\n\n let remainingStreams = allStreamsPaged.filter((stream) => {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream['audioID'] != null &&\n stream['audioID'] !== \"\")) {\n let producerId = stream.producerId || stream['audioID'];\n let matchingParticipant = ref_participants.find(\n (obj) => obj['audioID'] === producerId ||\n obj.videoID === producerId ||\n ((producerId == \"youyou\" || producerId == \"youyouyou\") &&\n member == obj.name)\n );\n return (\n matchingParticipant &&\n !breakoutRooms!\n .flat()\n .map((obj) => obj.name)\n .includes(matchingParticipant.name) &&\n (!filterHost || matchingParticipant.name != host!.name)\n );\n } else {\n return (\n !breakoutRooms!\n .flat()\n .map((obj) => obj.name)\n .includes(stream.name ?? '') &&\n (!filterHost || stream.name != host!.name)\n );\n }\n });\n\n if (memberInRoom) {\n let memberStream = allStreamsPaged.find((stream) => {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n return (\n stream.producerId == \"youyou\" || stream.producerId == \"youyouyou\"\n );\n }\n return false; // Add a return statement here\n });\n if (memberStream && !remainingStreams.includes(memberStream)) {\n remainingStreams.unshift(memberStream);\n }\n }\n let remainingPaginatedStreams: (Stream | Participant)[][] = [];\n\n if (remainingStreams.length > 0) {\n firstPage = remainingStreams.slice(0, limit_);\n remainingPaginatedStreams.push(firstPage);\n for (let i = limit_; i < remainingStreams.length; i += limit) {\n page = remainingStreams.slice(i, i + limit);\n remainingPaginatedStreams.push(page);\n }\n }\n\n mainRoomsLength = remainingPaginatedStreams.length;\n updateMainRoomsLength(mainRoomsLength);\n // Add the remaining streams to the beginning of the paginatedStreams\n for (let i = remainingPaginatedStreams.length - 1; i >= 0; i--) {\n paginatedStreams.unshift(remainingPaginatedStreams[i]);\n }\n } else {\n firstPage = allStreamsPaged.slice(0, limit_);\n paginatedStreams.push(firstPage);\n\n for (let i = limit_; i < allStreamsPaged.length; i += limit) {\n page = allStreamsPaged.slice(i, i + limit);\n paginatedStreams.push(page);\n }\n }\n\n // State updates\n updateP_activeNames(p_activeNames);\n updateActiveNames(activeNames);\n updateDispActiveNames(dispActiveNames);\n updateNewLimitedStreams(newLimitedStreams);\n updateNon_alVideoStreams(non_alVideoStreams);\n updateRef_participants(ref_participants);\n updateSortAudioLoudness(sortAudioLoudness);\n updateMixed_alVideoStreams(mixed_alVideoStreams);\n updateNon_alVideoStreams_muted(non_alVideoStreams_muted);\n updatePaginatedStreams(paginatedStreams);\n\n prevDoPaginate = doPaginate;\n doPaginate = false;\n updatePrevDoPaginate(prevDoPaginate);\n updateDoPaginate(doPaginate);\n\n let isActive = false;\n\n if (paginatedStreams.length > 1) {\n if (!shareScreenStarted && !shared) {\n doPaginate = true;\n }\n updateDoPaginate(doPaginate);\n\n if (currentUserPage > paginatedStreams.length - 1) {\n if (breakOutRoomStarted && !breakOutRoomEnded) {\n currentUserPage = 0;\n } else {\n currentUserPage = paginatedStreams.length - 1;\n }\n } else if (currentUserPage == 0) {\n isActive = true;\n }\n updateCurrentUserPage(currentUserPage);\n updateNumberPages(paginatedStreams.length - 1);\n\n if (screenChanged) {\n await dispStreams({\n lStreams: paginatedStreams[0],\n ind: 0,\n parameters,\n });\n } else {\n await dispStreams({\n lStreams: paginatedStreams[0],\n ind: 0,\n auto: true,\n parameters,\n });\n }\n\n if (!isActive) {\n const currentPageBreak = currentUserPage - mainRoomsLength;\n await dispStreams({\n lStreams: paginatedStreams[currentUserPage],\n ind: currentUserPage,\n parameters,\n breakRoom: currentPageBreak,\n inBreakRoom: currentPageBreak >= 0,\n });\n }\n } else {\n currentUserPage = 0;\n updateCurrentUserPage(currentUserPage);\n\n if (screenChanged) {\n await dispStreams({\n lStreams: paginatedStreams[0],\n ind: 0,\n parameters,\n });\n } else {\n await dispStreams({\n lStreams: paginatedStreams[0],\n ind: 0,\n auto: true,\n parameters,\n });\n }\n }\n } catch (error) {\n console.log(\"changeVids error\", error);\n }\n};\n","import { StopShareScreenType, StopShareScreenParameters, RequestScreenShareType, RequestScreenShareParameters, ShowAlert } from \"../types/types\";\nexport interface CheckScreenShareParameters extends StopShareScreenParameters, RequestScreenShareParameters {\n shared: boolean;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n breakOutRoomStarted: boolean;\n breakOutRoomEnded: boolean;\n showAlert?: ShowAlert;\n\n // Mediasfu functions\n stopShareScreen: StopShareScreenType;\n requestScreenShare: RequestScreenShareType;\n \n getUpdatedAllParams : () => CheckScreenShareParameters;\n [key: string]: any;\n}\n\nexport interface CheckScreenShareOptions {\n parameters: CheckScreenShareParameters;\n}\n\n// Export the type definition for the function\nexport type CheckScreenShareType = (options: CheckScreenShareOptions) => Promise<void>;\n\n/**\n * Checks the current screen sharing status and either stops or requests screen sharing based on the provided parameters.\n * \n * @param {CheckScreenShareOptions} options - The options for checking screen share.\n * @param {Object} options.parameters - The parameters for screen sharing.\n * @param {boolean} options.parameters.shared - Indicates if the screen is currently being shared.\n * @param {Function} [options.parameters.showAlert] - Function to show alerts.\n * @param {boolean} options.parameters.whiteboardStarted - Indicates if the whiteboard session has started.\n * @param {boolean} options.parameters.whiteboardEnded - Indicates if the whiteboard session has ended.\n * @param {boolean} options.parameters.breakOutRoomStarted - Indicates if the breakout room session has started.\n * @param {boolean} options.parameters.breakOutRoomEnded - Indicates if the breakout room session has ended.\n * @param {Function} options.parameters.stopShareScreen - Function to stop screen sharing.\n * @param {Function} options.parameters.requestScreenShare - Function to request screen sharing.\n * \n * @returns {Promise<void>} A promise that resolves when the screen sharing status has been checked and the appropriate action has been taken.\n * \n * @throws Will log an error message if an error occurs during the process.\n * \n * @example\n * const options = {\n * parameters: {\n * shared: false,\n * showAlert: showAlertFunction,\n * whiteboardStarted: false,\n * whiteboardEnded: false,\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: false,\n * stopShareScreen: stopShareScreenFunction,\n * requestScreenShare: requestScreenShareFunction,\n * },\n * };\n * \n * checkScreenShare(options)\n * .then(() => {\n * console.log('Screen share checked successfully');\n * })\n * .catch((error) => {\n * console.error('Error checking screen share:', error);\n * });\n */\n\nexport async function checkScreenShare({ parameters }: CheckScreenShareOptions): Promise<void> {\n try {\n const {\n shared,\n showAlert,\n whiteboardStarted,\n whiteboardEnded,\n breakOutRoomStarted,\n breakOutRoomEnded,\n\n //mediasfu functions\n stopShareScreen,\n requestScreenShare,\n } = parameters;\n\n // Stop screen share if already shared or request screen share if not shared\n if (shared) {\n if (whiteboardStarted && !whiteboardEnded) {\n showAlert?.({\n message: \"Screen share is not allowed when whiteboard is active\",\n type: \"danger\",\n });\n return;\n }\n await stopShareScreen({ parameters });\n } else {\n // Can't share if breakout room is active\n if (breakOutRoomStarted && !breakOutRoomEnded) {\n showAlert?.({\n message: \"Screen share is not allowed when breakout room is active\",\n type: \"danger\",\n });\n return;\n }\n\n if (whiteboardStarted && !whiteboardEnded) {\n showAlert?.({\n message: \"Screen share is not allowed when whiteboard is active\",\n type: \"danger\",\n });\n return;\n }\n await requestScreenShare({ parameters });\n }\n } catch (error) {\n console.log(\"checkScreenShare error\", error);\n // throw error;\n }\n}\n","import {\n Stream, Participant, ReorderStreamsType, ReorderStreamsParameters, PrepopulateUserMediaParameters,\n PrepopulateUserMediaType, GetVideosType, RePortType, RePortParameters, EventType\n} from '../types/types';\n\n\n \n\nexport interface CloseAndResizeParameters extends ReorderStreamsParameters, PrepopulateUserMediaParameters, RePortParameters {\n allAudioStreams: (Stream | Participant)[];\n allVideoStreams: (Stream | Participant)[];\n activeNames: string[];\n participants: Participant[];\n streamNames: Stream[];\n recordingDisplayType: \"video\" | \"media\" | \"all\";\n recordingVideoOptimized: boolean;\n adminIDStream?: string;\n newLimitedStreams: (Stream | Participant)[];\n newLimitedStreamsIDs: string[];\n oldAllStreams: (Stream | Participant)[];\n shareScreenStarted: boolean;\n shared: boolean;\n meetingDisplayType: string;\n defer_receive: boolean;\n lock_screen: boolean;\n firstAll: boolean;\n first_round: boolean;\n gotAllVids: boolean;\n eventType: EventType;\n hostLabel: string;\n shareEnded: boolean;\n updateMainWindow: boolean;\n updateActiveNames: (activeNames: string[]) => void;\n updateAllAudioStreams: (allAudioStreams: (Stream | Participant)[]) => void;\n updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n updateNewLimitedStreams: (newLimitedStreams: (Stream | Participant)[]) => void;\n updateOldAllStreams: (oldAllStreams: (Stream | Participant)[]) => void;\n updateDefer_receive: (defer_receive: boolean) => void;\n updateMainHeightWidth: (heightWidth: number) => void;\n updateShareEnded: (shareEnded: boolean) => void;\n updateLock_screen: (lock_screen: boolean) => void;\n updateFirstAll: (firstAll: boolean) => void;\n updateFirst_round: (first_round: boolean) => void;\n\n // mediasfu functions\n reorderStreams: ReorderStreamsType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n getVideos: GetVideosType;\n rePort: RePortType;\n getUpdatedAllParams: () => CloseAndResizeParameters;\n [key: string]: any;\n}\n\nexport interface CloseAndResizeOptions {\n producerId: string;\n kind: string;\n parameters: CloseAndResizeParameters;\n}\n\n// Export the type definition for the function\nexport type CloseAndResizeType = (options: CloseAndResizeOptions) => Promise<void>;\n\n\n/**\n * Closes and resizes the video and audio elements based on the provided options.\n *\n * @param {CloseAndResizeOptions} options - The options for closing and resizing.\n * @param {string} options.producerId - The ID of the producer.\n * @param {string} options.kind - The kind of media (audio, video, screenshare, or screen).\n * @param {object} options.parameters - The parameters for the operation.\n * @param {function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {Array} options.parameters.allAudioStreams - Array of all audio streams.\n * @param {Array} options.parameters.allVideoStreams - Array of all video streams.\n * @param {Array} options.parameters.activeNames - Array of active participant names.\n * @param {Array} options.parameters.participants - Array of participants.\n * @param {Array} options.parameters.streamNames - Array of stream names.\n * @param {string} options.parameters.recordingDisplayType - Type of recording display.\n * @param {boolean} options.parameters.recordingVideoOptimized - Whether recording is video optimized.\n * @param {string} options.parameters.adminIDStream - ID of the admin stream.\n * @param {Array} options.parameters.newLimitedStreams - Array of new limited streams.\n * @param {Array} options.parameters.newLimitedStreamsIDs - Array of new limited stream IDs.\n * @param {Array} options.parameters.oldAllStreams - Array of old all streams.\n * @param {boolean} options.parameters.shareScreenStarted - Whether screen sharing has started.\n * @param {boolean} options.parameters.shared - Whether sharing is active.\n * @param {string} options.parameters.meetingDisplayType - Type of meeting display.\n * @param {boolean} options.parameters.defer_receive - Whether to defer receiving.\n * @param {boolean} options.parameters.lock_screen - Whether the screen is locked.\n * @param {boolean} options.parameters.firstAll - Whether it is the first all.\n * @param {boolean} options.parameters.first_round - Whether it is the first round.\n * @param {boolean} options.parameters.gotAllVids - Whether all videos are received.\n * @param {string} options.parameters.eventType - Type of event.\n * @param {string} options.parameters.hostLabel - Label of the host.\n * @param {boolean} options.parameters.shareEnded - Whether sharing has ended.\n * @param {boolean} options.parameters.updateMainWindow - Whether to update the main window.\n * @param {function} options.parameters.updateActiveNames - Function to update active names.\n * @param {function} options.parameters.updateAllAudioStreams - Function to update all audio streams.\n * @param {function} options.parameters.updateAllVideoStreams - Function to update all video streams.\n * @param {function} options.parameters.updateShareScreenStarted - Function to update share screen started status.\n * @param {function} options.parameters.updateUpdateMainWindow - Function to update main window status.\n * @param {function} options.parameters.updateNewLimitedStreams - Function to update new limited streams.\n * @param {function} options.parameters.updateOldAllStreams - Function to update old all streams.\n * @param {function} options.parameters.updateDefer_receive - Function to update defer receive status.\n * @param {function} options.parameters.updateMainHeightWidth - Function to update main height and width.\n * @param {function} options.parameters.updateShareEnded - Function to update share ended status.\n * @param {function} options.parameters.updateLock_screen - Function to update lock screen status.\n * @param {function} options.parameters.updateFirstAll - Function to update first all status.\n * @param {function} options.parameters.updateFirst_round - Function to update first round status.\n * @param {function} options.parameters.reorderStreams - Function to reorder streams.\n * @param {function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {function} options.parameters.getVideos - Function to get videos.\n * @param {function} options.parameters.rePort - Function to report.\n *\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n * \n * @example\n * const options = {\n * producerId: 'producerId',\n * kind: 'video',\n * parameters: {\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * allAudioStreams: [],\n * allVideoStreams: [],\n * activeNames: [],\n * participants: [],\n * streamNames: [],\n * recordingDisplayType: 'video',\n * recordingVideoOptimized: true,\n * adminIDStream: 'adminId',\n * newLimitedStreams: [],\n * newLimitedStreamsIDs: [],\n * oldAllStreams: [],\n * shareScreenStarted: false,\n * shared: false,\n * meetingDisplayType: 'video',\n * defer_receive: false,\n * lock_screen: false,\n * firstAll: false,\n * first_round: false,\n * gotAllVids: false,\n * eventType: 'conference',\n * hostLabel: 'host',\n * shareEnded: false,\n * updateMainWindow: true,\n * updateActiveNames: updateActiveNamesFunction,\n * updateAllAudioStreams: updateAllAudioStreamsFunction,\n * updateAllVideoStreams: updateAllVideoStreamsFunction,\n * updateShareScreenStarted: updateShareScreenStartedFunction,\n * updateUpdateMainWindow: updateUpdateMainWindowFunction,\n * updateNewLimitedStreams: updateNewLimitedStreamsFunction,\n * updateOldAllStreams: updateOldAllStreamsFunction,\n * updateDefer_receive: updateDefer_receiveFunction,\n * updateMainHeightWidth: updateMainHeightWidthFunction,\n * updateShareEnded: updateShareEndedFunction,\n * updateLock_screen: updateLock_screenFunction,\n * updateFirstAll: updateFirstAllFunction,\n * updateFirst_round: updateFirst_roundFunction,\n * reorderStreams: reorderStreamsFunction,\n * prepopulateUserMedia: prepopulateUserMediaFunction,\n * getVideos: getVideosFunction,\n * rePort: rePortFunction,\n * },\n * };\n * \n * closeAndResize(options)\n * .then(() => {\n * console.log('Closed and resized successfully');\n * });\n */\n\n\nexport const closeAndResize = async ({ producerId, kind, parameters }: CloseAndResizeOptions): Promise<void> => {\n\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n allAudioStreams,\n allVideoStreams,\n activeNames,\n participants,\n streamNames,\n recordingDisplayType,\n recordingVideoOptimized,\n adminIDStream,\n newLimitedStreams,\n newLimitedStreamsIDs,\n oldAllStreams,\n shareScreenStarted,\n shared,\n meetingDisplayType,\n defer_receive,\n lock_screen,\n firstAll,\n first_round,\n gotAllVids,\n eventType,\n\n hostLabel,\n shareEnded,\n updateMainWindow,\n updateActiveNames,\n updateAllAudioStreams,\n updateAllVideoStreams,\n\n updateShareScreenStarted,\n updateUpdateMainWindow,\n updateNewLimitedStreams,\n updateOldAllStreams,\n updateDefer_receive,\n updateMainHeightWidth,\n updateShareEnded,\n updateLock_screen,\n updateFirstAll,\n updateFirst_round,\n\n //mediasfu functions\n reorderStreams,\n prepopulateUserMedia,\n getVideos,\n rePort,\n } = parameters;\n\n //function to close and resize the video and audio elements\n\n let participant: Participant | undefined;\n\n if (kind === \"audio\") {\n //stop the audio by removing the miniAudio with id = producerId\n\n //remove the audio from the allAudioStreams array\n allAudioStreams = allAudioStreams.filter(function (audioStream) {\n return audioStream.producerId !== producerId;\n });\n\n updateAllAudioStreams(allAudioStreams);\n\n if (recordingDisplayType == \"video\" && recordingVideoOptimized == true) {\n // optimize the video display\n } else {\n //get the name of the participant with the producerId\n participant = participants.find(\n (obj) => obj.audioID === producerId\n );\n\n if (participant) {\n //check if the participants videoID is not null or \"\"\n if (participant.videoID !== null && participant.videoID !== \"\") {\n // found a participant with the producerId\n } else {\n //remove the participant from the activeNames array\n activeNames = activeNames.filter(function (name) {\n return name !== participant!.name;\n });\n updateActiveNames(activeNames);\n }\n }\n }\n\n let checker = false;\n let alt_checker = false;\n\n if (meetingDisplayType == \"video\") {\n checker =\n participant![0].videoID != null &&\n participant![0].videoID != \"\" &&\n participant![0].videoID != undefined;\n } else {\n checker = true;\n alt_checker = true;\n }\n\n if (checker) {\n if (shareScreenStarted || shared) {\n if (!alt_checker) {\n await reorderStreams({ parameters });\n }\n } else {\n if (alt_checker && meetingDisplayType != \"video\") {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n }\n } else if (kind === \"video\") {\n //update the video elements by removing the miniVideo with id = producerId\n //remove the video from the allVideoStreams array\n\n //check if producerId == adminidstream\n if (producerId == adminIDStream) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n }\n\n try {\n allVideoStreams = allVideoStreams.filter(function (videoStream) {\n return videoStream.producerId !== producerId;\n });\n\n updateAllVideoStreams(allVideoStreams);\n\n try {\n //try remove it from oldVideoStreams\n oldAllStreams = oldAllStreams.filter(function (videoStream) {\n return videoStream.producerId !== producerId;\n });\n\n updateOldAllStreams(oldAllStreams);\n } catch { // Handle error\n }\n\n try {\n //try remove it from newLimitedStreams\n newLimitedStreams = newLimitedStreams.filter(function (\n videoStream\n ) {\n return videoStream.producerId !== producerId;\n });\n\n updateNewLimitedStreams(newLimitedStreams);\n } catch {\n // Handle error\n }\n } catch {\n try {\n //try remove it from oldVideoStreams\n oldAllStreams = oldAllStreams.filter(function (videoStream) {\n return videoStream.producerId !== producerId;\n });\n updateOldAllStreams(oldAllStreams);\n } catch {\n // Handle error\n }\n }\n\n try {\n //remove the participant from activeNames\n activeNames = activeNames.filter(function (name) {\n //get the participant with the producerId\n let participant = streamNames.find(\n (obj) => obj.producerId === producerId\n );\n\n return name !== participant!['name'];\n });\n\n updateActiveNames(activeNames);\n } catch {\n // Handle error\n }\n\n if (lock_screen) {\n defer_receive = true;\n // check if the video is the one being displayed (i.e. (newLimitedStreamsIDs))\n if (newLimitedStreamsIDs.includes(producerId)) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n } else {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n } else if (kind === \"screenshare\" || kind === \"screen\") {\n //update the video elements by removing the mainVideo with id = producerId\n updateMainWindow = true;\n\n //screenshare stuff\n shareScreenStarted = false;\n shareEnded = true;\n\n lock_screen = false;\n firstAll = false;\n first_round = false;\n\n updateUpdateMainWindow(updateMainWindow);\n updateShareScreenStarted(shareScreenStarted);\n updateShareEnded(shareEnded);\n updateLock_screen(lock_screen);\n updateFirstAll(firstAll);\n updateFirst_round(first_round);\n\n if (!gotAllVids || defer_receive) {\n defer_receive = false;\n updateDefer_receive(defer_receive);\n await getVideos({\n participants,\n allVideoStreams,\n oldAllStreams,\n updateAllVideoStreams,\n updateOldAllStreams,\n });\n await rePort({ parameters });\n }\n\n if (eventType == \"conference\") {\n updateMainHeightWidth(0);\n }\n\n await prepopulateUserMedia({ name: hostLabel, parameters });\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n}","import { TriggerType, TriggerParameters } from '../types/types';\n\nexport interface CompareActiveNamesParameters extends TriggerParameters {\n activeNames: string[];\n prevActiveNames: string[];\n updateActiveNames: (activeNames: string[]) => void;\n updatePrevActiveNames: (prevActiveNames: string[]) => void;\n\n // mediasfu functions\n trigger: TriggerType;\n getUpdatedAllParams: () => CompareActiveNamesParameters;\n [key: string]: any;\n}\n\nexport interface CompareActiveNamesOptions {\n restart?: boolean;\n parameters: CompareActiveNamesParameters;\n}\n\n// Export the type definition for the function\nexport type CompareActiveNamesType = (options: CompareActiveNamesOptions) => Promise<void>;\n\n/**\n * Compares the current active names with the previous active names and triggers an action if there are changes.\n *\n * @param {CompareActiveNamesOptions} options - The options for comparing active names.\n * @param {boolean} [options.restart=false] - Whether to restart the comparison.\n * @param {CompareActiveNamesParameters} options.parameters - The parameters for the comparison.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {string[]} options.parameters.activeNames - The current active names.\n * @param {string[]} options.parameters.prevActiveNames - The previous active names.\n * @param {Function} options.parameters.updatePrevActiveNames - Function to update the previous active names.\n * @param {Function} options.parameters.trigger - Function to trigger an action when names change.\n *\n * @returns {Promise<void>} A promise that resolves when the comparison is complete.\n *\n * @throws Will log an error message if an error occurs during the comparison.\n * \n * @example\n * const options = {\n * restart: false,\n * parameters: {\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * activeNames: ['name1', 'name2'],\n * prevActiveNames: ['name1'],\n * updatePrevActiveNames: updatePrevActiveNamesFunction,\n * trigger: triggerFunction,\n * },\n * };\n * \n * compareActiveNames(options)\n * .then(() => {\n * console.log('Active names compared successfully');\n * });\n */\n\nexport async function compareActiveNames({\n restart = false,\n parameters,\n}: CompareActiveNamesOptions): Promise<void> {\n try {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n const {\n activeNames,\n prevActiveNames,\n updatePrevActiveNames,\n\n //mediasfu functions\n trigger,\n } = parameters;\n\n // Restart the comparison if needed\n if (restart) {\n await trigger({ ref_ActiveNames: activeNames, parameters });\n return;\n }\n\n // Array to track changes in activeNames\n const nameChanged: boolean[] = [];\n\n // Compare each name in activeNames\n for (let i = 0; i < activeNames.length; i++) {\n const currentName = activeNames[i];\n\n // Check if the name is present in prevActiveNames\n const hasNameChanged = !prevActiveNames.includes(currentName);\n\n if (hasNameChanged) {\n nameChanged.push(true);\n await trigger({ ref_ActiveNames: activeNames, parameters });\n break;\n }\n }\n\n // Count the number of `true` in nameChanged\n const count = nameChanged.filter((value) => value === true).length;\n\n if (count < 1) {\n // Check for new names in prevActiveNames\n for (let i = 0; i < prevActiveNames.length; i++) {\n const currentName = prevActiveNames[i];\n\n // Check if the name is present in activeNames\n const hasNameChanged = !activeNames.includes(currentName);\n\n // Signal change if the name is new\n if (hasNameChanged) {\n await trigger({ ref_ActiveNames: activeNames, parameters });\n break;\n }\n }\n }\n\n // Update prevActiveNames with current activeNames\n updatePrevActiveNames([...activeNames]);\n } catch (error) {\n console.log(\"compareActiveNames error\", error);\n // throw error; (Optional: Keep or remove depending on your error handling strategy)\n }\n}\n","import { ScreenState, TriggerType, TriggerParameters } from '../types/types';\n\nexport interface CompareScreenStatesParameters extends TriggerParameters {\n recordingDisplayType: 'video' | 'media' | 'all';\n recordingVideoOptimized: boolean;\n screenStates: ScreenState[];\n prevScreenStates: ScreenState[];\n activeNames: string[];\n\n // mediasfu functions\n trigger: TriggerType;\n getUpdatedAllParams: () => CompareScreenStatesParameters;\n [key: string]: any;\n}\n\nexport interface CompareScreenStatesOptions {\n restart?: boolean;\n parameters: CompareScreenStatesParameters;\n}\n\n// Export the type definition for the function\nexport type CompareScreenStatesType = (options: CompareScreenStatesOptions) => Promise<void>;\n\n/**\n * Compares the current screen states with the previous screen states and triggers actions based on changes.\n *\n * @param {CompareScreenStatesOptions} options - The options for comparing screen states.\n * @param {boolean} [options.restart=false] - Whether to restart the comparison process.\n * @param {CompareScreenStatesParameters} options.parameters - The parameters for the comparison.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {string} options.parameters.recordingDisplayType - The type of display being recorded.\n * @param {boolean} options.parameters.recordingVideoOptimized - Whether the recording is optimized for video.\n * @param {Array<ScreenState>} options.parameters.screenStates - The current screen states.\n * @param {Array<ScreenState>} options.parameters.prevScreenStates - The previous screen states.\n * @param {Array<string>} options.parameters.activeNames - The active names in the current context.\n * @param {Function} options.parameters.trigger - Function to trigger actions based on changes.\n *\n * @returns {Promise<void>} A promise that resolves when the comparison and any triggered actions are complete.\n *\n * @throws Will log an error message if an error occurs during the comparison process.\n * \n * @example\n * const options = {\n * restart: false,\n * parameters: {\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * recordingDisplayType: 'video',\n * recordingVideoOptimized: true,\n * screenStates: [{ key1: 'value1' }, { key2: 'value2' }],\n * prevScreenStates: [{ key1: 'value1' }, { key2: 'value2' }],\n * activeNames: ['name1', 'name2'],\n * trigger: triggerFunction,\n * },\n * };\n * \n * compareScreenStates(options)\n * .then(() => {\n * console.log('Screen states compared successfully');\n * });\n */\n\nexport async function compareScreenStates({\n restart = false,\n parameters,\n}: CompareScreenStatesOptions): Promise<void> {\n try {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n const {\n recordingDisplayType,\n recordingVideoOptimized,\n screenStates,\n prevScreenStates,\n activeNames,\n\n //mediasfu functions\n trigger,\n } = parameters;\n\n // Restart the comparison if needed\n if (restart) {\n // Perform necessary actions on restart\n return;\n }\n\n // Compare each key-value pair in the screenStates objects\n for (let i = 0; i < screenStates.length; i++) {\n const currentScreenState = screenStates[i];\n const prevScreenState = prevScreenStates[i];\n\n // Check if any value has changed\n const hasChanged = (Object.keys(currentScreenState) as (keyof ScreenState)[]).some(\n (key) => currentScreenState[key] !== prevScreenState[key]\n );\n\n // Signal change if any value has changed\n if (hasChanged) {\n // Perform actions or trigger events based on the change\n if (recordingDisplayType === 'video') {\n if (recordingVideoOptimized) {\n await trigger({\n ref_ActiveNames: activeNames,\n parameters,\n });\n break;\n }\n }\n await trigger({ ref_ActiveNames: activeNames, parameters });\n break;\n }\n }\n } catch (error) {\n console.log('compareScreenStates error', error);\n // Optionally re-throw the error for further handling\n }\n}\n","\n// Socket manager for media socket.\nimport { MeetingRoomParams, RecordingParams } from '../types/types';\nimport io, { Socket } from 'socket.io-client'; // Importing socket type\n\n/**\n * Validates the provided API key or token.\n * @param {string} value - The API key or token to validate.\n * @returns {Promise<Boolean>} - True if the API key or token is valid, false otherwise.\n */\nasync function validateApiKeyToken(value: string): Promise<boolean> {\n // API key or token must be alphanumeric and length 64\n if (!/^[a-z0-9]{64}$/i.test(value)) {\n throw new Error('Invalid API key or token.');\n }\n return true;\n}\n\nexport interface ResponseLocalConnection {\n socket?: Socket;\n data?: ResponseLocalConnectionData;\n}\n\nexport interface ResponseLocalConnectionData {\n socketId: string;\n mode: string;\n apiUserName?: string;\n apiKey?: string;\n allowRecord: boolean;\n meetingRoomParams_: MeetingRoomParams;\n recordingParams_: RecordingParams;\n}\n\nexport interface ConnectLocalSocketOptions {\n link: string;\n}\n\nexport interface ConnectSocketOptions {\n apiUserName: string;\n apiKey?: string;\n apiToken?: string;\n link: string;\n}\n\nexport interface DisconnectSocketOptions {\n socket: Socket;\n}\n\n// Export the type definition for the function\nexport type ConnectSocketType = (options: ConnectSocketOptions) => Promise<Socket>;\nexport type DisconnectSocketType = (options: DisconnectSocketOptions) => Promise<boolean>;\nexport type ConnectLocalSocketType = (options: ConnectLocalSocketOptions) => Promise<ResponseLocalConnection>;\n\n\n/**\n * Connects to a media socket using the provided connection options.\n *\n * @param {ConnectSocketOptions} options - The connection options.\n * @param {string} options.apiUserName - The API username.\n * @param {string} [options.apiKey] - The API key (optional if apiToken is provided).\n * @param {string} [options.apiToken] - The API token (optional if apiKey is provided).\n * @param {string} options.link - The socket link.\n *\n * @returns {Promise<Socket>} A promise that resolves to the connected socket.\n *\n * @example\n * ```typescript\n * const options = {\n * apiUserName: 'user123',\n * apiKey: 'yourApiKeyHere',\n * link: 'https://socketlink.com',\n * };\n *\n * try {\n * const socket = await connectSocket(options);\n * console.log('Connected to socket:', socket);\n * } catch (error) {\n * console.error('Failed to connect to socket:', error);\n * }\n * ```\n */\n\nasync function connectSocket(\n { apiUserName, apiKey, apiToken, link }: ConnectSocketOptions,\n): Promise<Socket> {\n // Validate inputs\n if (!apiUserName) {\n throw new Error('API username required.');\n }\n if (!(apiKey || apiToken)) {\n throw new Error('API key or token required.');\n }\n if (!link) {\n throw new Error('Socket link required.');\n }\n\n // Validate the API key or token\n let useKey = false;\n try {\n if (apiKey && apiKey.length === 64) {\n await validateApiKeyToken(apiKey);\n useKey = true;\n } else if (apiToken && apiToken.length === 64) {\n await validateApiKeyToken(apiToken);\n useKey = false;\n } else {\n throw new Error('Invalid API key or token format.');\n }\n } catch {\n throw new Error('Invalid API key or token.');\n }\n\n let socket: Socket;\n\n return new Promise((resolve, reject) => {\n // Connect to socket using the link provided\n if (useKey) {\n socket = io(`${link}/media`, {\n transports: ['websocket'],\n query: {\n apiUserName: apiUserName,\n apiKey: apiKey!,\n },\n });\n } else {\n socket = io(`${link}/media`, {\n transports: ['websocket'],\n query: {\n apiUserName: apiUserName,\n apiToken: apiToken!,\n },\n });\n }\n\n // Handle socket connection events\n socket.on('connection-success', ({ socketId }: { socketId: string }) => {\n //check if link contains mediasfu.com and contains more than one c\n let conn = 'media';\n try {\n if (link.includes('mediasfu.com') && (link.match(/c/g)?.length ?? 0) > 1) {\n conn = 'consume';\n }\n } catch {\n // do nothing\n }\n\n console.log(`Connected to ${conn} socket with ID: ${socketId}`);\n resolve(socket);\n });\n\n socket.on('connect_error', (error: Error) => {\n reject(new Error('Error connecting to media socket: ' + error.message));\n });\n });\n}\n\n\n/**\n * Connects to a local media socket using the provided connection options.\n *\n * @param {ConnectLocalSocketOptions} options - The connection options.\n * @param {string} options.link - The socket link.\n *\n * @returns {Promise<ResponseLocalConnection>} A promise that resolves to the connected socket and data.\n *\n * @example\n * ```typescript\n * const options = {\n * link: 'http://localhost:3000',\n * };\n *\n * try {\n * const { socket, data } = await connectLocalSocket(options);\n * console.log('Connected to socket:', socket, data);\n * } catch (error) {\n * console.error('Failed to connect to socket:', error);\n * }\n * ```\n */\n\nasync function connectLocalSocket({ link }: ConnectLocalSocketOptions): Promise<ResponseLocalConnection> {\n if (!link) {\n throw new Error('Socket link required.');\n }\n\n let socket: Socket;\n\n return new Promise((resolve, reject) => {\n // Connect to socket using the link provided\n socket = io(`${link}/media`, {\n transports: ['websocket'],\n });\n\n\n // Handle socket connection events\n socket.on('connection-success', (data: ResponseLocalConnectionData) => {\n resolve({ socket, data });\n });\n\n socket.on('connect_error', (error: Error) => {\n reject(new Error('Error connecting to media socket: ' + error.message));\n });\n });\n}\n\n/**\n * Disconnects from the socket.\n *\n * @param {Socket} socket - The socket instance to disconnect.\n * @returns {Promise<boolean>} - A promise that resolves once the socket is disconnected.\n *\n * @example\n * ```typescript\n * const options = { socket: socketInstance };\n *\n * try {\n * const isDisconnected = await disconnectSocket(options);\n * console.log('Disconnected:', isDisconnected);\n * } catch (error) {\n * console.error('Failed to disconnect:', error);\n * }\n * ```\n */\n\nasync function disconnectSocket({ socket }: DisconnectSocketOptions): Promise<boolean> {\n if (socket) {\n socket.disconnect();\n }\n return true;\n}\n\nexport { connectSocket, disconnectSocket, connectLocalSocket };\n","import { Socket } from \"socket.io-client\";\nimport { ReorderStreamsParameters, ReorderStreamsType, ConnectRecvTransportType,\n ConnectRecvTransportParameters, CreateWebRTCTransportResponse } from \"../types/types\";\nimport type { Device, DtlsParameters } from 'mediasoup-client/lib/types';\n\nexport interface SignalNewConsumerTransportParameters extends ReorderStreamsParameters, ConnectRecvTransportParameters {\n device: Device | null;\n consumingTransports: string[];\n lock_screen: boolean;\n updateConsumingTransports: (transports: string[]) => void;\n connectRecvTransport: ConnectRecvTransportType;\n reorderStreams: ReorderStreamsType;\n getUpdatedAllParams: () => SignalNewConsumerTransportParameters;\n [key: string]: any;\n}\n\nexport interface SignalNewConsumerTransportOptions {\n remoteProducerId: string;\n islevel: string;\n nsock: Socket;\n parameters: SignalNewConsumerTransportParameters;\n}\n\n// Export the type definition for the function\nexport type SignalNewConsumerTransportType = (options: SignalNewConsumerTransportOptions) => Promise<string[] | void>;\n\n/**\n * Signals the creation of a new consumer transport.\n * \n * @param {SignalNewConsumerTransportOptions} options - The options for signaling a new consumer transport.\n * @param {string} options.remoteProducerId - The ID of the remote producer.\n * @param {string} options.islevel - Indicates the level of the consumer.\n * @param {Socket} options.nsock - The socket instance for communication.\n * @param {SignalNewConsumerTransportParameters} options.parameters - The parameters for the transport.\n * \n * @returns {Promise<string[] | void>} A promise that resolves to an array of consuming transports or void.\n * \n * @throws Will throw an error if the signaling process fails.\n * \n * @example\n * const options = {\n * remoteProducerId: 'producer-id',\n * islevel: '1',\n * nsock: socketInstance,\n * parameters: {\n * device: mediaDevice,\n * consumingTransports: [],\n * lock_screen: false,\n * updateConsumingTransports: updateFunction,\n * connectRecvTransport: connectFunction,\n * reorderStreams: reorderFunction,\n * getUpdatedAllParams: getUpdatedParamsFunction,\n * },\n * };\n * \n * signalNewConsumerTransport(options)\n * .then(consumingTransports => {\n * console.log('Consuming Transports:', consumingTransports);\n * })\n * .catch(error => {\n * console.error('Error signaling new consumer transport:', error);\n * });\n */\n\nexport const signalNewConsumerTransport = async ({\n remoteProducerId,\n islevel,\n nsock,\n parameters,\n}: SignalNewConsumerTransportOptions): Promise<string[] | void> => {\n try {\n let {\n device,\n consumingTransports,\n lock_screen,\n updateConsumingTransports,\n connectRecvTransport,\n reorderStreams,\n } = parameters;\n\n // Get updated parameters\n const updatedParams = parameters.getUpdatedAllParams();\n device = updatedParams.device;\n consumingTransports = updatedParams.consumingTransports;\n\n // Check if already consuming\n if (consumingTransports.includes(remoteProducerId)) {\n return consumingTransports;\n }\n\n // Add remote producer ID to consumingTransports array\n consumingTransports.push(remoteProducerId);\n updateConsumingTransports(consumingTransports);\n\n // Emit createWebRtcTransport event to signal a new consumer\n nsock.emit(\n \"createWebRtcTransport\",\n { consumer: true, islevel },\n async ({ params }: { params: CreateWebRTCTransportResponse }) => {\n if (params.error) {\n // Handle error\n return;\n }\n\n try {\n // Create a new receiving transport using the received parameters\n const consumerTransport = device!.createRecvTransport({ ...params });\n\n // Handle 'connect' event for the consumer transport\n consumerTransport.on(\n \"connect\",\n async (\n { dtlsParameters }: { dtlsParameters: DtlsParameters },\n callback: () => void,\n errback: (error: any) => void\n ) => {\n try {\n // Emit transport-recv-connect event to signal connection\n nsock.emit(\"transport-recv-connect\", {\n dtlsParameters,\n serverConsumerTransportId: params.id,\n });\n callback();\n } catch (error) {\n errback(error);\n }\n }\n );\n\n // Listen for connection state change\n consumerTransport.on(\"connectionstatechange\", async (state: string) => {\n switch (state) {\n case \"connecting\":\n // Handle connecting state\n break;\n\n case \"connected\":\n // Handle connected state\n break;\n\n case \"failed\":\n // Handle failed state\n consumerTransport.close();\n\n // Reorder streams based on conditions\n if (lock_screen) {\n await reorderStreams({ add: true, parameters });\n } else {\n await reorderStreams({ add: false, parameters });\n }\n break;\n\n default:\n break;\n }\n });\n\n // Connect the receiving transport\n await connectRecvTransport({\n consumerTransport,\n remoteProducerId,\n serverConsumerTransportId: params.id,\n nsock,\n parameters,\n });\n } catch (error) {\n console.log(error, \"createRecvTransport error\");\n // Handle error\n return;\n }\n }\n );\n } catch (error) {\n console.log(error, \"signalNewConsumerTransport error\");\n // Handle error\n return;\n }\n};\n\n","import { Socket } from 'socket.io-client';\nimport { signalNewConsumerTransport } from '../signalNewConsumerTransport';\nimport { ReorderStreamsParameters, ReorderStreamsType, SignalNewConsumerTransportParameters, ConnectRecvTransportParameters, ConnectRecvTransportType, ShowAlert } from '../../types/types';\nimport type { Device } from 'mediasoup-client/lib/types';\nexport interface NewPipeProducerParameters extends ReorderStreamsParameters, SignalNewConsumerTransportParameters, ConnectRecvTransportParameters {\n\n first_round: boolean;\n shareScreenStarted: boolean;\n shared: boolean;\n landScaped: boolean;\n showAlert?: ShowAlert;\n isWideScreen: boolean;\n updateFirst_round: (firstRound: boolean) => void;\n updateLandScaped: (landScaped: boolean) => void;\n device: Device | null;\n consumingTransports: string[];\n lock_screen: boolean;\n updateConsumingTransports: (transports: string[]) => void;\n\n // mediasfu functions\n connectRecvTransport: ConnectRecvTransportType;\n reorderStreams: ReorderStreamsType;\n getUpdatedAllParams: () => NewPipeProducerParameters;\n [key: string]: any;\n\n}\n\nexport interface NewPipeProducerOptions {\n producerId: string;\n islevel: string;\n nsock: Socket;\n parameters: NewPipeProducerParameters;\n}\n\n// Export the type definition for the function\nexport type NewPipeProducerType = (options: NewPipeProducerOptions) => Promise<void>;\n\n\n/**\n * Handles the creation of a new pipe producer by signaling for a new consumer transport and updating the necessary parameters.\n *\n * @function\n * @async\n * @param {NewPipeProducerOptions} options - The options for the new pipe producer.\n * @param {string} options.producerId - The ID of the producer to be consumed.\n * @param {string} options.islevel - The level status of the participant.\n * @param {Socket} options.nsock - The socket instance for real-time communication.\n * @param {NewPipeProducerParameters} options.parameters - Additional parameters required for the producer.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.parameters.shared - Indicates if sharing is active.\n * @param {boolean} options.parameters.landScaped - Indicates if the device is in landscape mode.\n * @param {ShowAlert} options.parameters.showAlert - Function to show alerts to the user.\n * @param {boolean} options.parameters.isWideScreen - Indicates if the device is a widescreen.\n * @param {Function} options.parameters.updateFirst_round - Function to update the first round status.\n * @param {Function} options.parameters.updateLandScaped - Function to update the landscape status.\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n * @throws {Error} Will throw an error if the operation fails to signal the new consumer transport.\n *\n * @example\n * import { newPipeProducer } from 'mediasfu-reactjs';\n * import { io } from 'socket.io-client';\n * \n * const parameters = {\n * shareScreenStarted: true,\n * shared: true,\n * landScaped: false,\n * showAlert: (alert) => console.log(alert.message),\n * isWideScreen: false,\n * updateFirst_round: (firstRound) => console.log('First round updated:', firstRound),\n * updateLandScaped: (landScaped) => console.log('Landscape status updated:', landScaped),\n * };\n * \n * const producerId = 'producer-123';\n * const islevel = '2';\n * const nsock = io(\"http://localhost:3000\");\n * \n * async function init() {\n * try {\n * await newPipeProducer({\n * producerId,\n * islevel,\n * nsock,\n * parameters,\n * });\n * console.log('New pipe producer created successfully');\n * } catch (error) {\n * console.error('Error creating new pipe producer:', error);\n * }\n * }\n * \n * init();\n */\n\nexport const newPipeProducer = async ({\n producerId,\n islevel,\n nsock,\n parameters,\n}: NewPipeProducerOptions): Promise<void> => {\n const {\n shareScreenStarted,\n shared,\n landScaped,\n showAlert,\n isWideScreen,\n updateFirst_round,\n updateLandScaped,\n } = parameters;\n\n // Signal new consumer transport\n await signalNewConsumerTransport({\n remoteProducerId: producerId,\n islevel,\n nsock,\n parameters\n });\n\n // Modify first_round and landscape status\n let updatedFirstRound = false;\n\n if (shareScreenStarted || shared) {\n if (!isWideScreen) {\n if (!landScaped) {\n if (showAlert) {\n showAlert({\n message: 'Please rotate your device to landscape mode for better experience',\n type: 'success',\n duration: 3000,\n });\n }\n updateLandScaped(true);\n }\n }\n\n updatedFirstRound = true;\n updateFirst_round(updatedFirstRound);\n }\n};\n","import { Transport, CloseAndResizeParameters, CloseAndResizeType } from '../../types/types';\n\nexport interface ProducerClosedParameters extends CloseAndResizeParameters {\n consumerTransports: Transport[];\n screenId?: string;\n updateConsumerTransports: (transports: Transport[]) => void;\n\n // mediasfu functions\n closeAndResize: CloseAndResizeType;\n getUpdatedAllParams: () => ProducerClosedParameters;\n [key: string]: any;\n\n}\n\nexport interface ProducerClosedOptions {\n remoteProducerId: string;\n parameters: ProducerClosedParameters;\n}\n\n// Export the type definition for the function\nexport type ProducerClosedType = (options: ProducerClosedOptions) => Promise<void>;\n\n/**\n * Handles the closure of a producer identified by its remote producer ID.\n * This function will clean up the consumer transports and resize the video outputs.\n *\n * @function\n * @async\n * @param {ProducerClosedOptions} options - The options for closing the producer.\n * @param {string} options.remoteProducerId - The ID of the remote producer to close.\n * @param {ProducerClosedParameters} options.parameters - Additional parameters for the operation.\n * @param {Transport[]} options.parameters.consumerTransports - The list of consumer transports associated with the producer.\n * @param {Function} options.parameters.closeAndResize - Function to handle the closing and resizing of video streams.\n * @param {string} [options.parameters.screenId] - The ID of the screen producer (if applicable).\n * @param {Function} options.parameters.updateConsumerTransports - Function to update the state of consumer transports.\n * @returns {Promise<void>} A promise that resolves when the producer has been successfully closed.\n * @throws Will throw an error if there is an issue closing the consumer transport or the producer.\n *\n * @example\n * import { producerClosed } from 'mediasfu-reactjs';\n * \n * const options = {\n * remoteProducerId: 'producerId',\n * parameters: {\n * consumerTransports: [], // Array of consumer transports\n * closeAndResize: (params) => console.log('Close and resize called', params),\n * screenId: 'screenId',\n * updateConsumerTransports: (transports) => console.log('Updated transports:', transports),\n * },\n * };\n * \n * producerClosed(options)\n * .then(() => {\n * console.log('Producer closed successfully');\n * })\n * .catch((error) => {\n * console.error('Error closing producer:', error);\n * });\n */\nexport const producerClosed = async ({\n remoteProducerId,\n parameters,\n}: ProducerClosedOptions): Promise<void> => {\n let { consumerTransports, closeAndResize, screenId, updateConsumerTransports } = parameters;\n\n // Handle producer closed\n const producerToClose = consumerTransports.find(\n (transportData: any) => transportData.producerId === remoteProducerId\n );\n\n if (!producerToClose) {\n return;\n }\n\n // Check if the ID of the producer to close is the same as the screenId\n let kind: string = producerToClose.consumer.kind;\n\n if (producerToClose.producerId === screenId) {\n kind = 'screenshare';\n }\n\n try {\n await producerToClose.consumerTransport.close();\n } catch (error) {\n console.error('Error closing consumer transport:', error);\n }\n\n try {\n producerToClose.consumer.close();\n } catch (error) {\n console.error('Error closing consumer:', error);\n }\n\n // Filter out the closed producer\n consumerTransports = consumerTransports.filter(\n (transportData: any) => transportData.producerId !== remoteProducerId\n );\n updateConsumerTransports(consumerTransports);\n\n // Close and resize the videos\n await closeAndResize({ producerId: remoteProducerId, kind, parameters });\n};\n","\nexport interface ValidateAlphanumericOptions {\n str: string;\n}\n\n// Export the type definition for the function\nexport type ValidateAlphanumericType = (options: ValidateAlphanumericOptions) => Promise<boolean>;\n\n/**\n * Validates if the given string contains only alphanumeric characters.\n *\n * @param {ValidateAlphanumericOptions} options - The options containing the string to validate.\n * @param {string} options.str - The string to be validated.\n * @returns {Promise<boolean>} - A promise that resolves to `true` if the string is alphanumeric, otherwise `false`.\n * \n * @example\n * ```typescript \n * const isValid = await validateAlphanumeric({ str: \"abc123\" });\n * console.log(isValid);\n * // Output: true\n * ```\n */\n\n\nconst validateAlphanumeric = async ({ str }: ValidateAlphanumericOptions): Promise<boolean> => {\n let code: number, i: number, len: number;\n\n for (i = 0, len = str.length; i < len; i++) {\n code = str.charCodeAt(i);\n if (\n !(code > 47 && code < 58) && // numeric (0-9)\n !(code > 64 && code < 91) && // upper alpha (A-Z)\n !(code > 96 && code < 123) // lower alpha (a-z)\n ) {\n return false;\n }\n }\n return true;\n};\n\nexport { validateAlphanumeric };\n","import { Socket } from \"socket.io-client\";\nimport { validateAlphanumeric } from \"../../methods/utils/validateAlphanumeric\"; // Import the validateAlphanumeric function from the validateAlphanumeric file\nimport type { RtpCapabilities } from \"mediasoup-client/lib/types\";\n\nexport interface JoinConRoomOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n}\n\nexport interface JoinConRoomResponse {\n success: boolean;\n rtpCapabilities: RtpCapabilities | null;\n reason?: string;\n banned?: boolean;\n suspended?: boolean;\n noAdmin?: boolean;\n [key: string]: any;\n}\n\n\n// Export the type definition for the function\nexport type JoinConRoomType = (options: JoinConRoomOptions) => Promise<JoinConRoomResponse>;\n\n/**\n * Joins a conference room using the provided options.\n *\n * @param {JoinConRoomOptions} options - The options for joining the conference room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token.\n * @param {string} options.apiUserName - The API username.\n * \n * @returns {Promise<JoinConRoomResponse>} A promise that resolves with the response of the join operation.\n *\n * @example\n * ```typescript\n * const options = {\n * socket: socketInstance,\n * roomName: \"s12345678\",\n * islevel: \"1\",\n * member: \"user123\",\n * sec: \"64CharacterLongSecretHere\",\n * apiUserName: \"user123\",\n * };\n *\n * try {\n * const response = await joinConRoom(options);\n * console.log(\"Room joined:\", response);\n * } catch (error) {\n * console.error(\"Failed to join room:\", error);\n * }\n * ```\n */\n\nexport async function joinConRoom(\n { socket, roomName, islevel, member, sec, apiUserName }: JoinConRoomOptions\n): Promise<JoinConRoomResponse> {\n return new Promise((resolve, reject) => {\n // Validate inputs\n if (!(sec && roomName && islevel && apiUserName && member)) {\n const validationError: JoinConRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: \"Missing required parameters\",\n };\n reject(validationError);\n return;\n }\n\n // Validate alphanumeric for roomName, apiUserName, and member\n try {\n validateAlphanumeric({ str: roomName });\n validateAlphanumeric({ str: apiUserName });\n validateAlphanumeric({ str: member });\n } catch {\n const validationError: JoinConRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: \"Invalid roomName or apiUserName or member\",\n };\n reject(validationError);\n return;\n }\n\n // Validate roomName starts with 's' or 'p'\n if (!(roomName.startsWith(\"s\") || roomName.startsWith(\"p\"))) {\n const validationError: JoinConRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: \"Invalid roomName, must start with s or p\",\n };\n reject(validationError);\n return;\n }\n\n // Validate other conditions for sec, roomName, islevel, apiUserName\n if (\n !(\n sec.length === 64 &&\n roomName.length >= 8 &&\n islevel.length === 1 &&\n apiUserName.length >= 6 &&\n (islevel == \"0\" || islevel == \"1\" || islevel == \"2\")\n )\n ) {\n const validationError: JoinConRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: \"Invalid roomName or islevel or apiUserName or secret\",\n };\n reject(validationError);\n return;\n }\n\n socket.emit(\n \"joinConRoom\",\n { roomName, islevel, member, sec, apiUserName },\n async (data: JoinConRoomResponse) => {\n try {\n // Check if rtpCapabilities is null\n if (data.rtpCapabilities == null) {\n // Check if banned, suspended, or noAdmin\n if (data.banned) {\n throw new Error(\"User is banned.\");\n }\n if (data.suspended) {\n throw new Error(\"User is suspended.\");\n }\n if (data.noAdmin) {\n throw new Error(\"Host has not joined the room yet.\");\n }\n\n // Resolve with the data received from the 'joinConRoom' event\n resolve(data);\n } else {\n // Handle other cases or perform additional actions\n resolve(data);\n }\n } catch (error) {\n // Handle errors during the joinConRoom process\n console.log(\"Error joining room:\", error);\n reject(error);\n }\n }\n );\n });\n}\n","import { joinConRoom } from '../../producers/producerEmits/joinConRoom';\nimport type { Device, RtpCapabilities } from 'mediasoup-client/lib/types';\nimport { Socket } from 'socket.io-client';\nimport { ReceiveAllPipedTransportsParameters, ReceiveAllPipedTransportsType, CreateDeviceClientType } from '../../types/types';\n\n\nexport interface JoinConsumeRoomParameters extends ReceiveAllPipedTransportsParameters {\n roomName: string;\n islevel: string;\n member: string;\n device: Device | null;\n updateDevice: (device: Device | null) => void;\n\n // Mediasfu functions\n receiveAllPipedTransports: ReceiveAllPipedTransportsType;\n createDeviceClient: CreateDeviceClientType;\n getUpdatedAllParams: () => JoinConsumeRoomParameters;\n [key: string]: any;\n}\nexport interface JoinConsumeRoomOptions {\n remote_sock: Socket;\n apiToken: string;\n apiUserName: string;\n parameters: JoinConsumeRoomParameters;\n}\n\ninterface JoinConsumeRoomResponse {\n success: boolean;\n rtpCapabilities?: RtpCapabilities | null;\n}\n\n// Export the type definition for the function\nexport type JoinConsumeRoomType = (options: JoinConsumeRoomOptions) => Promise<JoinConsumeRoomResponse>;\n\n/**\n * Joins a consumption room by sending a request to the server, handling device setup, and managing piped transports.\n * \n * @function\n * @async\n * @param {Object} options - The configuration options.\n * @param {Socket} options.remote_sock - The remote socket for communication.\n * @param {string} options.apiToken - The API token for authentication.\n * @param {string} options.apiUserName - The API username for authentication.\n * @param {JoinConsumeRoomParameters} options.parameters - Additional parameters including room details and Mediasoup configurations.\n * @returns {Promise<JoinConsumeRoomResponse>} - An object indicating the success of joining the room and optional RTP capabilities.\n * @throws {Error} Throws an error if joining the room or setup fails.\n *\n * @example\n * import { joinConsumeRoom } from 'mediasfu-reactjs';\n * import { io } from 'socket.io-client';\n * \n * const apiToken = 'your-api-token';\n * const apiUserName = 'your-api-username';\n * const remote_sock = io(\"http://localhost:3000\");\n * \n * const parameters = {\n * roomName: 'room-name',\n * islevel: '2',\n * member: 'user-id',\n * device: null,\n * updateDevice: (device) => console.log('Device updated:', device),\n * receiveAllPipedTransports: (params) => console.log('Receiving all piped transports:', params),\n * createDeviceClient: async (params) => { // Device client setup logic },\n * getUpdatedAllParams: () => console.log('Getting updated parameters'),\n * };\n * \n * async function init() {\n * try {\n * const data = await joinConsumeRoom({\n * remote_sock,\n * apiToken,\n * apiUserName,\n * parameters,\n * });\n * console.log('Joined room:', data);\n * } catch (error) {\n * console.error('Error joining room:', error);\n * }\n * }\n * init();\n * // Expected output: { success: true, rtpCapabilities: { ... } }\n */\n\n\nexport const joinConsumeRoom = async ({\n remote_sock,\n apiToken,\n apiUserName,\n parameters,\n}: JoinConsumeRoomOptions): Promise<JoinConsumeRoomResponse> => {\n const {\n roomName,\n islevel,\n member,\n device,\n updateDevice,\n\n // Mediasfu functions\n receiveAllPipedTransports,\n createDeviceClient,\n } = parameters;\n\n try {\n // Join the consumption room\n const data: JoinConsumeRoomResponse = await joinConRoom({ socket: remote_sock, roomName, islevel, member, sec: apiToken, apiUserName });\n\n if (data && data.success) {\n // Setup media device if not already set\n if (!device) {\n if (data.rtpCapabilities) {\n const device_: Device | null = await createDeviceClient({\n rtpCapabilities: data.rtpCapabilities,\n });\n\n if (device_) {\n updateDevice(device_);\n }\n }\n }\n\n // Receive all piped transports\n await receiveAllPipedTransports({ nsock: remote_sock, parameters });\n }\n\n return data;\n } catch (error) {\n console.error('Error in joinConsumeRoom:', error);\n throw new Error('Failed to join the consumption room or set up necessary components.');\n }\n};\n"," \nimport { connectSocket } from \"../../src/sockets/SocketManager\";\nimport { newPipeProducer } from \"./socketReceiveMethods/newPipeProducer\";\nimport { producerClosed } from \"./socketReceiveMethods/producerClosed\";\nimport { joinConsumeRoom } from \"./socketReceiveMethods/joinConsumeRoom\";\nimport type { Device } from 'mediasoup-client/lib/types';\nimport {\n ReorderStreamsParameters, ReorderStreamsType, NewPipeProducerParameters, NewPipeProducerType, ProducerClosedType,\n ProducerClosedParameters, JoinConsumeRoomType, JoinConsumeRoomParameters, ConsumeSocket\n} from '../types/types';\n\nexport interface ConnectIpsParameters extends ReorderStreamsParameters, JoinConsumeRoomParameters, ProducerClosedParameters, NewPipeProducerParameters {\n device: Device | null;\n roomRecvIPs: string[];\n updateRoomRecvIPs: (roomRecvIPs: string[]) => void;\n updateConsume_sockets: (consume_sockets: ConsumeSocket[]) => void;\n\n // mediasfu functions\n reorderStreams: ReorderStreamsType;\n getUpdatedAllParams: () => ConnectIpsParameters;\n [key: string]: any;\n}\n\nexport interface ConnectIpsOptions {\n consume_sockets: ConsumeSocket[];\n remIP: string[];\n apiUserName: string;\n apiKey?: string;\n apiToken: string;\n newProducerMethod?: NewPipeProducerType;\n closedProducerMethod?: ProducerClosedType;\n joinConsumeRoomMethod?: JoinConsumeRoomType;\n parameters: ConnectIpsParameters;\n}\n\n// Export the type definition for the function\nexport type ConnectIpsType = (options: ConnectIpsOptions) => Promise<[Record<string, any>[], string[]]>;\n\n/**\n * Connects to remote IPs and manages socket connections.\n *\n * @param {ConnectIpsOptions} options - The options for connecting IPs.\n * @param {Record<string, any>[]} options.consume_sockets - The array of current socket connections.\n * @param {string[]} options.remIP - The list of remote IPs to connect to.\n * @param {string} options.apiUserName - The API username for authentication.\n * @param {string} [options.apiKey] - The API key for authentication.\n * @param {string} [options.apiToken] - The API token for authentication.\n * @param {Function} [options.newProducerMethod=newPipeProducer] - The method to handle new pipe producer events.\n * @param {Function} [options.closedProducerMethod=producerClosed] - The method to handle producer closed events.\n * @param {Function} [options.joinConsumeRoomMethod=joinConsumeRoom] - The method to handle joining a consuming room.\n * @param {ConnectIpsParameters} options.parameters - Additional parameters.\n * @param {string[]} options.parameters.roomRecvIPs - The list of IPs that have been received in the room.\n * @param {Function} options.parameters.updateRoomRecvIPs - The function to update the room received IPs.\n * @param {Function} options.parameters.updateConsume_sockets - The function to update the consume sockets.\n *\n * @returns {Promise<[Record<string, any>[], string[]]>} A promise that resolves to an array containing the updated consume sockets and room received IPs.\n *\n * @throws Will throw an error if required parameters are missing or if there is an issue connecting to a remote IP.\n * \n * @example\n * const options = {\n * consume_sockets: [],\n * remIP: ['ip1', 'ip2'],\n * apiUserName: 'username',\n * apiKey: 'apikey',\n * apiToken: 'token',\n * parameters: {\n * roomRecvIPs: [],\n * updateRoomRecvIPs: updateRoomRecvIPsFunction,\n * updateConsume_sockets: updateConsumeSocketsFunction,\n * },\n * };\n * \n * connectIps(options)\n * .then(([consume_sockets, roomRecvIPs]) => {\n * console.log('Connected IPs:', consume_sockets);\n * console.log('Room received IPs:', roomRecvIPs);\n * });\n */\n\nexport const connectIps = async ({\n consume_sockets,\n remIP,\n apiUserName,\n apiKey,\n apiToken,\n\n // mediasfu methods\n newProducerMethod = newPipeProducer,\n closedProducerMethod = producerClosed,\n joinConsumeRoomMethod = joinConsumeRoom,\n parameters,\n}: ConnectIpsOptions): Promise<[Record<string, any>[], string[]]> => {\n try {\n const { roomRecvIPs, updateRoomRecvIPs, updateConsume_sockets } = parameters;\n\n if (!consume_sockets || !remIP || !apiUserName || (!apiKey && !apiToken)) {\n console.log(\"Missing required parameters\", {\n consume_sockets,\n remIP,\n apiUserName,\n apiToken,\n });\n return [consume_sockets, roomRecvIPs];\n }\n\n for (const ip of remIP) {\n try {\n // Check if the IP is already connected\n const matching = consume_sockets.find((socketObj) => Object.keys(socketObj)[0] === ip);\n\n if (matching || !ip) {\n // Skip if the IP is already connected or invalid\n continue;\n }\n\n // Connect to the remote socket using socket.io-client\n const remote_sock = await connectSocket({ apiUserName, apiKey, apiToken, link: `https://${ip}.mediasfu.com` });\n\n if (remote_sock.id) {\n // Check if the IP is in the roomRecvIPs, if not, add it\n if (!roomRecvIPs.includes(ip)) {\n roomRecvIPs.push(ip);\n updateRoomRecvIPs(roomRecvIPs);\n }\n\n // Handle new pipe producer event\n remote_sock.on(\"new-pipe-producer\", async ({ producerId, islevel }: { producerId: string; islevel: string }) => {\n if (newProducerMethod) {\n await newProducerMethod({\n producerId,\n islevel,\n nsock: remote_sock,\n parameters,\n });\n }\n });\n\n // Handle producer closed event\n remote_sock.on(\"producer-closed\", async ({ remoteProducerId }: { remoteProducerId: string }) => {\n if (closedProducerMethod) {\n await closedProducerMethod({ remoteProducerId, parameters });\n }\n });\n\n // Handle new consuming room by joining the room\n if (joinConsumeRoomMethod) {\n let data = await joinConsumeRoomMethod({\n remote_sock,\n apiToken,\n apiUserName,\n parameters,\n });\n if (!data.rtpCapabilities) {\n return [consume_sockets, roomRecvIPs];\n }\n }\n\n // Add the remote socket to the consume_sockets array\n consume_sockets.push({ [ip]: remote_sock });\n updateConsume_sockets(consume_sockets);\n }\n } catch (error) {\n // Handle the error\n console.log(\"connectIps error\", error);\n }\n }\n\n return [consume_sockets, roomRecvIPs];\n } catch (error) {\n // Handle the error\n console.log(\"connectIps error\", error);\n return [consume_sockets, parameters.roomRecvIPs];\n }\n};\n","\nimport { newPipeProducer } from \"./socketReceiveMethods/newPipeProducer\";\nimport { producerClosed } from \"./socketReceiveMethods/producerClosed\";\nimport {\n ReorderStreamsParameters, ReorderStreamsType, NewPipeProducerParameters, NewPipeProducerType, ProducerClosedType,\n ProducerClosedParameters, \n ReceiveAllPipedTransportsParameters,\n ReceiveAllPipedTransportsType} from '../types/types';\nimport { Socket } from \"socket.io-client\";\n\nexport interface ConnectLocalIpsParameters extends ReorderStreamsParameters, ProducerClosedParameters, NewPipeProducerParameters,\nReceiveAllPipedTransportsParameters {\n socket: Socket;\n\n // mediasfu functions\n reorderStreams: ReorderStreamsType;\n receiveAllPipedTransports: ReceiveAllPipedTransportsType;\n getUpdatedAllParams: () => ConnectLocalIpsParameters;\n [key: string]: any;\n}\n\nexport interface ConnectLocalIpsOptions {\n socket: Socket;\n newProducerMethod?: NewPipeProducerType;\n closedProducerMethod?: ProducerClosedType;\n parameters: ConnectLocalIpsParameters;\n}\n\n// Export the type definition for the function\nexport type ConnectLocalIpsType = (options: ConnectLocalIpsOptions) => Promise<void>;\n\n/**\n * Connects to remote IPs and manages socket connections.\n * \n * @param {ConnectLocalIpsOptions} options - The options for connecting IPs.\n * @param {Socket} options.socket - The socket to connect to.\n * @param {Function} [options.newProducerMethod=newPipeProducer] - The method to handle new pipe producer events.\n * @param {Function} [options.closedProducerMethod=producerClosed] - The method to handle producer closed events.\n * @param {ConnectLocalIpsParameters} options.parameters - Additional parameters.\n * @param {Function} options.parameters.reorderStreams - The function to reorder streams.\n * @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.\n * @param {Socket} options.parameters.socket - The socket to connect to.\n * \n * @returns {Promise<void>} A promise that resolves when the connection is established.\n * \n * @throws Will throw an error if required parameters are missing or if there is an issue connecting to a remote IP.\n * \n * @example\n * ```typescript\n * const options = {\n * socket,\n * newProducerMethod: newPipeProducer,\n * closedProducerMethod: producerClosed,\n * parameters: connectLocalIpsParameters,\n * };\n * \n * connectLocalIps(options)\n * .then(() => {\n * console.log('Connected to local IPs');\n * })\n * .catch(error => {\n * console.error('Error connecting to local IPs:', error);\n * });\n * ```\n */ \n\nexport const connectLocalIps = async ({\n socket,\n\n // mediasfu methods\n newProducerMethod = newPipeProducer,\n closedProducerMethod = producerClosed,\n parameters,\n}: ConnectLocalIpsOptions): Promise<void> => {\n try {\n\n // Connect to the remote socket using socket.io-client\n // Handle new pipe producer event\n socket.on(\"new-producer\", async ({ producerId, islevel }: { producerId: string; islevel: string }) => {\n if (newProducerMethod) {\n await newProducerMethod({\n producerId,\n islevel,\n nsock: socket,\n parameters,\n });\n }\n });\n\n // Handle producer closed event\n socket.on(\"producer-closed\", async ({ remoteProducerId }: { remoteProducerId: string }) => {\n if (closedProducerMethod) {\n await closedProducerMethod({ remoteProducerId, parameters });\n }\n });\n\n await parameters.receiveAllPipedTransports({ nsock: socket, community: true, parameters });\n\n } catch (error) {\n // Handle the error\n console.log(\"ConnectLocalIps error\", error);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport { ConsumerResumeType, ConsumerResumeParameters, Transport as TransportType } from \"../types/types\";\nimport type { Consumer, Device, Transport } from \"mediasoup-client/lib/types\";\ninterface Params {\n id: string;\n producerId: string;\n kind: string;\n rtpParameters: any;\n serverConsumerId: string;\n error?: string;\n}\n\nexport interface ConnectRecvTransportParameters extends ConsumerResumeParameters {\n device: Device | null;\n consumerTransports: TransportType[];\n updateConsumerTransports: (transports: TransportType[]) => void;\n\n // mediasfu functions\n consumerResume: ConsumerResumeType;\n getUpdatedAllParams: () => ConnectRecvTransportParameters;\n [key: string]: any; // Extendable for additional parameters\n}\nexport interface ConnectRecvTransportOptions {\n consumerTransport: Transport;\n remoteProducerId: string;\n serverConsumerTransportId: string;\n nsock: Socket;\n parameters: ConnectRecvTransportParameters;\n}\n\n// Export the type definition for the function\nexport type ConnectRecvTransportType = (options: ConnectRecvTransportOptions) => Promise<void>;\n\n/**\n * Connects the receiving transport to consume media from a remote producer.\n *\n * @param {ConnectRecvTransportOptions} options - The options for connecting the receiving transport.\n * @param {Transport} options.consumerTransport - The transport used for consuming media.\n * @param {string} options.remoteProducerId - The ID of the remote producer.\n * @param {string} options.serverConsumerTransportId - The ID of the server consumer transport.\n * @param {Socket} options.nsock - The socket used for communication.\n * @param {ConnectRecvTransportParameters} options.parameters - The parameters for the connection.\n *\n * @returns {Promise<void>} A promise that resolves when the connection is established.\n *\n * @throws Will throw an error if the connection or consumption fails.\n *\n * @example\n * ```typescript\n * const options = {\n * consumerTransport,\n * remoteProducerId: 'producer-id',\n * serverConsumerTransportId: 'transport-id',\n * nsock: socket,\n * parameters: connectRecvTransportOptions,\n * };\n * \n * connectRecvTransport(options)\n * .then(() => {\n * console.log('Transport connected and consuming media');\n * })\n * .catch((error) => {\n * console.error('Error connecting transport:', error);\n * });\n * ```\n */\n\nexport const connectRecvTransport = async ({\n consumerTransport,\n remoteProducerId,\n serverConsumerTransportId,\n nsock,\n parameters,\n}: ConnectRecvTransportOptions): Promise<void> => {\n parameters = parameters.getUpdatedAllParams();\n\n const {\n device,\n consumerTransports,\n updateConsumerTransports,\n consumerResume,\n } = parameters;\n\n try {\n // Emit 'consume' event to signal consumption initiation\n nsock.emit(\n \"consume\",\n {\n rtpCapabilities: device!.rtpCapabilities,\n remoteProducerId,\n serverConsumerTransportId,\n },\n async ({ params }: { params: Params }) => {\n if (params.error) {\n // Handle error\n console.log(\"consume error\", params.error);\n return;\n }\n\n try {\n // Consume media using received parameters\n const consumer: Consumer = await consumerTransport.consume({\n id: params.id,\n producerId: params.producerId,\n kind: params.kind as \"audio\" | \"video\",\n rtpParameters: params.rtpParameters,\n });\n\n // Update consumerTransports array with the new consumer\n consumerTransports.push({\n consumerTransport,\n serverConsumerTransportId: params.id,\n producerId: remoteProducerId,\n consumer,\n socket_: nsock,\n });\n\n updateConsumerTransports(consumerTransports);\n\n // Extract track from the consumer\n const { track } = consumer;\n\n // Emit 'consumer-resume' event to signal consumer resumption\n nsock.emit(\n \"consumer-resume\",\n { serverConsumerId: params.serverConsumerId },\n async ({ resumed }: { resumed: boolean }) => {\n if (resumed) {\n // Consumer resumed and ready to be used\n try {\n await consumerResume({\n track,\n kind: params.kind,\n remoteProducerId,\n params,\n parameters,\n nsock,\n consumer,\n });\n } catch (error) {\n // Handle error\n console.log(\"consumerResume error\", error);\n }\n }\n }\n );\n } catch (error) {\n // Handle error\n console.log(\"consume error\", error);\n return;\n }\n }\n );\n } catch (error) {\n // Handle error\n console.log(\"connectRecvTransport error\", error);\n }\n};\n","import type { ProducerOptions } from 'mediasoup-client/lib/types';\nimport { ConnectSendTransportAudioType, ConnectSendTransportVideoType, ConnectSendTransportScreenType, ConnectSendTransportAudioParameters, ConnectSendTransportVideoParameters, ConnectSendTransportScreenParameters } from '../types/types';\nexport interface ConnectSendTransportParameters extends ConnectSendTransportAudioParameters, ConnectSendTransportVideoParameters, ConnectSendTransportScreenParameters {\n audioParams: ProducerOptions \n videoParams: ProducerOptions;\n localStreamScreen: MediaStream | null;\n canvasStream: MediaStream | null;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n shared: boolean;\n islevel: string;\n\n //mediasfu functions\n connectSendTransportAudio: ConnectSendTransportAudioType;\n connectSendTransportVideo: ConnectSendTransportVideoType;\n connectSendTransportScreen: ConnectSendTransportScreenType;\n\n getUpdatedAllParams: () => ConnectSendTransportParameters;\n [key: string]: any;\n}\n\nexport interface ConnectSendTransportOptions {\n option: 'audio' | 'video' | 'screen' | 'all';\n targetOption?: 'local' | 'remote' | 'all';\n parameters: ConnectSendTransportParameters;\n}\n\n// Export the type definition for the function\nexport type ConnectSendTransportType = (options: ConnectSendTransportOptions) => Promise<void>;\n\n/**\n * Connects the send transport based on the specified option.\n *\n * @param {ConnectSendTransportOptions} options - The options for connecting the send transport.\n * @param {string} options.option - The type of transport to connect (\"audio\", \"video\", \"screen\", or \"all\").\n * @param {boolean} options.targetOption - The target option to connect (\"local\", \"remote\", or \"all\").\n * @param {ConnectSendTransportParameters} options.parameters - The parameters required for connecting the transport.\n * @param {ProducerOptions} options.parameters.audioParams - The audio parameters.\n * @param {ProducerOptions} options.parameters.videoParams - The video parameters.\n * @param {MediaStream} options.parameters.localStreamScreen - The local screen stream.\n * @param {MediaStream} options.parameters.canvasStream - The canvas stream.\n * @param {boolean} options.parameters.whiteboardStarted - Indicates if the whiteboard has started.\n * @param {boolean} options.parameters.whiteboardEnded - Indicates if the whiteboard has ended.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {string} options.parameters.islevel - The level of the screen sharing.\n * @param {Function} options.parameters.connectSendTransportAudio - Function to connect the audio send transport.\n * @param {Function} options.parameters.connectSendTransportVideo - Function to connect the video send transport.\n * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the screen send transport.\n *\n * @returns {Promise<void>} A promise that resolves when the transport is connected.\n *\n * @throws Will throw an error if the connection fails.\n *\n * @example\n * const options = {\n * option: 'audio',\n * targetOption: 'local',\n * parameters: {\n * audioParams: audioProducerOptions,\n * videoParams: videoProducerOptions,\n * localStreamScreen: localStream,\n * canvasStream: canvasStream,\n * whiteboardStarted: false,\n * whiteboardEnded: false,\n * shared: false,\n * islevel: '1',\n * connectSendTransportAudio: connectAudioFunction,\n * connectSendTransportVideo: connectVideoFunction,\n * connectSendTransportScreen: connectScreenFunction,\n * },\n * };\n * \n * connectSendTransport(options)\n * .then(() => {\n * console.log('Transport connected successfully');\n * })\n * .catch((error) => {\n * console.error('Error connecting transport:', error);\n * });\n */\n\nexport const connectSendTransport = async ({ option, targetOption = \"all\", parameters }: ConnectSendTransportOptions): Promise<void> => {\n try {\n let {\n audioParams,\n videoParams,\n localStreamScreen,\n canvasStream,\n whiteboardStarted,\n whiteboardEnded,\n shared,\n islevel,\n\n //media functions\n connectSendTransportAudio,\n connectSendTransportVideo,\n connectSendTransportScreen,\n } = parameters;\n\n // Connect send transport based on the specified option\n if (option === \"audio\") {\n await connectSendTransportAudio({\n targetOption,\n audioParams,\n parameters,\n });\n } else if (option === \"video\") {\n await connectSendTransportVideo({\n targetOption,\n videoParams,\n parameters,\n });\n } else if (option === \"screen\") {\n if (\n whiteboardStarted &&\n !whiteboardEnded &&\n canvasStream &&\n islevel === \"2\" &&\n !shared\n ) {\n await connectSendTransportScreen({\n targetOption,\n stream: canvasStream,\n parameters,\n });\n } else {\n await connectSendTransportScreen({\n targetOption,\n stream: localStreamScreen!,\n parameters,\n });\n }\n } else {\n // Connect both audio and video send transports\n await connectSendTransportAudio({\n targetOption,\n audioParams,\n parameters,\n });\n await connectSendTransportVideo({\n targetOption,\n videoParams,\n parameters,\n });\n }\n } catch (error) {\n console.log(\"connectSendTransport error\", error);\n // throw error;\n }\n};\n","import type { Transport, Producer, ProducerOptions } from 'mediasoup-client/lib/types';\n\nexport interface ConnectSendTransportAudioParameters {\n audioProducer: Producer | null;\n producerTransport: Transport | null;\n localAudioProducer?: Producer | null;\n localProducerTransport?: Transport | null;\n updateAudioProducer: (producer: Producer | null) => void;\n updateProducerTransport: (transport: Transport | null) => void;\n updateLocalAudioProducer?: (localProducer: Producer | null) => void;\n updateLocalProducerTransport?: (localTransport: Transport | null) => void;\n updateAudioLevel: (level: number) => void;\n\n // Function to get all parameters\n getUpdatedAllParams: () => ConnectSendTransportAudioParameters;\n [key: string]: any; // Extendable for additional parameters\n\n}\n\nexport interface ConnectSendTransportAudioOptions {\n audioParams: ProducerOptions;\n parameters: ConnectSendTransportAudioParameters;\n targetOption?: 'all' | 'local' | 'remote';\n}\n\n// Export the type definition for the function\nexport type ConnectSendTransportAudioType = (options: ConnectSendTransportAudioOptions) => Promise<void>;\n\nconst connectLocalSendTransportAudio = async ({\n parameters,\n audioParams\n}: ConnectSendTransportAudioOptions): Promise<void> => {\n try {\n let {\n localAudioProducer,\n localProducerTransport,\n updateLocalAudioProducer,\n updateLocalProducerTransport,\n } = parameters;\n\n if (localProducerTransport) {\n localAudioProducer = await localProducerTransport.produce(audioParams);\n\n updateLocalAudioProducer?.(localAudioProducer);\n updateLocalProducerTransport?.(localProducerTransport);\n }\n } catch (error) {\n console.error(\"Error connecting local audio transport:\", error);\n throw error; // Re-throw to let the parent handle it\n }\n};\n\nexport const updateMicLevel = async (audioProducer: Producer, updateAudioLevel: (level: number) => void) => {\n try {\n setInterval(() => {\n const sender = audioProducer!.rtpSender;\n\n sender?.getStats().then((stats) => {\n stats.forEach((report) => {\n\n if (report.type === \"media-source\" && report.kind === \"audio\" && report.audioLevel !== undefined) {\n const newLevel = 127.5 + (report.audioLevel * 127.5);\n updateAudioLevel(newLevel);\n }\n\n });\n });\n }, 1000);\n } catch {\n // Handle error\n }\n}\n\n\n/**\n * Connects the send transport for audio by producing audio data and updating the audio producer and producer transport objects.\n *\n * If the primary connection fails, it attempts to connect using the local transport via a separate function.\n *\n * @param {ConnectSendTransportAudioOptions} options - The options for connecting the send transport.\n * @param {ProducerOptions} options.audioParams - The audio parameters.\n * @param {ConnectSendTransportAudioParameters} options.parameters - The parameters required for connecting the transport.\n * @param {Producer | null} options.parameters.audioProducer - The audio producer object.\n * @param {Transport | null} options.parameters.producerTransport - The producer transport object.\n * @param {Producer | null} [options.parameters.localAudioProducer] - The local audio producer object.\n * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport object.\n * @param {(producer: Producer | null) => void} options.parameters.updateAudioProducer - The function to update the audio producer object.\n * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the producer transport object.\n * @param {(localProducer: Producer | null) => void} [options.parameters.updateLocalAudioProducer] - The function to update the local audio producer object.\n * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport object.\n * @param {(level: number) => void} [options.parameters.updateAudioLevel] - The function to update the audio level.\n * @returns {Promise<void>} A promise that resolves when the connection is established.\n *\n * @example\n * const options = {\n * audioParams: { codec: \"opus\", maxBitrate: 128000 },\n * parameters: {\n * audioProducer: null,\n * producerTransport: transport,\n * localAudioProducer: null,\n * localProducerTransport: localTransport,\n * updateAudioProducer: (producer) => console.log(\"Updated producer:\", producer),\n * updateProducerTransport: (transport) => console.log(\"Updated transport:\", transport),\n * updateLocalAudioProducer: (localProducer) => console.log(\"Updated local producer:\", localProducer),\n * updateLocalProducerTransport: (localTransport) => console.log(\"Updated local transport:\", localTransport),\n * updateAudioLevel: (level) => console.log(\"Updated audio level:\", level),\n * },\n * };\n *\n * connectSendTransportAudio(options)\n * .then(() => console.log(\"Audio transport connected successfully\"))\n * .catch((error) => console.error(\"Error connecting audio transport:\", error));\n */\n\nexport const connectSendTransportAudio: ConnectSendTransportAudioType = async ({\n parameters,\n audioParams,\n targetOption = \"all\",\n}: ConnectSendTransportAudioOptions): Promise<void> => {\n try {\n let {\n audioProducer,\n producerTransport,\n updateAudioProducer,\n updateProducerTransport,\n } = parameters;\n\n // Attempt to connect the primary send transport\n if (targetOption === \"all\" || targetOption === \"remote\") {\n audioProducer = await producerTransport!.produce(audioParams);\n\n // Update the audio level\n updateMicLevel(audioProducer, parameters.updateAudioLevel);\n\n // Update state with the new producer and transport\n updateAudioProducer(audioProducer);\n updateProducerTransport(producerTransport);\n }\n\n // Attempt to connect the local send transport\n if (targetOption === \"all\" || targetOption === \"local\") {\n try {\n await connectLocalSendTransportAudio({ parameters, audioParams });\n\n // Update the audio level\n if (targetOption === \"local\" && parameters.updateAudioLevel) {\n if (!parameters.localAudioProducer) {\n parameters = parameters.getUpdatedAllParams();\n }\n updateMicLevel(parameters.localAudioProducer!, parameters.updateAudioLevel);\n }\n } catch (localError) {\n console.error(\"Local audio transport connection failed:\", localError);\n }\n }\n\n } catch (primaryError) {\n console.error(\"audio transport connection failed:\", primaryError);\n throw new Error(\"Failed to connect to audio transport.\");\n }\n};\n","import type { Transport, Producer, Device, ProducerOptions } from 'mediasoup-client/lib/types';\n\nexport interface ConnectSendTransportScreenParameters {\n screenProducer: Producer | null;\n localScreenProducer?: Producer | null;\n device: Device | null;\n screenParams: ProducerOptions;\n producerTransport: Transport | null;\n localProducerTransport?: Transport | null;\n params: ProducerOptions;\n updateScreenProducer: (producer: Producer | null) => void;\n updateLocalScreenProducer?: (localProducer: Producer | null) => void;\n updateProducerTransport: (transport: Transport | null) => void;\n updateLocalProducerTransport?: (localTransport: Transport | null) => void;\n\n getUpdatedAllParams: () => ConnectSendTransportScreenParameters;\n [key: string]: any; // Extendable for additional parameters\n}\n\nexport interface ConnectSendTransportScreenOptions {\n stream: MediaStream;\n parameters: ConnectSendTransportScreenParameters;\n targetOption?: \"all\" | \"local\" | \"remote\";\n}\n\n// Export the type definition for the function\nexport type ConnectSendTransportScreenType = (options: ConnectSendTransportScreenOptions) => Promise<void>;\n\nconst connectLocalSendTransportScreen = async ({\n stream,\n parameters,\n}: ConnectSendTransportScreenOptions): Promise<void> => {\n try {\n let {\n localScreenProducer,\n localProducerTransport,\n updateLocalScreenProducer,\n updateLocalProducerTransport,\n device,\n } = parameters;\n\n // Find VP9 codec for local screen share\n const codec = device?.rtpCapabilities?.codecs?.find(\n (codec: { mimeType: string }) =>\n codec.mimeType.toLowerCase() === \"video/vp9\"\n );\n\n // Produce local screen share data\n if (localProducerTransport) {\n localScreenProducer = await localProducerTransport.produce({\n track: stream.getVideoTracks()[0],\n codec,\n appData: { mediaTag: \"screen-video\" },\n });\n\n // Update the local producer and transport objects\n updateLocalScreenProducer?.(localScreenProducer);\n updateLocalProducerTransport?.(localProducerTransport);\n } \n } catch (error) {\n console.error(\"Error connecting local screen transport:\", error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Sets up and connects a screen sharing transport for sending video streams.\n *\n * This function supports both a primary and a local screen producer, delegating local handling to a separate function.\n *\n * @param {ConnectSendTransportScreenOptions} options - The configuration options for setting up the screen transport.\n * @param {\"all\" | \"local\" | \"remote\"} [options.targetOption] - The target option for connecting the transport.\n * @param {MediaStream} options.stream - The screen stream to be shared.\n * @param {ConnectSendTransportScreenParameters} options.parameters - The parameters required for setting up the screen transport.\n * @param {Producer | null} options.parameters.screenProducer - The screen producer object to be updated.\n * @param {Device | null} options.parameters.device - The device object for media capabilities.\n * @param {ProducerOptions} options.parameters.screenParams - The parameters for the screen producer.\n * @param {Transport | null} options.parameters.producerTransport - The producer transport object.\n * @param {ProducerOptions} options.parameters.params - The parameters for the producer.\n * @param {Function} options.parameters.updateScreenProducer - The function to update the screen producer object.\n * @param {Function} options.parameters.updateProducerTransport - The function to update the producer transport object.\n * @param {Function} [options.parameters.updateLocalScreenProducer] - The function to update the local screen producer object.\n * @param {Function} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport object.\n * @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.\n * @param {Object} [options.parameters.*] - Additional parameters for future use.\n * \n * @returns {Promise<void>} - A promise that resolves once the screen transport is successfully connected and set up.\n *\n * @throws Will throw an error if there is an issue with the connection or setup process.\n *\n * @example\n * ```typescript\n * await connectSendTransportScreen({\n * stream: screenStream,\n * targetOption: \"all\",\n * parameters: {\n * screenProducer: null,\n * localScreenProducer: null,\n * device: mediaDevice,\n * screenParams: { encodings: [{ maxBitrate: 1500000 }] },\n * producerTransport: sendTransport,\n * localProducerTransport: localSendTransport,\n * params: { track: screenStream.getVideoTracks()[0] },\n * updateScreenProducer: setScreenProducer,\n * updateLocalScreenProducer: setLocalScreenProducer,\n * updateProducerTransport: setProducerTransport,\n * updateLocalProducerTransport: setLocalProducerTransport,\n * getUpdatedAllParams: getParams,\n * },\n * });\n * ```\n */\n\nexport const connectSendTransportScreen: ConnectSendTransportScreenType = async ({\n stream,\n parameters,\n targetOption = \"all\",\n}: ConnectSendTransportScreenOptions): Promise<void> => {\n try {\n let {\n screenProducer,\n device,\n screenParams,\n producerTransport,\n params,\n updateScreenProducer,\n updateProducerTransport,\n } = parameters;\n\n // Fetch updated device information\n device = parameters.getUpdatedAllParams().device;\n\n // Retrieve screen share parameters\n params = screenParams;\n\n // Find VP9 codec for screen share\n const codec = device?.rtpCapabilities?.codecs?.find(\n (codec: { mimeType: string }) =>\n codec.mimeType.toLowerCase() === \"video/vp9\"\n );\n\n // Produce screen share data using the producer transport\n if (targetOption === \"remote\" || targetOption === \"all\") {\n screenProducer = await producerTransport!.produce({\n track: stream.getVideoTracks()[0],\n ...params,\n codec,\n appData: { mediaTag: \"screen-video\" },\n });\n\n // Update the screen producer and producer transport objects\n updateScreenProducer(screenProducer);\n updateProducerTransport(producerTransport);\n }\n\n // Produce screen share data using the local producer transport\n if (targetOption === \"local\" || targetOption === \"all\") {\n try {\n await connectLocalSendTransportScreen({ stream, parameters });\n } catch (localError) {\n console.log(\"Error connecting local screen transport:\", localError);\n }\n }\n\n } catch (error) {\n console.log(\"connectSendTransportScreen error\", error);\n throw error;\n }\n};\n","import type { Device, Producer, ProducerOptions, Transport } from 'mediasoup-client/lib/types';\n\nexport interface ConnectSendTransportVideoParameters {\n videoProducer: Producer | null;\n localVideoProducer?: Producer | null;\n device: Device | null;\n producerTransport: Transport | null;\n localProducerTransport?: Transport | null;\n islevel: string;\n updateMainWindow: boolean;\n updateVideoProducer: (producer: Producer | null) => void;\n updateLocalVideoProducer?: (localProducer: Producer | null) => void;\n updateProducerTransport: (transport: Transport | null) => void;\n updateLocalProducerTransport?: (localTransport: Transport | null) => void;\n updateUpdateMainWindow: (state: boolean) => void;\n [key: string]: any; // Extendable for additional parameters\n}\n\nexport interface ConnectSendTransportVideoOptions {\n videoParams: ProducerOptions;\n parameters: ConnectSendTransportVideoParameters;\n targetOption?: \"all\" | \"local\" | \"remote\";\n}\n\n// Export the type definition for the function\nexport type ConnectSendTransportVideoType = (options: ConnectSendTransportVideoOptions) => Promise<void>;\n\nconst connectLocalSendTransportVideo = async ({\n videoParams,\n parameters,\n}: ConnectSendTransportVideoOptions): Promise<void> => {\n try {\n let {\n localVideoProducer,\n localProducerTransport,\n updateLocalVideoProducer,\n updateLocalProducerTransport,\n } = parameters;\n\n // Produce local video data if transport exists\n if (localProducerTransport) {\n localVideoProducer = await localProducerTransport.produce(videoParams);\n\n // Update local producer and transport\n updateLocalVideoProducer?.(localVideoProducer);\n updateLocalProducerTransport?.(localProducerTransport);\n }\n } catch (error) {\n console.error(\"Error connecting local video transport:\", error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Connects the send transport for video by producing video data and updates the relevant states.\n *\n * This function supports both a primary and a local video producer, delegating local handling to a separate function.\n *\n * @param {ConnectSendTransportVideoOptions} options - The options for connecting the send transport for video.\n * @param {ProducerOptions} options.videoParams - The parameters for the video producer.\n * @param {\"all\" | \"local\" | \"remote\"} [options.targetOption] - The target option for the video transport connection.\n * @param {ConnectSendTransportVideoParameters} options.parameters - The parameters for the video transport connection.\n * @param {Producer | null} options.parameters.videoProducer - The primary video producer.\n * @param {Producer | null} [options.parameters.localVideoProducer] - The local video producer.\n * @param {Device | null} options.parameters.device - The device information.\n * @param {Transport | null} options.parameters.producerTransport - The primary producer transport.\n * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport.\n * @param {string} options.parameters.islevel - The connection level for the video transport.\n * @param {boolean} options.parameters.updateMainWindow - The flag to update the main window state.\n * @param {(producer: Producer | null) => void} options.parameters.updateVideoProducer - The function to update the video producer state.\n * @param {(localProducer: Producer | null) => void} [options.parameters.updateLocalVideoProducer] - The function to update the local video producer state.\n * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the producer transport state.\n * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport state.\n * @param {(state: boolean) => void} options.parameters.updateUpdateMainWindow - The function to update the main window state.\n * @param {any} [options.parameters] - Additional parameters for future use.\n * @returns {Promise<void>} A promise that resolves when the send transport for video is connected.\n *\n * @throws Will throw an error if the connection fails.\n *\n * @example\n * const options = {\n * videoParams: {\n * // video producer options (e.g., codec, bitrate)\n * },\n * targetOption: \"all\",\n * parameters: {\n * videoProducer: null,\n * localVideoProducer: null,\n * producerTransport: transport,\n * localProducerTransport: localTransport,\n * islevel: '2',\n * updateMainWindow: false,\n * updateVideoProducer: (producer) => console.log(\"Updated producer\"),\n * updateLocalVideoProducer: (localProducer) => console.log(\"Updated local producer\"),\n * updateProducerTransport: (transport) => console.log(\"Updated transport\"),\n * updateLocalProducerTransport: (localTransport) => console.log(\"Updated local transport\"),\n * updateUpdateMainWindow: (state) => console.log(\"Updated main window:\", state),\n * },\n * };\n *\n * connectSendTransportVideo(options)\n * .then(() => console.log(\"Video transport connected successfully\"))\n * .catch((error) => console.error(\"Error connecting video transport:\", error));\n */\n\nexport const connectSendTransportVideo: ConnectSendTransportVideoType = async ({\n videoParams,\n parameters,\n targetOption = \"all\",\n}: ConnectSendTransportVideoOptions): Promise<void> => {\n try {\n let {\n videoProducer,\n producerTransport,\n islevel,\n updateMainWindow,\n updateVideoProducer,\n updateProducerTransport,\n updateUpdateMainWindow,\n } = parameters;\n\n // Produce video data using the primary transport\n if (targetOption === \"all\" || targetOption === \"remote\"){\n videoProducer = await producerTransport!.produce(videoParams);\n\n // Update main window state based on the video connection level\n if (islevel === \"2\") {\n updateMainWindow = true;\n }\n\n // Update video producer, transport, and UI state\n updateVideoProducer(videoProducer);\n updateProducerTransport(producerTransport);\n updateUpdateMainWindow(updateMainWindow);\n }\n\n // Handle local video transport regardless of primary success or \n if (targetOption === \"all\" || targetOption === \"local\") {\n try {\n await connectLocalSendTransportVideo({ videoParams, parameters });\n } catch (localError) {\n console.log(\"Error connecting local video transport:\", localError);\n }\n }\n } catch (error) {\n console.log(\"connectSendTransportVideo error\", error);\n throw error;\n }\n};\n","import type { Device, Transport, DtlsParameters } from 'mediasoup-client/lib/types';\nimport { Socket } from \"socket.io-client\";\nimport {\n ConnectSendTransportParameters,\n ConnectSendTransportType,\n} from \"../types/types\";\n\nexport interface CreateSendTransportParameters extends ConnectSendTransportParameters {\n islevel: string;\n member: string;\n socket: Socket;\n localSocket?: Socket;\n device: Device | null;\n producerTransport: Transport | null;\n localProducerTransport?: Transport | null;\n transportCreated: boolean;\n localTransportCreated?: boolean;\n updateProducerTransport: (producerTransport: Transport | null) => void;\n updateLocalProducerTransport?: (localTransport: Transport | null) => void;\n updateTransportCreated: (transportCreated: boolean) => void;\n updateLocalTransportCreated?: (localTransportCreated: boolean) => void;\n\n // mediasfu functions\n connectSendTransport: ConnectSendTransportType;\n getUpdatedAllParams: () => CreateSendTransportParameters;\n [key: string]: any;\n}\n\nexport interface CreateSendTransportOptions {\n option: \"audio\" | \"video\" | \"screen\" | \"all\";\n parameters: CreateSendTransportParameters;\n}\n\n// Export the type definition for the function\nexport type CreateSendTransportType = (options: CreateSendTransportOptions) => Promise<void>;\n\nconst createLocalSendTransport = async ({\n option,\n parameters,\n}: CreateSendTransportOptions): Promise<void> => {\n try {\n let {\n islevel,\n member,\n socket,\n localSocket,\n device,\n localProducerTransport,\n localTransportCreated,\n updateLocalProducerTransport,\n updateLocalTransportCreated,\n\n connectSendTransport,\n } = parameters;\n\n\n if (!localSocket || !localSocket.id || socket.id === localSocket.id) {\n return;\n }\n\n localSocket.emit(\n \"createWebRtcTransport\",\n { consumer: false, islevel },\n async ({ params }: { params: any }) => {\n if (params && params.error) {\n console.error(\"Error in local createWebRtcTransport:\", params.error);\n return;\n }\n\n // Create local send transport\n localProducerTransport = await device!.createSendTransport(params);\n if (updateLocalProducerTransport) {\n updateLocalProducerTransport(localProducerTransport);\n }\n\n // Handle local transport events\n localProducerTransport.on(\n \"connect\",\n async ({ dtlsParameters }: { dtlsParameters: DtlsParameters }, callback: () => void, errback: (error: Error) => void) => {\n try {\n localSocket.emit(\"transport-connect\", { dtlsParameters });\n callback();\n } catch (error) {\n errback(error as Error);\n }\n }\n );\n\n localProducerTransport.on(\n \"produce\",\n async (\n parameters: { kind: string; rtpParameters: any; appData: any },\n callback: (response: { id: string }) => void,\n errback: (error: Error) => void\n ) => {\n try {\n localSocket.emit(\n \"transport-produce\",\n {\n kind: parameters.kind,\n rtpParameters: parameters.rtpParameters,\n appData: parameters.appData,\n islevel,\n name: member,\n },\n ({ id }: { id: string }) => callback({ id })\n );\n } catch (error) {\n errback(error as Error);\n }\n }\n );\n\n localProducerTransport.on(\"connectionstatechange\", (state: string) => {\n if (state === \"failed\") {\n console.error(\"Local transport connection failed.\");\n if (localProducerTransport) {\n localProducerTransport.close();\n }\n }\n });\n\n // Mark local transport as created\n localTransportCreated = true;\n updateLocalTransportCreated?.(localTransportCreated);\n\n // connect local transport\n await connectSendTransport({\n targetOption: \"local\",\n option,\n parameters: { ...parameters, localProducerTransport: localProducerTransport },\n });\n }\n );\n } catch (error) {\n console.error(\"Error creating local send transport:\", error);\n }\n};\n\n/**\n * Creates a WebRTC send transport and sets up event handlers for the transport.\n *\n * Supports both primary and local transports with modular handling.\n *\n * @param {CreateSendTransportOptions} options - The options for creating the send transport.\n * @param {string} options.option - The type of transport to create.\n * @param {CreateSendTransportParameters} options.parameters - The parameters required for creating the transport.\n * @param {string} options.parameters.islevel - The level of the transport.\n * @param {string} options.parameters.member - The member name for the transport.\n * @param {Socket} options.parameters.socket - The primary socket instance.\n * @param {Device} options.parameters.device - The device instance.\n * @param {Transport | null} options.parameters.producerTransport - The primary producer transport object.\n * @param {boolean} options.parameters.transportCreated - The state of the primary transport creation.\n * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the primary transport object.\n * @param {(state: boolean) => void} options.parameters.updateTransportCreated - The function to update the primary transport creation state.\n * @param {Function} options.parameters.connectSendTransport - The function to connect the send transport.\n * @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.\n * @param {Socket} [options.parameters.localSocket] - The local socket instance.\n * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport object.\n * @param {boolean} [options.parameters.localTransportCreated] - The state of the local transport creation.\n * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local transport object.\n * @param {(state: boolean) => void} [options.parameters.updateLocalTransportCreated] - The function to update the local transport creation state.\n* @returns {Promise<void>} A promise that resolves when the send transport is created and configured.\n *\n * @throws Will throw an error if there is an issue creating the send transport.\n *\n * @example\n * const options = {\n * option: 'video',\n * parameters: {\n * islevel: '1',\n * member: 'John Doe',\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * device: deviceInstance,\n * producerTransport: null,\n * localProducerTransport: null,\n * transportCreated: false,\n * localTransportCreated: false,\n * updateProducerTransport: (transport) => console.log('Primary transport updated:', transport),\n * updateLocalProducerTransport: (transport) => console.log('Local transport updated:', transport),\n * updateTransportCreated: (state) => console.log('Primary transport created:', state),\n * updateLocalTransportCreated: (state) => console.log('Local transport created:', state),\n * },\n * };\n *\n * createSendTransport(options)\n * .then(() => console.log('Send transport created successfully'))\n * .catch((error) => console.error('Error creating send transport:', error));\n */\n\nexport const createSendTransport: CreateSendTransportType = async ({\n option,\n parameters,\n}: CreateSendTransportOptions): Promise<void> => {\n try {\n // Destructure parameters\n let {\n islevel,\n member,\n socket,\n device,\n producerTransport,\n transportCreated,\n updateProducerTransport,\n updateTransportCreated,\n connectSendTransport,\n } = parameters;\n\n // Get updated device and socket parameters\n const updatedParams = parameters.getUpdatedAllParams();\n device = updatedParams.device;\n socket = updatedParams.socket;\n\n try {\n // Handle local transport creation first\n await createLocalSendTransport({option, parameters});\n } catch (error) {\n console.log(\"Error creating local send transport:\", error);\n }\n\n // Emit createWebRtcTransport event to the server\n socket.emit(\n \"createWebRtcTransport\",\n { consumer: false, islevel: islevel },\n async ({ params }: { params: any }) => {\n // Check if there is an error in the response\n if (params && params.error) {\n console.error(\"Error in createWebRtcTransport:\", params.error);\n return;\n }\n\n // Create a WebRTC send transport\n producerTransport = await device!.createSendTransport(params);\n updateProducerTransport(producerTransport);\n\n // Handle 'connect' event\n producerTransport.on(\n \"connect\",\n async ({ dtlsParameters }: { dtlsParameters: DtlsParameters }, callback: () => void, errback: (error: Error) => void) => {\n try {\n socket.emit(\"transport-connect\", { dtlsParameters });\n callback();\n } catch (error) {\n errback(error as Error);\n }\n }\n );\n\n // Handle 'produce' event\n producerTransport.on(\n \"produce\",\n async (\n parameters: { kind: string; rtpParameters: any; appData: any },\n callback: (response: { id: string }) => void,\n errback: (error: Error) => void\n ) => {\n try {\n socket.emit(\n \"transport-produce\",\n {\n kind: parameters.kind,\n rtpParameters: parameters.rtpParameters,\n appData: parameters.appData,\n islevel: islevel,\n name: member,\n },\n async ({ id }: { id: string }) => {\n callback({ id });\n }\n );\n } catch (error) {\n errback(error as Error);\n }\n }\n );\n\n // Handle 'connectionstatechange' event\n producerTransport.on(\"connectionstatechange\", async (state: string) => {\n switch (state) {\n case \"connecting\":\n break;\n case \"connected\":\n break;\n case \"failed\":\n console.log(\"Transport connection failed.\");\n producerTransport!.close();\n break;\n default:\n break;\n }\n });\n\n // Update transport creation state\n transportCreated = true;\n parameters = parameters.getUpdatedAllParams();\n await connectSendTransport({\n targetOption: \"remote\",\n option,\n parameters: {\n ...parameters,\n producerTransport,\n },\n });\n updateTransportCreated(transportCreated);\n }\n );\n\n } catch (error) {\n console.log(\"Error creating send transport:\", error);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport { PrepopulateUserMediaType, PrepopulateUserMediaParameters } from \"../types/types\";\nimport type { Producer } from 'mediasoup-client/lib/types';\n\nexport interface DisconnectSendTransportAudioParameters extends PrepopulateUserMediaParameters {\n audioProducer: Producer | null;\n localAudioProducer?: Producer | null;\n socket: Socket;\n localSocket?: Socket;\n videoAlreadyOn: boolean;\n islevel: string;\n lock_screen: boolean;\n shared: boolean;\n updateMainWindow: boolean;\n hostLabel: string;\n roomName: string;\n updateAudioProducer: (audioProducer: Producer | null) => void;\n updateLocalAudioProducer?: (localAudioProducer: Producer | null) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n // mediasfu functions\n prepopulateUserMedia: PrepopulateUserMediaType;\n [key: string]: any;\n}\n\nexport interface DisconnectSendTransportAudioOptions {\n parameters: DisconnectSendTransportAudioParameters;\n}\n\n// Export the type definition for the function\nexport type DisconnectSendTransportAudioType = (options: DisconnectSendTransportAudioOptions) => Promise<void>;\n\nconst disconnectLocalSendTransportAudio = async ({\n parameters,\n}: DisconnectSendTransportAudioOptions): Promise<void> => {\n try {\n const {\n localAudioProducer,\n localSocket,\n roomName,\n updateLocalAudioProducer,\n } = parameters;\n\n if (localSocket && localSocket.id) {\n // Close the local audio producer and notify the server\n if (localAudioProducer) {\n localAudioProducer.close(); // Actual logic: pause instead of close for MediaSFU preference\n updateLocalAudioProducer?.(null);\n }\n\n localSocket.emit(\"pauseProducerMedia\", { mediaTag: \"audio\", roomName: roomName });\n } else {\n return;\n }\n } catch (error) {\n console.log(\"Error disconnecting local audio send transport:\", error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Disconnects the send transport for audio by pausing the audio producer and updating the UI accordingly.\n *\n * This function supports both a primary and a local audio producer, delegating local handling to a separate function.\n *\n * @param {DisconnectSendTransportAudioOptions} options - The options for disconnecting the send transport for audio.\n * @param {DisconnectSendTransportAudioParameters} options.parameters - The parameters for disconnecting the send transport for audio.\n * @param {Producer} options.parameters.audioProducer - The primary audio producer to disconnect.\n * @param {Producer} [options.parameters.localAudioProducer] - The local audio producer to disconnect.\n * @param {Socket} options.parameters.socket - The socket instance to use for communication.\n * @param {Socket} [options.parameters.localSocket] - The local socket instance to use for communication.\n * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if video is already on.\n * @param {string} options.parameters.islevel - The level of the user.\n * @param {boolean} options.parameters.lock_screen - Flag indicating if the screen is locked.\n * @param {boolean} options.parameters.shared - Flag indicating if the screen is shared.\n * @param {boolean} options.parameters.updateMainWindow - Flag to update the main window.\n * @param {string} options.parameters.hostLabel - The label for the host user.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {function} options.parameters.updateAudioProducer - Function to update the audio producer.\n * @param {function} [options.parameters.updateLocalAudioProducer] - Function to update the local audio producer (optional).\n * @param {function} options.parameters.updateUpdateMainWindow - Function to update the main window state.\n * @param {function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {object} options.parameters - The parameters required for disconnecting the send transport for audio.\n * @returns {Promise<void>} A promise that resolves when the send transport for audio is disconnected.\n *\n * @throws Will throw an error if the operation fails.\n *\n * @example\n * const options = {\n * parameters: {\n * audioProducer: audioProducerInstance,\n * localAudioProducer: localAudioProducerInstance,\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * videoAlreadyOn: false,\n * islevel: '1',\n * lock_screen: false,\n * shared: false,\n * updateMainWindow: true,\n * hostLabel: 'Host',\n * roomName: 'Room 1',\n * updateAudioProducer: (producer) => console.log('Updated audio producer:', producer),\n * updateLocalAudioProducer: (producer) => console.log('Updated local audio producer:', producer),\n * updateUpdateMainWindow: (state) => console.log('Main window state updated:', state),\n * prepopulateUserMedia: async ({ name, parameters }) => console.log('Prepopulating user media for', name),\n * },\n * };\n *\n * disconnectSendTransportAudio(options)\n * .then(() => console.log(\"Audio send transport disconnected successfully\"))\n * .catch((error) => console.log(\"Error disconnecting audio send transport:\", error));\n */\n\nexport const disconnectSendTransportAudio: DisconnectSendTransportAudioType = async ({\n parameters,\n}: DisconnectSendTransportAudioOptions): Promise<void> => {\n try {\n // Destructure parameters\n let {\n audioProducer,\n socket,\n videoAlreadyOn,\n islevel,\n lock_screen,\n shared,\n updateMainWindow,\n hostLabel,\n roomName,\n updateAudioProducer,\n updateUpdateMainWindow,\n\n //mediasfu functions\n prepopulateUserMedia,\n } = parameters;\n\n // Pause the primary audio producer\n if (audioProducer) {\n audioProducer.pause(); // Actual logic: pause instead of close for MediaSFU preference\n updateAudioProducer(audioProducer);\n }\n\n // Update the UI\n if (!videoAlreadyOn && islevel === \"2\") {\n if (!lock_screen && !shared) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n\n await prepopulateUserMedia({ name: hostLabel, parameters });\n\n updateMainWindow = false;\n updateUpdateMainWindow(updateMainWindow);\n }\n }\n\n // Notify the server about pausing audio producer\n socket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n });\n\n // Handle local audio transport\n try {\n await disconnectLocalSendTransportAudio({ parameters });\n } catch (localError) {\n console.log(\"Error disconnecting local audio send transport:\", localError);\n }\n } catch (error) {\n console.log(\"Error disconnecting primary audio send transport:\", error);\n }\n};\n","import type { Producer } from 'mediasoup-client/lib/types';\nimport { Socket } from \"socket.io-client\";\n\nexport interface DisconnectSendTransportScreenParameters {\n screenProducer: Producer | null;\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n updateScreenProducer: (screenProducer: Producer | null) => void;\n updateLocalScreenProducer?: (localScreenProducer: Producer | null) => void;\n\n getUpdatedAllParams: () => DisconnectSendTransportScreenParameters;\n [key: string]: any;\n}\nexport interface DisconnectSendTransportScreenOptions {\n parameters: DisconnectSendTransportScreenParameters;\n}\n\n// Export the type definition for the function\nexport type DisconnectSendTransportScreenType = (options: DisconnectSendTransportScreenOptions) => Promise<void>;\n\nconst disconnectLocalSendTransportScreen = async ({ parameters }: DisconnectSendTransportScreenOptions) : Promise<void> => {\n\n try {\n // Destructure parameters\n let {\n localScreenProducer,\n localSocket,\n roomName,\n updateLocalScreenProducer,\n } = parameters;\n\n if (localSocket && localSocket.id) {\n localScreenProducer!.close();\n updateLocalScreenProducer!(localScreenProducer);\n\n // Notify the server about closing the screen producer and pausing screen sharing\n localSocket.emit('closeScreenProducer');\n localSocket.emit('pauseProducerMedia', { mediaTag: 'screen', roomName: roomName });\n }\n } catch {\n console.log('Error disconnecting local send transport for screen');\n }\n\n}\n\n\n/**\n * Disconnects the send transport for screen sharing.\n *\n * This function closes the screen producer, updates the state, and notifies the server\n * about the closure and pausing of screen sharing.\n *\n * @param {DisconnectSendTransportScreenOptions} options - The options for disconnecting the send transport.\n * @param {Object} options.parameters - The parameters required for disconnection.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {Producer | null} options.parameters.screenProducer - The screen producer to be closed.\n * @param {Socket} options.parameters.socket - The socket connection to notify the server.\n * @param {Socket} [options.parameters.localSocket] - The local socket connection for communication.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {Function} options.parameters.updateScreenProducer - Function to update the screen producer state.\n * @param {Function} [options.parameters.updateLocalScreenProducer] - Function to update the local screen producer state.\n * @returns {Promise<void>} A promise that resolves when the disconnection process is complete.\n * @throws {Error} If an error occurs during the disconnection process.\n *\n * @example\n * const options = {\n * parameters: {\n * screenProducer: screenProducerInstance,\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * roomName: 'Room 1',\n * updateScreenProducer: (producer) => console.log('Updated screen producer:', producer),\n * updateLocalScreenProducer: (localProducer) => console.log('Updated local screen producer:', localProducer),\n * getUpdatedAllParams: () => ({\n * screenProducer: screenProducerInstance,\n * socket: socketInstance,\n * roomName: 'Room 1',\n * }),\n * },\n * };\n *\n * disconnectSendTransportScreen(options)\n * .then(() => {\n * console.log('Screen send transport disconnected successfully');\n * })\n * .catch((error) => {\n * console.error('Error disconnecting screen send transport:', error);\n * });\n */\n\nexport const disconnectSendTransportScreen = async ({ parameters }: DisconnectSendTransportScreenOptions) : Promise<void> => {\n\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams()\n\n try {\n // Destructure parameters\n let {\n screenProducer,\n socket,\n roomName,\n updateScreenProducer,\n } = parameters;\n\n // Close the screen producer and update the state\n screenProducer!.close();\n updateScreenProducer(screenProducer);\n\n // Notify the server about closing the screen producer and pausing screen sharing\n socket.emit('closeScreenProducer');\n socket.emit('pauseProducerMedia', { mediaTag: 'screen', roomName: roomName });\n\n } catch (error) {\n\n // Handle errors during the disconnection process\n if (error instanceof Error) {\n console.log('Error disconnecting send transport for screen:', error.message);\n } else {\n console.log('Error disconnecting send transport for screen:', error);\n }\n }\n\n try {\n // Disconnect the local screen producer\n await disconnectLocalSendTransportScreen({ parameters }); \n } catch {\n // Handle errors during the disconnection process\n }\n};\n","import type { Producer } from 'mediasoup-client/lib/types';\nimport { Socket } from 'socket.io-client';\nimport { ReorderStreamsType, ReorderStreamsParameters } from '../types/types';\n\nexport interface DisconnectSendTransportVideoParameters extends ReorderStreamsParameters {\n videoProducer: Producer | null;\n localVideoProducer?: Producer | null;\n socket: Socket;\n localSocket?: Socket;\n islevel: string;\n roomName: string;\n lock_screen: boolean;\n updateMainWindow: boolean;\n updateUpdateMainWindow: (state: boolean) => void;\n updateVideoProducer: (producer: Producer | null) => void;\n updateLocalVideoProducer?: (producer: Producer | null) => void;\n\n // mediasfu functions\n reorderStreams: ReorderStreamsType;\n [key: string]: any;\n}\n\nexport interface DisconnectSendTransportVideoOptions {\n parameters: DisconnectSendTransportVideoParameters;\n}\n\n// Export the type definition for the function\nexport type DisconnectSendTransportVideoType = (options: DisconnectSendTransportVideoOptions) => Promise<void>;\n\nconst disconnectLocalSendTransportVideo = async ({\n parameters,\n}: DisconnectSendTransportVideoOptions): Promise<void> => {\n try {\n const {\n localVideoProducer,\n localSocket,\n roomName,\n updateLocalVideoProducer,\n } = parameters;\n\n if (localSocket && localSocket.id) {\n // continue\n }else {\n return \n }\n\n // Close the local video producer and notify the server\n if (localVideoProducer) {\n localVideoProducer.close();\n updateLocalVideoProducer?.(null);\n }\n\n \n localSocket.emit('pauseProducerMedia', { mediaTag: 'video', roomName: roomName });\n \n } catch (error) {\n console.error('Error disconnecting local video send transport:', error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Disconnects the send transport for video, closes the video producer, and updates the state.\n *\n * This function supports both a primary and a local video producer, delegating local handling to a separate function.\n *\n * @param {DisconnectSendTransportVideoOptions} options - The options for disconnecting the send transport.\n * @param {DisconnectSendTransportVideoParameters} options.parameters - The parameters required for disconnecting the send transport.\n * @param {Producer | null} options.parameters.videoProducer - The primary video producer object.\n * @param {Producer | null} [options.parameters.localVideoProducer] - The local video producer object (optional).\n * @param {Socket} options.parameters.socket - The primary socket object.\n * @param {Socket} [options.parameters.localSocket] - The local socket object (optional).\n * @param {string} options.parameters.islevel - The participant's level.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {boolean} options.parameters.updateMainWindow - The flag to update the main window.\n * @param {boolean} options.parameters.lock_screen - The flag to lock the screen.\n * @param {Function} options.parameters.updateUpdateMainWindow - The function to update the main window state.\n * @param {Function} options.parameters.updateVideoProducer - The function to update the video producer state.\n * @param {Function} [options.parameters.updateLocalVideoProducer] - The function to update the local video producer state (optional).\n * @param {ReorderStreamsType} options.parameters.reorderStreams - The function to reorder streams.\n * @param {Function} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport state (optional).\n * @param {Function} [options.parameters.updateProducerTransport] - The function to update the producer transport state (optional).\n * \n * @returns {Promise<void>} A promise that resolves when the disconnection process is complete.\n * \n * @throws {Error} Throws an error if the disconnection process fails.\n *\n * @example\n * const options = {\n * parameters: {\n * videoProducer: videoProducerInstance,\n * localVideoProducer: localVideoProducerInstance,\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * islevel: '2',\n * roomName: 'Room A',\n * updateMainWindow: false,\n * lock_screen: false,\n * updateUpdateMainWindow: (state) => console.log('Main window updated:', state),\n * updateVideoProducer: (producer) => console.log('Video producer updated:', producer),\n * updateLocalVideoProducer: (producer) => console.log('Local video producer updated:', producer),\n * reorderStreams: reorderStreamsFunction,\n * },\n * };\n *\n * disconnectSendTransportVideo(options)\n * .then(() => console.log('Video send transport disconnected successfully'))\n * .catch((error) => console.error('Error disconnecting video send transport:', error));\n */\n\nexport const disconnectSendTransportVideo: DisconnectSendTransportVideoType = async ({\n parameters,\n}: DisconnectSendTransportVideoOptions): Promise<void> => {\n try {\n let {\n videoProducer,\n socket,\n islevel,\n roomName,\n updateMainWindow,\n lock_screen,\n updateUpdateMainWindow,\n updateVideoProducer,\n reorderStreams,\n } = parameters;\n\n // Close the primary video producer and notify the server\n if (videoProducer) {\n videoProducer.close();\n updateVideoProducer(null);\n }\n\n socket.emit('pauseProducerMedia', { mediaTag: 'video', roomName: roomName });\n\n // Update the UI based on the participant's level and screen lock status\n if (islevel === '2') {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n }\n\n if (lock_screen) {\n await reorderStreams({ add: true, screenChanged: true, parameters });\n } else {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n\n // Handle local video transport regardless of primary success or failure\n try {\n await disconnectLocalSendTransportVideo({ parameters });\n } catch (localError) {\n console.error('Error disconnecting local video send transport:', localError);\n }\n } catch (error) {\n // Handle errors during the disconnection process\n if (error instanceof Error) {\n console.log('Error disconnecting send transport for video:', error.message);\n } else {\n console.log('Error disconnecting send transport for video:', error);\n }\n }\n};\n","import {\n Stream, Participant, Transport, PrepopulateUserMediaParameters, PrepopulateUserMediaType, RePortParameters, RePortType,\n ProcessConsumerTransportsParameters, ProcessConsumerTransportsType, ResumePauseStreamsParameters, ResumePauseStreamsType, ReadjustParameters, ReadjustType, AddVideosGridType, AddVideosGridParameters, GetEstimateType, CheckGridType, ResumePauseAudioStreamsParameters, ResumePauseAudioStreamsType, GetEstimateParameters,\n EventType\n} from \"../types/types\";\n\nexport interface DispStreamsParameters extends PrepopulateUserMediaParameters, RePortParameters, ProcessConsumerTransportsParameters, ResumePauseStreamsParameters, ReadjustParameters, ResumePauseAudioStreamsParameters, GetEstimateParameters, AddVideosGridParameters {\n consumerTransports: Transport[];\n streamNames: Stream[];\n audStreamNames: Stream[];\n participants: Participant[];\n ref_participants: Participant[];\n recordingDisplayType: 'video' | 'media' | 'all';\n recordingVideoOptimized: boolean;\n meetingDisplayType: string;\n meetingVideoOptimized: boolean;\n currentUserPage: number;\n hostLabel: string;\n mainHeightWidth: number;\n prevMainHeightWidth: number;\n prevDoPaginate: boolean;\n doPaginate: boolean;\n firstAll: boolean;\n shared: boolean;\n shareScreenStarted: boolean;\n shareEnded: boolean;\n oldAllStreams: (Stream | Participant)[];\n updateMainWindow: boolean;\n remoteProducerId?: string;\n activeNames: string[];\n dispActiveNames: string[];\n p_dispActiveNames: string[];\n nForReadjustRecord: number;\n first_round: boolean;\n lock_screen: boolean;\n chatRefStreams: (Stream | Participant)[];\n eventType: EventType;\n islevel: string;\n localStreamVideo: MediaStream | null;\n\n breakOutRoomStarted: boolean;\n breakOutRoomEnded: boolean;\n keepBackground: boolean;\n virtualStream: MediaStream | null;\n\n updateActiveNames: (names: string[]) => void;\n updateDispActiveNames: (names: string[]) => void;\n updateLStreams: (streams: (Stream | Participant)[]) => void;\n updateChatRefStreams: (streams: (Stream | Participant)[]) => void;\n updateNForReadjustRecord: (n: number) => void;\n updateUpdateMainWindow: (value: boolean) => void;\n updateShowMiniView: (value: boolean) => void;\n\n // mediasfu functions\n prepopulateUserMedia: PrepopulateUserMediaType;\n rePort: RePortType;\n processConsumerTransports: ProcessConsumerTransportsType;\n resumePauseStreams: ResumePauseStreamsType;\n readjust: ReadjustType;\n addVideosGrid: AddVideosGridType;\n getEstimate: GetEstimateType;\n checkGrid: CheckGridType;\n resumePauseAudioStreams: ResumePauseAudioStreamsType;\n\n getUpdatedAllParams: () => DispStreamsParameters;\n [key: string]: any;\n}\n\nexport interface DispStreamsOptions {\n lStreams: (Stream | Participant)[];\n ind: number;\n auto?: boolean;\n ChatSkip?: boolean;\n forChatCard?: any;\n forChatID?: any;\n parameters: DispStreamsParameters;\n breakRoom?: number;\n inBreakRoom?: boolean;\n}\n\n// Export the type definition for the function\nexport type DispStreamsType = (options: DispStreamsOptions) => Promise<void>;\n\n/**\n * Function to display streams based on various parameters and conditions.\n *\n * @param {DispStreamsOptions} options - The options object.\n * @param {Array} options.lStreams - List of streams to display.\n * @param {number} options.ind - Index of the current stream.\n * @param {boolean} [options.auto=false] - Flag to indicate if the function should run automatically.\n * @param {boolean} [options.ChatSkip=false] - Flag to indicate if chat should be skipped.\n * @param {string|null} [options.forChatID=null] - ID for chat reference.\n * @param {DispStreamsParameters} options.parameters - Parameters object containing various settings and functions.\n * @param {number} [options.breakRoom=-1] - Break room number.\n * @param {boolean} [options.inBreakRoom=false] - Flag to indicate if in break room.\n *\n * @returns {Promise<void>} A promise that resolves when the function completes.\n *\n * @throws Will log an error if an issue occurs during the display of streams.\n *\n * @example\n * const options = {\n * lStreams: [stream1, stream2],\n * ind: 0,\n * auto: true,\n * ChatSkip: false,\n * forChatID: 'chat123',\n * parameters: {\n * consumerTransports: [],\n * streamNames: [],\n * audStreamNames: [],\n * participants: [],\n * ref_participants: [],\n * recordingDisplayType: 'video',\n * recordingVideoOptimized: false,\n * meetingDisplayType: 'video',\n * meetingVideoOptimized: false,\n * currentUserPage: 1,\n * hostLabel: 'Host',\n * mainHeightWidth: 800,\n * prevMainHeightWidth: 600,\n * prevDoPaginate: false,\n * doPaginate: true,\n * firstAll: true,\n * shared: false,\n * shareScreenStarted: false,\n * shareEnded: false,\n * oldAllStreams: [],\n * updateMainWindow: true,\n * remoteProducerId: null,\n * activeNames: [],\n * dispActiveNames: [],\n * p_dispActiveNames: [],\n * nForReadjustRecord: 0,\n * first_round: false,\n * lock_screen: false,\n * chatRefStreams: [],\n * eventType: 'meeting',\n * islevel: '1',\n * localStreamVideo: null,\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: false,\n * keepBackground: false,\n * virtualStream: null,\n * updateActiveNames: (names) => console.log('Updated active names:', names),\n * updateDispActiveNames: (names) => console.log('Updated displayed active names:', names),\n * updateLStreams: (streams) => console.log('Updated limited streams:', streams),\n * updateChatRefStreams: (streams) => console.log('Updated chat reference streams:', streams),\n * updateNForReadjustRecord: (n) => console.log('Updated n for readjustment:', n),\n * updateUpdateMainWindow: (state) => console.log('Main window updated:', state),\n * updateShowMiniView: (value) => console.log('Mini view updated:', value),\n * prepopulateUserMedia: async () => { console.log('your logic')},\n * rePort: async () => { console.log('your logic')},\n * processConsumerTransports: async () => { console.log('your logic')},\n * resumePauseStreams: async () => { console.log('your logic')},\n * readjust: async () => { console.log('your logic')},\n * addVideosGrid: async () => { console.log('your logic')},\n * getEstimate: async () => { console.log('your logic')},\n * checkGrid: async () => { console.log('your logic')},\n * resumePauseAudioStreams: async () => { console.log('your logic')},\n * getUpdatedAllParams: () => { console.log('your logic')},\n * },\n * breakRoom: 1,\n * inBreakRoom: false,\n * };\n * \n * dispStreams(options)\n * .then(() => {\n * console.log('Streams displayed successfully');\n * })\n * .catch((error) => {\n * console.error('Error displaying streams:', error);\n * });\n */\n\nexport async function dispStreams({\n lStreams,\n ind,\n auto = false,\n ChatSkip = false,\n forChatID = null,\n parameters,\n breakRoom = -1,\n inBreakRoom = false,\n}: DispStreamsOptions): Promise<void> {\n // Function to display streams\n\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n consumerTransports,\n streamNames,\n audStreamNames,\n participants,\n ref_participants,\n recordingDisplayType,\n recordingVideoOptimized,\n meetingDisplayType,\n meetingVideoOptimized,\n currentUserPage,\n hostLabel,\n mainHeightWidth,\n prevMainHeightWidth,\n prevDoPaginate,\n doPaginate,\n firstAll,\n shared,\n shareScreenStarted,\n shareEnded,\n oldAllStreams,\n updateMainWindow,\n remoteProducerId,\n activeNames,\n dispActiveNames,\n p_dispActiveNames,\n nForReadjustRecord,\n first_round,\n lock_screen,\n chatRefStreams,\n eventType,\n islevel,\n localStreamVideo,\n\n breakOutRoomStarted,\n breakOutRoomEnded,\n keepBackground,\n virtualStream,\n\n updateActiveNames,\n updateDispActiveNames,\n updateLStreams,\n updateChatRefStreams,\n updateNForReadjustRecord,\n updateUpdateMainWindow,\n updateShowMiniView,\n\n prepopulateUserMedia,\n rePort,\n processConsumerTransports,\n resumePauseStreams,\n readjust,\n addVideosGrid,\n checkGrid,\n getEstimate,\n resumePauseAudioStreams,\n } = parameters;\n\n let proceed = true;\n\n let lStreams_ = lStreams.filter((stream) => stream.producerId !== \"youyou\" && stream.producerId !== \"youyouyou\");\n\n lStreams_ = lStreams_.filter((stream) => stream.id !== \"youyou\" && stream.id !== \"youyouyou\" && stream.name !== \"youyou\" && stream.name !== \"youyouyou\");\n\n if (eventType === \"chat\") {\n proceed = true;\n } else if (ind === 0 || (islevel !== \"2\" && currentUserPage === ind)) {\n proceed = false;\n\n //get the name of every participant in lStreams if stream !null and assign it to activeNames\n lStreams_.forEach((stream) => {\n let checker = false;\n let check_level = 0;\n\n if (recordingDisplayType === \"video\") {\n if (recordingVideoOptimized) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n checker = true;\n check_level = 0;\n }\n } else {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\")) {\n checker = true;\n check_level = 1;\n }\n }\n } else if (recordingDisplayType === \"media\") {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\")) {\n checker = true;\n check_level = 1;\n }\n } else {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name !== null &&\n stream.name != \"\")) {\n checker = true;\n check_level = 2;\n }\n }\n\n let participant;\n\n if (checker) {\n // find the participant with the same videoID as the stream\n if (check_level == 0) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n } else if (check_level == 1) {\n // find for either producerId or name\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n if (!participant) {\n if (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") {\n participant = audStreamNames.find(\n (obj) => obj.producerId === stream.audioID\n );\n if (!participant) {\n participant = ref_participants.find(\n (obj) => obj.audioID === stream.audioID\n );\n }\n }\n }\n } else if (check_level == 2) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n if (!participant) {\n if (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") {\n participant = audStreamNames.find(\n (obj) => obj.producerId === stream.audioID\n );\n if (!participant) {\n participant = ref_participants.find(\n (obj) => obj.audioID === stream.audioID\n );\n }\n }\n }\n if (!participant) {\n if (Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name !== null &&\n stream.name != \"\") {\n participant = ref_participants.find(\n (obj) => obj.name === stream.name\n );\n }\n }\n }\n\n // push the name of the participant to activeNames\n if (participant) {\n // if activeNames does not include the name of the participant, push it\n if (participant.name && !activeNames.includes(participant.name)) {\n activeNames.push(participant.name);\n }\n }\n }\n });\n\n updateActiveNames(activeNames);\n\n lStreams_.forEach((stream) => {\n let disp_checker = false;\n let disp_check_level = 0;\n\n if (meetingDisplayType == \"video\") {\n if (meetingVideoOptimized) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n disp_checker = true;\n disp_check_level = 0;\n }\n } else {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\")) {\n disp_checker = true;\n disp_check_level = 1;\n }\n }\n } else if (meetingDisplayType == \"media\") {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\")) {\n disp_checker = true;\n disp_check_level = 1;\n }\n } else {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name !== null &&\n stream.name != \"\")) {\n disp_checker = true;\n disp_check_level = 2;\n }\n }\n\n let participant_;\n\n if (disp_checker) {\n if (disp_check_level == 0) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant_ = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n } else if (disp_check_level == 1) {\n // find for either producerId or name\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant_ = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n if (!participant_) {\n if (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") {\n participant_ = audStreamNames.find(\n (obj) => obj.producerId === stream.audioID\n );\n if (!participant_) {\n participant_ = ref_participants.find(\n (obj) => obj.audioID === stream.audioID\n );\n }\n }\n }\n } else if (disp_check_level == 2) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant_ = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n if (!participant_) {\n if (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") {\n participant_ = audStreamNames.find(\n (obj) => obj.producerId === stream.audioID\n );\n if (!participant_) {\n participant_ = ref_participants.find(\n (obj) => obj.audioID === stream.audioID\n );\n }\n }\n }\n if (!participant_) {\n if (Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name !== null &&\n stream.name != \"\") {\n participant_ = ref_participants.find(\n (obj) => obj.name === stream.name\n );\n }\n }\n }\n }\n\n // push the name of the participant to activeNames\n if (participant_) {\n // if dispActiveNames does not include the name of the participant, push it\n if (participant_.name && !dispActiveNames.includes(participant_.name)) {\n dispActiveNames.push(participant_.name);\n if (!p_dispActiveNames.includes(participant_.name)) {\n proceed = true;\n }\n }\n }\n });\n\n updateDispActiveNames(dispActiveNames);\n\n if (lStreams_.length < 1 && (shareScreenStarted || shared || !firstAll)) {\n proceed = true;\n }\n\n if (shareScreenStarted || shared) {\n // Additional logic\n } else {\n if (prevMainHeightWidth !== mainHeightWidth) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n }\n }\n\n nForReadjustRecord = activeNames.length;\n updateNForReadjustRecord(nForReadjustRecord);\n }\n\n if (!proceed && auto) {\n if (updateMainWindow && !lock_screen && !shared) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } else if (!first_round) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n }\n\n if (ind === 0 && eventType !== \"chat\") {\n await rePort({ parameters });\n }\n return;\n }\n\n if (eventType == \"broadcast\") {\n lStreams = lStreams_;\n updateLStreams(lStreams);\n } else if (eventType == \"chat\") {\n if (forChatID != null) {\n lStreams = chatRefStreams;\n updateLStreams(lStreams);\n } else {\n updateShowMiniView(false);\n\n if (islevel != \"2\") {\n let host = participants.find((obj) => {\n return obj.islevel === \"2\";\n });\n\n if (host) {\n let streame;\n\n remoteProducerId = host.videoID as string;\n // get the stream from allvideostream with the same id as remoteProducerId\n\n if (islevel == \"2\") {\n host.stream =\n keepBackground && virtualStream\n ? virtualStream\n : localStreamVideo;\n } else {\n streame = oldAllStreams.find(\n (streame) => streame.producerId == remoteProducerId\n );\n // add streame to lStreams\n if (streame) {\n //remove any stream with name of host.name\n lStreams = lStreams.filter((stream) => {\n return stream.name != host.name;\n });\n\n lStreams.push(streame);\n }\n }\n }\n }\n\n //remove youyou and youyouyou from lStreams and then put it at the end\n let youyou = lStreams.find((obj) => {\n return obj.producerId === \"youyou\" || obj.producerId === \"youyouyou\";\n });\n\n lStreams = lStreams.filter((stream) => {\n return (\n stream.producerId != \"youyou\" && stream.producerId != \"youyouyou\"\n );\n });\n\n if (youyou) {\n lStreams.push(youyou);\n }\n\n chatRefStreams = lStreams;\n\n updateLStreams(lStreams);\n updateChatRefStreams(chatRefStreams);\n }\n }\n\n let refLength = lStreams.length;\n\n const [, rows, cols] = getEstimate({ n: refLength, parameters });\n let result = await checkGrid({ rows, cols, actives: refLength }) || [false, 0, 0, 0, 0, 0, 0];\n let [removeAltGrid, numtoaddd, numRows, numCols, , actualRows, lastrowcols] = result;\n\n if (ChatSkip && eventType === \"chat\") {\n numRows = 1;\n numCols = 1;\n actualRows = 1;\n }\n\n await readjust({ n: lStreams.length, state: ind, parameters });\n\n let mainGridStreams = lStreams.slice(0, numtoaddd);\n let altGridStreams = lStreams.slice(numtoaddd);\n\n if (doPaginate || prevDoPaginate !== doPaginate || shared || shareScreenStarted || shareEnded) {\n let lStreams_alt = lStreams_;\n await processConsumerTransports({ consumerTransports, lStreams_: lStreams_alt, parameters });\n\n\n try {\n if (breakOutRoomStarted && !breakOutRoomEnded) {\n await resumePauseAudioStreams({ inBreakRoom, breakRoom, parameters });\n } else {\n await resumePauseStreams({ parameters });\n }\n } catch {\n // console.log('Error in resumePauseAudioStreams:', error);\n }\n\n try {\n if (!breakOutRoomStarted || (breakOutRoomStarted && breakOutRoomEnded)) {\n await resumePauseStreams({ parameters });\n }\n } catch { \n // console.log('Error in resumePauseStreams:', error\n }\n\n if (shareEnded) {\n shareEnded = false;\n }\n }\n\n if (ChatSkip && eventType === \"chat\") {\n await addVideosGrid({\n mainGridStreams,\n altGridStreams,\n numtoadd: numtoaddd - 1,\n numRows,\n numCols,\n actualRows,\n lastrowcols,\n removeAltGrid,\n parameters,\n });\n } else {\n await addVideosGrid({\n mainGridStreams,\n altGridStreams,\n numtoadd: numtoaddd,\n numRows,\n numCols,\n actualRows,\n lastrowcols,\n removeAltGrid,\n parameters,\n });\n }\n\n if (updateMainWindow && !lock_screen && !shared) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } else if (!first_round) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n }\n\n if (ind === 0 && eventType !== \"chat\") {\n await rePort({ parameters });\n }\n}\n","import { Participant, Stream, DispStreamsType, DispStreamsParameters } from '../types/types';\n\nexport interface GeneratePageContentParameters extends DispStreamsParameters {\n paginatedStreams: (Participant | Stream)[][];\n currentUserPage: number;\n updateMainWindow: boolean;\n updateCurrentUserPage: (page: number) => void;\n updateUpdateMainWindow: (flag: boolean) => void;\n\n // mediasfu functions\n dispStreams: DispStreamsType;\n getUpdatedAllParams: () => GeneratePageContentParameters;\n [key: string]: any;\n}\n\nexport interface GeneratePageContentOptions {\n page: number | string;\n parameters: GeneratePageContentParameters;\n breakRoom?: number;\n inBreakRoom?: boolean;\n}\n\n// Export the type definition for the function\nexport type GeneratePageContentType = (options: GeneratePageContentOptions) => Promise<void>;\n\n/**\n * Generates the content for a specific page.\n *\n * @param {GeneratePageContentOptions} options - The options for generating page content.\n * @param {number | string} options.page - The page number to generate content for.\n * @param {GeneratePageContentParameters} options.parameters - The parameters required for generating content.\n * @param {Array} options.parameters.paginatedStreams - The streams to be paginated.\n * @param {number} options.parameters.currentUserPage - The current page of the user.\n * @param {Function} options.parameters.updateMainWindow - Function to update the main window flag.\n * @param {Function} options.parameters.updateCurrentUserPage - Function to update the current user page.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window update flag.\n * @param {Function} options.parameters.dispStreams - Function to display streams for the specified page.\n * @param {number} [options.breakRoom=-1] - The break room identifier.\n * @param {boolean} [options.inBreakRoom=false] - Flag indicating if the user is in a break room.\n * \n * @returns {Promise<void>} A promise that resolves when the content generation is complete.\n * \n * @throws {Error} Throws an error if content generation fails.\n * \n * @example\n * const options = {\n * page: 1,\n * parameters: {\n * paginatedStreams: [[stream1, stream2], [stream3, stream4]], // Example paginated streams\n * currentUserPage: 0,\n * updateMainWindow: true,\n * updateCurrentUserPage: (page) => console.log('Current user page updated to:', page),\n * updateUpdateMainWindow: (flag) => console.log('Main window update flag:', flag),\n * dispStreams: async ({ lStreams, ind }) => {\n * console.log(`Displaying streams for page ${ind}:`, lStreams);\n * },\n * },\n * breakRoom: 1,\n * inBreakRoom: false,\n * };\n * \n * generatePageContent(options)\n * .then(() => {\n * console.log('Page content generated successfully');\n * })\n * .catch((error) => {\n * console.error('Error generating page content:', error);\n * });\n */\n\nexport async function generatePageContent({\n page,\n parameters,\n breakRoom = -1,\n inBreakRoom = false,\n}: GeneratePageContentOptions): Promise<void> {\n try {\n // Destructure parameters\n let {\n paginatedStreams,\n currentUserPage,\n updateMainWindow,\n\n updateCurrentUserPage,\n updateUpdateMainWindow,\n\n //mediasfu functions\n dispStreams,\n } = parameters;\n\n // Convert page to an integer\n page = typeof page === \"string\" ? parseInt(page) : page;\n\n // Update current user page\n currentUserPage = page;\n updateCurrentUserPage(currentUserPage);\n\n // Update main window flag\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n\n // Display streams for the specified page\n await dispStreams({\n lStreams: paginatedStreams[page],\n ind: page,\n parameters,\n breakRoom,\n inBreakRoom,\n });\n } catch (error) {\n // Handle errors during content generation\n if (error instanceof Error) {\n console.log(\"Error generating page content:\", error.message);\n } else {\n console.log(\"Error generating page content:\", error);\n }\n }\n}\n","import { Stream, Participant } from \"../types/types\";\nexport interface GetVideosOptions {\n participants: Participant[];\n allVideoStreams: (Stream | Participant)[];\n oldAllStreams: (Stream | Participant)[];\n adminVidID?: string;\n updateAllVideoStreams: (streams: (Stream | Participant)[]) => void;\n updateOldAllStreams: (streams: (Stream | Participant)[]) => void;\n}\n\n// Export the type definition for the function\nexport type GetVideosType = (options: GetVideosOptions) => Promise<void>;\n\n\n/**\n * Asynchronously processes and updates video streams by filtering out the admin's video stream.\n *\n * @param {GetVideosOptions} options - The options for getting videos.\n * @param {Participant[]} options.participants - The list of participants.\n * @param {(Stream | Participant)[]} options.allVideoStreams - The list of all video streams.\n * @param {(Stream | Participant)[]} options.oldAllStreams - The list of old video streams.\n * @param {string} [options.adminVidID] - The ID of the admin's video stream.\n * @param {Function} options.updateAllVideoStreams - Function to update the state variable for all video streams.\n * @param {Function} options.updateOldAllStreams - Function to update the state variable for old video streams.\n *\n * @returns {Promise<void>} A promise that resolves when the video streams have been processed and updated.\n *\n * @throws {Error} Throws an error if an issue occurs while processing the streams.\n *\n * @example\n * const options = {\n * participants: participantList,\n * allVideoStreams: allStreams,\n * oldAllStreams: oldStreams,\n * adminVidID: 'admin-video-id',\n * updateAllVideoStreams: (streams) => {\n * console.log('All video streams updated:', streams);\n * },\n * updateOldAllStreams: (streams) => {\n * console.log('Old video streams updated:', streams);\n * },\n * };\n *\n * getVideos(options)\n * .then(() => {\n * console.log('Video streams processed successfully');\n * })\n * .catch((error) => {\n * console.error('Error processing video streams:', error);\n * });\n */\n\nexport async function getVideos({\n participants,\n allVideoStreams,\n oldAllStreams,\n adminVidID,\n updateAllVideoStreams,\n updateOldAllStreams,\n}: GetVideosOptions): Promise<void> {\n\n try {\n\n // Filter out the admin's video stream and update state variables\n let admin = participants.filter(\n (participant) => participant.islevel === \"2\"\n );\n\n if (admin.length > 0) {\n adminVidID = admin[0].videoID;\n\n if (adminVidID != null && adminVidID !== \"\") {\n let oldAllStreams_: (Stream | Participant)[] = [];\n\n // Check if the length of oldAllStreams is greater than 0\n if (oldAllStreams.length > 0) {\n oldAllStreams_ = oldAllStreams;\n }\n\n // Filter out admin's video stream from oldAllStreams\n oldAllStreams = allVideoStreams.filter(\n (streame) => streame.producerId === adminVidID\n );\n\n // If no admin's video stream found, revert to the previous state\n if (oldAllStreams.length < 1) {\n oldAllStreams = oldAllStreams_;\n }\n\n // Update the state variable for old video streams\n updateOldAllStreams(oldAllStreams);\n\n // Filter out admin's video stream from allVideoStreams\n allVideoStreams = allVideoStreams.filter(\n (streame) => streame.producerId !== adminVidID\n );\n\n // Update the state variable for all video streams\n updateAllVideoStreams(allVideoStreams);\n }\n }\n } catch (error) {\n // Handle errors during the process of updating video streams\n console.log(\"Error updating video streams:\", (error as Error).message);\n // throw error;\n }\n}\n","import { Stream, Participant } from \"../types/types\";\n\nexport interface MixStreamsOptions {\n alVideoStreams: (Stream | Participant)[];\n non_alVideoStreams: Participant[];\n ref_participants: (Stream | Participant)[];\n}\n\n// Export the type definition for the function\nexport type MixStreamsType = (options: MixStreamsOptions) => Promise<(Stream | Participant)[]>;\n\n/**\n * Mixes video and audio streams and participants based on specified parameters.\n *\n * @param {MixStreamsOptions} options - The options for mixing streams.\n * @param {Array} options.alVideoStreams - The list of audio and video streams to mix.\n * @param {Array} options.non_alVideoStreams - The list of non-audio and video streams to mix.\n * @param {Array} options.ref_participants - The list of reference participants to mix.\n * @returns {Promise<Array>} A promise that resolves with the mixed streams.\n * @throws Will throw an error if there is an issue mixing the streams.\n * @example\n * ```typescript\n * const mixedStreams = await mixStreams({\n * alVideoStreams: [stream1, stream2],\n * non_alVideoStreams: [participant1, participant2],\n * ref_participants: [participant1, participant2],\n * });\n * console.log('Mixed streams:', mixedStreams);\n * ```\n */\n\n\nexport async function mixStreams({\n alVideoStreams,\n non_alVideoStreams,\n ref_participants,\n}: MixStreamsOptions): Promise<(Stream | Participant)[]> {\n try {\n\n const mixedStreams: (Stream | Participant)[] = [];\n\n // Find \"youyou\" or \"youyouyou\" stream\n const youyouStream = alVideoStreams.find(\n (obj) => obj.producerId === \"youyou\" || obj.producerId === \"youyouyou\"\n );\n\n let remainingAlVideoStreams = alVideoStreams.filter(\n (obj) => obj.producerId !== \"youyou\" && obj.producerId !== \"youyouyou\"\n );\n\n // Separate unmuted and muted streams\n const unmutedAlVideoStreams = remainingAlVideoStreams.filter((obj) => {\n const participant = ref_participants.find(\n (p) => p.videoID === obj.producerId\n );\n return !obj.muted && participant && participant.muted === false;\n });\n\n const mutedAlVideoStreams = remainingAlVideoStreams.filter((obj) => {\n const participant = ref_participants.find(\n (p) => p.videoID === obj.producerId\n );\n return obj.muted || (participant && participant.muted === true);\n });\n\n const nonAlVideoStreams = [...non_alVideoStreams]; // Create a copy of non_alVideoStreams\n\n // Add unmutedAlVideoStreams to mixedStreams\n mixedStreams.push(...unmutedAlVideoStreams);\n\n // Interleave the mutedAlVideoStreams and nonAlVideoStreams\n let nonAlIndex = 0;\n for (let i = 0; i < mutedAlVideoStreams.length; i++) {\n if (nonAlIndex < nonAlVideoStreams.length) {\n mixedStreams.push(nonAlVideoStreams[nonAlIndex]);\n nonAlIndex++;\n }\n mixedStreams.push(mutedAlVideoStreams[i]);\n }\n\n // Handle remaining nonAlVideoStreams (if any)\n for (let i = nonAlIndex; i < nonAlVideoStreams.length; i++) {\n mixedStreams.push(nonAlVideoStreams[i]);\n }\n\n // Unshift 'youyou' or 'youyouyou' stream to mixedStreams\n if (youyouStream) {\n mixedStreams.unshift(youyouStream);\n }\n\n return mixedStreams;\n } catch (error) {\n // Handle errors during the process of mixing streams\n console.log(\"Error mixing streams:\", (error as Error).message);\n throw error;\n }\n}\n","import { ReorderStreamsType, ReorderStreamsParameters, EventType } from \"../types/types\";\n\nexport interface OnScreenChangesParameters extends ReorderStreamsParameters {\n eventType: EventType;\n shareScreenStarted: boolean;\n shared: boolean;\n addForBasic: boolean;\n updateAddForBasic: (value: boolean) => void;\n itemPageLimit: number;\n updateItemPageLimit: (value: number) => void;\n updateMainHeightWidth: (value: number) => void;\n\n //mediasfu functions\n reorderStreams: ReorderStreamsType;\n [key: string]: any;\n}\n\nexport interface OnScreenChangesOptions {\n changed?: boolean;\n parameters: OnScreenChangesParameters;\n}\n\n// Export the type definition for the function\nexport type OnScreenChangesType = (options: OnScreenChangesOptions) => Promise<void>;\n\n/**\n * Handles changes in screen events such as broadcast, chat, and conference.\n * \n * @param {OnScreenChangesOptions} options - The options for handling screen changes.\n * @param {boolean} options.changed - Indicates if the screen has changed.\n * @param {object} options.parameters - The parameters for handling screen changes.\n * @param {string} options.parameters.eventType - The type of event (e.g., \"broadcast\", \"chat\", \"conference\").\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {boolean} options.parameters.addForBasic - Flag to add basic controls.\n * @param {function} options.parameters.updateMainHeightWidth - Function to update the main height and width.\n * @param {function} options.parameters.updateAddForBasic - Function to update the addForBasic flag.\n * @param {number} options.parameters.itemPageLimit - The limit for item pages.\n * @param {function} options.parameters.updateItemPageLimit - Function to update the item page limit.\n * @param {function} options.parameters.reorderStreams - Function to reorder streams.\n * \n * @returns {Promise<void>} A promise that resolves when the screen changes have been handled.\n * \n * @throws {Error} Throws an error if there is an issue handling screen changes.\n * \n * @example\n * ```typescript\n * await onScreenChanges({\n * changed: true,\n * parameters: {\n * eventType: 'conference',\n * shareScreenStarted: false,\n * shared: false,\n * addForBasic: false,\n * updateMainHeightWidth: (height) => console.log('Updated height:', height),\n * updateAddForBasic: (value) => console.log('Updated addForBasic:', value),\n * itemPageLimit: 2,\n * updateItemPageLimit: (limit) => console.log('Updated item page limit:', limit),\n * reorderStreams: async (options) => console.log('Reordered streams with options:', options),\n * },\n * });\n * ```\n */ \n\nexport async function onScreenChanges({ changed, parameters }: OnScreenChangesOptions): Promise<void> {\n try {\n // Destructure parameters\n let {\n eventType,\n shareScreenStarted,\n shared,\n addForBasic,\n updateMainHeightWidth,\n updateAddForBasic,\n itemPageLimit,\n updateItemPageLimit,\n\n //mediasfu functions\n reorderStreams,\n } = parameters;\n\n // Remove element with id 'controlButtons'\n addForBasic = false;\n updateAddForBasic(addForBasic);\n\n if (eventType === \"broadcast\" || eventType === \"chat\") {\n addForBasic = true;\n updateAddForBasic(addForBasic);\n\n itemPageLimit = eventType === \"broadcast\" ? 1 : 2;\n updateItemPageLimit(itemPageLimit);\n updateMainHeightWidth(eventType === \"broadcast\" ? 100 : 0);\n } else {\n if (eventType === \"conference\" && !(shareScreenStarted || shared)) {\n updateMainHeightWidth(0);\n }\n }\n\n // Update the mini cards grid\n await reorderStreams({ add: false, screenChanged: changed, parameters });\n } catch (error) {\n // Handle errors during the process of handling screen changes\n console.log(\"Error handling screen changes:\", (error as Error).message);\n // throw error;\n }\n}\n","// Stub export for prepopulateUserMedia\n// This is a React component in the original and not needed for the shared package\n\nexport interface PrepopulateUserMediaParameters {\n [key: string]: any;\n}\n\nexport interface PrepopulateUserMediaOptions {\n name: string;\n parameters: PrepopulateUserMediaParameters;\n}\n\nexport type PrepopulateUserMediaType = (options: PrepopulateUserMediaOptions) => Promise<void>;\n\nexport const prepopulateUserMedia: PrepopulateUserMediaType = async () => {\n // Stub implementation - actual logic handled in framework-specific packages\n console.warn('prepopulateUserMedia called on shared package - should be implemented in framework package');\n};\n","import { Stream, Participant, Transport, SleepType } from \"../types/types\";\n\nexport interface ProcessConsumerTransportsParameters {\n remoteScreenStream: Stream[];\n oldAllStreams: (Stream | Participant)[];\n newLimitedStreams: (Stream | Participant)[];\n\n // mediasfu functions\n sleep: SleepType;\n getUpdatedAllParams: () => ProcessConsumerTransportsParameters;\n [key: string]: any;\n}\n\nexport interface ProcessConsumerTransportsOptions {\n consumerTransports: Transport[];\n lStreams_: (Stream | Participant)[];\n parameters: ProcessConsumerTransportsParameters;\n}\n\n// Export the type definition for the function\nexport type ProcessConsumerTransportsType = (options: ProcessConsumerTransportsOptions) => Promise<void>;\n\n/**\n * Processes consumer transports by pausing and resuming them based on certain conditions.\n *\n * @param {Object} options - The options for processing consumer transports.\n * @param {Array} options.consumerTransports - The list of consumer transports to process.\n * @param {Array} options.lStreams_ - The list of local streams.\n * @param {Object} options.parameters - The parameters object containing various stream arrays and utility functions.\n *\n * @returns {Promise<void>} - A promise that resolves when the processing is complete.\n *\n * @throws {Error} - Throws an error if there is an issue processing consumer transports.\n *\n * The function performs the following steps:\n * 1. Destructures and updates the parameters.\n * 2. Defines a helper function to check if a producerId is valid in given stream arrays.\n * 3. Filters consumer transports to resume based on certain conditions.\n * 4. Filters consumer transports to pause based on certain conditions.\n * 5. Pauses consumer transports after a short delay.\n * 6. Emits `consumer-pause` event for each filtered transport (not audio).\n * 7. Emits `consumer-resume` event for each filtered transport (not audio).\n *\n * @example\n * ```typescript\n * await processConsumerTransports({\n * consumerTransports: [transport1, transport2],\n * lStreams_: [stream1, stream2],\n * parameters: {\n * remoteScreenStream: [],\n * oldAllStreams: [],\n * newLimitedStreams: [],\n * sleep: sleepFunction,\n * getUpdatedAllParams: () => parameters,\n * },\n * });\n * ```\n */\n\nexport async function processConsumerTransports({\n consumerTransports,\n lStreams_,\n parameters,\n}: ProcessConsumerTransportsOptions): Promise<void> {\n try {\n // Destructure parameters and get updated values\n parameters = parameters.getUpdatedAllParams();\n\n const {\n remoteScreenStream,\n oldAllStreams,\n newLimitedStreams,\n sleep,\n } = parameters;\n\n // Function to check if the producerId is valid in the given stream arrays\n function isValidProducerId(producerId: string, ...streamArrays: (Stream | Participant)[][]): boolean {\n return (\n producerId !== null &&\n producerId !== \"\" &&\n streamArrays.some((streamArray) => {\n return (\n streamArray.length > 0 &&\n streamArray.some((stream) => stream?.producerId === producerId)\n );\n })\n );\n }\n\n // Get paused consumer transports that are not audio\n const consumerTransportsToResume = consumerTransports.filter(\n (transport) =>\n isValidProducerId(\n transport.producerId,\n lStreams_,\n remoteScreenStream,\n oldAllStreams,\n newLimitedStreams\n ) &&\n transport.consumer?.paused === true &&\n transport.consumer.kind !== \"audio\"\n );\n\n // Get unpaused consumer transports that are not audio\n const consumerTransportsToPause = consumerTransports.filter(\n (transport) =>\n transport.producerId &&\n transport.producerId !== null &&\n transport.producerId !== \"\" &&\n !lStreams_.some(\n (stream) => stream.producerId === transport.producerId\n ) &&\n transport.consumer &&\n transport.consumer.kind &&\n transport.consumer.paused !== true &&\n transport.consumer.kind !== \"audio\" &&\n !remoteScreenStream.some((stream) => stream.producerId === transport.producerId) &&\n !oldAllStreams.some((stream) => stream.producerId === transport.producerId) &&\n !newLimitedStreams.some((stream) => stream.producerId === transport.producerId)\n );\n\n // Pause consumer transports after a short delay\n await sleep({ ms: 100 });\n\n // Emit consumer.pause() for each filtered transport (not audio)\n for (const transport of consumerTransportsToPause) {\n transport.consumer.pause();\n transport.socket_.emit(\n \"consumer-pause\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async () => {\n // Handle the response if needed\n }\n );\n }\n\n // Emit consumer.resume() for each filtered transport (not audio)\n for (const transport of consumerTransportsToResume) {\n transport.socket_.emit(\n \"consumer-resume\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async ({ resumed }: { resumed: boolean }) => {\n if (resumed) {\n transport.consumer.resume();\n }\n }\n );\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error processing consumer transports: ${error.message}`);\n } else {\n console.error('Error processing consumer transports:', error);\n }\n // throw new Error(`Error processing consumer transports: ${error.message}`);\n }\n}\n","import { Stream, Transport, Participant, SleepType } from \"../types/types\";\n\nexport interface ProcessConsumerTransportsAudioParameters {\n\n // mediasfu functions\n sleep: SleepType;\n [key: string]: any;\n}\n\nexport interface ProcessConsumerTransportsAudioOptions {\n consumerTransports: Transport[];\n lStreams: (Stream | Participant)[];\n parameters: ProcessConsumerTransportsAudioParameters;\n}\n\n// Export the type definition for the function\nexport type ProcessConsumerTransportsAudioType = (\n options: ProcessConsumerTransportsAudioOptions\n) => Promise<void>;\n\n/**\n * Processes consumer transports for audio streams by pausing and resuming them based on their current state and the provided streams.\n *\n * @param {Object} options - The options for processing consumer transports.\n * @param {Array} options.consumerTransports - The list of consumer transports to process.\n * @param {Array} options.lStreams - The list of local streams to check against.\n * @param {Object} options.parameters - Additional parameters for processing.\n * @param {Function} options.parameters.sleep - A function to pause execution for a specified duration.\n *\n * @returns {Promise<void>} A promise that resolves when the processing is complete.\n *\n * @throws Will throw an error if there is an issue processing the consumer transports.\n *\n * @example\n * ```typescript\n * await processConsumerTransportsAudio({\n * consumerTransports: [transport1, transport2],\n * lStreams: [stream1, stream2],\n * parameters: {\n * sleep: sleepFunction,\n * },\n * });\n * ```\n */\n\nexport const processConsumerTransportsAudio = async ({\n consumerTransports,\n lStreams,\n parameters,\n}: ProcessConsumerTransportsAudioOptions): Promise<void> => {\n try {\n const { sleep } = parameters;\n\n // Function to check if the producerId is valid in the given stream arrays\n const isValidProducerId = (producerId: string, ...streamArrays: (Stream | Participant)[][]): boolean => {\n return (\n producerId !== null &&\n producerId !== \"\" &&\n streamArrays.some((streamArray) => {\n return (\n streamArray.length > 0 &&\n streamArray.some((stream) => stream?.producerId === producerId)\n );\n })\n );\n };\n\n // Get paused consumer transports that are audio\n const consumerTransportsToResume = consumerTransports.filter(\n (transport) =>\n isValidProducerId(transport.producerId, lStreams) &&\n transport.consumer?.paused === true &&\n transport.consumer.kind === \"audio\"\n );\n\n // Get unpaused consumer transports that are audio\n const consumerTransportsToPause = consumerTransports.filter(\n (transport) =>\n transport.producerId &&\n transport.producerId !== null &&\n transport.producerId !== \"\" &&\n !lStreams.some(\n (stream) => stream.producerId === transport.producerId\n ) &&\n transport.consumer &&\n transport.consumer.kind &&\n transport.consumer.paused !== true &&\n transport.consumer.kind === \"audio\"\n );\n\n await sleep({ms:100});\n\n // Emit consumer.pause() for each transport to pause\n for (const transport of consumerTransportsToPause) {\n transport.consumer.pause();\n transport.socket_.emit(\n \"consumer-pause\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async () => {\n // Handle the response if needed\n }\n );\n }\n\n // Emit consumer.resume() for each transport to resume\n for (const transport of consumerTransportsToResume) {\n transport.socket_.emit(\n \"consumer-resume\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async ({ resumed }: { resumed: boolean }) => {\n if (resumed) {\n transport.consumer.resume();\n }\n }\n );\n }\n } catch (error) {\n console.error(\"Error in processConsumerTransportsAudio:\", error);\n }\n};\n\n","\n \nimport { PrepopulateUserMediaType, PrepopulateUserMediaParameters, EventType } from '../types/types';\nexport interface ReadjustParameters extends PrepopulateUserMediaParameters {\n eventType: EventType;\n shareScreenStarted: boolean;\n shared: boolean;\n mainHeightWidth: number;\n prevMainHeightWidth: number;\n hostLabel: string;\n first_round: boolean;\n lock_screen: boolean;\n updateMainHeightWidth: (value: number) => void;\n\n // mediasfu functions\n prepopulateUserMedia: PrepopulateUserMediaType;\n getUpdatedAllParams: () => ReadjustParameters;\n [key: string]: any;\n}\n\nexport interface ReadjustOptions {\n n: number;\n state: number;\n parameters: ReadjustParameters;\n}\n\n// Export the type definition for the function\nexport type ReadjustType = (options: ReadjustOptions) => Promise<void>;\n\n/**\n * Adjusts the layout parameters based on the provided options.\n *\n * @param {ReadjustOptions} options - The options for readjusting the layout.\n * @param {number} options.n - The number of participants or elements.\n * @param {number} options.state - The current state of the layout.\n * @param {object} options.parameters - The parameters for the layout adjustment.\n * @param {function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {string} options.parameters.eventType - The type of event (e.g., \"broadcast\", \"chat\", \"conference\").\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.parameters.shared - Indicates if content is being shared.\n * @param {number} options.parameters.mainHeightWidth - The main height and width value.\n * @param {number} options.parameters.prevMainHeightWidth - The previous main height and width value.\n * @param {string} options.parameters.hostLabel - The label for the host.\n * @param {boolean} options.parameters.first_round - Indicates if it is the first round.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {function} options.parameters.updateMainHeightWidth - Function to update the main height and width.\n * @param {function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @returns {Promise<void>} A promise that resolves when the layout adjustment is complete.\n * @throws {Error} Throws an error if there is an issue updating the grid sizes.\n *\n * @example\n * ```typescript\n * await readjust({\n * n: 5,\n * state: 1,\n * parameters: {\n * eventType: 'conference',\n * shareScreenStarted: false,\n * shared: false,\n * mainHeightWidth: 100,\n * prevMainHeightWidth: 80,\n * hostLabel: 'Host Name',\n * first_round: false,\n * lock_screen: false,\n * updateMainHeightWidth: updateMainHeightWidthFunction,\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * },\n * });\n * ```\n */\n\nexport async function readjust({ n, state, parameters }: ReadjustOptions): Promise<void> {\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n try {\n // Destructure parameters\n let {\n eventType,\n shareScreenStarted,\n shared,\n mainHeightWidth,\n prevMainHeightWidth,\n hostLabel,\n first_round,\n lock_screen,\n updateMainHeightWidth,\n prepopulateUserMedia,\n } = parameters;\n\n if (state === 0) {\n prevMainHeightWidth = mainHeightWidth;\n }\n\n let val1 = 6;\n let val2 = 12 - val1;\n let cal1 = Math.floor((val1 / 12) * 100);\n let cal2 = 100 - cal1;\n\n if (eventType === \"broadcast\") {\n val1 = 0;\n val2 = 12 - val1;\n\n if (n === 0) {\n val1 = 0;\n val2 = 12 - val1;\n }\n } else if (\n eventType === \"chat\" ||\n (eventType === \"conference\" && !(shareScreenStarted || shared))\n ) {\n val1 = 12;\n val2 = 12 - val1;\n } else {\n if (shareScreenStarted || shared) {\n val2 = 10;\n val1 = 12 - val2;\n } else {\n if (n === 0) {\n val1 = 1;\n val2 = 12 - val1;\n } else if (n >= 1 && n < 4) {\n val1 = 4;\n val2 = 12 - val1;\n } else if (n >= 4 && n < 6) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 6 && n < 9) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 9 && n < 12) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 12 && n < 20) {\n val1 = 8;\n val2 = 12 - val1;\n } else if (n >= 20 && n < 50) {\n val1 = 8;\n val2 = 12 - val1;\n } else {\n val1 = 10;\n val2 = 12 - val1;\n }\n }\n }\n\n if (state === 0) {\n mainHeightWidth = val2;\n }\n\n cal1 = Math.floor((val1 / 12) * 100);\n cal2 = 100 - cal1;\n\n updateMainHeightWidth(cal2);\n\n if (prevMainHeightWidth !== mainHeightWidth) {\n if (!lock_screen && !shared) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } else if (!first_round) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n console.log(\"Error updating grid sizes:\", error.message);\n } else {\n console.log(\"Error updating grid sizes:\", error);\n }\n }\n}\n","\nimport { Socket } from \"socket.io-client\";\nimport { GetPipedProducersAltType, GetPipedProducersAltParameters } from \"../types/types\";\n\nexport interface ReceiveAllPipedTransportsParameters extends GetPipedProducersAltParameters {\n roomName: string;\n member: string;\n\n // mediasfu functions\n getPipedProducersAlt: GetPipedProducersAltType;\n [key: string]: any;\n}\n\nexport interface ReceiveAllPipedTransportsOptions {\n nsock: Socket;\n community?: boolean;\n parameters: ReceiveAllPipedTransportsParameters;\n}\n\n// Export the type definition for the function\nexport type ReceiveAllPipedTransportsType = (options: ReceiveAllPipedTransportsOptions) => Promise<void>;\n\n/**\n * Receives all piped transports by emitting an event to the server and processing the response.\n *\n * @param {ReceiveAllPipedTransportsOptions} options - The options for receiving all piped transports.\n * @param {Socket} options.nsock - The socket instance used for communication.\n * @param {boolean} options.community - Whether the room is a community edition room.\n * @param {ReceiveAllPipedTransportsParameters} options.parameters - The parameters for the operation.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {string} options.parameters.member - The member identifier.\n * @param {Function} options.parameters.getPipedProducersAlt - The function to get piped producers for a given level.\n *\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n *\n * @throws Will log an error message if the operation fails.\n *\n * @example\n * ```typescript\n * await receiveAllPipedTransports({\n * nsock: socketInstance,\n * community: false,\n * parameters: {\n * roomName: 'Room1',\n * member: 'Member1',\n * getPipedProducersAlt: getPipedProducersAltFunction,\n * },\n * });\n * ```\n */\n\nexport const receiveAllPipedTransports = async ({ nsock, community=false, parameters }: ReceiveAllPipedTransportsOptions): Promise<void> => {\n try {\n // Destructure parameters\n const { roomName, member, getPipedProducersAlt } = parameters;\n const emitName = community ? \"createReceiveAllTransports\" : \"createReceiveAllTransportsPiped\";\n const emitData = community ? { islevel:'0' } : { roomName, member };\n // Emit createReceiveAllTransportsPiped event to the server\n await nsock.emit(\n emitName,\n emitData,\n async ({ producersExist }: { producersExist: boolean }) => {\n // Array of options representing different levels\n const options = [\"0\", \"1\", \"2\"];\n\n // If producers exist, loop through each level and get producers\n if (producersExist) {\n for (const islevel of options) {\n await getPipedProducersAlt({ nsock, community, islevel, parameters });\n }\n }\n }\n );\n } catch (error) {\n console.log(\"receiveAllPipedTransports error\", error);\n }\n};\n"," \nimport { Participant, Stream, ChangeVidsParameters, ChangeVidsType } from \"../types/types\";\n\nexport interface ReorderStreamsParameters extends ChangeVidsParameters {\n allVideoStreams: (Stream | Participant)[];\n participants: Participant[];\n oldAllStreams: (Stream | Participant)[];\n screenId?: string;\n adminVidID?: string;\n newLimitedStreams: (Stream | Participant)[];\n newLimitedStreamsIDs: string[];\n activeSounds: string[];\n screenShareIDStream?: string;\n screenShareNameStream?: string;\n adminIDStream?: string;\n adminNameStream?: string;\n updateNewLimitedStreams: (streams: (Stream | Participant)[]) => void;\n updateNewLimitedStreamsIDs: (ids: string[]) => void;\n updateActiveSounds: (sounds: string[]) => void;\n updateScreenShareIDStream: (id: string) => void;\n updateScreenShareNameStream: (name: string) => void;\n updateAdminIDStream: (id: string) => void;\n updateAdminNameStream: (name: string) => void;\n updateYouYouStream: (streams: (Stream | Participant)[]) => void;\n\n // mediasfu functions\n changeVids: ChangeVidsType;\n getUpdatedAllParams: () => ReorderStreamsParameters;\n [key: string]: any;\n}\n\nexport interface ReorderStreamsOptions {\n add?: boolean;\n screenChanged?: boolean;\n parameters: ReorderStreamsParameters;\n}\n\n\nexport type ReorderStreamsType = (options: ReorderStreamsOptions) => Promise<void>;\n\n/**\n * Reorders the video streams based on the provided options and updates the UI accordingly.\n *\n * @param {ReorderStreamsOptions} options - The options for reordering streams.\n * @param {boolean} [options.add=false] - Whether to add new streams or not.\n * @param {boolean} [options.screenChanged=false] - Whether the screen has changed or not.\n * @param {Object} options.parameters - The parameters required for reordering streams.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {Array} options.parameters.allVideoStreams - Array of all video streams.\n * @param {Array} options.parameters.participants - Array of participants.\n * @param {Array} options.parameters.oldAllStreams - Array of old streams.\n * @param {string} options.parameters.screenId - ID of the screen.\n * @param {string} options.parameters.adminVidID - ID of the admin video.\n * @param {Array} options.parameters.newLimitedStreams - Array of new limited streams.\n * @param {Array} options.parameters.newLimitedStreamsIDs - Array of new limited stream IDs.\n * @param {Array} options.parameters.activeSounds - Array of active sounds.\n * @param {string} options.parameters.screenShareIDStream - ID of the screen share stream.\n * @param {string} options.parameters.screenShareNameStream - Name of the screen share stream.\n * @param {string} options.parameters.adminIDStream - ID of the admin stream.\n * @param {string} options.parameters.adminNameStream - Name of the admin stream.\n * @param {Function} options.parameters.updateNewLimitedStreams - Function to update new limited streams.\n * @param {Function} options.parameters.updateNewLimitedStreamsIDs - Function to update new limited stream IDs.\n * @param {Function} options.parameters.updateActiveSounds - Function to update active sounds.\n * @param {Function} options.parameters.updateScreenShareIDStream - Function to update screen share ID stream.\n * @param {Function} options.parameters.updateScreenShareNameStream - Function to update screen share name stream.\n * @param {Function} options.parameters.updateAdminIDStream - Function to update admin ID stream.\n * @param {Function} options.parameters.updateAdminNameStream - Function to update admin name stream.\n * @param {Function} options.parameters.updateYouYouStream - Function to update YouYou stream.\n * @param {Function} options.parameters.changeVids - Function to reflect changes on the UI.\n *\n * @returns {Promise<void>} A promise that resolves when the reordering is complete.\n *\n * @throws {Error} Throws an error if there is an issue updating the streams.\n *\n * @example\n * ```typescript\n * await reorderStreams({\n * add: true,\n * screenChanged: false,\n * parameters: {\n * allVideoStreams: [...],\n * participants: [...],\n * // additional parameters...\n * },\n * });\n * ```\n */\n\nexport const reorderStreams = async ({\n add = false,\n screenChanged = false,\n parameters,\n}: ReorderStreamsOptions): Promise<void> => {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n allVideoStreams,\n participants,\n oldAllStreams,\n screenId,\n adminVidID,\n newLimitedStreams,\n newLimitedStreamsIDs,\n activeSounds,\n screenShareIDStream,\n screenShareNameStream,\n adminIDStream,\n adminNameStream,\n updateNewLimitedStreams,\n updateNewLimitedStreamsIDs,\n updateActiveSounds,\n updateScreenShareIDStream,\n updateScreenShareNameStream,\n updateAdminIDStream,\n updateAdminNameStream,\n updateYouYouStream,\n\n //mediasfu functions\n changeVids,\n } = parameters;\n\n // function to reorder streams on the ui\n if (!add) {\n newLimitedStreams = [];\n newLimitedStreamsIDs = [];\n activeSounds = [];\n }\n\n const youyou = allVideoStreams.filter((stream) => stream.producerId === \"youyou\");\n const admin = participants.filter((participant) => participant.islevel === \"2\");\n\n if (admin.length > 0) {\n adminVidID = admin[0].videoID;\n } else {\n adminVidID = \"\";\n }\n\n if (adminVidID) {\n const adminStream = allVideoStreams.find((stream) => stream.producerId === adminVidID);\n\n if (!add) {\n newLimitedStreams = [...newLimitedStreams, ...youyou];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => stream.producerId)];\n } else {\n const youyouStream = newLimitedStreams.find((stream) => stream.producerId === \"youyou\");\n\n if (!youyouStream) {\n newLimitedStreams = [...newLimitedStreams, ...youyou];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => stream.producerId)];\n }\n }\n\n if (adminStream) {\n adminIDStream = adminVidID;\n\n if (!add) {\n newLimitedStreams = [...newLimitedStreams, adminStream];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, adminStream.producerId];\n } else {\n const adminStreamer = newLimitedStreams.find((stream) => stream.producerId === adminVidID);\n\n if (!adminStreamer) {\n newLimitedStreams = [...newLimitedStreams, adminStream];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, adminStream.producerId];\n }\n }\n } else {\n const oldAdminStream = oldAllStreams.find((stream) => stream.producerId === adminVidID);\n\n if (oldAdminStream) {\n //add it to the allVideoStream\n\n adminIDStream = adminVidID;\n adminNameStream = admin[0].name;\n\n if (!add) {\n newLimitedStreams = [...newLimitedStreams, oldAdminStream];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, oldAdminStream.producerId];\n } else {\n const adminStreamer = newLimitedStreams.find((stream) => stream.producerId === adminVidID);\n\n if (!adminStreamer) {\n newLimitedStreams = [...newLimitedStreams, oldAdminStream];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, oldAdminStream.producerId];\n }\n }\n }\n }\n\n const screenParticipant = participants.filter((participant) => participant.ScreenID === screenId);\n\n if (screenParticipant.length > 0) {\n const screenParticipantVidID = screenParticipant[0].videoID;\n const screenParticipantVidID_ = newLimitedStreams.filter((stream) => stream.producerId === screenParticipantVidID);\n\n if (screenParticipantVidID_?.length < 1 && screenParticipantVidID) {\n screenShareIDStream = screenParticipantVidID;\n screenShareNameStream = screenParticipant[0].name;\n const screenParticipantVidID__ = allVideoStreams.filter((stream) => stream.producerId === screenParticipantVidID);\n newLimitedStreams = [...newLimitedStreams, ...screenParticipantVidID__];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...screenParticipantVidID__.map((stream) => stream.producerId)];\n }\n }\n } else {\n if (!add) {\n newLimitedStreams = [...newLimitedStreams, ...youyou];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => stream.producerId)];\n } else {\n const youyouStream = newLimitedStreams.find((stream) => stream.producerId === \"youyou\");\n\n if (!youyouStream) {\n newLimitedStreams = [...newLimitedStreams, ...youyou];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => stream.producerId)];\n }\n }\n\n const screenParticipant = participants.filter((participant) => participant.ScreenID === screenId);\n\n if (screenParticipant.length > 0) {\n const screenParticipantVidID = screenParticipant[0].videoID;\n const screenParticipantVidID_ = newLimitedStreams.filter((stream) => stream.producerId === screenParticipantVidID);\n\n if (screenParticipantVidID_?.length < 1 && screenParticipantVidID) {\n screenShareIDStream = screenParticipantVidID;\n screenShareNameStream = screenParticipant[0].name;\n const screenParticipantVidID__ = allVideoStreams.filter((stream) => stream.producerId === screenParticipantVidID);\n newLimitedStreams = [...newLimitedStreams, ...screenParticipantVidID__];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...screenParticipantVidID__.map((stream) => stream.producerId)];\n }\n }\n }\n\n updateNewLimitedStreams(newLimitedStreams);\n updateNewLimitedStreamsIDs(newLimitedStreamsIDs);\n updateActiveSounds(activeSounds);\n updateScreenShareIDStream(screenShareIDStream!);\n updateScreenShareNameStream(screenShareNameStream!);\n updateAdminIDStream(adminIDStream!);\n updateAdminNameStream(adminNameStream!);\n updateYouYouStream(youyou);\n\n //reflect the changes on the ui\n await changeVids({ screenChanged, parameters });\n};\n\n","import { ScreenState, CompareScreenStatesParameters, CompareScreenStatesType, CompareActiveNamesParameters, CompareActiveNamesType } from '../types/types';\n\n\nexport interface RePortParameters extends CompareScreenStatesParameters, CompareActiveNamesParameters {\n islevel: string;\n mainScreenPerson: string;\n adminOnMainScreen: boolean;\n mainScreenFilled: boolean;\n recordStarted: boolean;\n recordStopped: boolean;\n recordPaused: boolean;\n recordResumed: boolean;\n screenStates: ScreenState[];\n prevScreenStates: ScreenState[];\n updateScreenStates: (states: ScreenState[]) => void;\n updatePrevScreenStates: (states: ScreenState[]) => void;\n\n // mediasfu functions\n compareActiveNames: CompareActiveNamesType;\n compareScreenStates: CompareScreenStatesType;\n\n getUpdatedAllParams: () => RePortParameters;\n [key: string]: any;\n}\n\nexport interface RePortOptions {\n restart?: boolean;\n parameters: RePortParameters;\n}\n\n\n// Export the type definition for the function\nexport type RePortType = (options: RePortOptions) => Promise<void>;\n\n/**\n * RePort function that handles the reporting logic based on the provided parameters.\n *\n * @param {RePortOptions} options - The options for the rePort function.\n * @param {boolean} [options.restart=false] - Flag indicating whether to restart the process.\n * @param {Object} options.parameters - The parameters object containing various states and functions.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {string} options.parameters.islevel - The current level of the process.\n * @param {string} options.parameters.mainScreenPerson - The person on the main screen.\n * @param {boolean} options.parameters.adminOnMainScreen - Flag indicating if admin is on the main screen.\n * @param {boolean} options.parameters.mainScreenFilled - Flag indicating if the main screen is filled.\n * @param {boolean} options.parameters.recordStarted - Flag indicating if recording has started.\n * @param {boolean} options.parameters.recordStopped - Flag indicating if recording has stopped.\n * @param {boolean} options.parameters.recordPaused - Flag indicating if recording is paused.\n * @param {boolean} options.parameters.recordResumed - Flag indicating if recording has resumed.\n * @param {Array} options.parameters.screenStates - Array of current screen states.\n * @param {Function} options.parameters.updateScreenStates - Function to update the current screen states.\n * @param {Function} options.parameters.updatePrevScreenStates - Function to update the previous screen states.\n * @param {Function} options.parameters.compareActiveNames - Function to compare active names.\n * @param {Function} options.parameters.compareScreenStates - Function to compare screen states.\n *\n * @returns {Promise<void>} A promise that resolves when the reporting process is complete.\n *\n * @throws {Error} Throws an error if there is an issue during the reporting process.\n *\n * @example\n * ```typescript\n * await rePort({\n * restart: false,\n * parameters: {\n * islevel: \"2\",\n * mainScreenPerson: \"John Doe\",\n * // other parameters...\n * },\n * });\n * ```\n */\n\nexport async function rePort({ restart = false, parameters }: RePortOptions): Promise<void> {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n try {\n // Destructure parameters\n const {\n islevel,\n mainScreenPerson,\n adminOnMainScreen,\n mainScreenFilled,\n recordStarted,\n recordStopped,\n recordPaused,\n recordResumed,\n screenStates,\n updateScreenStates,\n updatePrevScreenStates,\n compareActiveNames,\n compareScreenStates,\n } = parameters;\n\n if (recordStarted || recordResumed) {\n if (recordStopped || recordPaused) {\n // Recording stopped or paused, do nothing\n } else {\n if (islevel === \"2\") {\n const previousScreenStates = [...screenStates];\n updatePrevScreenStates(previousScreenStates);\n\n const currentScreenStates = [\n { mainScreenPerson, adminOnMainScreen, mainScreenFilled },\n ];\n updateScreenStates(currentScreenStates);\n\n\n if (restart) {\n await compareActiveNames({ restart, parameters });\n return;\n }\n await compareActiveNames({ restart, parameters });\n await compareScreenStates({ restart, parameters });\n }\n }\n }\n } catch (error) {\n console.log(\"Error during rePorting: \", error);\n // throw new Error(`Error during rePorting: ${error.message}`);\n }\n}\n\n","import { Socket } from \"socket.io-client\";\nimport { ShowAlert, StartShareScreenType, StartShareScreenParameters } from \"../types/types\";\n\nexport interface RequestScreenShareParameters extends StartShareScreenParameters {\n socket: Socket;\n showAlert?: ShowAlert\n localUIMode: boolean;\n targetResolution?: string;\n targetResolutionHost?: string;\n \n\n // mediasfu functions\n startShareScreen: StartShareScreenType;\n getUpdatedAllParams : () => RequestScreenShareParameters;\n [key: string]: any;\n}\n\nexport interface RequestScreenShareOptions {\n parameters: RequestScreenShareParameters;\n}\n\n// Export the type definition for the function\nexport type RequestScreenShareType = (options: RequestScreenShareOptions) => Promise<void>;\n\n/**\n * Requests to start screen sharing.\n *\n * @param {RequestScreenShareOptions} options - The options for requesting screen share.\n * @param {Object} options.parameters - The parameters for the screen share request.\n * @param {Socket} options.parameters.socket - The socket instance to communicate with the server.\n * @param {Function} [options.parameters.showAlert] - Optional function to show alerts to the user.\n * @param {boolean} options.parameters.localUIMode - Indicates if the user is in local UI mode.\n * @param {string} [options.parameters.targetResolution] - The target resolution for screen sharing.\n * @param {string} [options.parameters.targetResolutionHost] - The target resolution for screen sharing for the host.\n * @param {Function} options.parameters.startShareScreen - Function to start screen sharing.\n *\n * @returns {Promise<void>} A promise that resolves when the screen share request is processed.\n *\n * @throws {Error} Throws an error if there is an issue during the screen share request process.\n *\n * @example\n * ```typescript\n * await requestScreenShare({\n * parameters: {\n * socket: socketInstance,\n * localUIMode: false,\n * targetResolution: 'fhd',\n * startShareScreen: startShareScreenFunction,\n * // other parameters...\n * },\n * });\n * ```\n */\n\nexport async function requestScreenShare({ parameters }: RequestScreenShareOptions): Promise<void> {\n try {\n // Destructure parameters\n let {\n socket,\n showAlert,\n localUIMode,\n targetResolution = 'hd',\n targetResolutionHost = 'hd',\n\n //mediasfu functions\n startShareScreen,\n } = parameters;\n\n let targetWidth = 1280\n let targetHeight = 720\n\n if (targetResolution == 'qhd' || targetResolutionHost == 'qhd') {\n targetWidth = 2560\n targetHeight = 1440\n } else if (targetResolution == 'fhd' || targetResolutionHost == 'fhd') {\n targetWidth = 1920\n targetHeight = 1080\n } \n\n // Check if the user is in local UI mode\n if (localUIMode === true) {\n await startShareScreen({ parameters });\n return;\n }\n\n socket.emit(\"requestScreenShare\", async ({ allowScreenShare }: { allowScreenShare: boolean; }) => {\n if (!allowScreenShare) {\n // Send an alert to the user\n showAlert?.({\n message: \"You are not allowed to share screen\",\n type: \"danger\",\n duration: 3000,\n });\n } else {\n await startShareScreen({ parameters: { ...parameters, targetWidth, targetHeight } });\n }\n });\n } catch (error) {\n // Handle errors during the process of requesting screen share\n // throw new Error(`Error during requesting screen share: ${error.message}`);\n console.log(\"Error during requesting screen share: \", error);\n }\n}\n","import { Participant, Stream, ProcessConsumerTransportsAudioType, ProcessConsumerTransportsAudioParameters, Transport, BreakoutParticipant, EventType } from '../types/types';\n\nexport interface ResumePauseAudioStreamsParameters extends ProcessConsumerTransportsAudioParameters {\n breakoutRooms: BreakoutParticipant[][];\n ref_participants: Participant[];\n allAudioStreams: (Stream | Participant)[];\n participants: Participant[];\n islevel: string;\n eventType: EventType;\n consumerTransports: Transport[];\n limitedBreakRoom: BreakoutParticipant[];\n hostNewRoom: number;\n member: string;\n updateLimitedBreakRoom: (limitedBreakRoom: BreakoutParticipant[]) => void;\n\n // mediasfu functions\n processConsumerTransportsAudio: ProcessConsumerTransportsAudioType;\n getUpdatedAllParams: () => ResumePauseAudioStreamsParameters;\n [key: string]: any;\n}\n\nexport interface ResumePauseAudioStreamsOptions {\n breakRoom?: number;\n inBreakRoom?: boolean;\n parameters: ResumePauseAudioStreamsParameters;\n}\n\n// Export the type definition for the function\nexport type ResumePauseAudioStreamsType = (\n options: ResumePauseAudioStreamsOptions\n) => Promise<void>;\n\n/**\n * Resumes or pauses audio streams based on the provided options.\n *\n * @param {ResumePauseAudioStreamsOptions} options - The options for resuming or pausing audio streams.\n * @param {number} [options.breakRoom=-1] - The ID of the break room.\n * @param {boolean} [options.inBreakRoom=false] - Indicates if the participant is in a break room.\n * @param {ResumePauseAudioStreamsParameters} options.parameters - The parameters required for processing audio streams.\n *\n * @returns {Promise<void>} A promise that resolves when the audio streams have been processed.\n *\n * @throws Will log an error message if there is an issue processing the audio streams.\n *\n * @example\n * ```typescript\n * await resumePauseAudioStreams({\n * breakRoom: 1,\n * inBreakRoom: true,\n * parameters: {\n * // ...parameters here\n * },\n * });\n * ```\n */\n\nexport const resumePauseAudioStreams = async ({\n breakRoom = -1,\n inBreakRoom = false,\n parameters,\n}: ResumePauseAudioStreamsOptions): Promise<void> => {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n const {\n breakoutRooms,\n ref_participants,\n allAudioStreams,\n participants,\n islevel,\n eventType,\n consumerTransports,\n hostNewRoom,\n member,\n updateLimitedBreakRoom,\n processConsumerTransportsAudio,\n } = parameters;\n\n let room: BreakoutParticipant[] = [];\n let currentStreams: (Stream | Participant)[] = [];\n // Determine the room based on breakout status\n if (inBreakRoom && breakRoom !== -1) {\n room = breakoutRooms[breakRoom];\n } else {\n room = ref_participants\n .filter((participant) =>\n !breakoutRooms\n .flat()\n .map((obj) => obj.name)\n .includes(participant!.name)\n )\n .map(({ name, breakRoom }) => ({ name, breakRoom }));\n \n }\n\n updateLimitedBreakRoom(room);\n\n try {\n let addHostAudio = false;\n\n if (islevel !== \"2\" && eventType === \"conference\") {\n const roomMember = breakoutRooms.find((r) =>\n r.find((p) => p.name === member)\n );\n let memberBreakRoom = -1;\n if (roomMember) {\n memberBreakRoom = breakoutRooms.indexOf(roomMember);\n }\n\n if (\n (inBreakRoom && breakRoom !== hostNewRoom) ||\n (!inBreakRoom && hostNewRoom !== -1 && hostNewRoom !== memberBreakRoom)\n ) {\n const host = participants.find((obj) => obj.islevel === \"2\");\n // Remove the host from the room\n room = room.filter((participant) => participant.name !== host?.name);\n } else {\n if (\n (inBreakRoom && breakRoom === hostNewRoom) ||\n (!inBreakRoom && hostNewRoom === -1) ||\n (!inBreakRoom &&\n hostNewRoom === memberBreakRoom &&\n memberBreakRoom !== -1)\n ) {\n addHostAudio = true;\n }\n }\n }\n\n for (let participant of room) {\n let streams = allAudioStreams.filter((stream) => {\n if (\n (Object.prototype.hasOwnProperty.call(stream, \"producerId\") && stream.producerId) ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") && stream.audioID)\n ) {\n let producerId = stream.producerId || stream.audioID;\n let matchingParticipant = ref_participants.find(\n (obj) => obj.audioID == producerId\n );\n return (\n matchingParticipant && matchingParticipant.name == participant.name\n );\n }\n // Return false if the stream doesn't meet the criteria\n return false;\n });\n\n currentStreams.push(...streams);\n }\n\n // If webinar, add the host audio stream if it is not in the currentStreams\n if (islevel !== \"2\" && (eventType === \"webinar\" || addHostAudio)) {\n const host = participants.find((obj) => obj.islevel === \"2\");\n const hostStream = allAudioStreams.find(\n (obj) => obj.producerId === host?.audioID\n );\n if (hostStream && !currentStreams.includes(hostStream)) {\n currentStreams.push(hostStream);\n if (!room.map((obj) => obj.name).includes(host?.name ?? \"\")) {\n room.push({ name: host?.name || \"\", breakRoom: -1 });\n }\n updateLimitedBreakRoom(room);\n }\n }\n\n await processConsumerTransportsAudio({\n consumerTransports,\n lStreams: currentStreams,\n parameters,\n });\n } catch (error) {\n console.log('Error in resumePauseAudioStreams:', error);\n }\n};\n","import { Participant, Transport, Stream } from \"../types/types\";\n\nexport interface ResumePauseStreamsParameters {\n participants: Participant[];\n dispActiveNames: string[];\n remoteScreenStream: Stream[];\n consumerTransports: Transport[];\n screenId?: string;\n islevel: string;\n\n // mediasfu functions\n getUpdatedAllParams: () => ResumePauseStreamsParameters;\n [key: string]: any;\n}\n\nexport interface ResumePauseStreamsOptions {\n parameters: ResumePauseStreamsParameters;\n}\n\n// Export the type definition for the function\nexport type ResumePauseStreamsType = (options: ResumePauseStreamsOptions) => Promise<void>;\n\n/**\n * Resumes or pauses streams based on the provided parameters.\n *\n * @param {ResumePauseStreamsOptions} options - The options for resuming or pausing streams.\n * @param {Object} options.parameters - The parameters for the function.\n * @param {Array} options.parameters.participants - The list of participants.\n * @param {Array} options.parameters.dispActiveNames - The list of active display names.\n * @param {Array} options.parameters.consumerTransports - The list of consumer transports.\n * @param {string} [options.parameters.screenId] - The screen producer ID.\n * @param {string} options.parameters.islevel - The level of the user.\n *\n * @returns {Promise<void>} A promise that resolves when the streams have been resumed or paused.\n *\n * @throws Will throw an error if there is an issue during the process of resuming or pausing streams.\n *\n * @example\n * ```typescript\n * await resumePauseStreams({\n * parameters: {\n * participants: participantArray,\n * dispActiveNames: ['user1', 'user2'],\n * consumerTransports: transportArray,\n * screenId: 'screen-123',\n * islevel: '1',\n * },\n * });\n * ```\n */\n\nexport async function resumePauseStreams({\n parameters,\n}: ResumePauseStreamsOptions): Promise<void> {\n try {\n // Destructure parameters\n const { participants, dispActiveNames, consumerTransports, screenId, islevel } = parameters;\n\n // Get the videoID of the host (islevel=2)\n const host = participants.find((obj) => obj.islevel === \"2\");\n const hostVideoID = host ? host.videoID : null;\n\n // Get videoIDs of participants in dispActiveNames and screenproducerId\n const videosIDs = dispActiveNames.map((name) => {\n const participant = participants.find((obj) => obj.name === name);\n return participant ? participant.videoID : null;\n });\n\n // Add screenproducerId to allVideoIDs if it's not null or empty\n if (screenId) {\n videosIDs.push(screenId);\n }\n\n // Add hostVideoID to allVideoIDs if it's not null or empty (only if the user is not the host)\n if (islevel !== \"2\" && hostVideoID) {\n videosIDs.push(hostVideoID);\n }\n\n // Remove null or empty videoIDs\n const allVideoIDs = videosIDs.filter(\n (videoID): videoID is string => videoID !== null && videoID !== \"\"\n );\n\n if (allVideoIDs.length > 0) {\n // Get consumer transports with producerId in allVideoIDs\n const consumerTransportsToResume = consumerTransports.filter(\n (transport) =>\n allVideoIDs.includes(transport.producerId) &&\n transport.consumer.kind !== \"audio\"\n );\n\n // Resume all consumerTransportsToResume\n for (const transport of consumerTransportsToResume) {\n transport.socket_.emit(\n \"consumer-resume\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async ({ resumed }: { resumed: boolean }) => {\n if (resumed) {\n transport.consumer.resume();\n }\n }\n );\n }\n }\n } catch (error) {\n console.log(\"Error during resuming or pausing streams: \", error);\n // Handle errors during the process of resuming or pausing streams\n }\n}\n\n"," \nimport { Participant, Stream, OnScreenChangesType, ReorderStreamsType, ChangeVidsType, OnScreenChangesParameters, ReorderStreamsParameters, ChangeVidsParameters, EventType } from \"../types/types\";\nexport interface ReUpdateInterParameters extends OnScreenChangesParameters, ReorderStreamsParameters, ChangeVidsParameters {\n screenPageLimit: number;\n itemPageLimit: number;\n reorderInterval: number;\n fastReorderInterval: number;\n eventType: EventType;\n participants: Participant[];\n allVideoStreams: (Participant | Stream)[];\n shared: boolean;\n shareScreenStarted: boolean;\n adminNameStream?: string;\n screenShareNameStream?: string;\n updateMainWindow: boolean;\n sortAudioLoudness: boolean;\n lastReorderTime: number;\n newLimitedStreams: (Participant | Stream)[];\n newLimitedStreamsIDs: string[];\n oldSoundIds: string[];\n updateUpdateMainWindow: (value: boolean) => void;\n updateSortAudioLoudness: (value: boolean) => void;\n updateLastReorderTime: (value: number) => void;\n updateNewLimitedStreams: (streams: (Participant | Stream)[]) => void;\n updateNewLimitedStreamsIDs: (ids: string[]) => void;\n updateOldSoundIds: (ids: string[]) => void;\n\n // mediasfu functions\n onScreenChanges: OnScreenChangesType;\n reorderStreams: ReorderStreamsType;\n changeVids: ChangeVidsType;\n\n getUpdatedAllParams: () => ReUpdateInterParameters;\n [key: string]: any;\n}\n\nexport interface ReUpdateInterOptions {\n name: string;\n add?: boolean;\n force?: boolean;\n average?: number;\n parameters: ReUpdateInterParameters;\n}\n\n// Export the type definition for the function\nexport type ReUpdateInterType = (options: ReUpdateInterOptions) => Promise<void>;\n\n/**\n * Updates the interaction state based on the provided options and parameters.\n * \n * @param {ReUpdateInterOptions} options - The options for updating the interaction.\n * @param {string} options.name - The name of the participant.\n * @param {boolean} [options.add=false] - Whether to add the participant to the interaction.\n * @param {boolean} [options.force=false] - Whether to force the update.\n * @param {number} [options.average=127] - The average value used for determining reorder intervals.\n * @param {Object} options.parameters - The parameters for updating the interaction.\n * @param {number} options.parameters.screenPageLimit - The screen page limit.\n * @param {number} options.parameters.itemPageLimit - The item page limit.\n * @param {number} options.parameters.reorderInterval - The reorder interval.\n * @param {number} options.parameters.fastReorderInterval - The fast reorder interval.\n * @param {string} options.parameters.eventType - The type of event.\n * @param {Array} options.parameters.participants - The list of participants.\n * @param {Array} options.parameters.allVideoStreams - The list of all video streams.\n * @param {boolean} options.parameters.shared - Whether the screen is shared.\n * @param {boolean} options.parameters.shareScreenStarted - Whether screen sharing has started.\n * @param {string} options.parameters.adminNameStream - The admin name stream.\n * @param {string} options.parameters.screenShareNameStream - The screen share name stream.\n * @param {boolean} options.parameters.updateMainWindow - Whether to update the main window.\n * @param {boolean} options.parameters.sortAudioLoudness - Whether to sort audio by loudness.\n * @param {number} options.parameters.lastReorderTime - The last reorder time.\n * @param {Array} options.parameters.newLimitedStreams - The list of new limited streams.\n * @param {Array} options.parameters.newLimitedStreamsIDs - The list of new limited stream IDs.\n * @param {Array} options.parameters.oldSoundIds - The list of old sound IDs.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {Function} options.parameters.updateSortAudioLoudness - Function to update the audio loudness sorting.\n * @param {Function} options.parameters.updateLastReorderTime - Function to update the last reorder time.\n * @param {Function} options.parameters.updateNewLimitedStreams - Function to update the new limited streams.\n * @param {Function} options.parameters.updateNewLimitedStreamsIDs - Function to update the new limited stream IDs.\n * @param {Function} options.parameters.updateOldSoundIds - Function to update the old sound IDs.\n * @param {Function} options.parameters.onScreenChanges - Function to handle screen changes.\n * @param {Function} options.parameters.reorderStreams - Function to reorder streams.\n * @param {Function} options.parameters.changeVids - Function to change videos.\n * \n * @returns {Promise<void>} A promise that resolves when the interaction update is complete.\n *\n * @throws {Error} Throws an error if there is an issue during the updating process.\n *\n * @example\n * ```typescript\n * await reUpdateInter({\n * name: 'participant1',\n * add: true,\n * parameters: {\n * screenPageLimit: 4,\n * itemPageLimit: 2,\n * reorderInterval: 500,\n * fastReorderInterval: 200,\n * eventType: 'conference',\n * participants: [...],\n * allVideoStreams: [...],\n * shared: false,\n * shareScreenStarted: false,\n * adminNameStream: 'Admin',\n * screenShareNameStream: 'Screen Share',\n * updateMainWindow: true,\n * sortAudioLoudness: false,\n * lastReorderTime: Date.now(),\n * newLimitedStreams: [],\n * newLimitedStreamsIDs: [],\n * oldSoundIds: [],\n * updateUpdateMainWindow: (value) => { console.log('your logic') },\n * updateSortAudioLoudness: (value) => { console.log('your logic') },\n * updateLastReorderTime: (value) => { console.log('your logic') },\n * updateNewLimitedStreams: (streams) => { console.log('your logic') },\n * updateNewLimitedStreamsIDs: (ids) => { console.log('your logic') },\n * updateOldSoundIds: (ids) => { console.log('your logic') },\n * onScreenChanges: async (options) => { console.log('your logic') },\n * reorderStreams: async (options) => { console.log('your logic') },\n * changeVids: async (options) => { console.log('your logic') },\n * },\n * });\n * ```\n */\n\n\nexport async function reUpdateInter({\n name,\n add = false,\n force = false,\n average = 127,\n parameters,\n}: ReUpdateInterOptions): Promise<void> {\n let {\n screenPageLimit,\n itemPageLimit,\n reorderInterval,\n fastReorderInterval,\n eventType,\n participants,\n allVideoStreams,\n shared,\n shareScreenStarted,\n adminNameStream,\n screenShareNameStream,\n updateMainWindow,\n sortAudioLoudness,\n lastReorderTime,\n newLimitedStreams,\n newLimitedStreamsIDs,\n oldSoundIds,\n updateUpdateMainWindow,\n updateSortAudioLoudness,\n updateLastReorderTime,\n updateNewLimitedStreams,\n updateNewLimitedStreamsIDs,\n updateOldSoundIds,\n\n //mediasfu functions\n onScreenChanges,\n reorderStreams,\n changeVids,\n } = parameters;\n\n if (eventType === \"broadcast\" || eventType === \"chat\") {\n return;\n }\n\n let refLimit = screenPageLimit - 1;\n\n if (!(shareScreenStarted || shared)) {\n refLimit = itemPageLimit - 1;\n\n if (add) {\n const currentTime = Date.now();\n if (\n (currentTime - lastReorderTime >= reorderInterval && average > 128.5) ||\n (average > 130 && currentTime - lastReorderTime >= fastReorderInterval)\n ) {\n lastReorderTime = currentTime;\n sortAudioLoudness = true;\n if (eventType === \"conference\") {\n await onScreenChanges({ changed: true, parameters });\n } else {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n sortAudioLoudness = false;\n\n updateSortAudioLoudness(sortAudioLoudness);\n updateUpdateMainWindow(updateMainWindow);\n updateLastReorderTime(lastReorderTime);\n\n return;\n }\n }\n }\n\n let videoID: string | null = null;\n if (shareScreenStarted || shared) {\n if (add) {\n const participant = participants.find((p) => p.name === name);\n videoID = participant?.videoID ?? null;\n\n if (!videoID) {\n return;\n }\n\n if (!newLimitedStreamsIDs.includes(videoID)) {\n //first check length of newLimitedStreams to not exceed refLimit, if so remove oldSoundID from newLimitedStreams\n if (newLimitedStreams.length > refLimit) {\n let oldoldSounds = [...oldSoundIds];\n for (let i = 0; i < oldSoundIds.length; i++) {\n if (newLimitedStreams.length > refLimit) {\n // remove stream from newLimitedStreams\n if (newLimitedStreams.length < screenPageLimit) {\n return;\n }\n const currentId = oldSoundIds[i];\n if (\n currentId !== screenShareNameStream &&\n currentId !== adminNameStream\n ) {\n newLimitedStreams = newLimitedStreams.filter(\n (stream) => stream.producerId !== currentId\n );\n newLimitedStreamsIDs = newLimitedStreamsIDs.filter(\n (id) => id !== currentId\n );\n oldoldSounds = oldoldSounds.filter((id) => id !== currentId);\n }\n }\n }\n oldSoundIds = [...oldoldSounds];\n }\n\n const stream = allVideoStreams.find(\n (s) => s.producerId === videoID\n );\n if (stream && newLimitedStreams.length < screenPageLimit) {\n newLimitedStreams.push(stream);\n newLimitedStreamsIDs.push(videoID);\n if (!oldSoundIds.includes(name)) {\n oldSoundIds.push(name);\n }\n await changeVids({ screenChanged: true, parameters });\n }\n }\n } else {\n if (!force) {\n try {\n // remove stream from newLimitedStreams\n if (newLimitedStreams.length < screenPageLimit) {\n return;\n }\n newLimitedStreams = newLimitedStreams.filter(\n (stream) => stream.producerId != videoID\n );\n newLimitedStreamsIDs = newLimitedStreamsIDs.filter(\n (id) => id !== videoID\n );\n oldSoundIds = oldSoundIds.filter((id) => id !== name);\n await changeVids({ parameters });\n } catch {\n // do nothing\n }\n } else {\n const participant = participants.find((p) => p.name === name);\n if (participant?.muted) {\n try {\n newLimitedStreams = newLimitedStreams.filter(\n (stream) => stream.producerId !== videoID\n );\n newLimitedStreamsIDs = newLimitedStreamsIDs.filter(\n (id) => id !== videoID\n );\n oldSoundIds = oldSoundIds.filter((id) => id !== name);\n await changeVids({ parameters });\n } catch { \n // do nothing\n }\n }\n }\n }\n\n updateNewLimitedStreams(newLimitedStreams);\n updateNewLimitedStreamsIDs(newLimitedStreamsIDs);\n updateOldSoundIds(oldSoundIds);\n }\n}\n\n","\nimport { StreamSuccessScreenType, StreamSuccessScreenParameters, ShowAlert } from \"../types/types\";\nexport interface StartShareScreenParameters extends StreamSuccessScreenParameters {\n shared: boolean;\n showAlert?: ShowAlert;\n updateShared: (shared: boolean) => void;\n mediaDevices: MediaDevices;\n onWeb: boolean;\n targetWidth?: number;\n targetHeight?: number;\n\n // mediasfu functions\n streamSuccessScreen: StreamSuccessScreenType;\n [key: string]: any;\n}\n\nexport interface StartShareScreenOptions {\n parameters: StartShareScreenParameters;\n}\n\n// Export the type definition for the function\nexport type StartShareScreenType = (options: StartShareScreenOptions) => Promise<void>;\n\n/**\n * Starts the screen sharing process.\n *\n * @param {StartShareScreenOptions} options - The options for starting screen sharing.\n * @param {Object} options.parameters - The parameters for screen sharing.\n * @param {boolean} options.parameters.shared - Indicates if the screen is currently being shared.\n * @param {Function} options.parameters.showAlert - Function to show alert messages.\n * @param {Function} options.parameters.updateShared - Function to update the shared state.\n * @param {MediaDevices} options.parameters.mediaDevices - The media devices available for screen sharing.\n * @param {boolean} options.parameters.onWeb - Indicates if the application is running on a web platform.\n * @param {number} [options.parameters.targetWidth] - The target width for screen sharing.\n * @param {number} [options.parameters.targetHeight] - The target height for screen sharing.\n * @param {Function} options.parameters.streamSuccessScreen - Function to handle successful screen sharing.\n * \n * @returns {Promise<void>} A promise that resolves when the screen sharing process is complete.\n * \n * @throws Will log an error message if there is an issue starting the screen share.\n *\n * @example\n * const options = {\n * parameters: {\n * shared: false,\n * showAlert: showAlertFunction,\n * updateShared: updateSharedFunction,\n * mediaDevices: navigator.mediaDevices,\n * onWeb: true,\n * targetWidth: 1280,\n * targetHeight: 720,\n * streamSuccessScreen: streamSuccessFunction,\n * },\n * };\n * \n * startShareScreen(options)\n * .then(() => {\n * console.log('Screen sharing started successfully');\n * })\n * .catch(error => {\n * console.error('Error starting screen share:', error);\n * });\n */\n\nexport async function startShareScreen({ parameters }: StartShareScreenOptions): Promise<void> {\n let {\n shared,\n showAlert,\n updateShared,\n mediaDevices,\n onWeb,\n targetWidth = 1280,\n targetHeight = 720,\n\n streamSuccessScreen,\n } = parameters;\n\n try {\n if (!onWeb) {\n showAlert?.({\n message: \"You cannot share screen while on mobile\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n if (mediaDevices && mediaDevices.getDisplayMedia) {\n shared = true;\n await mediaDevices\n .getDisplayMedia({\n video: {\n width: targetWidth,\n height: targetHeight,\n frameRate: 30,\n },\n audio: false,\n })\n .then(async (stream: MediaStream) => {\n await streamSuccessScreen({ stream, parameters });\n })\n .catch(async () => {\n shared = false;\n showAlert?.({\n message: \"Could not share screen, check and retry\",\n type: \"danger\",\n duration: 3000,\n });\n });\n } else {\n showAlert?.({\n message: \"Could not share screen, check and retry\",\n type: \"danger\",\n duration: 3000,\n });\n }\n\n // Update the shared variable\n updateShared(shared);\n } catch (error) {\n console.log(\"Error starting screen share\", error);\n }\n}\n\n","import { DisconnectSendTransportScreenType, PrepopulateUserMediaType, ReorderStreamsType, GetVideosType, DisconnectSendTransportScreenParameters, PrepopulateUserMediaParameters, ReorderStreamsParameters, EventType } from '../types/types';\nexport interface StopShareScreenParameters extends DisconnectSendTransportScreenParameters, PrepopulateUserMediaParameters, ReorderStreamsParameters {\n shared: boolean;\n shareScreenStarted: boolean;\n shareEnded: boolean;\n updateMainWindow: boolean;\n defer_receive: boolean;\n hostLabel: string;\n lock_screen: boolean;\n forceFullDisplay: boolean;\n firstAll: boolean;\n first_round: boolean;\n localStreamScreen: MediaStream | null;\n eventType: EventType;\n prevForceFullDisplay: boolean;\n annotateScreenStream: boolean;\n\n updateShared: (shared: boolean) => void;\n updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n updateShareEnded: (shareEnded: boolean) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n updateDefer_receive: (defer_receive: boolean) => void;\n updateLock_screen: (lock_screen: boolean) => void;\n updateForceFullDisplay: (forceFullDisplay: boolean) => void;\n updateFirstAll: (firstAll: boolean) => void;\n updateFirst_round: (first_round: boolean) => void;\n updateLocalStreamScreen: (localStreamScreen: MediaStream | null) => void;\n updateMainHeightWidth: (mainHeightWidth: number) => void;\n updateAnnotateScreenStream: (annotateScreenStream: boolean) => void;\n updateIsScreenboardModalVisible: (isVisible: boolean) => void;\n\n // mediasfu functions\n disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n reorderStreams: ReorderStreamsType;\n getVideos: GetVideosType;\n\n getUpdatedAllParams: () => StopShareScreenParameters;\n [key: string]: any;\n}\n\nexport interface StopShareScreenOptions {\n parameters: StopShareScreenParameters;\n}\n\n// Export the type definition for the function\nexport type StopShareScreenType = (options: StopShareScreenOptions) => Promise<void>;\n\n/**\n * Stops the screen sharing process and updates the relevant parameters and states.\n * \n * @param {StopShareScreenOptions} options - The options for stopping the screen share.\n * @param {Object} options.parameters - The parameters required for stopping the screen share.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {boolean} options.parameters.shared - Indicates if the screen is currently shared.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if the screen sharing has started.\n * @param {boolean} options.parameters.shareEnded - Indicates if the screen sharing has ended.\n * @param {boolean} options.parameters.updateMainWindow - Indicates if the main window needs to be updated.\n * @param {boolean} options.parameters.defer_receive - Indicates if receiving is deferred.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {boolean} options.parameters.forceFullDisplay - Indicates if full display is forced.\n * @param {boolean} options.parameters.firstAll - Indicates if it is the first all.\n * @param {boolean} options.parameters.first_round - Indicates if it is the first round.\n * @param {MediaStream} options.parameters.localStreamScreen - The local screen stream.\n * @param {string} options.parameters.eventType - The type of event.\n * @param {boolean} options.parameters.prevForceFullDisplay - Indicates if full display was previously forced.\n * @param {boolean} options.parameters.annotateScreenStream - Indicates if the screen stream is annotated.\n * @param {Function} options.parameters.updateShared - Function to update the shared state.\n * @param {Function} options.parameters.updateShareScreenStarted - Function to update the share screen started state.\n * @param {Function} options.parameters.updateShareEnded - Function to update the share ended state.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window state.\n * @param {Function} options.parameters.updateDefer_receive - Function to update the defer receive state.\n * @param {Function} options.parameters.updateLock_screen - Function to update the lock screen state.\n * @param {Function} options.parameters.updateForceFullDisplay - Function to update the force full display state.\n * @param {Function} options.parameters.updateFirstAll - Function to update the first all state.\n * @param {Function} options.parameters.updateFirst_round - Function to update the first round state.\n * @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen stream.\n * @param {Function} options.parameters.updateMainHeightWidth - Function to update the main height and width.\n * @param {Function} options.parameters.updateAnnotateScreenStream - Function to update the annotate screen stream state.\n * @param {Function} options.parameters.updateIsScreenboardModalVisible - Function to update the screenboard modal visibility.\n * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport screen.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {Function} options.parameters.reorderStreams - Function to reorder streams.\n * @param {Function} options.parameters.getVideos - Function to get videos.\n * \n * @returns {Promise<void>} A promise that resolves when the screen sharing process is stopped.\n *\n * @example\n * const options = {\n * parameters: {\n * shared: true,\n * shareScreenStarted: true,\n * shareEnded: false,\n * updateMainWindow: true,\n * defer_receive: false,\n * hostLabel: \"Host\",\n * lock_screen: false,\n * forceFullDisplay: false,\n * firstAll: false,\n * first_round: false,\n * localStreamScreen: localStream, // MediaStream object\n * eventType: \"conference\",\n * prevForceFullDisplay: false,\n * annotateScreenStream: false,\n * updateShared: updateSharedFunction,\n * updateShareScreenStarted: updateShareScreenStartedFunction,\n * updateShareEnded: updateShareEndedFunction,\n * updateUpdateMainWindow: updateUpdateMainWindowFunction,\n * updateDefer_receive: updateDefer_receiveFunction,\n * updateLock_screen: updateLock_screenFunction,\n * updateForceFullDisplay: updateForceFullDisplayFunction,\n * updateFirstAll: updateFirstAllFunction,\n * updateFirst_round: updateFirst_roundFunction,\n * updateLocalStreamScreen: updateLocalStreamScreenFunction,\n * updateMainHeightWidth: updateMainHeightWidthFunction,\n * updateAnnotateScreenStream: updateAnnotateScreenStreamFunction,\n * updateIsScreenboardModalVisible: updateIsScreenboardModalVisibleFunction,\n * disconnectSendTransportScreen: disconnectSendTransportScreenFunction,\n * prepopulateUserMedia: prepopulateUserMediaFunction,\n * reorderStreams: reorderStreamsFunction,\n * getVideos: getVideosFunction,\n * },\n * };\n * \n * stopShareScreen(options)\n * .then(() => {\n * console.log('Screen sharing stopped successfully');\n * })\n * .catch(error => {\n * console.error('Error stopping screen share:', error);\n * });\n */\n\nexport async function stopShareScreen({ parameters }: StopShareScreenOptions): Promise<void> {\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n shared,\n shareScreenStarted,\n shareEnded,\n updateMainWindow,\n defer_receive,\n hostLabel,\n lock_screen,\n forceFullDisplay,\n firstAll,\n first_round,\n localStreamScreen,\n eventType,\n prevForceFullDisplay,\n annotateScreenStream,\n\n updateShared,\n updateShareScreenStarted,\n updateShareEnded,\n updateUpdateMainWindow,\n updateDefer_receive,\n updateLock_screen,\n updateForceFullDisplay,\n updateFirstAll,\n updateFirst_round,\n updateLocalStreamScreen,\n updateMainHeightWidth,\n updateAnnotateScreenStream,\n updateIsScreenboardModalVisible,\n\n disconnectSendTransportScreen,\n prepopulateUserMedia,\n reorderStreams,\n getVideos,\n } = parameters;\n\n shared = false;\n updateShared(shared);\n shareScreenStarted = false;\n updateShareScreenStarted(shareScreenStarted);\n shareEnded = true;\n updateShareEnded(shareEnded);\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n\n if (defer_receive) {\n defer_receive = false;\n updateDefer_receive(defer_receive);\n await getVideos({ \n participants: parameters.participants,\n allVideoStreams: parameters.allVideoStreams,\n oldAllStreams: parameters.oldAllStreams,\n adminVidID: parameters.adminVidID,\n updateAllVideoStreams: parameters.updateAllVideoStreams,\n updateOldAllStreams: parameters.updateOldAllStreams\n });\n }\n try {\n localStreamScreen!.getTracks().forEach(track => track.stop());\n } catch {\n // Do nothing\n }\n updateLocalStreamScreen(null);\n await disconnectSendTransportScreen({ parameters });\n\n try {\n if (annotateScreenStream) {\n annotateScreenStream = false;\n updateAnnotateScreenStream(annotateScreenStream);\n updateIsScreenboardModalVisible(true);\n await new Promise(resolve => setTimeout(resolve, 500));\n updateIsScreenboardModalVisible(false);\n }\n } catch (error) {\n console.log('Error handling screen annotation:', error);\n }\n\n if (eventType === 'conference') {\n updateMainHeightWidth(0);\n }\n\n try {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } catch (error) {\n console.log(\"Error in prepopulateUserMedia\", error);\n }\n\n try {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n } catch (error) {\n console.log(\"Error in reorderStreams\", error);\n }\n\n lock_screen = false;\n updateLock_screen(lock_screen);\n forceFullDisplay = prevForceFullDisplay;\n updateForceFullDisplay(forceFullDisplay);\n firstAll = false;\n updateFirstAll(firstAll);\n first_round = false;\n updateFirst_round(first_round);\n}\n\n"," \n\nimport { Socket } from \"socket.io-client\";\nimport type { ProducerOptions } from 'mediasoup-client/lib/types';\nimport { Participant, PrepopulateUserMediaParameters, ShowAlert, CreateSendTransportParameters, ConnectSendTransportAudioParameters, ResumeSendTransportAudioParameters, PrepopulateUserMediaType, CreateSendTransportType, ConnectSendTransportAudioType, ResumeSendTransportAudioType } from \"../types/types\";\nexport interface StreamSuccessAudioParameters extends CreateSendTransportParameters, ConnectSendTransportAudioParameters, ResumeSendTransportAudioParameters, PrepopulateUserMediaParameters {\n socket: Socket;\n participants: Participant[];\n localStream: MediaStream | null;\n transportCreated: boolean;\n transportCreatedAudio: boolean;\n audioAlreadyOn: boolean;\n micAction: boolean;\n audioParams: ProducerOptions;\n localStreamAudio: MediaStream | null;\n defAudioID: string;\n userDefaultAudioInputDevice: string;\n params: ProducerOptions;\n audioParamse?: ProducerOptions;\n aParams: ProducerOptions;\n hostLabel: string;\n islevel: string;\n member: string;\n updateMainWindow: boolean;\n lock_screen: boolean;\n shared: boolean;\n videoAlreadyOn: boolean;\n showAlert?: ShowAlert;\n\n updateParticipants: (participants: Participant[]) => void;\n updateTransportCreated: (transportCreated: boolean) => void;\n updateTransportCreatedAudio: (transportCreatedAudio: boolean) => void;\n updateAudioAlreadyOn: (audioAlreadyOn: boolean) => void;\n updateMicAction: (micAction: boolean) => void;\n updateAudioParams: (audioParams: ProducerOptions) => void;\n updateLocalStream: (localStream: MediaStream | null) => void;\n updateLocalStreamAudio: (localStreamAudio: MediaStream | null) => void;\n updateDefAudioID: (defAudioID: string) => void;\n updateUserDefaultAudioInputDevice: (userDefaultAudioInputDevice: string) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n // mediasfu functions\n createSendTransport: CreateSendTransportType;\n connectSendTransportAudio: ConnectSendTransportAudioType;\n resumeSendTransportAudio: ResumeSendTransportAudioType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n \n getUpdatedAllParams: () => StreamSuccessAudioParameters;\n [key: string]: any;\n}\n\nexport interface StreamSuccessAudioOptions {\n stream: MediaStream;\n parameters: StreamSuccessAudioParameters;\n}\n\n// Export the type definition for the function\nexport type StreamSuccessAudioType = (options: StreamSuccessAudioOptions) => Promise<void>;\n\n/**\n * Handles the successful streaming of audio by setting up the necessary transports and updating the relevant states.\n *\n * @param {StreamSuccessAudioOptions} options - The options for streaming success audio.\n * @param {MediaStream} options.stream - The media stream containing the audio track.\n * @param {Object} options.parameters - The parameters required for setting up the audio stream.\n * @param {Socket} options.parameters.socket - The socket connection for communication.\n * @param {Array<Participant>} options.parameters.participants - The list of participants.\n * @param {MediaStream | null} options.parameters.localStream - The local media stream.\n * @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is created.\n * @param {boolean} options.parameters.transportCreatedAudio - Flag indicating if the audio transport is created.\n * @param {boolean} options.parameters.audioAlreadyOn - Flag indicating if the audio is already on.\n * @param {boolean} options.parameters.micAction - Flag indicating the microphone action.\n * @param {ProducerOptions} options.parameters.audioParams - The audio parameters.\n * @param {MediaStream | null} options.parameters.localStreamAudio - The local audio stream.\n * @param {string} options.parameters.defAudioID - The default audio device ID.\n * @param {string} options.parameters.userDefaultAudioInputDevice - The user default audio input device.\n * @param {ProducerOptions} options.parameters.params - Additional parameters.\n * @param {ProducerOptions} options.parameters.audioParamse - Additional audio parameters.\n * @param {ProducerOptions} options.parameters.aParams - Additional parameters for audio.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {string} options.parameters.islevel - The level of the user.\n * @param {string} options.parameters.member - The member name.\n * @param {boolean} options.parameters.updateMainWindow - Flag indicating if the main window should be updated.\n * @param {boolean} options.parameters.lock_screen - Flag indicating if the screen is locked.\n * @param {boolean} options.parameters.shared - Flag indicating if the screen is shared.\n * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if the video is already on.\n * @param {Function} options.parameters.showAlert - Function to show alert messages.\n * @param {Function} options.parameters.updateParticipants - Function to update participants.\n * @param {Function} options.parameters.updateTransportCreated - Function to update transport created flag.\n * @param {Function} options.parameters.updateTransportCreatedAudio - Function to update audio transport created flag.\n * @param {Function} options.parameters.updateAudioAlreadyOn - Function to update audio already on flag.\n * @param {Function} options.parameters.updateMicAction - Function to update microphone action flag.\n * @param {Function} options.parameters.updateAudioParams - Function to update audio parameters.\n * @param {Function} options.parameters.updateLocalStream - Function to update local stream.\n * @param {Function} options.parameters.updateLocalStreamAudio - Function to update local audio stream.\n * @param {Function} options.parameters.updateDefAudioID - Function to update default audio device ID.\n * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update user default audio input device.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update main window flag.\n * @param {Function} options.parameters.createSendTransport - Function to create send transport.\n * @param {Function} options.parameters.connectSendTransportAudio - Function to connect send transport audio.\n * @param {Function} options.parameters.resumeSendTransportAudio - Function to resume send transport audio.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n *\n * @returns {Promise<void>} A promise that resolves when the audio streaming setup is complete.\n *\n * @example\n * const options = {\n * stream: localStream, // MediaStream object containing the audio track\n * parameters: {\n * socket: socketInstance,\n * participants: participantList,\n * localStream: null,\n * transportCreated: false,\n * transportCreatedAudio: false,\n * audioAlreadyOn: false,\n * micAction: false,\n * audioParams: {},\n * localStreamAudio: null,\n * defAudioID: \"\",\n * userDefaultAudioInputDevice: \"\",\n * params: {},\n * audioParamse: {},\n * aParams: {},\n * hostLabel: \"Host\",\n * islevel: \"1\",\n * member: \"user1\",\n * updateMainWindow: true,\n * lock_screen: false,\n * shared: false,\n * videoAlreadyOn: false,\n * showAlert: alertFunction,\n * updateParticipants: updateParticipantsFunction,\n * updateTransportCreated: updateTransportCreatedFunction,\n * updateTransportCreatedAudio: updateTransportCreatedAudioFunction,\n * updateAudioAlreadyOn: updateAudioAlreadyOnFunction,\n * updateMicAction: updateMicActionFunction,\n * updateAudioParams: updateAudioParamsFunction,\n * updateLocalStream: updateLocalStreamFunction,\n * updateLocalStreamAudio: updateLocalStreamAudioFunction,\n * updateDefAudioID: updateDefAudioIDFunction,\n * updateUserDefaultAudioInputDevice: updateUserDefaultAudioInputDeviceFunction,\n * updateUpdateMainWindow: updateUpdateMainWindowFunction,\n * createSendTransport: createSendTransportFunction,\n * connectSendTransportAudio: connectSendTransportAudioFunction,\n * resumeSendTransportAudio: resumeSendTransportAudioFunction,\n * prepopulateUserMedia: prepopulateUserMediaFunction,\n * },\n * };\n * \n * streamSuccessAudio(options)\n * .then(() => {\n * console.log('Audio streaming setup successfully');\n * })\n * .catch(error => {\n * console.error('Error setting up audio streaming:', error);\n * });\n */\n\nexport const streamSuccessAudio = async ({\n stream,\n parameters,\n}: StreamSuccessAudioOptions): Promise<void> => {\n let {\n socket,\n participants,\n localStream,\n transportCreated,\n transportCreatedAudio,\n audioAlreadyOn,\n micAction,\n audioParams,\n localStreamAudio,\n defAudioID,\n userDefaultAudioInputDevice,\n params,\n audioParamse,\n aParams,\n hostLabel,\n islevel,\n member,\n updateMainWindow,\n lock_screen,\n shared,\n videoAlreadyOn,\n showAlert,\n\n //update functions\n updateParticipants,\n updateTransportCreated,\n updateTransportCreatedAudio,\n updateAudioAlreadyOn,\n updateMicAction,\n updateAudioParams,\n updateLocalStream,\n updateLocalStreamAudio,\n updateDefAudioID,\n updateUserDefaultAudioInputDevice,\n updateUpdateMainWindow,\n\n //mediasfu functions\n createSendTransport,\n connectSendTransportAudio,\n resumeSendTransportAudio,\n prepopulateUserMedia,\n } = parameters;\n\n localStreamAudio = stream;\n updateLocalStreamAudio(localStreamAudio);\n\n if (localStream == null) {\n localStream = new MediaStream([localStreamAudio.getAudioTracks()[0]]);\n updateLocalStream(localStream);\n } else {\n localStream.addTrack(localStreamAudio.getAudioTracks()[0]);\n updateLocalStream(localStream);\n }\n\n const audioTracked = localStream.getAudioTracks()[0];\n defAudioID = audioTracked.getSettings().deviceId || \"\";\n userDefaultAudioInputDevice = defAudioID;\n\n updateDefAudioID(defAudioID);\n updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice);\n\n try {\n params = aParams;\n audioParamse = { ...params };\n\n audioParams = {\n track: localStream.getAudioTracks()[0],\n ...audioParamse,\n };\n updateAudioParams(audioParams);\n\n if (!transportCreated) {\n try {\n await createSendTransport({\n parameters: {\n ...parameters,\n audioParams: audioParams,\n },\n option: \"audio\",\n });\n } catch (error) {\n console.error(\"Error creating transport:\", error);\n }\n } else {\n if (!transportCreatedAudio) {\n await connectSendTransportAudio({\n audioParams,\n parameters,\n });\n } else {\n await resumeSendTransportAudio({ parameters });\n }\n }\n } catch (error: any) {\n if (showAlert) {\n showAlert({\n message: error.message,\n type: \"danger\",\n duration: 3000,\n });\n }\n }\n\n audioAlreadyOn = true;\n updateAudioAlreadyOn(audioAlreadyOn);\n\n if (micAction === true) {\n micAction = false;\n updateMicAction(micAction);\n }\n\n participants.forEach((participant) => {\n if (participant.socketId === socket.id && participant.name === member) {\n participant.muted = false;\n }\n });\n updateParticipants(participants);\n\n transportCreated = true;\n transportCreatedAudio = true;\n updateTransportCreated(transportCreated);\n updateTransportCreatedAudio(transportCreatedAudio);\n\n if (!videoAlreadyOn && islevel === \"2\") {\n if (!lock_screen && !shared) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updateMainWindow = false;\n updateUpdateMainWindow(updateMainWindow);\n }\n }\n};\n\n","\n\nimport type { Producer, ProducerCodecOptions, ProducerOptions } from 'mediasoup-client/lib/types';\nimport { Socket } from \"socket.io-client\";\nimport { PrepopulateUserMediaParameters, PrepopulateUserMediaType, CreateSendTransportParameters, CreateSendTransportType, ConnectSendTransportAudioParameters, ConnectSendTransportAudioType, SleepType } from \"../types/types\";\n\nexport interface StreamSuccessAudioSwitchParameters extends PrepopulateUserMediaParameters, CreateSendTransportParameters, ConnectSendTransportAudioParameters {\n audioProducer: Producer | null;\n localAudioProducer?: Producer | null;\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n localStream: MediaStream | null;\n localStreamAudio: MediaStream | null;\n audioParams: ProducerOptions;\n audioPaused: boolean;\n audioAlreadyOn: boolean;\n transportCreated: boolean;\n localTransportCreated?: boolean;\n audioParamse?: ProducerCodecOptions;\n defAudioID: string;\n userDefaultAudioInputDevice: string;\n hostLabel: string;\n updateMainWindow: boolean;\n videoAlreadyOn: boolean;\n islevel: string;\n lock_screen: boolean;\n shared: boolean;\n\n updateAudioProducer: (audioProducer: Producer | null) => void;\n updateLocalAudioProducer?: (localAudioProducer: Producer | null) => void;\n updateLocalStream: (localStream: MediaStream | null) => void;\n updateAudioParams: (audioParams: ProducerOptions) => void;\n updateDefAudioID: (defAudioID: string) => void;\n updateUserDefaultAudioInputDevice: (userDefaultAudioInputDevice: string) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n // mediasfu functions\n sleep: SleepType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n createSendTransport: CreateSendTransportType;\n connectSendTransportAudio: ConnectSendTransportAudioType;\n\n getUpdatedAllParams: () => StreamSuccessAudioSwitchParameters;\n [key: string]: any;\n}\n\nexport interface StreamSuccessAudioSwitchOptions {\n stream: MediaStream;\n parameters: StreamSuccessAudioSwitchParameters;\n}\n\n// Export the type definition for the function\nexport type StreamSuccessAudioSwitchType = (options: StreamSuccessAudioSwitchOptions) => Promise<void>;\n\n/**\n * Handles the switching of the audio stream upon successful stream connection.\n *\n * @param {StreamSuccessAudioSwitchOptions} options - The options for the audio stream success switch.\n * @param {MediaStream} options.stream - The new media stream containing the audio track.\n * @param {Object} options.parameters - The parameters required for setting up the audio stream.\n * @param {Producer} options.parameters.audioProducer - The current audio producer.\n * @param {Producer} options.parameters.localAudioProducer - The local audio producer.\n * @param {Socket} options.parameters.socket - The socket connection for communication.\n * @param {Socket} options.parameters.localSocket - The local socket connection for communication.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {MediaStream | null} options.parameters.localStream - The local media stream.\n * @param {MediaStream | null} options.parameters.localStreamAudio - The local audio stream.\n * @param {ProducerOptions} options.parameters.audioParams - The audio parameters.\n * @param {boolean} options.parameters.audioPaused - Indicates if the audio is paused.\n * @param {boolean} options.parameters.audioAlreadyOn - Indicates if the audio is already on.\n * @param {boolean} options.parameters.transportCreated - Indicates if the transport is created.\n * @param {ProducerCodecOptions} options.parameters.audioParamse - Additional audio parameters.\n * @param {string} options.parameters.defAudioID - The default audio device ID.\n * @param {string} options.parameters.userDefaultAudioInputDevice - The user default audio input device.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {boolean} options.parameters.updateMainWindow - Indicates if the main window should be updated.\n * @param {boolean} options.parameters.videoAlreadyOn - Indicates if the video is already on.\n * @param {string} options.parameters.islevel - The level of the participant.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {Function} options.parameters.updateAudioProducer - Function to update the audio producer.\n * @param {Function} options.parameters.updateLocalAudioProducer - Function to update the local audio producer.\n * @param {Function} options.parameters.updateLocalStream - Function to update the local stream.\n * @param {Function} options.parameters.updateAudioParams - Function to update the audio parameters.\n * @param {Function} options.parameters.updateDefAudioID - Function to update the default audio device ID.\n * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update the user default audio input device.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {Function} options.parameters.sleep - Function to pause execution for a specified time.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {Function} options.parameters.createSendTransport - Function to create a send transport.\n * @param {Function} options.parameters.connectSendTransportAudio - Function to connect the send transport for audio.\n *\n * @returns {Promise<void>} A promise that resolves when the audio stream switch is complete.\n * \n * @example\n * const options = {\n * stream: newAudioStream, // MediaStream object containing the new audio track\n * parameters: {\n * audioProducer: currentAudioProducer,\n * localAudioProducer: localAudioProducerInstance,\n * localSocket: localSocketInstance, \n * socket: socketInstance,\n * roomName: \"Room1\",\n * localStream: null,\n * localStreamAudio: null,\n * audioParams: audioProducerOptions,\n * audioPaused: false,\n * audioAlreadyOn: true,\n * transportCreated: false,\n * audioParamse: additionalAudioParams,\n * defAudioID: \"default-audio-device-id\",\n * userDefaultAudioInputDevice: \"user-input-device-id\",\n * hostLabel: \"Host\",\n * islevel: \"1\",\n * videoAlreadyOn: false,\n * lock_screen: false,\n * shared: false,\n * updateAudioProducer: updateAudioProducerFunction,\n * updateLocalAudioProducer: updateLocalAudioProducerFunction,\n * updateLocalStream: updateLocalStreamFunction,\n * updateAudioParams: updateAudioParamsFunction,\n * updateDefAudioID: updateDefAudioIDFunction,\n * updateUserDefaultAudioInputDevice: updateUserDefaultAudioInputDeviceFunction,\n * updateUpdateMainWindow: updateMainWindowFunction,\n * sleep: sleepFunction,\n * prepopulateUserMedia: prepopulateUserMediaFunction,\n * createSendTransport: createSendTransportFunction,\n * connectSendTransportAudio: connectSendTransportAudioFunction,\n * },\n * };\n * \n * streamSuccessAudioSwitch(options)\n * .then(() => {\n * console.log('Audio stream switched successfully');\n * })\n * .catch(error => {\n * console.error('Error switching audio stream:', error);\n * });\n */\n\nexport const streamSuccessAudioSwitch = async ({\n stream,\n parameters,\n}: StreamSuccessAudioSwitchOptions): Promise<void> => {\n\n let {\n audioProducer,\n localAudioProducer,\n socket,\n localSocket,\n roomName,\n localStream,\n localStreamAudio,\n audioParams,\n audioPaused,\n audioAlreadyOn,\n transportCreated,\n audioParamse,\n defAudioID,\n userDefaultAudioInputDevice,\n hostLabel,\n updateMainWindow,\n videoAlreadyOn,\n islevel,\n lock_screen,\n shared,\n\n updateAudioProducer,\n updateLocalAudioProducer,\n updateLocalStream,\n updateAudioParams,\n updateDefAudioID,\n updateUserDefaultAudioInputDevice,\n updateUpdateMainWindow,\n\n //mediasfu functions\n sleep,\n prepopulateUserMedia,\n createSendTransport,\n connectSendTransportAudio,\n } = parameters;\n\n // Get the new default audio device ID\n let newDefAudioID = stream.getAudioTracks()[0].getSettings().deviceId;\n\n // Check if the audio device has changed\n if (newDefAudioID !== defAudioID) {\n // Close the current audioProducer\n if (audioProducer) {\n audioProducer.close();\n updateAudioProducer(audioProducer);\n }\n\n // Emit a pauseProducerMedia event to pause the audio media\n socket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n force: true,\n });\n\n try {\n if (localSocket && localSocket.id) {\n if (localAudioProducer) {\n localAudioProducer.close();\n if (updateLocalAudioProducer){\n updateLocalAudioProducer(localAudioProducer);\n }\n }\n localSocket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n force: true,\n });\n }\n } catch {\n // Do nothing\n }\n\n // Update the localStreamAudio with the new audio tracks\n localStreamAudio = stream;\n\n // If localStream is null, create a new MediaStream with the new audio track\n if (localStream == null) {\n localStream = new MediaStream([\n localStreamAudio.getAudioTracks()[0],\n ]);\n } else {\n // Remove all existing audio tracks from localStream and add the new audio track\n localStream.getAudioTracks().forEach((track) => {\n localStream!.removeTrack(track);\n });\n localStream.addTrack(localStreamAudio.getAudioTracks()[0]);\n }\n\n // Update localStream\n updateLocalStream(localStream);\n\n // Get the new default audio device ID from the new audio track\n const audioTracked = localStream.getAudioTracks()[0];\n defAudioID = audioTracked.getSettings().deviceId || \"\";\n updateDefAudioID(defAudioID);\n\n // Update userDefaultAudioInputDevice\n userDefaultAudioInputDevice = defAudioID;\n updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice);\n\n // Update audioParams with the new audio track\n audioParams = {\n track: localStream.getAudioTracks()[0],\n ...audioParamse,\n };\n updateAudioParams(audioParams);\n\n // Sleep for 500 milliseconds\n await sleep({ ms: 500 });\n\n // Create a new send transport if not created, otherwise, connect the existing transport\n if (!transportCreated) {\n try {\n await createSendTransport({\n parameters: {\n ...parameters,\n audioParams: audioParams,\n },\n option: \"audio\",\n });\n } catch (error) {\n console.error(\"Error creating send transport:\", error);\n }\n } else {\n await connectSendTransportAudio({\n audioParams,\n parameters,\n });\n }\n\n // If audio is paused and not already on, pause the audioProducer and emit a pauseProducerMedia event\n if (audioPaused === true && !audioAlreadyOn) {\n audioProducer!.pause();\n updateAudioProducer(audioProducer);\n socket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n });\n\n try {\n if (localSocket && localSocket.id) {\n localAudioProducer!.pause();\n if (updateLocalAudioProducer){\n updateLocalAudioProducer(localAudioProducer!);\n }\n localSocket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n });\n }\n } catch {\n // Do nothing\n }\n }\n }\n\n // Update the UI based on the participant's level and screen lock status\n if (!videoAlreadyOn && islevel === \"2\") {\n if (!lock_screen && !shared) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updateMainWindow = false;\n updateUpdateMainWindow(updateMainWindow);\n }\n }\n};\n\n"," \n\nimport { Socket } from \"socket.io-client\";\nimport {\n SleepType, CreateSendTransportType, ConnectSendTransportScreenType, DisconnectSendTransportScreenType, StopShareScreenType, ReorderStreamsType, PrepopulateUserMediaType, RePortType,\n ShowAlert, CreateSendTransportParameters, ConnectSendTransportScreenParameters, DisconnectSendTransportScreenParameters, StopShareScreenParameters, ReorderStreamsParameters, PrepopulateUserMediaParameters,\n EventType\n} from \"../types/types\";\n\nexport interface StreamSuccessScreenParameters extends CreateSendTransportParameters, ConnectSendTransportScreenParameters, DisconnectSendTransportScreenParameters, StopShareScreenParameters, ReorderStreamsParameters, PrepopulateUserMediaParameters {\n socket: Socket;\n transportCreated: boolean;\n localStreamScreen: MediaStream | null;\n screenAlreadyOn: boolean;\n screenAction: boolean;\n transportCreatedScreen: boolean;\n hostLabel: string;\n eventType: EventType;\n showAlert?: ShowAlert;\n annotateScreenStream: boolean;\n shared: boolean;\n\n updateTransportCreatedScreen: (transportCreatedScreen: boolean) => void;\n updateScreenAlreadyOn: (screenAlreadyOn: boolean) => void;\n updateScreenAction: (screenAction: boolean) => void;\n updateTransportCreated: (transportCreated: boolean) => void;\n updateLocalStreamScreen: (localStreamScreen: MediaStream | null) => void;\n updateShared: (shared: boolean) => void;\n updateIsScreenboardModalVisible: (isVisible: boolean) => void;\n\n // mediasfu functions\n sleep: SleepType;\n createSendTransport: CreateSendTransportType;\n connectSendTransportScreen: ConnectSendTransportScreenType;\n disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n stopShareScreen: StopShareScreenType;\n reorderStreams: ReorderStreamsType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n rePort: RePortType;\n\n getUpdatedAllParams: () => StreamSuccessScreenParameters;\n [key: string]: any;\n}\n\nexport interface StreamSuccessScreenOptions {\n stream: MediaStream;\n parameters: StreamSuccessScreenParameters;\n}\n\n// Export the type definition for the function\nexport type StreamSuccessScreenType = (options: StreamSuccessScreenOptions) => Promise<void>;\n\n/**\n * Handles the successful initiation of screen sharing.\n *\n * @param {StreamSuccessScreenOptions} options - The options for the screen sharing success handler.\n * @param {MediaStream} options.stream - The media stream to be shared.\n * @param {Object} options.parameters - The parameters required for screen sharing.\n * @param {Socket} options.parameters.socket - The socket instance for communication.\n * @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is already created.\n * @param {MediaStream | null} options.parameters.localStreamScreen - The local screen media stream.\n * @param {boolean} options.parameters.screenAlreadyOn - Flag indicating if the screen is already being shared.\n * @param {boolean} options.parameters.screenAction - Flag indicating if the screen share action is requested.\n * @param {boolean} options.parameters.transportCreatedScreen - Flag indicating if the screen transport is created.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {string} options.parameters.eventType - The type of the event (e.g., conference).\n * @param {Function} options.parameters.showAlert - Function to show alerts.\n * @param {boolean} options.parameters.annotateScreenStream - Flag indicating if screen annotation is enabled.\n * @param {Function} options.parameters.updateTransportCreatedScreen - Function to update the screen transport creation state.\n * @param {Function} options.parameters.updateScreenAlreadyOn - Function to update the screen sharing state.\n * @param {Function} options.parameters.updateScreenAction - Function to update the screen action state.\n * @param {Function} options.parameters.updateTransportCreated - Function to update the transport creation state.\n * @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen stream.\n * @param {Function} options.parameters.updateShared - Function to update the shared state.\n * @param {Function} options.parameters.updateIsScreenboardModalVisible - Function to update the screenboard modal visibility.\n * @param {Function} options.parameters.sleep - Function to pause execution for a specified duration.\n * @param {Function} options.parameters.createSendTransport - Function to create a send transport.\n * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the send transport for screen sharing.\n * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport for screen sharing.\n * @param {Function} options.parameters.stopShareScreen - Function to stop screen sharing.\n * @param {Function} options.parameters.reorderStreams - Function to reorder streams.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {Function} options.parameters.rePort - Function to reinitialize ports.\n *\n * @returns {Promise<void>} A promise that resolves when the screen sharing setup is complete.\n * \n * @throws Will throw an error if there is an issue with screen sharing.\n * \n * @example\n * ```typescript\n * await streamSuccessScreen({\n * stream: mediaStream,\n * parameters: {\n * socket,\n * transportCreated,\n * localStreamScreen: null,\n * screenAlreadyOn: false,\n * screenAction: true,\n * transportCreatedScreen: false,\n * hostLabel: \"Host\",\n * eventType: \"conference\",\n * showAlert,\n * annotateScreenStream: false,\n * updateTransportCreatedScreen,\n * updateScreenAlreadyOn,\n * updateScreenAction,\n * updateTransportCreated,\n * updateLocalStreamScreen,\n * updateShared,\n * updateIsScreenboardModalVisible,\n * sleep,\n * createSendTransport,\n * connectSendTransportScreen,\n * disconnectSendTransportScreen,\n * stopShareScreen,\n * reorderStreams,\n * prepopulateUserMedia,\n * rePort,\n * },\n * });\n * ```\n */\n\nexport const streamSuccessScreen = async ({\n stream,\n parameters,\n}: StreamSuccessScreenOptions): Promise<void> => {\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n socket,\n transportCreated,\n localStreamScreen,\n screenAlreadyOn,\n screenAction,\n transportCreatedScreen,\n hostLabel,\n eventType,\n showAlert,\n annotateScreenStream,\n\n updateTransportCreatedScreen,\n updateScreenAlreadyOn,\n updateScreenAction,\n updateTransportCreated,\n updateLocalStreamScreen,\n updateShared,\n updateIsScreenboardModalVisible,\n sleep,\n\n // mediasfu functions\n createSendTransport,\n connectSendTransportScreen,\n disconnectSendTransportScreen,\n stopShareScreen,\n reorderStreams,\n prepopulateUserMedia,\n rePort,\n } = parameters;\n\n // Share screen on success\n localStreamScreen = stream;\n updateLocalStreamScreen(localStreamScreen);\n\n try {\n // Create transport if not created else connect transport\n if (!transportCreated) {\n await createSendTransport({\n option: \"screen\",\n parameters: { ...parameters, localStreamScreen },\n });\n } else {\n await connectSendTransportScreen({\n stream: localStreamScreen,\n parameters: { ...parameters, localStreamScreen },\n });\n }\n\n // Alert the socket that you are sharing the screen\n socket.emit(\"startScreenShare\");\n } catch (error: any) {\n showAlert?.({\n message: error.message,\n type: \"danger\",\n duration: 3000,\n });\n }\n\n // Re-update the screen display\n try {\n updateShared(true);\n await prepopulateUserMedia({\n name: hostLabel,\n parameters: { ...parameters, localStreamScreen, shared: true },\n });\n } catch (error) {\n console.error(\"Error updating shared screen UI:\", error);\n }\n\n // Update the screen sharing state\n screenAlreadyOn = true;\n updateScreenAlreadyOn(screenAlreadyOn);\n\n // Reorder streams if required\n try {\n if (eventType === \"conference\") {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } else {\n await reorderStreams({ parameters });\n }\n } catch {\n try {\n await rePort({ parameters });\n } catch {\n // console.error(\"Error reordering streams:\", error);\n\n }\n }\n\n // Handle screen share end\n localStreamScreen.getVideoTracks()[0].onended = async function () {\n // Supports both manual and automatic screen share end\n await disconnectSendTransportScreen({ parameters });\n await stopShareScreen({ parameters });\n };\n\n // If user requested to share screen, update the screenAction state\n if (screenAction === true) {\n screenAction = false;\n }\n updateScreenAction(screenAction);\n\n // Update the transport created state\n transportCreatedScreen = true;\n updateTransportCreatedScreen(transportCreatedScreen);\n transportCreated = true;\n updateTransportCreated(transportCreated);\n\n // Handle screen annotation modal\n try {\n if (annotateScreenStream) {\n annotateScreenStream = false;\n updateIsScreenboardModalVisible(true);\n await sleep({ ms: 500 });\n updateIsScreenboardModalVisible(false);\n }\n } catch (error) {\n console.error(\"Error handling screen annotation:\", error);\n }\n\n\n};\n\n","import type { Device, Producer, ProducerOptions, RtpCodecCapability } from 'mediasoup-client/lib/types';\nimport { Socket } from \"socket.io-client\";\nimport { ConnectSendTransportVideoParameters, Participant, ShowAlert, CreateSendTransportParameters, ReorderStreamsParameters, SleepType, CreateSendTransportType, ConnectSendTransportVideoType, ReorderStreamsType, HParamsType, VParamsType } from \"../types/types\";\n\nexport interface StreamSuccessVideoParameters extends CreateSendTransportParameters, ConnectSendTransportVideoParameters, ReorderStreamsParameters {\n socket: Socket;\n participants: Participant[];\n localStream: MediaStream | null;\n transportCreated: boolean;\n transportCreatedVideo: boolean;\n videoAlreadyOn: boolean;\n videoAction: boolean;\n videoParams: ProducerOptions;\n localStreamVideo: MediaStream | null;\n defVideoID: string;\n userDefaultVideoInputDevice: string;\n params: ProducerOptions;\n videoParamse?: ProducerOptions;\n islevel: string;\n member: string;\n updateMainWindow: boolean;\n lock_screen: boolean;\n shared: boolean;\n shareScreenStarted: boolean;\n vParams: VParamsType;\n hParams: HParamsType;\n allowed: boolean;\n currentFacingMode: string;\n device: Device | null;\n keepBackground: boolean;\n appliedBackground: boolean;\n videoProducer: Producer | null;\n\n // Update functions\n updateTransportCreatedVideo: (created: boolean) => void;\n updateVideoAlreadyOn: (videoOn: boolean) => void;\n updateVideoAction: (videoAction: boolean) => void;\n updateLocalStream: (stream: MediaStream | null) => void;\n updateLocalStreamVideo: (stream: MediaStream | null) => void;\n updateUserDefaultVideoInputDevice: (device: string) => void;\n updateCurrentFacingMode: (mode: string) => void;\n updateDefVideoID: (id: string) => void;\n updateAllowed: (allowed: boolean) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n updateParticipants: (participants: Participant[]) => void;\n updateVideoParams: (params: ProducerOptions) => void;\n updateIsBackgroundModalVisible: (isVisible: boolean) => void;\n updateAutoClickBackground: (autoClick: boolean) => void;\n\n showAlert?: ShowAlert;\n\n // Media functions\n createSendTransport: CreateSendTransportType;\n connectSendTransportVideo: ConnectSendTransportVideoType;\n reorderStreams: ReorderStreamsType;\n sleep: SleepType;\n\n getUpdatedAllParams: () => StreamSuccessVideoParameters;\n [key: string]: any;\n}\n\nexport interface StreamSuccessVideoOptions {\n stream: MediaStream;\n parameters: StreamSuccessVideoParameters;\n}\n\n// Export the type definition for the function\nexport type StreamSuccessVideoType = (options: StreamSuccessVideoOptions) => Promise<void>;\n\n\n/**\n * Handles the successful streaming of video by managing the local stream, updating parameters, and handling video transport.\n *\n * @param {StreamSuccessVideoOptions} options - The options for streaming the video.\n * @param {MediaStream} options.stream - The media stream to be used for the video.\n * @param {Object} options.parameters - The parameters required for streaming the video.\n * @param {Socket} options.parameters.socket - The socket connection for communication.\n * @param {Array<Participant>} options.parameters.participants - The list of participants in the room.\n * @param {MediaStream | null} options.parameters.localStream - The local media stream.\n * @param {MediaStream | null} options.parameters.localStreamVideo - The local video stream.\n * @param {boolean} options.parameters.transportCreated - Indicates if the transport has been created.\n * @param {boolean} options.parameters.transportCreatedVideo - Indicates if the video transport has been created.\n * @param {boolean} options.parameters.videoAlreadyOn - Indicates if the video is already on.\n * @param {boolean} options.parameters.videoAction - Indicates the action state of the video.\n * @param {ProducerOptions} options.parameters.videoParams - The video parameters for the producer.\n * @param {string} options.parameters.defVideoID - The default video device ID.\n * @param {string} options.parameters.userDefaultVideoInputDevice - The user default video input device.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {string} options.parameters.islevel - The level of the participant.\n * @param {string} options.parameters.member - The name of the participant.\n * @param {boolean} options.parameters.updateMainWindow - Indicates if the main window should be updated.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {VParamsType} options.parameters.vParams - Video parameters.\n * @param {HParamsType} options.parameters.hParams - Horizontal parameters.\n * @param {boolean} options.parameters.allowed - Indicates if the action is allowed.\n * @param {string} options.parameters.currentFacingMode - The current facing mode of the camera.\n * @param {Device | null} options.parameters.device - The device being used for streaming.\n * @param {boolean} options.parameters.keepBackground - Indicates if the background should be kept.\n * @param {boolean} options.parameters.appliedBackground - Indicates if the background has been applied.\n * @param {Producer | null} options.parameters.videoProducer - The video producer instance.\n * @param {Function} options.parameters.updateTransportCreatedVideo - Function to update the transport created state for video.\n * @param {Function} options.parameters.updateVideoAlreadyOn - Function to update the video already on state.\n * @param {Function} options.parameters.updateVideoAction - Function to update the video action state.\n * @param {Function} options.parameters.updateLocalStream - Function to update the local stream.\n * @param {Function} options.parameters.updateLocalStreamVideo - Function to update the local video stream.\n * @param {Function} options.parameters.updateUserDefaultVideoInputDevice - Function to update the user default video input device.\n * @param {Function} options.parameters.updateCurrentFacingMode - Function to update the current facing mode.\n * @param {Function} options.parameters.updateDefVideoID - Function to update the default video device ID.\n * @param {Function} options.parameters.updateAllowed - Function to update the allowed state.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window state.\n * @param {Function} options.parameters.createSendTransport - Function to create a send transport.\n * @param {Function} options.parameters.connectSendTransportVideo - Function to connect the send transport for video.\n * @param {Function} options.parameters.showAlert - Function to display alert messages to the user.\n *\n * @returns {Promise<void>} A promise that resolves when the video streaming setup is complete.\n * \n * @throws Will throw an error if there is an issue with streaming the video.\n * \n * @example\n * ```typescript\n * await streamSuccessVideo({\n * stream: mediaStream,\n * parameters: {\n * socket,\n * participants,\n * localStream: null,\n * localStreamVideo: null,\n * transportCreated: false,\n * transportCreatedVideo: false,\n * videoAlreadyOn: false,\n * videoAction: false,\n * videoParams: producerOptions,\n * defVideoID: \"default-video-id\",\n * userDefaultVideoInputDevice: \"user-device-id\",\n * hostLabel: \"Host\",\n * islevel: \"1\",\n * member: \"Participant1\",\n * lock_screen: false,\n * shared: false,\n * shareScreenStarted: false,\n * vParams,\n * hParams,\n * allowed: true,\n * currentFacingMode: \"user\",\n * device: mediaDevice,\n * updateTransportCreatedVideo,\n * updateVideoAlreadyOn,\n * updateVideoAction,\n * updateLocalStream,\n * updateLocalStreamVideo,\n * updateUserDefaultVideoInputDevice,\n * updateCurrentFacingMode,\n * updateDefVideoID,\n * updateAllowed,\n * updateUpdateMainWindow,\n * createSendTransport,\n * connectSendTransportVideo,\n * showAlert,\n * },\n * });\n * ```\n */\n\n\nexport const streamSuccessVideo = async ({\n stream,\n parameters,\n}: StreamSuccessVideoOptions): Promise<void> => {\n\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n try {\n let {\n socket,\n participants,\n localStream,\n transportCreated,\n transportCreatedVideo,\n videoAlreadyOn,\n videoAction,\n videoParams,\n localStreamVideo,\n defVideoID,\n userDefaultVideoInputDevice,\n params,\n videoParamse,\n islevel,\n member,\n updateMainWindow,\n lock_screen,\n shared,\n shareScreenStarted,\n vParams,\n hParams,\n allowed,\n currentFacingMode,\n device,\n\n keepBackground,\n appliedBackground,\n videoProducer,\n\n updateTransportCreatedVideo,\n updateVideoAlreadyOn,\n updateVideoAction,\n updateLocalStream,\n updateLocalStreamVideo,\n updateUserDefaultVideoInputDevice,\n updateCurrentFacingMode,\n updateDefVideoID,\n updateAllowed,\n updateUpdateMainWindow,\n updateParticipants,\n updateVideoParams,\n updateIsBackgroundModalVisible,\n updateAutoClickBackground,\n\n //mediasfu functions\n createSendTransport,\n connectSendTransportVideo,\n showAlert,\n reorderStreams,\n sleep,\n } = parameters;\n\n localStreamVideo = stream;\n updateLocalStreamVideo(localStreamVideo);\n\n if (localStream == null) {\n localStream = new MediaStream([\n localStreamVideo.getVideoTracks()[0],\n ]);\n updateLocalStream(localStream);\n } else {\n // remove all video tracks that are currently in the localStream\n localStream.getVideoTracks().forEach((track) => {\n localStream!.removeTrack(track);\n });\n // add the new video track to the localStream\n localStream.addTrack(localStreamVideo.getVideoTracks()[0]);\n updateLocalStream(localStream);\n }\n\n const videoTracked = localStream.getVideoTracks()[0];\n defVideoID = videoTracked.getSettings().deviceId || '';\n userDefaultVideoInputDevice = defVideoID;\n currentFacingMode = videoTracked.getSettings().facingMode || 'user';\n\n if (defVideoID) {\n updateDefVideoID(defVideoID);\n }\n if (userDefaultVideoInputDevice) {\n updateUserDefaultVideoInputDevice(userDefaultVideoInputDevice);\n }\n if (currentFacingMode) {\n updateCurrentFacingMode(currentFacingMode);\n }\n\n allowed = true;\n updateAllowed(allowed);\n\n try {\n if (islevel === \"2\") {\n params = shared || shareScreenStarted ? vParams : hParams;\n videoParamse = { ...params };\n } else {\n params = vParams;\n videoParamse = { ...params };\n }\n\n let codec = device?.rtpCapabilities?.codecs?.filter(\n (codec: RtpCodecCapability) => codec.mimeType.toLowerCase() !== \"video/vp9\" && codec.kind === \"video\"\n ) || [];\n\n videoParams = {\n track: localStream.getVideoTracks()[0],\n ...videoParamse,\n codec: codec[0],\n };\n updateVideoParams(videoParams);\n\n if (keepBackground && appliedBackground) {\n videoAlreadyOn = true;\n updateVideoAlreadyOn(videoAlreadyOn);\n\n updateAutoClickBackground(true);\n updateIsBackgroundModalVisible(true);\n await sleep({ ms: 500 });\n updateIsBackgroundModalVisible(false);\n updateAutoClickBackground(false);\n } else {\n if (!transportCreated) {\n try {\n await createSendTransport({\n parameters: { ...parameters, videoParams },\n option: \"video\",\n });\n } catch { /* Handle error */}\n } else {\n try {\n videoProducer!.close();\n await sleep({ ms: 500 });\n } catch { /* Handle error */}\n await connectSendTransportVideo({\n parameters,\n videoParams,\n });\n }\n }\n } catch (error) {\n showAlert?.({\n message: (error as Error).message,\n type: \"danger\",\n duration: 3000,\n });\n }\n\n videoAlreadyOn = true;\n updateVideoAlreadyOn(videoAlreadyOn);\n\n if (videoAction === true) {\n videoAction = false;\n updateVideoAction(videoAction);\n }\n\n if (islevel === \"2\") {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n }\n\n //update the participants array to reflect the change\n participants.forEach((participant) => {\n if (participant.socketId == socket.id && participant.name == member) {\n participant.videoOn = true;\n }\n });\n updateParticipants(participants);\n\n transportCreatedVideo = true;\n updateTransportCreatedVideo(transportCreatedVideo);\n\n //reupdate the screen display\n if (lock_screen) {\n await reorderStreams({\n add: true,\n screenChanged: true,\n parameters: { ...parameters, videoAlreadyOn },\n });\n } else {\n try {\n await reorderStreams({\n add: false,\n screenChanged: true,\n parameters: { ...parameters, videoAlreadyOn },\n });\n } catch { /* Handle error */}\n }\n } catch (error) {\n try {\n let { showAlert } = parameters;\n\n showAlert?.({\n message: (error as Error).message,\n type: \"danger\",\n duration: 3000,\n });\n } catch { /* Handle error */}\n }\n};\n\n","import { ShowAlert, StreamSuccessAudioSwitchType, RequestPermissionAudioType, StreamSuccessAudioSwitchParameters } from \"../types/types\";\n\n\nexport interface SwitchUserAudioParameters extends StreamSuccessAudioSwitchParameters {\n mediaDevices: MediaDevices;\n userDefaultAudioInputDevice: string;\n prevAudioInputDevice: string;\n showAlert?: ShowAlert;\n hasAudioPermission: boolean;\n updateUserDefaultAudioInputDevice: (deviceId: string) => void;\n\n // mediasfu functions\n streamSuccessAudioSwitch: StreamSuccessAudioSwitchType;\n requestPermissionAudio: RequestPermissionAudioType;\n checkMediaPermission: boolean;\n\n [key: string]: any;\n}\n\nexport interface SwitchUserAudioOptions {\n audioPreference: string;\n parameters: SwitchUserAudioParameters;\n}\n\n// Export the type definition for the function\nexport type SwitchUserAudioType = (options: SwitchUserAudioOptions) => Promise<void>;\n\n/**\n * Switches the user's audio input device based on the provided audio preference.\n * \n * @param {SwitchUserAudioOptions} options - The options for switching the user's audio input device.\n * @param {string} options.audioPreference - The preferred audio input device ID.\n * @param {Object} options.parameters - Additional parameters required for switching the audio input device.\n * @param {MediaDevices} options.parameters.mediaDevices - The media devices interface for accessing user media.\n * @param {string} options.parameters.prevAudioInputDevice - The previous audio input device ID.\n * @param {Function} options.parameters.showAlert - Function to show alert messages.\n * @param {boolean} options.parameters.hasAudioPermission - Flag indicating if the user has granted audio permission.\n * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update the user's default audio input device.\n * @param {Function} options.parameters.streamSuccessAudioSwitch - Function to handle successful audio stream switch.\n * @param {Function} options.parameters.requestPermissionAudio - Function to request audio permission from the user.\n * @param {Function} options.parameters.checkMediaPermission - Function to check if media permission is granted.\n * \n * @returns {Promise<void>} A promise that resolves when the audio input device has been successfully switched.\n * \n * @throws Will throw an error if the audio input device cannot be accessed or if there is an unexpected error.\n * \n * @example\n * ```typescript\n * await switchUserAudio({\n * audioPreference: 'audio-device-id',\n * parameters: {\n * mediaDevices,\n * prevAudioInputDevice: 'prev-audio-device-id',\n * showAlert,\n * hasAudioPermission,\n * updateUserDefaultAudioInputDevice,\n * streamSuccessAudioSwitch,\n * requestPermissionAudio,\n * checkMediaPermission,\n * },\n * });\n * ```\n */\n\n\nexport async function switchUserAudio({ audioPreference, parameters }: SwitchUserAudioOptions): Promise<void> {\n const {\n mediaDevices,\n prevAudioInputDevice,\n showAlert,\n hasAudioPermission,\n updateUserDefaultAudioInputDevice,\n\n // Media functions\n streamSuccessAudioSwitch,\n requestPermissionAudio,\n checkMediaPermission,\n } = parameters;\n\n try {\n // Check if audio permission is granted\n if (!hasAudioPermission) {\n if (checkMediaPermission) {\n const statusMic = await requestPermissionAudio();\n if (statusMic !== \"granted\") {\n showAlert?.({\n message:\n \"Allow access to your microphone or check if your microphone is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n }\n\n const mediaConstraints: MediaStreamConstraints = {\n audio: {\n deviceId: { exact: audioPreference },\n echoCancellation: false,\n noiseSuppression: false,\n autoGainControl: false,\n },\n video: false,\n };\n\n // Get user media with the defined audio constraints\n await mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessAudioSwitch({ stream, parameters });\n })\n .catch((error) => {\n console.log(\"Error switching audio A\", error);\n // Handle errors and revert to the previous audio input device\n updateUserDefaultAudioInputDevice(prevAudioInputDevice);\n\n\n showAlert?.({\n message: \"Error switching; the specified microphone could not be accessed.\",\n type: \"danger\",\n duration: 3000,\n });\n\n });\n } catch (error) {\n console.log(\"Error switching audio\", error);\n // Handle unexpected errors and revert to the previous audio input device\n updateUserDefaultAudioInputDevice(prevAudioInputDevice);\n\n\n showAlert?.({\n message: \"Error switching; the specified microphone could not be accessed.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n}\n\n","import { Socket } from \"socket.io-client\";\nimport { CheckPermissionType, DisconnectSendTransportVideoParameters, DisconnectSendTransportVideoType, RequestPermissionCameraType, ShowAlert, StreamSuccessVideoParameters, StreamSuccessVideoType, VidCons } from \"../../types/types\";\n\nexport interface ClickVideoParameters extends DisconnectSendTransportVideoParameters, StreamSuccessVideoParameters {\n checkMediaPermission: boolean;\n hasCameraPermission: boolean;\n videoAlreadyOn: boolean;\n audioOnlyRoom: boolean;\n recordStarted: boolean;\n recordResumed: boolean;\n recordPaused: boolean;\n recordStopped: boolean;\n recordingMediaOptions: string;\n islevel: string;\n youAreCoHost: boolean;\n adminRestrictSetting: boolean;\n videoRequestState: string | null;\n videoRequestTime: number;\n member: string;\n socket: Socket;\n roomName: string;\n userDefaultVideoInputDevice: string;\n currentFacingMode: string;\n vidCons: VidCons;\n frameRate: number;\n videoAction: boolean;\n localStream: MediaStream | null;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n updateRequestIntervalSeconds: number;\n\n showAlert?: ShowAlert;\n updateVideoAlreadyOn: (value: boolean) => void;\n updateVideoRequestState: (state: string) => void;\n updateLocalStream: (stream: MediaStream | null) => void;\n mediaDevices: MediaDevices;\n\n streamSuccessVideo: StreamSuccessVideoType;\n disconnectSendTransportVideo: DisconnectSendTransportVideoType;\n requestPermissionCamera: RequestPermissionCameraType;\n checkPermission: CheckPermissionType;\n\n getUpdatedAllParams: () => ClickVideoParameters;\n [key: string]: any;\n\n}\n\nexport interface ClickVideoOptions {\n parameters: ClickVideoParameters;\n}\n\n// Export the type definition for the function\nexport type ClickVideoType = (options: ClickVideoOptions) => Promise<void>;\n\n/**\n * Handles the click event to toggle the participant's video on/off and manages video permission requests.\n *\n * @param {ClickVideoOptions} options - The function parameters.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * clickVideo({\n * parameters: {\n * checkMediaPermission: true,\n * hasCameraPermission: false,\n * videoAlreadyOn: false,\n * audioOnlyRoom: false,\n * recordStarted: true,\n * recordResumed: false,\n * recordPaused: true,\n * recordStopped: false,\n * recordingMediaOptions: \"video\",\n * islevel: \"1\",\n * youAreCoHost: false,\n * adminRestrictSetting: false,\n * videoRequestState: null,\n * videoRequestTime: Date.now(),\n * member: \"John Doe\",\n * socket: socketInstance,\n * roomName: \"room123\",\n * userDefaultVideoInputDevice: \"default\",\n * currentFacingMode: \"user\",\n * vidCons: { width: 1280, height: 720 },\n * frameRate: 30,\n * videoAction: false,\n * localStream: null,\n * audioSetting: \"allow\",\n * videoSetting: \"allow\",\n * screenshareSetting: \"allow\",\n * chatSetting: \"allow\",\n * updateRequestIntervalSeconds: 60,\n * showAlert: showAlertFunction,\n * updateVideoAlreadyOn: setVideoAlreadyOn,\n * updateVideoRequestState: setVideoRequestState,\n * updateLocalStream: setLocalStream,\n * mediaDevices: navigator.mediaDevices,\n * streamSuccessVideo: streamSuccessVideoFunction,\n * disconnectSendTransportVideo: disconnectVideoTransportFunction,\n * requestPermissionCamera: requestCameraPermissionFunction,\n * checkPermission: checkPermissionFunction,\n * getUpdatedAllParams: getUpdatedParamsFunction\n * }\n * });\n * ```\n */\n\nexport const clickVideo = async ({ parameters }: ClickVideoOptions): Promise<void> => {\n let {\n checkMediaPermission,\n hasCameraPermission,\n videoAlreadyOn,\n audioOnlyRoom,\n recordStarted,\n recordResumed,\n recordPaused,\n recordStopped,\n recordingMediaOptions,\n islevel,\n youAreCoHost,\n adminRestrictSetting,\n videoRequestState,\n videoRequestTime,\n member,\n socket,\n roomName,\n userDefaultVideoInputDevice,\n currentFacingMode,\n vidCons,\n frameRate,\n videoAction,\n localStream,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n updateRequestIntervalSeconds,\n streamSuccessVideo,\n showAlert,\n updateVideoAlreadyOn,\n updateVideoRequestState,\n updateLocalStream,\n mediaDevices,\n disconnectSendTransportVideo,\n requestPermissionCamera,\n checkPermission,\n } = parameters;\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: \"You cannot turn on your camera in an audio-only event.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n if (videoAlreadyOn) {\n if (islevel === \"2\" && (recordStarted || recordResumed)) {\n if (!(recordPaused || recordStopped)) {\n if (recordingMediaOptions === \"video\") {\n showAlert?.({\n message: \"You cannot turn off your camera while recording video, please pause or stop recording first.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n }\n\n videoAlreadyOn = false;\n updateVideoAlreadyOn(videoAlreadyOn);\n localStream!.getVideoTracks()[0].enabled = false;\n updateLocalStream(localStream);\n await disconnectSendTransportVideo({ parameters });\n } else {\n if (adminRestrictSetting) {\n showAlert?.({\n message: \"You cannot turn on your camera. Access denied by host.\",\n duration: 3000,\n type: \"danger\",\n });\n return;\n }\n\n let response = 2;\n\n if (!videoAction && islevel !== \"2\" && !youAreCoHost) {\n response = await checkPermission({\n permissionType: \"videoSetting\",\n audioSetting, videoSetting, screenshareSetting, chatSetting,\n });\n } else {\n response = 0;\n }\n\n if (response == 1) {\n //approval\n //check if request is pending or not\n if (videoRequestState === \"pending\") {\n showAlert?.({\n message: \"A request is pending. Please wait for the host to respond.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n // check if rejected and current time is less than videoRequestTime\n if (videoRequestState === \"rejected\" && Date.now() - videoRequestTime < updateRequestIntervalSeconds) {\n showAlert?.({\n message: `A request was rejected. Please wait for ${updateRequestIntervalSeconds} seconds before sending another request.`,\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // send request to host\n showAlert?.({\n message: \"Request sent to host.\",\n type: \"success\",\n duration: 3000,\n });\n videoRequestState = \"pending\";\n updateVideoRequestState(videoRequestState);\n\n const userRequest = { id: socket.id, name: member, icon: \"fa-video\" };\n await socket.emit(\"participantRequest\", { userRequest, roomName });\n } else if (response === 2) {\n //if video permission is set to deny then show alert\n showAlert?.({\n message: \"You cannot turn on your camera. Access denied by host.\",\n type: \"danger\",\n duration: 3000,\n });\n } else {\n //if video permission is set to allow then turn on video\n\n //first check if permission is granted\n if (!hasCameraPermission) {\n if (checkMediaPermission) {\n const statusCamera = await requestPermissionCamera();\n if (statusCamera !== \"granted\") {\n showAlert?.({\n message: \"Allow access to your camera or check if your camera is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n }\n\n let mediaConstraints = {};\n let altMediaConstraints = {};\n if (userDefaultVideoInputDevice) {\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n deviceId: userDefaultVideoInputDevice,\n facingMode: currentFacingMode,\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n altMediaConstraints = {\n video: { ...vidCons, frameRate: { ideal: frameRate } },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: { ...vidCons, frameRate: { ideal: frameRate } },\n audio: false,\n };\n altMediaConstraints = {\n video: { frameRate: { ideal: frameRate } },\n audio: false,\n };\n }\n } else {\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: { ...vidCons, frameRate: { ideal: frameRate } },\n audio: false,\n };\n altMediaConstraints = {\n video: { ...vidCons, frameRate: { ideal: frameRate } },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: { frameRate: { ideal: frameRate } },\n audio: false,\n };\n }\n }\n\n await mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(async () => {\n await mediaDevices\n .getUserMedia(altMediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(async() => {\n //remove frameRate from constraints\n altMediaConstraints = {\n video: { ...vidCons },\n audio: false,\n };\n await mediaDevices\n .getUserMedia(altMediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n }).catch(() => {\n\n showAlert?.({\n message:\n \"Allow access to your camera or check if your camera is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n\n });\n });\n });\n }\n }\n};\n","import { clickVideo, ClickVideoParameters } from \"../methods/stream/clickVideo\";\nimport { ShowAlert, VidCons, RequestPermissionCameraType, StreamSuccessVideoType, SleepType, StreamSuccessVideoParameters } from \"../types/types\";\n\nexport interface SwitchUserVideoParameters extends StreamSuccessVideoParameters, ClickVideoParameters {\n audioOnlyRoom: boolean;\n frameRate: number;\n vidCons: VidCons;\n prevVideoInputDevice: string;\n userDefaultVideoInputDevice: string;\n showAlert?: ShowAlert;\n mediaDevices: MediaDevices;\n hasCameraPermission: boolean;\n updateVideoSwitching: (state: boolean) => void;\n updateUserDefaultVideoInputDevice: (deviceId: string) => void;\n\n // media functions\n requestPermissionCamera: RequestPermissionCameraType;\n streamSuccessVideo: StreamSuccessVideoType;\n sleep: SleepType;\n checkMediaPermission: boolean;\n \n getUpdatedAllParams: () => SwitchUserVideoParameters;\n [key: string]: any;\n}\n\nexport interface SwitchUserVideoOptions {\n videoPreference: string;\n checkoff: boolean;\n parameters: SwitchUserVideoParameters;\n}\n\n// Export the type definition for the function\nexport type SwitchUserVideoType = (options: SwitchUserVideoOptions) => Promise<void>;\n\n/**\n * Switches the user's video input device based on the provided options.\n *\n * @param {SwitchUserVideoOptions} options - The options for switching the user's video.\n * @param {string} options.videoPreference - The preferred video input device ID.\n * @param {boolean} options.checkoff - Flag indicating whether to turn off the video.\n * @param {Object} options.parameters - Additional parameters required for switching the video.\n * @param {boolean} options.parameters.audioOnlyRoom - Indicates if the room is audio-only.\n * @param {number} options.parameters.frameRate - The desired frame rate for the video.\n * @param {Object} options.parameters.vidCons - Video constraints such as width and height.\n * @param {string} options.parameters.prevVideoInputDevice - The previous video input device ID.\n * @param {Function} options.parameters.showAlert - Function to show alerts to the user.\n * @param {Object} options.parameters.mediaDevices - Media devices object to access user media.\n * @param {boolean} options.parameters.hasCameraPermission - Indicates if the user has camera permission.\n * @param {Function} options.parameters.updateVideoSwitching - Function to update video switching state.\n * @param {Function} options.parameters.updateUserDefaultVideoInputDevice - Function to update the default video input device.\n * @param {Function} options.parameters.requestPermissionCamera - Function to request camera permission.\n * @param {Function} options.parameters.streamSuccessVideo - Function to handle successful video stream.\n * @param {Function} options.parameters.sleep - Function to pause execution for a specified duration.\n * @param {Function} options.parameters.checkMediaPermission - Function to check media permissions.\n *\n * @returns {Promise<void>} A promise that resolves when the video input device has been successfully switched.\n *\n * @throws Will throw an error if the audio input device cannot be accessed or if there is an unexpected error.\n *\n * @example\n * ```typescript\n * await switchUserVideo({\n * videoPreference: 'video-device-id',\n * checkoff: false,\n * parameters: {\n * audioOnlyRoom: false,\n * frameRate: 30,\n * vidCons: { width: 640, height: 480 },\n * prevVideoInputDevice: 'prev-video-device-id',\n * showAlert: showAlertFunction,\n * mediaDevices: navigator.mediaDevices,\n * hasCameraPermission: true,\n * updateVideoSwitching: updateVideoSwitchingFunction,\n * updateUserDefaultVideoInputDevice: updateUserDefaultVideoInputDeviceFunction,\n * requestPermissionCamera: requestPermissionCameraFunction,\n * streamSuccessVideo: streamSuccessVideoFunction,\n * sleep: sleepFunction,\n * checkMediaPermission: true,\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * },\n * });\n * ```\n */\n\nexport async function switchUserVideo({\n videoPreference,\n checkoff,\n parameters,\n}: SwitchUserVideoOptions): Promise<void> {\n const {\n audioOnlyRoom,\n frameRate,\n vidCons,\n prevVideoInputDevice,\n showAlert,\n mediaDevices,\n hasCameraPermission,\n updateVideoSwitching,\n updateUserDefaultVideoInputDevice,\n\n //mediasfu functions\n requestPermissionCamera,\n streamSuccessVideo,\n sleep,\n checkMediaPermission,\n } = parameters;\n\n try {\n // Check if it's an audio-only room\n if (audioOnlyRoom) {\n\n showAlert?.({\n message: \"You cannot turn on your camera in an audio-only event.\",\n type: \"danger\",\n duration: 3000,\n });\n\n return;\n }\n\n // If checkoff is not true, trigger a click on the video button to turn off the video\n if (!checkoff) {\n await clickVideo({ parameters });\n updateVideoSwitching(true);\n await sleep({ ms: 500 });\n updateVideoSwitching(false);\n }\n\n // Check camera permission\n if (!hasCameraPermission) {\n if (checkMediaPermission) {\n const statusCamera = await requestPermissionCamera();\n if (statusCamera !== \"granted\") {\n\n showAlert?.({\n message:\n \"Allow access to your camera or check if your camera is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n\n return;\n }\n }\n }\n\n let mediaConstraints: MediaStreamConstraints;\n\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoPreference },\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoPreference },\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n }\n\n // Get user media with the defined constraints\n await mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(async () => {\n // Handle errors and revert to the previous video input device\n updateUserDefaultVideoInputDevice(prevVideoInputDevice);\n\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n });\n } catch {\n // Handle unexpected errors and revert to the previous video input device\n updateUserDefaultVideoInputDevice(prevVideoInputDevice);\n\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n}\n\n","import { clickVideo, ClickVideoParameters } from \"../methods/stream/clickVideo\";\nimport { ShowAlert, VidCons, RequestPermissionCameraType, StreamSuccessVideoType, SleepType, StreamSuccessVideoParameters } from \"../types/types\";\n\n\nexport interface SwitchUserVideoAltParameters extends StreamSuccessVideoParameters, ClickVideoParameters {\n audioOnlyRoom: boolean;\n frameRate: number;\n vidCons: VidCons;\n showAlert?: ShowAlert;\n mediaDevices: MediaDevices;\n hasCameraPermission: boolean;\n updateVideoSwitching: (state: boolean) => void;\n updateCurrentFacingMode: (mode: string) => void;\n\n // mediasfu functions\n requestPermissionCamera: RequestPermissionCameraType;\n streamSuccessVideo: StreamSuccessVideoType;\n sleep: SleepType;\n checkMediaPermission: boolean;\n getUpdatedAllParams: () => SwitchUserVideoAltParameters;\n\n [key: string]: any;\n}\n\nexport interface SwitchUserVideoAltOptions {\n videoPreference: string;\n checkoff: boolean;\n parameters: SwitchUserVideoAltParameters;\n}\n\n// Export the type definition for the function\nexport type SwitchUserVideoAltType = (options: SwitchUserVideoAltOptions) => Promise<void>;\n\n/**\n * Switches the user's video stream based on the provided video preference and other parameters.\n * \n * @param {SwitchUserVideoAltOptions} options - The options for switching the user's video.\n * @param {string} options.videoPreference - The preferred video facing mode (e.g., \"user\" or \"environment\").\n * @param {boolean} options.checkoff - A flag indicating whether to turn off the video before switching.\n * @param {SwitchUserVideoAltParameters} options.parameters - The parameters required for switching the video.\n * \n * @returns {Promise<void>} A promise that resolves when the video switching is complete.\n * \n * @throws Will throw an error if there is an issue with switching the video.\n * \n * @example\n * ```typescript\n * const options = {\n * videoPreference: \"user\",\n * checkoff: false,\n * parameters: {\n * audioOnlyRoom: false,\n * frameRate: 30,\n * vidCons: { width: 640, height: 480 },\n * showAlert: showNotification,\n * mediaDevices: navigator.mediaDevices,\n * hasCameraPermission: true,\n * updateVideoSwitching: updateVideoSwitchingState,\n * updateCurrentFacingMode: updateCurrentFacingMode,\n * requestPermissionCamera: requestCameraPermission,\n * streamSuccessVideo: streamSuccessVideoFunction,\n * sleep: sleepFunction,\n * checkMediaPermission: true,\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * },\n * };\n * \n * switchUserVideoAlt(options)\n * .then(() => {\n * console.log(\"Video switched successfully\");\n * })\n * .catch((error) => {\n * console.error(\"Error switching video:\", error);\n * });\n * ```\n */\n\nexport async function switchUserVideoAlt({\n videoPreference,\n checkoff,\n parameters,\n}: SwitchUserVideoAltOptions): Promise<void> {\n const updatedParameters = parameters.getUpdatedAllParams();\n\n const {\n audioOnlyRoom,\n frameRate,\n vidCons,\n showAlert,\n mediaDevices,\n hasCameraPermission,\n updateVideoSwitching,\n updateCurrentFacingMode,\n\n //mediasfu functions\n requestPermissionCamera,\n streamSuccessVideo,\n sleep,\n checkMediaPermission,\n } = parameters;\n\n let { currentFacingMode, prevFacingMode } = updatedParameters;\n\n try {\n if (audioOnlyRoom) {\n showAlert?.({\n message: \"You cannot turn on your camera in an audio-only event.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // If checkoff is not true, trigger a click on the video button to turn off the video\n if (!checkoff) {\n await clickVideo({ parameters });\n updateVideoSwitching(true);\n await sleep({ ms: 500 });\n updateVideoSwitching(false);\n }\n\n // Check camera permission\n if (!hasCameraPermission && checkMediaPermission) {\n const statusCamera = await requestPermissionCamera();\n if (statusCamera !== \"granted\") {\n showAlert?.({\n message:\n \"Allow access to your camera or check if your camera is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n\n // Enumerate video devices\n const videoDevices = await mediaDevices.enumerateDevices();\n\n // Define media constraints based on preferences and options\n let mediaConstraints = {};\n\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n facingMode: { exact: videoPreference },\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: {\n facingMode: { exact: videoPreference },\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n }\n\n // Get user media with the defined constraints\n await mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(async () => {\n let videoDevicesFront: MediaDeviceInfo[] = [];\n\n // Filter video devices based on the preferred facing mode\n if (videoPreference === \"user\") {\n videoDevicesFront = videoDevices.filter(\n (device) =>\n device.label.includes(\"front\") && device.kind === \"videoinput\"\n );\n } else {\n videoDevicesFront = videoDevices.filter(\n (device) =>\n device.label.includes(\"back\") && device.kind === \"videoinput\"\n );\n }\n\n if (videoDevicesFront.length > 0) {\n videoDevicesFront.forEach((device) => {\n if (device.kind === \"videoinput\") {\n let videoDeviceId = device.deviceId;\n\n // Update media constraints with the specific video device\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoDeviceId },\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoDeviceId },\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n }\n\n // Try to get user media with the new constraints\n mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(() => {\n // If the current video device is the last one in the list, show the error; otherwise, try the next device\n if (\n videoDeviceId ===\n videoDevicesFront[videoDevicesFront.length - 1].deviceId\n ) {\n currentFacingMode = prevFacingMode;\n updateCurrentFacingMode(currentFacingMode);\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n });\n }\n });\n } else {\n // Show error if no compatible video devices are found\n currentFacingMode = prevFacingMode;\n updateCurrentFacingMode(currentFacingMode);\n\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n });\n } catch {\n // Handle any unexpected errors\n\n const videoDevices = await mediaDevices.enumerateDevices();\n // Handle any unexpected errors\n let videoDevicesFront: MediaDeviceInfo[] = [];\n if (videoPreference === \"user\") {\n videoDevicesFront = videoDevices.filter(\n (device) =>\n device.label.includes(\"front\") && device.kind === \"videoinput\"\n );\n } else {\n videoDevicesFront = videoDevices.filter(\n (device) =>\n device.label.includes(\"back\") && device.kind === \"videoinput\"\n );\n }\n\n let mediaConstraints = {};\n\n if (videoDevicesFront.length > 0) {\n videoDevicesFront.forEach((device) => {\n if (device.kind === \"videoinput\") {\n let videoDeviceId = device.deviceId;\n\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoDeviceId },\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoDeviceId },\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n }\n\n mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(() => {\n if (\n videoDeviceId ===\n videoDevicesFront[videoDevicesFront.length - 1].deviceId\n ) {\n currentFacingMode = prevFacingMode;\n updateCurrentFacingMode(currentFacingMode);\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n });\n }\n });\n } else {\n currentFacingMode = prevFacingMode;\n updateCurrentFacingMode(currentFacingMode);\n\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n }\n}\n","import { Socket } from \"socket.io-client\";\nimport { Participant, AutoAdjustType, ScreenState, EventType } from \"../types/types\";\n\nexport interface TriggerParameters {\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n screenStates: ScreenState[];\n participants: Participant[];\n updateDateState?: number | null;\n lastUpdate: number | null;\n nForReadjust: number | null;\n eventType: EventType;\n shared: boolean;\n shareScreenStarted: boolean;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n updateUpdateDateState: (timestamp: number | null) => void;\n updateLastUpdate: (lastUpdate: number | null) => void;\n updateNForReadjust: (nForReadjust: number) => void;\n\n\n // mediasfu functions\n autoAdjust: AutoAdjustType;\n\n getUpdatedAllParams: () => TriggerParameters;\n [key: string]: any;\n}\n\nexport interface TriggerOptions {\n ref_ActiveNames: string[];\n parameters: TriggerParameters;\n}\n\n// Export the type definition for the function\nexport type TriggerType = (options: TriggerOptions) => Promise<void>;\n\n/**\n * Triggers an update to the screen client based on the provided parameters.\n *\n * @param {TriggerOptions} options - The options for triggering the update.\n * @param {string[]} options.ref_ActiveNames - Reference to the active names.\n * @param {TriggerParameters} options.parameters - The parameters for the trigger.\n * \n * @returns {Promise<void>} A promise that resolves when the trigger is complete.\n *\n * @throws Will throw an error if the updateScreenClient operation fails.\n *\n * @remarks\n * This function handles various conditions to determine the main screen person,\n * adjusts the screen states, and emits an update to the screen client via socket.\n *\n * @example\n * ```typescript\n * await trigger({\n * ref_ActiveNames: [\"user1\", \"user2\"],\n * parameters: {\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * roomName: \"room1\",\n * screenStates: [{ mainScreenPerson: \"user1\", mainScreenFilled: true, adminOnMainScreen: false }],\n * participants: [{ name: \"admin\", islevel: \"2\" }],\n * updateDateState: 0,\n * lastUpdate: null,\n * nForReadjust: 0,\n * eventType: \"conference\",\n * shared: false,\n * shareScreenStarted: false,\n * whiteboardStarted: false,\n * whiteboardEnded: false,\n * updateUpdateDateState: (date) => {},\n * updateLastUpdate: (date) => {},\n * updateNForReadjust: (n) => {},\n * autoAdjust: async ({ n, parameters }) => [n, 0],\n * },\n * });\n * ```\n */\n\nexport async function trigger({\n ref_ActiveNames,\n parameters,\n}: TriggerOptions): Promise<void> {\n try {\n parameters = parameters.getUpdatedAllParams();\n\n let {\n socket,\n localSocket,\n roomName,\n screenStates,\n participants,\n updateDateState,\n lastUpdate,\n nForReadjust,\n eventType,\n shared,\n shareScreenStarted,\n whiteboardStarted,\n whiteboardEnded,\n updateUpdateDateState,\n updateLastUpdate,\n updateNForReadjust,\n\n //mediasfu functions\n autoAdjust,\n } = parameters;\n\n let socketRef = socket;\n if (localSocket && localSocket.id) {\n socketRef = localSocket;\n }\n\n let personOnMainScreen = screenStates[0].mainScreenPerson;\n let adminName = \"\";\n const admin = participants.filter(\n (participant) => participant.islevel == \"2\"\n );\n if (admin.length > 0) {\n adminName = admin[0].name || \"\";\n }\n\n if (personOnMainScreen === \"WhiteboardActive\") {\n personOnMainScreen = adminName;\n }\n\n let mainfilled = screenStates[0].mainScreenFilled;\n let adminOnMain = screenStates[0].adminOnMainScreen;\n let nForReadjust_: number;\n let val1: number;\n\n let noww = new Date().getTime();\n //get now in seconds\n let timestamp = Math.floor(noww / 1000);\n\n let eventPass = false;\n\n if (eventType == \"conference\" && !(shared || shareScreenStarted)) {\n eventPass = true;\n personOnMainScreen = adminName;\n\n if (!ref_ActiveNames.includes(adminName)) {\n ref_ActiveNames.unshift(adminName);\n }\n }\n\n if ((mainfilled && personOnMainScreen != null && adminOnMain) || eventPass) {\n if (eventType == \"conference\") {\n nForReadjust = nForReadjust! + 1;\n updateNForReadjust(nForReadjust);\n }\n\n if (!ref_ActiveNames.includes(adminName) && whiteboardStarted && !whiteboardEnded) {\n ref_ActiveNames.unshift(adminName);\n }\n\n nForReadjust_ = ref_ActiveNames.length;\n\n if (nForReadjust_ == 0 && eventType == \"webinar\") {\n val1 = 0;\n } else {\n const [val11, ] = await autoAdjust({\n n: nForReadjust_,\n eventType,\n shared,\n shareScreenStarted,\n });\n val1 = val11;\n }\n\n let calc1 = Math.floor((val1 / 12) * 100);\n let calc2 = (100) - calc1;\n\n //check if lastUpdate is not null and at least same seconds\n if (lastUpdate == null || updateDateState != timestamp) {\n let now = new Date();\n\n socketRef.emit(\n \"updateScreenClient\",\n {\n roomName,\n names: ref_ActiveNames,\n mainPercent: calc2,\n mainScreenPerson: personOnMainScreen,\n viewType: eventType,\n },\n ({ success, reason }: { success: boolean; reason: string; }) => {\n updateDateState = timestamp;\n updateUpdateDateState(updateDateState);\n lastUpdate = Math.floor(now.getTime() / 1000);\n updateLastUpdate(lastUpdate);\n if (!success) {\n console.log(reason, \"updateScreenClient failed\");\n }\n }\n );\n }\n } else if (mainfilled && personOnMainScreen != null && !adminOnMain) {\n //check if the person on main screen is still in the room\n // ss = true\n\n nForReadjust_ = ref_ActiveNames.length;\n\n if (!ref_ActiveNames.includes(adminName)) {\n ref_ActiveNames.unshift(adminName);\n }\n\n const [val11, ] = await autoAdjust({\n n: nForReadjust_,\n eventType,\n shared,\n shareScreenStarted,\n });\n val1 = val11;\n\n const calc1 = Math.floor((val1 / 12) * 100);\n const calc2 = 100 - calc1;\n\n if (lastUpdate == null || updateDateState !== timestamp) {\n let now = new Date();\n\n socketRef.emit(\n \"updateScreenClient\",\n {\n roomName,\n names: ref_ActiveNames,\n mainPercent: calc2,\n mainScreenPerson: personOnMainScreen,\n viewType: eventType,\n },\n ({ success, reason }: { success: boolean; reason: string; }) => {\n updateDateState = timestamp;\n updateUpdateDateState(updateDateState);\n lastUpdate = Math.floor(now.getTime() / 1000);\n updateLastUpdate(lastUpdate);\n if (!success) {\n console.log(reason, \"updateScreenClient failed\");\n }\n }\n );\n }\n } else {\n //stop recording\n console.log(\"trigger stopRecording\");\n }\n } catch (error) {\n console.log(\"Error triggering updateScreen:\", error);\n }\n}\n\n","import type {\n BreakoutParticipant,\n BreakoutRoomUpdatedData,\n OnScreenChangesParameters,\n OnScreenChangesType,\n Participant,\n RePortParameters,\n RePortType,\n} from '../../types/types'\n\nexport interface BreakoutRoomUpdatedParameters extends OnScreenChangesParameters, RePortParameters {\n breakOutRoomStarted: boolean\n breakOutRoomEnded: boolean\n breakoutRooms: BreakoutParticipant[][]\n hostNewRoom: number\n islevel: string\n participantsAll: Participant[]\n participants: Participant[]\n meetingDisplayType: string\n prevMeetingDisplayType: string\n updateBreakoutRooms: (rooms: BreakoutParticipant[][]) => void\n updateBreakOutRoomStarted: (started: boolean) => void\n updateBreakOutRoomEnded: (ended: boolean) => void\n updateHostNewRoom: (room: number) => void\n updateMeetingDisplayType: (type: string) => void\n updateParticipantsAll: (participants: Participant[]) => void\n updateParticipants: (participants: Participant[]) => void\n onScreenChanges: OnScreenChangesType\n rePort: RePortType\n getUpdatedAllParams: () => BreakoutRoomUpdatedParameters\n [key: string]: any\n}\n\nexport interface BreakoutRoomUpdatedOptions {\n data: BreakoutRoomUpdatedData\n parameters: BreakoutRoomUpdatedParameters\n}\n\nexport type BreakoutRoomUpdatedType = (options: BreakoutRoomUpdatedOptions) => Promise<void>\n\n/**\n * Updates the state of breakout rooms based on the provided data and parameters.\n *\n * @param {BreakoutRoomUpdatedOptions} options - The options object.\n * @param {BreakoutRoomUpdatedData} options.data - The data object containing information about the breakout rooms.\n * @param {BreakoutRoomUpdatedParameters} options.parameters - The parameters object containing various state update functions and other parameters.\n *\n * @example\n * ```typescript\n * const breakoutOptions: BreakoutRoomUpdatedOptions = {\n * data: breakoutData,\n * parameters: {\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: false,\n * breakoutRooms: [[]],\n * hostNewRoom: 1,\n * islevel: '2',\n * participantsAll: allParticipants,\n * participants: activeParticipants,\n * meetingDisplayType: 'all',\n * prevMeetingDisplayType: 'video',\n * updateBreakoutRooms: setBreakoutRooms,\n * updateBreakOutRoomStarted: setBreakOutRoomStarted,\n * updateBreakOutRoomEnded: setBreakOutRoomEnded,\n * updateHostNewRoom: setHostNewRoom,\n * updateMeetingDisplayType: setMeetingDisplayType,\n * updateParticipantsAll: setAllParticipants,\n * updateParticipants: setActiveParticipants,\n * onScreenChanges: handleScreenChanges,\n * rePort: reportFunction,\n * getUpdatedAllParams: () => breakoutOptions.parameters,\n * },\n * }\n *\n * await breakoutRoomUpdated(breakoutOptions)\n * ```\n */\nexport const breakoutRoomUpdated: BreakoutRoomUpdatedType = async ({ data, parameters }) => {\n try {\n let {\n breakOutRoomStarted,\n breakOutRoomEnded,\n breakoutRooms,\n hostNewRoom,\n islevel,\n participantsAll,\n participants,\n meetingDisplayType,\n prevMeetingDisplayType,\n updateBreakoutRooms,\n updateBreakOutRoomStarted,\n updateBreakOutRoomEnded,\n updateHostNewRoom,\n updateMeetingDisplayType,\n updateParticipantsAll,\n updateParticipants,\n onScreenChanges,\n rePort,\n } = parameters\n\n if (data.forHost) {\n hostNewRoom = data.newRoom!\n updateHostNewRoom(hostNewRoom!)\n await onScreenChanges({ changed: true, parameters })\n return\n }\n\n if (islevel === '2' && data.members) {\n participantsAll = data.members.map((participant) => ({\n isBanned: participant.isBanned,\n name: participant.name,\n audioID: participant.audioID,\n videoID: participant.videoID,\n }))\n updateParticipantsAll(participantsAll)\n\n participants = data.members.filter((participant) => !participant.isBanned)\n updateParticipants(participants)\n }\n\n breakoutRooms = data.breakoutRooms || []\n updateBreakoutRooms(breakoutRooms)\n\n if (data.status === 'started' && (!breakOutRoomStarted || breakOutRoomEnded)) {\n breakOutRoomStarted = true\n breakOutRoomEnded = false\n updateBreakOutRoomStarted(true)\n updateBreakOutRoomEnded(false)\n prevMeetingDisplayType = meetingDisplayType\n if (meetingDisplayType !== 'all') {\n meetingDisplayType = 'all'\n updateMeetingDisplayType('all')\n }\n await onScreenChanges({ changed: true, parameters })\n if (islevel === '2') {\n await rePort({ restart: true, parameters })\n }\n } else if (data.status === 'ended') {\n breakOutRoomEnded = true\n updateBreakOutRoomEnded(true)\n if (meetingDisplayType !== prevMeetingDisplayType) {\n updateMeetingDisplayType(prevMeetingDisplayType)\n }\n await onScreenChanges({ changed: true, parameters })\n if (islevel === '2') {\n await rePort({ restart: true, parameters })\n }\n } else if (data.status === 'started' && breakOutRoomStarted) {\n breakOutRoomStarted = true\n breakOutRoomEnded = false\n updateBreakOutRoomStarted(true)\n updateBreakOutRoomEnded(false)\n await onScreenChanges({ changed: true, parameters })\n if (islevel === '2') {\n await rePort({ restart: true, parameters })\n }\n }\n } catch {\n // Handle error\n }\n}\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface ModifySettingsOptions {\n showAlert?: ShowAlert;\n roomName: string;\n audioSet: string;\n videoSet: string;\n screenshareSet: string;\n chatSet: string;\n socket: Socket;\n updateAudioSetting: (audioSet: string) => void;\n updateVideoSetting: (videoSet: string) => void;\n updateScreenshareSetting: (screenshareSet: string) => void;\n updateChatSetting: (chatSet: string) => void;\n updateIsSettingsModalVisible: (isVisible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type ModifySettingsType = (options: ModifySettingsOptions) => Promise<void>;\n\n/**\n * Modifies the settings for a given room and updates the state accordingly.\n *\n * @param {ModifySettingsOptions} options - The options for modifying settings.\n * @returns {Promise<void>} A promise that resolves when the settings have been modified.\n *\n * @throws Will show an alert if any setting is set to \"approval\" in demo mode (room name starts with \"d\").\n *\n * @example\n * ```typescript\n * modifySettings({\n * roomName: \"d123\",\n * audioSet: \"allow\",\n * videoSet: \"allow\",\n * screenshareSet: \"deny\",\n * chatSet: \"allow\",\n * socket: mySocketInstance,\n * updateAudioSetting: setAudioSetting,\n * updateVideoSetting: setVideoSetting,\n * updateScreenshareSetting: setScreenshareSetting,\n * updateChatSetting: setChatSetting,\n * updateIsSettingsModalVisible: setIsSettingsModalVisible,\n * showAlert: (options) => alertUser(options),\n * });\n * ```\n */\nexport async function modifySettings({\n showAlert,\n roomName,\n audioSet,\n videoSet,\n screenshareSet,\n chatSet,\n socket,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateChatSetting,\n updateIsSettingsModalVisible,\n}: ModifySettingsOptions): Promise<void> {\n if (roomName.toLowerCase().startsWith('d')) {\n // none should be approval\n if (\n audioSet === 'approval' ||\n videoSet === 'approval' ||\n screenshareSet === 'approval' ||\n chatSet === 'approval'\n ) {\n showAlert?.({\n message: 'You cannot set approval for demo mode.',\n type: 'danger',\n duration: 3000,\n });\n\n return;\n }\n }\n\n // Check and update state variables based on the provided logic\n if (audioSet) {\n updateAudioSetting(audioSet);\n }\n if (videoSet) {\n updateVideoSetting(videoSet);\n }\n if (screenshareSet) {\n updateScreenshareSetting(screenshareSet);\n }\n if (chatSet) {\n updateChatSetting(chatSet);\n }\n\n const settings = [audioSet, videoSet, screenshareSet, chatSet];\n socket.emit('updateSettingsForRequests', { settings, roomName });\n\n // Close modal\n updateIsSettingsModalVisible(false);\n}\n","var cookie = {};\n\n/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\nvar hasRequiredCookie;\n\nfunction requireCookie () {\n\tif (hasRequiredCookie) return cookie;\n\thasRequiredCookie = 1;\n\n\t/**\n\t * Module exports.\n\t * @public\n\t */\n\n\tcookie.parse = parse;\n\tcookie.serialize = serialize;\n\n\t/**\n\t * Module variables.\n\t * @private\n\t */\n\n\tvar __toString = Object.prototype.toString;\n\tvar __hasOwnProperty = Object.prototype.hasOwnProperty;\n\n\t/**\n\t * RegExp to match cookie-name in RFC 6265 sec 4.1.1\n\t * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2\n\t * which has been replaced by the token definition in RFC 7230 appendix B.\n\t *\n\t * cookie-name = token\n\t * token = 1*tchar\n\t * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" /\n\t * \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" /\n\t * \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n\t */\n\n\tvar cookieNameRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n\t/**\n\t * RegExp to match cookie-value in RFC 6265 sec 4.1.1\n\t *\n\t * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n\t * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n\t * ; US-ASCII characters excluding CTLs,\n\t * ; whitespace DQUOTE, comma, semicolon,\n\t * ; and backslash\n\t */\n\n\tvar cookieValueRegExp = /^(\"?)[\\u0021\\u0023-\\u002B\\u002D-\\u003A\\u003C-\\u005B\\u005D-\\u007E]*\\1$/;\n\n\t/**\n\t * RegExp to match domain-value in RFC 6265 sec 4.1.1\n\t *\n\t * domain-value = <subdomain>\n\t * ; defined in [RFC1034], Section 3.5, as\n\t * ; enhanced by [RFC1123], Section 2.1\n\t * <subdomain> = <label> | <subdomain> \".\" <label>\n\t * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]\n\t * Labels must be 63 characters or less.\n\t * 'let-dig' not 'letter' in the first char, per RFC1123\n\t * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>\n\t * <let-dig-hyp> = <let-dig> | \"-\"\n\t * <let-dig> = <letter> | <digit>\n\t * <letter> = any one of the 52 alphabetic characters A through Z in\n\t * upper case and a through z in lower case\n\t * <digit> = any one of the ten digits 0 through 9\n\t *\n\t * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173\n\t *\n\t * > (Note that a leading %x2E (\".\"), if present, is ignored even though that\n\t * character is not permitted, but a trailing %x2E (\".\"), if present, will\n\t * cause the user agent to ignore the attribute.)\n\t */\n\n\tvar domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;\n\n\t/**\n\t * RegExp to match path-value in RFC 6265 sec 4.1.1\n\t *\n\t * path-value = <any CHAR except CTLs or \";\">\n\t * CHAR = %x01-7F\n\t * ; defined in RFC 5234 appendix B.1\n\t */\n\n\tvar pathValueRegExp = /^[\\u0020-\\u003A\\u003D-\\u007E]*$/;\n\n\t/**\n\t * Parse a cookie header.\n\t *\n\t * Parse the given cookie header string into an object\n\t * The object has the various cookies as keys(names) => values\n\t *\n\t * @param {string} str\n\t * @param {object} [opt]\n\t * @return {object}\n\t * @public\n\t */\n\n\tfunction parse(str, opt) {\n\t if (typeof str !== 'string') {\n\t throw new TypeError('argument str must be a string');\n\t }\n\n\t var obj = {};\n\t var len = str.length;\n\t // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.\n\t if (len < 2) return obj;\n\n\t var dec = (opt && opt.decode) || decode;\n\t var index = 0;\n\t var eqIdx = 0;\n\t var endIdx = 0;\n\n\t do {\n\t eqIdx = str.indexOf('=', index);\n\t if (eqIdx === -1) break; // No more cookie pairs.\n\n\t endIdx = str.indexOf(';', index);\n\n\t if (endIdx === -1) {\n\t endIdx = len;\n\t } else if (eqIdx > endIdx) {\n\t // backtrack on prior semicolon\n\t index = str.lastIndexOf(';', eqIdx - 1) + 1;\n\t continue;\n\t }\n\n\t var keyStartIdx = startIndex(str, index, eqIdx);\n\t var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);\n\t var key = str.slice(keyStartIdx, keyEndIdx);\n\n\t // only assign once\n\t if (!__hasOwnProperty.call(obj, key)) {\n\t var valStartIdx = startIndex(str, eqIdx + 1, endIdx);\n\t var valEndIdx = endIndex(str, endIdx, valStartIdx);\n\n\t if (str.charCodeAt(valStartIdx) === 0x22 /* \" */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* \" */) {\n\t valStartIdx++;\n\t valEndIdx--;\n\t }\n\n\t var val = str.slice(valStartIdx, valEndIdx);\n\t obj[key] = tryDecode(val, dec);\n\t }\n\n\t index = endIdx + 1;\n\t } while (index < len);\n\n\t return obj;\n\t}\n\n\tfunction startIndex(str, index, max) {\n\t do {\n\t var code = str.charCodeAt(index);\n\t if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index;\n\t } while (++index < max);\n\t return max;\n\t}\n\n\tfunction endIndex(str, index, min) {\n\t while (index > min) {\n\t var code = str.charCodeAt(--index);\n\t if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index + 1;\n\t }\n\t return min;\n\t}\n\n\t/**\n\t * Serialize data into a cookie header.\n\t *\n\t * Serialize a name value pair into a cookie string suitable for\n\t * http headers. An optional options object specifies cookie parameters.\n\t *\n\t * serialize('foo', 'bar', { httpOnly: true })\n\t * => \"foo=bar; httpOnly\"\n\t *\n\t * @param {string} name\n\t * @param {string} val\n\t * @param {object} [opt]\n\t * @return {string}\n\t * @public\n\t */\n\n\tfunction serialize(name, val, opt) {\n\t var enc = (opt && opt.encode) || encodeURIComponent;\n\n\t if (typeof enc !== 'function') {\n\t throw new TypeError('option encode is invalid');\n\t }\n\n\t if (!cookieNameRegExp.test(name)) {\n\t throw new TypeError('argument name is invalid');\n\t }\n\n\t var value = enc(val);\n\n\t if (!cookieValueRegExp.test(value)) {\n\t throw new TypeError('argument val is invalid');\n\t }\n\n\t var str = name + '=' + value;\n\t if (!opt) return str;\n\n\t if (null != opt.maxAge) {\n\t var maxAge = Math.floor(opt.maxAge);\n\n\t if (!isFinite(maxAge)) {\n\t throw new TypeError('option maxAge is invalid')\n\t }\n\n\t str += '; Max-Age=' + maxAge;\n\t }\n\n\t if (opt.domain) {\n\t if (!domainValueRegExp.test(opt.domain)) {\n\t throw new TypeError('option domain is invalid');\n\t }\n\n\t str += '; Domain=' + opt.domain;\n\t }\n\n\t if (opt.path) {\n\t if (!pathValueRegExp.test(opt.path)) {\n\t throw new TypeError('option path is invalid');\n\t }\n\n\t str += '; Path=' + opt.path;\n\t }\n\n\t if (opt.expires) {\n\t var expires = opt.expires;\n\n\t if (!isDate(expires) || isNaN(expires.valueOf())) {\n\t throw new TypeError('option expires is invalid');\n\t }\n\n\t str += '; Expires=' + expires.toUTCString();\n\t }\n\n\t if (opt.httpOnly) {\n\t str += '; HttpOnly';\n\t }\n\n\t if (opt.secure) {\n\t str += '; Secure';\n\t }\n\n\t if (opt.partitioned) {\n\t str += '; Partitioned';\n\t }\n\n\t if (opt.priority) {\n\t var priority = typeof opt.priority === 'string'\n\t ? opt.priority.toLowerCase() : opt.priority;\n\n\t switch (priority) {\n\t case 'low':\n\t str += '; Priority=Low';\n\t break\n\t case 'medium':\n\t str += '; Priority=Medium';\n\t break\n\t case 'high':\n\t str += '; Priority=High';\n\t break\n\t default:\n\t throw new TypeError('option priority is invalid')\n\t }\n\t }\n\n\t if (opt.sameSite) {\n\t var sameSite = typeof opt.sameSite === 'string'\n\t ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n\t switch (sameSite) {\n\t case true:\n\t str += '; SameSite=Strict';\n\t break;\n\t case 'lax':\n\t str += '; SameSite=Lax';\n\t break;\n\t case 'strict':\n\t str += '; SameSite=Strict';\n\t break;\n\t case 'none':\n\t str += '; SameSite=None';\n\t break;\n\t default:\n\t throw new TypeError('option sameSite is invalid');\n\t }\n\t }\n\n\t return str;\n\t}\n\n\t/**\n\t * URL-decode string value. Optimized to skip native call when no %.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\n\tfunction decode (str) {\n\t return str.indexOf('%') !== -1\n\t ? decodeURIComponent(str)\n\t : str\n\t}\n\n\t/**\n\t * Determine if value is a Date.\n\t *\n\t * @param {*} val\n\t * @private\n\t */\n\n\tfunction isDate (val) {\n\t return __toString.call(val) === '[object Date]';\n\t}\n\n\t/**\n\t * Try decoding a string using a decoding function.\n\t *\n\t * @param {string} str\n\t * @param {function} decode\n\t * @private\n\t */\n\n\tfunction tryDecode(str, decode) {\n\t try {\n\t return decode(str);\n\t } catch (e) {\n\t return str;\n\t }\n\t}\n\treturn cookie;\n}\n\nvar cookieExports = requireCookie();\n\nfunction hasDocumentCookie() {\n const testingValue = typeof global === 'undefined'\n ? undefined\n : global.TEST_HAS_DOCUMENT_COOKIE;\n if (typeof testingValue === 'boolean') {\n return testingValue;\n }\n // Can we get/set cookies on document.cookie?\n return typeof document === 'object' && typeof document.cookie === 'string';\n}\nfunction parseCookies(cookies) {\n if (typeof cookies === 'string') {\n return cookieExports.parse(cookies);\n }\n else if (typeof cookies === 'object' && cookies !== null) {\n return cookies;\n }\n else {\n return {};\n }\n}\nfunction readCookie(value, options = {}) {\n const cleanValue = cleanupCookieValue(value);\n if (!options.doNotParse) {\n try {\n return JSON.parse(cleanValue);\n }\n catch (e) {\n // At least we tried\n }\n }\n // Ignore clean value if we failed the deserialization\n // It is not relevant anymore to trim those values\n return value;\n}\nfunction cleanupCookieValue(value) {\n // express prepend j: before serializing a cookie\n if (value && value[0] === 'j' && value[1] === ':') {\n return value.substr(2);\n }\n return value;\n}\n\nclass Cookies {\n constructor(cookies, defaultSetOptions = {}) {\n this.changeListeners = [];\n this.HAS_DOCUMENT_COOKIE = false;\n this.update = () => {\n if (!this.HAS_DOCUMENT_COOKIE) {\n return;\n }\n const previousCookies = this.cookies;\n this.cookies = cookieExports.parse(document.cookie);\n this._checkChanges(previousCookies);\n };\n const domCookies = typeof document === 'undefined' ? '' : document.cookie;\n this.cookies = parseCookies(cookies || domCookies);\n this.defaultSetOptions = defaultSetOptions;\n this.HAS_DOCUMENT_COOKIE = hasDocumentCookie();\n }\n _emitChange(params) {\n for (let i = 0; i < this.changeListeners.length; ++i) {\n this.changeListeners[i](params);\n }\n }\n _checkChanges(previousCookies) {\n const names = new Set(Object.keys(previousCookies).concat(Object.keys(this.cookies)));\n names.forEach((name) => {\n if (previousCookies[name] !== this.cookies[name]) {\n this._emitChange({\n name,\n value: readCookie(this.cookies[name]),\n });\n }\n });\n }\n _startPolling() {\n this.pollingInterval = setInterval(this.update, 300);\n }\n _stopPolling() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n }\n get(name, options = {}) {\n if (!options.doNotUpdate) {\n this.update();\n }\n return readCookie(this.cookies[name], options);\n }\n getAll(options = {}) {\n if (!options.doNotUpdate) {\n this.update();\n }\n const result = {};\n for (let name in this.cookies) {\n result[name] = readCookie(this.cookies[name], options);\n }\n return result;\n }\n set(name, value, options) {\n if (options) {\n options = Object.assign(Object.assign({}, this.defaultSetOptions), options);\n }\n else {\n options = this.defaultSetOptions;\n }\n const stringValue = typeof value === 'string' ? value : JSON.stringify(value);\n this.cookies = Object.assign(Object.assign({}, this.cookies), { [name]: stringValue });\n if (this.HAS_DOCUMENT_COOKIE) {\n document.cookie = cookieExports.serialize(name, stringValue, options);\n }\n this._emitChange({ name, value, options });\n }\n remove(name, options) {\n const finalOptions = (options = Object.assign(Object.assign(Object.assign({}, this.defaultSetOptions), options), { expires: new Date(1970, 1, 1, 0, 0, 1), maxAge: 0 }));\n this.cookies = Object.assign({}, this.cookies);\n delete this.cookies[name];\n if (this.HAS_DOCUMENT_COOKIE) {\n document.cookie = cookieExports.serialize(name, '', finalOptions);\n }\n this._emitChange({ name, value: undefined, options });\n }\n addChangeListener(callback) {\n this.changeListeners.push(callback);\n if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 1) {\n if (typeof window === 'object' && 'cookieStore' in window) {\n window.cookieStore.addEventListener('change', this.update);\n }\n else {\n this._startPolling();\n }\n }\n }\n removeChangeListener(callback) {\n const idx = this.changeListeners.indexOf(callback);\n if (idx >= 0) {\n this.changeListeners.splice(idx, 1);\n }\n if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 0) {\n if (typeof window === 'object' && 'cookieStore' in window) {\n window.cookieStore.removeEventListener('change', this.update);\n }\n else {\n this._stopPolling();\n }\n }\n }\n}\n\nexport { Cookies as default };\n","import { PreJoinPageParameters } from \"../../types/types\";\nimport { Socket } from \"socket.io-client\";\nimport Cookies from \"universal-cookie\";\n\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10; // Maximum number of unsuccessful attempts before rate limiting\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours in milliseconds\n\n\nexport const checkLimitsAndMakeRequest = async ({\n apiUserName,\n apiToken,\n link,\n apiKey = \"\",\n userName,\n parameters,\n validate = true,\n }: {\n apiUserName: string;\n apiToken: string;\n link: string;\n apiKey?: string;\n userName: string;\n parameters: PreJoinPageParameters;\n validate?: boolean;\n }) => {\n const TIMEOUT_DURATION = 10000; // 10 seconds\n let unsuccessfulAttempts =\n parseInt(cookies.get(\"unsuccessfulAttempts\")) || 0;\n let lastRequestTimestamp =\n parseInt(cookies.get(\"lastRequestTimestamp\")) || 0;\n \n if (\n unsuccessfulAttempts >= MAX_ATTEMPTS &&\n Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION\n ) {\n parameters.showAlert?.({\n message: \"Too many unsuccessful attempts. Please try again later.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n } else {\n unsuccessfulAttempts = 0;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n }\n \n try {\n parameters.updateIsLoadingModalVisible(true);\n const socketPromise = await parameters.connectSocket({\n apiUserName,\n apiKey,\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<null>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Request timed out\")),\n TIMEOUT_DURATION\n )\n );\n \n const socket = await Promise.race([socketPromise, timeoutPromise]);\n if (socket && socket instanceof Socket && socket.id) {\n unsuccessfulAttempts = 0;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n if (validate){\n // only one connection is established, no local socket\n parameters.updateSocket(socket);\n }else{\n // local socket is also established, mediaSFU connection is now the local socket\n parameters.updateLocalSocket?.(socket);\n }\n parameters.updateApiUserName(apiUserName);\n parameters.updateApiToken(apiToken);\n parameters.updateLink(link);\n parameters.updateRoomName(apiUserName);\n parameters.updateMember(userName);\n if (validate) parameters.updateValidated(true);\n } else {\n unsuccessfulAttempts += 1;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n parameters.updateIsLoadingModalVisible(false);\n parameters.showAlert?.({\n message: \"Invalid credentials.\",\n type: \"danger\",\n duration: 3000,\n });\n }\n } catch {\n parameters.showAlert?.({\n message: \"Unable to connect. Check your credentials and try again.\",\n type: \"danger\",\n duration: 3000,\n });\n unsuccessfulAttempts += 1;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n parameters.updateIsLoadingModalVisible(false);\n }\n };","import * as mediasoupClient from \"mediasoup-client\";\nimport type { RtpCapabilities, Device } from 'mediasoup-client/lib/types';\n\nexport interface CreateDeviceClientOptions {\n rtpCapabilities: RtpCapabilities | null;\n}\n\n\n// Export the type definition for the function\nexport type CreateDeviceClientType = (options: CreateDeviceClientOptions) => Promise<Device | null>;\n\n\n/**\n * Creates a mediasoup client device with the provided RTP capabilities.\n *\n * @param {CreateDeviceClientOptions} options - The options for creating the device client.\n * @param {RTPCapabilities} options.rtpCapabilities - The RTP capabilities required for the device.\n * @returns {Promise<Device | null>} A promise that resolves to the created Device or null if creation fails.\n * @throws {Error} Throws an error if the required parameters are not provided or if device creation is not supported.\n *\n * @example\n * const device = await createDeviceClient({ rtpCapabilities });\n * if (device) {\n * console.log(\"Device created successfully\");\n * } else {\n * console.log(\"Failed to create device\");\n * }\n */\n\nexport const createDeviceClient = async ({\n rtpCapabilities\n}: CreateDeviceClientOptions): Promise<Device | null> => {\n try {\n // Validate input parameters\n if (!rtpCapabilities) {\n throw new Error(\n \"Both rtpCapabilities and mediasoupClient must be provided.\"\n );\n }\n\n // Create a mediasoup client device\n const device: (Device | null) = new mediasoupClient.Device();\n\n // Remove orientation capabilities\n rtpCapabilities.headerExtensions = rtpCapabilities!.headerExtensions!.filter(\n (ext) => ext.uri !== \"urn:3gpp:video-orientation\"\n );\n\n // Load the provided RTP capabilities into the device\n await device!.load({\n routerRtpCapabilities: rtpCapabilities,\n });\n\n return device;\n } catch ( error ) {\n // Handle specific errors, e.g., UnsupportedError\n if ( error as Error && (error as Error).name === \"UnsupportedError\" ) {\n // Handle unsupported device creation\n console.error(\"Device creation is not supported by this browser.\");\n }\n\n throw error; // Propagate other errors\n }\n\n};\n\n\n\n","import { EventType } from '../types/types';\n\nexport interface AutoAdjustOptions {\n n: number;\n eventType: EventType;\n shareScreenStarted: boolean;\n shared: boolean; \n}\n\nexport type AutoAdjustType = (options: AutoAdjustOptions) => Promise<number[]>;\n\n\n/**\n * Adjusts values based on the provided options and the number of participants.\n *\n * @function\n * @async\n * @param {AutoAdjustOptions} options - The options for auto adjustment.\n * @param {number} options.n - The number of participants.\n * @param {string} options.eventType - The type of event (e.g., 'broadcast', 'chat', 'conference').\n * @param {boolean} options.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.shared - Indicates if something is shared.\n * \n * @returns {Promise<number[]>} A promise that resolves to an array containing the adjusted values.\n * \n * @example\n * import { autoAdjust } from 'mediasfu-reactjs';\n *\n * const options = {\n * n: 10,\n * eventType: 'conference',\n * shareScreenStarted: false,\n * shared: false,\n * };\n * \n * autoAdjust(options)\n * .then(values => {\n * console.log('Adjusted values:', values);\n * })\n * .catch(error => {\n * console.error('Error adjusting values:', error);\n * });\n */\n\nexport async function autoAdjust({\n n,\n eventType, shareScreenStarted, shared\n}: AutoAdjustOptions): Promise<number[]> {\n\n // Default values\n let val1 = 6;\n let val2 = 12 - val1;\n\n // Adjust values based on eventType and other conditions\n if (eventType === 'broadcast') {\n val1 = 0;\n val2 = 12 - val1;\n } else if (\n eventType === 'chat' ||\n (eventType === 'conference' && !(shareScreenStarted || shared))\n ) {\n val1 = 12;\n val2 = 12 - val1;\n } else {\n if (shareScreenStarted || shared) {\n val2 = 10;\n val1 = 12 - val2;\n } else {\n // Adjust values based on the number of participants (n)\n if (n === 0) {\n val1 = 1;\n val2 = 12 - val1;\n } else if (n >= 1 && n < 4) {\n val1 = 4;\n val2 = 12 - val1;\n } else if (n >= 4 && n < 6) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 6 && n < 9) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 9 && n < 12) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 12 && n < 20) {\n val1 = 8;\n val2 = 12 - val1;\n } else if (n >= 20 && n < 50) {\n val1 = 8;\n val2 = 12 - val1;\n } else {\n val1 = 10;\n val2 = 12 - val1;\n }\n }\n }\n\n // Return an array with adjusted values\n return [val1, val2];\n}\n","export interface CalculateRowsAndColumnsOptions {\n n: number;\n}\n\n// Export the type definition for the function\nexport type CalculateRowsAndColumnsType = (options: CalculateRowsAndColumnsOptions) => [number, number];\n\n/**\n * Calculates the number of rows and columns needed to display a given number of items in a grid.\n *\n * @function\n * @param {CalculateRowsAndColumnsOptions} options - The options for calculating rows and columns.\n * @param {number} options.n - The number of items to display.\n * @returns {[number, number]} A tuple containing the number of rows and columns.\n * \n * @example\n * import { calculateRowsAndColumns } from 'mediasfu-reactjs';\n *\n * const options = {\n * n: 10,\n * };\n * \n * const [rows, cols] = calculateRowsAndColumns(options);\n * console.log(`Rows: ${rows}, Columns: ${cols}`); // Outputs: Rows: 4, Columns: 3\n */\nexport function calculateRowsAndColumns({ n }: CalculateRowsAndColumnsOptions): [number, number] {\n // Calculate the square root of n\n const sqrt = Math.sqrt(n);\n\n // Initialize columns based on the floor of the square root\n let cols = Math.floor(sqrt);\n\n // Calculate the number of rows needed to display n videos\n let rows = Math.ceil(n / cols);\n\n // Calculate the product of rows and columns\n let prod = rows * cols;\n\n // Adjust rows and columns until the product is greater than or equal to n\n while (prod < n) {\n if (cols < rows) {\n cols++;\n } else {\n rows++;\n }\n prod = rows * cols;\n }\n\n // Return an array with the calculated number of rows and columns\n return [rows, cols];\n}\n","export interface CheckGridOptions {\n rows: number;\n cols: number;\n actives: number;\n}\n\nexport type CheckGridType = (options: CheckGridOptions) => Promise<[boolean, number, number, number, number, number, number] | void>;\n\n/**\n * Checks the grid configuration and calculates various parameters based on the number of rows, columns, and active elements.\n *\n * @param {CheckGridOptions} options - The options for checking the grid.\n * @param {number} options.rows - The number of rows in the grid.\n * @param {number} options.cols - The number of columns in the grid.\n * @param {number} options.actives - The number of active elements in the grid.\n * @returns {Promise<[boolean, number, number, number, number, number, number] | void>} A promise that resolves to a tuple containing:\n * - `removeAltGrid` (boolean): Indicates whether to remove the alternate grid.\n * - `numtoadd` (number): The number of elements to add.\n * - `numRows` (number): The number of rows.\n * - `numCols` (number): The number of columns.\n * - `remainingVideos` (number): The number of remaining videos.\n * - `actualRows` (number): The actual number of rows.\n * - `lastrowcols` (number): The number of columns in the last row.\n * \n * If an error occurs, it logs the error to the console.\n *\n * @example\n * const options = {\n * rows: 3,\n * cols: 4,\n * actives: 10,\n * };\n * \n * checkGrid(options)\n * .then(result => {\n * console.log('Grid check result:', result);\n * // Example output: [true, 2, 3, 4, 2, 3, 4]\n * })\n * .catch(error => {\n * console.error('Error checking grid:', error);\n * });\n */\n\nexport async function checkGrid({ rows, cols, actives }: CheckGridOptions): Promise<[boolean, number, number, number, number, number, number] | void> {\n try {\n let numRows = 0;\n let numCols = 0;\n let lastrow = 0;\n let lastrowcols = 0;\n let remainingVideos = 0;\n let numtoadd = 0;\n let actualRows = 0;\n let removeAltGrid = false;\n\n if (rows * cols !== actives) {\n if (rows * cols > actives) {\n const res = actives - (rows - 1) * cols;\n if (cols * 0.5 < res) {\n lastrow = rows;\n lastrowcols = res;\n remainingVideos = lastrowcols;\n } else {\n lastrowcols = res + cols;\n lastrow = rows - 1;\n remainingVideos = lastrowcols;\n }\n\n numRows = lastrow - 1;\n numCols = cols;\n numtoadd = (lastrow - 1) * numCols;\n actualRows = lastrow;\n\n removeAltGrid = false;\n }\n } else {\n // Perfect fit\n numCols = cols;\n numRows = rows;\n lastrow = rows;\n lastrowcols = cols;\n remainingVideos = 0;\n numtoadd = lastrow * numCols;\n actualRows = lastrow;\n removeAltGrid = true;\n }\n\n return [\n removeAltGrid,\n numtoadd,\n numRows,\n numCols,\n remainingVideos,\n actualRows,\n lastrowcols,\n ];\n } catch (error) {\n console.log(\"checkGrid error\", error);\n // throw error;\n }\n}\n","export interface CheckPermissionOptions {\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n permissionType: 'audioSetting' | 'videoSetting' | 'screenshareSetting' | 'chatSetting';\n}\n\n// Export the type definition for the function\nexport type CheckPermissionType = (options: CheckPermissionOptions) => Promise<number>;\n\n/**\n * Checks the permission based on the provided settings.\n *\n * @param {CheckPermissionOptions} options - The options for checking permissions.\n * @param {string} options.permissionType - The type of permission to check. Can be \"audioSetting\", \"videoSetting\", \"screenshareSetting\", or \"chatSetting\".\n * @param {string} options.audioSetting - The setting for audio permission. Can be \"allow\", \"approval\", or other.\n * @param {string} options.videoSetting - The setting for video permission. Can be \"allow\", \"approval\", or other.\n * @param {string} options.screenshareSetting - The setting for screenshare permission. Can be \"allow\", \"approval\", or other.\n * @param {string} options.chatSetting - The setting for chat permission. Can be \"allow\", \"approval\", or other.\n * @returns {Promise<number>} - Returns 0 if the setting is \"allow\", 1 if the setting is \"approval\", and 2 for other settings or invalid permission types.\n * @throws Will throw an error if an unexpected error occurs during the permission check.\n *\n * @example\n * const options = {\n * permissionType: 'audioSetting',\n * audioSetting: 'allow',\n * videoSetting: 'approval',\n * screenshareSetting: 'approval',\n * chatSetting: 'allow',\n * };\n * \n * checkPermission(options)\n * .then(result => {\n * console.log('Permission result:', result);\n * })\n * .catch(error => {\n * console.error('Error checking permission:', error);\n * });\n */\n\nexport async function checkPermission({ permissionType, audioSetting, videoSetting, screenshareSetting, chatSetting }: CheckPermissionOptions) {\n try {\n\n // PermissionType is audioSetting, videoSetting, screenshareSetting, chatSetting\n // Perform a switch case to check for the permissionType and return the response\n switch (permissionType) {\n case \"audioSetting\":\n if (audioSetting === \"allow\") {\n return 0;\n } else if (audioSetting === \"approval\") {\n return 1;\n } else {\n return 2;\n }\n case \"videoSetting\":\n if (videoSetting === \"allow\") {\n return 0;\n } else if (videoSetting === \"approval\") {\n return 1;\n } else {\n return 2;\n }\n case \"screenshareSetting\":\n if (screenshareSetting === \"allow\") {\n return 0;\n } else if (screenshareSetting === \"approval\") {\n return 1;\n } else {\n return 2;\n }\n case \"chatSetting\":\n if (chatSetting === \"allow\") {\n return 0;\n } else if (chatSetting === \"approval\") {\n return 1;\n } else {\n return 2;\n }\n default:\n // throw new Error(`Invalid permissionType: ${permissionType}`);\n return 2;\n }\n } catch {\n // console.log('checkPermission error', error);\n // throw error;\n return 2;\n }\n}\n"," \nimport { Socket } from \"socket.io-client\";\nimport { CoHostResponsibility, Participant, ShowAlert } from \"../types/types\";\n\nexport interface ControlMediaOptions {\n participantId: string;\n participantName: string;\n type: 'audio' | 'video' | 'screenshare' | 'all';\n socket: Socket;\n coHostResponsibility: CoHostResponsibility[];\n participants: Participant[];\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n coHost: string;\n roomName: string;\n}\n// Export the type definition for the function\nexport type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;\n\n/**\n * Controls the media of a participant in a media session if certain conditions are met.\n *\n * @param {ControlMediaOptions} options - The options for controlling media.\n * @param {string} options.participantId - The ID of the participant to control.\n * @param {string} options.participantName - The name of the participant to control.\n * @param {'audio' | 'video' | 'screenshare' | 'all'} options.type - The type of media to control.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {Array<CoHostResponsibility>} options.coHostResponsibility - List of co-host responsibilities.\n * @param {Array<Participant>} options.participants - List of participants in the session.\n * @param {string} options.member - The current member attempting to control media.\n * @param {string} options.islevel - The level of the current member.\n * @param {Function} [options.showAlert] - Optional function to show alerts.\n * @param {string} options.coHost - The co-host information.\n * @param {string} options.roomName - The name of the room.\n *\n * @returns {Promise<void>} A promise that resolves when the media control operation is complete.\n *\n * @throws Will log an error message if there are issues controlling the media or if participant is not found.\n *\n * @example\n * const options = {\n * participantId: '1234',\n * participantName: 'John Doe',\n * type: 'audio',\n * socket: socketInstance,\n * coHostResponsibility: [{ name: 'media', value: true }],\n * participants: participantList,\n * member: 'Admin',\n * islevel: '1',\n * showAlert: (alert) => console.log(alert.message),\n * coHost: 'CoHostName',\n * roomName: 'Room 1',\n * };\n * \n * controlMedia(options)\n * .then(() => {\n * console.log('Media control operation completed successfully.');\n * })\n * .catch((error) => {\n * console.error('Error controlling media:', error);\n * });\n */\n\nexport async function controlMedia({\n participantId,\n participantName,\n type,\n socket,\n coHostResponsibility,\n participants,\n member,\n islevel,\n showAlert,\n coHost,\n roomName,\n}: ControlMediaOptions): Promise<void> {\n try {\n let mediaValue = false;\n\n try {\n mediaValue = coHostResponsibility.find((item) => item.name === \"media\")?.value ?? false;\n } catch (error) {\n console.log(\"Error retrieving media control value\", error);\n }\n\n const participant = participants.find((obj) => obj.name === participantName);\n\n if (!participant) {\n console.log(\"Participant not found\");\n return;\n }\n\n if (islevel === \"2\" || (coHost === member && mediaValue === true)) {\n if (\n (!participant.muted && participant.islevel !== \"2\" && type === \"audio\") ||\n (participant.islevel !== \"2\" && type === \"video\" && participant.videoOn)\n ) {\n socket.emit(\"controlMedia\", {\n participantId,\n participantName,\n type,\n roomName,\n });\n }\n } else {\n if (showAlert) {\n showAlert({\n message: \"You are not allowed to control media for other participants.\",\n type: \"danger\",\n duration: 3000,\n });\n }\n }\n } catch (error) {\n console.log(\"controlMedia error\", error);\n }\n}\n","import { CalculateRowsAndColumnsType, EventType } from \"../types/types\";\n\nexport interface GetEstimateParameters {\n fixedPageLimit: number;\n screenPageLimit: number;\n shareScreenStarted: boolean;\n shared?: boolean;\n eventType: EventType;\n removeAltGrid: boolean;\n isWideScreen: boolean;\n isMediumScreen: boolean;\n updateRemoveAltGrid: (value: boolean) => void;\n\n // mediaSfu functions\n calculateRowsAndColumns: CalculateRowsAndColumnsType;\n\n [key: string]: any;\n}\n\nexport interface GetEstimateOptions {\n n: number;\n parameters: GetEstimateParameters;\n}\n\n// Export the type definition for the function\nexport type GetEstimateType = (options: GetEstimateOptions) => [number, number, number];\n\n/**\n * Estimates the number of rows and columns for a given set of parameters.\n *\n * @param {GetEstimateOptions} options - The options for the estimation.\n * @param {number} options.n - The number of items to estimate for.\n * @param {GetEstimateParameters} options.parameters - The parameters for the estimation.\n * @param {number} options.parameters.fixedPageLimit - The fixed page limit.\n * @param {number} options.parameters.screenPageLimit - The screen page limit.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} [options.parameters.shared] - Indicates if sharing is active.\n * @param {string} options.parameters.eventType - The type of event (e.g., \"chat\", \"conference\").\n * @param {boolean} options.parameters.removeAltGrid - Indicates if the alternate grid should be removed.\n * @param {boolean} options.parameters.isWideScreen - Indicates if the screen is wide.\n * @param {boolean} options.parameters.isMediumScreen - Indicates if the screen is medium-sized.\n * @param {Function} options.parameters.updateRemoveAltGrid - Function to update the removeAltGrid parameter.\n * @param {Function} options.parameters.calculateRowsAndColumns - Function to calculate rows and columns.\n *\n * @returns {[number, number, number]} An array containing the estimated number of items, rows, and columns.\n *\n * @throws Will log an error message if an error occurs during estimation.\n *\n * @example\n * const options = {\n * n: 10,\n * parameters: {\n * fixedPageLimit: 5,\n * screenPageLimit: 8,\n * shareScreenStarted: false,\n * shared: false,\n * eventType: 'conference',\n * removeAltGrid: false,\n * isWideScreen: true,\n * isMediumScreen: false,\n * updateRemoveAltGrid: (value) => console.log('Remove Alt Grid:', value),\n * calculateRowsAndColumns: ({ n }) => [3, 4], // Example implementation\n * },\n * };\n * \n * const estimate = getEstimate(options);\n * console.log('Estimated:', estimate); // Output: Estimated: [10, 3, 4]\n */\n\nexport function getEstimate({ n, parameters }: GetEstimateOptions): [number, number, number] {\n try {\n // Destructure parameters\n let {\n fixedPageLimit,\n screenPageLimit,\n shareScreenStarted,\n shared,\n eventType,\n removeAltGrid,\n isWideScreen,\n isMediumScreen,\n updateRemoveAltGrid,\n\n //mediaSfu functions\n calculateRowsAndColumns,\n } = parameters;\n\n // Calculate rows and columns\n const [rows, cols] = calculateRowsAndColumns({ n });\n\n // Check conditions for removing alt grid\n if (\n n < fixedPageLimit ||\n ((shareScreenStarted || shared) && n < screenPageLimit + 1)\n ) {\n removeAltGrid = true;\n updateRemoveAltGrid(removeAltGrid);\n\n // Return estimated values based on screen width\n if (!(isMediumScreen || isWideScreen)) {\n return eventType === \"chat\" ||\n (eventType === \"conference\" && !(shareScreenStarted || shared))\n ? [n, n, 1]\n : [n, 1, n];\n } else {\n return eventType === \"chat\" ||\n (eventType === \"conference\" && !(shareScreenStarted || shared))\n ? [n, 1, n]\n : [n, n, 1];\n }\n }\n\n return [rows * cols, rows, cols];\n } catch (error) {\n // Handle errors during estimation\n if (error instanceof Error) {\n console.log(\"Error estimating rows and columns:\", error.message);\n } else {\n console.log(\"Error estimating rows and columns:\", error);\n }\n return [0, 0, 0];\n // throw error;\n }\n}\n","import { Socket } from \"socket.io-client\";\nimport { SignalNewConsumerTransportParameters, SignalNewConsumerTransportType } from '../types/types';\n\nexport interface GetPipedProducersAltParameters extends SignalNewConsumerTransportParameters {\n member: string;\n\n // mediasfu functions\n signalNewConsumerTransport: SignalNewConsumerTransportType;\n [key: string]: any;\n}\n\nexport interface GetPipedProducersAltOptions {\n community?: boolean;\n nsock: Socket;\n islevel: string;\n parameters: GetPipedProducersAltParameters;\n}\n\n// Export the type definition for the function\nexport type GetPipedProducersAltType = (options: GetPipedProducersAltOptions) => Promise<void>;\n\n/**\n * Retrieves piped producers and signals new consumer transport for each retrieved producer.\n *\n * @param {GetPipedProducersAltOptions} options - The options for retrieving piped producers.\n * @param {boolean} options.community - A flag indicating if the room is a community edition room.\n * @param {Socket} options.nsock - The WebSocket instance used for communication.\n * @param {string} options.islevel - A flag indicating the level of the request.\n * @param {GetPipedProducersAltParameters} options.parameters - Additional parameters for the request.\n * @param {string} options.parameters.member - The member identifier.\n * @param {Function} options.parameters.signalNewConsumerTransport - A function to signal new consumer transport.\n *\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n *\n * @throws {Error} If an error occurs during the process of retrieving producers.\n *\n * @example\n * const options = {\n * community: false,\n * nsock: socketInstance,\n * islevel: '1',\n * parameters: {\n * member: 'memberId',\n * signalNewConsumerTransport: async ({ nsock, remoteProducerId, islevel, parameters }) => {\n * // Implementation for signaling new consumer transport\n * },\n * },\n * };\n *\n * getPipedProducersAlt(options)\n * .then(() => {\n * console.log('Successfully retrieved piped producers');\n * })\n * .catch((error) => {\n * console.error('Error retrieving piped producers:', error);\n * });\n */\n\nexport const getPipedProducersAlt = async ({\n community = false,\n nsock,\n islevel,\n parameters,\n}: GetPipedProducersAltOptions): Promise<void> => {\n try {\n // Destructure parameters\n const { member, signalNewConsumerTransport } = parameters;\n\n const emitName = community ? \"getProducersAlt\" : \"getProducersPipedAlt\";\n\n // Emit request to get piped producers using WebSocket\n await nsock.emit(\n emitName,\n { islevel, member },\n async (producerIds: string[]) => {\n // Check if producers are retrieved\n if (producerIds.length > 0) {\n // Signal new consumer transport for each retrieved producer\n await Promise.all(\n producerIds.map((id) =>\n signalNewConsumerTransport({\n nsock,\n remoteProducerId: id,\n islevel,\n parameters,\n })\n )\n );\n }\n }\n );\n } catch (error) {\n // Handle errors during the process of retrieving producers\n console.log(\"Error getting piped producers:\", (error as Error).message);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport { SignalNewConsumerTransportParameters, SignalNewConsumerTransportType } from \"../types/types\";\nexport interface GetProducersPipedParameters extends SignalNewConsumerTransportParameters {\n member: string;\n\n // mediasfu functions\n signalNewConsumerTransport: SignalNewConsumerTransportType,\n [key: string]: any;\n}\n\nexport interface GetProducersPipedOptions {\n nsock: Socket;\n islevel: string;\n parameters: GetProducersPipedParameters;\n}\n\n// Export the type definition for the function\nexport type GetProducersPipedType = (options: GetProducersPipedOptions) => Promise<void>;\n\n/**\n * Retrieves piped producers and signals new consumer transport for each retrieved producer.\n *\n * @param {GetProducersPipedOptions} options - The options for getting piped producers.\n * @param {Socket} options.nsock - The WebSocket instance used for communication.\n * @param {string} options.islevel - A flag indicating the level of the operation.\n * @param {GetProducersPipedParameters} options.parameters - Additional parameters for the operation.\n * @param {string} options.parameters.member - The member identifier.\n * @param {Function} options.parameters.signalNewConsumerTransport - The function to signal new consumer transport.\n *\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n *\n * @throws {Error} If an error occurs during the process of retrieving producers.\n *\n * @example\n * const options = {\n * nsock: socketInstance,\n * islevel: '1',\n * parameters: {\n * member: 'memberId',\n * signalNewConsumerTransport: async ({ remoteProducerId, islevel, nsock, parameters }) => {\n * // Implementation for signaling new consumer transport\n * },\n * },\n * };\n *\n * getProducersPiped(options)\n * .then(() => {\n * console.log('Successfully retrieved piped producers');\n * })\n * .catch((error) => {\n * console.error('Error retrieving piped producers:', error);\n * });\n */\n\nexport const getProducersPiped = async ({\n nsock,\n islevel,\n parameters,\n}: GetProducersPipedOptions): Promise<void> => {\n try {\n // Destructure parameters\n const { member, signalNewConsumerTransport } = parameters;\n\n // Emit request to get piped producers using WebSocket\n await nsock.emit(\n \"getProducersPipedAlt\",\n { islevel, member },\n async (producerIds: string[]) => {\n // Check if producers are retrieved\n if (producerIds.length > 0) {\n // Signal new consumer transport for each retrieved producer\n await Promise.all(\n producerIds.map((id) =>\n signalNewConsumerTransport({\n remoteProducerId: id,\n islevel,\n nsock,\n parameters,\n })\n )\n );\n }\n }\n );\n } catch (error) {\n // Handle errors during the process of retrieving producers\n console.log(\"Error getting piped producers:\", (error as Error).message);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport { Message } from \"../types/types\";\nexport interface ReceiveRoomMessagesOptions {\n socket: Socket;\n roomName: string;\n updateMessages: (messages: Message[]) => void;\n}\n\n// Export the type definition for the function\nexport type ReceiveRoomMessagesType = (options: ReceiveRoomMessagesOptions) => Promise<void>;\n\n/**\n * Retrieves messages from a specified room and updates the message state.\n *\n * @param {ReceiveRoomMessagesOptions} options - The options for receiving room messages.\n * @param {Socket} options.socket - The socket instance used for communication.\n * @param {string} options.roomName - The name of the room from which to retrieve messages.\n * @param {Function} options.updateMessages - Function to update the state with retrieved messages.\n *\n * @returns {Promise<void>} A promise that resolves when the messages have been retrieved and updated.\n *\n * @throws Will log an error message if there is an issue retrieving the messages.\n *\n * @example\n * ```typescript\n * await receiveRoomMessages({\n * socket: socketInstance,\n * roomName: 'Room1',\n * updateMessages: (messages) => console.log(messages),\n * });\n * ```\n */\n\n\nexport async function receiveRoomMessages({ \n socket,\n roomName,\n updateMessages,\n}: ReceiveRoomMessagesOptions): Promise<void> {\n\n try {\n // Retrieve messages from the server\n socket.emit(\"getMessage\", { roomName }, async ({ messages_ }: { messages_: Message[]; }) => {\n updateMessages(messages_);\n });\n } catch (error) {\n // Handle errors if any\n if (error instanceof Error) {\n console.log(\"Error tuning messages:\", error.message);\n } else {\n console.log(\"Error tuning messages:\", error);\n }\n }\n}\n\n","import type { Producer } from 'mediasoup-client/lib/types';\nimport { PrepopulateUserMediaParameters, PrepopulateUserMediaType } from \"../types/types\";\n\nexport interface ResumeSendTransportAudioParameters extends PrepopulateUserMediaParameters {\n audioProducer: Producer | null;\n localAudioProducer?: Producer | null;\n islevel: string;\n hostLabel: string;\n lock_screen: boolean;\n shared: boolean;\n videoAlreadyOn: boolean;\n updateAudioProducer: (audioProducer: Producer | null) => void;\n updateLocalAudioProducer?: (localAudioProducer: Producer | null) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n // mediasfu functions\n prepopulateUserMedia: PrepopulateUserMediaType;\n prepopulateLocalUserMedia?: PrepopulateUserMediaType;\n [key: string]: any;\n}\n\nexport interface ResumeSendTransportAudioOptions {\n parameters: ResumeSendTransportAudioParameters;\n}\n\n// Export the type definition for the function\nexport type ResumeSendTransportAudioType = (options: ResumeSendTransportAudioOptions) => Promise<void>;\n\nconst resumeLocalSendTransportAudio = async ({\n parameters,\n}: ResumeSendTransportAudioOptions): Promise<void> => {\n try {\n const {\n localAudioProducer,\n updateLocalAudioProducer,\n } = parameters;\n\n // Resume local audio producer\n if (localAudioProducer) {\n localAudioProducer.resume();\n updateLocalAudioProducer?.(localAudioProducer);\n }\n } catch (error) {\n console.error(\"Error resuming local audio send transport:\", error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Resumes the send transport for audio and updates the UI and audio producer state accordingly.\n *\n * This function supports both a primary and a local audio producer, delegating the local logic to a separate function.\n *\n * @param {ResumeSendTransportAudioOptions} options - The options for resuming the send transport.\n * @param {ResumeSendTransportAudioParameters} options.parameters - The parameters for resuming the send transport.\n * @param {Producer} options.parameters.audioProducer - The primary audio producer to resume.\n * @param {Producer} [options.parameters.localAudioProducer] - The local audio producer to resume.\n * @param {string} options.parameters.islevel - The level of the audio producer.\n * @param {string} options.parameters.hostLabel - The label for the host.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {boolean} options.parameters.videoAlreadyOn - Indicates if the video is already on.\n * @param {Function} options.parameters.updateAudioProducer - Function to update the audio producer state.\n * @param {Function} [options.parameters.updateLocalAudioProducer] - Function to update the local audio producer state.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @returns {Promise<void>} A promise that resolves when the send transport is resumed and the UI is updated.\n *\n * @throws {Error} Throws an error if there is an issue during the process of resuming the audio send transport.\n *\n * @example\n * ```typescript\n * await resumeSendTransportAudio({\n * parameters: {\n * audioProducer: producer,\n * localAudioProducer: localProducer,\n * islevel: '1',\n * hostLabel: 'Host',\n * lock_screen: false,\n * shared: false,\n * updateAudioProducer: updateProducerFunction,\n * updateLocalAudioProducer: updateLocalProducerFunction,\n * videoAlreadyOn: false,\n * updateUpdateMainWindow: updateWindowFunction,\n * prepopulateUserMedia: prepopulateFunction,\n * prepopulateLocalUserMedia: prepopulateLocalFunction,\n * },\n * });\n * ```\n */\n\nexport const resumeSendTransportAudio: ResumeSendTransportAudioType = async ({\n parameters,\n}: ResumeSendTransportAudioOptions): Promise<void> => {\n try {\n const {\n audioProducer,\n islevel,\n hostLabel,\n lock_screen,\n shared,\n updateAudioProducer,\n videoAlreadyOn,\n updateUpdateMainWindow,\n\n //mediasfu functions\n prepopulateUserMedia,\n } = parameters;\n\n // Resume send transport for audio\n audioProducer!.resume();\n\n // Update UI for primary producer\n if (!videoAlreadyOn && islevel === \"2\") {\n if (!lock_screen && !shared) {\n let updatedMainWindow = true;\n updateUpdateMainWindow(updatedMainWindow);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updatedMainWindow = false;\n updateUpdateMainWindow(updatedMainWindow);\n }\n }\n\n // Update audio producer state\n updateAudioProducer(audioProducer);\n\n // Attempt to handle local audio producer if primary fails\n try {\n await resumeLocalSendTransportAudio({ parameters });\n } catch (localError) {\n console.error(\n \"local audio send transport resuming failed:\",\n localError\n );\n }\n } catch (error: any) {\n // Handle errors during the process of resuming the audio send transport\n throw new Error(\n `Error during resuming audio send transport: ${error.message}`\n );\n\n }\n};\n","import { GridSizes, ComponentSizes, EventType } from \"../types/types\";\nexport interface UpdateMiniCardsGridParameters {\n updateGridRows: (rows: number) => void;\n updateGridCols: (cols: number) => void;\n updateAltGridRows: (rows: number) => void;\n updateAltGridCols: (cols: number) => void;\n updateGridSizes: (gridSizes: GridSizes) => void;\n gridSizes: GridSizes;\n paginationDirection: string;\n paginationHeightWidth: number;\n doPaginate: boolean;\n componentSizes: ComponentSizes;\n eventType: EventType;\n\n getUpdatedAllParams: () => UpdateMiniCardsGridParameters;\n [key: string]: any;\n}\n\nexport interface UpdateMiniCardsGridOptions {\n rows: number;\n cols: number;\n defal?: boolean;\n actualRows?: number;\n parameters: UpdateMiniCardsGridParameters;\n}\n\n// Export the type definition for the function\nexport type UpdateMiniCardsGridType = (options: UpdateMiniCardsGridOptions) => Promise<void>;\n\n/**\n * Updates the mini cards grid based on the specified rows and columns.\n *\n * @param {UpdateMiniCardsGridOptions} options - The function parameters.\n * @param {number} options.rows - The number of rows in the grid.\n * @param {number} options.cols - The number of columns in the grid.\n * @param {boolean} [options.defal] - Flag indicating whether to update the default grid or an alternative grid.\n * @param {number} [options.actualRows] - The actual number of rows in the grid.\n * @param {UpdateMiniCardsGridParameters} options.parameters - Additional parameters needed for the function.\n * @returns {Promise<void>} A promise that resolves when the mini cards grid is updated.\n *\n * @throws Will throw an error if the update operation fails.\n *\n * @example\n * ```typescript\n * const options = {\n * rows: 2,\n * cols: 3,\n * defal: true,\n * actualRows: 2,\n * parameters: {\n * updateGridRows: updateGridRowsFunction,\n * updateGridCols: updateGridColsFunction,\n * updateAltGridRows: updateAltGridRowsFunction,\n * updateAltGridCols: updateAltGridColsFunction,\n * updateGridSizes: updateGridSizesFunction,\n * gridSizes: { gridWidth: 100, gridHeight: 100 },\n * paginationDirection: 'horizontal',\n * paginationHeightWidth: 50,\n * doPaginate: true,\n * componentSizes: { otherWidth: 300, otherHeight: 200 },\n * eventType: 'chat',\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * },\n * };\n * \n * await updateMiniCardsGrid(options);\n * ```\n */\n\n\nexport async function updateMiniCardsGrid({\n rows,\n cols,\n defal = true,\n actualRows = 2,\n parameters,\n}: UpdateMiniCardsGridOptions): Promise<void> {\n let { getUpdatedAllParams } = parameters;\n\n parameters = getUpdatedAllParams();\n\n let {\n updateGridRows,\n updateGridCols,\n updateAltGridRows,\n updateAltGridCols,\n updateGridSizes,\n\n gridSizes,\n paginationDirection,\n paginationHeightWidth,\n doPaginate,\n componentSizes,\n eventType,\n } = parameters;\n\n let containerWidth = componentSizes.otherWidth;\n let containerHeight = componentSizes.otherHeight;\n\n if (doPaginate) {\n // Adjust container size based on pagination\n if (paginationDirection === \"horizontal\") {\n containerHeight -= paginationHeightWidth;\n } else {\n containerWidth -= paginationHeightWidth;\n }\n }\n\n let cardSpacing = 3; // 3px margin between cards\n if (eventType === \"chat\") {\n cardSpacing = 0;\n }\n\n let totalSpacingHorizontal = (cols - 1) * cardSpacing;\n let totalSpacingVertical = (actualRows - 1) * cardSpacing;\n\n let cardWidth: number;\n let cardHeight: number;\n\n if (cols === 0 || actualRows === 0) {\n cardWidth = 0;\n cardHeight = 0;\n } else {\n cardWidth = Math.floor(\n (containerWidth - totalSpacingHorizontal) / cols\n );\n cardHeight = Math.floor(\n (containerHeight - totalSpacingVertical) / actualRows\n );\n }\n\n if (defal) {\n updateGridRows(rows);\n updateGridCols(cols);\n\n gridSizes = { ...gridSizes, gridWidth: cardWidth, gridHeight: cardHeight };\n updateGridSizes(gridSizes);\n } else {\n updateAltGridRows(rows);\n updateAltGridCols(cols);\n\n gridSizes = {\n ...gridSizes,\n altGridWidth: cardWidth,\n altGridHeight: cardHeight,\n };\n updateGridSizes(gridSizes);\n }\n}\n\n","import { AudioDecibels } from \"../types/types\";\nexport interface UpdateParticipantAudioDecibelsOptions {\n name: string;\n averageLoudness: number;\n audioDecibels: AudioDecibels[];\n updateAudioDecibels: (audioDecibels: AudioDecibels[]) => void;\n}\n\n// Export the type definition for the function\nexport type UpdateParticipantAudioDecibelsType = (options: UpdateParticipantAudioDecibelsOptions) => void;\n\n\n/**\n * Updates the audio decibels for a participant.\n *\n * @param {UpdateParticipantAudioDecibelsOptions} options - The options for updating participant audio decibels.\n * @param {string} options.name - The name of the participant.\n * @param {number} options.averageLoudness - The average loudness of the participant.\n * @param {Array<AudioDecibels>} options.audioDecibels - The array of audio decibels entries.\n * @param {Function} options.updateAudioDecibels - The function to update the audio decibels array.\n *\n * @returns {void}\n * \n * @example\n * const options = {\n * name: 'participant1',\n * averageLoudness: 50,\n * audioDecibels: [{ name: 'participant1', averageLoudness: 50 }],\n * updateAudioDecibels: updateAudioDecibelsFunction,\n * };\n * \n * updateParticipantAudioDecibels(options);\n */\n\nexport function updateParticipantAudioDecibels({\n name,\n averageLoudness,\n audioDecibels, \n updateAudioDecibels,\n}: UpdateParticipantAudioDecibelsOptions): void {\n\n // Function to update the audioDecibels array\n // Check if the entry already exists in audioDecibels\n const existingEntry = audioDecibels.find((entry) => entry.name === name);\n\n if (existingEntry) {\n // Entry exists, update the averageLoudness\n existingEntry.averageLoudness = averageLoudness;\n } else {\n // Entry doesn't exist, add a new entry to audioDecibels\n audioDecibels.push({ name, averageLoudness });\n }\n\n // Update the audioDecibels array\n updateAudioDecibels(audioDecibels);\n}\n","export interface LaunchBackgroundOptions {\n updateIsBackgroundModalVisible: (isVisible: boolean) => void\n isBackgroundModalVisible: boolean\n}\n\nexport type LaunchBackgroundType = (options: LaunchBackgroundOptions) => void\n\n/**\n * Toggles the visibility of the background modal.\n */\nexport const launchBackground: LaunchBackgroundType = ({\n updateIsBackgroundModalVisible,\n isBackgroundModalVisible,\n}: LaunchBackgroundOptions): void => {\n updateIsBackgroundModalVisible(!isBackgroundModalVisible)\n}\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\n\n\nexport interface HandleStartBreakoutOptions {\n socket: Socket;\n localSocket?: Socket;\n breakoutRooms: Array<Array<{ name: string; breakRoom?: number | null }>>;\n newParticipantAction: string;\n roomName: string;\n breakOutRoomStarted: boolean;\n breakOutRoomEnded: boolean;\n showAlert?: ShowAlert;\n updateBreakOutRoomStarted: (started: boolean) => void;\n updateBreakOutRoomEnded: (ended: boolean) => void;\n onBreakoutRoomsClose: () => void;\n meetingDisplayType: string;\n updateMeetingDisplayType: (displayType: string) => void;\n}\n\nexport type HandleStartBreakoutType = (options: HandleStartBreakoutOptions) => void;\n\n/**\n * Handles the start of breakout rooms.\n * @function\n * @param {HandleStartBreakoutOptions} options - The options for starting breakout rooms.\n * @param {Socket} options.socket - The main socket instance.\n * @param {Socket} [options.localSocket] - The local socket instance (optional).\n * @param {Array<Array<{name: string, breakRoom: number | null}>>} options.breakoutRooms - The array of breakout rooms with participant data.\n * @param {string} options.newParticipantAction - The action to take for new participants.\n * @param {string} options.roomName - The name of the main room.\n * @param {boolean} options.breakOutRoomStarted - Whether breakout rooms have already started.\n * @param {boolean} options.breakOutRoomEnded - Whether breakout rooms have ended.\n * @param {ShowAlert} [options.showAlert] - Function to show alerts.\n * @param {Function} options.updateBreakOutRoomStarted - Function to update breakout room started state.\n * @param {Function} options.updateBreakOutRoomEnded - Function to update breakout room ended state.\n * @param {Function} options.onBreakoutRoomsClose - Function to close breakout rooms modal.\n * @param {string} options.meetingDisplayType - Current meeting display type.\n * @param {Function} options.updateMeetingDisplayType - Function to update meeting display type.\n * @returns {void}\n */\nexport const handleStartBreakout = ({\n socket,\n localSocket,\n breakoutRooms,\n newParticipantAction,\n roomName,\n breakOutRoomStarted,\n breakOutRoomEnded,\n showAlert,\n updateBreakOutRoomStarted,\n updateBreakOutRoomEnded,\n onBreakoutRoomsClose,\n meetingDisplayType,\n updateMeetingDisplayType,\n}: HandleStartBreakoutOptions): void => {\n const emitName = breakOutRoomStarted && !breakOutRoomEnded ? 'updateBreakout' : 'startBreakout';\n const filteredBreakoutRooms = breakoutRooms.map((room) =>\n room.map(({ name, breakRoom }) => ({ name, breakRoom }))\n );\n\n socket.emit(\n emitName,\n { breakoutRooms: filteredBreakoutRooms, newParticipantAction, roomName },\n (response: { success: boolean; reason: string }) => {\n if (response.success) {\n showAlert?.({ message: 'Breakout rooms active', type: 'success' });\n updateBreakOutRoomStarted(true);\n updateBreakOutRoomEnded(false);\n onBreakoutRoomsClose();\n if (meetingDisplayType !== 'all') {\n updateMeetingDisplayType('all');\n }\n } else {\n showAlert?.({ message: response.reason, type: 'danger' });\n }\n }\n );\n\n if (localSocket && localSocket.id) {\n try {\n localSocket.emit(\n emitName,\n { breakoutRooms: filteredBreakoutRooms, newParticipantAction, roomName },\n (response: { success: boolean; reason: string }) => {\n if (response.success) {\n // do nothing\n }\n }\n );\n } catch {\n console.log('Error starting local breakout rooms:');\n }\n }\n};\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface HandleStopBreakoutOptions {\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n showAlert?: ShowAlert;\n updateBreakOutRoomStarted: (started: boolean) => void;\n updateBreakOutRoomEnded: (ended: boolean) => void;\n onBreakoutRoomsClose: () => void;\n meetingDisplayType: string;\n prevMeetingDisplayType: string;\n updateMeetingDisplayType: (displayType: string) => void;\n}\n\nexport type HandleStopBreakoutType = (options: HandleStopBreakoutOptions) => void;\n\n/**\n * Handles stopping breakout rooms.\n * @function\n * @param {HandleStopBreakoutOptions} options - The options for stopping breakout rooms.\n * @param {Socket} options.socket - The main socket instance.\n * @param {Socket} [options.localSocket] - The local socket instance (optional).\n * @param {string} options.roomName - The name of the main room.\n * @param {ShowAlert} [options.showAlert] - Function to show alerts.\n * @param {Function} options.updateBreakOutRoomStarted - Function to update breakout room started state.\n * @param {Function} options.updateBreakOutRoomEnded - Function to update breakout room ended state.\n * @param {Function} options.onBreakoutRoomsClose - Function to close breakout rooms modal.\n * @param {string} options.meetingDisplayType - Current meeting display type.\n * @param {string} options.prevMeetingDisplayType - Previous meeting display type.\n * @param {Function} options.updateMeetingDisplayType - Function to update meeting display type.\n * @returns {void}\n */\nexport const handleStopBreakout = ({\n socket,\n localSocket,\n roomName,\n showAlert,\n updateBreakOutRoomStarted,\n updateBreakOutRoomEnded,\n onBreakoutRoomsClose,\n meetingDisplayType,\n prevMeetingDisplayType,\n updateMeetingDisplayType,\n}: HandleStopBreakoutOptions): void => {\n socket.emit('stopBreakout', { roomName }, (response: { success: boolean; reason: string }) => {\n if (response.success) {\n showAlert?.({ message: 'Breakout rooms stopped', type: 'success' });\n updateBreakOutRoomStarted(false);\n updateBreakOutRoomEnded(true);\n onBreakoutRoomsClose();\n if (meetingDisplayType !== prevMeetingDisplayType) {\n updateMeetingDisplayType(prevMeetingDisplayType);\n }\n } else {\n showAlert?.({ message: response.reason, type: 'danger' });\n }\n });\n\n if (localSocket && localSocket.id) {\n try {\n localSocket.emit('stopBreakout', { roomName }, (response: { success: boolean; reason: string }) => {\n if (response.success) {\n // do nothing\n }\n });\n } catch {\n console.log('Error stopping local breakout rooms:');\n }\n }\n};\n","export interface LaunchBreakoutRoomsOptions {\n updateIsBreakoutRoomsModalVisible: (isVisible: boolean) => void\n isBreakoutRoomsModalVisible: boolean\n}\n\nexport type LaunchBreakoutRoomsType = (options: LaunchBreakoutRoomsOptions) => void\n\n/**\n * Launches the breakout rooms by toggling the visibility of the breakout rooms modal.\n *\n * @param {LaunchBreakoutRoomsOptions} options - The options object.\n * @param {Function} options.updateIsBreakoutRoomsModalVisible - Function to update the visibility state of the breakout rooms modal.\n * @param {boolean} options.isBreakoutRoomsModalVisible - Current visibility state of the breakout rooms modal.\n *\n * @example\n * ```typescript\n * const options: LaunchBreakoutRoomsOptions = {\n * updateIsBreakoutRoomsModalVisible: setModalVisible,\n * isBreakoutRoomsModalVisible: false,\n * }\n *\n * launchBreakoutRooms(options)\n * // Toggles the breakout rooms modal to visible.\n * ```\n */\nexport const launchBreakoutRooms: LaunchBreakoutRoomsType = ({\n updateIsBreakoutRoomsModalVisible,\n isBreakoutRoomsModalVisible,\n}) => {\n updateIsBreakoutRoomsModalVisible(!isBreakoutRoomsModalVisible)\n}\n","export interface LaunchCoHostOptions {\n updateIsCoHostModalVisible: (isVisible: boolean) => void\n isCoHostModalVisible: boolean\n}\n\nexport type LaunchCoHostType = (options: LaunchCoHostOptions) => void\n\n/**\n * Toggles the visibility of the co-host modal.\n *\n * @param {LaunchCoHostOptions} options - The options object.\n * @param {Function} options.updateIsCoHostModalVisible - Function to update the visibility state of the co-host modal.\n * @param {boolean} options.isCoHostModalVisible - Current visibility state of the co-host modal.\n *\n * @example\n * ```typescript\n * const options: LaunchCoHostOptions = {\n * updateIsCoHostModalVisible: setModalVisible,\n * isCoHostModalVisible: false,\n * }\n *\n * launchCoHost(options)\n * // Toggles the co-host modal to visible.\n * ```\n */\nexport const launchCoHost: LaunchCoHostType = ({ updateIsCoHostModalVisible, isCoHostModalVisible }) => {\n updateIsCoHostModalVisible(!isCoHostModalVisible)\n}\n","import type { Socket } from 'socket.io-client';\nimport type { ShowAlert, CoHostResponsibility } from '../../types/types';\n\n\nexport interface ModifyCoHostSettingsOptions {\n roomName: string;\n showAlert?: ShowAlert;\n selectedParticipant: string;\n coHost: string;\n coHostResponsibility: CoHostResponsibility[];\n updateIsCoHostModalVisible: (isVisible: boolean) => void;\n updateCoHostResponsibility: (coHostResponsibility: CoHostResponsibility[]) => void;\n updateCoHost: (coHost: string) => void;\n socket: Socket;\n}\n\nexport type ModifyCoHostSettingsType = (options: ModifyCoHostSettingsOptions) => Promise<void>;\n\n/**\n * Modifies the co-host settings for a given room.\n * @function\n * @param {ModifyCoHostSettingsOptions} options - The options for modifying co-host settings.\n * @param {string} options.roomName - The name of the room.\n * @param {ShowAlert} [options.showAlert] - Function to show an alert message.\n * @param {string} options.selectedParticipant - The participant selected to be co-host.\n * @param {string} options.coHost - The current co-host.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - The responsibilities assigned to the co-host.\n * @param {Function} options.updateIsCoHostModalVisible - Function to update the visibility of the co-host modal.\n * @param {Function} options.updateCoHostResponsibility - Function to update the co-host responsibility.\n * @param {Function} options.updateCoHost - Function to update the co-host.\n * @param {Socket} options.socket - The socket instance for emitting events.\n * @returns {Promise<void>} A promise that resolves when the co-host settings have been modified.\n *\n * @example\n * ```typescript\n * const options: ModifyCoHostSettingsOptions = {\n * roomName: \"mainRoom\",\n * showAlert: (alert) => console.log(alert.message),\n * selectedParticipant: \"User123\",\n * coHost: \"No coHost\",\n * coHostResponsibility: [{ name: \"media\", value: true, dedicated: false }],\n * updateIsCoHostModalVisible: setModalVisible,\n * updateCoHostResponsibility: setCoHostResponsibility,\n * updateCoHost: setCoHost,\n * socket: socketInstance,\n * };\n *\n * modifyCoHostSettings(options);\n * // Sets User123 as the new co-host with specific responsibilities and emits the update event.\n * ```\n */\nexport const modifyCoHostSettings = async ({\n roomName,\n showAlert,\n selectedParticipant,\n coHost,\n coHostResponsibility,\n updateIsCoHostModalVisible,\n updateCoHostResponsibility,\n updateCoHost,\n socket,\n}: ModifyCoHostSettingsOptions): Promise<void> => {\n // Check if the chat room is in demo mode\n if (roomName.toLowerCase().startsWith('d')) {\n showAlert?.({\n message: 'You cannot add co-host in demo mode.',\n type: 'danger',\n duration: 3000,\n });\n\n return;\n }\n\n let newCoHost = coHost;\n\n if (coHost !== 'No coHost' || (selectedParticipant && selectedParticipant !== 'Select a participant')) {\n if (selectedParticipant && selectedParticipant !== 'Select a participant') {\n newCoHost = selectedParticipant;\n updateCoHost(newCoHost);\n }\n\n updateCoHostResponsibility(coHostResponsibility);\n\n // Emit a socket event to update co-host information\n socket.emit('updateCoHost', {\n roomName,\n coHost: newCoHost,\n coHostResponsibility,\n });\n }\n\n // Close the co-host modal\n updateIsCoHostModalVisible(false);\n};\n","export interface LaunchDisplaySettingsOptions {\n updateIsDisplaySettingsModalVisible: (isVisible: boolean) => void\n isDisplaySettingsModalVisible: boolean\n}\n\nexport type LaunchDisplaySettingsType = (options: LaunchDisplaySettingsOptions) => void\n\n/**\n * Toggles the visibility of the display settings modal.\n *\n * @param {LaunchDisplaySettingsOptions} options - The options object.\n * @param {Function} options.updateIsDisplaySettingsModalVisible - Function to update the visibility state of the display settings modal.\n * @param {boolean} options.isDisplaySettingsModalVisible - Current visibility state of the display settings modal.\n *\n * @example\n * ```typescript\n * const options: LaunchDisplaySettingsOptions = {\n * updateIsDisplaySettingsModalVisible: setModalVisibilityFunction,\n * isDisplaySettingsModalVisible: false,\n * }\n *\n * launchDisplaySettings(options)\n * // This will open the display settings modal if it's currently closed, or close it if it's open.\n * ```\n */\nexport const launchDisplaySettings: LaunchDisplaySettingsType = ({\n updateIsDisplaySettingsModalVisible,\n isDisplaySettingsModalVisible,\n}) => {\n updateIsDisplaySettingsModalVisible(!isDisplaySettingsModalVisible)\n}\n","import type { ShowAlert, OnScreenChangesParameters, OnScreenChangesType } from '../../types/types'\n\n\nexport interface ModifyDisplaySettingsParameters extends OnScreenChangesParameters {\n showAlert?: ShowAlert\n meetingDisplayType: string\n autoWave: boolean\n forceFullDisplay: boolean\n meetingVideoOptimized: boolean\n islevel: string\n recordStarted: boolean\n recordResumed: boolean\n recordStopped: boolean\n recordPaused: boolean\n recordingDisplayType: 'video' | 'media' | 'all'\n recordingVideoOptimized: boolean\n prevForceFullDisplay: boolean\n prevMeetingDisplayType: string\n updateMeetingDisplayType: (displayType: string) => void\n updateAutoWave: (autoWave: boolean) => void\n updateForceFullDisplay: (forceFullDisplay: boolean) => void\n updateMeetingVideoOptimized: (optimized: boolean) => void\n updatePrevForceFullDisplay: (forceFullDisplay: boolean) => void\n updatePrevMeetingDisplayType: (displayType: string) => void\n updateIsDisplaySettingsModalVisible: (isVisible: boolean) => void\n updateFirstAll: (firstAll: boolean) => void\n updateUpdateMainWindow: (update: boolean) => void\n breakOutRoomStarted: boolean\n breakOutRoomEnded: boolean\n\n // mediasfu functions\n onScreenChanges: OnScreenChangesType\n\n [key: string]: any\n}\n\nexport interface ModifyDisplaySettingsOptions {\n parameters: ModifyDisplaySettingsParameters\n}\n\n// Export the type definition for the function\nexport type ModifyDisplaySettingsType = (\n options: ModifyDisplaySettingsOptions\n) => Promise<void>\n\n/**\n * Modifies the display settings based on the provided parameters.\n *\n * @param {ModifyDisplaySettingsOptions} options - The options containing the parameters to modify the display settings.\n * @param {Object} options.parameters - The parameters for modifying the display settings.\n * @param {Function} options.parameters.showAlert - Function to show alert messages.\n * @param {string} options.parameters.meetingDisplayType - The current meeting display type.\n * @param {boolean} options.parameters.autoWave - Flag indicating if auto wave is enabled.\n * @param {boolean} options.parameters.forceFullDisplay - Flag indicating if full display is forced.\n * @param {boolean} options.parameters.meetingVideoOptimized - Flag indicating if the meeting video is optimized.\n * @param {string} options.parameters.islevel - The current level of the meeting.\n * @param {boolean} options.parameters.recordStarted - Flag indicating if recording has started.\n * @param {boolean} options.parameters.recordResumed - Flag indicating if recording has resumed.\n * @param {boolean} options.parameters.recordStopped - Flag indicating if recording has stopped.\n * @param {boolean} options.parameters.recordPaused - Flag indicating if recording is paused.\n * @param {string} options.parameters.recordingDisplayType - The current recording display type.\n * @param {boolean} options.parameters.recordingVideoOptimized - Flag indicating if the recording video is optimized.\n * @param {string} options.parameters.prevForceFullDisplay - The previous force full display value.\n * @param {string} options.parameters.prevMeetingDisplayType - The previous meeting display type.\n * @param {Function} options.parameters.updateMeetingDisplayType - Function to update the meeting display type.\n * @param {Function} options.parameters.updateAutoWave - Function to update the auto wave setting.\n * @param {Function} options.parameters.updateForceFullDisplay - Function to update the force full display setting.\n * @param {Function} options.parameters.updateMeetingVideoOptimized - Function to update the meeting video optimization setting.\n * @param {Function} options.parameters.updatePrevForceFullDisplay - Function to update the previous force full display setting.\n * @param {Function} options.parameters.updatePrevMeetingDisplayType - Function to update the previous meeting display type.\n * @param {Function} options.parameters.updateIsDisplaySettingsModalVisible - Function to update the visibility of the display settings modal.\n * @param {Function} options.parameters.updateFirstAll - Function to update the first all setting.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {boolean} options.parameters.breakOutRoomStarted - Flag indicating if a breakout room has started.\n * @param {boolean} options.parameters.breakOutRoomEnded - Flag indicating if a breakout room has ended.\n * @param {Function} options.parameters.onScreenChanges - Function to handle screen changes.\n *\n * @example\n * ```typescript\n * const options: ModifyDisplaySettingsOptions = {\n * parameters: {\n * showAlert: showAlertFunction,\n * meetingDisplayType: \"video\",\n * autoWave: true,\n * forceFullDisplay: false,\n * meetingVideoOptimized: true,\n * islevel: \"2\",\n * recordStarted: true,\n * recordResumed: false,\n * recordStopped: false,\n * recordPaused: false,\n * recordingDisplayType: \"video\",\n * recordingVideoOptimized: true,\n * prevForceFullDisplay: false,\n * prevMeetingDisplayType: \"media\",\n * updateMeetingDisplayType: updateDisplayTypeFunction,\n * updateAutoWave: updateAutoWaveFunction,\n * updateForceFullDisplay: updateForceFullDisplayFunction,\n * updateMeetingVideoOptimized: updateVideoOptimizedFunction,\n * updatePrevForceFullDisplay: updatePrevForceFullFunction,\n * updatePrevMeetingDisplayType: updatePrevDisplayTypeFunction,\n * updateIsDisplaySettingsModalVisible: setModalVisibilityFunction,\n * updateFirstAll: setFirstAllFunction,\n * updateUpdateMainWindow: setMainWindowUpdateFunction,\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: true,\n * onScreenChanges: onScreenChangesFunction\n * }\n * };\n *\n * await modifyDisplaySettings(options);\n * ```\n */\n\nexport const modifyDisplaySettings = async ({\n parameters\n}: ModifyDisplaySettingsOptions): Promise<void> => {\n // Destructure the parameters\n let {\n showAlert,\n meetingDisplayType,\n autoWave,\n forceFullDisplay,\n meetingVideoOptimized,\n islevel,\n recordStarted,\n recordResumed,\n recordStopped,\n recordPaused,\n recordingDisplayType,\n recordingVideoOptimized,\n prevForceFullDisplay,\n prevMeetingDisplayType,\n updateMeetingDisplayType,\n updateAutoWave,\n updateForceFullDisplay,\n updateMeetingVideoOptimized,\n updatePrevForceFullDisplay,\n updatePrevMeetingDisplayType,\n updateIsDisplaySettingsModalVisible,\n updateFirstAll,\n updateUpdateMainWindow,\n breakOutRoomStarted,\n breakOutRoomEnded,\n onScreenChanges\n } = parameters\n\n // Update previous states\n updateAutoWave(autoWave)\n updateForceFullDisplay(forceFullDisplay)\n\n if (\n islevel === '2' &&\n (recordStarted || recordResumed) &&\n !recordStopped &&\n !recordPaused\n ) {\n if (\n recordingDisplayType === 'video' &&\n meetingDisplayType === 'video' &&\n meetingVideoOptimized &&\n !recordingVideoOptimized\n ) {\n showAlert?.({\n message:\n 'Meeting display type can be either video, media, or all when recording display type is non-optimized video.',\n type: 'danger',\n duration: 3000\n })\n // Reset to previous values or handle as needed\n meetingDisplayType = recordingDisplayType\n updateMeetingDisplayType(meetingDisplayType)\n meetingVideoOptimized = recordingVideoOptimized\n updateMeetingVideoOptimized(meetingVideoOptimized)\n return\n } else if (\n recordingDisplayType === 'media' &&\n meetingDisplayType === 'video'\n ) {\n showAlert?.({\n message:\n 'Meeting display type can be either media or all when recording display type is media.',\n type: 'danger',\n duration: 3000\n })\n\n // Reset to previous values or handle as needed\n meetingDisplayType = recordingDisplayType\n updateMeetingDisplayType(meetingDisplayType)\n return\n } else if (\n recordingDisplayType === 'all' &&\n (meetingDisplayType === 'video' || meetingDisplayType === 'media')\n ) {\n showAlert?.({\n message:\n 'Meeting display type can be only all when recording display type is all.',\n type: 'danger',\n duration: 3000\n })\n // Reset to previous values or handle as needed\n meetingDisplayType = recordingDisplayType\n updateMeetingDisplayType(meetingDisplayType)\n return\n }\n }\n\n updateMeetingDisplayType(meetingDisplayType)\n updateMeetingVideoOptimized(meetingVideoOptimized)\n\n // Close the modal or perform additional actions\n updateIsDisplaySettingsModalVisible(false)\n\n if (\n prevMeetingDisplayType !== meetingDisplayType ||\n prevForceFullDisplay !== forceFullDisplay\n ) {\n if (\n breakOutRoomStarted &&\n !breakOutRoomEnded &&\n meetingDisplayType !== 'all'\n ) {\n showAlert?.({\n message:\n 'Breakout room is active. Display type can only be all.',\n type: 'danger'\n })\n meetingDisplayType = prevMeetingDisplayType\n updateMeetingDisplayType(prevMeetingDisplayType)\n return\n }\n\n updateFirstAll(meetingDisplayType !== 'all' ? true : false)\n updateUpdateMainWindow(true)\n await onScreenChanges({\n changed: true,\n parameters: { ...parameters, meetingDisplayType, forceFullDisplay }\n })\n updatePrevForceFullDisplay(forceFullDisplay)\n updatePrevMeetingDisplayType(meetingDisplayType)\n }\n}\n","import type { Socket } from 'socket.io-client'\n\nexport interface ConfirmExitOptions {\n socket: Socket\n localSocket?: Socket\n member: string\n roomName: string\n ban?: boolean\n}\n\n// Export the type definition for the function\nexport type ConfirmExitType = (options: ConfirmExitOptions) => Promise<void>\n\n/**\n * Confirms the exit of a member from a room and optionally bans them.\n *\n * @param {ConfirmExitOptions} options - The options for confirming the exit.\n * @param {Socket} options.socket - The socket instance to emit the event.\n * @param {Socket} [options.localSocket] - The local socket instance to emit the event.\n * @param {string} options.member - The member who is exiting.\n * @param {string} options.roomName - The name of the room the member is exiting from.\n * @param {boolean} [options.ban=false] - Whether to ban the member from the room.\n * @returns {Promise<void>} A promise that resolves when the exit is confirmed.\n *\n * @example\n * ```typescript\n * const options = {\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * member: \"JohnDoe\",\n * roomName: \"Room123\",\n * ban: true,\n * };\n * await confirmExit(options);\n * ```\n */\n\nexport const confirmExit = async ({\n socket,\n localSocket,\n member,\n roomName,\n ban = false\n}: ConfirmExitOptions): Promise<void> => {\n // Emit a socket event to disconnect the user from the room\n socket.emit('disconnectUser', {\n member: member,\n roomName: roomName,\n ban: ban\n })\n\n if (localSocket && localSocket.id) {\n // Emit a local socket event to disconnect the user from the room\n localSocket.emit('disconnectUser', {\n member: member,\n roomName: roomName,\n ban: ban\n })\n }\n}\n","export interface LaunchConfirmExitOptions {\n updateIsConfirmExitModalVisible: (isVisible: boolean) => void\n isConfirmExitModalVisible: boolean\n}\n\nexport type LaunchConfirmExitType = (options: LaunchConfirmExitOptions) => void\n\n/**\n * Toggles the visibility of the confirmation exit modal.\n *\n * @param {LaunchConfirmExitOptions} options - The options for launching the confirmation exit modal.\n * @param {Function} options.updateIsConfirmExitModalVisible - Function to update the visibility state of the confirmation exit modal.\n * @param {boolean} options.isConfirmExitModalVisible - Current visibility state of the confirmation exit modal.\n *\n * @example\n * ```typescript\n * const options = {\n * updateIsConfirmExitModalVisible: setIsConfirmExitModalVisible,\n * isConfirmExitModalVisible: false,\n * }\n * launchConfirmExit(options)\n * ```\n */\nexport const launchConfirmExit: LaunchConfirmExitType = ({\n updateIsConfirmExitModalVisible,\n isConfirmExitModalVisible,\n}) => {\n updateIsConfirmExitModalVisible(!isConfirmExitModalVisible)\n}\n","export interface LaunchMediaSettingsOptions {\n updateIsMediaSettingsModalVisible: (isVisible: boolean) => void\n isMediaSettingsModalVisible: boolean\n mediaDevices: MediaDevices\n audioInputs: MediaDeviceInfo[]\n videoInputs: MediaDeviceInfo[]\n updateAudioInputs: (inputs: MediaDeviceInfo[]) => void\n updateVideoInputs: (inputs: MediaDeviceInfo[]) => void\n}\n\nexport type LaunchMediaSettingsType = (options: LaunchMediaSettingsOptions) => Promise<void>\n\n/**\n * Launches the media settings modal and updates the available audio and video input devices.\n *\n * @param {LaunchMediaSettingsOptions} options - The options for launching media settings.\n * @param {Function} options.updateIsMediaSettingsModalVisible - Function to update the visibility state of the media settings modal.\n * @param {boolean} options.isMediaSettingsModalVisible - Current visibility state of the media settings modal.\n * @param {MediaDevices} options.mediaDevices - MediaDevices interface to enumerate media devices.\n * @param {MediaDeviceInfo[]} options.audioInputs - Array to store available audio input devices.\n * @param {MediaDeviceInfo[]} options.videoInputs - Array to store available video input devices.\n * @param {Function} options.updateAudioInputs - Function to update the available audio input devices.\n * @param {Function} options.updateVideoInputs - Function to update the available video input devices.\n * @returns {Promise<void>} A promise that resolves when the media settings have been updated.\n *\n * @example\n * ```typescript\n * launchMediaSettings({\n * updateIsMediaSettingsModalVisible: (isVisible) => console.log('Modal visible:', isVisible),\n * isMediaSettingsModalVisible: false,\n * mediaDevices: navigator.mediaDevices,\n * audioInputs: [],\n * videoInputs: [],\n * updateAudioInputs: (inputs) => console.log('Audio Inputs:', inputs),\n * updateVideoInputs: (inputs) => console.log('Video Inputs:', inputs),\n * })\n * ```\n */\nexport const launchMediaSettings: LaunchMediaSettingsType = async ({\n updateIsMediaSettingsModalVisible,\n isMediaSettingsModalVisible,\n mediaDevices,\n audioInputs,\n videoInputs,\n updateAudioInputs,\n updateVideoInputs,\n}) => {\n if (!isMediaSettingsModalVisible) {\n try {\n const devices = await mediaDevices.enumerateDevices()\n videoInputs = devices.filter((device) => device.kind === 'videoinput')\n audioInputs = devices.filter((device) => device.kind === 'audioinput')\n updateVideoInputs(videoInputs)\n updateAudioInputs(audioInputs)\n } catch (error) {\n console.log('Error getting media devices', error)\n }\n }\n\n updateIsMediaSettingsModalVisible(!isMediaSettingsModalVisible)\n}\n","export interface LaunchMenuModalOptions {\n updateIsMenuModalVisible: (isVisible: boolean) => void\n isMenuModalVisible: boolean\n}\n\nexport type LaunchMenuModalType = (options: LaunchMenuModalOptions) => void\n\n/**\n * Toggles the visibility of the menu modal.\n *\n * @param {LaunchMenuModalOptions} options - The options for launching the menu modal.\n * @param {Function} options.updateIsMenuModalVisible - Function to update the visibility state of the menu modal.\n * @param {boolean} options.isMenuModalVisible - Current visibility state of the menu modal.\n *\n * @example\n * ```typescript\n * launchMenuModal({\n * updateIsMenuModalVisible: (isVisible) => console.log(\"Menu modal visibility:\", isVisible),\n * isMenuModalVisible: false,\n * });\n * ```\n */\nexport const launchMenuModal: LaunchMenuModalType = ({\n updateIsMenuModalVisible,\n isMenuModalVisible,\n}) => {\n updateIsMenuModalVisible(!isMenuModalVisible)\n}\n","export interface LaunchMessagesOptions {\n updateIsMessagesModalVisible: (visible: boolean) => void\n isMessagesModalVisible: boolean\n}\n\nexport type LaunchMessagesType = (options: LaunchMessagesOptions) => void\n\n/**\n * Toggles the visibility state of the messages modal.\n *\n * @param {LaunchMessagesOptions} options - The options object.\n * @param {Function} options.updateIsMessagesModalVisible - Function to update the visibility state of the messages modal.\n * @param {boolean} options.isMessagesModalVisible - Current visibility state of the messages modal.\n *\n * @example\n * ```typescript\n * const options: LaunchMessagesOptions = {\n * updateIsMessagesModalVisible: setModalVisibilityFunction,\n * isMessagesModalVisible: false,\n * }\n *\n * launchMessages(options)\n * ```\n */\nexport const launchMessages: LaunchMessagesType = ({ updateIsMessagesModalVisible, isMessagesModalVisible }) => {\n updateIsMessagesModalVisible(!isMessagesModalVisible)\n}\n","import { Socket } from \"socket.io-client\";\nimport type {\n CoHostResponsibility,\n EventType,\n Message,\n ShowAlert,\n} from \"../../types/types\";\n\nexport interface SendMessageOptions {\n message: string;\n receivers: string[];\n group: boolean;\n messagesLength: number;\n member: string;\n sender: string;\n islevel: string;\n eventType?: EventType;\n showAlert?: ShowAlert;\n coHostResponsibility: CoHostResponsibility[];\n coHost: string;\n roomName: string;\n socket: Socket;\n chatSetting: string;\n}\n\n// Export the type\nexport type SendMessageType = (options: SendMessageOptions) => Promise<void>;\n\n/**\n * Sends a message to the server.\n *\n * @param {SendMessageOptions} options - The options for sending a message.\n * @param {string} options.message - The message content to be sent.\n * @param {string[]} options.receivers - The list of receivers for the message.\n * @param {boolean} options.group - Indicates if the message is for a group.\n * @param {number} options.messagesLength - The current number of messages.\n * @param {string} options.member - The member sending the message.\n * @param {string} options.sender - The sender of the message.\n * @param {string} options.islevel - The level of the sender (e.g., \"2\" for admin).\n * @param {EventType} [options.eventType] - The type of event (e.g., \"broadcast\", \"chat\", \"conference\").\n * @param {ShowAlert} [options.showAlert] - Function to show alerts to the user.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - Array of co-host responsibilities.\n * @param {string} options.coHost - The co-host member name.\n * @param {string} options.roomName - The name of the room.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {string} options.chatSetting - The chat setting for the event room.\n * @returns {Promise<void>} A promise that resolves when the message is sent.\n *\n * @throws Will show an alert if the message count exceeds the limit, if the message is invalid, or if the user is not allowed to send a message.\n *\n * @example\n * ```typescript\n * await sendMessage({\n * message: \"Hello, World!\",\n * receivers: [\"user1\", \"user2\"],\n * group: true,\n * messagesLength: 50,\n * member: \"user3\",\n * sender: \"user3\",\n * islevel: \"2\",\n * eventType: \"chat\",\n * showAlert: ({ message, type }) => console.log(message, type),\n * coHostResponsibility: [{ name: \"chat\", value: true }],\n * coHost: \"coHostUser\",\n * roomName: \"mainRoom\",\n * socket: socketInstance,\n * chatSetting: \"allow\",\n * });\n * ```\n */\n\nexport const sendMessage = async ({\n message,\n receivers,\n group,\n messagesLength,\n member,\n sender,\n islevel,\n eventType,\n showAlert,\n coHostResponsibility,\n coHost,\n roomName,\n socket,\n chatSetting,\n}: SendMessageOptions): Promise<void> => {\n let chatValue = false;\n\n // Check if messages count exceeds the limit\n if (eventType === \"broadcast\") {\n if (messagesLength >= 100) {\n showAlert?.({\n message: \"You have reached the maximum number of messages\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n } else if (eventType === \"chat\") {\n if (messagesLength >= 500) {\n showAlert?.({\n message: \"You have reached the maximum number of messages\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n } else {\n if (messagesLength >= 100000) {\n showAlert?.({\n message: \"You have reached the maximum number of messages\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n\n // Check if message is valid\n if (!message || message === \"\") {\n showAlert?.({\n message: \"Message is not valid.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // Check if receivers is valid\n if (receivers.length < 1 && group === false) {\n showAlert?.({\n message: \"Please select a message to reply to\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // Create message object\n const messageObject: Message = {\n sender: sender ? sender : member,\n receivers: receivers,\n message: message,\n timestamp: new Date().toLocaleTimeString(),\n group: group !== undefined && group !== null ? group : false,\n };\n\n try {\n // Check co-host responsibility for chat\n chatValue = coHostResponsibility.find((item) => item.name === \"chat\")?.value ?? false;\n } catch (error) {\n console.error(error);\n }\n\n if (islevel === \"2\" || (coHost === member && chatValue === true)) {\n // Allow sending message\n } else {\n // Check if user is allowed to send a message in the event room\n if (!chatSetting) {\n showAlert?.({\n message: \"You are not allowed to send a message in this event room\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n\n // Send the message to the server\n socket.emit(\"sendMessage\", {\n messageObject: messageObject,\n roomName: roomName,\n });\n};\n","export interface LaunchParticipantsOptions {\n updateIsParticipantsModalVisible: (isVisible: boolean) => void\n isParticipantsModalVisible: boolean\n}\n\nexport type LaunchParticipantsType = (options: LaunchParticipantsOptions) => void\n\n/**\n * Toggles the visibility of the participants modal.\n *\n * @param {LaunchParticipantsOptions} options - The options for toggling the participants modal.\n * @param {Function} options.updateIsParticipantsModalVisible - Function to update the visibility state of the participants modal.\n * @param {boolean} options.isParticipantsModalVisible - Current visibility state of the participants modal.\n *\n * @example\n * ```typescript\n * launchParticipants({\n * updateIsParticipantsModalVisible: (isVisible) => setParticipantsModalVisible(isVisible),\n * isParticipantsModalVisible: true,\n * })\n * ```\n */\nexport const launchParticipants: LaunchParticipantsType = ({ updateIsParticipantsModalVisible, isParticipantsModalVisible }) => {\n updateIsParticipantsModalVisible(!isParticipantsModalVisible)\n}\n","import type { Participant, CoHostResponsibility, ShowAlert } from \"../../types/types\";\n\nexport interface MessageParticipantsOptions {\n coHostResponsibility?: CoHostResponsibility[];\n participant: Participant;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n coHost: string;\n updateIsMessagesModalVisible: (isVisible: boolean) => void;\n updateDirectMessageDetails: (participant: Participant | null) => void;\n updateStartDirectMessage: (start: boolean) => void;\n}\n\n/**\n * Sends a direct message to a participant if the current member has the necessary permissions.\n *\n * @param {MessageParticipantsOptions} options - The options for messaging participants.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - Array of responsibilities assigned to the co-host.\n * @param {Participant} options.participant - The participant to whom the message is to be sent.\n * @param {string} options.member - The current member attempting to send the message.\n * @param {string} options.islevel - The level of the current member.\n * @param {ShowAlert} [options.showAlert] - Function to show an alert message.\n * @param {string} options.coHost - The co-host member.\n * @param {Function} options.updateIsMessagesModalVisible - Function to update the visibility of the messages modal.\n * @param {Function} options.updateDirectMessageDetails - Function to update the details of the direct message.\n * @param {Function} options.updateStartDirectMessage - Function to start the direct message.\n *\n * @example\n * ```typescript\n * messageParticipants({\n * coHostResponsibility: [{ name: \"chat\", value: true }],\n * participant: { name: \"John Doe\", islevel: \"1\" },\n * member: \"currentMember\",\n * islevel: \"2\",\n * showAlert: (alert) => console.log(alert.message),\n * coHost: \"coHostMember\",\n * updateIsMessagesModalVisible: (isVisible) => setMessagesModalVisible(isVisible),\n * updateDirectMessageDetails: (participant) => setDirectMessageDetails(participant),\n * updateStartDirectMessage: (start) => setStartDirectMessage(start),\n * });\n * ```\n */\n\nexport const messageParticipants = ({\n coHostResponsibility = [],\n participant,\n member,\n islevel,\n showAlert,\n coHost,\n updateIsMessagesModalVisible,\n updateDirectMessageDetails,\n updateStartDirectMessage,\n}: MessageParticipantsOptions): void => {\n let chatValue = false;\n\n try {\n chatValue = coHostResponsibility.find((item) => item.name === \"chat\")?.value ?? false;\n } catch (error) {\n console.error(error);\n }\n\n if (islevel === \"2\" || (coHost === member && chatValue === true)) {\n if (participant.islevel !== \"2\") {\n updateDirectMessageDetails(participant);\n updateStartDirectMessage(true);\n updateIsMessagesModalVisible(true);\n }\n } else {\n showAlert?.({\n message: \"You are not allowed to send this message\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport type { Participant, CoHostResponsibility, ShowAlert } from \"../../types/types\";\n\nexport interface MuteParticipantsOptions {\n socket: Socket;\n coHostResponsibility?: CoHostResponsibility[];\n participant: Participant;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n coHost: string;\n roomName: string;\n}\n\n/**\n * Mutes a participant in a media session if the current member has the necessary permissions.\n *\n * @param {MuteParticipantsOptions} options - The options for muting participants.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - List of co-host responsibilities.\n * @param {Participant} options.participant - The participant to be muted.\n * @param {string} options.member - The current member attempting to mute.\n * @param {string} options.islevel - The level of the current member.\n * @param {ShowAlert} [options.showAlert] - Optional function to show alerts.\n * @param {string} options.coHost - The co-host information.\n * @param {string} options.roomName - The name of the room.\n *\n * @example\n * ```typescript\n * muteParticipants({\n * socket,\n * coHostResponsibility: [{ name: \"media\", value: true }],\n * participant: { id: \"123\", name: \"John Doe\", muted: false, islevel: \"1\" },\n * member: \"currentMember\",\n * islevel: \"2\",\n * showAlert: (alert) => console.log(alert.message),\n * coHost: \"coHostMember\",\n * roomName: \"room1\",\n * });\n * ```\n */\n\nexport const muteParticipants = async ({\n socket,\n coHostResponsibility = [],\n participant,\n member,\n islevel,\n showAlert,\n coHost,\n roomName,\n}: MuteParticipantsOptions): Promise<void> => {\n let mediaValue = false;\n\n try {\n mediaValue =\n coHostResponsibility.find((item) => item.name === \"media\")?.value ?? false;\n } catch (error) {\n console.error(error);\n }\n\n if (islevel === \"2\" || (coHost === member && mediaValue)) {\n if (!participant.muted && participant.islevel !== \"2\") {\n const participantId = participant.id;\n socket.emit(\"controlMedia\", {\n participantId,\n participantName: participant.name,\n type: \"all\",\n roomName,\n });\n }\n } else {\n showAlert?.({\n message: \"You are not allowed to mute other participants\",\n type: \"danger\",\n duration: 3000,\n });\n }\n};\n","import { Socket } from 'socket.io-client';\nimport type { CoHostResponsibility, Participant, ShowAlert } from '../../types/types';\n\nexport interface RemoveParticipantsOptions {\n coHostResponsibility: CoHostResponsibility[];\n participant: Participant;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n coHost: string;\n participants: Participant[];\n socket: Socket;\n roomName: string;\n updateParticipants: (participants: Participant[]) => void;\n}\n\n/**\n * Removes a participant from the room if the user has the necessary permissions.\n *\n * @param {RemoveParticipantsOptions} options - The options for removing a participant.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - The responsibilities assigned to the co-host.\n * @param {Participant} options.participant - The participant to be removed from the room.\n * @param {string} options.member - The current member attempting to remove the participant.\n * @param {string} options.islevel - The level of the current member.\n * @param {ShowAlert} [options.showAlert] - Optional function to display an alert.\n * @param {string} options.coHost - The co-host identifier.\n * @param {Participant[]} options.participants - List of current participants.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {string} options.roomName - The name of the room.\n * @param {Function} options.updateParticipants - Function to update the participants list.\n *\n * @example\n * ```typescript\n * removeParticipants({\n * coHostResponsibility: [{ name: \"participants\", value: true }],\n * participant: { id: \"123\", name: \"John Doe\", islevel: \"1\" },\n * member: \"currentMember\",\n * islevel: \"2\",\n * showAlert: (alert) => console.log(alert.message),\n * coHost: \"coHostMember\",\n * participants: [{ id: \"123\", name: \"John Doe\", islevel: \"1\" }],\n * socket,\n * roomName: \"room1\",\n * updateParticipants: (updatedParticipants) => console.log(updatedParticipants),\n * });\n * ```\n */\n\nexport const removeParticipants = async ({\n coHostResponsibility,\n participant,\n member,\n islevel,\n showAlert,\n coHost,\n participants,\n socket,\n roomName,\n updateParticipants\n}: RemoveParticipantsOptions): Promise<void> => {\n let participantsValue = false;\n\n try {\n participantsValue =\n coHostResponsibility.find((item) => item.name === 'participants')?.value ?? false;\n } catch {\n participantsValue = false;\n }\n\n if (islevel === '2' || (coHost === member && participantsValue === true)) {\n if (participant.islevel !== '2') {\n const participantId = participant.id;\n\n // Emit a socket event to disconnect the user\n socket.emit('disconnectUserInitiate', {\n member: participant.name,\n roomName,\n id: participantId,\n });\n\n // Remove the participant from the local array\n const index = participants.findIndex((obj) => obj.name === participant.name);\n if (index !== -1) {\n participants.splice(index, 1);\n }\n\n // Update the participants array\n updateParticipants(participants);\n }\n } else {\n showAlert?.({\n message: 'You are not allowed to remove other participants',\n type: 'danger',\n duration: 3000,\n });\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport type { ShowAlert } from \"../../types/types\";\n\ninterface NewPoll {\n question: string;\n type: string;\n options: string[];\n}\n\nexport interface HandleCreatePollOptions {\n poll: NewPoll;\n socket: Socket;\n roomName: string;\n showAlert?: ShowAlert;\n updateIsPollModalVisible: (visible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type HandleCreatePollType = (options: HandleCreatePollOptions) => Promise<void>;\n\n/**\n * Handles the creation of a poll by emitting a \"createPoll\" event with the provided details.\n *\n * @param {HandleCreatePollOptions} options - The options for creating the poll.\n * @param {NewPoll} options.poll - The poll object containing the poll question, type, and options.\n * @param {Socket} options.socket - The socket instance used to communicate with the server.\n * @param {string} options.roomName - The name of the room where the poll is created.\n * @param {Function} [options.showAlert] - Optional function to show alert messages.\n * @param {Function} options.updateIsPollModalVisible - Function to toggle the poll modal visibility.\n *\n * @example\n * ```typescript\n * handleCreatePoll({\n * poll: { question: \"Favorite color?\", type: \"singleChoice\", options: [\"Red\", \"Blue\", \"Green\"] },\n * socket: socketInstance,\n * roomName: \"roomA\",\n * showAlert: (message) => console.log(message),\n * updateIsPollModalVisible: (isVisible) => setIsPollModalVisible(isVisible),\n * });\n * ```\n */\n\nexport const handleCreatePoll = async ({\n poll,\n socket,\n roomName,\n showAlert,\n updateIsPollModalVisible,\n}: HandleCreatePollOptions): Promise<void> => {\n try {\n socket.emit(\n \"createPoll\",\n { roomName, poll },\n (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({ message: \"Poll created successfully\", type: \"success\" });\n updateIsPollModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || \"Failed to create poll\", type: \"danger\" });\n }\n }\n );\n } catch (error) {\n console.error(\"Error creating poll:\", error);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport type { ShowAlert } from \"../../types/types\";\n\nexport interface HandleEndPollOptions {\n pollId: string;\n socket: Socket;\n showAlert?: ShowAlert;\n roomName: string;\n updateIsPollModalVisible: (isVisible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type HandleEndPollType = (options: HandleEndPollOptions) => Promise<void>;\n\n/**\n * Handles the end of a poll by emitting an \"endPoll\" event through the provided socket.\n * Displays an alert based on the success or failure of the operation.\n *\n * @param {HandleEndPollOptions} options - The options for ending the poll.\n * @param {string} options.pollId - The ID of the poll to end.\n * @param {Socket} options.socket - The socket instance to emit the event.\n * @param {Function} [options.showAlert] - Optional function to display alerts.\n * @param {string} options.roomName - The name of the room where the poll is being conducted.\n * @param {Function} options.updateIsPollModalVisible - Function to update the poll modal visibility.\n *\n * @example\n * ```typescript\n * handleEndPoll({\n * pollId: \"poll123\",\n * socket: socketInstance,\n * showAlert: (message) => console.log(message),\n * roomName: \"roomA\",\n * updateIsPollModalVisible: (isVisible) => setIsPollModalVisible(isVisible),\n * });\n * ```\n */\n\nexport const handleEndPoll = async ({\n pollId,\n socket,\n showAlert,\n roomName,\n updateIsPollModalVisible,\n}: HandleEndPollOptions): Promise<void> => {\n try {\n socket.emit(\n \"endPoll\",\n { roomName, poll_id: pollId },\n (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({\n message: \"Poll ended successfully\",\n type: \"success\",\n });\n updateIsPollModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || \"Failed to end poll\", type: \"danger\" });\n }\n }\n );\n } catch (error) {\n console.error(\"Error ending poll:\", error);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport type { ShowAlert } from \"../../types/types\";\n\nexport interface HandleVotePollOptions {\n pollId: string;\n optionIndex: number;\n socket: Socket;\n showAlert?: ShowAlert;\n member: string;\n roomName: string;\n updateIsPollModalVisible: (isVisible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type HandleVotePollType = (options: HandleVotePollOptions) => Promise<void>;\n\n/**\n * Handles the voting process for a poll.\n *\n * @param {HandleVotePollOptions} options - The options for handling the vote.\n * @param {string} options.pollId - The ID of the poll.\n * @param {number} options.optionIndex - The index of the selected option.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {Function} [options.showAlert] - Optional function to show alerts.\n * @param {string} options.member - The member who is voting.\n * @param {string} options.roomName - The name of the room where the poll is conducted.\n * @param {Function} options.updateIsPollModalVisible - Function to update the visibility of the poll modal.\n *\n * @example\n * ```typescript\n * handleVotePoll({\n * pollId: \"poll123\",\n * optionIndex: 1,\n * socket: socketInstance,\n * showAlert: (message) => console.log(message),\n * member: \"user1\",\n * roomName: \"roomA\",\n * updateIsPollModalVisible: (isVisible) => setIsPollModalVisible(isVisible),\n * });\n * ```\n */\n\nexport const handleVotePoll = async ({\n pollId,\n optionIndex,\n socket,\n showAlert,\n member,\n roomName,\n updateIsPollModalVisible,\n}: HandleVotePollOptions): Promise<void> => {\n try {\n socket.emit(\n \"votePoll\",\n {\n roomName,\n poll_id: pollId,\n member,\n choice: optionIndex,\n },\n (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({\n message: \"Vote submitted successfully\",\n type: \"success\",\n });\n updateIsPollModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || \"Failed to submit vote\", type: \"danger\" });\n }\n }\n );\n } catch (error) {\n console.error(\"Error submitting vote:\", error);\n }\n};\n","export interface LaunchPollOptions {\n updateIsPollModalVisible: (isVisible: boolean) => void\n isPollModalVisible: boolean\n}\n\nexport type LaunchPollType = (options: LaunchPollOptions) => void\n\n/**\n * Toggles the visibility of the poll modal.\n *\n * @param {LaunchPollOptions} options - The options for toggling the poll modal visibility.\n * @param {Function} options.updateIsPollModalVisible - Function to update the visibility state of the poll modal.\n * @param {boolean} options.isPollModalVisible - Current visibility state of the poll modal.\n *\n * @example\n * ```typescript\n * launchPoll({\n * updateIsPollModalVisible: (visible) => setIsPollModalVisible(visible),\n * isPollModalVisible: false,\n * })\n * ```\n */\nexport const launchPoll: LaunchPollType = ({ updateIsPollModalVisible, isPollModalVisible }) => {\n updateIsPollModalVisible(!isPollModalVisible)\n}\n","import { Socket } from 'socket.io-client';\nimport type {\n CreateMediaSFURoomOptions,\n CreateRoomOnMediaSFUType,\n RecordingParams,\n MeetingRoomParams,\n ResponseLocalConnectionData,\n PreJoinPageParameters,\n} from '../../types/types';\nimport { checkLimitsAndMakeRequest } from '../utils/checkLimitsAndMakeRequest';\n\n/**\n * Parameters for creating a local room\n */\nexport interface CreateLocalRoomParameters {\n eventID: string;\n duration: number;\n capacity: number;\n userName: string;\n scheduledDate: Date;\n secureCode: string;\n waitRoom?: boolean;\n recordingParams?: RecordingParams;\n eventRoomParams?: MeetingRoomParams;\n videoPreference?: string | null;\n audioPreference?: string | null;\n audioOutputPreference?: string | null;\n mediasfuURL?: string;\n}\n\n/**\n * Options for creating a local room\n */\nexport interface CreateLocalRoomOptions {\n createData: CreateLocalRoomParameters;\n link?: string;\n}\n\n/**\n * Response from creating/joining a local room\n */\nexport interface CreateJoinLocalRoomResponse {\n success: boolean;\n secret: string;\n reason?: string;\n url?: string;\n}\n\n/**\n * Options for handleCreateRoom function\n */\nexport interface HandleCreateRoomOptions {\n payload: CreateMediaSFURoomOptions;\n localLink?: string;\n connectMediaSFU?: boolean;\n apiUserName: string;\n apiKey: string;\n validate?: boolean;\n parameters: PreJoinPageParameters;\n initSocket?: Socket;\n localData?: ResponseLocalConnectionData;\n createMediaSFURoom: CreateRoomOnMediaSFUType;\n}\n\n/**\n * Handles room creation with MediaSFU and/or local server\n * \n * @param {HandleCreateRoomOptions} options - Configuration for creating a room\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleCreateRoom({\n * payload: {\n * action: 'create',\n * duration: 30,\n * capacity: 10,\n * eventType: 'conference',\n * userName: 'John Doe',\n * recordOnly: false,\n * },\n * apiUserName: 'user123',\n * apiKey: 'key123',\n * parameters,\n * createMediaSFURoom,\n * });\n * ```\n */\nexport async function handleCreateRoom({\n payload,\n localLink = '',\n connectMediaSFU = true,\n apiUserName,\n apiKey,\n validate = true,\n parameters,\n initSocket,\n localData,\n createMediaSFURoom,\n}: HandleCreateRoomOptions): Promise<void> {\n const {\n updateIsLoadingModalVisible,\n updateSocket,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n updateValidated,\n showAlert,\n } = parameters;\n\n /**\n * Creates a local room by emitting to the socket\n */\n const createLocalRoom = async ({\n createData,\n link = localLink,\n }: CreateLocalRoomOptions) => {\n initSocket?.emit('createRoom', createData, (response: CreateJoinLocalRoomResponse) => {\n if (response.success) {\n updateSocket(initSocket!);\n updateApiUserName(localData?.apiUserName || '');\n updateApiToken(response.secret);\n updateLink(link);\n updateRoomName(createData.eventID);\n // local needs islevel updated from here\n // we update member as `userName` + \"_2\" and split it in the room\n updateMember(createData.userName + '_2');\n updateIsLoadingModalVisible(false);\n updateValidated(true);\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${response.reason}`,\n type: 'danger',\n duration: 3000,\n });\n }\n });\n };\n\n /**\n * Creates a room on MediaSFU\n */\n const roomCreator = async ({\n payload: createPayload,\n apiUserName: userName,\n apiKey: key,\n validate: shouldValidate = true,\n }: {\n payload: CreateMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n validate?: boolean;\n }) => {\n const response = await createMediaSFURoom({\n payload: createPayload,\n apiUserName: userName,\n apiKey: key,\n localLink: localLink,\n });\n if (response.success && response.data && 'roomName' in response.data) {\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response!.data.link,\n userName: createPayload.userName,\n parameters: parameters,\n validate: shouldValidate,\n });\n return response;\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${\n response.data ? ('error' in response.data ? response.data.error : '') : ''\n }`,\n type: 'danger',\n duration: 3000,\n });\n }\n };\n\n updateIsLoadingModalVisible(true);\n\n if (localLink.length > 0) {\n const secureCode =\n Math.random().toString(30).substring(2, 14) +\n Math.random().toString(30).substring(2, 14);\n let eventID =\n new Date().getTime().toString(30) +\n new Date().getUTCMilliseconds() +\n Math.floor(10 + Math.random() * 99).toString();\n eventID = 'm' + eventID;\n const eventRoomParams = localData?.meetingRoomParams_;\n if (eventRoomParams && payload.eventType) {\n eventRoomParams.type = payload.eventType;\n }\n\n const createData: CreateLocalRoomParameters = {\n eventID: eventID,\n duration: payload.duration,\n capacity: payload.capacity,\n userName: payload.userName,\n scheduledDate: new Date(),\n secureCode: secureCode,\n waitRoom: false,\n recordingParams: localData?.recordingParams_,\n eventRoomParams: eventRoomParams,\n videoPreference: null,\n audioPreference: null,\n audioOutputPreference: null,\n mediasfuURL: '',\n };\n\n if (connectMediaSFU && initSocket && localData && localData.apiUserName && localData.apiKey) {\n // Store references to prevent race conditions\n const localApiUserName = localData.apiUserName;\n const localApiKey = localData.apiKey;\n\n // Build a unique identifier for this create request\n const roomIdentifier = `local_create_${payload.userName}_${payload.duration}_${payload.capacity}`;\n const pendingKey = `prejoin_pending_${roomIdentifier}`;\n const PENDING_TIMEOUT = 30 * 1000; // 30 seconds\n\n // Check pending status to prevent duplicate requests\n try {\n const pendingRequest = localStorage.getItem(pendingKey);\n if (pendingRequest) {\n const pendingData = JSON.parse(pendingRequest);\n const timeSincePending = Date.now() - (pendingData?.timestamp ?? 0);\n if (timeSincePending < PENDING_TIMEOUT) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: 'Room creation already in progress',\n type: 'danger',\n duration: 3000,\n });\n return;\n } else {\n // Stale lock, clear it\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }\n }\n } catch {\n // Ignore localStorage read/JSON errors\n }\n\n // Mark request as pending\n try {\n localStorage.setItem(\n pendingKey,\n JSON.stringify({\n timestamp: Date.now(),\n payload: {\n action: 'create',\n userName: payload.userName,\n duration: payload.duration,\n capacity: payload.capacity,\n },\n })\n );\n\n // Auto-clear the pending flag after timeout to avoid stale locks\n setTimeout(() => {\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }, PENDING_TIMEOUT);\n } catch {\n // Ignore localStorage write errors\n }\n\n payload.recordOnly = true; // allow production to mediasfu only; no consumption\n\n try {\n const response = await roomCreator({\n payload,\n apiUserName: localApiUserName,\n apiKey: localApiKey,\n validate: false,\n });\n\n // Clear pending status on completion\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n\n if (response && response.success && response.data && 'roomName' in response.data) {\n createData.eventID = response.data.roomName;\n createData.secureCode = response.data.secureCode || '';\n createData.mediasfuURL = response.data.publicURL;\n await createLocalRoom({\n createData: createData,\n link: response.data.link,\n });\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room on MediaSFU.`,\n type: 'danger',\n duration: 3000,\n });\n try {\n updateSocket(initSocket);\n await createLocalRoom({ createData: createData });\n } catch (error) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch (error) {\n // Clear pending status on error\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room on MediaSFU. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n } else {\n try {\n updateSocket(initSocket!);\n await createLocalRoom({ createData: createData });\n } catch (error) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } else {\n // Build a unique identifier for this create request (non-local)\n const roomIdentifier = `mediasfu_create_${payload.userName}_${payload.duration}_${payload.capacity}`;\n const pendingKey = `prejoin_pending_${roomIdentifier}`;\n const PENDING_TIMEOUT = 30 * 1000; // 30 seconds\n\n // Check pending status to prevent duplicate requests\n try {\n const pendingRequest = localStorage.getItem(pendingKey);\n if (pendingRequest) {\n const pendingData = JSON.parse(pendingRequest);\n const timeSincePending = Date.now() - (pendingData?.timestamp ?? 0);\n if (timeSincePending < PENDING_TIMEOUT) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: 'Room creation already in progress',\n type: 'danger',\n duration: 3000,\n });\n return;\n } else {\n // Stale lock, clear it\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }\n }\n } catch {\n // Ignore localStorage read/JSON errors\n }\n\n // Mark request as pending\n try {\n localStorage.setItem(\n pendingKey,\n JSON.stringify({\n timestamp: Date.now(),\n payload: {\n action: 'create',\n userName: payload.userName,\n duration: payload.duration,\n capacity: payload.capacity,\n },\n })\n );\n\n // Auto-clear the pending flag after timeout to avoid stale locks\n setTimeout(() => {\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }, PENDING_TIMEOUT);\n } catch {\n // Ignore localStorage write errors\n }\n\n try {\n await roomCreator({\n payload,\n apiUserName: apiUserName,\n apiKey: apiKey,\n validate: validate,\n });\n\n // Clear pending status on completion\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n } catch (error) {\n // Clear pending status on error\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n}\n","import { Socket } from 'socket.io-client';\nimport type {\n JoinMediaSFURoomOptions,\n JoinRoomOnMediaSFUType,\n PreJoinPageParameters,\n} from '../../types/types';\nimport { checkLimitsAndMakeRequest } from '../utils/checkLimitsAndMakeRequest';\nimport type { CreateJoinLocalRoomResponse } from './handleCreateRoom';\n\n/**\n * Parameters for joining a local event room\n */\nexport interface JoinLocalEventRoomParameters {\n eventID: string;\n userName: string;\n secureCode?: string;\n videoPreference?: string | null;\n audioPreference?: string | null;\n audioOutputPreference?: string | null;\n}\n\n/**\n * Options for joining a local event room\n */\nexport interface JoinLocalEventRoomOptions {\n joinData: JoinLocalEventRoomParameters;\n link?: string;\n}\n\n/**\n * Options for handleJoinRoom function\n */\nexport interface HandleJoinRoomOptions {\n payload: JoinMediaSFURoomOptions;\n localLink?: string;\n apiUserName: string;\n apiKey: string;\n parameters: PreJoinPageParameters;\n initSocket?: Socket;\n localData?: any;\n joinMediaSFURoom: JoinRoomOnMediaSFUType;\n}\n\n/**\n * Handles joining an existing room on MediaSFU or local server\n * \n * @param {HandleJoinRoomOptions} options - Configuration for joining a room\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleJoinRoom({\n * payload: {\n * action: 'join',\n * meetingID: 'room123',\n * userName: 'John Doe',\n * },\n * apiUserName: 'user123',\n * apiKey: 'key123',\n * parameters,\n * joinMediaSFURoom,\n * });\n * ```\n */\nexport async function handleJoinRoom({\n payload,\n localLink = '',\n apiUserName,\n apiKey,\n parameters,\n initSocket,\n localData,\n joinMediaSFURoom,\n}: HandleJoinRoomOptions): Promise<void> {\n const {\n updateIsLoadingModalVisible,\n updateSocket,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n updateValidated,\n showAlert,\n } = parameters;\n\n /**\n * Joins a local room by emitting to the socket\n */\n const joinLocalRoom = async ({ joinData, link = localLink }: JoinLocalEventRoomOptions) => {\n initSocket?.emit('joinEventRoom', joinData, (response: CreateJoinLocalRoomResponse) => {\n if (response.success) {\n updateSocket(initSocket!);\n updateApiUserName(localData?.apiUserName || '');\n updateApiToken(response.secret);\n updateLink(link);\n updateRoomName(joinData.eventID);\n updateMember(joinData.userName);\n updateIsLoadingModalVisible(false);\n updateValidated(true);\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to join room. ${response.reason}`,\n type: 'danger',\n duration: 3000,\n });\n }\n });\n };\n\n if (localLink.length > 0 && !localLink.includes('mediasfu.com')) {\n const joinData: JoinLocalEventRoomParameters = {\n eventID: payload.meetingID,\n userName: payload.userName,\n secureCode: '',\n videoPreference: null,\n audioPreference: null,\n audioOutputPreference: null,\n };\n\n await joinLocalRoom({ joinData: joinData });\n return;\n }\n\n updateIsLoadingModalVisible(true);\n\n const response = await joinMediaSFURoom({\n payload,\n apiUserName: apiUserName,\n apiKey: apiKey,\n localLink: localLink,\n });\n\n if (response.success && response.data && 'roomName' in response.data) {\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response.data.link,\n userName: payload.userName,\n parameters: parameters,\n });\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to join room. ${\n response.data ? ('error' in response.data ? response.data.error : '') : ''\n }`,\n type: 'danger',\n duration: 3000,\n });\n }\n}\n","import type { ShowAlert } from '../../types/types'\n\nexport interface CheckPauseStateOptions {\n recordingMediaOptions: string\n recordingVideoPausesLimit: number\n recordingAudioPausesLimit: number\n pauseRecordCount: number\n showAlert?: ShowAlert\n}\n\nexport type CheckPauseStateType = (options: CheckPauseStateOptions) => Promise<boolean>\n\n/**\n * Checks if the recording can be paused based on the current pause count and the allowed pause limits.\n *\n * @param {Object} options - The options for checking the pause state.\n * @param {string} options.recordingMediaOptions - The type of media being recorded (\"video\" or \"audio\").\n * @param {number} options.recordingVideoPausesLimit - The maximum number of pauses allowed for video recordings.\n * @param {number} options.recordingAudioPausesLimit - The maximum number of pauses allowed for audio recordings.\n * @param {number} options.pauseRecordCount - The current count of pauses that have been made.\n * @param {Function} options.showAlert - Function to show an alert message if the pause limit is reached.\n *\n * @returns {Promise<boolean>} - Resolves to `true` if the recording can be paused, otherwise `false`.\n *\n * @example\n * ```typescript\n * const canPause = await checkPauseState({\n * recordingMediaOptions: 'audio',\n * recordingVideoPausesLimit: 3,\n * recordingAudioPausesLimit: 5,\n * pauseRecordCount: 4,\n * showAlert: ({ message }) => console.log(message),\n * })\n * ```\n */\nexport const checkPauseState: CheckPauseStateType = async ({\n recordingMediaOptions,\n recordingVideoPausesLimit,\n recordingAudioPausesLimit,\n pauseRecordCount,\n showAlert,\n}) => {\n const refLimit = recordingMediaOptions === 'video'\n ? recordingVideoPausesLimit\n : recordingAudioPausesLimit\n\n if (pauseRecordCount < refLimit) {\n return true\n }\n\n showAlert?.({\n message: 'You have reached the limit of pauses - you can choose to stop recording.',\n type: 'danger',\n duration: 3000,\n })\n return false\n}\n","export interface CheckResumeStateOptions {\n recordingMediaOptions: string\n recordingVideoPausesLimit: number\n recordingAudioPausesLimit: number\n pauseRecordCount: number\n}\n\nexport type CheckResumeStateType = (options: CheckResumeStateOptions) => Promise<boolean>\n\n/**\n * Checks if the recording can be resumed based on the media type and pause limits.\n *\n * @param {Object} options - The options for checking resume state.\n * @param {string} options.recordingMediaOptions - The type of media being recorded (\"video\" or \"audio\").\n * @param {number} options.recordingVideoPausesLimit - The maximum number of pauses allowed for video recording.\n * @param {number} options.recordingAudioPausesLimit - The maximum number of pauses allowed for audio recording.\n * @param {number} options.pauseRecordCount - The current number of pauses that have occurred.\n *\n * @returns {Promise<boolean>} - Resolves to `true` if the recording can be resumed, otherwise `false`.\n *\n * @example\n * ```typescript\n * const canResume = await checkResumeState({\n * recordingMediaOptions: 'video',\n * recordingVideoPausesLimit: 3,\n * recordingAudioPausesLimit: 5,\n * pauseRecordCount: 2,\n * })\n * ```\n */\nexport const checkResumeState: CheckResumeStateType = async ({\n recordingMediaOptions,\n recordingVideoPausesLimit,\n recordingAudioPausesLimit,\n pauseRecordCount,\n}) => {\n const refLimit = recordingMediaOptions === 'video'\n ? recordingVideoPausesLimit\n : recordingAudioPausesLimit\n\n return pauseRecordCount <= refLimit\n}\n","import type {\n ShowAlert,\n MainSpecs,\n DispSpecs,\n TextSpecs,\n EventType,\n UserRecordingParams,\n} from '../../types/types'\n\nexport interface ConfirmRecordingParameters {\n showAlert?: ShowAlert\n recordingMediaOptions: string\n recordingAudioOptions: string\n recordingVideoOptions: string\n recordingVideoType: string\n recordingDisplayType: 'video' | 'media' | 'all'\n recordingNameTags: boolean\n recordingBackgroundColor: string\n recordingNameTagsColor: string\n recordingOrientationVideo: string\n recordingAddHLS: boolean\n recordingAddText: boolean\n recordingCustomText: string\n recordingCustomTextPosition: string\n recordingCustomTextColor: string\n meetingDisplayType: string\n recordingVideoParticipantsFullRoomSupport: boolean\n recordingAllParticipantsSupport: boolean\n recordingVideoParticipantsSupport: boolean\n recordingSupportForOtherOrientation: boolean\n recordingPreferredOrientation: string\n recordingMultiFormatsSupport: boolean\n recordingVideoOptimized: boolean\n recordingAllParticipantsFullRoomSupport: boolean\n meetingVideoOptimized: boolean\n eventType: EventType\n breakOutRoomStarted: boolean\n breakOutRoomEnded: boolean\n updateRecordingDisplayType: (value: 'video' | 'media' | 'all') => void\n updateRecordingVideoOptimized: (value: boolean) => void\n updateUserRecordingParams: (params: UserRecordingParams) => void\n updateConfirmedToRecord: (value: boolean) => void\n getUpdatedAllParams: () => ConfirmRecordingParameters\n [key: string]: any\n}\n\nexport interface ConfirmRecordingOptions {\n parameters: ConfirmRecordingParameters\n}\n\nexport type ConfirmRecordingType = (options: ConfirmRecordingOptions) => Promise<void>\n\n/**\n * Confirms the recording settings based on the provided parameters and updates the recording state.\n */\nexport const confirmRecording: ConfirmRecordingType = async ({\n parameters,\n}) => {\n parameters = parameters.getUpdatedAllParams()\n\n let {\n showAlert,\n recordingMediaOptions,\n recordingAudioOptions,\n recordingVideoOptions,\n recordingVideoType,\n recordingDisplayType,\n recordingNameTags,\n recordingBackgroundColor,\n recordingNameTagsColor,\n recordingOrientationVideo,\n recordingAddHLS,\n recordingAddText,\n recordingCustomText,\n recordingCustomTextPosition,\n recordingCustomTextColor,\n meetingDisplayType,\n recordingVideoParticipantsFullRoomSupport,\n recordingAllParticipantsSupport,\n recordingVideoParticipantsSupport,\n recordingSupportForOtherOrientation,\n recordingPreferredOrientation,\n recordingMultiFormatsSupport,\n recordingVideoOptimized,\n recordingAllParticipantsFullRoomSupport,\n meetingVideoOptimized,\n eventType,\n breakOutRoomStarted,\n breakOutRoomEnded,\n updateRecordingDisplayType,\n updateRecordingVideoOptimized,\n updateUserRecordingParams,\n updateConfirmedToRecord,\n } = parameters\n\n if (\n !recordingVideoParticipantsFullRoomSupport &&\n recordingVideoOptions === 'all' &&\n recordingMediaOptions === 'video'\n ) {\n if (meetingDisplayType === 'all' && !(breakOutRoomStarted && !breakOutRoomEnded)) {\n showAlert?.({\n message:\n 'You are not allowed to record videos of all participants; change the meeting display type to video or video optimized.',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n }\n\n if (!recordingAllParticipantsSupport && recordingVideoOptions === 'all') {\n showAlert?.({\n message: 'You are only allowed to record yourself.',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (!recordingVideoParticipantsSupport && recordingDisplayType === 'video') {\n showAlert?.({\n message: 'You are not allowed to record other video participants.',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (!recordingSupportForOtherOrientation && recordingOrientationVideo === 'all') {\n showAlert?.({\n message: 'You are not allowed to record all orientations.',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (\n (recordingPreferredOrientation === 'landscape' && recordingOrientationVideo === 'portrait') ||\n (recordingPreferredOrientation === 'portrait' && recordingOrientationVideo === 'landscape')\n ) {\n if (!recordingSupportForOtherOrientation) {\n showAlert?.({\n message: 'You are not allowed to record this orientation.',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n }\n\n if (!recordingMultiFormatsSupport && recordingVideoType === 'all') {\n showAlert?.({\n message: 'You are not allowed to record all formats.',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (eventType !== 'broadcast') {\n if (recordingMediaOptions === 'video') {\n if (meetingDisplayType === 'media' && recordingDisplayType === 'all') {\n showAlert?.({\n message:\n 'Recording display type can be either video, video optimized, or media when meeting display type is media.',\n type: 'danger',\n duration: 3000,\n })\n updateRecordingDisplayType(meetingDisplayType as 'video' | 'media' | 'all')\n return\n }\n\n if (meetingDisplayType === 'video') {\n if (recordingDisplayType === 'all' || recordingDisplayType === 'media') {\n showAlert?.({\n message:\n 'Recording display type can be either video or video optimized when meeting display type is video.',\n type: 'danger',\n duration: 3000,\n })\n updateRecordingDisplayType(meetingDisplayType as 'video' | 'media' | 'all')\n return\n }\n\n if (meetingVideoOptimized && !recordingVideoOptimized) {\n showAlert?.({\n message:\n 'Recording display type can only be video optimized when meeting display type is video optimized.',\n type: 'danger',\n duration: 3000,\n })\n updateRecordingVideoOptimized(meetingVideoOptimized)\n return\n }\n }\n } else {\n updateRecordingDisplayType('media')\n updateRecordingVideoOptimized(false)\n }\n }\n\n if (recordingDisplayType === 'all' && !recordingAllParticipantsFullRoomSupport) {\n showAlert?.({\n message: 'You can only record all participants with media.',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n const mainSpecs: MainSpecs = {\n mediaOptions: recordingMediaOptions,\n audioOptions: recordingAudioOptions,\n videoOptions: recordingVideoOptions,\n videoType: recordingVideoType,\n videoOptimized: recordingVideoOptimized,\n recordingDisplayType,\n addHLS: recordingAddHLS,\n }\n\n const dispSpecs: DispSpecs = {\n nameTags: recordingNameTags,\n backgroundColor: recordingBackgroundColor,\n nameTagsColor: recordingNameTagsColor,\n orientationVideo: recordingOrientationVideo,\n }\n\n const textSpecs: TextSpecs = {\n addText: recordingAddText,\n customText: recordingCustomText,\n customTextPosition: recordingCustomTextPosition,\n customTextColor: recordingCustomTextColor,\n }\n\n const userRecordingParams = { mainSpecs, dispSpecs, textSpecs }\n\n updateUserRecordingParams(userRecordingParams)\n updateConfirmedToRecord(true)\n}\n","import type { ShowAlert } from '../../types/types'\n\nexport interface LaunchRecordingOptions {\n updateIsRecordingModalVisible: (visible: boolean) => void\n isRecordingModalVisible: boolean\n showAlert?: ShowAlert\n stopLaunchRecord: boolean\n canLaunchRecord: boolean\n recordingAudioSupport: boolean\n recordingVideoSupport: boolean\n updateCanRecord: (canRecord: boolean) => void\n updateClearedToRecord: (cleared: boolean) => void\n recordStarted: boolean\n recordPaused: boolean\n localUIMode: boolean\n [key: string]: any\n}\n\nexport type LaunchRecordingType = (options: LaunchRecordingOptions) => void\n\n/**\n * Launches the recording process based on various conditions and updates the UI accordingly.\n *\n * @param {Object} options - The options for launching the recording.\n * @param {Function} options.updateIsRecordingModalVisible - Function to update the visibility of the recording modal.\n * @param {boolean} options.isRecordingModalVisible - Indicates if the recording modal is currently visible.\n * @param {Function} options.showAlert - Function to show an alert message.\n * @param {boolean} options.stopLaunchRecord - Indicates if the recording launch should be stopped.\n * @param {boolean} options.canLaunchRecord - Indicates if the recording can be launched.\n * @param {boolean} options.recordingAudioSupport - Indicates if audio recording is supported.\n * @param {boolean} options.recordingVideoSupport - Indicates if video recording is supported.\n * @param {Function} options.updateCanRecord - Function to update the recording capability.\n * @param {Function} options.updateClearedToRecord - Function to update the cleared-to-record status.\n * @param {boolean} options.recordStarted - Indicates if the recording has started.\n * @param {boolean} options.recordPaused - Indicates if the recording is paused.\n * @param {boolean} options.localUIMode - Indicates if the local UI mode is active.\n *\n * @returns {void}\n *\n * @example\n * ```typescript\n * launchRecording({\n * updateIsRecordingModalVisible: (visible) => console.log(`Modal visible: ${visible}`),\n * isRecordingModalVisible: false,\n * showAlert: (alert) => console.log(alert.message),\n * stopLaunchRecord: false,\n * canLaunchRecord: true,\n * recordingAudioSupport: true,\n * recordingVideoSupport: true,\n * updateCanRecord: (canRecord) => console.log(`Can record: ${canRecord}`),\n * updateClearedToRecord: (cleared) => console.log(`Cleared to record: ${cleared}`),\n * recordStarted: false,\n * recordPaused: false,\n * localUIMode: false,\n * })\n * ```\n */\nexport const launchRecording: LaunchRecordingType = ({\n updateIsRecordingModalVisible,\n isRecordingModalVisible,\n showAlert,\n stopLaunchRecord,\n canLaunchRecord,\n recordingAudioSupport,\n recordingVideoSupport,\n updateCanRecord,\n updateClearedToRecord,\n recordStarted,\n recordPaused,\n localUIMode,\n}) => {\n if (!isRecordingModalVisible && stopLaunchRecord && !localUIMode) {\n showAlert?.({\n message: 'Recording has already ended or you are not allowed to record',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (!isRecordingModalVisible && canLaunchRecord && !localUIMode) {\n if (!recordingAudioSupport && !recordingVideoSupport) {\n showAlert?.({\n message: 'You are not allowed to record',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n updateClearedToRecord(false)\n updateCanRecord(false)\n }\n\n if (!isRecordingModalVisible && recordStarted && !recordPaused) {\n showAlert?.({\n message: 'You can only re-configure recording after pausing it',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (!isRecordingModalVisible && !recordingAudioSupport && !recordingVideoSupport && !localUIMode) {\n showAlert?.({\n message: 'You are not allowed to record',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n updateIsRecordingModalVisible(!isRecordingModalVisible)\n}\n","import type { ShowAlert } from '../../types/types'\n\nexport interface RecordPauseTimerOptions {\n stop?: boolean\n isTimerRunning: boolean\n canPauseResume: boolean\n showAlert?: ShowAlert\n}\n\nexport type RecordPauseTimerType = (options: RecordPauseTimerOptions) => boolean\n\n/**\n * Records the pause timer.\n *\n * @param {RecordPauseTimerOptions} options - The options for recording the pause timer.\n * @param {boolean} options.stop - A flag to stop the timer.\n * @param {boolean} options.isTimerRunning - Indicates if the timer is running.\n * @param {boolean} options.canPauseResume - Indicates if the timer can be paused or resumed.\n * @param {Function} options.showAlert - Function to show alerts.\n *\n * @returns {boolean} `true` if the timer can be paused or resumed, otherwise `false`.\n *\n * @example\n * ```typescript\n * const canPause = recordPauseTimer({\n * stop: false,\n * isTimerRunning: true,\n * canPauseResume: true,\n * showAlert: (alert) => console.log(alert.message),\n * })\n * ```\n */\nexport const recordPauseTimer: RecordPauseTimerType = ({\n stop = false,\n isTimerRunning,\n canPauseResume,\n showAlert,\n}) => {\n if (isTimerRunning && canPauseResume) {\n return true\n }\n\n const message = stop\n ? 'Can only stop after 15 seconds of starting or pausing or resuming recording'\n : 'Can only pause or resume after 15 seconds of starting or pausing or resuming recording'\n\n showAlert?.({\n message,\n type: 'danger',\n })\n return false\n}\n","export interface RecordUpdateTimerOptions {\n recordElapsedTime: number\n recordStartTime: number\n updateRecordElapsedTime: (elapsedTime: number) => void\n updateRecordingProgressTime: (formattedTime: string) => void\n}\n\nexport type RecordUpdateTimerType = (options: RecordUpdateTimerOptions) => void\n\n/**\n * Updates the recording timer by calculating the elapsed time since the recording started\n * and formatting it in HH:MM:SS format.\n *\n * @param {RecordUpdateTimerOptions} options - The options object.\n * @param {number} options.recordElapsedTime - The elapsed recording time in seconds.\n * @param {number} options.recordStartTime - The timestamp when the recording started.\n * @param {Function} options.updateRecordElapsedTime - Callback to update the elapsed recording time.\n * @param {Function} options.updateRecordingProgressTime - Callback to update the formatted recording time.\n *\n * @example\n * ```typescript\n * recordUpdateTimer({\n * recordElapsedTime: 0,\n * recordStartTime: Date.now(),\n * updateRecordElapsedTime: (elapsedTime) => console.log('Elapsed:', elapsedTime),\n * updateRecordingProgressTime: (formatted) => console.log('Progress:', formatted),\n * })\n * ```\n */\nexport const recordUpdateTimer: RecordUpdateTimerType = ({\n recordElapsedTime,\n recordStartTime,\n updateRecordElapsedTime,\n updateRecordingProgressTime,\n}) => {\n const padNumber = (value: number): string => value.toString().padStart(2, '0')\n\n const currentTime = new Date().getTime()\n let elapsedSeconds = recordElapsedTime\n elapsedSeconds = Math.floor((currentTime - recordStartTime) / 1000)\n updateRecordElapsedTime(elapsedSeconds)\n\n const hours = Math.floor(elapsedSeconds / 3600)\n const minutes = Math.floor((elapsedSeconds % 3600) / 60)\n const seconds = elapsedSeconds % 60\n const formattedTime = `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`\n\n updateRecordingProgressTime(formattedTime)\n}\n","import type { ShowAlert } from '../../types/types'\nimport { recordUpdateTimer } from './recordUpdateTimer'\n\nexport interface RecordResumeTimerParameters {\n isTimerRunning: boolean\n canPauseResume: boolean\n recordElapsedTime: number\n recordStartTime: number\n recordTimerInterval?: NodeJS.Timeout | null\n showAlert?: ShowAlert\n recordPaused: boolean\n recordStopped: boolean\n roomName: string | null\n updateRecordStartTime: (time: number) => void\n updateRecordTimerInterval: (interval: NodeJS.Timeout | null) => void\n updateIsTimerRunning: (isRunning: boolean) => void\n updateCanPauseResume: (canPause: boolean) => void\n updateRecordElapsedTime: (elapsed: number) => void\n updateRecordingProgressTime: (formatted: string) => void\n getUpdatedAllParams: () => RecordResumeTimerParameters\n [key: string]: any\n}\n\nexport interface RecordResumeTimerOptions {\n parameters: RecordResumeTimerParameters\n}\n\nexport type RecordResumeTimerType = (options: RecordResumeTimerOptions) => Promise<boolean>\n\n/**\n * Resumes the recording timer if it is not already running and can be paused/resumed.\n */\nexport const recordResumeTimer: RecordResumeTimerType = async ({ parameters }) => {\n const { getUpdatedAllParams } = parameters\n parameters = getUpdatedAllParams()\n\n let {\n isTimerRunning,\n canPauseResume,\n recordElapsedTime,\n recordStartTime,\n recordTimerInterval,\n showAlert,\n updateRecordStartTime,\n updateRecordTimerInterval,\n updateIsTimerRunning,\n updateCanPauseResume,\n } = parameters\n\n if (!isTimerRunning && canPauseResume) {\n recordStartTime = new Date().getTime() - recordElapsedTime * 1000\n updateRecordStartTime(recordStartTime)\n\n recordTimerInterval = setInterval(() => {\n recordUpdateTimer({\n recordElapsedTime,\n recordStartTime,\n updateRecordElapsedTime: parameters.updateRecordElapsedTime,\n updateRecordingProgressTime: parameters.updateRecordingProgressTime,\n })\n\n parameters = getUpdatedAllParams()\n\n if (\n parameters.recordPaused ||\n parameters.recordStopped ||\n parameters.roomName === '' ||\n parameters.roomName === null\n ) {\n clearInterval(recordTimerInterval!)\n updateRecordTimerInterval(null)\n isTimerRunning = false\n updateIsTimerRunning(isTimerRunning)\n canPauseResume = false\n updateCanPauseResume(canPauseResume)\n }\n }, 1000)\n\n updateRecordTimerInterval(recordTimerInterval!)\n isTimerRunning = true\n updateIsTimerRunning(isTimerRunning)\n canPauseResume = false\n updateCanPauseResume(canPauseResume)\n return true\n }\n\n showAlert?.({\n type: 'danger',\n message: 'Can only pause or resume after 15 seconds of starting or pausing or resuming recording',\n })\n return false\n}\n","import { recordUpdateTimer } from './recordUpdateTimer'\n\nexport interface RecordStartTimerParameters {\n recordStartTime: number\n recordTimerInterval?: NodeJS.Timeout | null\n isTimerRunning: boolean\n canPauseResume: boolean\n recordChangeSeconds: number\n recordPaused: boolean\n recordStopped: boolean\n roomName: string | null\n updateRecordStartTime: (time: number) => void\n updateRecordTimerInterval: (interval: NodeJS.Timeout | null) => void\n updateIsTimerRunning: (isRunning: boolean) => void\n updateCanPauseResume: (canPause: boolean) => void\n recordElapsedTime: number\n updateRecordElapsedTime: (elapsed: number) => void\n updateRecordingProgressTime: (formatted: string) => void\n getUpdatedAllParams: () => RecordStartTimerParameters\n [key: string]: any\n}\n\nexport interface RecordStartTimerOptions {\n parameters: RecordStartTimerParameters\n}\n\nexport type RecordStartTimerType = (options: RecordStartTimerOptions) => Promise<void>\n\n/**\n * Starts a recording timer and manages its state.\n *\n * @param {RecordStartTimerOptions} options - The options for starting the recording timer.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {number} options.parameters.recordStartTime - The start time of the recording.\n * @param {number | null} options.parameters.recordTimerInterval - The interval ID for the recording timer.\n * @param {boolean} options.parameters.isTimerRunning - Flag indicating if the timer is running.\n * @param {boolean} options.parameters.canPauseResume - Flag indicating if pause/resume actions are enabled.\n * @param {number} options.parameters.recordChangeSeconds - The time after which pause/resume actions are enabled.\n * @param {Function} options.parameters.updateRecordStartTime - Function to update the recording start time.\n * @param {Function} options.parameters.updateRecordTimerInterval - Function to update the recording timer interval.\n * @param {Function} options.parameters.updateIsTimerRunning - Function to update the timer running state.\n * @param {Function} options.parameters.updateCanPauseResume - Function to update the pause/resume state.\n *\n * @example\n * ```typescript\n * await recordStartTimer({ parameters })\n * ```\n */\nexport const recordStartTimer: RecordStartTimerType = async ({ parameters }) => {\n const { getUpdatedAllParams } = parameters\n parameters = getUpdatedAllParams()\n\n let {\n recordStartTime,\n recordTimerInterval,\n isTimerRunning,\n canPauseResume,\n recordChangeSeconds,\n updateRecordStartTime,\n updateRecordTimerInterval,\n updateIsTimerRunning,\n updateCanPauseResume,\n } = parameters\n\n const enablePauseResume = (): void => {\n canPauseResume = true\n updateCanPauseResume(canPauseResume)\n }\n\n if (!isTimerRunning) {\n recordStartTime = new Date().getTime()\n updateRecordStartTime(recordStartTime)\n\n recordTimerInterval = setInterval(() => {\n recordUpdateTimer({\n recordElapsedTime: parameters.recordElapsedTime,\n recordStartTime,\n updateRecordElapsedTime: parameters.updateRecordElapsedTime,\n updateRecordingProgressTime: parameters.updateRecordingProgressTime,\n })\n\n parameters = getUpdatedAllParams()\n\n if (\n parameters.recordPaused ||\n parameters.recordStopped ||\n parameters.roomName === '' ||\n parameters.roomName === null\n ) {\n clearInterval(recordTimerInterval!)\n updateRecordTimerInterval(null)\n isTimerRunning = false\n updateIsTimerRunning(isTimerRunning)\n canPauseResume = false\n updateCanPauseResume(canPauseResume)\n }\n }, 1000)\n\n updateRecordTimerInterval(recordTimerInterval)\n isTimerRunning = true\n updateIsTimerRunning(isTimerRunning)\n canPauseResume = false\n updateCanPauseResume(canPauseResume)\n setTimeout(enablePauseResume, recordChangeSeconds)\n }\n}\n","import type { Socket } from 'socket.io-client'\nimport {\n recordStartTimer,\n type RecordStartTimerParameters,\n} from './recordStartTimer'\nimport {\n recordResumeTimer,\n type RecordResumeTimerParameters,\n} from './recordResumeTimer'\nimport type { UserRecordingParams, ShowAlert } from '../../types/types'\n\nexport interface StartRecordingParameters\n extends RecordStartTimerParameters,\n RecordResumeTimerParameters {\n roomName: string\n userRecordingParams: UserRecordingParams\n socket: Socket\n localSocket?: Socket\n updateIsRecordingModalVisible: (visible: boolean) => void\n confirmedToRecord: boolean\n showAlert?: ShowAlert\n recordingMediaOptions: string\n videoAlreadyOn: boolean\n audioAlreadyOn: boolean\n recordStarted: boolean\n recordPaused: boolean\n recordResumed: boolean\n recordStopped: boolean\n startReport: boolean\n endReport: boolean\n canRecord: boolean\n updateClearedToRecord: (cleared: boolean) => void\n updateRecordStarted: (started: boolean) => void\n updateRecordPaused: (paused: boolean) => void\n updateRecordResumed: (resumed: boolean) => void\n updateStartReport: (started: boolean) => void\n updateEndReport: (ended: boolean) => void\n updateCanRecord: (canRecord: boolean) => void\n whiteboardStarted: boolean\n whiteboardEnded: boolean\n rePort: StartRecordingRePort\n captureCanvasStream: StartRecordingCaptureCanvasStream\n getUpdatedAllParams: () => StartRecordingParameters\n [key: string]: any\n}\n\nexport type StartRecordingRePort = (options: {\n restart?: boolean\n parameters: any\n}) => Promise<void>\n\nexport type StartRecordingCaptureCanvasStream = (options: {\n parameters: any\n start?: boolean\n}) => Promise<void>\n\nexport interface StartRecordingOptions {\n parameters: StartRecordingParameters\n}\n\nexport type StartRecordingType = (\n options: StartRecordingOptions,\n) => Promise<boolean | undefined>\n\n/**\n * Starts the recording process based on the provided parameters.\n *\n * @param {StartRecordingOptions} options - The options for starting the recording.\n * @param {object} options.parameters - The parameters required for starting the recording.\n * @param {string} options.parameters.roomName - The name of the room where recording is to be started.\n * @param {object} options.parameters.userRecordingParams - User-specific recording parameters.\n * @param {object} options.parameters.socket - The socket instance for communication.\n * @param {object} options.parameters.localSocket - The local socket instance for communication.\n * @param {function} options.parameters.updateIsRecordingModalVisible - Function to update the visibility of the recording modal.\n * @param {boolean} options.parameters.confirmedToRecord - Flag indicating if the user has confirmed to record.\n * @param {function} options.parameters.showAlert - Function to show alerts.\n * @param {string} options.parameters.recordingMediaOptions - The media options for recording (e.g., \"video\", \"audio\").\n * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if the video is already on.\n * @param {boolean} options.parameters.audioAlreadyOn - Flag indicating if the audio is already on.\n * @param {boolean} options.parameters.recordStarted - Flag indicating if the recording has started.\n * @param {boolean} options.parameters.recordPaused - Flag indicating if the recording is paused.\n * @param {boolean} options.parameters.recordResumed - Flag indicating if the recording is resumed.\n * @param {boolean} options.parameters.recordStopped - Flag indicating if the recording is stopped.\n * @param {boolean} options.parameters.startReport - Flag indicating if the start report is active.\n * @param {boolean} options.parameters.endReport - Flag indicating if the end report is active.\n * @param {boolean} options.parameters.canRecord - Flag indicating if recording is allowed.\n * @param {function} options.parameters.updateClearedToRecord - Function to update the cleared to record status.\n * @param {function} options.parameters.updateRecordStarted - Function to update the record started status.\n * @param {function} options.parameters.updateRecordPaused - Function to update the record paused status.\n * @param {function} options.parameters.updateRecordResumed - Function to update the record resumed status.\n * @param {function} options.parameters.updateStartReport - Function to update the start report status.\n * @param {function} options.parameters.updateEndReport - Function to update the end report status.\n * @param {function} options.parameters.updateCanRecord - Function to update the can record status.\n * @param {boolean} options.parameters.whiteboardStarted - Flag indicating if the whiteboard has started.\n * @param {boolean} options.parameters.whiteboardEnded - Flag indicating if the whiteboard has ended.\n * @param {function} options.parameters.rePort - Function to report the recording status.\n * @param {function} options.parameters.captureCanvasStream - Function to capture the canvas stream.\n *\n * @returns {Promise<boolean | undefined>} - A promise that resolves to a boolean indicating if the recording attempt was successful, or undefined if not applicable.\n *\n * @example\n * ```typescript\n * startRecording({\n * parameters: {\n * roomName: \"Room101\",\n * userRecordingParams: myUserRecordingParams,\n * socket: mySocket,\n * localSocket: myLocalSocket,\n * updateIsRecordingModalVisible: setIsRecordingModalVisible,\n * confirmedToRecord: true,\n * showAlert: myShowAlert,\n * recordingMediaOptions: \"video\",\n * videoAlreadyOn: true,\n * audioAlreadyOn: true,\n * recordStarted: false,\n * recordPaused: false,\n * recordResumed: false,\n * recordStopped: false,\n * startReport: false,\n * endReport: false,\n * canRecord: true,\n * updateClearedToRecord: setClearedToRecord,\n * updateRecordStarted: setRecordStarted,\n * updateRecordPaused: setRecordPaused,\n * updateRecordResumed: setRecordResumed,\n * updateStartReport: setStartReport,\n * updateEndReport: setEndReport,\n * updateCanRecord: setCanRecord,\n * whiteboardStarted: true,\n * whiteboardEnded: false,\n * rePort: myRePort,\n * captureCanvasStream: myCaptureCanvasStream,\n * },\n * })\n * ```\n */\nexport const startRecording: StartRecordingType = async ({\n parameters,\n}) => {\n parameters = parameters.getUpdatedAllParams()\n\n let {\n roomName,\n userRecordingParams,\n socket,\n localSocket,\n updateIsRecordingModalVisible,\n confirmedToRecord,\n showAlert,\n recordingMediaOptions,\n videoAlreadyOn,\n audioAlreadyOn,\n recordStarted,\n recordPaused,\n recordResumed,\n recordStopped,\n startReport,\n endReport,\n canRecord,\n updateClearedToRecord,\n updateRecordStarted,\n updateRecordPaused,\n updateRecordResumed,\n updateStartReport,\n updateEndReport,\n updateCanRecord,\n whiteboardStarted,\n whiteboardEnded,\n rePort,\n captureCanvasStream,\n } = parameters\n\n if (!confirmedToRecord) {\n showAlert?.({\n message: 'You must click confirm before you can start recording',\n type: 'danger',\n })\n return false\n }\n\n if (recordingMediaOptions === 'video' && !videoAlreadyOn) {\n showAlert?.({\n message: 'You must turn on your video before you can start recording',\n type: 'danger',\n })\n return false\n }\n\n if (recordingMediaOptions === 'audio' && !audioAlreadyOn) {\n showAlert?.({\n message: 'You must turn on your audio before you can start recording',\n type: 'danger',\n })\n return false\n }\n\n updateClearedToRecord(true)\n\n let action = 'startRecord'\n if (recordStarted && recordPaused && !recordResumed && !recordStopped) {\n action = 'resumeRecord'\n }\n\n let recAttempt = false\n const socketRef = localSocket && localSocket.connected ? localSocket : socket\n\n await new Promise<void>((resolve) => {\n socketRef.emit(\n action,\n { roomName, userRecordingParams },\n async ({ success, reason }: { success: boolean; reason: string }) => {\n if (success) {\n recordStarted = true\n startReport = true\n endReport = false\n recordPaused = false\n recAttempt = true\n\n updateRecordStarted(recordStarted)\n updateStartReport(startReport)\n updateEndReport(endReport)\n updateRecordPaused(recordPaused)\n\n if (action === 'startRecord') {\n await rePort({ parameters: parameters.getUpdatedAllParams() })\n await recordStartTimer({ parameters })\n } else {\n updateRecordResumed(true)\n await rePort({ restart: true, parameters: parameters.getUpdatedAllParams() })\n await recordResumeTimer({ parameters })\n }\n } else {\n showAlert?.({\n message: `Recording could not start - ${reason}`,\n type: 'danger',\n })\n canRecord = true\n startReport = false\n endReport = true\n recAttempt = false\n\n updateCanRecord(canRecord)\n updateStartReport(startReport)\n updateEndReport(endReport)\n }\n\n resolve()\n },\n )\n })\n\n try {\n if (\n recAttempt &&\n whiteboardStarted &&\n !whiteboardEnded &&\n recordingMediaOptions === 'video'\n ) {\n await captureCanvasStream({ parameters: parameters.getUpdatedAllParams() })\n }\n } catch (error) {\n console.error('Error capturing canvas stream:', error)\n }\n\n updateIsRecordingModalVisible(false)\n\n return recAttempt\n}\n","import type { Socket } from 'socket.io-client'\nimport { recordPauseTimer } from './recordPauseTimer'\nimport type { ShowAlert } from '../../types/types'\n\nexport interface StopRecordingParameters {\n roomName: string\n socket: Socket\n localSocket?: Socket\n showAlert?: ShowAlert\n startReport: boolean\n endReport: boolean\n recordStarted: boolean\n recordPaused: boolean\n recordStopped: boolean\n updateRecordPaused: (paused: boolean) => void\n updateRecordStopped: (stopped: boolean) => void\n updateStartReport: (startReport: boolean) => void\n updateEndReport: (endReport: boolean) => void\n updateShowRecordButtons: (show: boolean) => void\n whiteboardStarted: boolean\n whiteboardEnded: boolean\n recordingMediaOptions: string\n captureCanvasStream: (options: { parameters: any; start?: boolean }) => void\n getUpdatedAllParams: () => StopRecordingParameters\n [key: string]: any\n}\n\nexport interface StopRecordingOptions {\n parameters: StopRecordingParameters\n}\n\nexport type StopRecordingType = (options: StopRecordingOptions) => Promise<void>\n\n/**\n * Stops the recording process if it has been started and not yet stopped.\n */\nexport const stopRecording: StopRecordingType = async ({ parameters }) => {\n let {\n roomName,\n socket,\n localSocket,\n showAlert,\n startReport,\n endReport,\n recordStarted,\n recordPaused,\n recordStopped,\n updateRecordPaused,\n updateRecordStopped,\n updateStartReport,\n updateEndReport,\n updateShowRecordButtons,\n whiteboardStarted,\n whiteboardEnded,\n recordingMediaOptions,\n captureCanvasStream,\n } = parameters\n\n let recAttempt = false\n\n if (recordStarted && !recordStopped) {\n const stop = recordPauseTimer({\n stop: true,\n isTimerRunning: parameters.isTimerRunning,\n canPauseResume: parameters.canPauseResume,\n showAlert: parameters.showAlert,\n })\n\n if (stop) {\n const action = 'stopRecord'\n\n const socketRef = localSocket && localSocket.connected ? localSocket : socket\n\n await new Promise<void>((resolve) => {\n socketRef.emit(\n action,\n { roomName },\n ({ success, reason, recordState }: { success: boolean; reason: string; recordState: string }) => {\n if (success) {\n startReport = false\n endReport = true\n recordPaused = false\n recordStopped = true\n recAttempt = true\n\n updateStartReport(startReport)\n updateEndReport(endReport)\n updateRecordPaused(recordPaused)\n updateRecordStopped(recordStopped)\n showAlert?.({ message: 'Recording Stopped', type: 'success' })\n updateShowRecordButtons(false)\n } else {\n const reasonMessage = `Recording Stop Failed: ${reason}; the recording is currently ${recordState}`\n showAlert?.({ message: reasonMessage, type: 'danger' })\n recAttempt = false\n }\n\n resolve()\n },\n )\n })\n\n try {\n if (\n recAttempt &&\n whiteboardStarted &&\n !whiteboardEnded &&\n recordingMediaOptions === 'video'\n ) {\n captureCanvasStream({ parameters: parameters.getUpdatedAllParams(), start: false })\n }\n } catch (error) {\n console.error('Error capturing canvas stream:', error)\n }\n } else {\n return\n }\n } else {\n showAlert?.({\n message: 'Recording is not started yet or already stopped',\n type: 'danger',\n })\n }\n}\n","import type { Socket } from 'socket.io-client'\nimport { checkPauseState } from './checkPauseState'\nimport { checkResumeState } from './checkResumeState'\nimport { recordPauseTimer } from './recordPauseTimer'\nimport {\n recordResumeTimer,\n type RecordResumeTimerParameters,\n} from './recordResumeTimer'\nimport type { ShowAlert, UserRecordingParams } from '../../types/types'\n\nexport interface UpdateRecordingParameters extends RecordResumeTimerParameters {\n roomName: string\n userRecordingParams: UserRecordingParams\n socket: Socket\n localSocket?: Socket\n updateIsRecordingModalVisible: (visible: boolean) => void\n confirmedToRecord: boolean\n showAlert?: ShowAlert\n recordingMediaOptions: string\n videoAlreadyOn: boolean\n audioAlreadyOn: boolean\n recordStarted: boolean\n recordPaused: boolean\n recordResumed: boolean\n recordStopped: boolean\n recordChangeSeconds: number\n pauseRecordCount: number\n startReport: boolean\n endReport: boolean\n canRecord: boolean\n canPauseResume: boolean\n updateCanPauseResume: (canPauseResume: boolean) => void\n updatePauseRecordCount: (count: number) => void\n updateClearedToRecord: (cleared: boolean) => void\n updateRecordPaused: (paused: boolean) => void\n updateRecordResumed: (resumed: boolean) => void\n updateStartReport: (start: boolean) => void\n updateEndReport: (end: boolean) => void\n updateCanRecord: (canRecord: boolean) => void\n rePort: UpdateRecordingRePort\n getUpdatedAllParams: () => UpdateRecordingParameters\n [key: string]: any\n}\n\nexport type UpdateRecordingRePort = (options: {\n restart?: boolean\n parameters: any\n}) => Promise<void>\n\nexport interface UpdateRecordingOptions {\n parameters: UpdateRecordingParameters\n}\n\nexport type UpdateRecordingType = (options: UpdateRecordingOptions) => Promise<void>\n\n/**\n * Updates the recording state based on the provided parameters.\n */\nexport const updateRecording: UpdateRecordingType = async ({ parameters }) => {\n let {\n roomName,\n userRecordingParams,\n socket,\n localSocket,\n updateIsRecordingModalVisible,\n confirmedToRecord,\n showAlert,\n recordingMediaOptions,\n videoAlreadyOn,\n audioAlreadyOn,\n recordStarted,\n recordPaused,\n recordResumed,\n recordStopped,\n recordChangeSeconds,\n pauseRecordCount,\n startReport,\n endReport,\n canRecord,\n canPauseResume,\n updateCanPauseResume,\n updatePauseRecordCount,\n updateClearedToRecord,\n updateRecordPaused,\n updateRecordResumed,\n updateStartReport,\n updateEndReport,\n updateCanRecord,\n rePort,\n } = parameters\n\n if (recordStopped) {\n showAlert?.({\n message: 'Recording has already stopped',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (recordingMediaOptions === 'video' && !videoAlreadyOn) {\n showAlert?.({\n message: 'You must turn on your video before you can start recording',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (recordingMediaOptions === 'audio' && !audioAlreadyOn) {\n showAlert?.({\n message: 'You must turn on your audio before you can start recording',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n const socketRef = localSocket && localSocket.connected ? localSocket : socket\n\n if (recordStarted && !recordPaused && !recordStopped) {\n const proceed = await checkPauseState({\n recordingMediaOptions,\n recordingVideoPausesLimit: parameters.recordingVideoPausesLimit,\n recordingAudioPausesLimit: parameters.recordingAudioPausesLimit,\n pauseRecordCount,\n showAlert,\n })\n\n if (!proceed) return\n\n const record = recordPauseTimer({\n stop: false,\n isTimerRunning: parameters.isTimerRunning,\n canPauseResume: parameters.canPauseResume,\n showAlert,\n })\n\n if (record) {\n const action = 'pauseRecord'\n await new Promise<void>((resolve) => {\n socketRef.emit(\n action,\n { roomName },\n async ({ success, reason, recordState, pauseCount }: { success: boolean; reason: string; recordState: string; pauseCount: number }) => {\n pauseRecordCount = pauseCount\n updatePauseRecordCount(pauseRecordCount)\n\n if (success) {\n startReport = false\n endReport = true\n recordPaused = true\n updateStartReport(startReport)\n updateEndReport(endReport)\n updateRecordPaused(recordPaused)\n\n showAlert?.({\n message: 'Recording paused',\n type: 'success',\n duration: 3000,\n })\n\n updateIsRecordingModalVisible(false)\n\n setTimeout(() => {\n canPauseResume = true\n updateCanPauseResume(canPauseResume)\n }, recordChangeSeconds)\n } else {\n showAlert?.({\n message: `Recording Pause Failed: ${reason}; the current state is: ${recordState}`,\n type: 'danger',\n duration: 3000,\n })\n }\n resolve()\n },\n )\n })\n }\n } else if (recordStarted && recordPaused && !recordStopped) {\n if (!confirmedToRecord) {\n showAlert?.({\n message: 'You must click confirm before you can start recording',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n const proceed = await checkResumeState({\n recordingMediaOptions,\n recordingVideoPausesLimit: parameters.recordingVideoPausesLimit,\n recordingAudioPausesLimit: parameters.recordingAudioPausesLimit,\n pauseRecordCount,\n })\n\n if (!proceed) return\n\n const resume = await recordResumeTimer({ parameters })\n if (resume) {\n updateClearedToRecord(true)\n\n const action = 'resumeRecord'\n await new Promise<void>((resolve) => {\n socketRef.emit(\n action,\n { roomName, userRecordingParams },\n async ({ success, reason }: { success: boolean; reason: string }) => {\n if (success) {\n recordResumed = true\n recordPaused = false\n\n updateRecordPaused(recordPaused)\n updateRecordResumed(recordResumed)\n\n await rePort({ restart: true, parameters: parameters.getUpdatedAllParams() })\n } else {\n showAlert?.({\n message: `Recording could not resume - ${reason}`,\n type: 'danger',\n duration: 3000,\n })\n }\n canRecord = true\n startReport = false\n endReport = true\n\n updateCanRecord(canRecord)\n updateStartReport(startReport)\n updateEndReport(endReport)\n\n resolve()\n },\n )\n })\n\n updateIsRecordingModalVisible(false)\n\n setTimeout(() => {\n updateCanPauseResume(true)\n }, recordChangeSeconds)\n }\n }\n}\n","export interface LaunchRequestsOptions {\n updateIsRequestsModalVisible: (isVisible: boolean) => void\n isRequestsModalVisible: boolean\n}\n\nexport type LaunchRequestsType = (options: LaunchRequestsOptions) => void\n\n/**\n * Toggles the visibility state of the requests modal.\n *\n * @param {LaunchRequestsOptions} options - The options for launching requests.\n * @param {Function} options.updateIsRequestsModalVisible - Function to update the visibility state of the requests modal.\n * @param {boolean} options.isRequestsModalVisible - Current visibility state of the requests modal.\n *\n * @example\n * ```typescript\n * launchRequests({\n * updateIsRequestsModalVisible: setRequestsModalVisible,\n * isRequestsModalVisible: true,\n * })\n * ```\n */\nexport const launchRequests: LaunchRequestsType = ({ updateIsRequestsModalVisible, isRequestsModalVisible }) => {\n updateIsRequestsModalVisible(!isRequestsModalVisible)\n}\n","import { Socket } from \"socket.io-client\";\nimport type { Request, RequestResponse } from \"../../types/types\";\n\nexport interface RespondToRequestsOptions {\n socket: Socket;\n request: Request;\n updateRequestList: (newRequestList: Request[]) => void;\n requestList?: Request[];\n action: string;\n roomName: string;\n}\n\n// Export the type definition for the function\nexport type RespondToRequestsType = (options: RespondToRequestsOptions) => Promise<void>;\n\n/**\n * Responds to incoming requests by updating the request list and emitting a response to the server.\n *\n * @param {Object} options - The options for responding to requests.\n * @param {Socket} options.socket - The socket instance used to emit the response.\n * @param {Request} options.request - The request object containing details of the request.\n * @param {Function} options.updateRequestList - The function to update the request list.\n * @param {Request[]} options.requestList - The current list of requests.\n * @param {string} options.action - The action to be taken on the request.\n * @param {string} options.roomName - The name of the room to which the response should be emitted.\n *\n * @returns {Promise<void>} A promise that resolves when the response has been emitted.\n * \n * @example\n * ```typescript\n * respondToRequests({\n * socket,\n * request: { id: \"123\", name: \"John\", icon: \"fa-microphone\" },\n * updateRequestList: setRequestList,\n * requestList: currentRequests,\n * action: \"accept\",\n * roomName: \"mainRoom\"\n * });\n * ```\n */\n\nexport const respondToRequests = async ({\n socket,\n request,\n updateRequestList,\n requestList = [],\n action,\n roomName,\n}: RespondToRequestsOptions): Promise<void> => {\n if (!request || typeof request !== \"object\") {\n return;\n }\n\n if (!updateRequestList) {\n console.warn(\"[respondToRequests] Missing updateRequestList handler; aborting emit.\");\n return;\n }\n\n const currentList = Array.isArray(requestList) ? requestList : [];\n\n const requestIdRaw = (request as { id?: string | number }).id;\n const requestIcon = (request as { icon?: string }).icon;\n const requestName = (request as { name?: string }).name;\n\n if (requestIdRaw === undefined || requestIcon === undefined || requestName === undefined) {\n console.warn(\"[respondToRequests] Request payload is missing required fields; aborting emit.\", request);\n return;\n }\n\n const requestId = String(requestIdRaw);\n\n if (!requestId || !requestIcon || !requestName) {\n console.warn(\"[respondToRequests] Request payload contains empty fields; aborting emit.\", request);\n return;\n }\n\n // Filter out the request from the request list\n const newRequestList = currentList.filter(\n (request_) =>\n !(\n request_ &&\n request_.id === requestId &&\n request_.icon === requestIcon &&\n request_.name === requestName\n )\n );\n\n // Update the request list with the filtered list\n updateRequestList(newRequestList);\n\n // Prepare the request response\n const requestResponse: RequestResponse = {\n id: requestId,\n name: requestName,\n type: requestIcon,\n action,\n };\n\n // Emit the request response to the server\n const socketReady = socket && typeof (socket as Socket).emit === \"function\";\n\n if (!socketReady) {\n console.warn(\"[respondToRequests] Socket is not ready; skipping emit.\");\n return;\n }\n\n (socket as Socket).emit(\"updateUserofRequestStatus\", { requestResponse, roomName });\n};\n","export interface LaunchSettingsOptions {\n updateIsSettingsModalVisible: (isVisible: boolean) => void\n isSettingsModalVisible: boolean\n}\n\nexport type LaunchSettingsType = (options: LaunchSettingsOptions) => void\n\n/**\n * Toggles the visibility state of the settings modal.\n *\n * @param {LaunchSettingsOptions} options - The options for launching settings.\n * @param {Function} options.updateIsSettingsModalVisible - Function to update the visibility state of the settings modal.\n * @param {boolean} options.isSettingsModalVisible - Current visibility state of the settings modal.\n *\n * @example\n * ```typescript\n * launchSettings({\n * isSettingsModalVisible: false,\n * updateIsSettingsModalVisible: (visible) => setSettingsModalVisible(visible),\n * })\n * ```\n */\nexport const launchSettings: LaunchSettingsType = ({ updateIsSettingsModalVisible, isSettingsModalVisible }) => {\n updateIsSettingsModalVisible(!isSettingsModalVisible)\n}\n","import type { SwitchUserAudioType, SwitchUserAudioParameters } from '../../types/types';\n\nexport interface SwitchAudioParameters extends SwitchUserAudioParameters {\n defAudioID: string\n userDefaultAudioInputDevice: string\n prevAudioInputDevice: string\n updateUserDefaultAudioInputDevice: (deviceId: string) => void\n updatePrevAudioInputDevice: (deviceId: string) => void\n\n // mediasfu functions\n switchUserAudio: SwitchUserAudioType\n\n getUpdatedAllParams: () => SwitchAudioParameters\n [key: string]: any\n}\n\nexport interface SwitchAudioOptions {\n audioPreference: string\n parameters: SwitchAudioParameters\n}\n\n// Export the type definition for the function\nexport type SwitchAudioType = (options: SwitchAudioOptions) => Promise<void>\n\n/**\n * Switches the audio input device based on user preference.\n *\n * @param {SwitchAudioOptions} options - The function parameters.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * switchAudio({\n * audioPreference: \"newAudioDeviceID\",\n * parameters: {\n * defAudioID: \"defaultAudioDeviceID\",\n * userDefaultAudioInputDevice: \"currentAudioDeviceID\",\n * prevAudioInputDevice: \"previousAudioDeviceID\",\n * updateUserDefaultAudioInputDevice: (deviceId) => setUserDefaultAudio(deviceId),\n * updatePrevAudioInputDevice: (deviceId) => setPrevAudioDevice(deviceId),\n * switchUserAudio: switchUserAudioFunction,\n * getUpdatedAllParams: getUpdatedParamsFunction\n * }\n * });\n * ```\n */\n\nexport const switchAudio = async ({\n audioPreference,\n parameters\n}: SwitchAudioOptions): Promise<void> => {\n let {\n defAudioID,\n userDefaultAudioInputDevice,\n prevAudioInputDevice,\n updateUserDefaultAudioInputDevice,\n updatePrevAudioInputDevice,\n\n //mediasfu functions\n switchUserAudio\n } = parameters\n\n if (audioPreference !== defAudioID) {\n prevAudioInputDevice = userDefaultAudioInputDevice\n updatePrevAudioInputDevice(prevAudioInputDevice)\n userDefaultAudioInputDevice = audioPreference\n updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice)\n\n if (defAudioID) {\n await switchUserAudio({ audioPreference, parameters })\n }\n }\n}\n","import type { ShowAlert, SwitchUserVideoType, SwitchUserVideoParameters } from '../../types/types'\n\n\nexport interface SwitchVideoParameters extends SwitchUserVideoParameters {\n recordStarted: boolean\n recordResumed: boolean\n recordStopped: boolean\n recordPaused: boolean\n recordingMediaOptions: string\n videoAlreadyOn: boolean\n userDefaultVideoInputDevice: string\n defVideoID: string\n allowed: boolean\n updateDefVideoID: (deviceId: string) => void\n updatePrevVideoInputDevice: (deviceId: string) => void\n updateUserDefaultVideoInputDevice: (deviceId: string) => void\n updateIsMediaSettingsModalVisible: (isVisible: boolean) => void\n showAlert?: ShowAlert\n\n // Mediasfu functions\n switchUserVideo: SwitchUserVideoType\n\n [key: string]: any\n}\n\nexport interface SwitchVideoOptions {\n videoPreference: string\n parameters: SwitchVideoParameters\n}\n\n// Export the type definition for the function\nexport type SwitchVideoType = (options: SwitchVideoOptions) => Promise<void>\n\n/**\n * Switches the user's video device based on the provided video preference.\n *\n * @param {SwitchVideoOptions} options - The function parameters.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * switchVideo({\n * videoPreference: \"newVideoDeviceID\",\n * parameters: {\n * recordStarted: true,\n * recordResumed: false,\n * recordStopped: false,\n * recordPaused: false,\n * recordingMediaOptions: \"video\",\n * videoAlreadyOn: true,\n * userDefaultVideoInputDevice: \"currentVideoDeviceID\",\n * defVideoID: \"defaultVideoDeviceID\",\n * allowed: true,\n * updateDefVideoID: (deviceId) => setDefVideoID(deviceId),\n * updatePrevVideoInputDevice: (deviceId) => setPrevVideoDevice(deviceId),\n * updateUserDefaultVideoInputDevice: (deviceId) => setUserDefaultVideo(deviceId),\n * updateIsMediaSettingsModalVisible: (isVisible) => setMediaSettingsModal(isVisible),\n * showAlert: (alertOptions) => showAlert(alertOptions),\n * switchUserVideo: switchUserVideoFunction,\n * }\n * });\n * ```\n */\n\nexport const switchVideo = async ({\n videoPreference,\n parameters\n}: SwitchVideoOptions): Promise<void> => {\n let {\n recordStarted,\n recordResumed,\n recordStopped,\n recordPaused,\n recordingMediaOptions,\n videoAlreadyOn,\n userDefaultVideoInputDevice,\n defVideoID,\n allowed,\n updateDefVideoID,\n updatePrevVideoInputDevice,\n updateUserDefaultVideoInputDevice,\n updateIsMediaSettingsModalVisible,\n\n //mediasfu functions\n showAlert,\n switchUserVideo\n } = parameters\n\n // Check if recording is in progress and whether the selected video device is the default one\n let checkoff = false\n if ((recordStarted || recordResumed) && !recordStopped && !recordPaused) {\n if (recordingMediaOptions === 'video') {\n checkoff = true\n }\n }\n\n // Check camera access permission\n if (!allowed) {\n showAlert?.({\n message:\n 'Allow access to your camera by starting it for the first time.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n\n // Check video state and display appropriate alert messages\n if (checkoff) {\n if (videoAlreadyOn) {\n showAlert?.({\n message: 'Please turn off your video before switching.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n } else {\n if (!videoAlreadyOn) {\n showAlert?.({\n message: 'Please turn on your video before switching.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n }\n\n // Set default video ID if not already set\n if (!defVideoID) {\n defVideoID = userDefaultVideoInputDevice ?? 'default'\n updateDefVideoID(defVideoID)\n }\n\n // Switch video only if the selected video device is different from the default\n if (videoPreference !== defVideoID) {\n const prevVideoInputDevice = userDefaultVideoInputDevice\n updatePrevVideoInputDevice(prevVideoInputDevice)\n\n userDefaultVideoInputDevice = videoPreference\n updateUserDefaultVideoInputDevice(userDefaultVideoInputDevice)\n\n if (defVideoID) {\n updateIsMediaSettingsModalVisible(false)\n await switchUserVideo({ videoPreference, checkoff, parameters })\n }\n }\n}\n","import type { ShowAlert, SwitchUserVideoAltParameters, SwitchUserVideoAltType } from '../../types/types'\n\n\nexport interface SwitchVideoAltParameters extends SwitchUserVideoAltParameters {\n recordStarted: boolean\n recordResumed: boolean\n recordStopped: boolean\n recordPaused: boolean\n recordingMediaOptions: string\n videoAlreadyOn: boolean\n currentFacingMode: string\n prevFacingMode: string\n allowed: boolean\n audioOnlyRoom: boolean\n updateCurrentFacingMode: (mode: string) => void\n updatePrevFacingMode: (mode: string) => void\n updateIsMediaSettingsModalVisible: (isVisible: boolean) => void\n showAlert?: ShowAlert\n\n // mediasfu functions\n switchUserVideoAlt: SwitchUserVideoAltType\n\n getUpdatedAllParams: () => SwitchVideoAltParameters\n [key: string]: any\n}\n\nexport interface SwitchVideoAltOptions {\n parameters: SwitchVideoAltParameters\n}\n\n// Export the type definition for the function\nexport type SwitchVideoAltType = (\n options: SwitchVideoAltOptions\n) => Promise<void>\n\n/**\n * Switches the user's video device with alternate logic, taking into account recording state and camera access permissions.\n *\n * @param {SwitchVideoAltOptions} options - The parameters object containing necessary variables.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * switchVideoAlt({\n * parameters: {\n * recordStarted: true,\n * recordResumed: false,\n * recordStopped: false,\n * recordPaused: false,\n * recordingMediaOptions: 'video',\n * videoAlreadyOn: true,\n * currentFacingMode: 'user',\n * prevFacingMode: 'environment',\n * allowed: true,\n * audioOnlyRoom: false,\n * updateCurrentFacingMode: (mode) => setCurrentFacingMode(mode),\n * updatePrevFacingMode: (mode) => setPrevFacingMode(mode),\n * updateIsMediaSettingsModalVisible: (isVisible) => setMediaSettingsModal(isVisible),\n * showAlert: (alertOptions) => showAlert(alertOptions),\n * switchUserVideoAlt: switchUserVideoAltFunction,\n * }\n * });\n * ```\n */\n\nexport const switchVideoAlt = async ({\n parameters\n}: SwitchVideoAltOptions): Promise<void> => {\n let {\n recordStarted,\n recordResumed,\n recordStopped,\n recordPaused,\n recordingMediaOptions,\n videoAlreadyOn,\n currentFacingMode,\n prevFacingMode,\n allowed,\n audioOnlyRoom,\n updateCurrentFacingMode,\n updateIsMediaSettingsModalVisible,\n updatePrevFacingMode,\n\n showAlert,\n\n //media functions\n switchUserVideoAlt\n } = parameters\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: 'You cannot turn on your camera in an audio-only event.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n\n let checkoff = false\n if (\n (recordStarted || recordResumed) &&\n !recordStopped &&\n !recordPaused &&\n recordingMediaOptions === 'video'\n ) {\n checkoff = true\n }\n\n if (!allowed) {\n showAlert?.({\n message:\n 'Allow access to your camera by starting it for the first time.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n\n if (checkoff) {\n if (videoAlreadyOn) {\n showAlert?.({\n message: 'Please turn off your video before switching.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n } else {\n if (!videoAlreadyOn) {\n showAlert?.({\n message: 'Please turn on your video before switching.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n }\n\n // Camera switching logic\n prevFacingMode = currentFacingMode\n updatePrevFacingMode(prevFacingMode)\n\n currentFacingMode = currentFacingMode === 'environment' ? 'user' : 'environment'\n updateCurrentFacingMode(currentFacingMode)\n\n updateIsMediaSettingsModalVisible(false)\n await switchUserVideoAlt({\n videoPreference: currentFacingMode,\n checkoff,\n parameters\n })\n}\n","export interface LaunchWaitingOptions {\n updateIsWaitingModalVisible: (visible: boolean) => void\n isWaitingModalVisible: boolean\n}\n\nexport type LaunchWaitingType = (options: LaunchWaitingOptions) => void\n\n/**\n * Toggles the visibility of the waiting modal.\n *\n * @param {LaunchWaitingOptions} options - The options for toggling the waiting modal visibility.\n * @param {Function} options.updateIsWaitingModalVisible - Function to update the visibility state of the waiting modal.\n * @param {boolean} options.isWaitingModalVisible - Current visibility state of the waiting modal.\n *\n * @example\n * ```typescript\n * const options = {\n * updateIsWaitingModalVisible: (visible: boolean) => console.log('Waiting modal visibility updated:', visible),\n * isWaitingModalVisible: true,\n * }\n * launchWaiting(options)\n * ```\n */\nexport const launchWaiting: LaunchWaitingType = ({ updateIsWaitingModalVisible, isWaitingModalVisible }) => {\n updateIsWaitingModalVisible(!isWaitingModalVisible)\n}\n","import { Socket } from \"socket.io-client\";\nimport type { WaitingRoomParticipant } from \"../../types/types\";\n\nexport interface RespondToWaitingOptions {\n participantId: string;\n participantName: string;\n updateWaitingList: (waitingList: WaitingRoomParticipant[]) => void;\n waitingList?: WaitingRoomParticipant[];\n type: string | boolean;\n roomName: string;\n socket: Socket;\n}\n\n// Export the type definition for the function\nexport type RespondToWaitingType = (options: RespondToWaitingOptions) => Promise<void>;\n\n/**\n * Responds to a participant waiting to join a room by either allowing or denying their entry.\n *\n * @param {RespondToWaitingOptions} options - The options for responding to the waiting participant.\n * @param {string} options.participantId - The ID of the participant.\n * @param {string} options.participantName - The name of the participant.\n * @param {Function} options.updateWaitingList - The function to update the waiting list.\n * @param {WaitingRoomParticipant[]} options.waitingList - The current waiting list of participants.\n * @param {boolean | string} options.type - The type of response, either \"true\" or \"false\".\n * @param {string} options.roomName - The name of the room.\n * @param {Socket} options.socket - The socket instance to emit events.\n * \n * @example\n * ```typescript\n * const options = {\n * participantId: \"12345\",\n * participantName: \"John Doe\",\n * updateWaitingList: (list) => console.log(\"Updated Waiting List:\", list),\n * waitingList: [{ id: \"12345\", name: \"John Doe\" }],\n * type: true,\n * roomName: \"room1\",\n * socket: socketInstance,\n * };\n * respondToWaiting(options);\n * ```\n */\n\nexport const respondToWaiting = async ({\n participantId,\n participantName,\n updateWaitingList,\n waitingList = [],\n type,\n roomName,\n socket,\n}: RespondToWaitingOptions): Promise<void> => {\n if (!participantId || !participantName) {\n return;\n }\n\n if (!updateWaitingList) {\n console.warn('[respondToWaiting] Missing updateWaitingList handler; aborting emit.');\n return;\n }\n\n if (!socket || typeof (socket as Socket).emit !== 'function') {\n console.warn('[respondToWaiting] Socket is not ready; skipping emit.');\n return;\n }\n\n // Filter out the participant from the waiting list\n const newWaitingList = waitingList.filter((item) => item.name !== participantName);\n\n // Update the waiting list\n updateWaitingList(newWaitingList);\n\n const responseType = type === \"true\" || type === true ? \"true\" : \"false\";\n\n // Emit an event to allow or deny the participant based on the response type\n socket.emit(\"allowUserIn\", {\n participantId,\n participantName,\n type: responseType,\n roomName,\n });\n};\n","import { Socket } from 'socket.io-client';\nimport Cookies from 'universal-cookie';\nimport type { PreJoinPageParameters } from '../../types/types';\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10;\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours\n\n/**\n * Options for handleWelcomeRequest function\n */\nexport interface HandleWelcomeRequestOptions {\n apiUserName: string;\n apiToken: string;\n link: string;\n userName: string;\n parameters: PreJoinPageParameters;\n}\n\n/**\n * Validates alphanumeric strings\n */\nexport function validateAlphanumeric(str: string): boolean {\n if (str.length === 0) return true;\n const alphanumericRegex = /^[a-zA-Z0-9]+$/;\n return alphanumericRegex.test(str);\n}\n\n/**\n * Validates welcome page form inputs\n */\nexport interface ValidateWelcomeInputsOptions {\n name: string;\n secret: string;\n eventID: string;\n link: string;\n}\n\nexport function validateWelcomeInputs({\n name,\n secret,\n eventID,\n link,\n}: ValidateWelcomeInputsOptions): { valid: boolean; message?: string } {\n if (name.length === 0 || secret.length === 0 || eventID.length === 0 || link.length === 0) {\n return { valid: false, message: 'Please fill all the fields.' };\n }\n\n if (\n !validateAlphanumeric(name) ||\n !validateAlphanumeric(secret) ||\n !validateAlphanumeric(eventID) ||\n !link.includes('mediasfu.com') ||\n eventID.toLowerCase().startsWith('d')\n ) {\n return { valid: false, message: 'Please enter valid details.' };\n }\n\n if (\n secret.length != 64 ||\n name.length > 12 ||\n name.length < 2 ||\n eventID.length > 32 ||\n eventID.length < 8 ||\n link.length < 12\n ) {\n return { valid: false, message: 'Please enter valid details.' };\n }\n\n return { valid: true };\n}\n\n/**\n * Handles connection request with rate limiting for welcome page\n * \n * @param {HandleWelcomeRequestOptions} options - Configuration for the request\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleWelcomeRequest({\n * apiUserName: 'room123',\n * apiToken: 'secret123',\n * link: 'https://mediasfu.com/meeting',\n * userName: 'John Doe',\n * parameters,\n * });\n * ```\n */\nexport async function handleWelcomeRequest({\n apiUserName,\n apiToken,\n link,\n userName,\n parameters,\n}: HandleWelcomeRequestOptions): Promise<void> {\n const {\n showAlert,\n updateIsLoadingModalVisible,\n connectSocket,\n updateSocket,\n updateValidated,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n } = parameters;\n\n const TIMEOUT_DURATION = 10000; // 10 seconds\n\n let unsuccessfulAttempts = parseInt(cookies.get('unsuccessfulAttempts') || '0');\n let lastRequestTimestamp = parseInt(cookies.get('lastRequestTimestamp') || '0');\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n if (Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {\n showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n cookies.set('lastRequestTimestamp', Date.now().toString());\n return;\n } else {\n unsuccessfulAttempts = 0;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n }\n }\n\n try {\n updateIsLoadingModalVisible(true);\n\n const socketPromise = connectSocket({\n apiUserName,\n apiKey: '',\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Request timed out')), TIMEOUT_DURATION)\n );\n\n const socket = await Promise.race([socketPromise, timeoutPromise]);\n\n if (socket && socket instanceof Socket && socket.id) {\n unsuccessfulAttempts = 0;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateSocket(socket);\n updateApiUserName(apiUserName);\n updateApiToken(apiToken);\n updateLink(link);\n updateRoomName(apiUserName);\n updateMember(userName);\n updateValidated(true);\n } else {\n unsuccessfulAttempts += 1;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateIsLoadingModalVisible(false);\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n } else {\n showAlert?.({\n message: 'Invalid credentials.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch {\n showAlert?.({\n message: 'Unable to connect. Check your credentials and try again.',\n type: 'danger',\n duration: 3000,\n });\n\n unsuccessfulAttempts += 1;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateIsLoadingModalVisible(false);\n }\n}\n","import type { Socket } from 'socket.io-client';\nimport type { ShowAlert, WhiteboardUser } from '../../types/types';\n\n\nexport interface HandleStartWhiteboardOptions {\n socket: Socket;\n whiteboardUsers: WhiteboardUser[];\n roomName: string;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n showAlert?: ShowAlert;\n updateWhiteboardStarted: (started: boolean) => void;\n updateWhiteboardEnded: (ended: boolean) => void;\n updateIsConfigureWhiteboardModalVisible: (isVisible: boolean) => void;\n}\n\nexport type HandleStartWhiteboardType = (options: HandleStartWhiteboardOptions) => Promise<boolean>;\n\n/**\n * Handles the start of a whiteboard session.\n * @function\n * @param {HandleStartWhiteboardOptions} options - The options for starting the whiteboard.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {WhiteboardUser[]} options.whiteboardUsers - Array of users assigned to the whiteboard.\n * @param {string} options.roomName - The name of the room.\n * @param {boolean} options.whiteboardStarted - Whether the whiteboard has already started.\n * @param {boolean} options.whiteboardEnded - Whether the whiteboard has ended.\n * @param {ShowAlert} [options.showAlert] - Function to show alerts.\n * @param {Function} options.updateWhiteboardStarted - Function to update whiteboard started state.\n * @param {Function} options.updateWhiteboardEnded - Function to update whiteboard ended state.\n * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to close the configure modal.\n * @returns {Promise<boolean>}\n */\nexport const handleStartWhiteboard = async ({\n socket,\n whiteboardUsers,\n roomName,\n whiteboardStarted,\n whiteboardEnded,\n showAlert,\n updateWhiteboardStarted,\n updateWhiteboardEnded,\n updateIsConfigureWhiteboardModalVisible,\n}: HandleStartWhiteboardOptions): Promise<boolean> => {\n const emitName = whiteboardStarted && !whiteboardEnded ? 'updateWhiteboard' : 'startWhiteboard';\n const filteredWhiteboardUsers = whiteboardUsers.map(({ name, useBoard }) => ({ name, useBoard }));\n\n return new Promise((resolve) => {\n socket.emit(\n emitName,\n { whiteboardUsers: filteredWhiteboardUsers, roomName },\n (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({ message: 'Whiteboard active', type: 'success' });\n updateWhiteboardStarted(true);\n updateWhiteboardEnded(false);\n updateIsConfigureWhiteboardModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || 'Failed to start whiteboard', type: 'danger' });\n }\n resolve(response.success);\n }\n );\n });\n};\n","import type { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface HandleStopWhiteboardOptions {\n socket: Socket;\n roomName: string;\n showAlert?: ShowAlert;\n updateWhiteboardStarted: (started: boolean) => void;\n updateWhiteboardEnded: (ended: boolean) => void;\n updateIsConfigureWhiteboardModalVisible: (isVisible: boolean) => void;\n}\n\nexport type HandleStopWhiteboardType = (options: HandleStopWhiteboardOptions) => Promise<boolean>;\n\n/**\n * Handles stopping a whiteboard session.\n * @function\n * @param {HandleStopWhiteboardOptions} options - The options for stopping the whiteboard.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {string} options.roomName - The name of the room.\n * @param {ShowAlert} [options.showAlert] - Function to show alerts.\n * @param {Function} options.updateWhiteboardStarted - Function to update whiteboard started state.\n * @param {Function} options.updateWhiteboardEnded - Function to update whiteboard ended state.\n * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to close the configure modal.\n * @returns {Promise<boolean>}\n */\nexport const handleStopWhiteboard = async ({\n socket,\n roomName,\n showAlert,\n updateWhiteboardStarted,\n updateWhiteboardEnded,\n updateIsConfigureWhiteboardModalVisible,\n}: HandleStopWhiteboardOptions): Promise<boolean> => {\n return new Promise((resolve) => {\n socket.emit('stopWhiteboard', { roomName }, (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({ message: 'Whiteboard stopped', type: 'success' });\n updateWhiteboardStarted(false);\n updateWhiteboardEnded(true);\n updateIsConfigureWhiteboardModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || 'Failed to stop whiteboard', type: 'danger' });\n }\n resolve(response.success);\n });\n });\n};\n","export interface LaunchConfigureWhiteboardOptions {\n updateIsConfigureWhiteboardModalVisible: (visible: boolean) => void\n isConfigureWhiteboardModalVisible: boolean\n}\n\nexport type LaunchConfigureWhiteboardType = (options: LaunchConfigureWhiteboardOptions) => void\n\n/**\n * Toggles the visibility of the configure whiteboard modal.\n *\n * @param {LaunchConfigureWhiteboardOptions} options - The options for toggling the whiteboard modal visibility.\n * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to update the visibility state of the configure whiteboard modal.\n * @param {boolean} options.isConfigureWhiteboardModalVisible - Current visibility state of the configure whiteboard modal.\n *\n * @example\n * ```typescript\n * const options = {\n * updateIsConfigureWhiteboardModalVisible: (visible: boolean) => console.log('Modal visibility updated:', visible),\n * isConfigureWhiteboardModalVisible: false,\n * }\n * launchConfigureWhiteboard(options)\n * ```\n */\nexport const launchConfigureWhiteboard: LaunchConfigureWhiteboardType = ({\n updateIsConfigureWhiteboardModalVisible,\n isConfigureWhiteboardModalVisible,\n}) => {\n updateIsConfigureWhiteboardModalVisible(!isConfigureWhiteboardModalVisible)\n}\n"],"names":["mixStreams","dispStreams","temp","streame","stopShareScreen","requestScreenShare","reorderStreams","prepopulateUserMedia","getVideos","rePort","participant","trigger","connectRecvTransport","closeAndResize","validateAlphanumeric","receiveAllPipedTransports","createDeviceClient","consumerResume","connectSendTransportAudio","connectSendTransportVideo","connectSendTransportScreen","codec","connectSendTransport","parameters","processConsumerTransports","resumePauseStreams","readjust","addVideosGrid","checkGrid","getEstimate","resumePauseAudioStreams","getPipedProducersAlt","changeVids","compareActiveNames","compareScreenStates","startShareScreen","processConsumerTransportsAudio","breakRoom","onScreenChanges","stream","streamSuccessScreen","disconnectSendTransportScreen","createSendTransport","resumeSendTransportAudio","streamSuccessAudioSwitch","streamSuccessVideo","disconnectSendTransportVideo","checkPermission","autoAdjust","decode","cookies","MAX_ATTEMPTS","RATE_LIMIT_DURATION","calculateRowsAndColumns","signalNewConsumerTransport","response","switchUserAudio","switchUserVideo","switchUserVideoAlt","connectSocket"],"mappings":"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","x_google_ignoreList":[54]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/consumers/frameworkConsumerContract.ts","../src/consumers/addVideosGrid.ts","../src/consumers/consumerResume.ts","../src/consumers/changeVids.ts","../src/consumers/checkScreenShare.ts","../src/consumers/closeAndResize.ts","../src/consumers/compareActiveNames.ts","../src/consumers/compareScreenStates.ts","../src/sockets/SocketManager.ts","../src/consumers/signalNewConsumerTransport.ts","../src/consumers/socketReceiveMethods/newPipeProducer.ts","../src/consumers/socketReceiveMethods/producerClosed.ts","../src/methods/utils/validateAlphanumeric.ts","../src/producers/producerEmits/joinConRoom.ts","../src/consumers/socketReceiveMethods/joinConsumeRoom.ts","../src/consumers/connectIps.ts","../src/consumers/connectLocalIps.ts","../src/consumers/connectRecvTransport.ts","../src/consumers/connectSendTransport.ts","../src/consumers/connectSendTransportAudio.ts","../src/consumers/connectSendTransportScreen.ts","../src/consumers/connectSendTransportVideo.ts","../src/consumers/createSendTransport.ts","../src/consumers/disconnectSendTransportAudio.ts","../src/consumers/disconnectSendTransportScreen.ts","../src/consumers/disconnectSendTransportVideo.ts","../src/consumers/dispStreams.ts","../src/consumers/generatePageContent.ts","../src/consumers/getVideos.ts","../src/consumers/mixStreams.ts","../src/consumers/onScreenChanges.ts","../src/consumers/prepopulateUserMedia.ts","../src/consumers/processConsumerTransports.ts","../src/consumers/processConsumerTransportsAudio.ts","../src/consumers/readjust.ts","../src/consumers/receiveAllPipedTransports.ts","../src/consumers/reorderStreams.ts","../src/consumers/rePort.ts","../src/consumers/requestScreenShare.ts","../src/consumers/resumePauseAudioStreams.ts","../src/consumers/resumePauseStreams.ts","../src/consumers/reUpdateInter.ts","../src/consumers/startShareScreen.ts","../src/consumers/stopShareScreen.ts","../src/consumers/streamSuccessAudio.ts","../src/consumers/streamSuccessAudioSwitch.ts","../src/consumers/streamSuccessScreen.ts","../src/consumers/streamSuccessVideo.ts","../src/consumers/switchUserAudio.ts","../src/methods/stream/clickVideo.ts","../src/consumers/switchUserVideo.ts","../src/consumers/switchUserVideoAlt.ts","../src/consumers/trigger.ts","../src/methods/breakoutRooms/breakoutRoomUpdated.ts","../src/methods/settings/modifySettings.ts","../node_modules/universal-cookie/esm/index.mjs","../src/methods/utils/checkLimitsAndMakeRequest.ts","../src/methods/requests/hostRequestResponse.ts","../src/methods/stream/clickAudio.ts","../src/methods/stream/clickScreenShare.ts","../src/methods/recording/timeLeftRecording.ts","../src/methods/whiteboard/captureCanvasStream.ts","../src/ProducerClient/producerClientEmits/createDeviceClient.ts","../src/producers/producerEmits/joinRoom.ts","../src/ProducerClient/producerClientEmits/joinRoomClient.ts","../src/methods/utils/producer/videoCaptureConstraints.ts","../src/methods/utils/producer/hParams.ts","../src/methods/utils/producer/vParams.ts","../src/methods/utils/producer/screenParams.ts","../src/methods/utils/producer/aParams.ts","../src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts","../src/methods/utils/resolveMediaSFURoomApi.ts","../src/methods/utils/joinRoomOnMediaSFU.ts","../src/producers/producerEmits/joinLocalRoom.ts","../src/consumers/autoAdjust.ts","../src/consumers/calculateRowsAndColumns.ts","../src/consumers/checkGrid.ts","../src/consumers/checkPermission.ts","../src/consumers/controlMedia.ts","../src/consumers/getEstimate.ts","../src/consumers/getPipedProducersAlt.ts","../src/consumers/getProducersPiped.ts","../src/consumers/receiveRoomMessages.ts","../src/consumers/resumeSendTransportAudio.ts","../src/consumers/updateMiniCardsGrid.ts","../src/consumers/updateParticipantAudioDecibels.ts","../src/consumers/gridLayout/addVideosGrid.engine.ts","../src/consumers/gridLayout/prepopulateUserMedia.engine.ts","../src/consumers/translationConsumerSwitch.ts","../src/methods/background/launchBackground.ts","../src/methods/breakoutRooms/handleStartBreakout.ts","../src/methods/breakoutRooms/handleStopBreakout.ts","../src/methods/breakoutRooms/launchBreakoutRooms.ts","../src/methods/coHost/launchCoHost.ts","../src/methods/coHostMethods/modifyCoHostSettings.ts","../src/methods/displaySettings/launchDisplaySettings.ts","../src/methods/displaySettings/modifyDisplaySettings.ts","../src/methods/exit/confirmExit.ts","../src/methods/exit/launchConfirmExit.ts","../src/methods/mediaSettings/launchMediaSettings.ts","../src/methods/menu/launchMenuModal.ts","../src/methods/message/launchMessages.ts","../src/methods/message/sendMessage.ts","../src/methods/participants/launchParticipants.ts","../src/methods/participants/messageParticipants.ts","../src/methods/participants/muteParticipants.ts","../src/methods/participants/removeParticipants.ts","../src/methods/panelists/launchPanelists.ts","../src/methods/panelists/updatePanelists.ts","../src/methods/panelists/focusPanelists.ts","../src/methods/permissions/launchPermissions.ts","../src/methods/permissions/updateParticipantPermission.ts","../src/methods/permissions/updatePermissionConfig.ts","../src/methods/polls/handleCreatePoll.ts","../src/methods/polls/handleEndPoll.ts","../src/methods/polls/handleVotePoll.ts","../src/methods/polls/launchPoll.ts","../src/methods/polls/pollUpdated.ts","../src/methods/prejoin/handleCreateRoom.ts","../src/methods/prejoin/handleJoinRoom.ts","../src/methods/recording/checkPauseState.ts","../src/methods/recording/checkResumeState.ts","../src/methods/recording/confirmRecording.ts","../src/methods/recording/launchRecording.ts","../src/methods/recording/recordPauseTimer.ts","../src/methods/recording/recordUpdateTimer.ts","../src/methods/recording/recordResumeTimer.ts","../src/methods/recording/recordStartTimer.ts","../src/methods/recording/startRecording.ts","../src/methods/recording/stopRecording.ts","../src/methods/recording/updateRecording.ts","../src/methods/requests/launchRequests.ts","../src/methods/requests/respondToRequests.ts","../src/methods/settings/launchSettings.ts","../src/methods/stream/switchAudio.ts","../src/methods/stream/switchVideo.ts","../src/methods/stream/switchVideoAlt.ts","../src/methods/stream/clickChat.ts","../src/methods/utils/liveSubtitle.ts","../src/methods/utils/translationLanguages.ts","../src/methods/utils/SoundPlayer.ts","../src/methods/utils/getOverlayPosition.ts","../src/methods/utils/getModalPosition.ts","../src/methods/utils/sleep.ts","../src/methods/utils/formatNumber.ts","../src/methods/utils/generateRandomMessages.ts","../src/methods/utils/generateRandomParticipants.ts","../src/methods/utils/generateRandomPolls.ts","../src/methods/utils/generateRandomRequestList.ts","../src/methods/utils/generateRandomWaitingRoomList.ts","../src/methods/utils/initialValuesState.ts","../src/methods/utils/webrtc.ts","../src/methods/utils/createResponseJoinRoom.ts","../src/methods/utils/createRoomOnMediaSFU.ts","../src/methods/utils/meetingTimer/startMeetingProgressTimer.ts","../src/methods/utils/meetingTimeRemaining.ts","../src/methods/socketReceive/allWaitingRoomMembers.ts","../src/methods/socketReceive/allMembers.ts","../src/methods/socketReceive/allMembersRest.ts","../src/methods/socketReceive/banParticipant.ts","../src/methods/socketReceive/controlMediaHost.ts","../src/methods/socketReceive/disconnect.ts","../src/methods/socketReceive/disconnectUserSelf.ts","../src/methods/socketReceive/getDomains.ts","../src/methods/socketReceive/meetingEnded.ts","../src/methods/socketReceive/meetingStillThere.ts","../src/methods/socketReceive/panelistReceiveMethods.ts","../src/methods/socketReceive/participantRequested.ts","../src/methods/socketReceive/permissionReceiveMethods.ts","../src/methods/socketReceive/personJoined.ts","../src/methods/socketReceive/producerMediaClosed.ts","../src/methods/socketReceive/producerMediaPaused.ts","../src/methods/socketReceive/producerMediaResumed.ts","../src/methods/socketReceive/receiveMessage.ts","../src/methods/socketReceive/recordingNotice.ts","../src/methods/socketReceive/reInitiateRecording.ts","../src/methods/socketReceive/roomRecordParams.ts","../src/methods/socketReceive/screenProducerId.ts","../src/methods/socketReceive/startRecords.ts","../src/methods/socketReceive/stoppedRecording.ts","../src/methods/socketReceive/translationReceiveMethods.ts","../src/methods/socketReceive/updateMediaSettings.ts","../src/methods/socketReceive/updateConsumingDomains.ts","../src/methods/socketReceive/updatedCoHost.ts","../src/methods/socketReceive/userWaiting.ts","../src/methods/waiting/launchWaiting.ts","../src/methods/waiting/respondToWaiting.ts","../src/methods/welcome/handleWelcomeRequest.ts","../src/methods/whiteboard/handleStartWhiteboard.ts","../src/methods/whiteboard/handleStopWhiteboard.ts","../src/methods/whiteboard/launchConfigureWhiteboard.ts"],"sourcesContent":["export const createFrameworkConsumerContractError = (consumerName: string): Error => {\n return new Error(\n `${consumerName} is a render-coupled consumer helper and has no shared runtime implementation. ` +\n `Inject the framework-specific ${consumerName} implementation instead of calling the shared fallback export.`\n );\n};","// Stub export for addVideosGrid\n// This is a React component in the original and not needed for the shared package\n\nimport { createFrameworkConsumerContractError } from './frameworkConsumerContract';\n\nexport interface AddVideosGridParameters {\n [key: string]: any;\n}\n\nexport interface AddVideosGridOptions {\n parameters: AddVideosGridParameters;\n [key: string]: any; // Accept any additional properties\n}\n\nexport type AddVideosGridType = (options: AddVideosGridOptions) => Promise<void>;\n\nexport const addVideosGrid: AddVideosGridType = async () => {\n throw createFrameworkConsumerContractError('addVideosGrid');\n};\n","// Stub export for consumerResume\n// This is a React component in the original and not needed for the shared package\n\nimport { Socket } from 'socket.io-client';\nimport { createFrameworkConsumerContractError } from './frameworkConsumerContract';\n\nexport interface ConsumerResumeParameters {\n [key: string]: any;\n}\n\nexport interface ConsumerResumeOptions {\n track: MediaStreamTrack;\n kind: string;\n remoteProducerId: string;\n params: any;\n parameters: ConsumerResumeParameters;\n nsock: Socket;\n consumer?: any; // mediasoup Consumer\n}\n\nexport type ConsumerResumeType = (options: ConsumerResumeOptions) => Promise<void>;\n\nexport const consumerResume: ConsumerResumeType = async () => {\n throw createFrameworkConsumerContractError('consumerResume');\n};\n","\n \nimport { Stream, Participant, AudioDecibels, EventType } from \"../types/types\";\n\ninterface ChangeVidsStreamLike {\n producerId?: string | null;\n audioID?: string | null;\n name?: string;\n muted?: boolean | null;\n stream?: unknown;\n}\n\ninterface ChangeVidsParticipantLike {\n name: string;\n islevel?: string | null;\n videoID?: string | null;\n audioID?: string | null;\n muted?: boolean | null;\n breakRoom?: number | null;\n stream?: unknown;\n}\n\ninterface BreakoutParticipantLike {\n name: string;\n breakRoom?: number | null;\n}\n\ninterface AudioDecibelLike {\n name: string;\n averageLoudness?: number | null;\n}\n\ntype BooleanUpdater = (value: boolean) => void;\ntype NumberUpdater = (value: number) => void;\ntype StringListUpdater = (names: string[]) => void;\n\ntype EntryArrayUpdater<TEntry> = {\n bivarianceHack: (entries: TEntry[]) => void;\n}[\"bivarianceHack\"];\n\ntype EntryMatrixUpdater<TEntry> = {\n bivarianceHack: (entries: TEntry[][]) => void;\n}[\"bivarianceHack\"];\n\ntype MixStreamsInvoker<TEntry, TParticipant> = (options: {\n alVideoStreams: TEntry[];\n non_alVideoStreams: TParticipant[];\n ref_participants: TEntry[];\n}) => Promise<TEntry[]>;\n\ntype DispStreamsInvoker = (options: {\n lStreams: any[];\n ind: number;\n auto?: boolean;\n parameters: any;\n breakRoom?: number;\n inBreakRoom?: boolean;\n ChatSkip?: boolean;\n forChatCard?: any;\n forChatID?: any;\n}) => Promise<void>;\n\nexport interface ChangeVidsParameters<\n TStream extends ChangeVidsStreamLike = Stream,\n TParticipant extends ChangeVidsParticipantLike = Participant,\n TBreakoutParticipant extends BreakoutParticipantLike = BreakoutParticipantLike,\n TAudioDecibel extends AudioDecibelLike = AudioDecibels,\n TMediaHandle = unknown,\n> {\n\n allVideoStreams: (TStream | TParticipant)[];\n p_activeNames: string[];\n activeNames: string[];\n dispActiveNames: string[];\n shareScreenStarted: boolean;\n shared: boolean;\n newLimitedStreams: (TStream | TParticipant)[];\n non_alVideoStreams: TParticipant[];\n ref_participants: TParticipant[];\n participants: TParticipant[];\n eventType: EventType;\n islevel: string;\n member: string;\n sortAudioLoudness: boolean;\n audioDecibels: TAudioDecibel[];\n mixed_alVideoStreams: (TStream | TParticipant)[];\n non_alVideoStreams_muted: TParticipant[];\n remoteProducerId?: string;\n localStreamVideo: TMediaHandle | null;\n oldAllStreams: (TStream | TParticipant)[];\n screenPageLimit: number;\n meetingDisplayType: string;\n meetingVideoOptimized: boolean;\n recordingVideoOptimized: boolean;\n recordingDisplayType: \"video\" | \"media\" | \"all\";\n paginatedStreams: (TStream | TParticipant)[][];\n itemPageLimit: number;\n doPaginate: boolean;\n prevDoPaginate: boolean;\n currentUserPage: number;\n breakoutRooms: TBreakoutParticipant[][];\n hostNewRoom: number;\n breakOutRoomStarted: boolean;\n breakOutRoomEnded: boolean;\n virtualStream: TMediaHandle | null;\n mainRoomsLength: number;\n memberRoom: number;\n updateP_activeNames: StringListUpdater;\n updateActiveNames: StringListUpdater;\n updateDispActiveNames: StringListUpdater;\n updateNewLimitedStreams: EntryArrayUpdater<TStream | TParticipant>;\n updateNon_alVideoStreams: EntryArrayUpdater<TParticipant>;\n updateRef_participants: EntryArrayUpdater<TParticipant>;\n updateSortAudioLoudness: BooleanUpdater;\n updateMixed_alVideoStreams: EntryArrayUpdater<TStream | TParticipant>;\n updateNon_alVideoStreams_muted: EntryArrayUpdater<TParticipant>;\n updatePaginatedStreams: EntryMatrixUpdater<TStream | TParticipant>;\n updateDoPaginate: BooleanUpdater;\n updatePrevDoPaginate: BooleanUpdater;\n updateCurrentUserPage: NumberUpdater;\n updateNumberPages: NumberUpdater;\n updateMainRoomsLength: NumberUpdater;\n updateMemberRoom: NumberUpdater;\n\n // mediasfu functions\n mixStreams: MixStreamsInvoker<TStream | TParticipant, TParticipant>;\n dispStreams: DispStreamsInvoker;\n getUpdatedAllParams: () => ChangeVidsParameters<TStream, TParticipant, TBreakoutParticipant, TAudioDecibel, TMediaHandle>;\n [key: string]: any;\n\n}\n\nexport interface ChangeVidsOptions<\n TParameters extends ChangeVidsParameters<any, any, any, any, any> = ChangeVidsParameters,\n> {\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\n// Export the type definition for the function\nexport type ChangeVidsType = <\n TParameters extends ChangeVidsParameters<any, any, any, any, any> = ChangeVidsParameters,\n>(options: ChangeVidsOptions<TParameters>) => Promise<void>;\n\n/**\n * Asynchronously changes the video streams based on the provided options.\n *\n * @function\n * @param {ChangeVidsOptions} options - The options for changing video streams.\n * @param {boolean} [options.screenChanged=false] - Indicates if the screen has changed.\n * @param {ChangeVidsParameters} options.parameters - The parameters for changing video streams.\n * @returns {Promise<void>} A promise that resolves when the video streams have been changed.\n *\n * @typedef {Object} ChangeVidsOptions\n * @property {Function} getUpdatedAllParams - Function to get updated parameters.\n * @property {Array} allVideoStreams - Array of all video streams.\n * @property {Array} p_activeNames - Array of active participant names.\n * @property {Array} activeNames - Array of active names.\n * @property {Array} dispActiveNames - Array of displayed active names.\n * @property {boolean} shareScreenStarted - Indicates if screen sharing has started.\n * @property {boolean} shared - Indicates if the screen is shared.\n * @property {Array} newLimitedStreams - Array of new limited streams.\n * @property {Array} non_alVideoStreams - Array of non-al video streams.\n * @property {Array} ref_participants - Array of reference participants.\n * @property {Array} participants - Array of participants.\n * @property {string} eventType - Type of the event.\n * @property {string} islevel - Level of the participant.\n * @property {string} member - Name of the member.\n * @property {boolean} sortAudioLoudness - Indicates if audio loudness should be sorted.\n * @property {Array} audioDecibels - Array of audio decibels.\n * @property {Array} mixed_alVideoStreams - Array of mixed al video streams.\n * @property {Array} non_alVideoStreams_muted - Array of muted non-al video streams.\n * @property {string} remoteProducerId - ID of the remote producer.\n * @property {Object} localStreamVideo - Local stream video object.\n * @property {Array} oldAllStreams - Array of old all streams.\n * @property {number} screenPageLimit - Limit of streams per screen page.\n * @property {string} meetingDisplayType - Type of meeting display.\n * @property {boolean} meetingVideoOptimized - Indicates if meeting video is optimized.\n * @property {boolean} recordingVideoOptimized - Indicates if recording video is optimized.\n * @property {string} recordingDisplayType - Type of recording display.\n * @property {Array} paginatedStreams - Array of paginated streams.\n * @property {number} itemPageLimit - Limit of items per page.\n * @property {boolean} doPaginate - Indicates if pagination should be done.\n * @property {boolean} prevDoPaginate - Indicates if pagination was previously done.\n * @property {number} currentUserPage - Current user page number.\n * @property {Array} breakoutRooms - Array of breakout rooms.\n * @property {number} hostNewRoom - Index of the new room for the host.\n * @property {boolean} breakOutRoomStarted - Indicates if breakout room has started.\n * @property {boolean} breakOutRoomEnded - Indicates if breakout room has ended.\n * @property {Object} virtualStream - Virtual stream object.\n * @property {number} mainRoomsLength - Length of main rooms.\n * @property {number} memberRoom - Room of the member.\n * @property {Function} updateP_activeNames - Function to update active participant names.\n * @property {Function} updateActiveNames - Function to update active names.\n * @property {Function} updateDispActiveNames - Function to update displayed active names.\n * @property {Function} updateNewLimitedStreams - Function to update new limited streams.\n * @property {Function} updateNon_alVideoStreams - Function to update non-al video streams.\n * @property {Function} updateRef_participants - Function to update reference participants.\n * @property {Function} updateSortAudioLoudness - Function to update audio loudness sorting.\n * @property {Function} updateMixed_alVideoStreams - Function to update mixed al video streams.\n * @property {Function} updateNon_alVideoStreams_muted - Function to update muted non-al video streams.\n * @property {Function} updatePaginatedStreams - Function to update paginated streams.\n * @property {Function} updateDoPaginate - Function to update pagination status.\n * @property {Function} updatePrevDoPaginate - Function to update previous pagination status.\n * @property {Function} updateCurrentUserPage - Function to update current user page.\n * @property {Function} updateNumberPages - Function to update number of pages.\n * @property {Function} updateMainRoomsLength - Function to update main rooms length.\n * @property {Function} updateMemberRoom - Function to update member room.\n * @property {Function} mixStreams - Function to mix streams.\n * @property {Function} dispStreams - Function to display streams.\n * \n * @example\n * const options = {\n * screenChanged: false,\n * parameters: {\n * getUpdatedAllParams: () => updatedParameters,\n * allVideoStreams: allStreams,\n * p_activeNames: activeNames,\n * activeNames: activeNames,\n * dispActiveNames: displayedActiveNames,\n * shareScreenStarted: false,\n * shared: false,\n * newLimitedStreams: limitedStreams,\n * non_alVideoStreams: nonAlStreams,\n * ref_participants: referenceParticipants,\n * participants: participants,\n * eventType: \"conference\",\n * islevel: \"2\",\n * member: \"John Doe\",\n * sortAudioLoudness: true,\n * audioDecibels: audioLevels,\n * mixed_alVideoStreams: mixedStreams,\n * non_alVideoStreams_muted: mutedNonAlStreams,\n * remoteProducerId: \"12345\",\n * localStreamVideo: localStream,\n * oldAllStreams: oldStreams,\n * screenPageLimit: 10,\n * meetingDisplayType: \"video\",\n * meetingVideoOptimized: true,\n * recordingVideoOptimized: false,\n * recordingDisplayType: \"video\",\n * paginatedStreams: paginatedStreams,\n * itemPageLimit: 10,\n * doPaginate: true,\n * prevDoPaginate: false,\n * currentUserPage: 1,\n * breakoutRooms: breakoutRooms,\n * hostNewRoom: 0,\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: false,\n * virtualStream: virtualStream,\n * mainRoomsLength: 2,\n * memberRoom: 0,\n * updateP_activeNames: (names) => updateActiveNames(names),\n * updateActiveNames: (names) => updateActiveNames(names),\n * updateDispActiveNames: (names) => updateDispActiveNames(names),\n * updateNewLimitedStreams: (streams) => updateNewLimitedStreams(streams),\n * updateNon_alVideoStreams: (participants) => updateNon_alVideoStreams(participants),\n * updateRef_participants: (participants) => updateRef_participants(participants),\n * updateSortAudioLoudness: (sort) => updateSortAudioLoudness(sort),\n * updateMixed_alVideoStreams: (streams) => updateMixed_alVideoStreams(streams),\n * updateNon_alVideoStreams_muted: (participants) => updateNon_alVideoStreams_muted(participants),\n * updatePaginatedStreams: (streams) => updatePaginatedStreams(streams),\n * updateDoPaginate: (paginate) => updateDoPaginate(paginate),\n * updatePrevDoPaginate: (paginate) => updatePrevDoPaginate(paginate),\n * updateCurrentUserPage: (page) => updateCurrentUserPage(page),\n * updateNumberPages: (pages) => updateNumberPages(pages),\n * updateMainRoomsLength: (length) => updateMainRoomsLength(length),\n * updateMemberRoom: (room) => updateMemberRoom(room),\n * mixStreams: mixStreams,\n * dispStreams: dispStreams,\n * },\n * };\n * \n * changeVids(options)\n * .then(() => {\n * console.log('Video streams changed successfully');\n * });\n */\n\nexport const changeVids = async <\n TParameters extends ChangeVidsParameters<any, any, any, any, any> = ChangeVidsParameters,\n>({ screenChanged = false, parameters }: ChangeVidsOptions<TParameters>): Promise<void> => {\n const { getUpdatedAllParams } = parameters;\n const updatedParameters = getUpdatedAllParams() as TParameters;\n\n let {\n allVideoStreams,\n p_activeNames,\n activeNames,\n dispActiveNames,\n shareScreenStarted,\n shared,\n newLimitedStreams,\n non_alVideoStreams,\n ref_participants,\n participants,\n eventType,\n islevel,\n member,\n sortAudioLoudness,\n audioDecibels,\n mixed_alVideoStreams,\n non_alVideoStreams_muted,\n remoteProducerId,\n localStreamVideo,\n oldAllStreams,\n screenPageLimit,\n meetingDisplayType,\n meetingVideoOptimized,\n recordingVideoOptimized,\n recordingDisplayType,\n paginatedStreams,\n itemPageLimit,\n doPaginate,\n prevDoPaginate,\n currentUserPage,\n breakoutRooms,\n hostNewRoom,\n breakOutRoomStarted,\n breakOutRoomEnded,\n virtualStream,\n mainRoomsLength,\n memberRoom,\n updateP_activeNames,\n updateActiveNames,\n updateDispActiveNames,\n updateNewLimitedStreams,\n updateNon_alVideoStreams,\n updateRef_participants,\n updateSortAudioLoudness,\n updateMixed_alVideoStreams,\n updateNon_alVideoStreams_muted,\n updatePaginatedStreams,\n updateDoPaginate,\n updatePrevDoPaginate,\n updateCurrentUserPage,\n updateNumberPages,\n updateMainRoomsLength,\n updateMemberRoom,\n mixStreams,\n dispStreams,\n } = updatedParameters;\n\n try {\n let alVideoStreams = [...allVideoStreams];\n p_activeNames = [...activeNames];\n\n let streame;\n\n if (shareScreenStarted || shared) {\n alVideoStreams = [...newLimitedStreams];\n activeNames = [];\n }\n\n activeNames = [];\n dispActiveNames = [];\n ref_participants = participants;\n\n let temp = alVideoStreams;\n\n await Promise.all(\n temp.map(async (stream) => {\n let participant = ref_participants.find(\n (obj) => obj.videoID === stream.producerId\n );\n if (!participant && stream.producerId !== \"youyou\" && stream.producerId !== \"youyouyou\") {\n alVideoStreams = alVideoStreams.filter(\n (obj) => obj.producerId !== stream.producerId\n );\n }\n })\n );\n\n if (eventType === \"broadcast\" || eventType === \"chat\") {\n sortAudioLoudness = false;\n }\n\n if (shareScreenStarted || shared) {\n non_alVideoStreams = [];\n non_alVideoStreams_muted = [];\n mixed_alVideoStreams = [];\n } else {\n if (alVideoStreams.length > screenPageLimit) {\n alVideoStreams = alVideoStreams.filter(\n (obj) => obj.producerId !== \"youyou\" && obj.producerId !== \"youyouyou\"\n );\n\n ref_participants = ref_participants.sort((a, b) => (a.muted ?? false) > (b.muted ?? false) ? 1 : -1\n );\n\n let temp: (Stream | Participant)[] = [];\n await Promise.all(\n ref_participants.map((participant) => {\n let stream = alVideoStreams.find(\n (obj) => obj.producerId === participant.videoID\n );\n if (stream) {\n temp.push(stream);\n }\n })\n );\n\n alVideoStreams = temp;\n\n let youyou = allVideoStreams.find(\n (obj) => obj.producerId === \"youyou\"\n );\n if (!youyou) {\n let youyouyou = allVideoStreams.find(\n (obj) => obj.producerId === \"youyouyou\"\n );\n alVideoStreams.unshift(youyouyou!);\n } else {\n alVideoStreams.unshift(youyou!);\n }\n }\n\n const admin = participants.filter(\n (participant) => participant.islevel === \"2\"\n );\n let adminName = \"\";\n if (admin.length > 0) {\n adminName = admin[0].name || \"\";\n }\n\n non_alVideoStreams = [];\n\n await Promise.all(\n ref_participants.map(async (participant) => {\n let stream = alVideoStreams.find(\n (obj) => obj.producerId === participant.videoID\n );\n if (eventType !== \"chat\" && eventType !== \"conference\") {\n if (!stream && participant.name !== member && !participant.muted && participant.name !== adminName) {\n non_alVideoStreams.push(participant);\n }\n } else {\n if (!stream && participant.name !== member && !participant.muted) {\n non_alVideoStreams.push(participant);\n }\n }\n })\n );\n\n if (sortAudioLoudness) {\n non_alVideoStreams.sort((a, b) => {\n const avgLoudnessA =\n audioDecibels.find((obj) => obj.name === a.name)?.averageLoudness || 127;\n const avgLoudnessB =\n audioDecibels.find((obj) => obj.name === b.name)?.averageLoudness || 127;\n return avgLoudnessB - avgLoudnessA;\n });\n\n if (\n !(meetingDisplayType === \"video\" && meetingVideoOptimized) ||\n !(recordingVideoOptimized && recordingDisplayType === \"video\")\n ) {\n mixed_alVideoStreams = await mixStreams({\n alVideoStreams,\n non_alVideoStreams,\n ref_participants\n });\n }\n }\n\n non_alVideoStreams_muted = [];\n await Promise.all(\n ref_participants.map(async (participant) => {\n let stream = alVideoStreams.find(\n (obj) => obj.producerId === participant.videoID\n );\n if (eventType !== \"chat\" && eventType !== \"conference\") {\n if (!stream && participant.name !== member && participant.muted && participant.name !== adminName) {\n non_alVideoStreams_muted.push(participant);\n }\n } else {\n if (!stream && participant.name !== member && participant.muted) {\n non_alVideoStreams_muted.push(participant);\n }\n }\n })\n );\n }\n\n if (eventType === \"conference\" && islevel !== \"2\") {\n let host = participants.find((obj) => obj.islevel === \"2\");\n if (host) {\n remoteProducerId = host.videoID!;\n if (islevel === \"2\") {\n host.stream = virtualStream || localStreamVideo;\n } else {\n let hostVideo = alVideoStreams.find(\n (obj) => obj.producerId === remoteProducerId\n );\n if (!hostVideo) {\n streame = oldAllStreams.find(\n (streame) => streame.producerId === remoteProducerId\n );\n if (streame) {\n alVideoStreams = alVideoStreams.filter(\n (obj) => obj.producerId !== host.videoID\n );\n non_alVideoStreams = non_alVideoStreams.filter(\n (obj) => obj.name !== host.name\n );\n non_alVideoStreams_muted = non_alVideoStreams_muted.filter(\n (obj) => obj.name !== host.name\n );\n if (sortAudioLoudness) {\n mixed_alVideoStreams = mixed_alVideoStreams.filter(\n (obj) => obj.name !== host.name\n );\n non_alVideoStreams_muted = non_alVideoStreams_muted.filter(\n (obj) => obj.name !== host.name\n );\n if (meetingDisplayType == \"video\" && meetingVideoOptimized) {\n alVideoStreams.unshift(streame);\n } else {\n mixed_alVideoStreams.unshift(streame);\n }\n } else {\n alVideoStreams.unshift(streame);\n }\n } else {\n await Promise.all(\n ref_participants.map(async (participant) => {\n let stream = alVideoStreams.find(\n (obj) =>\n obj.producerId == participant.videoID &&\n participant.name == host.name\n );\n if (stream) {\n if (sortAudioLoudness) {\n mixed_alVideoStreams = mixed_alVideoStreams.filter(\n (obj) => obj.name !== host.name\n );\n non_alVideoStreams_muted =\n non_alVideoStreams_muted.filter(\n (obj) => obj.name !== host.name\n );\n mixed_alVideoStreams.unshift(participant);\n } else {\n non_alVideoStreams = non_alVideoStreams.filter(\n (obj) => obj.name !== host.name\n );\n non_alVideoStreams.unshift(participant);\n return;\n }\n }\n })\n );\n }\n }\n }\n }\n }\n\n let allStreamsPaged: (Stream | Participant)[] = [];\n if (sortAudioLoudness) {\n if (meetingDisplayType === \"video\") {\n if (meetingVideoOptimized) {\n allStreamsPaged = [...alVideoStreams];\n } else {\n allStreamsPaged = [...mixed_alVideoStreams];\n }\n } else if (meetingDisplayType === \"media\") {\n allStreamsPaged = [...mixed_alVideoStreams];\n } else if (meetingDisplayType === \"all\") {\n allStreamsPaged = [...mixed_alVideoStreams, ...non_alVideoStreams_muted];\n }\n } else {\n if (meetingDisplayType === \"video\") {\n allStreamsPaged = [...alVideoStreams];\n } else if (meetingDisplayType === \"media\") {\n allStreamsPaged = [...alVideoStreams, ...non_alVideoStreams];\n } else if (meetingDisplayType === \"all\") {\n allStreamsPaged = [\n ...alVideoStreams,\n ...non_alVideoStreams,\n ...non_alVideoStreams_muted,\n ];\n }\n }\n\n paginatedStreams = [];\n let limit = itemPageLimit;\n\n if (shareScreenStarted || shared) {\n limit = screenPageLimit;\n }\n\n let firstPage: (Stream | Participant)[] = [];\n let page: (Stream | Participant)[] = [];\n let limit_ = limit + 1;\n\n if (eventType === \"conference\" && !shared && !shareScreenStarted) {\n limit_ = limit_ - 1;\n }\n\n // Create pagination\n let memberInRoom = false;\n let filterHost = false;\n if (breakOutRoomStarted && !breakOutRoomEnded) {\n let tempBreakoutRooms = JSON.parse(JSON.stringify(breakoutRooms));\n let host = participants.find((obj) => obj.islevel == \"2\");\n for (let room of tempBreakoutRooms) {\n try {\n let currentStreams: (Stream | Participant)[] = [];\n const roomIndex = tempBreakoutRooms.indexOf(room);\n if (hostNewRoom != -1 && roomIndex == hostNewRoom) {\n if (host) {\n if (!room.map((obj: any) => obj.name).includes(host.name)) {\n room = [...room, { name: host.name, breakRoom: roomIndex }];\n filterHost = true;\n }\n }\n }\n for (let participant of room) {\n if (participant.name == member && !memberInRoom) {\n memberInRoom = true;\n memberRoom = participant.breakRoom;\n updateMemberRoom(memberRoom);\n }\n let streams = allStreamsPaged.filter((stream) => {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream['audioID'] != null &&\n stream['audioID'] !== \"\")) {\n let producerId = stream.producerId || stream['audioID'];\n let matchingParticipant = ref_participants.find(\n (obj) => obj['audioID'] === producerId ||\n obj.videoID === producerId ||\n ((producerId == \"youyou\" || producerId == \"youyouyou\") &&\n member == participant.name)\n );\n return (\n (matchingParticipant &&\n matchingParticipant.name === participant.name) ||\n (participant.name == member &&\n (producerId == \"youyou\" || producerId == \"youyouyou\"))\n );\n } else {\n return (\n Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name == participant.name\n );\n }\n });\n for (let stream of streams) {\n if (currentStreams.length < limit_) {\n currentStreams.push(stream);\n }\n }\n }\n paginatedStreams.push(currentStreams);\n } catch {\n // handle error\n }\n }\n\n let remainingStreams = allStreamsPaged.filter((stream) => {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream['audioID'] != null &&\n stream['audioID'] !== \"\")) {\n let producerId = stream.producerId || stream['audioID'];\n let matchingParticipant = ref_participants.find(\n (obj) => obj['audioID'] === producerId ||\n obj.videoID === producerId ||\n ((producerId == \"youyou\" || producerId == \"youyouyou\") &&\n member == obj.name)\n );\n return (\n matchingParticipant &&\n !breakoutRooms!\n .flat()\n .map((obj) => obj.name)\n .includes(matchingParticipant.name) &&\n (!filterHost || matchingParticipant.name != host!.name)\n );\n } else {\n return (\n !breakoutRooms!\n .flat()\n .map((obj) => obj.name)\n .includes(stream.name ?? '') &&\n (!filterHost || stream.name != host!.name)\n );\n }\n });\n\n if (memberInRoom) {\n let memberStream = allStreamsPaged.find((stream) => {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n return (\n stream.producerId == \"youyou\" || stream.producerId == \"youyouyou\"\n );\n }\n return false; // Add a return statement here\n });\n if (memberStream && !remainingStreams.includes(memberStream)) {\n remainingStreams.unshift(memberStream);\n }\n }\n let remainingPaginatedStreams: (Stream | Participant)[][] = [];\n\n if (remainingStreams.length > 0) {\n firstPage = remainingStreams.slice(0, limit_);\n remainingPaginatedStreams.push(firstPage);\n for (let i = limit_; i < remainingStreams.length; i += limit) {\n page = remainingStreams.slice(i, i + limit);\n remainingPaginatedStreams.push(page);\n }\n }\n\n mainRoomsLength = remainingPaginatedStreams.length;\n updateMainRoomsLength(mainRoomsLength);\n // Add the remaining streams to the beginning of the paginatedStreams\n for (let i = remainingPaginatedStreams.length - 1; i >= 0; i--) {\n paginatedStreams.unshift(remainingPaginatedStreams[i]);\n }\n } else {\n firstPage = allStreamsPaged.slice(0, limit_);\n paginatedStreams.push(firstPage);\n\n for (let i = limit_; i < allStreamsPaged.length; i += limit) {\n page = allStreamsPaged.slice(i, i + limit);\n paginatedStreams.push(page);\n }\n }\n\n // State updates\n updateP_activeNames(p_activeNames);\n updateActiveNames(activeNames);\n updateDispActiveNames(dispActiveNames);\n updateNewLimitedStreams(newLimitedStreams);\n updateNon_alVideoStreams(non_alVideoStreams);\n updateRef_participants(ref_participants);\n updateSortAudioLoudness(sortAudioLoudness);\n updateMixed_alVideoStreams(mixed_alVideoStreams);\n updateNon_alVideoStreams_muted(non_alVideoStreams_muted);\n updatePaginatedStreams(paginatedStreams);\n\n prevDoPaginate = doPaginate;\n doPaginate = false;\n updatePrevDoPaginate(prevDoPaginate);\n updateDoPaginate(doPaginate);\n\n let isActive = false;\n\n if (paginatedStreams.length > 1) {\n if (!shareScreenStarted && !shared) {\n doPaginate = true;\n }\n updateDoPaginate(doPaginate);\n\n if (currentUserPage > paginatedStreams.length - 1) {\n if (breakOutRoomStarted && !breakOutRoomEnded) {\n currentUserPage = 0;\n } else {\n currentUserPage = paginatedStreams.length - 1;\n }\n } else if (currentUserPage == 0) {\n isActive = true;\n }\n updateCurrentUserPage(currentUserPage);\n updateNumberPages(paginatedStreams.length - 1);\n\n if (screenChanged) {\n await dispStreams({\n lStreams: paginatedStreams[0],\n ind: 0,\n parameters,\n });\n } else {\n await dispStreams({\n lStreams: paginatedStreams[0],\n ind: 0,\n auto: true,\n parameters,\n });\n }\n\n if (!isActive) {\n const currentPageBreak = currentUserPage - mainRoomsLength;\n await dispStreams({\n lStreams: paginatedStreams[currentUserPage],\n ind: currentUserPage,\n parameters,\n breakRoom: currentPageBreak,\n inBreakRoom: currentPageBreak >= 0,\n });\n }\n } else {\n currentUserPage = 0;\n updateCurrentUserPage(currentUserPage);\n\n if (screenChanged) {\n await dispStreams({\n lStreams: paginatedStreams[0],\n ind: 0,\n parameters,\n });\n } else {\n await dispStreams({\n lStreams: paginatedStreams[0],\n ind: 0,\n auto: true,\n parameters,\n });\n }\n }\n } catch (error) {\n console.log(\"changeVids error\", error);\n }\n};\n","import { StopShareScreenType, StopShareScreenParameters, RequestScreenShareType, RequestScreenShareParameters, ShowAlert } from \"../types/types\";\nexport interface CheckScreenShareParameters extends StopShareScreenParameters, RequestScreenShareParameters {\n shared: boolean;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n breakOutRoomStarted: boolean;\n breakOutRoomEnded: boolean;\n showAlert?: ShowAlert;\n\n // Mediasfu functions\n stopShareScreen: StopShareScreenType;\n requestScreenShare: RequestScreenShareType;\n \n getUpdatedAllParams : () => CheckScreenShareParameters;\n [key: string]: any;\n}\n\nexport interface CheckScreenShareOptions {\n parameters: CheckScreenShareParameters;\n}\n\n// Export the type definition for the function\nexport type CheckScreenShareType = (options: CheckScreenShareOptions) => Promise<void>;\n\n/**\n * Checks the current screen sharing status and either stops or requests screen sharing based on the provided parameters.\n * \n * @param {CheckScreenShareOptions} options - The options for checking screen share.\n * @param {Object} options.parameters - The parameters for screen sharing.\n * @param {boolean} options.parameters.shared - Indicates if the screen is currently being shared.\n * @param {Function} [options.parameters.showAlert] - Function to show alerts.\n * @param {boolean} options.parameters.whiteboardStarted - Indicates if the whiteboard session has started.\n * @param {boolean} options.parameters.whiteboardEnded - Indicates if the whiteboard session has ended.\n * @param {boolean} options.parameters.breakOutRoomStarted - Indicates if the breakout room session has started.\n * @param {boolean} options.parameters.breakOutRoomEnded - Indicates if the breakout room session has ended.\n * @param {Function} options.parameters.stopShareScreen - Function to stop screen sharing.\n * @param {Function} options.parameters.requestScreenShare - Function to request screen sharing.\n * \n * @returns {Promise<void>} A promise that resolves when the screen sharing status has been checked and the appropriate action has been taken.\n * \n * @throws Will log an error message if an error occurs during the process.\n * \n * @example\n * const options = {\n * parameters: {\n * shared: false,\n * showAlert: showAlertFunction,\n * whiteboardStarted: false,\n * whiteboardEnded: false,\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: false,\n * stopShareScreen: stopShareScreenFunction,\n * requestScreenShare: requestScreenShareFunction,\n * },\n * };\n * \n * checkScreenShare(options)\n * .then(() => {\n * console.log('Screen share checked successfully');\n * })\n * .catch((error) => {\n * console.error('Error checking screen share:', error);\n * });\n */\n\nexport async function checkScreenShare({ parameters }: CheckScreenShareOptions): Promise<void> {\n try {\n const {\n shared,\n showAlert,\n whiteboardStarted,\n whiteboardEnded,\n breakOutRoomStarted,\n breakOutRoomEnded,\n\n //mediasfu functions\n stopShareScreen,\n requestScreenShare,\n } = parameters;\n\n // Stop screen share if already shared or request screen share if not shared\n if (shared) {\n if (whiteboardStarted && !whiteboardEnded) {\n showAlert?.({\n message: \"Screen share is not allowed when whiteboard is active\",\n type: \"danger\",\n });\n return;\n }\n await stopShareScreen({ parameters });\n } else {\n // Can't share if breakout room is active\n if (breakOutRoomStarted && !breakOutRoomEnded) {\n showAlert?.({\n message: \"Screen share is not allowed when breakout room is active\",\n type: \"danger\",\n });\n return;\n }\n\n if (whiteboardStarted && !whiteboardEnded) {\n showAlert?.({\n message: \"Screen share is not allowed when whiteboard is active\",\n type: \"danger\",\n });\n return;\n }\n await requestScreenShare({ parameters });\n }\n } catch (error) {\n console.log(\"checkScreenShare error\", error);\n // throw error;\n }\n}\n","import {\n Stream, Participant, ReorderStreamsType, ReorderStreamsParameters, PrepopulateUserMediaParameters,\n PrepopulateUserMediaType, GetVideosType, RePortType, RePortParameters, EventType\n} from '../types/types';\n\n\n \n\nexport interface CloseAndResizeParameters extends ReorderStreamsParameters, PrepopulateUserMediaParameters, RePortParameters {\n allAudioStreams: (Stream | Participant)[];\n allVideoStreams: (Stream | Participant)[];\n activeNames: string[];\n participants: Participant[];\n streamNames: Stream[];\n recordingDisplayType: \"video\" | \"media\" | \"all\";\n recordingVideoOptimized: boolean;\n adminIDStream?: string;\n newLimitedStreams: (Stream | Participant)[];\n newLimitedStreamsIDs: string[];\n oldAllStreams: (Stream | Participant)[];\n shareScreenStarted: boolean;\n shared: boolean;\n meetingDisplayType: string;\n defer_receive: boolean;\n lock_screen: boolean;\n firstAll: boolean;\n first_round: boolean;\n gotAllVids: boolean;\n eventType: EventType;\n hostLabel: string;\n shareEnded: boolean;\n updateMainWindow: boolean;\n updateActiveNames: (activeNames: string[]) => void;\n updateAllAudioStreams: (allAudioStreams: (Stream | Participant)[]) => void;\n updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n updateNewLimitedStreams: (newLimitedStreams: (Stream | Participant)[]) => void;\n updateOldAllStreams: (oldAllStreams: (Stream | Participant)[]) => void;\n updateDefer_receive: (defer_receive: boolean) => void;\n updateMainHeightWidth: (heightWidth: number) => void;\n updateShareEnded: (shareEnded: boolean) => void;\n updateLock_screen: (lock_screen: boolean) => void;\n updateFirstAll: (firstAll: boolean) => void;\n updateFirst_round: (first_round: boolean) => void;\n\n // mediasfu functions\n reorderStreams: ReorderStreamsType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n getVideos: GetVideosType;\n rePort: RePortType;\n getUpdatedAllParams: () => CloseAndResizeParameters;\n [key: string]: any;\n}\n\nexport interface CloseAndResizeOptions {\n producerId: string;\n kind: string;\n parameters: CloseAndResizeParameters;\n}\n\n// Export the type definition for the function\nexport type CloseAndResizeType = (options: CloseAndResizeOptions) => Promise<void>;\n\n\n/**\n * Closes and resizes the video and audio elements based on the provided options.\n *\n * @param {CloseAndResizeOptions} options - The options for closing and resizing.\n * @param {string} options.producerId - The ID of the producer.\n * @param {string} options.kind - The kind of media (audio, video, screenshare, or screen).\n * @param {object} options.parameters - The parameters for the operation.\n * @param {function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {Array} options.parameters.allAudioStreams - Array of all audio streams.\n * @param {Array} options.parameters.allVideoStreams - Array of all video streams.\n * @param {Array} options.parameters.activeNames - Array of active participant names.\n * @param {Array} options.parameters.participants - Array of participants.\n * @param {Array} options.parameters.streamNames - Array of stream names.\n * @param {string} options.parameters.recordingDisplayType - Type of recording display.\n * @param {boolean} options.parameters.recordingVideoOptimized - Whether recording is video optimized.\n * @param {string} options.parameters.adminIDStream - ID of the admin stream.\n * @param {Array} options.parameters.newLimitedStreams - Array of new limited streams.\n * @param {Array} options.parameters.newLimitedStreamsIDs - Array of new limited stream IDs.\n * @param {Array} options.parameters.oldAllStreams - Array of old all streams.\n * @param {boolean} options.parameters.shareScreenStarted - Whether screen sharing has started.\n * @param {boolean} options.parameters.shared - Whether sharing is active.\n * @param {string} options.parameters.meetingDisplayType - Type of meeting display.\n * @param {boolean} options.parameters.defer_receive - Whether to defer receiving.\n * @param {boolean} options.parameters.lock_screen - Whether the screen is locked.\n * @param {boolean} options.parameters.firstAll - Whether it is the first all.\n * @param {boolean} options.parameters.first_round - Whether it is the first round.\n * @param {boolean} options.parameters.gotAllVids - Whether all videos are received.\n * @param {string} options.parameters.eventType - Type of event.\n * @param {string} options.parameters.hostLabel - Label of the host.\n * @param {boolean} options.parameters.shareEnded - Whether sharing has ended.\n * @param {boolean} options.parameters.updateMainWindow - Whether to update the main window.\n * @param {function} options.parameters.updateActiveNames - Function to update active names.\n * @param {function} options.parameters.updateAllAudioStreams - Function to update all audio streams.\n * @param {function} options.parameters.updateAllVideoStreams - Function to update all video streams.\n * @param {function} options.parameters.updateShareScreenStarted - Function to update share screen started status.\n * @param {function} options.parameters.updateUpdateMainWindow - Function to update main window status.\n * @param {function} options.parameters.updateNewLimitedStreams - Function to update new limited streams.\n * @param {function} options.parameters.updateOldAllStreams - Function to update old all streams.\n * @param {function} options.parameters.updateDefer_receive - Function to update defer receive status.\n * @param {function} options.parameters.updateMainHeightWidth - Function to update main height and width.\n * @param {function} options.parameters.updateShareEnded - Function to update share ended status.\n * @param {function} options.parameters.updateLock_screen - Function to update lock screen status.\n * @param {function} options.parameters.updateFirstAll - Function to update first all status.\n * @param {function} options.parameters.updateFirst_round - Function to update first round status.\n * @param {function} options.parameters.reorderStreams - Function to reorder streams.\n * @param {function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {function} options.parameters.getVideos - Function to get videos.\n * @param {function} options.parameters.rePort - Function to report.\n *\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n * \n * @example\n * const options = {\n * producerId: 'producerId',\n * kind: 'video',\n * parameters: {\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * allAudioStreams: [],\n * allVideoStreams: [],\n * activeNames: [],\n * participants: [],\n * streamNames: [],\n * recordingDisplayType: 'video',\n * recordingVideoOptimized: true,\n * adminIDStream: 'adminId',\n * newLimitedStreams: [],\n * newLimitedStreamsIDs: [],\n * oldAllStreams: [],\n * shareScreenStarted: false,\n * shared: false,\n * meetingDisplayType: 'video',\n * defer_receive: false,\n * lock_screen: false,\n * firstAll: false,\n * first_round: false,\n * gotAllVids: false,\n * eventType: 'conference',\n * hostLabel: 'host',\n * shareEnded: false,\n * updateMainWindow: true,\n * updateActiveNames: updateActiveNamesFunction,\n * updateAllAudioStreams: updateAllAudioStreamsFunction,\n * updateAllVideoStreams: updateAllVideoStreamsFunction,\n * updateShareScreenStarted: updateShareScreenStartedFunction,\n * updateUpdateMainWindow: updateUpdateMainWindowFunction,\n * updateNewLimitedStreams: updateNewLimitedStreamsFunction,\n * updateOldAllStreams: updateOldAllStreamsFunction,\n * updateDefer_receive: updateDefer_receiveFunction,\n * updateMainHeightWidth: updateMainHeightWidthFunction,\n * updateShareEnded: updateShareEndedFunction,\n * updateLock_screen: updateLock_screenFunction,\n * updateFirstAll: updateFirstAllFunction,\n * updateFirst_round: updateFirst_roundFunction,\n * reorderStreams: reorderStreamsFunction,\n * prepopulateUserMedia: prepopulateUserMediaFunction,\n * getVideos: getVideosFunction,\n * rePort: rePortFunction,\n * },\n * };\n * \n * closeAndResize(options)\n * .then(() => {\n * console.log('Closed and resized successfully');\n * });\n */\n\n\nexport const closeAndResize = async ({ producerId, kind, parameters }: CloseAndResizeOptions): Promise<void> => {\n\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n allAudioStreams,\n allVideoStreams,\n activeNames,\n participants,\n streamNames,\n recordingDisplayType,\n recordingVideoOptimized,\n adminIDStream,\n newLimitedStreams,\n newLimitedStreamsIDs,\n oldAllStreams,\n shareScreenStarted,\n shared,\n meetingDisplayType,\n defer_receive,\n lock_screen,\n firstAll,\n first_round,\n gotAllVids,\n eventType,\n\n hostLabel,\n shareEnded,\n updateMainWindow,\n updateActiveNames,\n updateAllAudioStreams,\n updateAllVideoStreams,\n\n updateShareScreenStarted,\n updateUpdateMainWindow,\n updateNewLimitedStreams,\n updateOldAllStreams,\n updateDefer_receive,\n updateMainHeightWidth,\n updateShareEnded,\n updateLock_screen,\n updateFirstAll,\n updateFirst_round,\n\n //mediasfu functions\n reorderStreams,\n prepopulateUserMedia,\n getVideos,\n rePort,\n } = parameters;\n\n //function to close and resize the video and audio elements\n\n let participant: Participant | undefined;\n\n if (kind === \"audio\") {\n //stop the audio by removing the miniAudio with id = producerId\n\n //remove the audio from the allAudioStreams array\n allAudioStreams = allAudioStreams.filter(function (audioStream) {\n return audioStream.producerId !== producerId;\n });\n\n updateAllAudioStreams(allAudioStreams);\n\n if (recordingDisplayType == \"video\" && recordingVideoOptimized == true) {\n // optimize the video display\n } else {\n //get the name of the participant with the producerId\n participant = participants.find(\n (obj) => obj.audioID === producerId\n );\n\n if (participant) {\n //check if the participants videoID is not null or \"\"\n if (participant.videoID !== null && participant.videoID !== \"\") {\n // found a participant with the producerId\n } else {\n //remove the participant from the activeNames array\n activeNames = activeNames.filter(function (name) {\n return name !== participant!.name;\n });\n updateActiveNames(activeNames);\n }\n }\n }\n\n let checker = false;\n let alt_checker = false;\n\n if (meetingDisplayType == \"video\") {\n checker =\n participant![0].videoID != null &&\n participant![0].videoID != \"\" &&\n participant![0].videoID != undefined;\n } else {\n checker = true;\n alt_checker = true;\n }\n\n if (checker) {\n if (shareScreenStarted || shared) {\n if (!alt_checker) {\n await reorderStreams({ parameters });\n }\n } else {\n if (alt_checker && meetingDisplayType != \"video\") {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n }\n } else if (kind === \"video\") {\n //update the video elements by removing the miniVideo with id = producerId\n //remove the video from the allVideoStreams array\n\n //check if producerId == adminidstream\n if (producerId == adminIDStream) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n }\n\n try {\n allVideoStreams = allVideoStreams.filter(function (videoStream) {\n return videoStream.producerId !== producerId;\n });\n\n updateAllVideoStreams(allVideoStreams);\n\n try {\n //try remove it from oldVideoStreams\n oldAllStreams = oldAllStreams.filter(function (videoStream) {\n return videoStream.producerId !== producerId;\n });\n\n updateOldAllStreams(oldAllStreams);\n } catch { // Handle error\n }\n\n try {\n //try remove it from newLimitedStreams\n newLimitedStreams = newLimitedStreams.filter(function (\n videoStream\n ) {\n return videoStream.producerId !== producerId;\n });\n\n updateNewLimitedStreams(newLimitedStreams);\n } catch {\n // Handle error\n }\n } catch {\n try {\n //try remove it from oldVideoStreams\n oldAllStreams = oldAllStreams.filter(function (videoStream) {\n return videoStream.producerId !== producerId;\n });\n updateOldAllStreams(oldAllStreams);\n } catch {\n // Handle error\n }\n }\n\n try {\n //remove the participant from activeNames\n activeNames = activeNames.filter(function (name) {\n //get the participant with the producerId\n let participant = streamNames.find(\n (obj) => obj.producerId === producerId\n );\n\n return name !== participant!['name'];\n });\n\n updateActiveNames(activeNames);\n } catch {\n // Handle error\n }\n\n if (lock_screen) {\n defer_receive = true;\n // check if the video is the one being displayed (i.e. (newLimitedStreamsIDs))\n if (newLimitedStreamsIDs.includes(producerId)) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n } else {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n } else if (kind === \"screenshare\" || kind === \"screen\") {\n //update the video elements by removing the mainVideo with id = producerId\n updateMainWindow = true;\n\n //screenshare stuff\n shareScreenStarted = false;\n shareEnded = true;\n\n lock_screen = false;\n firstAll = false;\n first_round = false;\n\n updateUpdateMainWindow(updateMainWindow);\n updateShareScreenStarted(shareScreenStarted);\n updateShareEnded(shareEnded);\n updateLock_screen(lock_screen);\n updateFirstAll(firstAll);\n updateFirst_round(first_round);\n\n if (!gotAllVids || defer_receive) {\n defer_receive = false;\n updateDefer_receive(defer_receive);\n await getVideos({\n participants,\n allVideoStreams,\n oldAllStreams,\n updateAllVideoStreams,\n updateOldAllStreams,\n });\n await rePort({ parameters });\n }\n\n if (eventType == \"conference\") {\n updateMainHeightWidth(0);\n }\n\n await prepopulateUserMedia({ name: hostLabel, parameters });\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n}","import { TriggerType, TriggerParameters } from '../types/types';\n\nexport interface CompareActiveNamesParameters extends TriggerParameters {\n activeNames: string[];\n prevActiveNames: string[];\n updateActiveNames: (activeNames: string[]) => void;\n updatePrevActiveNames: (prevActiveNames: string[]) => void;\n\n // mediasfu functions\n trigger: TriggerType;\n getUpdatedAllParams: () => CompareActiveNamesParameters;\n [key: string]: any;\n}\n\nexport interface CompareActiveNamesOptions {\n restart?: boolean;\n parameters: CompareActiveNamesParameters;\n}\n\n// Export the type definition for the function\nexport type CompareActiveNamesType = (options: CompareActiveNamesOptions) => Promise<void>;\n\n/**\n * Compares the current active names with the previous active names and triggers an action if there are changes.\n *\n * @param {CompareActiveNamesOptions} options - The options for comparing active names.\n * @param {boolean} [options.restart=false] - Whether to restart the comparison.\n * @param {CompareActiveNamesParameters} options.parameters - The parameters for the comparison.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {string[]} options.parameters.activeNames - The current active names.\n * @param {string[]} options.parameters.prevActiveNames - The previous active names.\n * @param {Function} options.parameters.updatePrevActiveNames - Function to update the previous active names.\n * @param {Function} options.parameters.trigger - Function to trigger an action when names change.\n *\n * @returns {Promise<void>} A promise that resolves when the comparison is complete.\n *\n * @throws Will log an error message if an error occurs during the comparison.\n * \n * @example\n * const options = {\n * restart: false,\n * parameters: {\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * activeNames: ['name1', 'name2'],\n * prevActiveNames: ['name1'],\n * updatePrevActiveNames: updatePrevActiveNamesFunction,\n * trigger: triggerFunction,\n * },\n * };\n * \n * compareActiveNames(options)\n * .then(() => {\n * console.log('Active names compared successfully');\n * });\n */\n\nexport async function compareActiveNames({\n restart = false,\n parameters,\n}: CompareActiveNamesOptions): Promise<void> {\n try {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n const {\n activeNames,\n prevActiveNames,\n updatePrevActiveNames,\n\n //mediasfu functions\n trigger,\n } = parameters;\n\n // Restart the comparison if needed\n if (restart) {\n await trigger({ ref_ActiveNames: activeNames, parameters });\n return;\n }\n\n // Array to track changes in activeNames\n const nameChanged: boolean[] = [];\n\n // Compare each name in activeNames\n for (let i = 0; i < activeNames.length; i++) {\n const currentName = activeNames[i];\n\n // Check if the name is present in prevActiveNames\n const hasNameChanged = !prevActiveNames.includes(currentName);\n\n if (hasNameChanged) {\n nameChanged.push(true);\n await trigger({ ref_ActiveNames: activeNames, parameters });\n break;\n }\n }\n\n // Count the number of `true` in nameChanged\n const count = nameChanged.filter((value) => value === true).length;\n\n if (count < 1) {\n // Check for new names in prevActiveNames\n for (let i = 0; i < prevActiveNames.length; i++) {\n const currentName = prevActiveNames[i];\n\n // Check if the name is present in activeNames\n const hasNameChanged = !activeNames.includes(currentName);\n\n // Signal change if the name is new\n if (hasNameChanged) {\n await trigger({ ref_ActiveNames: activeNames, parameters });\n break;\n }\n }\n }\n\n // Update prevActiveNames with current activeNames\n updatePrevActiveNames([...activeNames]);\n } catch (error) {\n console.log(\"compareActiveNames error\", error);\n // throw error; (Optional: Keep or remove depending on your error handling strategy)\n }\n}\n","import { ScreenState, TriggerType, TriggerParameters } from '../types/types';\n\nexport interface CompareScreenStatesParameters extends TriggerParameters {\n recordingDisplayType: 'video' | 'media' | 'all';\n recordingVideoOptimized: boolean;\n screenStates: ScreenState[];\n prevScreenStates: ScreenState[];\n activeNames: string[];\n\n // mediasfu functions\n trigger: TriggerType;\n getUpdatedAllParams: () => CompareScreenStatesParameters;\n [key: string]: any;\n}\n\nexport interface CompareScreenStatesOptions {\n restart?: boolean;\n parameters: CompareScreenStatesParameters;\n}\n\n// Export the type definition for the function\nexport type CompareScreenStatesType = (options: CompareScreenStatesOptions) => Promise<void>;\n\n/**\n * Compares the current screen states with the previous screen states and triggers actions based on changes.\n *\n * @param {CompareScreenStatesOptions} options - The options for comparing screen states.\n * @param {boolean} [options.restart=false] - Whether to restart the comparison process.\n * @param {CompareScreenStatesParameters} options.parameters - The parameters for the comparison.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {string} options.parameters.recordingDisplayType - The type of display being recorded.\n * @param {boolean} options.parameters.recordingVideoOptimized - Whether the recording is optimized for video.\n * @param {Array<ScreenState>} options.parameters.screenStates - The current screen states.\n * @param {Array<ScreenState>} options.parameters.prevScreenStates - The previous screen states.\n * @param {Array<string>} options.parameters.activeNames - The active names in the current context.\n * @param {Function} options.parameters.trigger - Function to trigger actions based on changes.\n *\n * @returns {Promise<void>} A promise that resolves when the comparison and any triggered actions are complete.\n *\n * @throws Will log an error message if an error occurs during the comparison process.\n * \n * @example\n * const options = {\n * restart: false,\n * parameters: {\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * recordingDisplayType: 'video',\n * recordingVideoOptimized: true,\n * screenStates: [{ key1: 'value1' }, { key2: 'value2' }],\n * prevScreenStates: [{ key1: 'value1' }, { key2: 'value2' }],\n * activeNames: ['name1', 'name2'],\n * trigger: triggerFunction,\n * },\n * };\n * \n * compareScreenStates(options)\n * .then(() => {\n * console.log('Screen states compared successfully');\n * });\n */\n\nexport async function compareScreenStates({\n restart = false,\n parameters,\n}: CompareScreenStatesOptions): Promise<void> {\n try {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n const {\n recordingDisplayType,\n recordingVideoOptimized,\n screenStates,\n prevScreenStates,\n activeNames,\n\n //mediasfu functions\n trigger,\n } = parameters;\n\n // Restart the comparison if needed\n if (restart) {\n // Perform necessary actions on restart\n return;\n }\n\n // Compare each key-value pair in the screenStates objects\n for (let i = 0; i < screenStates.length; i++) {\n const currentScreenState = screenStates[i];\n const prevScreenState = prevScreenStates[i];\n\n // Check if any value has changed\n const hasChanged = (Object.keys(currentScreenState) as (keyof ScreenState)[]).some(\n (key) => currentScreenState[key] !== prevScreenState[key]\n );\n\n // Signal change if any value has changed\n if (hasChanged) {\n // Perform actions or trigger events based on the change\n if (recordingDisplayType === 'video') {\n if (recordingVideoOptimized) {\n await trigger({\n ref_ActiveNames: activeNames,\n parameters,\n });\n break;\n }\n }\n await trigger({ ref_ActiveNames: activeNames, parameters });\n break;\n }\n }\n } catch (error) {\n console.log('compareScreenStates error', error);\n // Optionally re-throw the error for further handling\n }\n}\n","\n// Socket manager for media socket.\nimport { MeetingRoomParams, RecordingParams } from '../types/types';\nimport io, { Socket } from 'socket.io-client'; // Importing socket type\n\n/**\n * Validates the provided API key or token.\n * @param {string} value - The API key or token to validate.\n * @returns {Promise<Boolean>} - True if the API key or token is valid, false otherwise.\n */\nasync function validateApiKeyToken(value: string): Promise<boolean> {\n // API key or token must be alphanumeric and length 64\n if (!/^[a-z0-9]{64}$/i.test(value)) {\n throw new Error('Invalid API key or token.');\n }\n return true;\n}\n\nexport interface ResponseLocalConnection {\n socket?: Socket;\n data?: ResponseLocalConnectionData;\n}\n\nexport interface ResponseLocalConnectionData {\n socketId: string;\n mode: string;\n apiUserName?: string;\n apiKey?: string;\n allowRecord: boolean;\n meetingRoomParams_: MeetingRoomParams;\n recordingParams_: RecordingParams;\n}\n\nexport interface ConnectLocalSocketOptions {\n link: string;\n}\n\nexport interface ConnectSocketOptions {\n apiUserName: string;\n apiKey?: string;\n apiToken?: string;\n link: string;\n}\n\nexport interface DisconnectSocketOptions {\n socket: Socket;\n}\n\n// Export the type definition for the function\nexport type ConnectSocketType = (options: ConnectSocketOptions) => Promise<Socket>;\nexport type DisconnectSocketType = (options: DisconnectSocketOptions) => Promise<boolean>;\nexport type ConnectLocalSocketType = (options: ConnectLocalSocketOptions) => Promise<ResponseLocalConnection>;\n\n\n/**\n * Connects to a media socket using the provided connection options.\n *\n * @param {ConnectSocketOptions} options - The connection options.\n * @param {string} options.apiUserName - The API username.\n * @param {string} [options.apiKey] - The API key (optional if apiToken is provided).\n * @param {string} [options.apiToken] - The API token (optional if apiKey is provided).\n * @param {string} options.link - The socket link.\n *\n * @returns {Promise<Socket>} A promise that resolves to the connected socket.\n *\n * @example\n * ```typescript\n * const options = {\n * apiUserName: 'user123',\n * apiKey: 'yourApiKeyHere',\n * link: 'https://socketlink.com',\n * };\n *\n * try {\n * const socket = await connectSocket(options);\n * console.log('Connected to socket:', socket);\n * } catch (error) {\n * console.error('Failed to connect to socket:', error);\n * }\n * ```\n */\n\nasync function connectSocket(\n { apiUserName, apiKey, apiToken, link }: ConnectSocketOptions,\n): Promise<Socket> {\n // Validate inputs\n if (!apiUserName) {\n throw new Error('API username required.');\n }\n if (!(apiKey || apiToken)) {\n throw new Error('API key or token required.');\n }\n if (!link) {\n throw new Error('Socket link required.');\n }\n\n // Validate the API key or token\n let useKey = false;\n try {\n if (apiKey && apiKey.length === 64) {\n await validateApiKeyToken(apiKey);\n useKey = true;\n } else if (apiToken && apiToken.length === 64) {\n await validateApiKeyToken(apiToken);\n useKey = false;\n } else {\n throw new Error('Invalid API key or token format.');\n }\n } catch {\n throw new Error('Invalid API key or token.');\n }\n\n let socket: Socket;\n\n return new Promise((resolve, reject) => {\n // Connect to socket using the link provided\n if (useKey) {\n socket = io(`${link}/media`, {\n transports: ['websocket'],\n query: {\n apiUserName: apiUserName,\n apiKey: apiKey!,\n },\n });\n } else {\n socket = io(`${link}/media`, {\n transports: ['websocket'],\n query: {\n apiUserName: apiUserName,\n apiToken: apiToken!,\n },\n });\n }\n\n // Handle socket connection events\n socket.on('connection-success', ({ socketId }: { socketId: string }) => {\n //check if link contains mediasfu.com and contains more than one c\n let conn = 'media';\n try {\n if (link.includes('mediasfu.com') && (link.match(/c/g)?.length ?? 0) > 1) {\n conn = 'consume';\n }\n } catch {\n // do nothing\n }\n\n console.log(`Connected to ${conn} socket with ID: ${socketId}`);\n resolve(socket);\n });\n\n socket.on('connect_error', (error: Error) => {\n reject(new Error('Error connecting to media socket: ' + error.message));\n });\n });\n}\n\n\n/**\n * Connects to a local media socket using the provided connection options.\n *\n * @param {ConnectLocalSocketOptions} options - The connection options.\n * @param {string} options.link - The socket link.\n *\n * @returns {Promise<ResponseLocalConnection>} A promise that resolves to the connected socket and data.\n *\n * @example\n * ```typescript\n * const options = {\n * link: 'http://localhost:3000',\n * };\n *\n * try {\n * const { socket, data } = await connectLocalSocket(options);\n * console.log('Connected to socket:', socket, data);\n * } catch (error) {\n * console.error('Failed to connect to socket:', error);\n * }\n * ```\n */\n\nasync function connectLocalSocket({ link }: ConnectLocalSocketOptions): Promise<ResponseLocalConnection> {\n if (!link) {\n throw new Error('Socket link required.');\n }\n\n let socket: Socket;\n\n return new Promise((resolve, reject) => {\n // Connect to socket using the link provided\n socket = io(`${link}/media`, {\n transports: ['websocket'],\n });\n\n\n // Handle socket connection events\n socket.on('connection-success', (data: ResponseLocalConnectionData) => {\n resolve({ socket, data });\n });\n\n socket.on('connect_error', (error: Error) => {\n reject(new Error('Error connecting to media socket: ' + error.message));\n });\n });\n}\n\n/**\n * Disconnects from the socket.\n *\n * @param {Socket} socket - The socket instance to disconnect.\n * @returns {Promise<boolean>} - A promise that resolves once the socket is disconnected.\n *\n * @example\n * ```typescript\n * const options = { socket: socketInstance };\n *\n * try {\n * const isDisconnected = await disconnectSocket(options);\n * console.log('Disconnected:', isDisconnected);\n * } catch (error) {\n * console.error('Failed to disconnect:', error);\n * }\n * ```\n */\n\nasync function disconnectSocket({ socket }: DisconnectSocketOptions): Promise<boolean> {\n if (socket) {\n socket.disconnect();\n }\n return true;\n}\n\nexport { connectSocket, disconnectSocket, connectLocalSocket };\n","import { Socket } from \"socket.io-client\";\nimport { ReorderStreamsParameters, ReorderStreamsType, ConnectRecvTransportType,\n ConnectRecvTransportParameters, CreateWebRTCTransportResponse } from \"../types/types\";\nimport type { Device, DtlsParameters } from 'mediasoup-client/lib/types';\n\nexport interface SignalNewConsumerTransportParameters extends ReorderStreamsParameters, ConnectRecvTransportParameters {\n device: Device | null;\n consumingTransports: string[];\n lock_screen: boolean;\n updateConsumingTransports: (transports: string[]) => void;\n connectRecvTransport: ConnectRecvTransportType;\n reorderStreams: ReorderStreamsType;\n getUpdatedAllParams: () => SignalNewConsumerTransportParameters;\n [key: string]: any;\n}\n\nexport interface SignalNewConsumerTransportOptions {\n remoteProducerId: string;\n islevel: string;\n nsock: Socket;\n parameters: SignalNewConsumerTransportParameters;\n}\n\n// Export the type definition for the function\nexport type SignalNewConsumerTransportType = (options: SignalNewConsumerTransportOptions) => Promise<string[] | void>;\n\n/**\n * Signals the creation of a new consumer transport.\n * \n * @param {SignalNewConsumerTransportOptions} options - The options for signaling a new consumer transport.\n * @param {string} options.remoteProducerId - The ID of the remote producer.\n * @param {string} options.islevel - Indicates the level of the consumer.\n * @param {Socket} options.nsock - The socket instance for communication.\n * @param {SignalNewConsumerTransportParameters} options.parameters - The parameters for the transport.\n * \n * @returns {Promise<string[] | void>} A promise that resolves to an array of consuming transports or void.\n * \n * @throws Will throw an error if the signaling process fails.\n * \n * @example\n * const options = {\n * remoteProducerId: 'producer-id',\n * islevel: '1',\n * nsock: socketInstance,\n * parameters: {\n * device: mediaDevice,\n * consumingTransports: [],\n * lock_screen: false,\n * updateConsumingTransports: updateFunction,\n * connectRecvTransport: connectFunction,\n * reorderStreams: reorderFunction,\n * getUpdatedAllParams: getUpdatedParamsFunction,\n * },\n * };\n * \n * signalNewConsumerTransport(options)\n * .then(consumingTransports => {\n * console.log('Consuming Transports:', consumingTransports);\n * })\n * .catch(error => {\n * console.error('Error signaling new consumer transport:', error);\n * });\n */\n\nexport const signalNewConsumerTransport = async ({\n remoteProducerId,\n islevel,\n nsock,\n parameters,\n}: SignalNewConsumerTransportOptions): Promise<string[] | void> => {\n try {\n let {\n device,\n consumingTransports,\n lock_screen,\n updateConsumingTransports,\n connectRecvTransport,\n reorderStreams,\n } = parameters;\n\n // Get updated parameters\n const updatedParams = parameters.getUpdatedAllParams();\n device = updatedParams.device;\n consumingTransports = updatedParams.consumingTransports;\n\n // Check if already consuming\n if (consumingTransports.includes(remoteProducerId)) {\n return consumingTransports;\n }\n\n // Add remote producer ID to consumingTransports array\n consumingTransports.push(remoteProducerId);\n updateConsumingTransports(consumingTransports);\n\n // Emit createWebRtcTransport event to signal a new consumer\n nsock.emit(\n \"createWebRtcTransport\",\n { consumer: true, islevel },\n async ({ params }: { params: CreateWebRTCTransportResponse }) => {\n if (params.error) {\n // Handle error\n return;\n }\n\n try {\n // Create a new receiving transport using the received parameters\n const consumerTransport = device!.createRecvTransport({ ...params });\n\n // Handle 'connect' event for the consumer transport\n consumerTransport.on(\n \"connect\",\n async (\n { dtlsParameters }: { dtlsParameters: DtlsParameters },\n callback: () => void,\n errback: (error: any) => void\n ) => {\n try {\n // Emit transport-recv-connect event to signal connection\n nsock.emit(\"transport-recv-connect\", {\n dtlsParameters,\n serverConsumerTransportId: params.id,\n });\n callback();\n } catch (error) {\n errback(error);\n }\n }\n );\n\n // Listen for connection state change\n consumerTransport.on(\"connectionstatechange\", async (state: string) => {\n switch (state) {\n case \"connecting\":\n // Handle connecting state\n break;\n\n case \"connected\":\n // Handle connected state\n break;\n\n case \"failed\":\n // Handle failed state\n consumerTransport.close();\n\n // Reorder streams based on conditions\n if (lock_screen) {\n await reorderStreams({ add: true, parameters });\n } else {\n await reorderStreams({ add: false, parameters });\n }\n break;\n\n default:\n break;\n }\n });\n\n // Connect the receiving transport\n await connectRecvTransport({\n consumerTransport,\n remoteProducerId,\n serverConsumerTransportId: params.id,\n nsock,\n parameters,\n });\n } catch (error) {\n console.log(error, \"createRecvTransport error\");\n // Handle error\n return;\n }\n }\n );\n } catch (error) {\n console.log(error, \"signalNewConsumerTransport error\");\n // Handle error\n return;\n }\n};\n\n","import { Socket } from 'socket.io-client';\nimport { signalNewConsumerTransport } from '../signalNewConsumerTransport';\nimport { ReorderStreamsParameters, ReorderStreamsType, SignalNewConsumerTransportParameters, ConnectRecvTransportParameters, ConnectRecvTransportType, ShowAlert } from '../../types/types';\nimport type { Device } from 'mediasoup-client/lib/types';\n\nexport interface TranslationMeta {\n speakerId: string;\n speakerName: string;\n language: string;\n originalProducerId?: string;\n isSpeakerControlled?: boolean;\n}\nexport interface NewPipeProducerParameters extends ReorderStreamsParameters, SignalNewConsumerTransportParameters, ConnectRecvTransportParameters {\n\n first_round: boolean;\n shareScreenStarted: boolean;\n shared: boolean;\n landScaped: boolean;\n showAlert?: ShowAlert;\n isWideScreen: boolean;\n updateFirst_round: (firstRound: boolean) => void;\n updateLandScaped: (landScaped: boolean) => void;\n device: Device | null;\n consumingTransports: string[];\n lock_screen: boolean;\n updateConsumingTransports: (transports: string[]) => void;\n\n // mediasfu functions\n connectRecvTransport: ConnectRecvTransportType;\n reorderStreams: ReorderStreamsType;\n getUpdatedAllParams: () => NewPipeProducerParameters;\n\n startConsumingTranslation?: (producerId: string, speakerId: string, language: string, originalProducerId?: string, nsock?: Socket) => Promise<void>;\n translationSubscriptions?: Map<string, { speakerId: string; language: string }>;\n speakerTranslationStates?: Map<string, { speakerId: string; speakerName: string; inputLanguage: string; outputLanguage: string; originalProducerId: string; enabled: boolean }>;\n listenerTranslationOverrides?: Map<string, { speakerId: string; wantOriginal: boolean; preferredLanguage?: string }>;\n listenerTranslationPreferences?: {\n perSpeaker: Map<string, { speakerId: string; language: string | null; wantOriginal: boolean }>;\n globalLanguage: string | null;\n };\n [key: string]: any;\n\n}\n\nexport interface NewPipeProducerOptions {\n producerId: string;\n islevel: string;\n nsock: Socket;\n parameters: NewPipeProducerParameters;\n isTranslation?: boolean;\n translationMeta?: TranslationMeta;\n}\n\n// Export the type definition for the function\nexport type NewPipeProducerType = (options: NewPipeProducerOptions) => Promise<void>;\n\n\n/**\n * Handles the creation of a new pipe producer by signaling for a new consumer transport and updating the necessary parameters.\n *\n * @function\n * @async\n * @param {NewPipeProducerOptions} options - The options for the new pipe producer.\n * @param {string} options.producerId - The ID of the producer to be consumed.\n * @param {string} options.islevel - The level status of the participant.\n * @param {Socket} options.nsock - The socket instance for real-time communication.\n * @param {NewPipeProducerParameters} options.parameters - Additional parameters required for the producer.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.parameters.shared - Indicates if sharing is active.\n * @param {boolean} options.parameters.landScaped - Indicates if the device is in landscape mode.\n * @param {ShowAlert} options.parameters.showAlert - Function to show alerts to the user.\n * @param {boolean} options.parameters.isWideScreen - Indicates if the device is a widescreen.\n * @param {Function} options.parameters.updateFirst_round - Function to update the first round status.\n * @param {Function} options.parameters.updateLandScaped - Function to update the landscape status.\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n * @throws {Error} Will throw an error if the operation fails to signal the new consumer transport.\n *\n * @example\n * import { newPipeProducer } from 'mediasfu-reactjs';\n * import { io } from 'socket.io-client';\n * \n * const parameters = {\n * shareScreenStarted: true,\n * shared: true,\n * landScaped: false,\n * showAlert: (alert) => console.log(alert.message),\n * isWideScreen: false,\n * updateFirst_round: (firstRound) => console.log('First round updated:', firstRound),\n * updateLandScaped: (landScaped) => console.log('Landscape status updated:', landScaped),\n * };\n * \n * const producerId = 'producer-123';\n * const islevel = '2';\n * const nsock = io(\"http://localhost:3000\");\n * \n * async function init() {\n * try {\n * await newPipeProducer({\n * producerId,\n * islevel,\n * nsock,\n * parameters,\n * });\n * console.log('New pipe producer created successfully');\n * } catch (error) {\n * console.error('Error creating new pipe producer:', error);\n * }\n * }\n * \n * init();\n */\n\nexport const newPipeProducer = async ({\n producerId,\n islevel,\n nsock,\n parameters,\n isTranslation,\n translationMeta,\n}: NewPipeProducerOptions): Promise<void> => {\n if (isTranslation && translationMeta) {\n const freshParams = parameters.getUpdatedAllParams ? parameters.getUpdatedAllParams() : parameters;\n\n const {\n startConsumingTranslation,\n translationSubscriptions,\n speakerTranslationStates,\n listenerTranslationOverrides,\n listenerTranslationPreferences,\n } = freshParams;\n\n const normalizedLang = translationMeta.language?.toLowerCase();\n const isSpeakerControlledFromMeta = translationMeta.isSpeakerControlled === true;\n const speakerState = speakerTranslationStates?.get(translationMeta.speakerId);\n const isSpeakerControlledFromState = speakerState?.enabled\n && speakerState?.outputLanguage?.toLowerCase() === normalizedLang;\n const shouldSkipBecauseWrongLanguage = isSpeakerControlledFromMeta\n && speakerState?.enabled\n && speakerState?.outputLanguage?.toLowerCase() !== normalizedLang;\n\n const subscriptionKey = `${translationMeta.speakerId}_${normalizedLang}`;\n const isListenerSubscribed = translationSubscriptions?.has(subscriptionKey)\n || translationSubscriptions?.has(translationMeta.speakerId);\n\n let overrideBlocksConsumption = false;\n let shouldConsumeForOverride = false;\n let shouldConsumeForGlobal = false;\n\n const perSpeakerPref = listenerTranslationPreferences?.perSpeaker?.get(translationMeta.speakerId);\n const globalPref = listenerTranslationPreferences?.globalLanguage;\n const listenerOverride = listenerTranslationOverrides?.get(translationMeta.speakerId);\n\n if (perSpeakerPref) {\n if (perSpeakerPref.wantOriginal) {\n overrideBlocksConsumption = true;\n } else if (perSpeakerPref.language) {\n if (perSpeakerPref.language === normalizedLang) {\n shouldConsumeForOverride = true;\n } else {\n overrideBlocksConsumption = true;\n }\n }\n } else if (globalPref) {\n if (globalPref === normalizedLang) {\n shouldConsumeForGlobal = true;\n } else {\n overrideBlocksConsumption = true;\n }\n } else if (listenerOverride) {\n if (listenerOverride.wantOriginal) {\n overrideBlocksConsumption = true;\n } else if (listenerOverride.preferredLanguage) {\n if (listenerOverride.preferredLanguage.toLowerCase() === normalizedLang) {\n shouldConsumeForOverride = true;\n } else {\n overrideBlocksConsumption = true;\n }\n }\n }\n\n const shouldConsumeForSpeakerControlled =\n isSpeakerControlledFromMeta\n && (!speakerState?.enabled || speakerState?.outputLanguage?.toLowerCase() === normalizedLang);\n const hasNoPreference = !perSpeakerPref && !globalPref && !listenerOverride;\n const isListenerInitiated = !isSpeakerControlledFromMeta && !isSpeakerControlledFromState;\n const blockBecauseNotRelevant = hasNoPreference && isListenerInitiated && !isListenerSubscribed;\n\n const shouldConsume =\n !overrideBlocksConsumption\n && !shouldSkipBecauseWrongLanguage\n && !blockBecauseNotRelevant\n && (shouldConsumeForOverride\n || shouldConsumeForGlobal\n || shouldConsumeForSpeakerControlled\n || isSpeakerControlledFromState\n || isListenerSubscribed);\n\n if (shouldConsume && startConsumingTranslation) {\n try {\n await startConsumingTranslation(\n producerId,\n translationMeta.speakerId,\n translationMeta.language,\n translationMeta.originalProducerId,\n nsock,\n );\n } catch {\n }\n }\n\n return;\n }\n\n const {\n shareScreenStarted,\n shared,\n landScaped,\n showAlert,\n isWideScreen,\n updateFirst_round,\n updateLandScaped,\n } = parameters;\n\n // Signal new consumer transport\n await signalNewConsumerTransport({\n remoteProducerId: producerId,\n islevel,\n nsock,\n parameters\n });\n\n // Modify first_round and landscape status\n let updatedFirstRound = false;\n\n if (shareScreenStarted || shared) {\n if (!isWideScreen) {\n if (!landScaped) {\n if (showAlert) {\n showAlert({\n message: 'Please rotate your device to landscape mode for better experience',\n type: 'success',\n duration: 3000,\n });\n }\n updateLandScaped(true);\n }\n }\n\n updatedFirstRound = true;\n updateFirst_round(updatedFirstRound);\n }\n};\n","import { Transport, CloseAndResizeParameters, CloseAndResizeType } from '../../types/types';\n\nexport interface ProducerClosedParameters extends CloseAndResizeParameters {\n consumerTransports: Transport[];\n screenId?: string;\n updateConsumerTransports: (transports: Transport[]) => void;\n\n // mediasfu functions\n closeAndResize: CloseAndResizeType;\n getUpdatedAllParams: () => ProducerClosedParameters;\n [key: string]: any;\n\n}\n\nexport interface ProducerClosedOptions {\n remoteProducerId: string;\n parameters: ProducerClosedParameters;\n}\n\n// Export the type definition for the function\nexport type ProducerClosedType = (options: ProducerClosedOptions) => Promise<void>;\n\n/**\n * Handles the closure of a producer identified by its remote producer ID.\n * This function will clean up the consumer transports and resize the video outputs.\n *\n * @function\n * @async\n * @param {ProducerClosedOptions} options - The options for closing the producer.\n * @param {string} options.remoteProducerId - The ID of the remote producer to close.\n * @param {ProducerClosedParameters} options.parameters - Additional parameters for the operation.\n * @param {Transport[]} options.parameters.consumerTransports - The list of consumer transports associated with the producer.\n * @param {Function} options.parameters.closeAndResize - Function to handle the closing and resizing of video streams.\n * @param {string} [options.parameters.screenId] - The ID of the screen producer (if applicable).\n * @param {Function} options.parameters.updateConsumerTransports - Function to update the state of consumer transports.\n * @returns {Promise<void>} A promise that resolves when the producer has been successfully closed.\n * @throws Will throw an error if there is an issue closing the consumer transport or the producer.\n *\n * @example\n * import { producerClosed } from 'mediasfu-reactjs';\n * \n * const options = {\n * remoteProducerId: 'producerId',\n * parameters: {\n * consumerTransports: [], // Array of consumer transports\n * closeAndResize: (params) => console.log('Close and resize called', params),\n * screenId: 'screenId',\n * updateConsumerTransports: (transports) => console.log('Updated transports:', transports),\n * },\n * };\n * \n * producerClosed(options)\n * .then(() => {\n * console.log('Producer closed successfully');\n * })\n * .catch((error) => {\n * console.error('Error closing producer:', error);\n * });\n */\nexport const producerClosed = async ({\n remoteProducerId,\n parameters,\n}: ProducerClosedOptions): Promise<void> => {\n let { consumerTransports, closeAndResize, screenId, updateConsumerTransports } = parameters;\n\n const activeTranslationProducerIds = parameters.activeTranslationProducerIds;\n const isTranslationProducer = activeTranslationProducerIds?.has?.(remoteProducerId);\n\n if (isTranslationProducer) {\n activeTranslationProducerIds?.delete?.(remoteProducerId);\n\n const removeTranslationStream = parameters.removeTranslationStream as ((producerId: string) => void) | undefined;\n\n if (removeTranslationStream) {\n removeTranslationStream(remoteProducerId);\n }\n }\n\n // Handle producer closed\n const producerToClose = consumerTransports.find(\n (transportData: any) => transportData.producerId === remoteProducerId\n );\n\n if (!producerToClose) {\n return;\n }\n\n // Check if the ID of the producer to close is the same as the screenId\n let kind: string = producerToClose.consumer.kind;\n\n if (producerToClose.producerId === screenId) {\n kind = 'screenshare';\n }\n\n try {\n await producerToClose.consumerTransport.close();\n } catch (error) {\n console.error('Error closing consumer transport:', error);\n }\n\n try {\n producerToClose.consumer.close();\n } catch (error) {\n console.error('Error closing consumer:', error);\n }\n\n // Filter out the closed producer\n consumerTransports = consumerTransports.filter(\n (transportData: any) => transportData.producerId !== remoteProducerId\n );\n updateConsumerTransports(consumerTransports);\n\n // Close and resize the videos\n await closeAndResize({ producerId: remoteProducerId, kind, parameters });\n};\n","\nexport interface ValidateAlphanumericOptions {\n str: string;\n}\n\n// Export the type definition for the function\nexport type ValidateAlphanumericType = (options: ValidateAlphanumericOptions) => Promise<boolean>;\n\n/**\n * Validates if the given string contains only alphanumeric characters.\n *\n * @param {ValidateAlphanumericOptions} options - The options containing the string to validate.\n * @param {string} options.str - The string to be validated.\n * @returns {Promise<boolean>} - A promise that resolves to `true` if the string is alphanumeric, otherwise `false`.\n * \n * @example\n * ```typescript \n * const isValid = await validateAlphanumeric({ str: \"abc123\" });\n * console.log(isValid);\n * // Output: true\n * ```\n */\n\n\nconst validateAlphanumeric = async ({ str }: ValidateAlphanumericOptions): Promise<boolean> => {\n let code: number, i: number, len: number;\n\n for (i = 0, len = str.length; i < len; i++) {\n code = str.charCodeAt(i);\n if (\n !(code > 47 && code < 58) && // numeric (0-9)\n !(code > 64 && code < 91) && // upper alpha (A-Z)\n !(code > 96 && code < 123) // lower alpha (a-z)\n ) {\n return false;\n }\n }\n return true;\n};\n\nexport { validateAlphanumeric };\n","import { Socket } from \"socket.io-client\";\nimport { validateAlphanumeric } from \"../../methods/utils/validateAlphanumeric\"; // Import the validateAlphanumeric function from the validateAlphanumeric file\nimport type { RtpCapabilities } from \"mediasoup-client/lib/types\";\n\nexport interface JoinConRoomOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n}\n\nexport interface JoinConRoomResponse {\n success: boolean;\n rtpCapabilities: RtpCapabilities | null;\n reason?: string;\n banned?: boolean;\n suspended?: boolean;\n noAdmin?: boolean;\n [key: string]: any;\n}\n\n\n// Export the type definition for the function\nexport type JoinConRoomType = (options: JoinConRoomOptions) => Promise<JoinConRoomResponse>;\n\n/**\n * Joins a conference room using the provided options.\n *\n * @param {JoinConRoomOptions} options - The options for joining the conference room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token.\n * @param {string} options.apiUserName - The API username.\n * \n * @returns {Promise<JoinConRoomResponse>} A promise that resolves with the response of the join operation.\n *\n * @example\n * ```typescript\n * const options = {\n * socket: socketInstance,\n * roomName: \"s12345678\",\n * islevel: \"1\",\n * member: \"user123\",\n * sec: \"64CharacterLongSecretHere\",\n * apiUserName: \"user123\",\n * };\n *\n * try {\n * const response = await joinConRoom(options);\n * console.log(\"Room joined:\", response);\n * } catch (error) {\n * console.error(\"Failed to join room:\", error);\n * }\n * ```\n */\n\nexport async function joinConRoom(\n { socket, roomName, islevel, member, sec, apiUserName }: JoinConRoomOptions\n): Promise<JoinConRoomResponse> {\n return new Promise((resolve, reject) => {\n // Validate inputs\n if (!(sec && roomName && islevel && apiUserName && member)) {\n const validationError: JoinConRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: \"Missing required parameters\",\n };\n reject(validationError);\n return;\n }\n\n // Validate alphanumeric for roomName, apiUserName, and member\n try {\n validateAlphanumeric({ str: roomName });\n validateAlphanumeric({ str: apiUserName });\n validateAlphanumeric({ str: member });\n } catch {\n const validationError: JoinConRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: \"Invalid roomName or apiUserName or member\",\n };\n reject(validationError);\n return;\n }\n\n // Validate roomName starts with 's' or 'p'\n if (!(roomName.startsWith(\"s\") || roomName.startsWith(\"p\") || roomName.startsWith(\"d\"))) {\n const validationError: JoinConRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: \"Invalid roomName, must start with s or p or d\",\n };\n reject(validationError);\n return;\n }\n\n // Validate other conditions for sec, roomName, islevel, apiUserName\n if (\n !(\n sec.length === 64 &&\n roomName.length >= 8 &&\n islevel.length === 1 &&\n apiUserName.length >= 6 &&\n (islevel == \"0\" || islevel == \"1\" || islevel == \"2\")\n )\n ) {\n const validationError: JoinConRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: \"Invalid roomName or islevel or apiUserName or secret\",\n };\n reject(validationError);\n return;\n }\n\n socket.emit(\n \"joinConRoom\",\n { roomName, islevel, member, sec, apiUserName },\n async (data: JoinConRoomResponse) => {\n try {\n // Check if rtpCapabilities is null\n if (data.rtpCapabilities == null) {\n // Check if banned, suspended, or noAdmin\n if (data.banned) {\n throw new Error(\"User is banned.\");\n }\n if (data.suspended) {\n throw new Error(\"User is suspended.\");\n }\n if (data.noAdmin) {\n throw new Error(\"Host has not joined the room yet.\");\n }\n\n // Resolve with the data received from the 'joinConRoom' event\n resolve(data);\n } else {\n // Handle other cases or perform additional actions\n resolve(data);\n }\n } catch (error) {\n // Handle errors during the joinConRoom process\n console.log(\"Error joining room:\", error);\n reject(error);\n }\n }\n );\n });\n}\n","import { joinConRoom } from '../../producers/producerEmits/joinConRoom';\nimport type { Device, RtpCapabilities } from 'mediasoup-client/lib/types';\nimport { Socket } from 'socket.io-client';\nimport { ReceiveAllPipedTransportsParameters, ReceiveAllPipedTransportsType, CreateDeviceClientType } from '../../types/types';\n\n\nexport interface JoinConsumeRoomParameters extends ReceiveAllPipedTransportsParameters {\n roomName: string;\n islevel: string;\n member: string;\n device: Device | null;\n updateDevice: (device: Device | null) => void;\n\n // Mediasfu functions\n receiveAllPipedTransports: ReceiveAllPipedTransportsType;\n createDeviceClient: CreateDeviceClientType;\n getUpdatedAllParams: () => JoinConsumeRoomParameters;\n [key: string]: any;\n}\nexport interface JoinConsumeRoomOptions {\n remote_sock: Socket;\n apiToken: string;\n apiUserName: string;\n parameters: JoinConsumeRoomParameters;\n}\n\ninterface JoinConsumeRoomResponse {\n success: boolean;\n rtpCapabilities?: RtpCapabilities | null;\n}\n\n// Export the type definition for the function\nexport type JoinConsumeRoomType = (options: JoinConsumeRoomOptions) => Promise<JoinConsumeRoomResponse>;\n\n/**\n * Joins a consumption room by sending a request to the server, handling device setup, and managing piped transports.\n * \n * @function\n * @async\n * @param {Object} options - The configuration options.\n * @param {Socket} options.remote_sock - The remote socket for communication.\n * @param {string} options.apiToken - The API token for authentication.\n * @param {string} options.apiUserName - The API username for authentication.\n * @param {JoinConsumeRoomParameters} options.parameters - Additional parameters including room details and Mediasoup configurations.\n * @returns {Promise<JoinConsumeRoomResponse>} - An object indicating the success of joining the room and optional RTP capabilities.\n * @throws {Error} Throws an error if joining the room or setup fails.\n *\n * @example\n * import { joinConsumeRoom } from 'mediasfu-reactjs';\n * import { io } from 'socket.io-client';\n * \n * const apiToken = 'your-api-token';\n * const apiUserName = 'your-api-username';\n * const remote_sock = io(\"http://localhost:3000\");\n * \n * const parameters = {\n * roomName: 'room-name',\n * islevel: '2',\n * member: 'user-id',\n * device: null,\n * updateDevice: (device) => console.log('Device updated:', device),\n * receiveAllPipedTransports: (params) => console.log('Receiving all piped transports:', params),\n * createDeviceClient: async (params) => { // Device client setup logic },\n * getUpdatedAllParams: () => console.log('Getting updated parameters'),\n * };\n * \n * async function init() {\n * try {\n * const data = await joinConsumeRoom({\n * remote_sock,\n * apiToken,\n * apiUserName,\n * parameters,\n * });\n * console.log('Joined room:', data);\n * } catch (error) {\n * console.error('Error joining room:', error);\n * }\n * }\n * init();\n * // Expected output: { success: true, rtpCapabilities: { ... } }\n */\n\n\nexport const joinConsumeRoom = async ({\n remote_sock,\n apiToken,\n apiUserName,\n parameters,\n}: JoinConsumeRoomOptions): Promise<JoinConsumeRoomResponse> => {\n const {\n roomName,\n islevel,\n member,\n device,\n updateDevice,\n\n // Mediasfu functions\n receiveAllPipedTransports,\n createDeviceClient,\n } = parameters;\n\n try {\n // Join the consumption room\n const data: JoinConsumeRoomResponse = await joinConRoom({ socket: remote_sock, roomName, islevel, member, sec: apiToken, apiUserName });\n\n if (data && data.success) {\n // Setup media device if not already set\n if (!device) {\n if (data.rtpCapabilities) {\n const device_: Device | null = await createDeviceClient({\n rtpCapabilities: data.rtpCapabilities,\n });\n\n if (device_) {\n updateDevice(device_);\n }\n }\n }\n\n // Receive all piped transports\n await receiveAllPipedTransports({ nsock: remote_sock, parameters });\n\n setTimeout(async () => {\n try {\n await receiveAllPipedTransports({ nsock: remote_sock, parameters });\n } catch (error) {\n console.log('[joinConsumeRoom] Retry receiveAllPipedTransports failed:', error);\n }\n }, 30000);\n }\n\n return data;\n } catch (error) {\n console.error('Error in joinConsumeRoom:', error);\n throw new Error('Failed to join the consumption room or set up necessary components.');\n }\n};\n"," \nimport { connectSocket } from \"../../src/sockets/SocketManager\";\nimport { newPipeProducer } from \"./socketReceiveMethods/newPipeProducer\";\nimport { producerClosed } from \"./socketReceiveMethods/producerClosed\";\nimport { joinConsumeRoom } from \"./socketReceiveMethods/joinConsumeRoom\";\nimport type { Device } from 'mediasoup-client/lib/types';\nimport {\n ReorderStreamsParameters, ReorderStreamsType, NewPipeProducerParameters, NewPipeProducerType, ProducerClosedType,\n ProducerClosedParameters, JoinConsumeRoomType, JoinConsumeRoomParameters, ConsumeSocket\n} from '../types/types';\n\nexport interface ConnectIpsParameters extends ReorderStreamsParameters, JoinConsumeRoomParameters, ProducerClosedParameters, NewPipeProducerParameters {\n device: Device | null;\n roomRecvIPs: string[];\n updateRoomRecvIPs: (roomRecvIPs: string[]) => void;\n updateConsume_sockets: (consume_sockets: ConsumeSocket[]) => void;\n\n // mediasfu functions\n reorderStreams: ReorderStreamsType;\n getUpdatedAllParams: () => ConnectIpsParameters;\n [key: string]: any;\n}\n\nexport interface ConnectIpsOptions {\n consume_sockets: ConsumeSocket[];\n remIP: string[];\n apiUserName: string;\n apiKey?: string;\n apiToken: string;\n newProducerMethod?: NewPipeProducerType;\n closedProducerMethod?: ProducerClosedType;\n joinConsumeRoomMethod?: JoinConsumeRoomType;\n parameters: ConnectIpsParameters;\n}\n\n// Export the type definition for the function\nexport type ConnectIpsType = (options: ConnectIpsOptions) => Promise<[Record<string, any>[], string[]]>;\n\n/**\n * Connects to remote IPs and manages socket connections.\n *\n * @param {ConnectIpsOptions} options - The options for connecting IPs.\n * @param {Record<string, any>[]} options.consume_sockets - The array of current socket connections.\n * @param {string[]} options.remIP - The list of remote IPs to connect to.\n * @param {string} options.apiUserName - The API username for authentication.\n * @param {string} [options.apiKey] - The API key for authentication.\n * @param {string} [options.apiToken] - The API token for authentication.\n * @param {Function} [options.newProducerMethod=newPipeProducer] - The method to handle new pipe producer events.\n * @param {Function} [options.closedProducerMethod=producerClosed] - The method to handle producer closed events.\n * @param {Function} [options.joinConsumeRoomMethod=joinConsumeRoom] - The method to handle joining a consuming room.\n * @param {ConnectIpsParameters} options.parameters - Additional parameters.\n * @param {string[]} options.parameters.roomRecvIPs - The list of IPs that have been received in the room.\n * @param {Function} options.parameters.updateRoomRecvIPs - The function to update the room received IPs.\n * @param {Function} options.parameters.updateConsume_sockets - The function to update the consume sockets.\n *\n * @returns {Promise<[Record<string, any>[], string[]]>} A promise that resolves to an array containing the updated consume sockets and room received IPs.\n *\n * @throws Will throw an error if required parameters are missing or if there is an issue connecting to a remote IP.\n * \n * @example\n * const options = {\n * consume_sockets: [],\n * remIP: ['ip1', 'ip2'],\n * apiUserName: 'username',\n * apiKey: 'apikey',\n * apiToken: 'token',\n * parameters: {\n * roomRecvIPs: [],\n * updateRoomRecvIPs: updateRoomRecvIPsFunction,\n * updateConsume_sockets: updateConsumeSocketsFunction,\n * },\n * };\n * \n * connectIps(options)\n * .then(([consume_sockets, roomRecvIPs]) => {\n * console.log('Connected IPs:', consume_sockets);\n * console.log('Room received IPs:', roomRecvIPs);\n * });\n */\n\nexport const connectIps = async ({\n consume_sockets,\n remIP,\n apiUserName,\n apiKey,\n apiToken,\n\n // mediasfu methods\n newProducerMethod = newPipeProducer,\n closedProducerMethod = producerClosed,\n joinConsumeRoomMethod = joinConsumeRoom,\n parameters,\n}: ConnectIpsOptions): Promise<[Record<string, any>[], string[]]> => {\n try {\n const { roomRecvIPs, updateRoomRecvIPs, updateConsume_sockets } = parameters;\n\n if (!consume_sockets || !remIP || !apiUserName || (!apiKey && !apiToken)) {\n console.log(\"Missing required parameters\", {\n consume_sockets,\n remIP,\n apiUserName,\n apiToken,\n });\n return [consume_sockets, roomRecvIPs];\n }\n\n for (const ip of remIP) {\n try {\n // Check if the IP is already connected\n const matching = consume_sockets.find((socketObj) => Object.keys(socketObj)[0] === ip);\n\n if (matching || !ip) {\n // Skip if the IP is already connected or invalid\n continue;\n }\n\n // Connect to the remote socket using socket.io-client\n const remote_sock = await connectSocket({ apiUserName, apiKey, apiToken, link: `https://${ip}.mediasfu.com` });\n\n if (remote_sock.id) {\n // Check if the IP is in the roomRecvIPs, if not, add it\n if (!roomRecvIPs.includes(ip)) {\n roomRecvIPs.push(ip);\n updateRoomRecvIPs(roomRecvIPs);\n }\n\n // Handle new pipe producer event\n remote_sock.on(\"new-pipe-producer\", async ({ producerId, islevel }: { producerId: string; islevel: string }) => {\n if (newProducerMethod) {\n await newProducerMethod({\n producerId,\n islevel,\n nsock: remote_sock,\n parameters,\n });\n }\n });\n\n // Handle producer closed event\n remote_sock.on(\"producer-closed\", async ({ remoteProducerId }: { remoteProducerId: string }) => {\n if (closedProducerMethod) {\n await closedProducerMethod({ remoteProducerId, parameters });\n }\n });\n\n // Handle new consuming room by joining the room\n if (joinConsumeRoomMethod) {\n let data = await joinConsumeRoomMethod({\n remote_sock,\n apiToken,\n apiUserName,\n parameters,\n });\n if (!data.rtpCapabilities) {\n return [consume_sockets, roomRecvIPs];\n }\n }\n\n // Add the remote socket to the consume_sockets array\n consume_sockets.push({ [ip]: remote_sock });\n updateConsume_sockets(consume_sockets);\n }\n } catch (error) {\n // Handle the error\n console.log(\"connectIps error\", error);\n }\n }\n\n return [consume_sockets, roomRecvIPs];\n } catch (error) {\n // Handle the error\n console.log(\"connectIps error\", error);\n return [consume_sockets, parameters.roomRecvIPs];\n }\n};\n","\nimport { newPipeProducer } from \"./socketReceiveMethods/newPipeProducer\";\nimport { producerClosed } from \"./socketReceiveMethods/producerClosed\";\nimport {\n ReorderStreamsParameters, ReorderStreamsType, NewPipeProducerParameters, NewPipeProducerType, ProducerClosedType,\n ProducerClosedParameters, \n ReceiveAllPipedTransportsParameters,\n ReceiveAllPipedTransportsType} from '../types/types';\nimport { Socket } from \"socket.io-client\";\n\nexport interface ConnectLocalIpsParameters extends ReorderStreamsParameters, ProducerClosedParameters, NewPipeProducerParameters,\nReceiveAllPipedTransportsParameters {\n socket: Socket;\n\n // mediasfu functions\n reorderStreams: ReorderStreamsType;\n receiveAllPipedTransports: ReceiveAllPipedTransportsType;\n getUpdatedAllParams: () => ConnectLocalIpsParameters;\n [key: string]: any;\n}\n\nexport interface ConnectLocalIpsOptions {\n socket: Socket;\n newProducerMethod?: NewPipeProducerType;\n closedProducerMethod?: ProducerClosedType;\n parameters: ConnectLocalIpsParameters;\n}\n\n// Export the type definition for the function\nexport type ConnectLocalIpsType = (options: ConnectLocalIpsOptions) => Promise<void>;\n\n/**\n * Connects to remote IPs and manages socket connections.\n * \n * @param {ConnectLocalIpsOptions} options - The options for connecting IPs.\n * @param {Socket} options.socket - The socket to connect to.\n * @param {Function} [options.newProducerMethod=newPipeProducer] - The method to handle new pipe producer events.\n * @param {Function} [options.closedProducerMethod=producerClosed] - The method to handle producer closed events.\n * @param {ConnectLocalIpsParameters} options.parameters - Additional parameters.\n * @param {Function} options.parameters.reorderStreams - The function to reorder streams.\n * @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.\n * @param {Socket} options.parameters.socket - The socket to connect to.\n * \n * @returns {Promise<void>} A promise that resolves when the connection is established.\n * \n * @throws Will throw an error if required parameters are missing or if there is an issue connecting to a remote IP.\n * \n * @example\n * ```typescript\n * const options = {\n * socket,\n * newProducerMethod: newPipeProducer,\n * closedProducerMethod: producerClosed,\n * parameters: connectLocalIpsParameters,\n * };\n * \n * connectLocalIps(options)\n * .then(() => {\n * console.log('Connected to local IPs');\n * })\n * .catch(error => {\n * console.error('Error connecting to local IPs:', error);\n * });\n * ```\n */ \n\nexport const connectLocalIps = async ({\n socket,\n\n // mediasfu methods\n newProducerMethod = newPipeProducer,\n closedProducerMethod = producerClosed,\n parameters,\n}: ConnectLocalIpsOptions): Promise<void> => {\n try {\n\n // Connect to the remote socket using socket.io-client\n // Handle new pipe producer event\n socket.on(\"new-producer\", async ({ producerId, islevel }: { producerId: string; islevel: string }) => {\n if (newProducerMethod) {\n await newProducerMethod({\n producerId,\n islevel,\n nsock: socket,\n parameters,\n });\n }\n });\n\n // Handle producer closed event\n socket.on(\"producer-closed\", async ({ remoteProducerId }: { remoteProducerId: string }) => {\n if (closedProducerMethod) {\n await closedProducerMethod({ remoteProducerId, parameters });\n }\n });\n\n await parameters.receiveAllPipedTransports({ nsock: socket, community: true, parameters });\n\n } catch (error) {\n // Handle the error\n console.log(\"ConnectLocalIps error\", error);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport { ConsumerResumeType, ConsumerResumeParameters, Transport as TransportType, Participant } from \"../types/types\";\nimport type { Consumer, Device, Transport } from \"mediasoup-client/lib/types\";\n\ninterface SpeakerTranslationState {\n speakerId: string;\n speakerName: string;\n inputLanguage: string;\n outputLanguage: string;\n originalProducerId: string;\n enabled: boolean;\n}\n\ninterface Params {\n id: string;\n producerId: string;\n kind: string;\n rtpParameters: any;\n serverConsumerId: string;\n error?: string;\n}\n\nexport interface ConnectRecvTransportParameters extends ConsumerResumeParameters {\n device: Device | null;\n consumerTransports: TransportType[];\n updateConsumerTransports: (transports: TransportType[]) => void;\n speakerTranslationStates?: Map<string, SpeakerTranslationState>;\n\n // mediasfu functions\n consumerResume: ConsumerResumeType;\n getUpdatedAllParams: () => ConnectRecvTransportParameters;\n [key: string]: any; // Extendable for additional parameters\n}\nexport interface ConnectRecvTransportOptions {\n consumerTransport: Transport;\n remoteProducerId: string;\n serverConsumerTransportId: string;\n nsock: Socket;\n parameters: ConnectRecvTransportParameters;\n}\n\n// Export the type definition for the function\nexport type ConnectRecvTransportType = (options: ConnectRecvTransportOptions) => Promise<void>;\n\n/**\n * Connects the receiving transport to consume media from a remote producer.\n *\n * @param {ConnectRecvTransportOptions} options - The options for connecting the receiving transport.\n * @param {Transport} options.consumerTransport - The transport used for consuming media.\n * @param {string} options.remoteProducerId - The ID of the remote producer.\n * @param {string} options.serverConsumerTransportId - The ID of the server consumer transport.\n * @param {Socket} options.nsock - The socket used for communication.\n * @param {ConnectRecvTransportParameters} options.parameters - The parameters for the connection.\n *\n * @returns {Promise<void>} A promise that resolves when the connection is established.\n *\n * @throws Will throw an error if the connection or consumption fails.\n *\n * @example\n * ```typescript\n * const options = {\n * consumerTransport,\n * remoteProducerId: 'producer-id',\n * serverConsumerTransportId: 'transport-id',\n * nsock: socket,\n * parameters: connectRecvTransportOptions,\n * };\n * \n * connectRecvTransport(options)\n * .then(() => {\n * console.log('Transport connected and consuming media');\n * })\n * .catch((error) => {\n * console.error('Error connecting transport:', error);\n * });\n * ```\n */\n\nexport const connectRecvTransport = async ({\n consumerTransport,\n remoteProducerId,\n serverConsumerTransportId,\n nsock,\n parameters,\n}: ConnectRecvTransportOptions): Promise<void> => {\n parameters = parameters.getUpdatedAllParams();\n\n const {\n device,\n consumerTransports,\n updateConsumerTransports,\n consumerResume,\n } = parameters;\n\n try {\n // Emit 'consume' event to signal consumption initiation\n nsock.emit(\n \"consume\",\n {\n rtpCapabilities: device!.rtpCapabilities,\n remoteProducerId,\n serverConsumerTransportId,\n },\n async ({ params }: { params: Params }) => {\n if (params.error) {\n // Handle error\n console.log(\"consume error\", params.error);\n return;\n }\n\n try {\n // Consume media using received parameters\n const consumer: Consumer = await consumerTransport.consume({\n id: params.id,\n producerId: params.producerId,\n kind: params.kind as \"audio\" | \"video\",\n rtpParameters: params.rtpParameters,\n });\n\n // Update consumerTransports array with the new consumer\n consumerTransports.push({\n consumerTransport,\n serverConsumerTransportId: params.id,\n producerId: remoteProducerId,\n consumer,\n socket_: nsock,\n });\n\n updateConsumerTransports(consumerTransports);\n\n // Extract track from the consumer\n const { track } = consumer;\n\n // Emit 'consumer-resume' event to signal consumer resumption\n nsock.emit(\n \"consumer-resume\",\n { serverConsumerId: params.serverConsumerId },\n async ({ resumed }: { resumed: boolean }) => {\n if (resumed) {\n // Consumer resumed and ready to be used\n try {\n await consumerResume({\n track,\n kind: params.kind,\n remoteProducerId,\n params,\n parameters,\n nsock,\n consumer,\n });\n\n if (params.kind === 'audio') {\n try {\n const updatedParams = parameters.getUpdatedAllParams();\n const speakerTranslationStates = updatedParams.speakerTranslationStates as\n | Map<string, SpeakerTranslationState>\n | undefined;\n const participants = updatedParams.participants as Participant[] | undefined;\n\n if (speakerTranslationStates && speakerTranslationStates.size > 0 && participants?.length) {\n const participant = participants.find(\n (candidate) => candidate.audioID === remoteProducerId,\n );\n\n if (participant?.name) {\n const speakerState = speakerTranslationStates.get(participant.name);\n\n if (speakerState?.enabled && speakerState.originalProducerId === remoteProducerId) {\n consumer.pause();\n nsock.emit(\n 'consumer-pause',\n { serverConsumerId: params.serverConsumerId },\n () => {},\n );\n }\n }\n }\n } catch {\n }\n }\n } catch (error) {\n // Handle error\n console.log(\"consumerResume error\", error);\n }\n }\n }\n );\n } catch (error) {\n // Handle error\n console.log(\"consume error\", error);\n return;\n }\n }\n );\n } catch (error) {\n // Handle error\n console.log(\"connectRecvTransport error\", error);\n }\n};\n","import type { ProducerOptions } from 'mediasoup-client/lib/types';\nimport { ConnectSendTransportAudioType, ConnectSendTransportVideoType, ConnectSendTransportScreenType, ConnectSendTransportAudioParameters, ConnectSendTransportVideoParameters, ConnectSendTransportScreenParameters } from '../types/types';\nexport interface ConnectSendTransportParameters extends ConnectSendTransportAudioParameters, ConnectSendTransportVideoParameters, ConnectSendTransportScreenParameters {\n audioParams: ProducerOptions \n videoParams: ProducerOptions;\n localStreamScreen: MediaStream | null;\n canvasStream: MediaStream | null;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n shared: boolean;\n islevel: string;\n\n //mediasfu functions\n connectSendTransportAudio: ConnectSendTransportAudioType;\n connectSendTransportVideo: ConnectSendTransportVideoType;\n connectSendTransportScreen: ConnectSendTransportScreenType;\n\n getUpdatedAllParams: () => ConnectSendTransportParameters;\n [key: string]: any;\n}\n\nexport interface ConnectSendTransportOptions {\n option: 'audio' | 'video' | 'screen' | 'all';\n targetOption?: 'local' | 'remote' | 'all';\n parameters: ConnectSendTransportParameters;\n}\n\n// Export the type definition for the function\nexport type ConnectSendTransportType = (options: ConnectSendTransportOptions) => Promise<void>;\n\n/**\n * Connects the send transport based on the specified option.\n *\n * @param {ConnectSendTransportOptions} options - The options for connecting the send transport.\n * @param {string} options.option - The type of transport to connect (\"audio\", \"video\", \"screen\", or \"all\").\n * @param {boolean} options.targetOption - The target option to connect (\"local\", \"remote\", or \"all\").\n * @param {ConnectSendTransportParameters} options.parameters - The parameters required for connecting the transport.\n * @param {ProducerOptions} options.parameters.audioParams - The audio parameters.\n * @param {ProducerOptions} options.parameters.videoParams - The video parameters.\n * @param {MediaStream} options.parameters.localStreamScreen - The local screen stream.\n * @param {MediaStream} options.parameters.canvasStream - The canvas stream.\n * @param {boolean} options.parameters.whiteboardStarted - Indicates if the whiteboard has started.\n * @param {boolean} options.parameters.whiteboardEnded - Indicates if the whiteboard has ended.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {string} options.parameters.islevel - The level of the screen sharing.\n * @param {Function} options.parameters.connectSendTransportAudio - Function to connect the audio send transport.\n * @param {Function} options.parameters.connectSendTransportVideo - Function to connect the video send transport.\n * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the screen send transport.\n *\n * @returns {Promise<void>} A promise that resolves when the transport is connected.\n *\n * @throws Will throw an error if the connection fails.\n *\n * @example\n * const options = {\n * option: 'audio',\n * targetOption: 'local',\n * parameters: {\n * audioParams: audioProducerOptions,\n * videoParams: videoProducerOptions,\n * localStreamScreen: localStream,\n * canvasStream: canvasStream,\n * whiteboardStarted: false,\n * whiteboardEnded: false,\n * shared: false,\n * islevel: '1',\n * connectSendTransportAudio: connectAudioFunction,\n * connectSendTransportVideo: connectVideoFunction,\n * connectSendTransportScreen: connectScreenFunction,\n * },\n * };\n * \n * connectSendTransport(options)\n * .then(() => {\n * console.log('Transport connected successfully');\n * })\n * .catch((error) => {\n * console.error('Error connecting transport:', error);\n * });\n */\n\nexport const connectSendTransport = async ({ option, targetOption = \"all\", parameters }: ConnectSendTransportOptions): Promise<void> => {\n try {\n let {\n audioParams,\n videoParams,\n localStreamScreen,\n canvasStream,\n whiteboardStarted,\n whiteboardEnded,\n shared,\n islevel,\n\n //media functions\n connectSendTransportAudio,\n connectSendTransportVideo,\n connectSendTransportScreen,\n } = parameters;\n\n // Connect send transport based on the specified option\n if (option === \"audio\") {\n await connectSendTransportAudio({\n targetOption,\n audioParams,\n parameters,\n });\n } else if (option === \"video\") {\n await connectSendTransportVideo({\n targetOption,\n videoParams,\n parameters,\n });\n } else if (option === \"screen\") {\n if (\n whiteboardStarted &&\n !whiteboardEnded &&\n canvasStream &&\n islevel === \"2\" &&\n !shared\n ) {\n await connectSendTransportScreen({\n targetOption,\n stream: canvasStream,\n parameters,\n });\n } else {\n await connectSendTransportScreen({\n targetOption,\n stream: localStreamScreen!,\n parameters,\n });\n }\n } else {\n // Connect both audio and video send transports\n await connectSendTransportAudio({\n targetOption,\n audioParams,\n parameters,\n });\n await connectSendTransportVideo({\n targetOption,\n videoParams,\n parameters,\n });\n }\n } catch (error) {\n console.log(\"connectSendTransport error\", error);\n // throw error;\n }\n};\n","import type { Transport, Producer, ProducerOptions } from 'mediasoup-client/lib/types';\n\nexport interface ConnectSendTransportAudioParameters {\n audioProducer: Producer | null;\n producerTransport: Transport | null;\n localAudioProducer?: Producer | null;\n localProducerTransport?: Transport | null;\n updateAudioProducer: (producer: Producer | null) => void;\n updateProducerTransport: (transport: Transport | null) => void;\n updateLocalAudioProducer?: (localProducer: Producer | null) => void;\n updateLocalProducerTransport?: (localTransport: Transport | null) => void;\n updateAudioLevel: (level: number) => void;\n\n // Function to get all parameters\n getUpdatedAllParams: () => ConnectSendTransportAudioParameters;\n [key: string]: any; // Extendable for additional parameters\n\n}\n\nexport interface ConnectSendTransportAudioOptions {\n audioParams: ProducerOptions;\n parameters: ConnectSendTransportAudioParameters;\n targetOption?: 'all' | 'local' | 'remote';\n}\n\n// Export the type definition for the function\nexport type ConnectSendTransportAudioType = (options: ConnectSendTransportAudioOptions) => Promise<void>;\n\nconst connectLocalSendTransportAudio = async ({\n parameters,\n audioParams\n}: ConnectSendTransportAudioOptions): Promise<void> => {\n try {\n let {\n localAudioProducer,\n localProducerTransport,\n updateLocalAudioProducer,\n updateLocalProducerTransport,\n } = parameters;\n\n if (localProducerTransport) {\n localAudioProducer = await localProducerTransport.produce(audioParams);\n\n updateLocalAudioProducer?.(localAudioProducer);\n updateLocalProducerTransport?.(localProducerTransport);\n }\n } catch (error) {\n console.error(\"Error connecting local audio transport:\", error);\n throw error; // Re-throw to let the parent handle it\n }\n};\n\nexport const updateMicLevel = async (audioProducer: Producer, updateAudioLevel: (level: number) => void) => {\n try {\n setInterval(() => {\n const sender = audioProducer!.rtpSender;\n\n sender?.getStats().then((stats) => {\n stats.forEach((report) => {\n\n if (report.type === \"media-source\" && report.kind === \"audio\" && report.audioLevel !== undefined) {\n const newLevel = 127.5 + (report.audioLevel * 127.5);\n updateAudioLevel(newLevel);\n }\n\n });\n });\n }, 1000);\n } catch {\n // Handle error\n }\n}\n\n\n/**\n * Connects the send transport for audio by producing audio data and updating the audio producer and producer transport objects.\n *\n * If the primary connection fails, it attempts to connect using the local transport via a separate function.\n *\n * @param {ConnectSendTransportAudioOptions} options - The options for connecting the send transport.\n * @param {ProducerOptions} options.audioParams - The audio parameters.\n * @param {ConnectSendTransportAudioParameters} options.parameters - The parameters required for connecting the transport.\n * @param {Producer | null} options.parameters.audioProducer - The audio producer object.\n * @param {Transport | null} options.parameters.producerTransport - The producer transport object.\n * @param {Producer | null} [options.parameters.localAudioProducer] - The local audio producer object.\n * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport object.\n * @param {(producer: Producer | null) => void} options.parameters.updateAudioProducer - The function to update the audio producer object.\n * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the producer transport object.\n * @param {(localProducer: Producer | null) => void} [options.parameters.updateLocalAudioProducer] - The function to update the local audio producer object.\n * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport object.\n * @param {(level: number) => void} [options.parameters.updateAudioLevel] - The function to update the audio level.\n * @returns {Promise<void>} A promise that resolves when the connection is established.\n *\n * @example\n * const options = {\n * audioParams: { codec: \"opus\", maxBitrate: 128000 },\n * parameters: {\n * audioProducer: null,\n * producerTransport: transport,\n * localAudioProducer: null,\n * localProducerTransport: localTransport,\n * updateAudioProducer: (producer) => console.log(\"Updated producer:\", producer),\n * updateProducerTransport: (transport) => console.log(\"Updated transport:\", transport),\n * updateLocalAudioProducer: (localProducer) => console.log(\"Updated local producer:\", localProducer),\n * updateLocalProducerTransport: (localTransport) => console.log(\"Updated local transport:\", localTransport),\n * updateAudioLevel: (level) => console.log(\"Updated audio level:\", level),\n * },\n * };\n *\n * connectSendTransportAudio(options)\n * .then(() => console.log(\"Audio transport connected successfully\"))\n * .catch((error) => console.error(\"Error connecting audio transport:\", error));\n */\n\nexport const connectSendTransportAudio: ConnectSendTransportAudioType = async ({\n parameters,\n audioParams,\n targetOption = \"all\",\n}: ConnectSendTransportAudioOptions): Promise<void> => {\n try {\n let {\n audioProducer,\n producerTransport,\n updateAudioProducer,\n updateProducerTransport,\n } = parameters;\n\n // Attempt to connect the primary send transport\n if (targetOption === \"all\" || targetOption === \"remote\") {\n audioProducer = await producerTransport!.produce(audioParams);\n\n // Update the audio level\n updateMicLevel(audioProducer, parameters.updateAudioLevel);\n\n // Update state with the new producer and transport\n updateAudioProducer(audioProducer);\n updateProducerTransport(producerTransport);\n }\n\n // Attempt to connect the local send transport\n if (targetOption === \"all\" || targetOption === \"local\") {\n try {\n await connectLocalSendTransportAudio({ parameters, audioParams });\n\n // Update the audio level\n if (targetOption === \"local\" && parameters.updateAudioLevel) {\n if (!parameters.localAudioProducer) {\n parameters = parameters.getUpdatedAllParams();\n }\n updateMicLevel(parameters.localAudioProducer!, parameters.updateAudioLevel);\n }\n } catch (localError) {\n console.error(\"Local audio transport connection failed:\", localError);\n }\n }\n\n } catch (primaryError) {\n console.error(\"audio transport connection failed:\", primaryError);\n throw new Error(\"Failed to connect to audio transport.\");\n }\n};\n","import type { Transport, Producer, Device, ProducerOptions } from 'mediasoup-client/lib/types';\n\nexport interface ConnectSendTransportScreenParameters {\n screenProducer: Producer | null;\n localScreenProducer?: Producer | null;\n device: Device | null;\n screenParams: ProducerOptions;\n producerTransport: Transport | null;\n localProducerTransport?: Transport | null;\n params: ProducerOptions;\n updateScreenProducer: (producer: Producer | null) => void;\n updateLocalScreenProducer?: (localProducer: Producer | null) => void;\n updateProducerTransport: (transport: Transport | null) => void;\n updateLocalProducerTransport?: (localTransport: Transport | null) => void;\n\n getUpdatedAllParams: () => ConnectSendTransportScreenParameters;\n [key: string]: any; // Extendable for additional parameters\n}\n\nexport interface ConnectSendTransportScreenOptions {\n stream: MediaStream;\n parameters: ConnectSendTransportScreenParameters;\n targetOption?: \"all\" | \"local\" | \"remote\";\n}\n\n// Export the type definition for the function\nexport type ConnectSendTransportScreenType = (options: ConnectSendTransportScreenOptions) => Promise<void>;\n\nconst connectLocalSendTransportScreen = async ({\n stream,\n parameters,\n}: ConnectSendTransportScreenOptions): Promise<void> => {\n try {\n let {\n localScreenProducer,\n localProducerTransport,\n updateLocalScreenProducer,\n updateLocalProducerTransport,\n device,\n } = parameters;\n\n // Find VP9 codec for local screen share\n const codec = device?.rtpCapabilities?.codecs?.find(\n (codec: { mimeType: string }) =>\n codec.mimeType.toLowerCase() === \"video/vp9\"\n );\n\n // Produce local screen share data\n if (localProducerTransport) {\n localScreenProducer = await localProducerTransport.produce({\n track: stream.getVideoTracks()[0],\n codec,\n appData: { mediaTag: \"screen-video\" },\n });\n\n // Update the local producer and transport objects\n updateLocalScreenProducer?.(localScreenProducer);\n updateLocalProducerTransport?.(localProducerTransport);\n } \n } catch (error) {\n console.error(\"Error connecting local screen transport:\", error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Sets up and connects a screen sharing transport for sending video streams.\n *\n * This function supports both a primary and a local screen producer, delegating local handling to a separate function.\n *\n * @param {ConnectSendTransportScreenOptions} options - The configuration options for setting up the screen transport.\n * @param {\"all\" | \"local\" | \"remote\"} [options.targetOption] - The target option for connecting the transport.\n * @param {MediaStream} options.stream - The screen stream to be shared.\n * @param {ConnectSendTransportScreenParameters} options.parameters - The parameters required for setting up the screen transport.\n * @param {Producer | null} options.parameters.screenProducer - The screen producer object to be updated.\n * @param {Device | null} options.parameters.device - The device object for media capabilities.\n * @param {ProducerOptions} options.parameters.screenParams - The parameters for the screen producer.\n * @param {Transport | null} options.parameters.producerTransport - The producer transport object.\n * @param {ProducerOptions} options.parameters.params - The parameters for the producer.\n * @param {Function} options.parameters.updateScreenProducer - The function to update the screen producer object.\n * @param {Function} options.parameters.updateProducerTransport - The function to update the producer transport object.\n * @param {Function} [options.parameters.updateLocalScreenProducer] - The function to update the local screen producer object.\n * @param {Function} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport object.\n * @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.\n * @param {Object} [options.parameters.*] - Additional parameters for future use.\n * \n * @returns {Promise<void>} - A promise that resolves once the screen transport is successfully connected and set up.\n *\n * @throws Will throw an error if there is an issue with the connection or setup process.\n *\n * @example\n * ```typescript\n * await connectSendTransportScreen({\n * stream: screenStream,\n * targetOption: \"all\",\n * parameters: {\n * screenProducer: null,\n * localScreenProducer: null,\n * device: mediaDevice,\n * screenParams: { encodings: [{ maxBitrate: 1500000 }] },\n * producerTransport: sendTransport,\n * localProducerTransport: localSendTransport,\n * params: { track: screenStream.getVideoTracks()[0] },\n * updateScreenProducer: setScreenProducer,\n * updateLocalScreenProducer: setLocalScreenProducer,\n * updateProducerTransport: setProducerTransport,\n * updateLocalProducerTransport: setLocalProducerTransport,\n * getUpdatedAllParams: getParams,\n * },\n * });\n * ```\n */\n\nexport const connectSendTransportScreen: ConnectSendTransportScreenType = async ({\n stream,\n parameters,\n targetOption = \"all\",\n}: ConnectSendTransportScreenOptions): Promise<void> => {\n try {\n let {\n screenProducer,\n device,\n screenParams,\n producerTransport,\n params,\n updateScreenProducer,\n updateProducerTransport,\n } = parameters;\n\n // Fetch updated device information\n device = parameters.getUpdatedAllParams().device;\n\n // Retrieve screen share parameters\n params = screenParams;\n\n // Find VP9 codec for screen share\n const codec = device?.rtpCapabilities?.codecs?.find(\n (codec: { mimeType: string }) =>\n codec.mimeType.toLowerCase() === \"video/vp9\"\n );\n\n // Produce screen share data using the producer transport\n if (targetOption === \"remote\" || targetOption === \"all\") {\n screenProducer = await producerTransport!.produce({\n track: stream.getVideoTracks()[0],\n ...params,\n codec,\n appData: { mediaTag: \"screen-video\" },\n });\n\n // Update the screen producer and producer transport objects\n updateScreenProducer(screenProducer);\n updateProducerTransport(producerTransport);\n }\n\n // Produce screen share data using the local producer transport\n if (targetOption === \"local\" || targetOption === \"all\") {\n try {\n await connectLocalSendTransportScreen({ stream, parameters });\n } catch (localError) {\n console.log(\"Error connecting local screen transport:\", localError);\n }\n }\n\n } catch (error) {\n console.log(\"connectSendTransportScreen error\", error);\n throw error;\n }\n};\n","import type { Device, Producer, ProducerOptions, Transport } from 'mediasoup-client/lib/types';\n\nexport interface ConnectSendTransportVideoParameters {\n videoProducer: Producer | null;\n localVideoProducer?: Producer | null;\n device: Device | null;\n producerTransport: Transport | null;\n localProducerTransport?: Transport | null;\n islevel: string;\n updateMainWindow: boolean;\n updateVideoProducer: (producer: Producer | null) => void;\n updateLocalVideoProducer?: (localProducer: Producer | null) => void;\n updateProducerTransport: (transport: Transport | null) => void;\n updateLocalProducerTransport?: (localTransport: Transport | null) => void;\n updateUpdateMainWindow: (state: boolean) => void;\n [key: string]: any; // Extendable for additional parameters\n}\n\nexport interface ConnectSendTransportVideoOptions {\n videoParams: ProducerOptions;\n parameters: ConnectSendTransportVideoParameters;\n targetOption?: \"all\" | \"local\" | \"remote\";\n}\n\n// Export the type definition for the function\nexport type ConnectSendTransportVideoType = (options: ConnectSendTransportVideoOptions) => Promise<void>;\n\nconst connectLocalSendTransportVideo = async ({\n videoParams,\n parameters,\n}: ConnectSendTransportVideoOptions): Promise<void> => {\n try {\n let {\n localVideoProducer,\n localProducerTransport,\n updateLocalVideoProducer,\n updateLocalProducerTransport,\n } = parameters;\n\n // Produce local video data if transport exists\n if (localProducerTransport) {\n localVideoProducer = await localProducerTransport.produce(videoParams);\n\n // Update local producer and transport\n updateLocalVideoProducer?.(localVideoProducer);\n updateLocalProducerTransport?.(localProducerTransport);\n }\n } catch (error) {\n console.error(\"Error connecting local video transport:\", error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Connects the send transport for video by producing video data and updates the relevant states.\n *\n * This function supports both a primary and a local video producer, delegating local handling to a separate function.\n *\n * @param {ConnectSendTransportVideoOptions} options - The options for connecting the send transport for video.\n * @param {ProducerOptions} options.videoParams - The parameters for the video producer.\n * @param {\"all\" | \"local\" | \"remote\"} [options.targetOption] - The target option for the video transport connection.\n * @param {ConnectSendTransportVideoParameters} options.parameters - The parameters for the video transport connection.\n * @param {Producer | null} options.parameters.videoProducer - The primary video producer.\n * @param {Producer | null} [options.parameters.localVideoProducer] - The local video producer.\n * @param {Device | null} options.parameters.device - The device information.\n * @param {Transport | null} options.parameters.producerTransport - The primary producer transport.\n * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport.\n * @param {string} options.parameters.islevel - The connection level for the video transport.\n * @param {boolean} options.parameters.updateMainWindow - The flag to update the main window state.\n * @param {(producer: Producer | null) => void} options.parameters.updateVideoProducer - The function to update the video producer state.\n * @param {(localProducer: Producer | null) => void} [options.parameters.updateLocalVideoProducer] - The function to update the local video producer state.\n * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the producer transport state.\n * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport state.\n * @param {(state: boolean) => void} options.parameters.updateUpdateMainWindow - The function to update the main window state.\n * @param {any} [options.parameters] - Additional parameters for future use.\n * @returns {Promise<void>} A promise that resolves when the send transport for video is connected.\n *\n * @throws Will throw an error if the connection fails.\n *\n * @example\n * const options = {\n * videoParams: {\n * // video producer options (e.g., codec, bitrate)\n * },\n * targetOption: \"all\",\n * parameters: {\n * videoProducer: null,\n * localVideoProducer: null,\n * producerTransport: transport,\n * localProducerTransport: localTransport,\n * islevel: '2',\n * updateMainWindow: false,\n * updateVideoProducer: (producer) => console.log(\"Updated producer\"),\n * updateLocalVideoProducer: (localProducer) => console.log(\"Updated local producer\"),\n * updateProducerTransport: (transport) => console.log(\"Updated transport\"),\n * updateLocalProducerTransport: (localTransport) => console.log(\"Updated local transport\"),\n * updateUpdateMainWindow: (state) => console.log(\"Updated main window:\", state),\n * },\n * };\n *\n * connectSendTransportVideo(options)\n * .then(() => console.log(\"Video transport connected successfully\"))\n * .catch((error) => console.error(\"Error connecting video transport:\", error));\n */\n\nexport const connectSendTransportVideo: ConnectSendTransportVideoType = async ({\n videoParams,\n parameters,\n targetOption = \"all\",\n}: ConnectSendTransportVideoOptions): Promise<void> => {\n try {\n let {\n videoProducer,\n producerTransport,\n islevel,\n updateMainWindow,\n updateVideoProducer,\n updateProducerTransport,\n updateUpdateMainWindow,\n } = parameters;\n\n // Produce video data using the primary transport\n if (targetOption === \"all\" || targetOption === \"remote\"){\n videoProducer = await producerTransport!.produce(videoParams);\n\n // Update main window state based on the video connection level\n if (islevel === \"2\") {\n updateMainWindow = true;\n }\n\n // Update video producer, transport, and UI state\n updateVideoProducer(videoProducer);\n updateProducerTransport(producerTransport);\n updateUpdateMainWindow(updateMainWindow);\n }\n\n // Handle local video transport regardless of primary success or \n if (targetOption === \"all\" || targetOption === \"local\") {\n try {\n await connectLocalSendTransportVideo({ videoParams, parameters });\n } catch (localError) {\n console.log(\"Error connecting local video transport:\", localError);\n }\n }\n } catch (error) {\n console.log(\"connectSendTransportVideo error\", error);\n throw error;\n }\n};\n","import type { Device, Transport, DtlsParameters } from 'mediasoup-client/lib/types';\nimport { Socket } from \"socket.io-client\";\nimport {\n ConnectSendTransportParameters,\n ConnectSendTransportType,\n} from \"../types/types\";\n\nexport interface CreateSendTransportParameters extends ConnectSendTransportParameters {\n islevel: string;\n member: string;\n socket: Socket;\n localSocket?: Socket;\n device: Device | null;\n producerTransport: Transport | null;\n localProducerTransport?: Transport | null;\n transportCreated: boolean;\n localTransportCreated?: boolean;\n updateProducerTransport: (producerTransport: Transport | null) => void;\n updateLocalProducerTransport?: (localTransport: Transport | null) => void;\n updateTransportCreated: (transportCreated: boolean) => void;\n updateLocalTransportCreated?: (localTransportCreated: boolean) => void;\n\n // mediasfu functions\n connectSendTransport: ConnectSendTransportType;\n getUpdatedAllParams: () => CreateSendTransportParameters;\n [key: string]: any;\n}\n\nexport interface CreateSendTransportOptions {\n option: \"audio\" | \"video\" | \"screen\" | \"all\";\n parameters: CreateSendTransportParameters;\n}\n\n// Export the type definition for the function\nexport type CreateSendTransportType = (options: CreateSendTransportOptions) => Promise<void>;\n\nconst createLocalSendTransport = async ({\n option,\n parameters,\n}: CreateSendTransportOptions): Promise<void> => {\n try {\n let {\n islevel,\n member,\n socket,\n localSocket,\n device,\n localProducerTransport,\n localTransportCreated,\n updateLocalProducerTransport,\n updateLocalTransportCreated,\n\n connectSendTransport,\n } = parameters;\n\n\n if (!localSocket || !localSocket.id || socket.id === localSocket.id) {\n return;\n }\n\n localSocket.emit(\n \"createWebRtcTransport\",\n { consumer: false, islevel },\n async ({ params }: { params: any }) => {\n if (params && params.error) {\n console.error(\"Error in local createWebRtcTransport:\", params.error);\n return;\n }\n\n // Create local send transport\n localProducerTransport = await device!.createSendTransport(params);\n if (updateLocalProducerTransport) {\n updateLocalProducerTransport(localProducerTransport);\n }\n\n // Handle local transport events\n localProducerTransport.on(\n \"connect\",\n async ({ dtlsParameters }: { dtlsParameters: DtlsParameters }, callback: () => void, errback: (error: Error) => void) => {\n try {\n localSocket.emit(\"transport-connect\", { dtlsParameters });\n callback();\n } catch (error) {\n errback(error as Error);\n }\n }\n );\n\n localProducerTransport.on(\n \"produce\",\n async (\n parameters: { kind: string; rtpParameters: any; appData: any },\n callback: (response: { id: string }) => void,\n errback: (error: Error) => void\n ) => {\n try {\n localSocket.emit(\n \"transport-produce\",\n {\n kind: parameters.kind,\n rtpParameters: parameters.rtpParameters,\n appData: parameters.appData,\n islevel,\n name: member,\n },\n ({ id }: { id: string }) => callback({ id })\n );\n } catch (error) {\n errback(error as Error);\n }\n }\n );\n\n localProducerTransport.on(\"connectionstatechange\", (state: string) => {\n if (state === \"failed\") {\n console.error(\"Local transport connection failed.\");\n if (localProducerTransport) {\n localProducerTransport.close();\n }\n }\n });\n\n // Mark local transport as created\n localTransportCreated = true;\n updateLocalTransportCreated?.(localTransportCreated);\n\n // connect local transport\n await connectSendTransport({\n targetOption: \"local\",\n option,\n parameters: { ...parameters, localProducerTransport: localProducerTransport },\n });\n }\n );\n } catch (error) {\n console.error(\"Error creating local send transport:\", error);\n }\n};\n\n/**\n * Creates a WebRTC send transport and sets up event handlers for the transport.\n *\n * Supports both primary and local transports with modular handling.\n *\n * @param {CreateSendTransportOptions} options - The options for creating the send transport.\n * @param {string} options.option - The type of transport to create.\n * @param {CreateSendTransportParameters} options.parameters - The parameters required for creating the transport.\n * @param {string} options.parameters.islevel - The level of the transport.\n * @param {string} options.parameters.member - The member name for the transport.\n * @param {Socket} options.parameters.socket - The primary socket instance.\n * @param {Device} options.parameters.device - The device instance.\n * @param {Transport | null} options.parameters.producerTransport - The primary producer transport object.\n * @param {boolean} options.parameters.transportCreated - The state of the primary transport creation.\n * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the primary transport object.\n * @param {(state: boolean) => void} options.parameters.updateTransportCreated - The function to update the primary transport creation state.\n * @param {Function} options.parameters.connectSendTransport - The function to connect the send transport.\n * @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.\n * @param {Socket} [options.parameters.localSocket] - The local socket instance.\n * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport object.\n * @param {boolean} [options.parameters.localTransportCreated] - The state of the local transport creation.\n * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local transport object.\n * @param {(state: boolean) => void} [options.parameters.updateLocalTransportCreated] - The function to update the local transport creation state.\n* @returns {Promise<void>} A promise that resolves when the send transport is created and configured.\n *\n * @throws Will throw an error if there is an issue creating the send transport.\n *\n * @example\n * const options = {\n * option: 'video',\n * parameters: {\n * islevel: '1',\n * member: 'John Doe',\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * device: deviceInstance,\n * producerTransport: null,\n * localProducerTransport: null,\n * transportCreated: false,\n * localTransportCreated: false,\n * updateProducerTransport: (transport) => console.log('Primary transport updated:', transport),\n * updateLocalProducerTransport: (transport) => console.log('Local transport updated:', transport),\n * updateTransportCreated: (state) => console.log('Primary transport created:', state),\n * updateLocalTransportCreated: (state) => console.log('Local transport created:', state),\n * },\n * };\n *\n * createSendTransport(options)\n * .then(() => console.log('Send transport created successfully'))\n * .catch((error) => console.error('Error creating send transport:', error));\n */\n\nexport const createSendTransport: CreateSendTransportType = async ({\n option,\n parameters,\n}: CreateSendTransportOptions): Promise<void> => {\n try {\n // Destructure parameters\n let {\n islevel,\n member,\n socket,\n device,\n producerTransport,\n transportCreated,\n updateProducerTransport,\n updateTransportCreated,\n connectSendTransport,\n } = parameters;\n\n // Get updated device and socket parameters\n const updatedParams = parameters.getUpdatedAllParams();\n device = updatedParams.device;\n socket = updatedParams.socket;\n\n try {\n // Handle local transport creation first\n await createLocalSendTransport({option, parameters});\n } catch (error) {\n console.log(\"Error creating local send transport:\", error);\n }\n\n // Emit createWebRtcTransport event to the server\n socket.emit(\n \"createWebRtcTransport\",\n { consumer: false, islevel: islevel },\n async ({ params }: { params: any }) => {\n // Check if there is an error in the response\n if (params && params.error) {\n console.error(\"Error in createWebRtcTransport:\", params.error);\n return;\n }\n\n // Create a WebRTC send transport\n producerTransport = await device!.createSendTransport(params);\n updateProducerTransport(producerTransport);\n\n // Handle 'connect' event\n producerTransport.on(\n \"connect\",\n async ({ dtlsParameters }: { dtlsParameters: DtlsParameters }, callback: () => void, errback: (error: Error) => void) => {\n try {\n socket.emit(\"transport-connect\", { dtlsParameters });\n callback();\n } catch (error) {\n errback(error as Error);\n }\n }\n );\n\n // Handle 'produce' event\n producerTransport.on(\n \"produce\",\n async (\n parameters: { kind: string; rtpParameters: any; appData: any },\n callback: (response: { id: string }) => void,\n errback: (error: Error) => void\n ) => {\n try {\n socket.emit(\n \"transport-produce\",\n {\n kind: parameters.kind,\n rtpParameters: parameters.rtpParameters,\n appData: parameters.appData,\n islevel: islevel,\n name: member,\n },\n async ({ id }: { id: string }) => {\n callback({ id });\n }\n );\n } catch (error) {\n errback(error as Error);\n }\n }\n );\n\n // Handle 'connectionstatechange' event\n producerTransport.on(\"connectionstatechange\", async (state: string) => {\n switch (state) {\n case \"connecting\":\n break;\n case \"connected\":\n break;\n case \"failed\":\n console.log(\"Transport connection failed.\");\n producerTransport!.close();\n break;\n default:\n break;\n }\n });\n\n // Update transport creation state\n transportCreated = true;\n parameters = parameters.getUpdatedAllParams();\n await connectSendTransport({\n targetOption: \"remote\",\n option,\n parameters: {\n ...parameters,\n producerTransport,\n },\n });\n updateTransportCreated(transportCreated);\n }\n );\n\n } catch (error) {\n console.log(\"Error creating send transport:\", error);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport { PrepopulateUserMediaType, PrepopulateUserMediaParameters } from \"../types/types\";\nimport type { Producer } from 'mediasoup-client/lib/types';\n\nexport interface DisconnectSendTransportAudioParameters extends PrepopulateUserMediaParameters {\n audioProducer: Producer | null;\n localAudioProducer?: Producer | null;\n socket: Socket;\n localSocket?: Socket;\n videoAlreadyOn: boolean;\n islevel: string;\n lock_screen: boolean;\n shared: boolean;\n updateMainWindow: boolean;\n hostLabel: string;\n roomName: string;\n updateAudioProducer: (audioProducer: Producer | null) => void;\n updateLocalAudioProducer?: (localAudioProducer: Producer | null) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n // mediasfu functions\n prepopulateUserMedia: PrepopulateUserMediaType;\n [key: string]: any;\n}\n\nexport interface DisconnectSendTransportAudioOptions {\n parameters: DisconnectSendTransportAudioParameters;\n}\n\n// Export the type definition for the function\nexport type DisconnectSendTransportAudioType = (options: DisconnectSendTransportAudioOptions) => Promise<void>;\n\nconst disconnectLocalSendTransportAudio = async ({\n parameters,\n}: DisconnectSendTransportAudioOptions): Promise<void> => {\n try {\n const {\n localAudioProducer,\n localSocket,\n roomName,\n updateLocalAudioProducer,\n } = parameters;\n\n if (localSocket && localSocket.id) {\n // Close the local audio producer and notify the server\n if (localAudioProducer) {\n localAudioProducer.close(); // Actual logic: pause instead of close for MediaSFU preference\n updateLocalAudioProducer?.(null);\n }\n\n localSocket.emit(\"pauseProducerMedia\", { mediaTag: \"audio\", roomName: roomName });\n } else {\n return;\n }\n } catch (error) {\n console.log(\"Error disconnecting local audio send transport:\", error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Disconnects the send transport for audio by pausing the audio producer and updating the UI accordingly.\n *\n * This function supports both a primary and a local audio producer, delegating local handling to a separate function.\n *\n * @param {DisconnectSendTransportAudioOptions} options - The options for disconnecting the send transport for audio.\n * @param {DisconnectSendTransportAudioParameters} options.parameters - The parameters for disconnecting the send transport for audio.\n * @param {Producer} options.parameters.audioProducer - The primary audio producer to disconnect.\n * @param {Producer} [options.parameters.localAudioProducer] - The local audio producer to disconnect.\n * @param {Socket} options.parameters.socket - The socket instance to use for communication.\n * @param {Socket} [options.parameters.localSocket] - The local socket instance to use for communication.\n * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if video is already on.\n * @param {string} options.parameters.islevel - The level of the user.\n * @param {boolean} options.parameters.lock_screen - Flag indicating if the screen is locked.\n * @param {boolean} options.parameters.shared - Flag indicating if the screen is shared.\n * @param {boolean} options.parameters.updateMainWindow - Flag to update the main window.\n * @param {string} options.parameters.hostLabel - The label for the host user.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {function} options.parameters.updateAudioProducer - Function to update the audio producer.\n * @param {function} [options.parameters.updateLocalAudioProducer] - Function to update the local audio producer (optional).\n * @param {function} options.parameters.updateUpdateMainWindow - Function to update the main window state.\n * @param {function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {object} options.parameters - The parameters required for disconnecting the send transport for audio.\n * @returns {Promise<void>} A promise that resolves when the send transport for audio is disconnected.\n *\n * @throws Will throw an error if the operation fails.\n *\n * @example\n * const options = {\n * parameters: {\n * audioProducer: audioProducerInstance,\n * localAudioProducer: localAudioProducerInstance,\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * videoAlreadyOn: false,\n * islevel: '1',\n * lock_screen: false,\n * shared: false,\n * updateMainWindow: true,\n * hostLabel: 'Host',\n * roomName: 'Room 1',\n * updateAudioProducer: (producer) => console.log('Updated audio producer:', producer),\n * updateLocalAudioProducer: (producer) => console.log('Updated local audio producer:', producer),\n * updateUpdateMainWindow: (state) => console.log('Main window state updated:', state),\n * prepopulateUserMedia: async ({ name, parameters }) => console.log('Prepopulating user media for', name),\n * },\n * };\n *\n * disconnectSendTransportAudio(options)\n * .then(() => console.log(\"Audio send transport disconnected successfully\"))\n * .catch((error) => console.log(\"Error disconnecting audio send transport:\", error));\n */\n\nexport const disconnectSendTransportAudio: DisconnectSendTransportAudioType = async ({\n parameters,\n}: DisconnectSendTransportAudioOptions): Promise<void> => {\n try {\n // Destructure parameters\n let {\n audioProducer,\n socket,\n videoAlreadyOn,\n islevel,\n lock_screen,\n shared,\n updateMainWindow,\n hostLabel,\n roomName,\n updateAudioProducer,\n updateUpdateMainWindow,\n\n //mediasfu functions\n prepopulateUserMedia,\n } = parameters;\n\n // Pause the primary audio producer\n if (audioProducer) {\n audioProducer.pause(); // Actual logic: pause instead of close for MediaSFU preference\n updateAudioProducer(audioProducer);\n }\n\n // Update the UI\n if (!videoAlreadyOn && islevel === \"2\") {\n if (!lock_screen && !shared) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n\n await prepopulateUserMedia({ name: hostLabel, parameters });\n\n updateMainWindow = false;\n updateUpdateMainWindow(updateMainWindow);\n }\n }\n\n // Notify the server about pausing audio producer\n socket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n });\n\n // Handle local audio transport\n try {\n await disconnectLocalSendTransportAudio({ parameters });\n } catch (localError) {\n console.log(\"Error disconnecting local audio send transport:\", localError);\n }\n } catch (error) {\n console.log(\"Error disconnecting primary audio send transport:\", error);\n }\n};\n","import type { Producer } from 'mediasoup-client/lib/types';\nimport { Socket } from \"socket.io-client\";\n\nexport interface DisconnectSendTransportScreenParameters {\n screenProducer: Producer | null;\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n updateScreenProducer: (screenProducer: Producer | null) => void;\n updateLocalScreenProducer?: (localScreenProducer: Producer | null) => void;\n\n getUpdatedAllParams: () => DisconnectSendTransportScreenParameters;\n [key: string]: any;\n}\nexport interface DisconnectSendTransportScreenOptions {\n parameters: DisconnectSendTransportScreenParameters;\n}\n\n// Export the type definition for the function\nexport type DisconnectSendTransportScreenType = (options: DisconnectSendTransportScreenOptions) => Promise<void>;\n\nconst disconnectLocalSendTransportScreen = async ({ parameters }: DisconnectSendTransportScreenOptions) : Promise<void> => {\n\n try {\n // Destructure parameters\n let {\n localScreenProducer,\n localSocket,\n roomName,\n updateLocalScreenProducer,\n } = parameters;\n\n if (localSocket && localSocket.id) {\n localScreenProducer!.close();\n updateLocalScreenProducer!(localScreenProducer);\n\n // Notify the server about closing the screen producer and pausing screen sharing\n localSocket.emit('closeScreenProducer');\n localSocket.emit('pauseProducerMedia', { mediaTag: 'screen', roomName: roomName });\n }\n } catch {\n console.log('Error disconnecting local send transport for screen');\n }\n\n}\n\n\n/**\n * Disconnects the send transport for screen sharing.\n *\n * This function closes the screen producer, updates the state, and notifies the server\n * about the closure and pausing of screen sharing.\n *\n * @param {DisconnectSendTransportScreenOptions} options - The options for disconnecting the send transport.\n * @param {Object} options.parameters - The parameters required for disconnection.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {Producer | null} options.parameters.screenProducer - The screen producer to be closed.\n * @param {Socket} options.parameters.socket - The socket connection to notify the server.\n * @param {Socket} [options.parameters.localSocket] - The local socket connection for communication.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {Function} options.parameters.updateScreenProducer - Function to update the screen producer state.\n * @param {Function} [options.parameters.updateLocalScreenProducer] - Function to update the local screen producer state.\n * @returns {Promise<void>} A promise that resolves when the disconnection process is complete.\n * @throws {Error} If an error occurs during the disconnection process.\n *\n * @example\n * const options = {\n * parameters: {\n * screenProducer: screenProducerInstance,\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * roomName: 'Room 1',\n * updateScreenProducer: (producer) => console.log('Updated screen producer:', producer),\n * updateLocalScreenProducer: (localProducer) => console.log('Updated local screen producer:', localProducer),\n * getUpdatedAllParams: () => ({\n * screenProducer: screenProducerInstance,\n * socket: socketInstance,\n * roomName: 'Room 1',\n * }),\n * },\n * };\n *\n * disconnectSendTransportScreen(options)\n * .then(() => {\n * console.log('Screen send transport disconnected successfully');\n * })\n * .catch((error) => {\n * console.error('Error disconnecting screen send transport:', error);\n * });\n */\n\nexport const disconnectSendTransportScreen = async ({ parameters }: DisconnectSendTransportScreenOptions) : Promise<void> => {\n\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams()\n\n try {\n // Destructure parameters\n let {\n screenProducer,\n socket,\n roomName,\n updateScreenProducer,\n } = parameters;\n\n // Close the screen producer and update the state\n screenProducer!.close();\n updateScreenProducer(screenProducer);\n\n // Notify the server about closing the screen producer and pausing screen sharing\n socket.emit('closeScreenProducer');\n socket.emit('pauseProducerMedia', { mediaTag: 'screen', roomName: roomName });\n\n } catch (error) {\n\n // Handle errors during the disconnection process\n if (error instanceof Error) {\n console.log('Error disconnecting send transport for screen:', error.message);\n } else {\n console.log('Error disconnecting send transport for screen:', error);\n }\n }\n\n try {\n // Disconnect the local screen producer\n await disconnectLocalSendTransportScreen({ parameters }); \n } catch {\n // Handle errors during the disconnection process\n }\n};\n","import type { Producer } from 'mediasoup-client/lib/types';\nimport { Socket } from 'socket.io-client';\nimport { ReorderStreamsType, ReorderStreamsParameters } from '../types/types';\n\nexport interface DisconnectSendTransportVideoParameters extends ReorderStreamsParameters {\n videoProducer: Producer | null;\n localVideoProducer?: Producer | null;\n socket: Socket;\n localSocket?: Socket;\n islevel: string;\n roomName: string;\n lock_screen: boolean;\n updateMainWindow: boolean;\n updateUpdateMainWindow: (state: boolean) => void;\n updateVideoProducer: (producer: Producer | null) => void;\n updateLocalVideoProducer?: (producer: Producer | null) => void;\n\n // mediasfu functions\n reorderStreams: ReorderStreamsType;\n [key: string]: any;\n}\n\nexport interface DisconnectSendTransportVideoOptions {\n parameters: DisconnectSendTransportVideoParameters;\n}\n\n// Export the type definition for the function\nexport type DisconnectSendTransportVideoType = (options: DisconnectSendTransportVideoOptions) => Promise<void>;\n\nconst disconnectLocalSendTransportVideo = async ({\n parameters,\n}: DisconnectSendTransportVideoOptions): Promise<void> => {\n try {\n const {\n localVideoProducer,\n localSocket,\n roomName,\n updateLocalVideoProducer,\n } = parameters;\n\n if (localSocket && localSocket.id) {\n // continue\n }else {\n return \n }\n\n // Close the local video producer and notify the server\n if (localVideoProducer) {\n localVideoProducer.close();\n updateLocalVideoProducer?.(null);\n }\n\n \n localSocket.emit('pauseProducerMedia', { mediaTag: 'video', roomName: roomName });\n \n } catch (error) {\n console.error('Error disconnecting local video send transport:', error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Disconnects the send transport for video, closes the video producer, and updates the state.\n *\n * This function supports both a primary and a local video producer, delegating local handling to a separate function.\n *\n * @param {DisconnectSendTransportVideoOptions} options - The options for disconnecting the send transport.\n * @param {DisconnectSendTransportVideoParameters} options.parameters - The parameters required for disconnecting the send transport.\n * @param {Producer | null} options.parameters.videoProducer - The primary video producer object.\n * @param {Producer | null} [options.parameters.localVideoProducer] - The local video producer object (optional).\n * @param {Socket} options.parameters.socket - The primary socket object.\n * @param {Socket} [options.parameters.localSocket] - The local socket object (optional).\n * @param {string} options.parameters.islevel - The participant's level.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {boolean} options.parameters.updateMainWindow - The flag to update the main window.\n * @param {boolean} options.parameters.lock_screen - The flag to lock the screen.\n * @param {Function} options.parameters.updateUpdateMainWindow - The function to update the main window state.\n * @param {Function} options.parameters.updateVideoProducer - The function to update the video producer state.\n * @param {Function} [options.parameters.updateLocalVideoProducer] - The function to update the local video producer state (optional).\n * @param {ReorderStreamsType} options.parameters.reorderStreams - The function to reorder streams.\n * @param {Function} [options.parameters.updateLocalProducerTransport] - The function to update the local producer transport state (optional).\n * @param {Function} [options.parameters.updateProducerTransport] - The function to update the producer transport state (optional).\n * \n * @returns {Promise<void>} A promise that resolves when the disconnection process is complete.\n * \n * @throws {Error} Throws an error if the disconnection process fails.\n *\n * @example\n * const options = {\n * parameters: {\n * videoProducer: videoProducerInstance,\n * localVideoProducer: localVideoProducerInstance,\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * islevel: '2',\n * roomName: 'Room A',\n * updateMainWindow: false,\n * lock_screen: false,\n * updateUpdateMainWindow: (state) => console.log('Main window updated:', state),\n * updateVideoProducer: (producer) => console.log('Video producer updated:', producer),\n * updateLocalVideoProducer: (producer) => console.log('Local video producer updated:', producer),\n * reorderStreams: reorderStreamsFunction,\n * },\n * };\n *\n * disconnectSendTransportVideo(options)\n * .then(() => console.log('Video send transport disconnected successfully'))\n * .catch((error) => console.error('Error disconnecting video send transport:', error));\n */\n\nexport const disconnectSendTransportVideo: DisconnectSendTransportVideoType = async ({\n parameters,\n}: DisconnectSendTransportVideoOptions): Promise<void> => {\n try {\n let {\n videoProducer,\n socket,\n islevel,\n roomName,\n updateMainWindow,\n lock_screen,\n updateUpdateMainWindow,\n updateVideoProducer,\n reorderStreams,\n } = parameters;\n\n // Close the primary video producer and notify the server\n if (videoProducer) {\n videoProducer.close();\n updateVideoProducer(null);\n }\n\n socket.emit('pauseProducerMedia', { mediaTag: 'video', roomName: roomName });\n\n // Update the UI based on the participant's level and screen lock status\n if (islevel === '2') {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n }\n\n if (lock_screen) {\n await reorderStreams({ add: true, screenChanged: true, parameters });\n } else {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n\n // Handle local video transport regardless of primary success or failure\n try {\n await disconnectLocalSendTransportVideo({ parameters });\n } catch (localError) {\n console.error('Error disconnecting local video send transport:', localError);\n }\n } catch (error) {\n // Handle errors during the disconnection process\n if (error instanceof Error) {\n console.log('Error disconnecting send transport for video:', error.message);\n } else {\n console.log('Error disconnecting send transport for video:', error);\n }\n }\n};\n","import {\n Stream, Participant, Transport,\n EventType\n} from \"../types/types\";\n\ninterface DispStreamEntryLike<TMediaStream = MediaStream> {\n producerId?: string | null;\n audioID?: string | null;\n id?: string | null;\n name?: string | null;\n muted?: boolean | null;\n stream?: TMediaStream | null;\n}\n\ninterface DispParticipantLike<TMediaStream = MediaStream> extends DispStreamEntryLike<TMediaStream> {\n name: string;\n islevel?: string | null;\n videoID?: string | null;\n}\n\ntype StreamCollectionUpdater<TEntry> = {\n bivarianceHack: (streams: TEntry[]) => void;\n}[\"bivarianceHack\"];\n\ntype OpaqueAsyncInvoker = {\n bivarianceHack: (options: any) => Promise<any>;\n}[\"bivarianceHack\"];\n\ntype EstimateResult = [unknown, number, number, ...unknown[]];\n\ntype OpaqueEstimateInvoker = {\n bivarianceHack: (options: any) => EstimateResult;\n}[\"bivarianceHack\"];\n\ntype OpaqueCheckGridInvoker = {\n bivarianceHack: (options: any) => Promise<any> | any;\n}[\"bivarianceHack\"];\n\nexport interface DispStreamsParameters<\n TStream extends DispStreamEntryLike<any> = Stream,\n TParticipant extends DispParticipantLike<any> = Participant,\n TTransport = Transport,\n TMediaStream = MediaStream,\n> {\n consumerTransports: TTransport[];\n streamNames: TStream[];\n audStreamNames: TStream[];\n participants: TParticipant[];\n ref_participants: TParticipant[];\n recordingDisplayType: 'video' | 'media' | 'all';\n recordingVideoOptimized: boolean;\n meetingDisplayType: string;\n meetingVideoOptimized: boolean;\n currentUserPage: number;\n hostLabel: string;\n mainHeightWidth: number;\n prevMainHeightWidth: number;\n prevDoPaginate: boolean;\n doPaginate: boolean;\n firstAll: boolean;\n shared: boolean;\n shareScreenStarted: boolean;\n shareEnded: boolean;\n oldAllStreams: (TStream | TParticipant)[];\n updateMainWindow: boolean;\n remoteProducerId?: string;\n activeNames: string[];\n dispActiveNames: string[];\n p_dispActiveNames: string[];\n nForReadjustRecord: number;\n first_round: boolean;\n lock_screen: boolean;\n chatRefStreams: (TStream | TParticipant)[];\n eventType: EventType;\n islevel: string;\n localStreamVideo: TMediaStream | null;\n\n breakOutRoomStarted: boolean;\n breakOutRoomEnded: boolean;\n keepBackground: boolean;\n virtualStream: TMediaStream | null;\n\n updateActiveNames: (names: string[]) => void;\n updateDispActiveNames: (names: string[]) => void;\n updateLStreams: StreamCollectionUpdater<TStream | TParticipant>;\n updateChatRefStreams: StreamCollectionUpdater<TStream | TParticipant>;\n updateNForReadjustRecord: (n: number) => void;\n updateUpdateMainWindow: (value: boolean) => void;\n updateShowMiniView: (value: boolean) => void;\n\n // mediasfu functions\n prepopulateUserMedia: OpaqueAsyncInvoker;\n rePort: OpaqueAsyncInvoker;\n processConsumerTransports: OpaqueAsyncInvoker;\n resumePauseStreams: OpaqueAsyncInvoker;\n readjust: OpaqueAsyncInvoker;\n addVideosGrid: OpaqueAsyncInvoker;\n getEstimate: OpaqueEstimateInvoker;\n checkGrid: OpaqueCheckGridInvoker;\n resumePauseAudioStreams: OpaqueAsyncInvoker;\n\n getUpdatedAllParams: () => DispStreamsParameters<TStream, TParticipant, TTransport, TMediaStream>;\n [key: string]: any;\n}\n\nexport interface DispStreamsOptions<\n TParameters extends DispStreamsParameters<any, any, any, any> = DispStreamsParameters,\n> {\n lStreams: TParameters extends DispStreamsParameters<infer TStream, infer TParticipant, any, any>\n ? (TStream | TParticipant)[]\n : (Stream | Participant)[];\n ind: number;\n auto?: boolean;\n ChatSkip?: boolean;\n forChatCard?: any;\n forChatID?: any;\n parameters: TParameters;\n breakRoom?: number;\n inBreakRoom?: boolean;\n}\n\n// Export the type definition for the function\nexport type DispStreamsType = <\n TParameters extends DispStreamsParameters<any, any, any, any> = DispStreamsParameters,\n>(options: DispStreamsOptions<TParameters>) => Promise<void>;\n\n/**\n * Function to display streams based on various parameters and conditions.\n *\n * @param {DispStreamsOptions} options - The options object.\n * @param {Array} options.lStreams - List of streams to display.\n * @param {number} options.ind - Index of the current stream.\n * @param {boolean} [options.auto=false] - Flag to indicate if the function should run automatically.\n * @param {boolean} [options.ChatSkip=false] - Flag to indicate if chat should be skipped.\n * @param {string|null} [options.forChatID=null] - ID for chat reference.\n * @param {DispStreamsParameters} options.parameters - Parameters object containing various settings and functions.\n * @param {number} [options.breakRoom=-1] - Break room number.\n * @param {boolean} [options.inBreakRoom=false] - Flag to indicate if in break room.\n *\n * @returns {Promise<void>} A promise that resolves when the function completes.\n *\n * @throws Will log an error if an issue occurs during the display of streams.\n *\n * @example\n * const options = {\n * lStreams: [stream1, stream2],\n * ind: 0,\n * auto: true,\n * ChatSkip: false,\n * forChatID: 'chat123',\n * parameters: {\n * consumerTransports: [],\n * streamNames: [],\n * audStreamNames: [],\n * participants: [],\n * ref_participants: [],\n * recordingDisplayType: 'video',\n * recordingVideoOptimized: false,\n * meetingDisplayType: 'video',\n * meetingVideoOptimized: false,\n * currentUserPage: 1,\n * hostLabel: 'Host',\n * mainHeightWidth: 800,\n * prevMainHeightWidth: 600,\n * prevDoPaginate: false,\n * doPaginate: true,\n * firstAll: true,\n * shared: false,\n * shareScreenStarted: false,\n * shareEnded: false,\n * oldAllStreams: [],\n * updateMainWindow: true,\n * remoteProducerId: null,\n * activeNames: [],\n * dispActiveNames: [],\n * p_dispActiveNames: [],\n * nForReadjustRecord: 0,\n * first_round: false,\n * lock_screen: false,\n * chatRefStreams: [],\n * eventType: 'meeting',\n * islevel: '1',\n * localStreamVideo: null,\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: false,\n * keepBackground: false,\n * virtualStream: null,\n * updateActiveNames: (names) => console.log('Updated active names:', names),\n * updateDispActiveNames: (names) => console.log('Updated displayed active names:', names),\n * updateLStreams: (streams) => console.log('Updated limited streams:', streams),\n * updateChatRefStreams: (streams) => console.log('Updated chat reference streams:', streams),\n * updateNForReadjustRecord: (n) => console.log('Updated n for readjustment:', n),\n * updateUpdateMainWindow: (state) => console.log('Main window updated:', state),\n * updateShowMiniView: (value) => console.log('Mini view updated:', value),\n * prepopulateUserMedia: async () => { console.log('your logic')},\n * rePort: async () => { console.log('your logic')},\n * processConsumerTransports: async () => { console.log('your logic')},\n * resumePauseStreams: async () => { console.log('your logic')},\n * readjust: async () => { console.log('your logic')},\n * addVideosGrid: async () => { console.log('your logic')},\n * getEstimate: async () => { console.log('your logic')},\n * checkGrid: async () => { console.log('your logic')},\n * resumePauseAudioStreams: async () => { console.log('your logic')},\n * getUpdatedAllParams: () => { console.log('your logic')},\n * },\n * breakRoom: 1,\n * inBreakRoom: false,\n * };\n * \n * dispStreams(options)\n * .then(() => {\n * console.log('Streams displayed successfully');\n * })\n * .catch((error) => {\n * console.error('Error displaying streams:', error);\n * });\n */\n\nexport async function dispStreams<\n TParameters extends DispStreamsParameters<any, any, any, any> = DispStreamsParameters,\n>({\n lStreams,\n ind,\n auto = false,\n ChatSkip = false,\n forChatID = null,\n parameters,\n breakRoom = -1,\n inBreakRoom = false,\n}: DispStreamsOptions<TParameters>): Promise<void> {\n // Function to display streams\n\n const { getUpdatedAllParams } = parameters;\n const updatedParameters = getUpdatedAllParams() as TParameters;\n parameters = updatedParameters;\n\n let {\n consumerTransports,\n streamNames,\n audStreamNames,\n participants,\n ref_participants,\n recordingDisplayType,\n recordingVideoOptimized,\n meetingDisplayType,\n meetingVideoOptimized,\n currentUserPage,\n hostLabel,\n mainHeightWidth,\n prevMainHeightWidth,\n prevDoPaginate,\n doPaginate,\n firstAll,\n shared,\n shareScreenStarted,\n shareEnded,\n oldAllStreams,\n updateMainWindow,\n remoteProducerId,\n activeNames,\n dispActiveNames,\n p_dispActiveNames,\n nForReadjustRecord,\n first_round,\n lock_screen,\n chatRefStreams,\n eventType,\n islevel,\n localStreamVideo,\n\n breakOutRoomStarted,\n breakOutRoomEnded,\n keepBackground,\n virtualStream,\n\n updateActiveNames,\n updateDispActiveNames,\n updateLStreams,\n updateChatRefStreams,\n updateNForReadjustRecord,\n updateUpdateMainWindow,\n updateShowMiniView,\n\n prepopulateUserMedia,\n rePort,\n processConsumerTransports,\n resumePauseStreams,\n readjust,\n addVideosGrid,\n checkGrid,\n getEstimate,\n resumePauseAudioStreams,\n } = parameters;\n\n let proceed = true;\n\n let lStreams_ = lStreams.filter((stream) => stream.producerId !== \"youyou\" && stream.producerId !== \"youyouyou\");\n\n lStreams_ = lStreams_.filter((stream) => stream.id !== \"youyou\" && stream.id !== \"youyouyou\" && stream.name !== \"youyou\" && stream.name !== \"youyouyou\");\n\n if (eventType === \"chat\") {\n proceed = true;\n } else if (ind === 0 || (islevel !== \"2\" && currentUserPage === ind)) {\n proceed = false;\n\n //get the name of every participant in lStreams if stream !null and assign it to activeNames\n lStreams_.forEach((stream) => {\n let checker = false;\n let check_level = 0;\n\n if (recordingDisplayType === \"video\") {\n if (recordingVideoOptimized) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n checker = true;\n check_level = 0;\n }\n } else {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\")) {\n checker = true;\n check_level = 1;\n }\n }\n } else if (recordingDisplayType === \"media\") {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\")) {\n checker = true;\n check_level = 1;\n }\n } else {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name !== null &&\n stream.name != \"\")) {\n checker = true;\n check_level = 2;\n }\n }\n\n let participant;\n\n if (checker) {\n // find the participant with the same videoID as the stream\n if (check_level == 0) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n } else if (check_level == 1) {\n // find for either producerId or name\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n if (!participant) {\n if (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") {\n participant = audStreamNames.find(\n (obj) => obj.producerId === stream.audioID\n );\n if (!participant) {\n participant = ref_participants.find(\n (obj) => obj.audioID === stream.audioID\n );\n }\n }\n }\n } else if (check_level == 2) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n if (!participant) {\n if (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") {\n participant = audStreamNames.find(\n (obj) => obj.producerId === stream.audioID\n );\n if (!participant) {\n participant = ref_participants.find(\n (obj) => obj.audioID === stream.audioID\n );\n }\n }\n }\n if (!participant) {\n if (Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name !== null &&\n stream.name != \"\") {\n participant = ref_participants.find(\n (obj) => obj.name === stream.name\n );\n }\n }\n }\n\n // push the name of the participant to activeNames\n if (participant) {\n // if activeNames does not include the name of the participant, push it\n if (participant.name && !activeNames.includes(participant.name)) {\n activeNames.push(participant.name);\n }\n }\n }\n });\n\n updateActiveNames(activeNames);\n\n lStreams_.forEach((stream) => {\n let disp_checker = false;\n let disp_check_level = 0;\n\n if (meetingDisplayType == \"video\") {\n if (meetingVideoOptimized) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n disp_checker = true;\n disp_check_level = 0;\n }\n } else {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\")) {\n disp_checker = true;\n disp_check_level = 1;\n }\n }\n } else if (meetingDisplayType == \"media\") {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\")) {\n disp_checker = true;\n disp_check_level = 1;\n }\n } else {\n if ((Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") ||\n (Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name !== null &&\n stream.name != \"\")) {\n disp_checker = true;\n disp_check_level = 2;\n }\n }\n\n let participant_;\n\n if (disp_checker) {\n if (disp_check_level == 0) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant_ = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n } else if (disp_check_level == 1) {\n // find for either producerId or name\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant_ = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n if (!participant_) {\n if (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") {\n participant_ = audStreamNames.find(\n (obj) => obj.producerId === stream.audioID\n );\n if (!participant_) {\n participant_ = ref_participants.find(\n (obj) => obj.audioID === stream.audioID\n );\n }\n }\n }\n } else if (disp_check_level == 2) {\n if (Object.prototype.hasOwnProperty.call(stream, \"producerId\") &&\n stream.producerId != null &&\n stream.producerId !== \"\") {\n participant_ = streamNames.find(\n (obj) => obj.producerId === stream.producerId\n );\n }\n if (!participant_) {\n if (Object.prototype.hasOwnProperty.call(stream, \"audioID\") &&\n stream.audioID != null &&\n stream.audioID !== \"\") {\n participant_ = audStreamNames.find(\n (obj) => obj.producerId === stream.audioID\n );\n if (!participant_) {\n participant_ = ref_participants.find(\n (obj) => obj.audioID === stream.audioID\n );\n }\n }\n }\n if (!participant_) {\n if (Object.prototype.hasOwnProperty.call(stream, \"name\") &&\n stream.name !== null &&\n stream.name != \"\") {\n participant_ = ref_participants.find(\n (obj) => obj.name === stream.name\n );\n }\n }\n }\n }\n\n // push the name of the participant to activeNames\n if (participant_) {\n // if dispActiveNames does not include the name of the participant, push it\n if (participant_.name && !dispActiveNames.includes(participant_.name)) {\n dispActiveNames.push(participant_.name);\n if (!p_dispActiveNames.includes(participant_.name)) {\n proceed = true;\n }\n }\n }\n });\n\n updateDispActiveNames(dispActiveNames);\n\n if (lStreams_.length < 1 && (shareScreenStarted || shared || !firstAll)) {\n proceed = true;\n }\n\n if (shareScreenStarted || shared) {\n // Additional logic\n } else {\n if (prevMainHeightWidth !== mainHeightWidth) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n }\n }\n\n nForReadjustRecord = activeNames.length;\n updateNForReadjustRecord(nForReadjustRecord);\n }\n\n if (!proceed && auto) {\n if (updateMainWindow && !lock_screen && !shared) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } else if (!first_round) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n }\n\n if (ind === 0 && eventType !== \"chat\") {\n await rePort({ parameters });\n }\n return;\n }\n\n if (eventType == \"broadcast\") {\n lStreams = lStreams_ as typeof lStreams;\n updateLStreams(lStreams);\n } else if (eventType == \"chat\") {\n if (forChatID != null) {\n lStreams = chatRefStreams as typeof lStreams;\n updateLStreams(lStreams);\n } else {\n updateShowMiniView(false);\n\n if (islevel != \"2\") {\n let host = participants.find((obj) => {\n return obj.islevel === \"2\";\n });\n\n if (host) {\n let streame;\n\n remoteProducerId = host.videoID as string;\n // get the stream from allvideostream with the same id as remoteProducerId\n\n if (islevel == \"2\") {\n host.stream =\n keepBackground && virtualStream\n ? virtualStream\n : localStreamVideo;\n } else {\n streame = oldAllStreams.find(\n (streame) => streame.producerId == remoteProducerId\n );\n // add streame to lStreams\n if (streame) {\n //remove any stream with name of host.name\n lStreams = lStreams.filter((stream) => {\n return stream.name != host.name;\n }) as typeof lStreams;\n\n lStreams.push(streame);\n }\n }\n }\n }\n\n //remove youyou and youyouyou from lStreams and then put it at the end\n let youyou = lStreams.find((obj) => {\n return obj.producerId === \"youyou\" || obj.producerId === \"youyouyou\";\n });\n\n lStreams = lStreams.filter((stream) => {\n return (\n stream.producerId != \"youyou\" && stream.producerId != \"youyouyou\"\n );\n }) as typeof lStreams;\n\n if (youyou) {\n lStreams.push(youyou);\n }\n\n chatRefStreams = lStreams;\n\n updateLStreams(lStreams);\n updateChatRefStreams(chatRefStreams);\n }\n }\n\n let refLength = lStreams.length;\n\n const [, rows, cols] = getEstimate({ n: refLength, parameters });\n let result = await checkGrid({ rows, cols, actives: refLength }) || [false, 0, 0, 0, 0, 0, 0];\n let [removeAltGrid, numtoaddd, numRows, numCols, , actualRows, lastrowcols] = result;\n\n if (ChatSkip && eventType === \"chat\") {\n numRows = 1;\n numCols = 1;\n actualRows = 1;\n }\n\n await readjust({ n: lStreams.length, state: ind, parameters });\n\n let mainGridStreams = lStreams.slice(0, numtoaddd);\n let altGridStreams = lStreams.slice(numtoaddd);\n\n if (doPaginate || prevDoPaginate !== doPaginate || shared || shareScreenStarted || shareEnded) {\n let lStreams_alt = lStreams_;\n await processConsumerTransports({ consumerTransports, lStreams_: lStreams_alt, parameters });\n\n\n try {\n if (breakOutRoomStarted && !breakOutRoomEnded) {\n await resumePauseAudioStreams({ inBreakRoom, breakRoom, parameters });\n } else {\n await resumePauseStreams({ parameters });\n }\n } catch {\n // console.log('Error in resumePauseAudioStreams:', error);\n }\n\n try {\n if (!breakOutRoomStarted || (breakOutRoomStarted && breakOutRoomEnded)) {\n await resumePauseStreams({ parameters });\n }\n } catch { \n // console.log('Error in resumePauseStreams:', error\n }\n\n if (shareEnded) {\n shareEnded = false;\n }\n }\n\n if (ChatSkip && eventType === \"chat\") {\n await addVideosGrid({\n mainGridStreams,\n altGridStreams,\n numtoadd: numtoaddd - 1,\n numRows,\n numCols,\n actualRows,\n lastrowcols,\n removeAltGrid,\n parameters,\n });\n } else {\n await addVideosGrid({\n mainGridStreams,\n altGridStreams,\n numtoadd: numtoaddd,\n numRows,\n numCols,\n actualRows,\n lastrowcols,\n removeAltGrid,\n parameters,\n });\n }\n\n if (updateMainWindow && !lock_screen && !shared) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } else if (!first_round) {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n }\n\n if (ind === 0 && eventType !== \"chat\") {\n await rePort({ parameters });\n }\n}\n","import { Participant, Stream, DispStreamsParameters } from '../types/types';\n\ntype OpaqueDispStreamsInvoker = {\n bivarianceHack: (options: any) => Promise<void>;\n}['bivarianceHack'];\n\nexport interface GeneratePageContentParameters<\n TStream extends Stream = Stream,\n TParticipant extends Participant = Participant,\n TDispParameters extends DispStreamsParameters<any, any, any, any> = DispStreamsParameters<TStream, TParticipant>,\n> extends DispStreamsParameters<TStream, TParticipant> {\n paginatedStreams: (TParticipant | TStream)[][];\n currentUserPage: number;\n updateMainWindow: boolean;\n updateCurrentUserPage: (page: number) => void;\n updateUpdateMainWindow: (flag: boolean) => void;\n\n // mediasfu functions\n dispStreams: OpaqueDispStreamsInvoker;\n getUpdatedAllParams: () => GeneratePageContentParameters<TStream, TParticipant, TDispParameters>;\n [key: string]: any;\n}\n\nexport interface GeneratePageContentOptions<\n TParameters extends GeneratePageContentParameters<any, any, any> = GeneratePageContentParameters,\n> {\n page: number | string;\n parameters: TParameters;\n breakRoom?: number;\n inBreakRoom?: boolean;\n}\n\n// Export the type definition for the function\nexport type GeneratePageContentType = <\n TParameters extends GeneratePageContentParameters<any, any, any> = GeneratePageContentParameters,\n>(options: GeneratePageContentOptions<TParameters>) => Promise<void>;\n\n/**\n * Generates the content for a specific page.\n *\n * @param {GeneratePageContentOptions} options - The options for generating page content.\n * @param {number | string} options.page - The page number to generate content for.\n * @param {GeneratePageContentParameters} options.parameters - The parameters required for generating content.\n * @param {Array} options.parameters.paginatedStreams - The streams to be paginated.\n * @param {number} options.parameters.currentUserPage - The current page of the user.\n * @param {Function} options.parameters.updateMainWindow - Function to update the main window flag.\n * @param {Function} options.parameters.updateCurrentUserPage - Function to update the current user page.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window update flag.\n * @param {Function} options.parameters.dispStreams - Function to display streams for the specified page.\n * @param {number} [options.breakRoom=-1] - The break room identifier.\n * @param {boolean} [options.inBreakRoom=false] - Flag indicating if the user is in a break room.\n * \n * @returns {Promise<void>} A promise that resolves when the content generation is complete.\n * \n * @throws {Error} Throws an error if content generation fails.\n * \n * @example\n * const options = {\n * page: 1,\n * parameters: {\n * paginatedStreams: [[stream1, stream2], [stream3, stream4]], // Example paginated streams\n * currentUserPage: 0,\n * updateMainWindow: true,\n * updateCurrentUserPage: (page) => console.log('Current user page updated to:', page),\n * updateUpdateMainWindow: (flag) => console.log('Main window update flag:', flag),\n * dispStreams: async ({ lStreams, ind }) => {\n * console.log(`Displaying streams for page ${ind}:`, lStreams);\n * },\n * },\n * breakRoom: 1,\n * inBreakRoom: false,\n * };\n * \n * generatePageContent(options)\n * .then(() => {\n * console.log('Page content generated successfully');\n * })\n * .catch((error) => {\n * console.error('Error generating page content:', error);\n * });\n */\n\nexport async function generatePageContent<\n TParameters extends GeneratePageContentParameters<any, any, any> = GeneratePageContentParameters,\n>({\n page,\n parameters,\n breakRoom = -1,\n inBreakRoom = false,\n}: GeneratePageContentOptions<TParameters>): Promise<void> {\n try {\n // Destructure parameters\n let {\n paginatedStreams,\n currentUserPage,\n updateMainWindow,\n\n updateCurrentUserPage,\n updateUpdateMainWindow,\n\n //mediasfu functions\n dispStreams,\n } = parameters;\n\n // Convert page to an integer\n page = typeof page === \"string\" ? parseInt(page) : page;\n\n // Update current user page\n currentUserPage = page;\n updateCurrentUserPage(currentUserPage);\n\n // Update main window flag\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n\n // Display streams for the specified page\n await dispStreams({\n lStreams: paginatedStreams[page],\n ind: page,\n parameters,\n breakRoom,\n inBreakRoom,\n });\n } catch (error) {\n // Handle errors during content generation\n if (error instanceof Error) {\n console.log(\"Error generating page content:\", error.message);\n } else {\n console.log(\"Error generating page content:\", error);\n }\n }\n}\n","import { Stream, Participant } from \"../types/types\";\nexport interface GetVideosOptions {\n participants: Participant[];\n allVideoStreams: (Stream | Participant)[];\n oldAllStreams: (Stream | Participant)[];\n adminVidID?: string;\n updateAllVideoStreams: (streams: (Stream | Participant)[]) => void;\n updateOldAllStreams: (streams: (Stream | Participant)[]) => void;\n}\n\n// Export the type definition for the function\nexport type GetVideosType = (options: GetVideosOptions) => Promise<void>;\n\n\n/**\n * Asynchronously processes and updates video streams by filtering out the admin's video stream.\n *\n * @param {GetVideosOptions} options - The options for getting videos.\n * @param {Participant[]} options.participants - The list of participants.\n * @param {(Stream | Participant)[]} options.allVideoStreams - The list of all video streams.\n * @param {(Stream | Participant)[]} options.oldAllStreams - The list of old video streams.\n * @param {string} [options.adminVidID] - The ID of the admin's video stream.\n * @param {Function} options.updateAllVideoStreams - Function to update the state variable for all video streams.\n * @param {Function} options.updateOldAllStreams - Function to update the state variable for old video streams.\n *\n * @returns {Promise<void>} A promise that resolves when the video streams have been processed and updated.\n *\n * @throws {Error} Throws an error if an issue occurs while processing the streams.\n *\n * @example\n * const options = {\n * participants: participantList,\n * allVideoStreams: allStreams,\n * oldAllStreams: oldStreams,\n * adminVidID: 'admin-video-id',\n * updateAllVideoStreams: (streams) => {\n * console.log('All video streams updated:', streams);\n * },\n * updateOldAllStreams: (streams) => {\n * console.log('Old video streams updated:', streams);\n * },\n * };\n *\n * getVideos(options)\n * .then(() => {\n * console.log('Video streams processed successfully');\n * })\n * .catch((error) => {\n * console.error('Error processing video streams:', error);\n * });\n */\n\nexport async function getVideos({\n participants,\n allVideoStreams,\n oldAllStreams,\n adminVidID,\n updateAllVideoStreams,\n updateOldAllStreams,\n}: GetVideosOptions): Promise<void> {\n\n try {\n\n // Filter out the admin's video stream and update state variables\n let admin = participants.filter(\n (participant) => participant.islevel === \"2\"\n );\n\n if (admin.length > 0) {\n adminVidID = admin[0].videoID;\n\n if (adminVidID != null && adminVidID !== \"\") {\n let oldAllStreams_: (Stream | Participant)[] = [];\n\n // Check if the length of oldAllStreams is greater than 0\n if (oldAllStreams.length > 0) {\n oldAllStreams_ = oldAllStreams;\n }\n\n // Filter out admin's video stream from oldAllStreams\n oldAllStreams = allVideoStreams.filter(\n (streame) => streame.producerId === adminVidID\n );\n\n // If no admin's video stream found, revert to the previous state\n if (oldAllStreams.length < 1) {\n oldAllStreams = oldAllStreams_;\n }\n\n // Update the state variable for old video streams\n updateOldAllStreams(oldAllStreams);\n\n // Filter out admin's video stream from allVideoStreams\n allVideoStreams = allVideoStreams.filter(\n (streame) => streame.producerId !== adminVidID\n );\n\n // Update the state variable for all video streams\n updateAllVideoStreams(allVideoStreams);\n }\n }\n } catch (error) {\n // Handle errors during the process of updating video streams\n console.log(\"Error updating video streams:\", (error as Error).message);\n // throw error;\n }\n}\n","import { Stream, Participant } from \"../types/types\";\n\ninterface MixStreamLike {\n producerId?: string | null;\n muted?: boolean | null;\n}\n\ninterface MixParticipantLike {\n videoID?: string | null;\n muted?: boolean | null;\n}\n\nconst getProducerId = (value: unknown): string | null | undefined => {\n return (value as MixStreamLike | null | undefined)?.producerId;\n};\n\nconst getVideoId = (value: unknown): string | null | undefined => {\n return (value as MixParticipantLike | null | undefined)?.videoID;\n};\n\nconst getMuted = (value: unknown): boolean | null | undefined => {\n return (value as (MixStreamLike & MixParticipantLike) | null | undefined)?.muted;\n};\n\nexport interface MixStreamsOptions<\n TStream extends MixStreamLike = Stream,\n TParticipant extends MixParticipantLike = Participant,\n> {\n alVideoStreams: (TStream | TParticipant)[];\n non_alVideoStreams: TParticipant[];\n ref_participants: (TStream | TParticipant)[];\n}\n\n// Export the type definition for the function\nexport type MixStreamsType = <\n TStream extends MixStreamLike = Stream,\n TParticipant extends MixParticipantLike = Participant,\n>(options: MixStreamsOptions<TStream, TParticipant>) => Promise<(TStream | TParticipant)[]>;\n\n/**\n * Mixes video and audio streams and participants based on specified parameters.\n *\n * @param {MixStreamsOptions} options - The options for mixing streams.\n * @param {Array} options.alVideoStreams - The list of audio and video streams to mix.\n * @param {Array} options.non_alVideoStreams - The list of non-audio and video streams to mix.\n * @param {Array} options.ref_participants - The list of reference participants to mix.\n * @returns {Promise<Array>} A promise that resolves with the mixed streams.\n * @throws Will throw an error if there is an issue mixing the streams.\n * @example\n * ```typescript\n * const mixedStreams = await mixStreams({\n * alVideoStreams: [stream1, stream2],\n * non_alVideoStreams: [participant1, participant2],\n * ref_participants: [participant1, participant2],\n * });\n * console.log('Mixed streams:', mixedStreams);\n * ```\n */\n\n\nexport async function mixStreams<\n TStream extends MixStreamLike = Stream,\n TParticipant extends MixParticipantLike = Participant,\n>({\n alVideoStreams,\n non_alVideoStreams,\n ref_participants,\n}: MixStreamsOptions<TStream, TParticipant>): Promise<(TStream | TParticipant)[]> {\n try {\n\n const mixedStreams: (TStream | TParticipant)[] = [];\n\n // Find \"youyou\" or \"youyouyou\" stream\n const youyouStream = alVideoStreams.find(\n (obj) => getProducerId(obj) === \"youyou\" || getProducerId(obj) === \"youyouyou\"\n );\n\n let remainingAlVideoStreams = alVideoStreams.filter(\n (obj) => getProducerId(obj) !== \"youyou\" && getProducerId(obj) !== \"youyouyou\"\n );\n\n // Separate unmuted and muted streams\n const unmutedAlVideoStreams = remainingAlVideoStreams.filter((obj) => {\n const participant = ref_participants.find(\n (p) => getVideoId(p) === getProducerId(obj)\n );\n return !getMuted(obj) && participant && getMuted(participant) === false;\n });\n\n const mutedAlVideoStreams = remainingAlVideoStreams.filter((obj) => {\n const participant = ref_participants.find(\n (p) => getVideoId(p) === getProducerId(obj)\n );\n return !!getMuted(obj) || (participant && getMuted(participant) === true);\n });\n\n const nonAlVideoStreams = [...non_alVideoStreams]; // Create a copy of non_alVideoStreams\n\n // Add unmutedAlVideoStreams to mixedStreams\n mixedStreams.push(...unmutedAlVideoStreams);\n\n // Interleave the mutedAlVideoStreams and nonAlVideoStreams\n let nonAlIndex = 0;\n for (let i = 0; i < mutedAlVideoStreams.length; i++) {\n if (nonAlIndex < nonAlVideoStreams.length) {\n mixedStreams.push(nonAlVideoStreams[nonAlIndex]);\n nonAlIndex++;\n }\n mixedStreams.push(mutedAlVideoStreams[i]);\n }\n\n // Handle remaining nonAlVideoStreams (if any)\n for (let i = nonAlIndex; i < nonAlVideoStreams.length; i++) {\n mixedStreams.push(nonAlVideoStreams[i]);\n }\n\n // Unshift 'youyou' or 'youyouyou' stream to mixedStreams\n if (youyouStream) {\n mixedStreams.unshift(youyouStream);\n }\n\n return mixedStreams;\n } catch (error) {\n // Handle errors during the process of mixing streams\n console.log(\"Error mixing streams:\", (error as Error).message);\n throw error;\n }\n}\n","import { ReorderStreamsParameters, EventType } from \"../types/types\";\n\ntype OpaqueReorderStreamsInvoker = {\n bivarianceHack: (options: any) => Promise<void>;\n}[\"bivarianceHack\"];\n\nexport interface OnScreenChangesParameters extends ReorderStreamsParameters<any, any, any> {\n eventType: EventType;\n shareScreenStarted: boolean;\n shared: boolean;\n addForBasic: boolean;\n updateAddForBasic: (value: boolean) => void;\n itemPageLimit: number;\n updateItemPageLimit: (value: number) => void;\n updateMainHeightWidth: (value: number) => void;\n\n // mediasfu functions\n reorderStreams: OpaqueReorderStreamsInvoker;\n [key: string]: any;\n}\n\nexport interface OnScreenChangesOptions<\n TParameters extends OnScreenChangesParameters = OnScreenChangesParameters,\n> {\n changed?: boolean;\n parameters: TParameters;\n}\n\n// Export the type definition for the function\nexport type OnScreenChangesType = <\n TParameters extends OnScreenChangesParameters = OnScreenChangesParameters,\n>(options: OnScreenChangesOptions<TParameters>) => Promise<void>;\n\n/**\n * Handles changes in screen events such as broadcast, chat, and conference.\n * \n * @param {OnScreenChangesOptions} options - The options for handling screen changes.\n * @param {boolean} options.changed - Indicates if the screen has changed.\n * @param {object} options.parameters - The parameters for handling screen changes.\n * @param {string} options.parameters.eventType - The type of event (e.g., \"broadcast\", \"chat\", \"conference\").\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {boolean} options.parameters.addForBasic - Flag to add basic controls.\n * @param {function} options.parameters.updateMainHeightWidth - Function to update the main height and width.\n * @param {function} options.parameters.updateAddForBasic - Function to update the addForBasic flag.\n * @param {number} options.parameters.itemPageLimit - The limit for item pages.\n * @param {function} options.parameters.updateItemPageLimit - Function to update the item page limit.\n * @param {function} options.parameters.reorderStreams - Function to reorder streams.\n * \n * @returns {Promise<void>} A promise that resolves when the screen changes have been handled.\n * \n * @throws {Error} Throws an error if there is an issue handling screen changes.\n * \n * @example\n * ```typescript\n * await onScreenChanges({\n * changed: true,\n * parameters: {\n * eventType: 'conference',\n * shareScreenStarted: false,\n * shared: false,\n * addForBasic: false,\n * updateMainHeightWidth: (height) => console.log('Updated height:', height),\n * updateAddForBasic: (value) => console.log('Updated addForBasic:', value),\n * itemPageLimit: 2,\n * updateItemPageLimit: (limit) => console.log('Updated item page limit:', limit),\n * reorderStreams: async (options) => console.log('Reordered streams with options:', options),\n * },\n * });\n * ```\n */ \n\nexport async function onScreenChanges<\n TParameters extends OnScreenChangesParameters = OnScreenChangesParameters,\n>({ changed, parameters }: OnScreenChangesOptions<TParameters>): Promise<void> {\n try {\n // Destructure parameters\n let {\n eventType,\n shareScreenStarted,\n shared,\n whiteboardStarted,\n whiteboardEnded,\n addForBasic,\n updateMainHeightWidth,\n updateAddForBasic,\n itemPageLimit,\n updateItemPageLimit,\n\n //mediasfu functions\n reorderStreams,\n } = parameters;\n const screenFlowActive = shareScreenStarted || shared || (whiteboardStarted && !whiteboardEnded);\n\n // Remove element with id 'controlButtons'\n addForBasic = false;\n updateAddForBasic(addForBasic);\n\n if (eventType === \"broadcast\" || eventType === \"chat\") {\n addForBasic = true;\n updateAddForBasic(addForBasic);\n\n itemPageLimit = eventType === \"broadcast\" ? 1 : 2;\n updateItemPageLimit(itemPageLimit);\n updateMainHeightWidth(screenFlowActive ? 84 : eventType === \"broadcast\" ? 100 : 0);\n } else if (screenFlowActive) {\n updateMainHeightWidth(84);\n } else {\n if (eventType === \"conference\") {\n updateMainHeightWidth(0);\n }\n }\n\n // Update the mini cards grid\n await reorderStreams({ add: false, screenChanged: changed, parameters });\n } catch (error) {\n // Handle errors during the process of handling screen changes\n console.log(\"Error handling screen changes:\", (error as Error).message);\n // throw error;\n }\n}\n","// Stub export for prepopulateUserMedia\n// This is a React component in the original and not needed for the shared package\n\nimport { createFrameworkConsumerContractError } from './frameworkConsumerContract';\n\nexport interface PrepopulateUserMediaParameters {\n [key: string]: any;\n}\n\nexport interface PrepopulateUserMediaOptions {\n name: string;\n parameters: PrepopulateUserMediaParameters;\n}\n\nexport type PrepopulateUserMediaType = (options: PrepopulateUserMediaOptions) => Promise<void>;\n\nexport const prepopulateUserMedia: PrepopulateUserMediaType = async () => {\n throw createFrameworkConsumerContractError('prepopulateUserMedia');\n};\n","import { Stream, Participant, Transport, SleepType } from \"../types/types\";\n\ninterface ProducerIdCarrier {\n producerId?: string | null;\n}\n\nconst getProducerId = (value: unknown): string | null | undefined => {\n return (value as ProducerIdCarrier | null | undefined)?.producerId;\n};\n\ninterface ConsumerLike {\n paused?: boolean;\n kind?: string;\n pause: () => unknown;\n resume: () => unknown;\n}\n\ninterface SocketLike {\n emit: (\n event: string,\n payload: { serverConsumerId: string },\n callback?: ((payload?: { resumed: boolean }) => void | Promise<unknown>)\n ) => void;\n}\n\ninterface TransportLike {\n producerId?: string | null;\n consumer?: ConsumerLike;\n socket_: SocketLike;\n serverConsumerTransportId: string;\n}\n\nexport interface ProcessConsumerTransportsParameters<\n TStreamEntry = Stream,\n TMediaEntry = Stream | Participant,\n> {\n remoteScreenStream: TStreamEntry[];\n oldAllStreams: TMediaEntry[];\n newLimitedStreams: TMediaEntry[];\n\n // mediasfu functions\n sleep: SleepType;\n getUpdatedAllParams: () => ProcessConsumerTransportsParameters<TStreamEntry, TMediaEntry>;\n [key: string]: any;\n}\n\nexport interface ProcessConsumerTransportsOptions<\n TTransport extends TransportLike = Transport,\n TStreamEntry = Stream,\n TMediaEntry = Stream | Participant,\n> {\n consumerTransports: TTransport[];\n lStreams_: TMediaEntry[];\n parameters: ProcessConsumerTransportsParameters<TStreamEntry, TMediaEntry>;\n}\n\n// Export the type definition for the function\nexport type ProcessConsumerTransportsType = <\n TTransport extends TransportLike = Transport,\n TStreamEntry = Stream,\n TMediaEntry = Stream | Participant,\n>(options: ProcessConsumerTransportsOptions<TTransport, TStreamEntry, TMediaEntry>) => Promise<void>;\n\n/**\n * Processes consumer transports by pausing and resuming them based on certain conditions.\n *\n * @param {Object} options - The options for processing consumer transports.\n * @param {Array} options.consumerTransports - The list of consumer transports to process.\n * @param {Array} options.lStreams_ - The list of local streams.\n * @param {Object} options.parameters - The parameters object containing various stream arrays and utility functions.\n *\n * @returns {Promise<void>} - A promise that resolves when the processing is complete.\n *\n * @throws {Error} - Throws an error if there is an issue processing consumer transports.\n *\n * The function performs the following steps:\n * 1. Destructures and updates the parameters.\n * 2. Defines a helper function to check if a producerId is valid in given stream arrays.\n * 3. Filters consumer transports to resume based on certain conditions.\n * 4. Filters consumer transports to pause based on certain conditions.\n * 5. Pauses consumer transports after a short delay.\n * 6. Emits `consumer-pause` event for each filtered transport (not audio).\n * 7. Emits `consumer-resume` event for each filtered transport (not audio).\n *\n * @example\n * ```typescript\n * await processConsumerTransports({\n * consumerTransports: [transport1, transport2],\n * lStreams_: [stream1, stream2],\n * parameters: {\n * remoteScreenStream: [],\n * oldAllStreams: [],\n * newLimitedStreams: [],\n * sleep: sleepFunction,\n * getUpdatedAllParams: () => parameters,\n * },\n * });\n * ```\n */\n\nexport async function processConsumerTransports<\n TTransport extends TransportLike = Transport,\n TStreamEntry = Stream,\n TMediaEntry = Stream | Participant,\n>({\n consumerTransports,\n lStreams_,\n parameters,\n}: ProcessConsumerTransportsOptions<TTransport, TStreamEntry, TMediaEntry>): Promise<void> {\n try {\n // Destructure parameters and get updated values\n parameters = parameters.getUpdatedAllParams();\n\n const {\n remoteScreenStream,\n oldAllStreams,\n newLimitedStreams,\n sleep,\n } = parameters;\n\n // Function to check if the producerId is valid in the given stream arrays\n function isValidProducerId(producerId: string | null | undefined, ...streamArrays: unknown[][]): boolean {\n return (\n producerId !== null &&\n producerId !== \"\" &&\n streamArrays.some((streamArray) => {\n return (\n streamArray.length > 0 &&\n streamArray.some((stream) => getProducerId(stream) === producerId)\n );\n })\n );\n }\n\n // Get paused consumer transports that are not audio\n const consumerTransportsToResume = consumerTransports.filter(\n (transport) =>\n isValidProducerId(\n transport.producerId,\n lStreams_,\n remoteScreenStream,\n oldAllStreams,\n newLimitedStreams\n ) &&\n transport.consumer?.paused === true &&\n transport.consumer?.kind !== \"audio\"\n );\n\n // Get unpaused consumer transports that are not audio\n const consumerTransportsToPause = consumerTransports.filter(\n (transport) =>\n transport.producerId &&\n transport.producerId !== null &&\n transport.producerId !== \"\" &&\n !lStreams_.some(\n (stream) => getProducerId(stream) === transport.producerId\n ) &&\n transport.consumer &&\n transport.consumer?.kind &&\n transport.consumer.paused !== true &&\n transport.consumer.kind !== \"audio\" &&\n !remoteScreenStream.some((stream) => getProducerId(stream) === transport.producerId) &&\n !oldAllStreams.some((stream) => getProducerId(stream) === transport.producerId) &&\n !newLimitedStreams.some((stream) => getProducerId(stream) === transport.producerId)\n );\n\n // Pause consumer transports after a short delay\n await sleep({ ms: 100 });\n\n // Emit consumer.pause() for each filtered transport (not audio)\n for (const transport of consumerTransportsToPause) {\n transport.consumer?.pause();\n transport.socket_.emit(\n \"consumer-pause\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async () => {\n // Handle the response if needed\n }\n );\n }\n\n // Emit consumer.resume() for each filtered transport (not audio)\n for (const transport of consumerTransportsToResume) {\n transport.socket_.emit(\n \"consumer-resume\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async ({ resumed }: { resumed: boolean } = { resumed: false }) => {\n if (resumed) {\n transport.consumer?.resume();\n }\n }\n );\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`Error processing consumer transports: ${error.message}`);\n } else {\n console.error('Error processing consumer transports:', error);\n }\n // throw new Error(`Error processing consumer transports: ${error.message}`);\n }\n}\n","import { Stream, Transport, Participant, SleepType } from \"../types/types\";\n\ninterface ProducerIdCarrier {\n producerId?: string | null;\n}\n\nconst getProducerId = (value: unknown): string | null | undefined => {\n return (value as ProducerIdCarrier | null | undefined)?.producerId;\n};\n\ninterface ConsumerLike {\n paused?: boolean;\n kind?: string;\n pause: () => unknown;\n resume: () => unknown;\n}\n\ninterface SocketLike {\n emit: (\n event: string,\n payload: { serverConsumerId: string },\n callback?: ((payload?: { resumed: boolean }) => void | Promise<unknown>)\n ) => void;\n}\n\ninterface TransportLike {\n producerId?: string | null;\n consumer?: ConsumerLike;\n socket_: SocketLike;\n serverConsumerTransportId: string;\n}\n\nexport interface ProcessConsumerTransportsAudioParameters {\n\n // mediasfu functions\n sleep: SleepType;\n [key: string]: any;\n}\n\nexport interface ProcessConsumerTransportsAudioOptions<\n TTransport extends TransportLike = Transport,\n TMediaEntry = Stream | Participant,\n> {\n consumerTransports: TTransport[];\n lStreams: TMediaEntry[];\n parameters: ProcessConsumerTransportsAudioParameters;\n}\n\n// Export the type definition for the function\nexport type ProcessConsumerTransportsAudioType = <\n TTransport extends TransportLike = Transport,\n TMediaEntry = Stream | Participant,\n>(options: ProcessConsumerTransportsAudioOptions<TTransport, TMediaEntry>) => Promise<void>;\n\n/**\n * Processes consumer transports for audio streams by pausing and resuming them based on their current state and the provided streams.\n *\n * @param {Object} options - The options for processing consumer transports.\n * @param {Array} options.consumerTransports - The list of consumer transports to process.\n * @param {Array} options.lStreams - The list of local streams to check against.\n * @param {Object} options.parameters - Additional parameters for processing.\n * @param {Function} options.parameters.sleep - A function to pause execution for a specified duration.\n *\n * @returns {Promise<void>} A promise that resolves when the processing is complete.\n *\n * @throws Will throw an error if there is an issue processing the consumer transports.\n *\n * @example\n * ```typescript\n * await processConsumerTransportsAudio({\n * consumerTransports: [transport1, transport2],\n * lStreams: [stream1, stream2],\n * parameters: {\n * sleep: sleepFunction,\n * },\n * });\n * ```\n */\n\nexport const processConsumerTransportsAudio = async <\n TTransport extends TransportLike = Transport,\n TMediaEntry = Stream | Participant,\n>({\n consumerTransports,\n lStreams,\n parameters,\n}: ProcessConsumerTransportsAudioOptions<TTransport, TMediaEntry>): Promise<void> => {\n try {\n const { sleep } = parameters;\n\n // Function to check if the producerId is valid in the given stream arrays\n const isValidProducerId = (producerId: string | null | undefined, ...streamArrays: unknown[][]): boolean => {\n return (\n producerId !== null &&\n producerId !== \"\" &&\n streamArrays.some((streamArray) => {\n return (\n streamArray.length > 0 &&\n streamArray.some((stream) => getProducerId(stream) === producerId)\n );\n })\n );\n };\n\n // Get paused consumer transports that are audio\n const consumerTransportsToResume = consumerTransports.filter(\n (transport) =>\n isValidProducerId(transport.producerId, lStreams) &&\n transport.consumer?.paused === true &&\n transport.consumer?.kind === \"audio\"\n );\n\n // Get unpaused consumer transports that are audio\n const consumerTransportsToPause = consumerTransports.filter(\n (transport) =>\n transport.producerId &&\n transport.producerId !== null &&\n transport.producerId !== \"\" &&\n !lStreams.some(\n (stream) => getProducerId(stream) === transport.producerId\n ) &&\n transport.consumer &&\n transport.consumer?.kind &&\n transport.consumer.paused !== true &&\n transport.consumer.kind === \"audio\"\n );\n\n await sleep({ms:100});\n\n // Emit consumer.pause() for each transport to pause\n for (const transport of consumerTransportsToPause) {\n transport.consumer?.pause();\n transport.socket_.emit(\n \"consumer-pause\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async () => {\n // Handle the response if needed\n }\n );\n }\n\n // Emit consumer.resume() for each transport to resume\n for (const transport of consumerTransportsToResume) {\n transport.socket_.emit(\n \"consumer-resume\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async ({ resumed }: { resumed: boolean } = { resumed: false }) => {\n if (resumed) {\n transport.consumer?.resume();\n }\n }\n );\n }\n } catch (error) {\n console.error(\"Error in processConsumerTransportsAudio:\", error);\n }\n};\n\n","\n \nimport { PrepopulateUserMediaParameters, PrepopulateUserMediaOptions, EventType } from '../types/types';\n\ntype PrepopulateUserMediaInvoker = {\n bivarianceHack: (options: PrepopulateUserMediaOptions) => Promise<unknown>;\n}['bivarianceHack'];\n\nexport interface ReadjustParameters extends PrepopulateUserMediaParameters {\n eventType: EventType;\n shareScreenStarted: boolean;\n shared: boolean;\n mainHeightWidth: number;\n prevMainHeightWidth: number;\n hostLabel: string;\n first_round: boolean;\n lock_screen: boolean;\n updateMainHeightWidth: (value: number) => void;\n\n // mediasfu functions\n prepopulateUserMedia: PrepopulateUserMediaInvoker;\n getUpdatedAllParams: () => ReadjustParameters;\n [key: string]: any;\n}\n\nexport interface ReadjustOptions<TParameters extends ReadjustParameters = ReadjustParameters> {\n n: number;\n state: number;\n parameters: TParameters;\n}\n\n// Export the type definition for the function\nexport type ReadjustType = <TParameters extends ReadjustParameters = ReadjustParameters>(\n options: ReadjustOptions<TParameters>\n) => Promise<void>;\n\n/**\n * Adjusts the layout parameters based on the provided options.\n *\n * @param {ReadjustOptions} options - The options for readjusting the layout.\n * @param {number} options.n - The number of participants or elements.\n * @param {number} options.state - The current state of the layout.\n * @param {object} options.parameters - The parameters for the layout adjustment.\n * @param {function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {string} options.parameters.eventType - The type of event (e.g., \"broadcast\", \"chat\", \"conference\").\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.parameters.shared - Indicates if content is being shared.\n * @param {number} options.parameters.mainHeightWidth - The main height and width value.\n * @param {number} options.parameters.prevMainHeightWidth - The previous main height and width value.\n * @param {string} options.parameters.hostLabel - The label for the host.\n * @param {boolean} options.parameters.first_round - Indicates if it is the first round.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {function} options.parameters.updateMainHeightWidth - Function to update the main height and width.\n * @param {function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @returns {Promise<void>} A promise that resolves when the layout adjustment is complete.\n * @throws {Error} Throws an error if there is an issue updating the grid sizes.\n *\n * @example\n * ```typescript\n * await readjust({\n * n: 5,\n * state: 1,\n * parameters: {\n * eventType: 'conference',\n * shareScreenStarted: false,\n * shared: false,\n * mainHeightWidth: 100,\n * prevMainHeightWidth: 80,\n * hostLabel: 'Host Name',\n * first_round: false,\n * lock_screen: false,\n * updateMainHeightWidth: updateMainHeightWidthFunction,\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * },\n * });\n * ```\n */\n\nexport async function readjust<TParameters extends ReadjustParameters = ReadjustParameters>({\n n,\n state,\n parameters,\n}: ReadjustOptions<TParameters>): Promise<void> {\n const { getUpdatedAllParams } = parameters;\n const updatedParameters = getUpdatedAllParams() as TParameters;\n\n try {\n // Destructure parameters\n let {\n eventType,\n shareScreenStarted,\n shared,\n whiteboardStarted,\n whiteboardEnded,\n mainHeightWidth,\n prevMainHeightWidth,\n hostLabel,\n first_round,\n lock_screen,\n updateMainHeightWidth,\n prepopulateUserMedia,\n } = updatedParameters;\n const screenFlowActive = shareScreenStarted || shared || (whiteboardStarted && !whiteboardEnded);\n\n if (state === 0) {\n prevMainHeightWidth = mainHeightWidth;\n }\n\n let val1 = 6;\n let val2 = 12 - val1;\n let cal1 = Math.floor((val1 / 12) * 100);\n let cal2 = 100 - cal1;\n\n if (eventType === \"broadcast\") {\n val1 = 0;\n val2 = 12 - val1;\n\n if (n === 0) {\n val1 = 0;\n val2 = 12 - val1;\n }\n } else if (\n eventType === \"chat\" ||\n (eventType === \"conference\" && !screenFlowActive)\n ) {\n val1 = 12;\n val2 = 12 - val1;\n } else {\n if (screenFlowActive) {\n val2 = 10;\n val1 = 12 - val2;\n } else {\n if (n === 0) {\n val1 = 1;\n val2 = 12 - val1;\n } else if (n >= 1 && n < 4) {\n val1 = 4;\n val2 = 12 - val1;\n } else if (n >= 4 && n < 6) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 6 && n < 9) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 9 && n < 12) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 12 && n < 20) {\n val1 = 8;\n val2 = 12 - val1;\n } else if (n >= 20 && n < 50) {\n val1 = 8;\n val2 = 12 - val1;\n } else {\n val1 = 10;\n val2 = 12 - val1;\n }\n }\n }\n\n if (state === 0) {\n mainHeightWidth = val2;\n }\n\n cal1 = Math.floor((val1 / 12) * 100);\n cal2 = 100 - cal1;\n\n if (mainHeightWidth !== cal2) {\n updateMainHeightWidth(cal2);\n }\n\n if (prevMainHeightWidth !== mainHeightWidth) {\n if (!lock_screen && !shared) {\n await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });\n } else if (!first_round) {\n await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });\n }\n }\n } catch (error) {\n if (error instanceof Error) {\n console.log(\"Error updating grid sizes:\", error.message);\n } else {\n console.log(\"Error updating grid sizes:\", error);\n }\n }\n}\n","\nimport { Socket } from \"socket.io-client\";\nimport { GetPipedProducersAltType, GetPipedProducersAltParameters } from \"../types/types\";\n\nexport interface ReceiveAllPipedTransportsParameters extends GetPipedProducersAltParameters {\n roomName: string;\n member: string;\n\n // mediasfu functions\n getPipedProducersAlt: GetPipedProducersAltType;\n [key: string]: any;\n}\n\nexport interface ReceiveAllPipedTransportsOptions {\n nsock: Socket;\n community?: boolean;\n parameters: ReceiveAllPipedTransportsParameters;\n}\n\n// Export the type definition for the function\nexport type ReceiveAllPipedTransportsType = (options: ReceiveAllPipedTransportsOptions) => Promise<void>;\n\n/**\n * Receives all piped transports by emitting an event to the server and processing the response.\n *\n * @param {ReceiveAllPipedTransportsOptions} options - The options for receiving all piped transports.\n * @param {Socket} options.nsock - The socket instance used for communication.\n * @param {boolean} options.community - Whether the room is a community edition room.\n * @param {ReceiveAllPipedTransportsParameters} options.parameters - The parameters for the operation.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {string} options.parameters.member - The member identifier.\n * @param {Function} options.parameters.getPipedProducersAlt - The function to get piped producers for a given level.\n *\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n *\n * @throws Will log an error message if the operation fails.\n *\n * @example\n * ```typescript\n * await receiveAllPipedTransports({\n * nsock: socketInstance,\n * community: false,\n * parameters: {\n * roomName: 'Room1',\n * member: 'Member1',\n * getPipedProducersAlt: getPipedProducersAltFunction,\n * },\n * });\n * ```\n */\n\nexport const receiveAllPipedTransports = async ({ nsock, community=false, parameters }: ReceiveAllPipedTransportsOptions): Promise<void> => {\n try {\n // Destructure parameters\n const { roomName, member, getPipedProducersAlt } = parameters;\n const emitName = community ? \"createReceiveAllTransports\" : \"createReceiveAllTransportsPiped\";\n const emitData = community ? { islevel:'0' } : { roomName, member };\n // Emit createReceiveAllTransportsPiped event to the server\n await nsock.emit(\n emitName,\n emitData,\n async ({ producersExist }: { producersExist: boolean }) => {\n // Array of options representing different levels\n const options = [\"0\", \"1\", \"2\"];\n\n // If producers exist, loop through each level and get producers\n if (producersExist) {\n for (const islevel of options) {\n await getPipedProducersAlt({ nsock, community, islevel, parameters });\n }\n }\n }\n );\n } catch (error) {\n console.log(\"receiveAllPipedTransports error\", error);\n }\n};\n"," \nimport { Participant, Stream } from \"../types/types\";\n\ninterface ReorderStreamLike {\n producerId?: string | null;\n}\n\ninterface ReorderParticipantLike {\n name: string;\n islevel?: string | null;\n videoID?: string | null;\n ScreenID?: string | null;\n}\n\ntype ChangeVidsInvoker = (options: {\n screenChanged?: boolean;\n parameters: any;\n}) => Promise<void>;\n\ntype StreamCollectionUpdater<TEntry> = {\n bivarianceHack: (streams: TEntry[]) => void;\n}[\"bivarianceHack\"];\n\nconst getProducerId = (value: unknown): string | null | undefined => {\n return (value as ReorderStreamLike | null | undefined)?.producerId;\n};\n\nexport interface ReorderStreamsParameters<\n TStream extends ReorderStreamLike = Stream,\n TParticipant extends ReorderParticipantLike = Participant,\n TChangeVidsParameters = unknown,\n> {\n allVideoStreams: (TStream | TParticipant)[];\n participants: TParticipant[];\n oldAllStreams: (TStream | TParticipant)[];\n screenId?: string;\n adminVidID?: string;\n newLimitedStreams: (TStream | TParticipant)[];\n newLimitedStreamsIDs: string[];\n activeSounds: string[];\n screenShareIDStream?: string;\n screenShareNameStream?: string;\n adminIDStream?: string;\n adminNameStream?: string;\n updateNewLimitedStreams: StreamCollectionUpdater<TStream | TParticipant>;\n updateNewLimitedStreamsIDs: (ids: string[]) => void;\n updateActiveSounds: (sounds: string[]) => void;\n updateScreenShareIDStream: (id: string) => void;\n updateScreenShareNameStream: (name: string) => void;\n updateAdminIDStream: (id: string) => void;\n updateAdminNameStream: (name: string) => void;\n updateYouYouStream: StreamCollectionUpdater<TStream | TParticipant>;\n\n // mediasfu functions\n changeVids: ChangeVidsInvoker;\n getUpdatedAllParams: () => ReorderStreamsParameters<TStream, TParticipant, TChangeVidsParameters>;\n [key: string]: any;\n}\n\nexport interface ReorderStreamsOptions<\n TParameters extends ReorderStreamsParameters<any, any, any> = ReorderStreamsParameters,\n> {\n add?: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\n\nexport type ReorderStreamsType = <\n TParameters extends ReorderStreamsParameters<any, any, any> = ReorderStreamsParameters,\n>(options: ReorderStreamsOptions<TParameters>) => Promise<void>;\n\n/**\n * Reorders the video streams based on the provided options and updates the UI accordingly.\n *\n * @param {ReorderStreamsOptions} options - The options for reordering streams.\n * @param {boolean} [options.add=false] - Whether to add new streams or not.\n * @param {boolean} [options.screenChanged=false] - Whether the screen has changed or not.\n * @param {Object} options.parameters - The parameters required for reordering streams.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {Array} options.parameters.allVideoStreams - Array of all video streams.\n * @param {Array} options.parameters.participants - Array of participants.\n * @param {Array} options.parameters.oldAllStreams - Array of old streams.\n * @param {string} options.parameters.screenId - ID of the screen.\n * @param {string} options.parameters.adminVidID - ID of the admin video.\n * @param {Array} options.parameters.newLimitedStreams - Array of new limited streams.\n * @param {Array} options.parameters.newLimitedStreamsIDs - Array of new limited stream IDs.\n * @param {Array} options.parameters.activeSounds - Array of active sounds.\n * @param {string} options.parameters.screenShareIDStream - ID of the screen share stream.\n * @param {string} options.parameters.screenShareNameStream - Name of the screen share stream.\n * @param {string} options.parameters.adminIDStream - ID of the admin stream.\n * @param {string} options.parameters.adminNameStream - Name of the admin stream.\n * @param {Function} options.parameters.updateNewLimitedStreams - Function to update new limited streams.\n * @param {Function} options.parameters.updateNewLimitedStreamsIDs - Function to update new limited stream IDs.\n * @param {Function} options.parameters.updateActiveSounds - Function to update active sounds.\n * @param {Function} options.parameters.updateScreenShareIDStream - Function to update screen share ID stream.\n * @param {Function} options.parameters.updateScreenShareNameStream - Function to update screen share name stream.\n * @param {Function} options.parameters.updateAdminIDStream - Function to update admin ID stream.\n * @param {Function} options.parameters.updateAdminNameStream - Function to update admin name stream.\n * @param {Function} options.parameters.updateYouYouStream - Function to update YouYou stream.\n * @param {Function} options.parameters.changeVids - Function to reflect changes on the UI.\n *\n * @returns {Promise<void>} A promise that resolves when the reordering is complete.\n *\n * @throws {Error} Throws an error if there is an issue updating the streams.\n *\n * @example\n * ```typescript\n * await reorderStreams({\n * add: true,\n * screenChanged: false,\n * parameters: {\n * allVideoStreams: [...],\n * participants: [...],\n * // additional parameters...\n * },\n * });\n * ```\n */\n\nexport const reorderStreams = async <\n TParameters extends ReorderStreamsParameters<any, any, any> = ReorderStreamsParameters,\n>({\n add = false,\n screenChanged = false,\n parameters,\n}: ReorderStreamsOptions<TParameters>): Promise<void> => {\n const { getUpdatedAllParams } = parameters;\n const updatedParameters = getUpdatedAllParams() as TParameters;\n\n let {\n allVideoStreams,\n participants,\n oldAllStreams,\n screenId,\n adminVidID,\n newLimitedStreams,\n newLimitedStreamsIDs,\n activeSounds,\n screenShareIDStream,\n screenShareNameStream,\n adminIDStream,\n adminNameStream,\n updateNewLimitedStreams,\n updateNewLimitedStreamsIDs,\n updateActiveSounds,\n updateScreenShareIDStream,\n updateScreenShareNameStream,\n updateAdminIDStream,\n updateAdminNameStream,\n updateYouYouStream,\n\n //mediasfu functions\n changeVids,\n } = updatedParameters;\n\n // function to reorder streams on the ui\n if (!add) {\n newLimitedStreams = [];\n newLimitedStreamsIDs = [];\n activeSounds = [];\n }\n\n const youyou = allVideoStreams.filter((stream) => getProducerId(stream) === \"youyou\");\n const admin = participants.filter((participant) => participant.islevel === \"2\");\n\n if (admin.length > 0) {\n adminVidID = admin[0].videoID ?? undefined;\n } else {\n adminVidID = \"\";\n }\n\n if (adminVidID) {\n const adminStream = allVideoStreams.find((stream) => getProducerId(stream) === adminVidID);\n\n if (!add) {\n newLimitedStreams = [...newLimitedStreams, ...youyou];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => getProducerId(stream) ?? \"\")];\n } else {\n const youyouStream = newLimitedStreams.find((stream) => getProducerId(stream) === \"youyou\");\n\n if (!youyouStream) {\n newLimitedStreams = [...newLimitedStreams, ...youyou];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => getProducerId(stream) ?? \"\")];\n }\n }\n\n if (adminStream) {\n adminIDStream = adminVidID;\n\n if (!add) {\n newLimitedStreams = [...newLimitedStreams, adminStream];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, getProducerId(adminStream) ?? \"\"];\n } else {\n const adminStreamer = newLimitedStreams.find((stream) => getProducerId(stream) === adminVidID);\n\n if (!adminStreamer) {\n newLimitedStreams = [...newLimitedStreams, adminStream];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, getProducerId(adminStream) ?? \"\"];\n }\n }\n } else {\n const oldAdminStream = oldAllStreams.find((stream) => getProducerId(stream) === adminVidID);\n\n if (oldAdminStream) {\n //add it to the allVideoStream\n\n adminIDStream = adminVidID;\n adminNameStream = admin[0].name;\n\n if (!add) {\n newLimitedStreams = [...newLimitedStreams, oldAdminStream];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, getProducerId(oldAdminStream) ?? \"\"];\n } else {\n const adminStreamer = newLimitedStreams.find((stream) => getProducerId(stream) === adminVidID);\n\n if (!adminStreamer) {\n newLimitedStreams = [...newLimitedStreams, oldAdminStream];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, getProducerId(oldAdminStream) ?? \"\"];\n }\n }\n }\n }\n\n const screenParticipant = participants.filter((participant) => participant.ScreenID === screenId);\n\n if (screenParticipant.length > 0) {\n const screenParticipantVidID = screenParticipant[0].videoID ?? undefined;\n const screenParticipantVidID_ = newLimitedStreams.filter((stream) => getProducerId(stream) === screenParticipantVidID);\n\n if (screenParticipantVidID_?.length < 1 && screenParticipantVidID) {\n screenShareIDStream = screenParticipantVidID;\n screenShareNameStream = screenParticipant[0].name;\n const screenParticipantVidID__ = allVideoStreams.filter((stream) => getProducerId(stream) === screenParticipantVidID);\n newLimitedStreams = [...newLimitedStreams, ...screenParticipantVidID__];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...screenParticipantVidID__.map((stream) => getProducerId(stream) ?? \"\")];\n }\n }\n } else {\n if (!add) {\n newLimitedStreams = [...newLimitedStreams, ...youyou];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => getProducerId(stream) ?? \"\")];\n } else {\n const youyouStream = newLimitedStreams.find((stream) => getProducerId(stream) === \"youyou\");\n\n if (!youyouStream) {\n newLimitedStreams = [...newLimitedStreams, ...youyou];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...youyou.map((stream) => getProducerId(stream) ?? \"\")];\n }\n }\n\n const screenParticipant = participants.filter((participant) => participant.ScreenID === screenId);\n\n if (screenParticipant.length > 0) {\n const screenParticipantVidID = screenParticipant[0].videoID ?? undefined;\n const screenParticipantVidID_ = newLimitedStreams.filter((stream) => getProducerId(stream) === screenParticipantVidID);\n\n if (screenParticipantVidID_?.length < 1 && screenParticipantVidID) {\n screenShareIDStream = screenParticipantVidID;\n screenShareNameStream = screenParticipant[0].name;\n const screenParticipantVidID__ = allVideoStreams.filter((stream) => getProducerId(stream) === screenParticipantVidID);\n newLimitedStreams = [...newLimitedStreams, ...screenParticipantVidID__];\n newLimitedStreamsIDs = [...newLimitedStreamsIDs, ...screenParticipantVidID__.map((stream) => getProducerId(stream) ?? \"\")];\n }\n }\n }\n\n updateNewLimitedStreams(newLimitedStreams);\n updateNewLimitedStreamsIDs(newLimitedStreamsIDs);\n updateActiveSounds(activeSounds);\n updateScreenShareIDStream(screenShareIDStream!);\n updateScreenShareNameStream(screenShareNameStream!);\n updateAdminIDStream(adminIDStream!);\n updateAdminNameStream(adminNameStream!);\n updateYouYouStream(youyou);\n\n //reflect the changes on the ui\n await changeVids({ screenChanged, parameters: updatedParameters });\n};\n\n","import { ScreenState, CompareScreenStatesParameters, CompareScreenStatesType, CompareActiveNamesParameters, CompareActiveNamesType } from '../types/types';\n\n\nexport interface RePortParameters extends CompareScreenStatesParameters, CompareActiveNamesParameters {\n islevel: string;\n mainScreenPerson: string;\n adminOnMainScreen: boolean;\n mainScreenFilled: boolean;\n recordStarted: boolean;\n recordStopped: boolean;\n recordPaused: boolean;\n recordResumed: boolean;\n screenStates: ScreenState[];\n prevScreenStates: ScreenState[];\n updateScreenStates: (states: ScreenState[]) => void;\n updatePrevScreenStates: (states: ScreenState[]) => void;\n\n // mediasfu functions\n compareActiveNames: CompareActiveNamesType;\n compareScreenStates: CompareScreenStatesType;\n\n getUpdatedAllParams: () => RePortParameters;\n [key: string]: any;\n}\n\nexport interface RePortOptions {\n restart?: boolean;\n parameters: RePortParameters;\n}\n\n\n// Export the type definition for the function\nexport type RePortType = (options: RePortOptions) => Promise<void>;\n\n/**\n * RePort function that handles the reporting logic based on the provided parameters.\n *\n * @param {RePortOptions} options - The options for the rePort function.\n * @param {boolean} [options.restart=false] - Flag indicating whether to restart the process.\n * @param {Object} options.parameters - The parameters object containing various states and functions.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {string} options.parameters.islevel - The current level of the process.\n * @param {string} options.parameters.mainScreenPerson - The person on the main screen.\n * @param {boolean} options.parameters.adminOnMainScreen - Flag indicating if admin is on the main screen.\n * @param {boolean} options.parameters.mainScreenFilled - Flag indicating if the main screen is filled.\n * @param {boolean} options.parameters.recordStarted - Flag indicating if recording has started.\n * @param {boolean} options.parameters.recordStopped - Flag indicating if recording has stopped.\n * @param {boolean} options.parameters.recordPaused - Flag indicating if recording is paused.\n * @param {boolean} options.parameters.recordResumed - Flag indicating if recording has resumed.\n * @param {Array} options.parameters.screenStates - Array of current screen states.\n * @param {Function} options.parameters.updateScreenStates - Function to update the current screen states.\n * @param {Function} options.parameters.updatePrevScreenStates - Function to update the previous screen states.\n * @param {Function} options.parameters.compareActiveNames - Function to compare active names.\n * @param {Function} options.parameters.compareScreenStates - Function to compare screen states.\n *\n * @returns {Promise<void>} A promise that resolves when the reporting process is complete.\n *\n * @throws {Error} Throws an error if there is an issue during the reporting process.\n *\n * @example\n * ```typescript\n * await rePort({\n * restart: false,\n * parameters: {\n * islevel: \"2\",\n * mainScreenPerson: \"John Doe\",\n * // other parameters...\n * },\n * });\n * ```\n */\n\nexport async function rePort({ restart = false, parameters }: RePortOptions): Promise<void> {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n try {\n // Destructure parameters\n const {\n islevel,\n mainScreenPerson,\n adminOnMainScreen,\n mainScreenFilled,\n recordStarted,\n recordStopped,\n recordPaused,\n recordResumed,\n screenStates,\n updateScreenStates,\n updatePrevScreenStates,\n compareActiveNames,\n compareScreenStates,\n } = parameters;\n\n if (recordStarted || recordResumed) {\n if (recordStopped || recordPaused) {\n // Recording stopped or paused, do nothing\n } else {\n if (islevel === \"2\") {\n const previousScreenStates = [...screenStates];\n updatePrevScreenStates(previousScreenStates);\n\n const currentScreenStates = [\n { mainScreenPerson, adminOnMainScreen, mainScreenFilled },\n ];\n updateScreenStates(currentScreenStates);\n\n\n if (restart) {\n await compareActiveNames({ restart, parameters });\n return;\n }\n await compareActiveNames({ restart, parameters });\n await compareScreenStates({ restart, parameters });\n }\n }\n }\n } catch (error) {\n console.log(\"Error during rePorting: \", error);\n // throw new Error(`Error during rePorting: ${error.message}`);\n }\n}\n\n","import { Socket } from \"socket.io-client\";\nimport { ShowAlert, StartShareScreenType, StartShareScreenParameters } from \"../types/types\";\n\nexport interface RequestScreenShareParameters extends StartShareScreenParameters {\n socket: Socket;\n showAlert?: ShowAlert\n localUIMode: boolean;\n targetResolution?: string;\n targetResolutionHost?: string;\n \n\n // mediasfu functions\n startShareScreen: StartShareScreenType;\n getUpdatedAllParams : () => RequestScreenShareParameters;\n [key: string]: any;\n}\n\nexport interface RequestScreenShareOptions {\n parameters: RequestScreenShareParameters;\n}\n\n// Export the type definition for the function\nexport type RequestScreenShareType = (options: RequestScreenShareOptions) => Promise<void>;\n\n/**\n * Requests to start screen sharing.\n *\n * @param {RequestScreenShareOptions} options - The options for requesting screen share.\n * @param {Object} options.parameters - The parameters for the screen share request.\n * @param {Socket} options.parameters.socket - The socket instance to communicate with the server.\n * @param {Function} [options.parameters.showAlert] - Optional function to show alerts to the user.\n * @param {boolean} options.parameters.localUIMode - Indicates if the user is in local UI mode.\n * @param {string} [options.parameters.targetResolution] - The target resolution for screen sharing.\n * @param {string} [options.parameters.targetResolutionHost] - The target resolution for screen sharing for the host.\n * @param {Function} options.parameters.startShareScreen - Function to start screen sharing.\n *\n * @returns {Promise<void>} A promise that resolves when the screen share request is processed.\n *\n * @throws {Error} Throws an error if there is an issue during the screen share request process.\n *\n * @example\n * ```typescript\n * await requestScreenShare({\n * parameters: {\n * socket: socketInstance,\n * localUIMode: false,\n * targetResolution: 'fhd',\n * startShareScreen: startShareScreenFunction,\n * // other parameters...\n * },\n * });\n * ```\n */\n\nexport async function requestScreenShare({ parameters }: RequestScreenShareOptions): Promise<void> {\n try {\n // Destructure parameters\n let {\n socket,\n showAlert,\n localUIMode,\n targetResolution = 'hd',\n targetResolutionHost = 'hd',\n\n //mediasfu functions\n startShareScreen,\n } = parameters;\n\n let targetWidth = 1280\n let targetHeight = 720\n\n if (targetResolution == 'qhd' || targetResolutionHost == 'qhd') {\n targetWidth = 2560\n targetHeight = 1440\n } else if (targetResolution == 'fhd' || targetResolutionHost == 'fhd') {\n targetWidth = 1920\n targetHeight = 1080\n } \n\n // Check if the user is in local UI mode\n if (localUIMode === true) {\n await startShareScreen({ parameters });\n return;\n }\n\n socket.emit(\"requestScreenShare\", async ({ allowScreenShare }: { allowScreenShare: boolean; }) => {\n if (!allowScreenShare) {\n // Send an alert to the user\n showAlert?.({\n message: \"You are not allowed to share screen\",\n type: \"danger\",\n duration: 3000,\n });\n } else {\n await startShareScreen({ parameters: { ...parameters, targetWidth, targetHeight } });\n }\n });\n } catch (error) {\n // Handle errors during the process of requesting screen share\n // throw new Error(`Error during requesting screen share: ${error.message}`);\n console.log(\"Error during requesting screen share: \", error);\n }\n}\n","import { Participant, Stream, ProcessConsumerTransportsAudioParameters, Transport, EventType } from '../types/types';\n\ninterface BreakoutParticipantLike {\n name: string;\n breakRoom?: number | null;\n}\n\ninterface ParticipantLike {\n name: string;\n islevel?: string | null;\n audioID?: string | null;\n producerId?: string | null;\n breakRoom?: number | null;\n}\n\ninterface MediaEntryLike {\n producerId?: string | null;\n audioID?: string | null;\n}\n\ninterface AudioTransportLike {\n producerId?: string | null;\n consumer?: {\n paused?: boolean;\n kind?: string;\n pause: () => unknown;\n resume: () => unknown;\n };\n socket_: {\n emit: (\n event: string,\n payload: { serverConsumerId: string },\n callback?: ((payload?: { resumed: boolean }) => void | Promise<unknown>)\n ) => void;\n };\n serverConsumerTransportId: string;\n}\n\nexport interface ResumePauseAudioStreamsParameters<\n TTransport extends AudioTransportLike = Transport,\n TMediaEntry extends MediaEntryLike | ParticipantLike = Stream | Participant,\n> extends ProcessConsumerTransportsAudioParameters {\n breakoutRooms: BreakoutParticipantLike[][];\n ref_participants: ParticipantLike[];\n allAudioStreams: TMediaEntry[];\n participants: ParticipantLike[];\n islevel: string;\n eventType: EventType;\n consumerTransports: TTransport[];\n limitedBreakRoom: BreakoutParticipantLike[];\n hostNewRoom: number;\n member: string;\n updateLimitedBreakRoom: (limitedBreakRoom: BreakoutParticipantLike[]) => void;\n\n // mediasfu functions\n processConsumerTransportsAudio: (options: {\n consumerTransports: TTransport[];\n lStreams: TMediaEntry[];\n parameters: ProcessConsumerTransportsAudioParameters;\n }) => Promise<void>;\n getUpdatedAllParams: () => ResumePauseAudioStreamsParameters<TTransport, TMediaEntry>;\n [key: string]: any;\n}\n\nexport interface ResumePauseAudioStreamsOptions<\n TTransport extends AudioTransportLike = Transport,\n TMediaEntry extends MediaEntryLike | ParticipantLike = Stream | Participant,\n> {\n breakRoom?: number;\n inBreakRoom?: boolean;\n parameters: ResumePauseAudioStreamsParameters<TTransport, TMediaEntry>;\n}\n\n// Export the type definition for the function\nexport type ResumePauseAudioStreamsType = (\n options: ResumePauseAudioStreamsOptions\n) => Promise<void>;\n\n/**\n * Resumes or pauses audio streams based on the provided options.\n *\n * @param {ResumePauseAudioStreamsOptions} options - The options for resuming or pausing audio streams.\n * @param {number} [options.breakRoom=-1] - The ID of the break room.\n * @param {boolean} [options.inBreakRoom=false] - Indicates if the participant is in a break room.\n * @param {ResumePauseAudioStreamsParameters} options.parameters - The parameters required for processing audio streams.\n *\n * @returns {Promise<void>} A promise that resolves when the audio streams have been processed.\n *\n * @throws Will log an error message if there is an issue processing the audio streams.\n *\n * @example\n * ```typescript\n * await resumePauseAudioStreams({\n * breakRoom: 1,\n * inBreakRoom: true,\n * parameters: {\n * // ...parameters here\n * },\n * });\n * ```\n */\n\nexport const resumePauseAudioStreams = async <\n TTransport extends AudioTransportLike = Transport,\n TMediaEntry extends MediaEntryLike | ParticipantLike = Stream | Participant,\n>({\n breakRoom = -1,\n inBreakRoom = false,\n parameters,\n}: ResumePauseAudioStreamsOptions<TTransport, TMediaEntry>): Promise<void> => {\n const { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n const {\n breakoutRooms,\n ref_participants,\n allAudioStreams,\n participants,\n islevel,\n eventType,\n consumerTransports,\n hostNewRoom,\n member,\n updateLimitedBreakRoom,\n processConsumerTransportsAudio,\n } = parameters;\n\n let room: BreakoutParticipantLike[] = [];\n let currentStreams: TMediaEntry[] = [];\n // Determine the room based on breakout status\n if (inBreakRoom && breakRoom !== -1) {\n room = breakoutRooms[breakRoom];\n } else {\n room = ref_participants\n .filter((participant) =>\n !breakoutRooms\n .flat()\n .map((obj) => obj.name)\n .includes(participant!.name)\n )\n .map(({ name, breakRoom }) => ({ name, breakRoom }));\n \n }\n\n updateLimitedBreakRoom(room);\n\n try {\n let addHostAudio = false;\n\n if (islevel !== \"2\" && eventType === \"conference\") {\n const roomMember = breakoutRooms.find((r) =>\n r.find((p) => p.name === member)\n );\n let memberBreakRoom = -1;\n if (roomMember) {\n memberBreakRoom = breakoutRooms.indexOf(roomMember);\n }\n\n if (\n (inBreakRoom && breakRoom !== hostNewRoom) ||\n (!inBreakRoom && hostNewRoom !== -1 && hostNewRoom !== memberBreakRoom)\n ) {\n const host = participants.find((obj) => obj.islevel === \"2\");\n // Remove the host from the room\n room = room.filter((participant) => participant.name !== host?.name);\n } else {\n if (\n (inBreakRoom && breakRoom === hostNewRoom) ||\n (!inBreakRoom && hostNewRoom === -1) ||\n (!inBreakRoom &&\n hostNewRoom === memberBreakRoom &&\n memberBreakRoom !== -1)\n ) {\n addHostAudio = true;\n }\n }\n }\n\n for (let participant of room) {\n let streams = allAudioStreams.filter((stream) => {\n if (\n (Object.prototype.hasOwnProperty.call(stream, \"producerId\") && stream.producerId) ||\n (Object.prototype.hasOwnProperty.call(stream, \"audioID\") && stream.audioID)\n ) {\n let producerId = stream.producerId || stream.audioID;\n let matchingParticipant = ref_participants.find(\n (obj) => obj.audioID == producerId\n );\n return (\n matchingParticipant && matchingParticipant.name == participant.name\n );\n }\n // Return false if the stream doesn't meet the criteria\n return false;\n });\n\n currentStreams.push(...streams);\n }\n\n // If webinar, add the host audio stream if it is not in the currentStreams\n if (islevel !== \"2\" && (eventType === \"webinar\" || addHostAudio)) {\n const host = participants.find((obj) => obj.islevel === \"2\");\n const hostStream = allAudioStreams.find(\n (obj) => obj.producerId === host?.audioID\n );\n if (hostStream && !currentStreams.includes(hostStream)) {\n currentStreams.push(hostStream);\n if (!room.map((obj) => obj.name).includes(host?.name ?? \"\")) {\n room.push({ name: host?.name || \"\", breakRoom: -1 });\n }\n updateLimitedBreakRoom(room);\n }\n }\n\n await processConsumerTransportsAudio({\n consumerTransports,\n lStreams: currentStreams,\n parameters,\n });\n } catch (error) {\n console.log('Error in resumePauseAudioStreams:', error);\n }\n};\n","import { Participant, Transport, Stream } from \"../types/types\";\n\ninterface ParticipantLike {\n name: string;\n islevel?: string | null;\n videoID?: string | null;\n}\n\ninterface ConsumerLike {\n kind?: string;\n resume: () => unknown;\n}\n\ninterface SocketLike {\n emit: (\n event: string,\n payload: { serverConsumerId: string },\n callback?: ((payload: { resumed: boolean }) => void | Promise<unknown>)\n ) => void;\n}\n\ninterface TransportLike {\n producerId?: string | null;\n consumer: ConsumerLike;\n socket_: SocketLike;\n serverConsumerTransportId: string;\n}\n\nexport interface ResumePauseStreamsParameters<\n TParticipant extends ParticipantLike = Participant,\n TTransport extends TransportLike = Transport,\n TStream = Stream,\n> {\n participants: TParticipant[];\n dispActiveNames: string[];\n remoteScreenStream: TStream[];\n consumerTransports: TTransport[];\n screenId?: string;\n islevel: string;\n\n // mediasfu functions\n getUpdatedAllParams: () => ResumePauseStreamsParameters<TParticipant, TTransport, TStream>;\n [key: string]: any;\n}\n\nexport interface ResumePauseStreamsOptions<\n TParticipant extends ParticipantLike = Participant,\n TTransport extends TransportLike = Transport,\n TStream = Stream,\n> {\n parameters: ResumePauseStreamsParameters<TParticipant, TTransport, TStream>;\n}\n\n// Export the type definition for the function\nexport type ResumePauseStreamsType = <\n TParticipant extends ParticipantLike = Participant,\n TTransport extends TransportLike = Transport,\n TStream = Stream,\n>(options: ResumePauseStreamsOptions<TParticipant, TTransport, TStream>) => Promise<void>;\n\n/**\n * Resumes or pauses streams based on the provided parameters.\n *\n * @param {ResumePauseStreamsOptions} options - The options for resuming or pausing streams.\n * @param {Object} options.parameters - The parameters for the function.\n * @param {Array} options.parameters.participants - The list of participants.\n * @param {Array} options.parameters.dispActiveNames - The list of active display names.\n * @param {Array} options.parameters.consumerTransports - The list of consumer transports.\n * @param {string} [options.parameters.screenId] - The screen producer ID.\n * @param {string} options.parameters.islevel - The level of the user.\n *\n * @returns {Promise<void>} A promise that resolves when the streams have been resumed or paused.\n *\n * @throws Will throw an error if there is an issue during the process of resuming or pausing streams.\n *\n * @example\n * ```typescript\n * await resumePauseStreams({\n * parameters: {\n * participants: participantArray,\n * dispActiveNames: ['user1', 'user2'],\n * consumerTransports: transportArray,\n * screenId: 'screen-123',\n * islevel: '1',\n * },\n * });\n * ```\n */\n\nexport async function resumePauseStreams<\n TParticipant extends ParticipantLike = Participant,\n TTransport extends TransportLike = Transport,\n TStream = Stream,\n>({\n parameters,\n}: ResumePauseStreamsOptions<TParticipant, TTransport, TStream>): Promise<void> {\n try {\n // Destructure parameters\n const { participants, dispActiveNames, consumerTransports, screenId, islevel } = parameters;\n\n // Get the videoID of the host (islevel=2)\n const host = participants.find((obj) => obj.islevel === \"2\");\n const hostVideoID = host ? host.videoID : null;\n\n // Get videoIDs of participants in dispActiveNames and screenproducerId\n const videosIDs = dispActiveNames.map((name) => {\n const participant = participants.find((obj) => obj.name === name);\n return participant ? participant.videoID : null;\n });\n\n // Add screenproducerId to allVideoIDs if it's not null or empty\n if (screenId) {\n videosIDs.push(screenId);\n }\n\n // Add hostVideoID to allVideoIDs if it's not null or empty (only if the user is not the host)\n if (islevel !== \"2\" && hostVideoID) {\n videosIDs.push(hostVideoID);\n }\n\n // Remove null or empty videoIDs\n const allVideoIDs = videosIDs.filter(\n (videoID): videoID is string => videoID !== null && videoID !== \"\"\n );\n\n if (allVideoIDs.length > 0) {\n // Get consumer transports with producerId in allVideoIDs\n const consumerTransportsToResume = consumerTransports.filter(\n (transport) =>\n transport.producerId &&\n allVideoIDs.includes(transport.producerId) &&\n transport.consumer.kind !== \"audio\"\n );\n\n // Resume all consumerTransportsToResume\n for (const transport of consumerTransportsToResume) {\n transport.socket_.emit(\n \"consumer-resume\",\n { serverConsumerId: transport.serverConsumerTransportId },\n async ({ resumed }: { resumed: boolean }) => {\n if (resumed) {\n transport.consumer.resume();\n }\n }\n );\n }\n }\n } catch (error) {\n console.log(\"Error during resuming or pausing streams: \", error);\n // Handle errors during the process of resuming or pausing streams\n }\n}\n\n"," \nimport { Participant, Stream, EventType } from \"../types/types\";\n\ninterface ReUpdateInterStreamLike {\n producerId?: string | null;\n}\n\ninterface ReUpdateInterParticipantLike {\n name: string;\n videoID?: string | null;\n muted?: boolean | null;\n}\n\ntype BooleanUpdater = (value: boolean) => void;\ntype NumberUpdater = (value: number) => void;\ntype StringListUpdater = (ids: string[]) => void;\n\ntype OnScreenChangesInvoker = (options: {\n changed?: boolean;\n parameters: any;\n}) => Promise<void>;\n\ntype ReorderStreamsInvoker = (options: {\n add?: boolean;\n screenChanged?: boolean;\n parameters: any;\n}) => Promise<void>;\n\ntype ChangeVidsInvoker = (options: {\n screenChanged?: boolean;\n parameters: any;\n}) => Promise<void>;\n\nexport interface ReUpdateInterParameters<\n TStream extends ReUpdateInterStreamLike = Stream,\n TParticipant extends ReUpdateInterParticipantLike = Participant,\n> {\n screenPageLimit: number;\n itemPageLimit: number;\n reorderInterval: number;\n fastReorderInterval: number;\n eventType: EventType;\n participants: TParticipant[];\n allVideoStreams: (TParticipant | TStream)[];\n shared: boolean;\n shareScreenStarted: boolean;\n adminNameStream?: string;\n screenShareNameStream?: string;\n updateMainWindow: boolean;\n sortAudioLoudness: boolean;\n lastReorderTime: number;\n newLimitedStreams: (TParticipant | TStream)[];\n newLimitedStreamsIDs: string[];\n oldSoundIds: string[];\n updateUpdateMainWindow: BooleanUpdater;\n updateSortAudioLoudness: BooleanUpdater;\n updateLastReorderTime: NumberUpdater;\n updateNewLimitedStreams: (streams: (TParticipant | TStream)[]) => void;\n updateNewLimitedStreamsIDs: StringListUpdater;\n updateOldSoundIds: StringListUpdater;\n\n // mediasfu functions\n onScreenChanges: OnScreenChangesInvoker;\n reorderStreams: ReorderStreamsInvoker;\n changeVids: ChangeVidsInvoker;\n\n getUpdatedAllParams: () => ReUpdateInterParameters<TStream, TParticipant>;\n [key: string]: any;\n}\n\nexport interface ReUpdateInterOptions<\n TParameters extends ReUpdateInterParameters<any, any> = ReUpdateInterParameters,\n> {\n name: string;\n add?: boolean;\n force?: boolean;\n average?: number;\n parameters: TParameters;\n}\n\n// Export the type definition for the function\nexport type ReUpdateInterType = <\n TParameters extends ReUpdateInterParameters<any, any> = ReUpdateInterParameters,\n>(options: ReUpdateInterOptions<TParameters>) => Promise<void>;\n\n/**\n * Updates the interaction state based on the provided options and parameters.\n * \n * @param {ReUpdateInterOptions} options - The options for updating the interaction.\n * @param {string} options.name - The name of the participant.\n * @param {boolean} [options.add=false] - Whether to add the participant to the interaction.\n * @param {boolean} [options.force=false] - Whether to force the update.\n * @param {number} [options.average=127] - The average value used for determining reorder intervals.\n * @param {Object} options.parameters - The parameters for updating the interaction.\n * @param {number} options.parameters.screenPageLimit - The screen page limit.\n * @param {number} options.parameters.itemPageLimit - The item page limit.\n * @param {number} options.parameters.reorderInterval - The reorder interval.\n * @param {number} options.parameters.fastReorderInterval - The fast reorder interval.\n * @param {string} options.parameters.eventType - The type of event.\n * @param {Array} options.parameters.participants - The list of participants.\n * @param {Array} options.parameters.allVideoStreams - The list of all video streams.\n * @param {boolean} options.parameters.shared - Whether the screen is shared.\n * @param {boolean} options.parameters.shareScreenStarted - Whether screen sharing has started.\n * @param {string} options.parameters.adminNameStream - The admin name stream.\n * @param {string} options.parameters.screenShareNameStream - The screen share name stream.\n * @param {boolean} options.parameters.updateMainWindow - Whether to update the main window.\n * @param {boolean} options.parameters.sortAudioLoudness - Whether to sort audio by loudness.\n * @param {number} options.parameters.lastReorderTime - The last reorder time.\n * @param {Array} options.parameters.newLimitedStreams - The list of new limited streams.\n * @param {Array} options.parameters.newLimitedStreamsIDs - The list of new limited stream IDs.\n * @param {Array} options.parameters.oldSoundIds - The list of old sound IDs.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {Function} options.parameters.updateSortAudioLoudness - Function to update the audio loudness sorting.\n * @param {Function} options.parameters.updateLastReorderTime - Function to update the last reorder time.\n * @param {Function} options.parameters.updateNewLimitedStreams - Function to update the new limited streams.\n * @param {Function} options.parameters.updateNewLimitedStreamsIDs - Function to update the new limited stream IDs.\n * @param {Function} options.parameters.updateOldSoundIds - Function to update the old sound IDs.\n * @param {Function} options.parameters.onScreenChanges - Function to handle screen changes.\n * @param {Function} options.parameters.reorderStreams - Function to reorder streams.\n * @param {Function} options.parameters.changeVids - Function to change videos.\n * \n * @returns {Promise<void>} A promise that resolves when the interaction update is complete.\n *\n * @throws {Error} Throws an error if there is an issue during the updating process.\n *\n * @example\n * ```typescript\n * await reUpdateInter({\n * name: 'participant1',\n * add: true,\n * parameters: {\n * screenPageLimit: 4,\n * itemPageLimit: 2,\n * reorderInterval: 500,\n * fastReorderInterval: 200,\n * eventType: 'conference',\n * participants: [...],\n * allVideoStreams: [...],\n * shared: false,\n * shareScreenStarted: false,\n * adminNameStream: 'Admin',\n * screenShareNameStream: 'Screen Share',\n * updateMainWindow: true,\n * sortAudioLoudness: false,\n * lastReorderTime: Date.now(),\n * newLimitedStreams: [],\n * newLimitedStreamsIDs: [],\n * oldSoundIds: [],\n * updateUpdateMainWindow: (value) => { console.log('your logic') },\n * updateSortAudioLoudness: (value) => { console.log('your logic') },\n * updateLastReorderTime: (value) => { console.log('your logic') },\n * updateNewLimitedStreams: (streams) => { console.log('your logic') },\n * updateNewLimitedStreamsIDs: (ids) => { console.log('your logic') },\n * updateOldSoundIds: (ids) => { console.log('your logic') },\n * onScreenChanges: async (options) => { console.log('your logic') },\n * reorderStreams: async (options) => { console.log('your logic') },\n * changeVids: async (options) => { console.log('your logic') },\n * },\n * });\n * ```\n */\n\n\nexport async function reUpdateInter<\n TParameters extends ReUpdateInterParameters<any, any> = ReUpdateInterParameters,\n>({\n name,\n add = false,\n force = false,\n average = 127,\n parameters,\n}: ReUpdateInterOptions<TParameters>): Promise<void> {\n let {\n screenPageLimit,\n itemPageLimit,\n reorderInterval,\n fastReorderInterval,\n eventType,\n participants,\n allVideoStreams,\n shared,\n shareScreenStarted,\n adminNameStream,\n screenShareNameStream,\n updateMainWindow,\n sortAudioLoudness,\n lastReorderTime,\n newLimitedStreams,\n newLimitedStreamsIDs,\n oldSoundIds,\n updateUpdateMainWindow,\n updateSortAudioLoudness,\n updateLastReorderTime,\n updateNewLimitedStreams,\n updateNewLimitedStreamsIDs,\n updateOldSoundIds,\n\n //mediasfu functions\n onScreenChanges,\n reorderStreams,\n changeVids,\n } = parameters as TParameters;\n\n if (eventType === \"broadcast\" || eventType === \"chat\") {\n return;\n }\n\n let refLimit = screenPageLimit - 1;\n\n if (!(shareScreenStarted || shared)) {\n refLimit = itemPageLimit - 1;\n\n if (add) {\n const currentTime = Date.now();\n if (\n (currentTime - lastReorderTime >= reorderInterval && average > 128.5) ||\n (average > 130 && currentTime - lastReorderTime >= fastReorderInterval)\n ) {\n lastReorderTime = currentTime;\n sortAudioLoudness = true;\n if (eventType === \"conference\") {\n await onScreenChanges({ changed: true, parameters });\n } else {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n sortAudioLoudness = false;\n\n updateSortAudioLoudness(sortAudioLoudness);\n updateUpdateMainWindow(updateMainWindow);\n updateLastReorderTime(lastReorderTime);\n\n return;\n }\n }\n }\n\n let videoID: string | null = null;\n if (shareScreenStarted || shared) {\n if (add) {\n const participant = participants.find((p) => p.name === name);\n videoID = participant?.videoID ?? null;\n\n if (!videoID) {\n return;\n }\n\n if (!newLimitedStreamsIDs.includes(videoID)) {\n //first check length of newLimitedStreams to not exceed refLimit, if so remove oldSoundID from newLimitedStreams\n if (newLimitedStreams.length > refLimit) {\n let oldoldSounds = [...oldSoundIds];\n for (let i = 0; i < oldSoundIds.length; i++) {\n if (newLimitedStreams.length > refLimit) {\n // remove stream from newLimitedStreams\n if (newLimitedStreams.length < screenPageLimit) {\n return;\n }\n const currentId = oldSoundIds[i];\n if (\n currentId !== screenShareNameStream &&\n currentId !== adminNameStream\n ) {\n newLimitedStreams = newLimitedStreams.filter(\n (stream) => stream.producerId !== currentId\n );\n newLimitedStreamsIDs = newLimitedStreamsIDs.filter(\n (id) => id !== currentId\n );\n oldoldSounds = oldoldSounds.filter((id) => id !== currentId);\n }\n }\n }\n oldSoundIds = [...oldoldSounds];\n }\n\n const stream = allVideoStreams.find(\n (s) => s.producerId === videoID\n );\n if (stream && newLimitedStreams.length < screenPageLimit) {\n newLimitedStreams.push(stream);\n newLimitedStreamsIDs.push(videoID);\n if (!oldSoundIds.includes(name)) {\n oldSoundIds.push(name);\n }\n await changeVids({ screenChanged: true, parameters });\n }\n }\n } else {\n if (!force) {\n try {\n // remove stream from newLimitedStreams\n if (newLimitedStreams.length < screenPageLimit) {\n return;\n }\n newLimitedStreams = newLimitedStreams.filter(\n (stream) => stream.producerId != videoID\n );\n newLimitedStreamsIDs = newLimitedStreamsIDs.filter(\n (id) => id !== videoID\n );\n oldSoundIds = oldSoundIds.filter((id) => id !== name);\n await changeVids({ parameters });\n } catch {\n // do nothing\n }\n } else {\n const participant = participants.find((p) => p.name === name);\n if (participant?.muted) {\n try {\n newLimitedStreams = newLimitedStreams.filter(\n (stream) => stream.producerId !== videoID\n );\n newLimitedStreamsIDs = newLimitedStreamsIDs.filter(\n (id) => id !== videoID\n );\n oldSoundIds = oldSoundIds.filter((id) => id !== name);\n await changeVids({ parameters });\n } catch { \n // do nothing\n }\n }\n }\n }\n\n updateNewLimitedStreams(newLimitedStreams);\n updateNewLimitedStreamsIDs(newLimitedStreamsIDs);\n updateOldSoundIds(oldSoundIds);\n }\n}\n\n","\nimport { StreamSuccessScreenType, StreamSuccessScreenParameters, ShowAlert } from \"../types/types\";\nexport interface StartShareScreenParameters extends StreamSuccessScreenParameters {\n shared: boolean;\n showAlert?: ShowAlert;\n updateShared: (shared: boolean) => void;\n mediaDevices: MediaDevices;\n onWeb: boolean;\n targetWidth?: number;\n targetHeight?: number;\n\n // mediasfu functions\n streamSuccessScreen: StreamSuccessScreenType;\n [key: string]: any;\n}\n\nexport interface StartShareScreenOptions {\n parameters: StartShareScreenParameters;\n}\n\n// Export the type definition for the function\nexport type StartShareScreenType = (options: StartShareScreenOptions) => Promise<void>;\n\n/**\n * Starts the screen sharing process.\n *\n * @param {StartShareScreenOptions} options - The options for starting screen sharing.\n * @param {Object} options.parameters - The parameters for screen sharing.\n * @param {boolean} options.parameters.shared - Indicates if the screen is currently being shared.\n * @param {Function} options.parameters.showAlert - Function to show alert messages.\n * @param {Function} options.parameters.updateShared - Function to update the shared state.\n * @param {MediaDevices} options.parameters.mediaDevices - The media devices available for screen sharing.\n * @param {boolean} options.parameters.onWeb - Indicates if the application is running on a web platform.\n * @param {number} [options.parameters.targetWidth] - The target width for screen sharing.\n * @param {number} [options.parameters.targetHeight] - The target height for screen sharing.\n * @param {Function} options.parameters.streamSuccessScreen - Function to handle successful screen sharing.\n * \n * @returns {Promise<void>} A promise that resolves when the screen sharing process is complete.\n * \n * @throws Will log an error message if there is an issue starting the screen share.\n *\n * @example\n * const options = {\n * parameters: {\n * shared: false,\n * showAlert: showAlertFunction,\n * updateShared: updateSharedFunction,\n * mediaDevices: navigator.mediaDevices,\n * onWeb: true,\n * targetWidth: 1280,\n * targetHeight: 720,\n * streamSuccessScreen: streamSuccessFunction,\n * },\n * };\n * \n * startShareScreen(options)\n * .then(() => {\n * console.log('Screen sharing started successfully');\n * })\n * .catch(error => {\n * console.error('Error starting screen share:', error);\n * });\n */\n\nexport async function startShareScreen({ parameters }: StartShareScreenOptions): Promise<void> {\n let {\n shared,\n showAlert,\n updateShared,\n mediaDevices,\n onWeb,\n targetWidth = 1280,\n targetHeight = 720,\n\n streamSuccessScreen,\n } = parameters;\n\n try {\n if (!onWeb) {\n showAlert?.({\n message: \"You cannot share screen while on mobile\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n if (mediaDevices && mediaDevices.getDisplayMedia) {\n shared = true;\n await mediaDevices\n .getDisplayMedia({\n video: {\n width: targetWidth,\n height: targetHeight,\n frameRate: 30,\n },\n audio: false,\n })\n .then(async (stream: MediaStream) => {\n await streamSuccessScreen({ stream, parameters });\n })\n .catch(async () => {\n shared = false;\n showAlert?.({\n message: \"Could not share screen, check and retry\",\n type: \"danger\",\n duration: 3000,\n });\n });\n } else {\n showAlert?.({\n message: \"Could not share screen, check and retry\",\n type: \"danger\",\n duration: 3000,\n });\n }\n\n // Update the shared variable\n updateShared(shared);\n } catch (error) {\n console.log(\"Error starting screen share\", error);\n }\n}\n\n","import { DisconnectSendTransportScreenType, PrepopulateUserMediaType, ReorderStreamsType, GetVideosType, DisconnectSendTransportScreenParameters, PrepopulateUserMediaParameters, ReorderStreamsParameters, EventType } from '../types/types';\nexport interface StopShareScreenParameters extends DisconnectSendTransportScreenParameters, PrepopulateUserMediaParameters, ReorderStreamsParameters {\n shared: boolean;\n shareScreenStarted: boolean;\n shareEnded: boolean;\n updateMainWindow: boolean;\n defer_receive: boolean;\n hostLabel: string;\n lock_screen: boolean;\n forceFullDisplay: boolean;\n firstAll: boolean;\n first_round: boolean;\n localStreamScreen: MediaStream | null;\n eventType: EventType;\n prevForceFullDisplay: boolean;\n annotateScreenStream: boolean;\n\n updateShared: (shared: boolean) => void;\n updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n updateShareEnded: (shareEnded: boolean) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n updateDefer_receive: (defer_receive: boolean) => void;\n updateLock_screen: (lock_screen: boolean) => void;\n updateForceFullDisplay: (forceFullDisplay: boolean) => void;\n updateFirstAll: (firstAll: boolean) => void;\n updateFirst_round: (first_round: boolean) => void;\n updateLocalStreamScreen: (localStreamScreen: MediaStream | null) => void;\n updateMainHeightWidth: (mainHeightWidth: number) => void;\n updateAnnotateScreenStream: (annotateScreenStream: boolean) => void;\n updateIsScreenboardModalVisible: (isVisible: boolean) => void;\n\n // mediasfu functions\n disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n reorderStreams: ReorderStreamsType;\n getVideos: GetVideosType;\n\n getUpdatedAllParams: () => StopShareScreenParameters;\n [key: string]: any;\n}\n\nexport interface StopShareScreenOptions {\n parameters: StopShareScreenParameters;\n}\n\n// Export the type definition for the function\nexport type StopShareScreenType = (options: StopShareScreenOptions) => Promise<void>;\n\n/**\n * Stops the screen sharing process and updates the relevant parameters and states.\n * \n * @param {StopShareScreenOptions} options - The options for stopping the screen share.\n * @param {Object} options.parameters - The parameters required for stopping the screen share.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {boolean} options.parameters.shared - Indicates if the screen is currently shared.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if the screen sharing has started.\n * @param {boolean} options.parameters.shareEnded - Indicates if the screen sharing has ended.\n * @param {boolean} options.parameters.updateMainWindow - Indicates if the main window needs to be updated.\n * @param {boolean} options.parameters.defer_receive - Indicates if receiving is deferred.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {boolean} options.parameters.forceFullDisplay - Indicates if full display is forced.\n * @param {boolean} options.parameters.firstAll - Indicates if it is the first all.\n * @param {boolean} options.parameters.first_round - Indicates if it is the first round.\n * @param {MediaStream} options.parameters.localStreamScreen - The local screen stream.\n * @param {string} options.parameters.eventType - The type of event.\n * @param {boolean} options.parameters.prevForceFullDisplay - Indicates if full display was previously forced.\n * @param {boolean} options.parameters.annotateScreenStream - Indicates if the screen stream is annotated.\n * @param {Function} options.parameters.updateShared - Function to update the shared state.\n * @param {Function} options.parameters.updateShareScreenStarted - Function to update the share screen started state.\n * @param {Function} options.parameters.updateShareEnded - Function to update the share ended state.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window state.\n * @param {Function} options.parameters.updateDefer_receive - Function to update the defer receive state.\n * @param {Function} options.parameters.updateLock_screen - Function to update the lock screen state.\n * @param {Function} options.parameters.updateForceFullDisplay - Function to update the force full display state.\n * @param {Function} options.parameters.updateFirstAll - Function to update the first all state.\n * @param {Function} options.parameters.updateFirst_round - Function to update the first round state.\n * @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen stream.\n * @param {Function} options.parameters.updateMainHeightWidth - Function to update the main height and width.\n * @param {Function} options.parameters.updateAnnotateScreenStream - Function to update the annotate screen stream state.\n * @param {Function} options.parameters.updateIsScreenboardModalVisible - Function to update the screenboard modal visibility.\n * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport screen.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {Function} options.parameters.reorderStreams - Function to reorder streams.\n * @param {Function} options.parameters.getVideos - Function to get videos.\n * \n * @returns {Promise<void>} A promise that resolves when the screen sharing process is stopped.\n *\n * @example\n * const options = {\n * parameters: {\n * shared: true,\n * shareScreenStarted: true,\n * shareEnded: false,\n * updateMainWindow: true,\n * defer_receive: false,\n * hostLabel: \"Host\",\n * lock_screen: false,\n * forceFullDisplay: false,\n * firstAll: false,\n * first_round: false,\n * localStreamScreen: localStream, // MediaStream object\n * eventType: \"conference\",\n * prevForceFullDisplay: false,\n * annotateScreenStream: false,\n * updateShared: updateSharedFunction,\n * updateShareScreenStarted: updateShareScreenStartedFunction,\n * updateShareEnded: updateShareEndedFunction,\n * updateUpdateMainWindow: updateUpdateMainWindowFunction,\n * updateDefer_receive: updateDefer_receiveFunction,\n * updateLock_screen: updateLock_screenFunction,\n * updateForceFullDisplay: updateForceFullDisplayFunction,\n * updateFirstAll: updateFirstAllFunction,\n * updateFirst_round: updateFirst_roundFunction,\n * updateLocalStreamScreen: updateLocalStreamScreenFunction,\n * updateMainHeightWidth: updateMainHeightWidthFunction,\n * updateAnnotateScreenStream: updateAnnotateScreenStreamFunction,\n * updateIsScreenboardModalVisible: updateIsScreenboardModalVisibleFunction,\n * disconnectSendTransportScreen: disconnectSendTransportScreenFunction,\n * prepopulateUserMedia: prepopulateUserMediaFunction,\n * reorderStreams: reorderStreamsFunction,\n * getVideos: getVideosFunction,\n * },\n * };\n * \n * stopShareScreen(options)\n * .then(() => {\n * console.log('Screen sharing stopped successfully');\n * })\n * .catch(error => {\n * console.error('Error stopping screen share:', error);\n * });\n */\n\nexport async function stopShareScreen({ parameters }: StopShareScreenOptions): Promise<void> {\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n shared,\n shareScreenStarted,\n shareEnded,\n updateMainWindow,\n defer_receive,\n hostLabel,\n lock_screen,\n forceFullDisplay,\n firstAll,\n first_round,\n localStreamScreen,\n eventType,\n prevForceFullDisplay,\n annotateScreenStream,\n\n updateShared,\n updateShareScreenStarted,\n updateShareEnded,\n updateUpdateMainWindow,\n updateDefer_receive,\n updateLock_screen,\n updateForceFullDisplay,\n updateFirstAll,\n updateFirst_round,\n updateLocalStreamScreen,\n updateMainHeightWidth,\n updateAnnotateScreenStream,\n updateIsScreenboardModalVisible,\n\n disconnectSendTransportScreen,\n prepopulateUserMedia,\n reorderStreams,\n getVideos,\n } = parameters;\n\n shared = false;\n updateShared(shared);\n shareScreenStarted = false;\n updateShareScreenStarted(shareScreenStarted);\n shareEnded = true;\n updateShareEnded(shareEnded);\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n\n if (defer_receive) {\n defer_receive = false;\n updateDefer_receive(defer_receive);\n await getVideos({ \n participants: parameters.participants,\n allVideoStreams: parameters.allVideoStreams,\n oldAllStreams: parameters.oldAllStreams,\n adminVidID: parameters.adminVidID,\n updateAllVideoStreams: parameters.updateAllVideoStreams,\n updateOldAllStreams: parameters.updateOldAllStreams\n });\n }\n try {\n localStreamScreen!.getTracks().forEach(track => track.stop());\n } catch {\n // Do nothing\n }\n updateLocalStreamScreen(null);\n await disconnectSendTransportScreen({ parameters });\n\n try {\n if (annotateScreenStream) {\n annotateScreenStream = false;\n updateAnnotateScreenStream(annotateScreenStream);\n updateIsScreenboardModalVisible(true);\n await new Promise(resolve => setTimeout(resolve, 500));\n updateIsScreenboardModalVisible(false);\n }\n } catch (error) {\n console.log('Error handling screen annotation:', error);\n }\n\n if (eventType === 'conference') {\n updateMainHeightWidth(0);\n }\n\n try {\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } catch (error) {\n console.log(\"Error in prepopulateUserMedia\", error);\n }\n\n try {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n } catch (error) {\n console.log(\"Error in reorderStreams\", error);\n }\n\n lock_screen = false;\n updateLock_screen(lock_screen);\n forceFullDisplay = prevForceFullDisplay;\n updateForceFullDisplay(forceFullDisplay);\n firstAll = false;\n updateFirstAll(firstAll);\n first_round = false;\n updateFirst_round(first_round);\n}\n\n"," \n\nimport { Socket } from \"socket.io-client\";\nimport type { ProducerOptions } from 'mediasoup-client/lib/types';\nimport { Participant, PrepopulateUserMediaParameters, ShowAlert, CreateSendTransportParameters, ConnectSendTransportAudioParameters, ResumeSendTransportAudioParameters, PrepopulateUserMediaType, CreateSendTransportType, ConnectSendTransportAudioType, ResumeSendTransportAudioType } from \"../types/types\";\nexport interface StreamSuccessAudioParameters extends CreateSendTransportParameters, ConnectSendTransportAudioParameters, ResumeSendTransportAudioParameters, PrepopulateUserMediaParameters {\n socket: Socket;\n participants: Participant[];\n localStream: MediaStream | null;\n transportCreated: boolean;\n transportCreatedAudio: boolean;\n audioAlreadyOn: boolean;\n micAction: boolean;\n audioParams: ProducerOptions;\n localStreamAudio: MediaStream | null;\n defAudioID: string;\n userDefaultAudioInputDevice: string;\n params: ProducerOptions;\n audioParamse?: ProducerOptions;\n aParams: ProducerOptions;\n hostLabel: string;\n islevel: string;\n member: string;\n updateMainWindow: boolean;\n lock_screen: boolean;\n shared: boolean;\n videoAlreadyOn: boolean;\n showAlert?: ShowAlert;\n\n updateParticipants: (participants: Participant[]) => void;\n updateTransportCreated: (transportCreated: boolean) => void;\n updateTransportCreatedAudio: (transportCreatedAudio: boolean) => void;\n updateAudioAlreadyOn: (audioAlreadyOn: boolean) => void;\n updateMicAction: (micAction: boolean) => void;\n updateAudioParams: (audioParams: ProducerOptions) => void;\n updateLocalStream: (localStream: MediaStream | null) => void;\n updateLocalStreamAudio: (localStreamAudio: MediaStream | null) => void;\n updateDefAudioID: (defAudioID: string) => void;\n updateUserDefaultAudioInputDevice: (userDefaultAudioInputDevice: string) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n // mediasfu functions\n createSendTransport: CreateSendTransportType;\n connectSendTransportAudio: ConnectSendTransportAudioType;\n resumeSendTransportAudio: ResumeSendTransportAudioType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n \n getUpdatedAllParams: () => StreamSuccessAudioParameters;\n [key: string]: any;\n}\n\nexport interface StreamSuccessAudioOptions {\n stream: MediaStream;\n parameters: StreamSuccessAudioParameters;\n}\n\n// Export the type definition for the function\nexport type StreamSuccessAudioType = (options: StreamSuccessAudioOptions) => Promise<void>;\n\n/**\n * Handles the successful streaming of audio by setting up the necessary transports and updating the relevant states.\n *\n * @param {StreamSuccessAudioOptions} options - The options for streaming success audio.\n * @param {MediaStream} options.stream - The media stream containing the audio track.\n * @param {Object} options.parameters - The parameters required for setting up the audio stream.\n * @param {Socket} options.parameters.socket - The socket connection for communication.\n * @param {Array<Participant>} options.parameters.participants - The list of participants.\n * @param {MediaStream | null} options.parameters.localStream - The local media stream.\n * @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is created.\n * @param {boolean} options.parameters.transportCreatedAudio - Flag indicating if the audio transport is created.\n * @param {boolean} options.parameters.audioAlreadyOn - Flag indicating if the audio is already on.\n * @param {boolean} options.parameters.micAction - Flag indicating the microphone action.\n * @param {ProducerOptions} options.parameters.audioParams - The audio parameters.\n * @param {MediaStream | null} options.parameters.localStreamAudio - The local audio stream.\n * @param {string} options.parameters.defAudioID - The default audio device ID.\n * @param {string} options.parameters.userDefaultAudioInputDevice - The user default audio input device.\n * @param {ProducerOptions} options.parameters.params - Additional parameters.\n * @param {ProducerOptions} options.parameters.audioParamse - Additional audio parameters.\n * @param {ProducerOptions} options.parameters.aParams - Additional parameters for audio.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {string} options.parameters.islevel - The level of the user.\n * @param {string} options.parameters.member - The member name.\n * @param {boolean} options.parameters.updateMainWindow - Flag indicating if the main window should be updated.\n * @param {boolean} options.parameters.lock_screen - Flag indicating if the screen is locked.\n * @param {boolean} options.parameters.shared - Flag indicating if the screen is shared.\n * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if the video is already on.\n * @param {Function} options.parameters.showAlert - Function to show alert messages.\n * @param {Function} options.parameters.updateParticipants - Function to update participants.\n * @param {Function} options.parameters.updateTransportCreated - Function to update transport created flag.\n * @param {Function} options.parameters.updateTransportCreatedAudio - Function to update audio transport created flag.\n * @param {Function} options.parameters.updateAudioAlreadyOn - Function to update audio already on flag.\n * @param {Function} options.parameters.updateMicAction - Function to update microphone action flag.\n * @param {Function} options.parameters.updateAudioParams - Function to update audio parameters.\n * @param {Function} options.parameters.updateLocalStream - Function to update local stream.\n * @param {Function} options.parameters.updateLocalStreamAudio - Function to update local audio stream.\n * @param {Function} options.parameters.updateDefAudioID - Function to update default audio device ID.\n * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update user default audio input device.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update main window flag.\n * @param {Function} options.parameters.createSendTransport - Function to create send transport.\n * @param {Function} options.parameters.connectSendTransportAudio - Function to connect send transport audio.\n * @param {Function} options.parameters.resumeSendTransportAudio - Function to resume send transport audio.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n *\n * @returns {Promise<void>} A promise that resolves when the audio streaming setup is complete.\n *\n * @example\n * const options = {\n * stream: localStream, // MediaStream object containing the audio track\n * parameters: {\n * socket: socketInstance,\n * participants: participantList,\n * localStream: null,\n * transportCreated: false,\n * transportCreatedAudio: false,\n * audioAlreadyOn: false,\n * micAction: false,\n * audioParams: {},\n * localStreamAudio: null,\n * defAudioID: \"\",\n * userDefaultAudioInputDevice: \"\",\n * params: {},\n * audioParamse: {},\n * aParams: {},\n * hostLabel: \"Host\",\n * islevel: \"1\",\n * member: \"user1\",\n * updateMainWindow: true,\n * lock_screen: false,\n * shared: false,\n * videoAlreadyOn: false,\n * showAlert: alertFunction,\n * updateParticipants: updateParticipantsFunction,\n * updateTransportCreated: updateTransportCreatedFunction,\n * updateTransportCreatedAudio: updateTransportCreatedAudioFunction,\n * updateAudioAlreadyOn: updateAudioAlreadyOnFunction,\n * updateMicAction: updateMicActionFunction,\n * updateAudioParams: updateAudioParamsFunction,\n * updateLocalStream: updateLocalStreamFunction,\n * updateLocalStreamAudio: updateLocalStreamAudioFunction,\n * updateDefAudioID: updateDefAudioIDFunction,\n * updateUserDefaultAudioInputDevice: updateUserDefaultAudioInputDeviceFunction,\n * updateUpdateMainWindow: updateUpdateMainWindowFunction,\n * createSendTransport: createSendTransportFunction,\n * connectSendTransportAudio: connectSendTransportAudioFunction,\n * resumeSendTransportAudio: resumeSendTransportAudioFunction,\n * prepopulateUserMedia: prepopulateUserMediaFunction,\n * },\n * };\n * \n * streamSuccessAudio(options)\n * .then(() => {\n * console.log('Audio streaming setup successfully');\n * })\n * .catch(error => {\n * console.error('Error setting up audio streaming:', error);\n * });\n */\n\nexport const streamSuccessAudio = async ({\n stream,\n parameters,\n}: StreamSuccessAudioOptions): Promise<void> => {\n let {\n socket,\n participants,\n localStream,\n transportCreated,\n transportCreatedAudio,\n audioAlreadyOn,\n micAction,\n audioParams,\n localStreamAudio,\n defAudioID,\n userDefaultAudioInputDevice,\n params,\n audioParamse,\n aParams,\n hostLabel,\n islevel,\n member,\n updateMainWindow,\n lock_screen,\n shared,\n videoAlreadyOn,\n showAlert,\n\n //update functions\n updateParticipants,\n updateTransportCreated,\n updateTransportCreatedAudio,\n updateAudioAlreadyOn,\n updateMicAction,\n updateAudioParams,\n updateLocalStream,\n updateLocalStreamAudio,\n updateDefAudioID,\n updateUserDefaultAudioInputDevice,\n updateUpdateMainWindow,\n\n //mediasfu functions\n createSendTransport,\n connectSendTransportAudio,\n resumeSendTransportAudio,\n prepopulateUserMedia,\n } = parameters;\n\n localStreamAudio = stream;\n updateLocalStreamAudio(localStreamAudio);\n\n if (localStream == null) {\n localStream = new MediaStream([localStreamAudio.getAudioTracks()[0]]);\n updateLocalStream(localStream);\n } else {\n localStream.addTrack(localStreamAudio.getAudioTracks()[0]);\n updateLocalStream(localStream);\n }\n\n const audioTracked = localStream.getAudioTracks()[0];\n defAudioID = audioTracked.getSettings().deviceId || \"\";\n userDefaultAudioInputDevice = defAudioID;\n\n updateDefAudioID(defAudioID);\n updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice);\n\n try {\n params = aParams;\n audioParamse = { ...params };\n\n audioParams = {\n track: localStream.getAudioTracks()[0],\n ...audioParamse,\n };\n updateAudioParams(audioParams);\n\n if (!transportCreated) {\n try {\n await createSendTransport({\n parameters: {\n ...parameters,\n audioParams: audioParams,\n },\n option: \"audio\",\n });\n } catch (error) {\n console.error(\"Error creating transport:\", error);\n }\n } else {\n if (!transportCreatedAudio) {\n await connectSendTransportAudio({\n audioParams,\n parameters,\n });\n } else {\n await resumeSendTransportAudio({ parameters });\n }\n }\n } catch (error: any) {\n if (showAlert) {\n showAlert({\n message: error.message,\n type: \"danger\",\n duration: 3000,\n });\n }\n }\n\n audioAlreadyOn = true;\n updateAudioAlreadyOn(audioAlreadyOn);\n\n if (micAction === true) {\n micAction = false;\n updateMicAction(micAction);\n }\n\n participants.forEach((participant) => {\n if (participant.socketId === socket.id && participant.name === member) {\n participant.muted = false;\n }\n });\n updateParticipants(participants);\n\n transportCreated = true;\n transportCreatedAudio = true;\n updateTransportCreated(transportCreated);\n updateTransportCreatedAudio(transportCreatedAudio);\n\n if (!videoAlreadyOn && islevel === \"2\") {\n if (!lock_screen && !shared) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updateMainWindow = false;\n updateUpdateMainWindow(updateMainWindow);\n }\n }\n};\n\n","\n\nimport type { Producer, ProducerCodecOptions, ProducerOptions } from 'mediasoup-client/lib/types';\nimport { Socket } from \"socket.io-client\";\nimport { PrepopulateUserMediaParameters, PrepopulateUserMediaType, CreateSendTransportParameters, CreateSendTransportType, ConnectSendTransportAudioParameters, ConnectSendTransportAudioType, SleepType } from \"../types/types\";\n\nexport interface StreamSuccessAudioSwitchParameters extends PrepopulateUserMediaParameters, CreateSendTransportParameters, ConnectSendTransportAudioParameters {\n audioProducer: Producer | null;\n localAudioProducer?: Producer | null;\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n localStream: MediaStream | null;\n localStreamAudio: MediaStream | null;\n audioParams: ProducerOptions;\n audioPaused: boolean;\n audioAlreadyOn: boolean;\n transportCreated: boolean;\n localTransportCreated?: boolean;\n audioParamse?: ProducerCodecOptions;\n defAudioID: string;\n userDefaultAudioInputDevice: string;\n hostLabel: string;\n updateMainWindow: boolean;\n videoAlreadyOn: boolean;\n islevel: string;\n lock_screen: boolean;\n shared: boolean;\n\n updateAudioProducer: (audioProducer: Producer | null) => void;\n updateLocalAudioProducer?: (localAudioProducer: Producer | null) => void;\n updateLocalStream: (localStream: MediaStream | null) => void;\n updateAudioParams: (audioParams: ProducerOptions) => void;\n updateDefAudioID: (defAudioID: string) => void;\n updateUserDefaultAudioInputDevice: (userDefaultAudioInputDevice: string) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n // mediasfu functions\n sleep: SleepType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n createSendTransport: CreateSendTransportType;\n connectSendTransportAudio: ConnectSendTransportAudioType;\n\n getUpdatedAllParams: () => StreamSuccessAudioSwitchParameters;\n [key: string]: any;\n}\n\nexport interface StreamSuccessAudioSwitchOptions {\n stream: MediaStream;\n parameters: StreamSuccessAudioSwitchParameters;\n}\n\n// Export the type definition for the function\nexport type StreamSuccessAudioSwitchType = (options: StreamSuccessAudioSwitchOptions) => Promise<void>;\n\n/**\n * Handles the switching of the audio stream upon successful stream connection.\n *\n * @param {StreamSuccessAudioSwitchOptions} options - The options for the audio stream success switch.\n * @param {MediaStream} options.stream - The new media stream containing the audio track.\n * @param {Object} options.parameters - The parameters required for setting up the audio stream.\n * @param {Producer} options.parameters.audioProducer - The current audio producer.\n * @param {Producer} options.parameters.localAudioProducer - The local audio producer.\n * @param {Socket} options.parameters.socket - The socket connection for communication.\n * @param {Socket} options.parameters.localSocket - The local socket connection for communication.\n * @param {string} options.parameters.roomName - The name of the room.\n * @param {MediaStream | null} options.parameters.localStream - The local media stream.\n * @param {MediaStream | null} options.parameters.localStreamAudio - The local audio stream.\n * @param {ProducerOptions} options.parameters.audioParams - The audio parameters.\n * @param {boolean} options.parameters.audioPaused - Indicates if the audio is paused.\n * @param {boolean} options.parameters.audioAlreadyOn - Indicates if the audio is already on.\n * @param {boolean} options.parameters.transportCreated - Indicates if the transport is created.\n * @param {ProducerCodecOptions} options.parameters.audioParamse - Additional audio parameters.\n * @param {string} options.parameters.defAudioID - The default audio device ID.\n * @param {string} options.parameters.userDefaultAudioInputDevice - The user default audio input device.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {boolean} options.parameters.updateMainWindow - Indicates if the main window should be updated.\n * @param {boolean} options.parameters.videoAlreadyOn - Indicates if the video is already on.\n * @param {string} options.parameters.islevel - The level of the participant.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {Function} options.parameters.updateAudioProducer - Function to update the audio producer.\n * @param {Function} options.parameters.updateLocalAudioProducer - Function to update the local audio producer.\n * @param {Function} options.parameters.updateLocalStream - Function to update the local stream.\n * @param {Function} options.parameters.updateAudioParams - Function to update the audio parameters.\n * @param {Function} options.parameters.updateDefAudioID - Function to update the default audio device ID.\n * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update the user default audio input device.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {Function} options.parameters.sleep - Function to pause execution for a specified time.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {Function} options.parameters.createSendTransport - Function to create a send transport.\n * @param {Function} options.parameters.connectSendTransportAudio - Function to connect the send transport for audio.\n *\n * @returns {Promise<void>} A promise that resolves when the audio stream switch is complete.\n * \n * @example\n * const options = {\n * stream: newAudioStream, // MediaStream object containing the new audio track\n * parameters: {\n * audioProducer: currentAudioProducer,\n * localAudioProducer: localAudioProducerInstance,\n * localSocket: localSocketInstance, \n * socket: socketInstance,\n * roomName: \"Room1\",\n * localStream: null,\n * localStreamAudio: null,\n * audioParams: audioProducerOptions,\n * audioPaused: false,\n * audioAlreadyOn: true,\n * transportCreated: false,\n * audioParamse: additionalAudioParams,\n * defAudioID: \"default-audio-device-id\",\n * userDefaultAudioInputDevice: \"user-input-device-id\",\n * hostLabel: \"Host\",\n * islevel: \"1\",\n * videoAlreadyOn: false,\n * lock_screen: false,\n * shared: false,\n * updateAudioProducer: updateAudioProducerFunction,\n * updateLocalAudioProducer: updateLocalAudioProducerFunction,\n * updateLocalStream: updateLocalStreamFunction,\n * updateAudioParams: updateAudioParamsFunction,\n * updateDefAudioID: updateDefAudioIDFunction,\n * updateUserDefaultAudioInputDevice: updateUserDefaultAudioInputDeviceFunction,\n * updateUpdateMainWindow: updateMainWindowFunction,\n * sleep: sleepFunction,\n * prepopulateUserMedia: prepopulateUserMediaFunction,\n * createSendTransport: createSendTransportFunction,\n * connectSendTransportAudio: connectSendTransportAudioFunction,\n * },\n * };\n * \n * streamSuccessAudioSwitch(options)\n * .then(() => {\n * console.log('Audio stream switched successfully');\n * })\n * .catch(error => {\n * console.error('Error switching audio stream:', error);\n * });\n */\n\nexport const streamSuccessAudioSwitch = async ({\n stream,\n parameters,\n}: StreamSuccessAudioSwitchOptions): Promise<void> => {\n\n let {\n audioProducer,\n localAudioProducer,\n socket,\n localSocket,\n roomName,\n localStream,\n localStreamAudio,\n audioParams,\n audioPaused,\n audioAlreadyOn,\n transportCreated,\n audioParamse,\n defAudioID,\n userDefaultAudioInputDevice,\n hostLabel,\n updateMainWindow,\n videoAlreadyOn,\n islevel,\n lock_screen,\n shared,\n\n updateAudioProducer,\n updateLocalAudioProducer,\n updateLocalStream,\n updateAudioParams,\n updateDefAudioID,\n updateUserDefaultAudioInputDevice,\n updateUpdateMainWindow,\n\n //mediasfu functions\n sleep,\n prepopulateUserMedia,\n createSendTransport,\n connectSendTransportAudio,\n } = parameters;\n\n // Get the new default audio device ID\n let newDefAudioID = stream.getAudioTracks()[0].getSettings().deviceId;\n\n // Check if the audio device has changed\n if (newDefAudioID !== defAudioID) {\n // Close the current audioProducer\n if (audioProducer) {\n audioProducer.close();\n updateAudioProducer(audioProducer);\n }\n\n // Emit a pauseProducerMedia event to pause the audio media\n socket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n force: true,\n });\n\n try {\n if (localSocket && localSocket.id) {\n if (localAudioProducer) {\n localAudioProducer.close();\n if (updateLocalAudioProducer){\n updateLocalAudioProducer(localAudioProducer);\n }\n }\n localSocket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n force: true,\n });\n }\n } catch {\n // Do nothing\n }\n\n // Update the localStreamAudio with the new audio tracks\n localStreamAudio = stream;\n\n // If localStream is null, create a new MediaStream with the new audio track\n if (localStream == null) {\n localStream = new MediaStream([\n localStreamAudio.getAudioTracks()[0],\n ]);\n } else {\n // Remove all existing audio tracks from localStream and add the new audio track\n localStream.getAudioTracks().forEach((track) => {\n localStream!.removeTrack(track);\n });\n localStream.addTrack(localStreamAudio.getAudioTracks()[0]);\n }\n\n // Update localStream\n updateLocalStream(localStream);\n\n // Get the new default audio device ID from the new audio track\n const audioTracked = localStream.getAudioTracks()[0];\n defAudioID = audioTracked.getSettings().deviceId || \"\";\n updateDefAudioID(defAudioID);\n\n // Update userDefaultAudioInputDevice\n userDefaultAudioInputDevice = defAudioID;\n updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice);\n\n // Update audioParams with the new audio track\n audioParams = {\n track: localStream.getAudioTracks()[0],\n ...audioParamse,\n };\n updateAudioParams(audioParams);\n\n // Sleep for 500 milliseconds\n await sleep({ ms: 500 });\n\n // Create a new send transport if not created, otherwise, connect the existing transport\n if (!transportCreated) {\n try {\n await createSendTransport({\n parameters: {\n ...parameters,\n audioParams: audioParams,\n },\n option: \"audio\",\n });\n } catch (error) {\n console.error(\"Error creating send transport:\", error);\n }\n } else {\n await connectSendTransportAudio({\n audioParams,\n parameters,\n });\n }\n\n // If audio is paused and not already on, pause the audioProducer and emit a pauseProducerMedia event\n if (audioPaused === true && !audioAlreadyOn) {\n audioProducer!.pause();\n updateAudioProducer(audioProducer);\n socket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n });\n\n try {\n if (localSocket && localSocket.id) {\n localAudioProducer!.pause();\n if (updateLocalAudioProducer){\n updateLocalAudioProducer(localAudioProducer!);\n }\n localSocket.emit(\"pauseProducerMedia\", {\n mediaTag: \"audio\",\n roomName: roomName,\n });\n }\n } catch {\n // Do nothing\n }\n }\n }\n\n // Update the UI based on the participant's level and screen lock status\n if (!videoAlreadyOn && islevel === \"2\") {\n if (!lock_screen && !shared) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updateMainWindow = false;\n updateUpdateMainWindow(updateMainWindow);\n }\n }\n};\n\n"," \n\nimport { Socket } from \"socket.io-client\";\nimport {\n SleepType, CreateSendTransportType, ConnectSendTransportScreenType, DisconnectSendTransportScreenType, StopShareScreenType, ReorderStreamsType, PrepopulateUserMediaType, RePortType,\n ShowAlert, CreateSendTransportParameters, ConnectSendTransportScreenParameters, DisconnectSendTransportScreenParameters, StopShareScreenParameters, ReorderStreamsParameters, PrepopulateUserMediaParameters, RePortParameters,\n EventType\n} from \"../types/types\";\n\nexport interface StreamSuccessScreenParameters extends CreateSendTransportParameters, ConnectSendTransportScreenParameters, DisconnectSendTransportScreenParameters, StopShareScreenParameters, ReorderStreamsParameters, PrepopulateUserMediaParameters, RePortParameters {\n socket: Socket;\n transportCreated: boolean;\n localStreamScreen: MediaStream | null;\n screenAlreadyOn: boolean;\n screenAction: boolean;\n transportCreatedScreen: boolean;\n hostLabel: string;\n eventType: EventType;\n showAlert?: ShowAlert;\n annotateScreenStream: boolean;\n shared: boolean;\n\n updateTransportCreatedScreen: (transportCreatedScreen: boolean) => void;\n updateScreenAlreadyOn: (screenAlreadyOn: boolean) => void;\n updateScreenAction: (screenAction: boolean) => void;\n updateTransportCreated: (transportCreated: boolean) => void;\n updateLocalStreamScreen: (localStreamScreen: MediaStream | null) => void;\n updateShared: (shared: boolean) => void;\n updateIsScreenboardModalVisible: (isVisible: boolean) => void;\n\n // mediasfu functions\n sleep: SleepType;\n createSendTransport: CreateSendTransportType;\n connectSendTransportScreen: ConnectSendTransportScreenType;\n disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n stopShareScreen: StopShareScreenType;\n reorderStreams: ReorderStreamsType;\n prepopulateUserMedia: PrepopulateUserMediaType;\n rePort: RePortType;\n\n getUpdatedAllParams: () => StreamSuccessScreenParameters;\n [key: string]: any;\n}\n\nexport interface StreamSuccessScreenOptions {\n stream: MediaStream;\n parameters: StreamSuccessScreenParameters;\n}\n\n// Export the type definition for the function\nexport type StreamSuccessScreenType = (options: StreamSuccessScreenOptions) => Promise<void>;\n\n/**\n * Handles the successful initiation of screen sharing.\n *\n * @param {StreamSuccessScreenOptions} options - The options for the screen sharing success handler.\n * @param {MediaStream} options.stream - The media stream to be shared.\n * @param {Object} options.parameters - The parameters required for screen sharing.\n * @param {Socket} options.parameters.socket - The socket instance for communication.\n * @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is already created.\n * @param {MediaStream | null} options.parameters.localStreamScreen - The local screen media stream.\n * @param {boolean} options.parameters.screenAlreadyOn - Flag indicating if the screen is already being shared.\n * @param {boolean} options.parameters.screenAction - Flag indicating if the screen share action is requested.\n * @param {boolean} options.parameters.transportCreatedScreen - Flag indicating if the screen transport is created.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {string} options.parameters.eventType - The type of the event (e.g., conference).\n * @param {Function} options.parameters.showAlert - Function to show alerts.\n * @param {boolean} options.parameters.annotateScreenStream - Flag indicating if screen annotation is enabled.\n * @param {Function} options.parameters.updateTransportCreatedScreen - Function to update the screen transport creation state.\n * @param {Function} options.parameters.updateScreenAlreadyOn - Function to update the screen sharing state.\n * @param {Function} options.parameters.updateScreenAction - Function to update the screen action state.\n * @param {Function} options.parameters.updateTransportCreated - Function to update the transport creation state.\n * @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen stream.\n * @param {Function} options.parameters.updateShared - Function to update the shared state.\n * @param {Function} options.parameters.updateIsScreenboardModalVisible - Function to update the screenboard modal visibility.\n * @param {Function} options.parameters.sleep - Function to pause execution for a specified duration.\n * @param {Function} options.parameters.createSendTransport - Function to create a send transport.\n * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the send transport for screen sharing.\n * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport for screen sharing.\n * @param {Function} options.parameters.stopShareScreen - Function to stop screen sharing.\n * @param {Function} options.parameters.reorderStreams - Function to reorder streams.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @param {Function} options.parameters.rePort - Function to reinitialize ports.\n *\n * @returns {Promise<void>} A promise that resolves when the screen sharing setup is complete.\n * \n * @throws Will throw an error if there is an issue with screen sharing.\n * \n * @example\n * ```typescript\n * await streamSuccessScreen({\n * stream: mediaStream,\n * parameters: {\n * socket,\n * transportCreated,\n * localStreamScreen: null,\n * screenAlreadyOn: false,\n * screenAction: true,\n * transportCreatedScreen: false,\n * hostLabel: \"Host\",\n * eventType: \"conference\",\n * showAlert,\n * annotateScreenStream: false,\n * updateTransportCreatedScreen,\n * updateScreenAlreadyOn,\n * updateScreenAction,\n * updateTransportCreated,\n * updateLocalStreamScreen,\n * updateShared,\n * updateIsScreenboardModalVisible,\n * sleep,\n * createSendTransport,\n * connectSendTransportScreen,\n * disconnectSendTransportScreen,\n * stopShareScreen,\n * reorderStreams,\n * prepopulateUserMedia,\n * rePort,\n * },\n * });\n * ```\n */\n\nexport const streamSuccessScreen = async ({\n stream,\n parameters,\n}: StreamSuccessScreenOptions): Promise<void> => {\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n let {\n socket,\n transportCreated,\n localStreamScreen,\n screenAlreadyOn,\n screenAction,\n transportCreatedScreen,\n hostLabel,\n eventType,\n showAlert,\n annotateScreenStream,\n\n updateTransportCreatedScreen,\n updateScreenAlreadyOn,\n updateScreenAction,\n updateTransportCreated,\n updateLocalStreamScreen,\n updateShared,\n updateIsScreenboardModalVisible,\n sleep,\n\n // mediasfu functions\n createSendTransport,\n connectSendTransportScreen,\n disconnectSendTransportScreen,\n stopShareScreen,\n reorderStreams,\n prepopulateUserMedia,\n rePort,\n } = parameters;\n\n // Share screen on success\n localStreamScreen = stream;\n updateLocalStreamScreen(localStreamScreen);\n\n try {\n // Create transport if not created else connect transport\n if (!transportCreated) {\n await createSendTransport({\n option: \"screen\",\n parameters: { ...parameters, localStreamScreen },\n });\n } else {\n await connectSendTransportScreen({\n stream: localStreamScreen,\n parameters: { ...parameters, localStreamScreen },\n });\n }\n\n // Alert the socket that you are sharing the screen\n socket.emit(\"startScreenShare\");\n } catch (error: any) {\n showAlert?.({\n message: error.message,\n type: \"danger\",\n duration: 3000,\n });\n }\n\n // Re-update the screen display\n try {\n updateShared(true);\n await prepopulateUserMedia({\n name: hostLabel,\n parameters: { ...parameters, localStreamScreen, shared: true },\n });\n } catch (error) {\n console.error(\"Error updating shared screen UI:\", error);\n }\n\n // Update the screen sharing state\n screenAlreadyOn = true;\n updateScreenAlreadyOn(screenAlreadyOn);\n\n // Reorder streams if required\n try {\n if (eventType === \"conference\") {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n await prepopulateUserMedia({ name: hostLabel, parameters });\n } else {\n await reorderStreams({ parameters });\n }\n } catch {\n try {\n await rePort({ parameters });\n } catch {\n // console.error(\"Error reordering streams:\", error);\n\n }\n }\n\n // Handle screen share end\n localStreamScreen.getVideoTracks()[0].onended = async function () {\n // Supports both manual and automatic screen share end\n await disconnectSendTransportScreen({ parameters });\n await stopShareScreen({ parameters });\n };\n\n // If user requested to share screen, update the screenAction state\n if (screenAction === true) {\n screenAction = false;\n }\n updateScreenAction(screenAction);\n\n // Update the transport created state\n transportCreatedScreen = true;\n updateTransportCreatedScreen(transportCreatedScreen);\n transportCreated = true;\n updateTransportCreated(transportCreated);\n\n // Handle screen annotation modal\n try {\n if (annotateScreenStream) {\n annotateScreenStream = false;\n updateIsScreenboardModalVisible(true);\n await sleep({ ms: 500 });\n updateIsScreenboardModalVisible(false);\n }\n } catch (error) {\n console.error(\"Error handling screen annotation:\", error);\n }\n\n\n};\n\n","import type { Device, Producer, ProducerOptions, RtpCodecCapability } from 'mediasoup-client/lib/types';\nimport { Socket } from \"socket.io-client\";\nimport { ConnectSendTransportVideoParameters, Participant, ShowAlert, CreateSendTransportParameters, ReorderStreamsParameters, SleepType, CreateSendTransportType, ConnectSendTransportVideoType, ReorderStreamsType, HParamsType, VParamsType } from \"../types/types\";\n\nexport interface StreamSuccessVideoParameters extends CreateSendTransportParameters, ConnectSendTransportVideoParameters, ReorderStreamsParameters {\n socket: Socket;\n participants: Participant[];\n localStream: MediaStream | null;\n transportCreated: boolean;\n transportCreatedVideo: boolean;\n videoAlreadyOn: boolean;\n videoAction: boolean;\n videoParams: ProducerOptions;\n localStreamVideo: MediaStream | null;\n defVideoID: string;\n userDefaultVideoInputDevice: string;\n params: ProducerOptions;\n videoParamse?: ProducerOptions;\n islevel: string;\n member: string;\n updateMainWindow: boolean;\n lock_screen: boolean;\n shared: boolean;\n shareScreenStarted: boolean;\n vParams: VParamsType;\n hParams: HParamsType;\n allowed: boolean;\n currentFacingMode: string;\n device: Device | null;\n keepBackground: boolean;\n appliedBackground: boolean;\n videoProducer: Producer | null;\n removeSingleVideoEncoding?: boolean;\n\n // Update functions\n updateTransportCreatedVideo: (created: boolean) => void;\n updateVideoAlreadyOn: (videoOn: boolean) => void;\n updateVideoAction: (videoAction: boolean) => void;\n updateLocalStream: (stream: MediaStream | null) => void;\n updateLocalStreamVideo: (stream: MediaStream | null) => void;\n updateUserDefaultVideoInputDevice: (device: string) => void;\n updateCurrentFacingMode: (mode: string) => void;\n updateDefVideoID: (id: string) => void;\n updateAllowed: (allowed: boolean) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n updateParticipants: (participants: Participant[]) => void;\n updateVideoParams: (params: ProducerOptions) => void;\n updateIsBackgroundModalVisible: (isVisible: boolean) => void;\n updateAutoClickBackground: (autoClick: boolean) => void;\n\n showAlert?: ShowAlert;\n\n // Media functions\n createSendTransport: CreateSendTransportType;\n connectSendTransportVideo: ConnectSendTransportVideoType;\n reorderStreams: ReorderStreamsType;\n sleep: SleepType;\n\n getUpdatedAllParams: () => StreamSuccessVideoParameters;\n [key: string]: any;\n}\n\nexport interface StreamSuccessVideoOptions {\n stream: MediaStream;\n parameters: StreamSuccessVideoParameters;\n}\n\n// Export the type definition for the function\nexport type StreamSuccessVideoType = (options: StreamSuccessVideoOptions) => Promise<void>;\n\n\n/**\n * Handles the successful streaming of video by managing the local stream, updating parameters, and handling video transport.\n *\n * @param {StreamSuccessVideoOptions} options - The options for streaming the video.\n * @param {MediaStream} options.stream - The media stream to be used for the video.\n * @param {Object} options.parameters - The parameters required for streaming the video.\n * @param {Socket} options.parameters.socket - The socket connection for communication.\n * @param {Array<Participant>} options.parameters.participants - The list of participants in the room.\n * @param {MediaStream | null} options.parameters.localStream - The local media stream.\n * @param {MediaStream | null} options.parameters.localStreamVideo - The local video stream.\n * @param {boolean} options.parameters.transportCreated - Indicates if the transport has been created.\n * @param {boolean} options.parameters.transportCreatedVideo - Indicates if the video transport has been created.\n * @param {boolean} options.parameters.videoAlreadyOn - Indicates if the video is already on.\n * @param {boolean} options.parameters.videoAction - Indicates the action state of the video.\n * @param {ProducerOptions} options.parameters.videoParams - The video parameters for the producer.\n * @param {string} options.parameters.defVideoID - The default video device ID.\n * @param {string} options.parameters.userDefaultVideoInputDevice - The user default video input device.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {string} options.parameters.islevel - The level of the participant.\n * @param {string} options.parameters.member - The name of the participant.\n * @param {boolean} options.parameters.updateMainWindow - Indicates if the main window should be updated.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {VParamsType} options.parameters.vParams - Video parameters.\n * @param {HParamsType} options.parameters.hParams - Horizontal parameters.\n * @param {boolean} options.parameters.allowed - Indicates if the action is allowed.\n * @param {string} options.parameters.currentFacingMode - The current facing mode of the camera.\n * @param {Device | null} options.parameters.device - The device being used for streaming.\n * @param {boolean} options.parameters.keepBackground - Indicates if the background should be kept.\n * @param {boolean} options.parameters.appliedBackground - Indicates if the background has been applied.\n * @param {Producer | null} options.parameters.videoProducer - The video producer instance.\n * @param {Function} options.parameters.updateTransportCreatedVideo - Function to update the transport created state for video.\n * @param {Function} options.parameters.updateVideoAlreadyOn - Function to update the video already on state.\n * @param {Function} options.parameters.updateVideoAction - Function to update the video action state.\n * @param {Function} options.parameters.updateLocalStream - Function to update the local stream.\n * @param {Function} options.parameters.updateLocalStreamVideo - Function to update the local video stream.\n * @param {Function} options.parameters.updateUserDefaultVideoInputDevice - Function to update the user default video input device.\n * @param {Function} options.parameters.updateCurrentFacingMode - Function to update the current facing mode.\n * @param {Function} options.parameters.updateDefVideoID - Function to update the default video device ID.\n * @param {Function} options.parameters.updateAllowed - Function to update the allowed state.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window state.\n * @param {Function} options.parameters.createSendTransport - Function to create a send transport.\n * @param {Function} options.parameters.connectSendTransportVideo - Function to connect the send transport for video.\n * @param {Function} options.parameters.showAlert - Function to display alert messages to the user.\n *\n * @returns {Promise<void>} A promise that resolves when the video streaming setup is complete.\n * \n * @throws Will throw an error if there is an issue with streaming the video.\n * \n * @example\n * ```typescript\n * await streamSuccessVideo({\n * stream: mediaStream,\n * parameters: {\n * socket,\n * participants,\n * localStream: null,\n * localStreamVideo: null,\n * transportCreated: false,\n * transportCreatedVideo: false,\n * videoAlreadyOn: false,\n * videoAction: false,\n * videoParams: producerOptions,\n * defVideoID: \"default-video-id\",\n * userDefaultVideoInputDevice: \"user-device-id\",\n * hostLabel: \"Host\",\n * islevel: \"1\",\n * member: \"Participant1\",\n * lock_screen: false,\n * shared: false,\n * shareScreenStarted: false,\n * vParams,\n * hParams,\n * allowed: true,\n * currentFacingMode: \"user\",\n * device: mediaDevice,\n * updateTransportCreatedVideo,\n * updateVideoAlreadyOn,\n * updateVideoAction,\n * updateLocalStream,\n * updateLocalStreamVideo,\n * updateUserDefaultVideoInputDevice,\n * updateCurrentFacingMode,\n * updateDefVideoID,\n * updateAllowed,\n * updateUpdateMainWindow,\n * createSendTransport,\n * connectSendTransportVideo,\n * showAlert,\n * },\n * });\n * ```\n */\n\n\nexport const streamSuccessVideo = async ({\n stream,\n parameters,\n}: StreamSuccessVideoOptions): Promise<void> => {\n\n let { getUpdatedAllParams } = parameters;\n parameters = getUpdatedAllParams();\n\n try {\n let {\n socket,\n participants,\n localStream,\n transportCreated,\n transportCreatedVideo,\n videoAlreadyOn,\n videoAction,\n videoParams,\n localStreamVideo,\n defVideoID,\n userDefaultVideoInputDevice,\n params,\n videoParamse,\n islevel,\n member,\n updateMainWindow,\n lock_screen,\n shared,\n shareScreenStarted,\n vParams,\n hParams,\n allowed,\n currentFacingMode,\n device,\n\n keepBackground,\n appliedBackground,\n videoProducer,\n\n updateTransportCreatedVideo,\n updateVideoAlreadyOn,\n updateVideoAction,\n updateLocalStream,\n updateLocalStreamVideo,\n updateUserDefaultVideoInputDevice,\n updateCurrentFacingMode,\n updateDefVideoID,\n updateAllowed,\n updateUpdateMainWindow,\n updateParticipants,\n updateVideoParams,\n updateIsBackgroundModalVisible,\n updateAutoClickBackground,\n\n //mediasfu functions\n createSendTransport,\n connectSendTransportVideo,\n showAlert,\n reorderStreams,\n sleep,\n } = parameters;\n\n localStreamVideo = stream;\n updateLocalStreamVideo(localStreamVideo);\n\n if (localStream == null) {\n localStream = new MediaStream([\n localStreamVideo.getVideoTracks()[0],\n ]);\n updateLocalStream(localStream);\n } else {\n // remove all video tracks that are currently in the localStream\n localStream.getVideoTracks().forEach((track) => {\n localStream!.removeTrack(track);\n });\n // add the new video track to the localStream\n localStream.addTrack(localStreamVideo.getVideoTracks()[0]);\n updateLocalStream(localStream);\n }\n\n const videoTracked = localStream.getVideoTracks()[0];\n defVideoID = videoTracked.getSettings().deviceId || '';\n userDefaultVideoInputDevice = defVideoID;\n currentFacingMode = videoTracked.getSettings().facingMode || 'user';\n\n if (defVideoID) {\n updateDefVideoID(defVideoID);\n }\n if (userDefaultVideoInputDevice) {\n updateUserDefaultVideoInputDevice(userDefaultVideoInputDevice);\n }\n if (currentFacingMode) {\n updateCurrentFacingMode(currentFacingMode);\n }\n\n allowed = true;\n updateAllowed(allowed);\n\n try {\n if (islevel === \"2\") {\n params = shared || shareScreenStarted ? vParams : hParams;\n videoParamse = { ...params };\n } else {\n params = vParams;\n videoParamse = { ...params };\n }\n\n let codec = device?.rtpCapabilities?.codecs?.filter(\n (codec: RtpCodecCapability) => codec.mimeType.toLowerCase() !== \"video/vp9\" && codec.kind === \"video\"\n ) || [];\n\n if (parameters.removeSingleVideoEncoding && videoParamse.encodings && videoParamse.encodings.length <= 1) {\n delete videoParamse.encodings;\n }\n\n videoParams = {\n track: localStream.getVideoTracks()[0],\n ...videoParamse,\n codec: codec[0],\n };\n updateVideoParams(videoParams);\n\n if (keepBackground && appliedBackground) {\n videoAlreadyOn = true;\n updateVideoAlreadyOn(videoAlreadyOn);\n\n updateAutoClickBackground(true);\n updateIsBackgroundModalVisible(true);\n await sleep({ ms: 500 });\n updateIsBackgroundModalVisible(false);\n updateAutoClickBackground(false);\n } else {\n if (!transportCreated) {\n try {\n await createSendTransport({\n parameters: { ...parameters, videoParams },\n option: \"video\",\n });\n } catch { /* Handle error */}\n } else {\n try {\n videoProducer!.close();\n await sleep({ ms: 500 });\n } catch { /* Handle error */}\n await connectSendTransportVideo({\n parameters,\n videoParams,\n });\n }\n }\n } catch (error) {\n showAlert?.({\n message: (error as Error).message,\n type: \"danger\",\n duration: 3000,\n });\n }\n\n videoAlreadyOn = true;\n updateVideoAlreadyOn(videoAlreadyOn);\n\n if (videoAction === true) {\n videoAction = false;\n updateVideoAction(videoAction);\n }\n\n if (islevel === \"2\") {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n }\n\n //update the participants array to reflect the change\n participants.forEach((participant) => {\n if (participant.socketId == socket.id && participant.name == member) {\n participant.videoOn = true;\n }\n });\n updateParticipants(participants);\n\n transportCreatedVideo = true;\n updateTransportCreatedVideo(transportCreatedVideo);\n\n //reupdate the screen display\n if (lock_screen) {\n await reorderStreams({\n add: true,\n screenChanged: true,\n parameters: { ...parameters, videoAlreadyOn },\n });\n } else {\n try {\n await reorderStreams({\n add: false,\n screenChanged: true,\n parameters: { ...parameters, videoAlreadyOn },\n });\n } catch { /* Handle error */}\n }\n } catch (error) {\n try {\n let { showAlert } = parameters;\n\n showAlert?.({\n message: (error as Error).message,\n type: \"danger\",\n duration: 3000,\n });\n } catch { /* Handle error */}\n }\n};\n\n","import { ShowAlert, StreamSuccessAudioSwitchType, RequestPermissionAudioType, StreamSuccessAudioSwitchParameters } from \"../types/types\";\n\n\nexport interface SwitchUserAudioParameters extends StreamSuccessAudioSwitchParameters {\n mediaDevices: MediaDevices;\n userDefaultAudioInputDevice: string;\n prevAudioInputDevice: string;\n showAlert?: ShowAlert;\n hasAudioPermission: boolean;\n updateUserDefaultAudioInputDevice: (deviceId: string) => void;\n\n // mediasfu functions\n streamSuccessAudioSwitch: StreamSuccessAudioSwitchType;\n requestPermissionAudio: RequestPermissionAudioType;\n checkMediaPermission: boolean;\n\n [key: string]: any;\n}\n\nexport interface SwitchUserAudioOptions {\n audioPreference: string;\n parameters: SwitchUserAudioParameters;\n}\n\n// Export the type definition for the function\nexport type SwitchUserAudioType = (options: SwitchUserAudioOptions) => Promise<void>;\n\n/**\n * Switches the user's audio input device based on the provided audio preference.\n * \n * @param {SwitchUserAudioOptions} options - The options for switching the user's audio input device.\n * @param {string} options.audioPreference - The preferred audio input device ID.\n * @param {Object} options.parameters - Additional parameters required for switching the audio input device.\n * @param {MediaDevices} options.parameters.mediaDevices - The media devices interface for accessing user media.\n * @param {string} options.parameters.prevAudioInputDevice - The previous audio input device ID.\n * @param {Function} options.parameters.showAlert - Function to show alert messages.\n * @param {boolean} options.parameters.hasAudioPermission - Flag indicating if the user has granted audio permission.\n * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update the user's default audio input device.\n * @param {Function} options.parameters.streamSuccessAudioSwitch - Function to handle successful audio stream switch.\n * @param {Function} options.parameters.requestPermissionAudio - Function to request audio permission from the user.\n * @param {Function} options.parameters.checkMediaPermission - Function to check if media permission is granted.\n * \n * @returns {Promise<void>} A promise that resolves when the audio input device has been successfully switched.\n * \n * @throws Will throw an error if the audio input device cannot be accessed or if there is an unexpected error.\n * \n * @example\n * ```typescript\n * await switchUserAudio({\n * audioPreference: 'audio-device-id',\n * parameters: {\n * mediaDevices,\n * prevAudioInputDevice: 'prev-audio-device-id',\n * showAlert,\n * hasAudioPermission,\n * updateUserDefaultAudioInputDevice,\n * streamSuccessAudioSwitch,\n * requestPermissionAudio,\n * checkMediaPermission,\n * },\n * });\n * ```\n */\n\n\nexport async function switchUserAudio({ audioPreference, parameters }: SwitchUserAudioOptions): Promise<void> {\n const {\n mediaDevices,\n prevAudioInputDevice,\n showAlert,\n hasAudioPermission,\n updateUserDefaultAudioInputDevice,\n\n // Media functions\n streamSuccessAudioSwitch,\n requestPermissionAudio,\n checkMediaPermission,\n } = parameters;\n\n try {\n // Check if audio permission is granted\n if (!hasAudioPermission) {\n if (checkMediaPermission) {\n const statusMic = await requestPermissionAudio();\n if (statusMic !== \"granted\") {\n showAlert?.({\n message:\n \"Allow access to your microphone or check if your microphone is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n }\n\n const mediaConstraints: MediaStreamConstraints = {\n audio: {\n deviceId: { exact: audioPreference },\n echoCancellation: false,\n noiseSuppression: false,\n autoGainControl: false,\n },\n video: false,\n };\n\n // Get user media with the defined audio constraints\n await mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessAudioSwitch({ stream, parameters });\n })\n .catch((error) => {\n console.log(\"Error switching audio A\", error);\n // Handle errors and revert to the previous audio input device\n updateUserDefaultAudioInputDevice(prevAudioInputDevice);\n\n\n showAlert?.({\n message: \"Error switching; the specified microphone could not be accessed.\",\n type: \"danger\",\n duration: 3000,\n });\n\n });\n } catch (error) {\n console.log(\"Error switching audio\", error);\n // Handle unexpected errors and revert to the previous audio input device\n updateUserDefaultAudioInputDevice(prevAudioInputDevice);\n\n\n showAlert?.({\n message: \"Error switching; the specified microphone could not be accessed.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n}\n\n","import { Socket } from \"socket.io-client\";\nimport { CheckPermissionType, DisconnectSendTransportVideoParameters, DisconnectSendTransportVideoType, RequestPermissionCameraType, ShowAlert, StreamSuccessVideoParameters, StreamSuccessVideoType, VidCons } from \"../../types/types\";\n\nexport interface ClickVideoParameters extends DisconnectSendTransportVideoParameters, StreamSuccessVideoParameters {\n checkMediaPermission: boolean;\n hasCameraPermission: boolean;\n videoAlreadyOn: boolean;\n audioOnlyRoom: boolean;\n recordStarted: boolean;\n recordResumed: boolean;\n recordPaused: boolean;\n recordStopped: boolean;\n recordingMediaOptions: string;\n islevel: string;\n youAreCoHost: boolean;\n adminRestrictSetting: boolean;\n videoRequestState: string | null;\n videoRequestTime: number;\n member: string;\n socket: Socket;\n roomName: string;\n userDefaultVideoInputDevice: string;\n currentFacingMode: string;\n vidCons: VidCons;\n frameRate: number;\n videoAction: boolean;\n localStream: MediaStream | null;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n updateRequestIntervalSeconds: number;\n\n showAlert?: ShowAlert;\n updateVideoAlreadyOn: (value: boolean) => void;\n updateVideoRequestState: (state: string) => void;\n updateLocalStream: (stream: MediaStream | null) => void;\n mediaDevices: MediaDevices;\n\n streamSuccessVideo: StreamSuccessVideoType;\n disconnectSendTransportVideo: DisconnectSendTransportVideoType;\n requestPermissionCamera: RequestPermissionCameraType;\n checkPermission: CheckPermissionType;\n\n getUpdatedAllParams: () => ClickVideoParameters;\n [key: string]: any;\n\n}\n\nexport interface ClickVideoOptions {\n parameters: ClickVideoParameters;\n}\n\n// Export the type definition for the function\nexport type ClickVideoType = (options: ClickVideoOptions) => Promise<void>;\n\n/**\n * Handles the click event to toggle the participant's video on/off and manages video permission requests.\n *\n * @param {ClickVideoOptions} options - The function parameters.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * clickVideo({\n * parameters: {\n * checkMediaPermission: true,\n * hasCameraPermission: false,\n * videoAlreadyOn: false,\n * audioOnlyRoom: false,\n * recordStarted: true,\n * recordResumed: false,\n * recordPaused: true,\n * recordStopped: false,\n * recordingMediaOptions: \"video\",\n * islevel: \"1\",\n * youAreCoHost: false,\n * adminRestrictSetting: false,\n * videoRequestState: null,\n * videoRequestTime: Date.now(),\n * member: \"John Doe\",\n * socket: socketInstance,\n * roomName: \"room123\",\n * userDefaultVideoInputDevice: \"default\",\n * currentFacingMode: \"user\",\n * vidCons: { width: 1280, height: 720 },\n * frameRate: 30,\n * videoAction: false,\n * localStream: null,\n * audioSetting: \"allow\",\n * videoSetting: \"allow\",\n * screenshareSetting: \"allow\",\n * chatSetting: \"allow\",\n * updateRequestIntervalSeconds: 60,\n * showAlert: showAlertFunction,\n * updateVideoAlreadyOn: setVideoAlreadyOn,\n * updateVideoRequestState: setVideoRequestState,\n * updateLocalStream: setLocalStream,\n * mediaDevices: navigator.mediaDevices,\n * streamSuccessVideo: streamSuccessVideoFunction,\n * disconnectSendTransportVideo: disconnectVideoTransportFunction,\n * requestPermissionCamera: requestCameraPermissionFunction,\n * checkPermission: checkPermissionFunction,\n * getUpdatedAllParams: getUpdatedParamsFunction\n * }\n * });\n * ```\n */\n\nexport const clickVideo = async ({ parameters }: ClickVideoOptions): Promise<void> => {\n let {\n checkMediaPermission,\n hasCameraPermission,\n videoAlreadyOn,\n audioOnlyRoom,\n recordStarted,\n recordResumed,\n recordPaused,\n recordStopped,\n recordingMediaOptions,\n islevel,\n youAreCoHost,\n adminRestrictSetting,\n videoRequestState,\n videoRequestTime,\n member,\n socket,\n roomName,\n userDefaultVideoInputDevice,\n currentFacingMode,\n vidCons,\n frameRate,\n videoAction,\n localStream,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n updateRequestIntervalSeconds,\n streamSuccessVideo,\n showAlert,\n updateVideoAlreadyOn,\n updateVideoRequestState,\n updateLocalStream,\n mediaDevices,\n disconnectSendTransportVideo,\n requestPermissionCamera,\n checkPermission,\n } = parameters;\n\n const resolvedMediaDevices =\n typeof mediaDevices?.getUserMedia === \"function\"\n ? mediaDevices\n : globalThis.navigator?.mediaDevices;\n\n if (typeof resolvedMediaDevices?.getUserMedia !== \"function\") {\n showAlert?.({\n message:\n \"Camera access is unavailable in this browser session. Please refresh and try again.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: \"You cannot turn on your camera in an audio-only event.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n if (videoAlreadyOn) {\n if (islevel === \"2\" && (recordStarted || recordResumed)) {\n if (!(recordPaused || recordStopped)) {\n if (recordingMediaOptions === \"video\") {\n showAlert?.({\n message: \"You cannot turn off your camera while recording video, please pause or stop recording first.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n }\n\n videoAlreadyOn = false;\n updateVideoAlreadyOn(videoAlreadyOn);\n if (localStream && localStream.getVideoTracks().length > 0) {\n localStream.getVideoTracks()[0].enabled = false;\n updateLocalStream(localStream);\n }\n await disconnectSendTransportVideo({ parameters });\n } else {\n if (adminRestrictSetting) {\n showAlert?.({\n message: \"You cannot turn on your camera. Access denied by host.\",\n duration: 3000,\n type: \"danger\",\n });\n return;\n }\n\n let response = 2;\n\n if (!videoAction && islevel !== \"2\" && !youAreCoHost) {\n response = await checkPermission({\n permissionType: \"videoSetting\",\n audioSetting, videoSetting, screenshareSetting, chatSetting,\n });\n } else {\n response = 0;\n }\n\n if (response == 1) {\n //approval\n //check if request is pending or not\n if (videoRequestState === \"pending\") {\n showAlert?.({\n message: \"A request is pending. Please wait for the host to respond.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n // check if rejected and current time is less than videoRequestTime\n if (videoRequestState === \"rejected\" && Date.now() - videoRequestTime < updateRequestIntervalSeconds) {\n showAlert?.({\n message: `A request was rejected. Please wait for ${updateRequestIntervalSeconds} seconds before sending another request.`,\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // send request to host\n showAlert?.({\n message: \"Request sent to host.\",\n type: \"success\",\n duration: 3000,\n });\n videoRequestState = \"pending\";\n updateVideoRequestState(videoRequestState);\n\n const userRequest = { id: socket.id, name: member, icon: \"fa-video\" };\n await socket.emit(\"participantRequest\", { userRequest, roomName });\n } else if (response === 2) {\n //if video permission is set to deny then show alert\n showAlert?.({\n message: \"You cannot turn on your camera. Access denied by host.\",\n type: \"danger\",\n duration: 3000,\n });\n } else {\n //if video permission is set to allow then turn on video\n\n //first check if permission is granted\n if (!hasCameraPermission) {\n if (checkMediaPermission) {\n const statusCamera = await requestPermissionCamera();\n if (statusCamera !== \"granted\") {\n showAlert?.({\n message: \"Allow access to your camera or check if your camera is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n }\n\n let mediaConstraints = {};\n let altMediaConstraints = {};\n if (userDefaultVideoInputDevice) {\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n deviceId: userDefaultVideoInputDevice,\n facingMode: currentFacingMode,\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n altMediaConstraints = {\n video: { ...vidCons, frameRate: { ideal: frameRate } },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: { ...vidCons, frameRate: { ideal: frameRate } },\n audio: false,\n };\n altMediaConstraints = {\n video: { frameRate: { ideal: frameRate } },\n audio: false,\n };\n }\n } else {\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: { ...vidCons, frameRate: { ideal: frameRate } },\n audio: false,\n };\n altMediaConstraints = {\n video: { ...vidCons, frameRate: { ideal: frameRate } },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: { frameRate: { ideal: frameRate } },\n audio: false,\n };\n }\n }\n\n await resolvedMediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(async () => {\n await resolvedMediaDevices\n .getUserMedia(altMediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(async() => {\n //remove frameRate from constraints\n altMediaConstraints = {\n video: { ...vidCons },\n audio: false,\n };\n await resolvedMediaDevices\n .getUserMedia(altMediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n }).catch(() => {\n\n showAlert?.({\n message:\n \"Allow access to your camera or check if your camera is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n\n });\n });\n });\n }\n }\n};\n","import { clickVideo, ClickVideoParameters } from \"../methods/stream/clickVideo\";\nimport { ShowAlert, VidCons, RequestPermissionCameraType, StreamSuccessVideoType, SleepType, StreamSuccessVideoParameters } from \"../types/types\";\n\nexport interface SwitchUserVideoParameters extends StreamSuccessVideoParameters, ClickVideoParameters {\n audioOnlyRoom: boolean;\n frameRate: number;\n vidCons: VidCons;\n prevVideoInputDevice: string;\n userDefaultVideoInputDevice: string;\n showAlert?: ShowAlert;\n mediaDevices: MediaDevices;\n hasCameraPermission: boolean;\n updateVideoSwitching: (state: boolean) => void;\n updateUserDefaultVideoInputDevice: (deviceId: string) => void;\n\n // media functions\n requestPermissionCamera: RequestPermissionCameraType;\n streamSuccessVideo: StreamSuccessVideoType;\n sleep: SleepType;\n checkMediaPermission: boolean;\n \n getUpdatedAllParams: () => SwitchUserVideoParameters;\n [key: string]: any;\n}\n\nexport interface SwitchUserVideoOptions {\n videoPreference: string;\n checkoff: boolean;\n parameters: SwitchUserVideoParameters;\n}\n\n// Export the type definition for the function\nexport type SwitchUserVideoType = (options: SwitchUserVideoOptions) => Promise<void>;\n\n/**\n * Switches the user's video input device based on the provided options.\n *\n * @param {SwitchUserVideoOptions} options - The options for switching the user's video.\n * @param {string} options.videoPreference - The preferred video input device ID.\n * @param {boolean} options.checkoff - Flag indicating whether to turn off the video.\n * @param {Object} options.parameters - Additional parameters required for switching the video.\n * @param {boolean} options.parameters.audioOnlyRoom - Indicates if the room is audio-only.\n * @param {number} options.parameters.frameRate - The desired frame rate for the video.\n * @param {Object} options.parameters.vidCons - Video constraints such as width and height.\n * @param {string} options.parameters.prevVideoInputDevice - The previous video input device ID.\n * @param {Function} options.parameters.showAlert - Function to show alerts to the user.\n * @param {Object} options.parameters.mediaDevices - Media devices object to access user media.\n * @param {boolean} options.parameters.hasCameraPermission - Indicates if the user has camera permission.\n * @param {Function} options.parameters.updateVideoSwitching - Function to update video switching state.\n * @param {Function} options.parameters.updateUserDefaultVideoInputDevice - Function to update the default video input device.\n * @param {Function} options.parameters.requestPermissionCamera - Function to request camera permission.\n * @param {Function} options.parameters.streamSuccessVideo - Function to handle successful video stream.\n * @param {Function} options.parameters.sleep - Function to pause execution for a specified duration.\n * @param {Function} options.parameters.checkMediaPermission - Function to check media permissions.\n *\n * @returns {Promise<void>} A promise that resolves when the video input device has been successfully switched.\n *\n * @throws Will throw an error if the audio input device cannot be accessed or if there is an unexpected error.\n *\n * @example\n * ```typescript\n * await switchUserVideo({\n * videoPreference: 'video-device-id',\n * checkoff: false,\n * parameters: {\n * audioOnlyRoom: false,\n * frameRate: 30,\n * vidCons: { width: 640, height: 480 },\n * prevVideoInputDevice: 'prev-video-device-id',\n * showAlert: showAlertFunction,\n * mediaDevices: navigator.mediaDevices,\n * hasCameraPermission: true,\n * updateVideoSwitching: updateVideoSwitchingFunction,\n * updateUserDefaultVideoInputDevice: updateUserDefaultVideoInputDeviceFunction,\n * requestPermissionCamera: requestPermissionCameraFunction,\n * streamSuccessVideo: streamSuccessVideoFunction,\n * sleep: sleepFunction,\n * checkMediaPermission: true,\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * },\n * });\n * ```\n */\n\nexport async function switchUserVideo({\n videoPreference,\n checkoff,\n parameters,\n}: SwitchUserVideoOptions): Promise<void> {\n const {\n audioOnlyRoom,\n frameRate,\n vidCons,\n prevVideoInputDevice,\n showAlert,\n mediaDevices,\n hasCameraPermission,\n updateVideoSwitching,\n updateUserDefaultVideoInputDevice,\n\n //mediasfu functions\n requestPermissionCamera,\n streamSuccessVideo,\n sleep,\n checkMediaPermission,\n } = parameters;\n\n try {\n // Check if it's an audio-only room\n if (audioOnlyRoom) {\n\n showAlert?.({\n message: \"You cannot turn on your camera in an audio-only event.\",\n type: \"danger\",\n duration: 3000,\n });\n\n return;\n }\n\n // If checkoff is not true, trigger a click on the video button to turn off the video\n if (!checkoff) {\n await clickVideo({ parameters });\n updateVideoSwitching(true);\n await sleep({ ms: 500 });\n updateVideoSwitching(false);\n }\n\n // Check camera permission\n if (!hasCameraPermission) {\n if (checkMediaPermission) {\n const statusCamera = await requestPermissionCamera();\n if (statusCamera !== \"granted\") {\n\n showAlert?.({\n message:\n \"Allow access to your camera or check if your camera is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n\n return;\n }\n }\n }\n\n let mediaConstraints: MediaStreamConstraints;\n\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoPreference },\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoPreference },\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n }\n\n // Get user media with the defined constraints\n await mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(async () => {\n // Handle errors and revert to the previous video input device\n updateUserDefaultVideoInputDevice(prevVideoInputDevice);\n\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n });\n } catch {\n // Handle unexpected errors and revert to the previous video input device\n updateUserDefaultVideoInputDevice(prevVideoInputDevice);\n\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n}\n\n","import { clickVideo, ClickVideoParameters } from \"../methods/stream/clickVideo\";\nimport { ShowAlert, VidCons, RequestPermissionCameraType, StreamSuccessVideoType, SleepType, StreamSuccessVideoParameters } from \"../types/types\";\n\n\nexport interface SwitchUserVideoAltParameters extends StreamSuccessVideoParameters, ClickVideoParameters {\n audioOnlyRoom: boolean;\n frameRate: number;\n vidCons: VidCons;\n showAlert?: ShowAlert;\n mediaDevices: MediaDevices;\n hasCameraPermission: boolean;\n updateVideoSwitching: (state: boolean) => void;\n updateCurrentFacingMode: (mode: string) => void;\n\n // mediasfu functions\n requestPermissionCamera: RequestPermissionCameraType;\n streamSuccessVideo: StreamSuccessVideoType;\n sleep: SleepType;\n checkMediaPermission: boolean;\n getUpdatedAllParams: () => SwitchUserVideoAltParameters;\n\n [key: string]: any;\n}\n\nexport interface SwitchUserVideoAltOptions {\n videoPreference: string;\n checkoff: boolean;\n parameters: SwitchUserVideoAltParameters;\n}\n\n// Export the type definition for the function\nexport type SwitchUserVideoAltType = (options: SwitchUserVideoAltOptions) => Promise<void>;\n\n/**\n * Switches the user's video stream based on the provided video preference and other parameters.\n * \n * @param {SwitchUserVideoAltOptions} options - The options for switching the user's video.\n * @param {string} options.videoPreference - The preferred video facing mode (e.g., \"user\" or \"environment\").\n * @param {boolean} options.checkoff - A flag indicating whether to turn off the video before switching.\n * @param {SwitchUserVideoAltParameters} options.parameters - The parameters required for switching the video.\n * \n * @returns {Promise<void>} A promise that resolves when the video switching is complete.\n * \n * @throws Will throw an error if there is an issue with switching the video.\n * \n * @example\n * ```typescript\n * const options = {\n * videoPreference: \"user\",\n * checkoff: false,\n * parameters: {\n * audioOnlyRoom: false,\n * frameRate: 30,\n * vidCons: { width: 640, height: 480 },\n * showAlert: showNotification,\n * mediaDevices: navigator.mediaDevices,\n * hasCameraPermission: true,\n * updateVideoSwitching: updateVideoSwitchingState,\n * updateCurrentFacingMode: updateCurrentFacingMode,\n * requestPermissionCamera: requestCameraPermission,\n * streamSuccessVideo: streamSuccessVideoFunction,\n * sleep: sleepFunction,\n * checkMediaPermission: true,\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * },\n * };\n * \n * switchUserVideoAlt(options)\n * .then(() => {\n * console.log(\"Video switched successfully\");\n * })\n * .catch((error) => {\n * console.error(\"Error switching video:\", error);\n * });\n * ```\n */\n\nexport async function switchUserVideoAlt({\n videoPreference,\n checkoff,\n parameters,\n}: SwitchUserVideoAltOptions): Promise<void> {\n const updatedParameters = parameters.getUpdatedAllParams();\n\n const {\n audioOnlyRoom,\n frameRate,\n vidCons,\n showAlert,\n mediaDevices,\n hasCameraPermission,\n updateVideoSwitching,\n updateCurrentFacingMode,\n\n //mediasfu functions\n requestPermissionCamera,\n streamSuccessVideo,\n sleep,\n checkMediaPermission,\n } = parameters;\n\n let { currentFacingMode, prevFacingMode } = updatedParameters;\n\n try {\n if (audioOnlyRoom) {\n showAlert?.({\n message: \"You cannot turn on your camera in an audio-only event.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // If checkoff is not true, trigger a click on the video button to turn off the video\n if (!checkoff) {\n await clickVideo({ parameters });\n updateVideoSwitching(true);\n await sleep({ ms: 500 });\n updateVideoSwitching(false);\n }\n\n // Check camera permission\n if (!hasCameraPermission && checkMediaPermission) {\n const statusCamera = await requestPermissionCamera();\n if (statusCamera !== \"granted\") {\n showAlert?.({\n message:\n \"Allow access to your camera or check if your camera is not being used by another application.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n\n // Enumerate video devices\n const videoDevices = await mediaDevices.enumerateDevices();\n\n // Define media constraints based on preferences and options\n let mediaConstraints = {};\n\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n facingMode: { exact: videoPreference },\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: {\n facingMode: { exact: videoPreference },\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n }\n\n // Get user media with the defined constraints\n await mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(async () => {\n let videoDevicesFront: MediaDeviceInfo[] = [];\n\n // Filter video devices based on the preferred facing mode\n if (videoPreference === \"user\") {\n videoDevicesFront = videoDevices.filter(\n (device) =>\n device.label.includes(\"front\") && device.kind === \"videoinput\"\n );\n } else {\n videoDevicesFront = videoDevices.filter(\n (device) =>\n device.label.includes(\"back\") && device.kind === \"videoinput\"\n );\n }\n\n if (videoDevicesFront.length > 0) {\n videoDevicesFront.forEach((device) => {\n if (device.kind === \"videoinput\") {\n let videoDeviceId = device.deviceId;\n\n // Update media constraints with the specific video device\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoDeviceId },\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoDeviceId },\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n }\n\n // Try to get user media with the new constraints\n mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(() => {\n // If the current video device is the last one in the list, show the error; otherwise, try the next device\n if (\n videoDeviceId ===\n videoDevicesFront[videoDevicesFront.length - 1].deviceId\n ) {\n currentFacingMode = prevFacingMode;\n updateCurrentFacingMode(currentFacingMode);\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n });\n }\n });\n } else {\n // Show error if no compatible video devices are found\n currentFacingMode = prevFacingMode;\n updateCurrentFacingMode(currentFacingMode);\n\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n });\n } catch {\n // Handle any unexpected errors\n\n const videoDevices = await mediaDevices.enumerateDevices();\n // Handle any unexpected errors\n let videoDevicesFront: MediaDeviceInfo[] = [];\n if (videoPreference === \"user\") {\n videoDevicesFront = videoDevices.filter(\n (device) =>\n device.label.includes(\"front\") && device.kind === \"videoinput\"\n );\n } else {\n videoDevicesFront = videoDevices.filter(\n (device) =>\n device.label.includes(\"back\") && device.kind === \"videoinput\"\n );\n }\n\n let mediaConstraints = {};\n\n if (videoDevicesFront.length > 0) {\n videoDevicesFront.forEach((device) => {\n if (device.kind === \"videoinput\") {\n let videoDeviceId = device.deviceId;\n\n if (vidCons && vidCons.width && vidCons.height) {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoDeviceId },\n ...vidCons,\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n } else {\n mediaConstraints = {\n video: {\n deviceId: { exact: videoDeviceId },\n frameRate: { ideal: frameRate },\n },\n audio: false,\n };\n }\n\n mediaDevices\n .getUserMedia(mediaConstraints)\n .then(async (stream) => {\n await streamSuccessVideo({ stream, parameters });\n })\n .catch(() => {\n if (\n videoDeviceId ===\n videoDevicesFront[videoDevicesFront.length - 1].deviceId\n ) {\n currentFacingMode = prevFacingMode;\n updateCurrentFacingMode(currentFacingMode);\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n });\n }\n });\n } else {\n currentFacingMode = prevFacingMode;\n updateCurrentFacingMode(currentFacingMode);\n\n\n showAlert?.({\n message:\n \"Error switching; not accessible, might need to turn off your video and turn it back on after switching.\",\n type: \"danger\",\n duration: 3000,\n });\n\n }\n }\n}\n","import { Socket } from \"socket.io-client\";\nimport { Participant, AutoAdjustType, ScreenState, EventType } from \"../types/types\";\n\nexport interface TriggerParameters {\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n screenStates: ScreenState[];\n participants: Participant[];\n updateDateState?: number | null;\n lastUpdate: number | null;\n nForReadjust: number | null;\n eventType: EventType;\n shared: boolean;\n shareScreenStarted: boolean;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n updateUpdateDateState: (timestamp: number | null) => void;\n updateLastUpdate: (lastUpdate: number | null) => void;\n updateNForReadjust: (nForReadjust: number) => void;\n\n\n // mediasfu functions\n autoAdjust: AutoAdjustType;\n\n getUpdatedAllParams: () => TriggerParameters;\n [key: string]: any;\n}\n\nexport interface TriggerOptions {\n ref_ActiveNames: string[];\n parameters: TriggerParameters;\n}\n\n// Export the type definition for the function\nexport type TriggerType = (options: TriggerOptions) => Promise<void>;\n\n/**\n * Triggers an update to the screen client based on the provided parameters.\n *\n * @param {TriggerOptions} options - The options for triggering the update.\n * @param {string[]} options.ref_ActiveNames - Reference to the active names.\n * @param {TriggerParameters} options.parameters - The parameters for the trigger.\n * \n * @returns {Promise<void>} A promise that resolves when the trigger is complete.\n *\n * @throws Will throw an error if the updateScreenClient operation fails.\n *\n * @remarks\n * This function handles various conditions to determine the main screen person,\n * adjusts the screen states, and emits an update to the screen client via socket.\n *\n * @example\n * ```typescript\n * await trigger({\n * ref_ActiveNames: [\"user1\", \"user2\"],\n * parameters: {\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * roomName: \"room1\",\n * screenStates: [{ mainScreenPerson: \"user1\", mainScreenFilled: true, adminOnMainScreen: false }],\n * participants: [{ name: \"admin\", islevel: \"2\" }],\n * updateDateState: 0,\n * lastUpdate: null,\n * nForReadjust: 0,\n * eventType: \"conference\",\n * shared: false,\n * shareScreenStarted: false,\n * whiteboardStarted: false,\n * whiteboardEnded: false,\n * updateUpdateDateState: (date) => {},\n * updateLastUpdate: (date) => {},\n * updateNForReadjust: (n) => {},\n * autoAdjust: async ({ n, parameters }) => [n, 0],\n * },\n * });\n * ```\n */\n\nexport async function trigger({\n ref_ActiveNames,\n parameters,\n}: TriggerOptions): Promise<void> {\n try {\n parameters = parameters.getUpdatedAllParams();\n\n let {\n socket,\n localSocket,\n roomName,\n screenStates,\n participants,\n updateDateState,\n lastUpdate,\n nForReadjust,\n eventType,\n shared,\n shareScreenStarted,\n whiteboardStarted,\n whiteboardEnded,\n updateUpdateDateState,\n updateLastUpdate,\n updateNForReadjust,\n\n //mediasfu functions\n autoAdjust,\n } = parameters;\n\n let socketRef = socket;\n if (localSocket && localSocket.id) {\n socketRef = localSocket;\n }\n\n let personOnMainScreen = screenStates[0].mainScreenPerson;\n let adminName = \"\";\n const admin = participants.filter(\n (participant) => participant.islevel == \"2\"\n );\n if (admin.length > 0) {\n adminName = admin[0].name || \"\";\n }\n\n if (personOnMainScreen === \"WhiteboardActive\") {\n personOnMainScreen = adminName;\n }\n\n let mainfilled = screenStates[0].mainScreenFilled;\n let adminOnMain = screenStates[0].adminOnMainScreen;\n let nForReadjust_: number;\n let val1: number;\n\n let noww = new Date().getTime();\n //get now in seconds\n let timestamp = Math.floor(noww / 1000);\n\n let eventPass = false;\n\n if (eventType == \"conference\" && !(shared || shareScreenStarted)) {\n eventPass = true;\n personOnMainScreen = adminName;\n\n if (!ref_ActiveNames.includes(adminName)) {\n ref_ActiveNames.unshift(adminName);\n }\n }\n\n if ((mainfilled && personOnMainScreen != null && adminOnMain) || eventPass) {\n if (eventType == \"conference\") {\n nForReadjust = nForReadjust! + 1;\n updateNForReadjust(nForReadjust);\n }\n\n if (!ref_ActiveNames.includes(adminName) && whiteboardStarted && !whiteboardEnded) {\n ref_ActiveNames.unshift(adminName);\n }\n\n nForReadjust_ = ref_ActiveNames.length;\n\n if (nForReadjust_ == 0 && eventType == \"webinar\") {\n val1 = 0;\n } else {\n const [val11, ] = await autoAdjust({\n n: nForReadjust_,\n eventType,\n shared,\n shareScreenStarted,\n });\n val1 = val11;\n }\n\n let calc1 = Math.floor((val1 / 12) * 100);\n let calc2 = (100) - calc1;\n\n //check if lastUpdate is not null and at least same seconds\n if (lastUpdate == null || updateDateState != timestamp) {\n let now = new Date();\n\n socketRef.emit(\n \"updateScreenClient\",\n {\n roomName,\n names: ref_ActiveNames,\n mainPercent: calc2,\n mainScreenPerson: personOnMainScreen,\n viewType: eventType,\n },\n ({ success, reason }: { success: boolean; reason: string; }) => {\n updateDateState = timestamp;\n updateUpdateDateState(updateDateState);\n lastUpdate = Math.floor(now.getTime() / 1000);\n updateLastUpdate(lastUpdate);\n if (!success) {\n console.log(reason, \"updateScreenClient failed\");\n }\n }\n );\n }\n } else if (mainfilled && personOnMainScreen != null && !adminOnMain) {\n //check if the person on main screen is still in the room\n // ss = true\n\n nForReadjust_ = ref_ActiveNames.length;\n\n if (!ref_ActiveNames.includes(adminName)) {\n ref_ActiveNames.unshift(adminName);\n }\n\n const [val11, ] = await autoAdjust({\n n: nForReadjust_,\n eventType,\n shared,\n shareScreenStarted,\n });\n val1 = val11;\n\n const calc1 = Math.floor((val1 / 12) * 100);\n const calc2 = 100 - calc1;\n\n if (lastUpdate == null || updateDateState !== timestamp) {\n let now = new Date();\n\n socketRef.emit(\n \"updateScreenClient\",\n {\n roomName,\n names: ref_ActiveNames,\n mainPercent: calc2,\n mainScreenPerson: personOnMainScreen,\n viewType: eventType,\n },\n ({ success, reason }: { success: boolean; reason: string; }) => {\n updateDateState = timestamp;\n updateUpdateDateState(updateDateState);\n lastUpdate = Math.floor(now.getTime() / 1000);\n updateLastUpdate(lastUpdate);\n if (!success) {\n console.log(reason, \"updateScreenClient failed\");\n }\n }\n );\n }\n } else {\n //stop recording\n console.log(\"trigger stopRecording\");\n }\n } catch (error) {\n console.log(\"Error triggering updateScreen:\", error);\n }\n}\n\n","import type {\n BreakoutParticipant,\n BreakoutRoomUpdatedData,\n OnScreenChangesParameters,\n OnScreenChangesType,\n Participant,\n RePortParameters,\n RePortType,\n} from '../../types/types'\n\nexport interface BreakoutRoomUpdatedParameters extends OnScreenChangesParameters, RePortParameters {\n breakOutRoomStarted: boolean\n breakOutRoomEnded: boolean\n breakoutRooms: BreakoutParticipant[][]\n hostNewRoom: number\n islevel: string\n participantsAll: Participant[]\n participants: Participant[]\n meetingDisplayType: string\n prevMeetingDisplayType: string\n updateBreakoutRooms: (rooms: BreakoutParticipant[][]) => void\n updateBreakOutRoomStarted: (started: boolean) => void\n updateBreakOutRoomEnded: (ended: boolean) => void\n updateHostNewRoom: (room: number) => void\n updateMeetingDisplayType: (type: string) => void\n updateParticipantsAll: (participants: Participant[]) => void\n updateParticipants: (participants: Participant[]) => void\n onScreenChanges: OnScreenChangesType\n rePort: RePortType\n getUpdatedAllParams: () => BreakoutRoomUpdatedParameters\n [key: string]: any\n}\n\nexport interface BreakoutRoomUpdatedOptions {\n data: BreakoutRoomUpdatedData\n parameters: BreakoutRoomUpdatedParameters\n}\n\nexport type BreakoutRoomUpdatedType = (options: BreakoutRoomUpdatedOptions) => Promise<void>\n\n/**\n * Updates the state of breakout rooms based on the provided data and parameters.\n *\n * @param {BreakoutRoomUpdatedOptions} options - The options object.\n * @param {BreakoutRoomUpdatedData} options.data - The data object containing information about the breakout rooms.\n * @param {BreakoutRoomUpdatedParameters} options.parameters - The parameters object containing various state update functions and other parameters.\n *\n * @example\n * ```typescript\n * const breakoutOptions: BreakoutRoomUpdatedOptions = {\n * data: breakoutData,\n * parameters: {\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: false,\n * breakoutRooms: [[]],\n * hostNewRoom: 1,\n * islevel: '2',\n * participantsAll: allParticipants,\n * participants: activeParticipants,\n * meetingDisplayType: 'all',\n * prevMeetingDisplayType: 'video',\n * updateBreakoutRooms: setBreakoutRooms,\n * updateBreakOutRoomStarted: setBreakOutRoomStarted,\n * updateBreakOutRoomEnded: setBreakOutRoomEnded,\n * updateHostNewRoom: setHostNewRoom,\n * updateMeetingDisplayType: setMeetingDisplayType,\n * updateParticipantsAll: setAllParticipants,\n * updateParticipants: setActiveParticipants,\n * onScreenChanges: handleScreenChanges,\n * rePort: reportFunction,\n * getUpdatedAllParams: () => breakoutOptions.parameters,\n * },\n * }\n *\n * await breakoutRoomUpdated(breakoutOptions)\n * ```\n */\nexport const breakoutRoomUpdated: BreakoutRoomUpdatedType = async ({ data, parameters }) => {\n try {\n let {\n breakOutRoomStarted,\n breakOutRoomEnded,\n breakoutRooms,\n hostNewRoom,\n islevel,\n participantsAll,\n participants,\n meetingDisplayType,\n prevMeetingDisplayType,\n updateBreakoutRooms,\n updateBreakOutRoomStarted,\n updateBreakOutRoomEnded,\n updateHostNewRoom,\n updateMeetingDisplayType,\n updateParticipantsAll,\n updateParticipants,\n onScreenChanges,\n rePort,\n } = parameters\n\n if (data.forHost) {\n hostNewRoom = data.newRoom!\n updateHostNewRoom(hostNewRoom!)\n await onScreenChanges({ changed: true, parameters })\n return\n }\n\n if (islevel === '2' && data.members) {\n participantsAll = data.members.map((participant) => ({\n isBanned: participant.isBanned,\n name: participant.name,\n audioID: participant.audioID,\n videoID: participant.videoID,\n }))\n updateParticipantsAll(participantsAll)\n\n participants = data.members.filter((participant) => !participant.isBanned)\n updateParticipants(participants)\n }\n\n breakoutRooms = data.breakoutRooms || []\n updateBreakoutRooms(breakoutRooms)\n\n if (data.status === 'started' && (!breakOutRoomStarted || breakOutRoomEnded)) {\n breakOutRoomStarted = true\n breakOutRoomEnded = false\n updateBreakOutRoomStarted(true)\n updateBreakOutRoomEnded(false)\n prevMeetingDisplayType = meetingDisplayType\n if (meetingDisplayType !== 'all') {\n meetingDisplayType = 'all'\n updateMeetingDisplayType('all')\n }\n await onScreenChanges({ changed: true, parameters })\n if (islevel === '2') {\n await rePort({ restart: true, parameters })\n }\n } else if (data.status === 'ended') {\n breakOutRoomEnded = true\n updateBreakOutRoomEnded(true)\n if (meetingDisplayType !== prevMeetingDisplayType) {\n updateMeetingDisplayType(prevMeetingDisplayType)\n }\n await onScreenChanges({ changed: true, parameters })\n if (islevel === '2') {\n await rePort({ restart: true, parameters })\n }\n } else if (data.status === 'started' && breakOutRoomStarted) {\n breakOutRoomStarted = true\n breakOutRoomEnded = false\n updateBreakOutRoomStarted(true)\n updateBreakOutRoomEnded(false)\n await onScreenChanges({ changed: true, parameters })\n if (islevel === '2') {\n await rePort({ restart: true, parameters })\n }\n }\n } catch {\n // Handle error\n }\n}\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface ModifySettingsOptions {\n showAlert?: ShowAlert;\n roomName: string;\n audioSet: string;\n videoSet: string;\n screenshareSet: string;\n chatSet: string;\n socket: Socket;\n updateAudioSetting: (audioSet: string) => void;\n updateVideoSetting: (videoSet: string) => void;\n updateScreenshareSetting: (screenshareSet: string) => void;\n updateChatSetting: (chatSet: string) => void;\n updateIsSettingsModalVisible: (isVisible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type ModifySettingsType = (options: ModifySettingsOptions) => Promise<void>;\n\n/**\n * Modifies the settings for a given room and updates the state accordingly.\n *\n * @param {ModifySettingsOptions} options - The options for modifying settings.\n * @returns {Promise<void>} A promise that resolves when the settings have been modified.\n *\n * @throws Will show an alert if any setting is set to \"approval\" in demo mode (room name starts with \"d\").\n *\n * @example\n * ```typescript\n * modifySettings({\n * roomName: \"d123\",\n * audioSet: \"allow\",\n * videoSet: \"allow\",\n * screenshareSet: \"deny\",\n * chatSet: \"allow\",\n * socket: mySocketInstance,\n * updateAudioSetting: setAudioSetting,\n * updateVideoSetting: setVideoSetting,\n * updateScreenshareSetting: setScreenshareSetting,\n * updateChatSetting: setChatSetting,\n * updateIsSettingsModalVisible: setIsSettingsModalVisible,\n * showAlert: (options) => alertUser(options),\n * });\n * ```\n */\nexport async function modifySettings({\n // showAlert,\n roomName,\n audioSet,\n videoSet,\n screenshareSet,\n chatSet,\n socket,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateChatSetting,\n updateIsSettingsModalVisible,\n}: ModifySettingsOptions): Promise<void> {\n // if (roomName.toLowerCase().startsWith('d')) {\n // // none should be approval\n // if (\n // audioSet === 'approval' ||\n // videoSet === 'approval' ||\n // screenshareSet === 'approval' ||\n // chatSet === 'approval'\n // ) {\n // showAlert?.({\n // message: 'You cannot set approval for demo mode.',\n // type: 'danger',\n // duration: 3000,\n // });\n\n // return;\n // }\n // }\n\n // Check and update state variables based on the provided logic\n if (audioSet) {\n updateAudioSetting(audioSet);\n }\n if (videoSet) {\n updateVideoSetting(videoSet);\n }\n if (screenshareSet) {\n updateScreenshareSetting(screenshareSet);\n }\n if (chatSet) {\n updateChatSetting(chatSet);\n }\n\n const settings = [audioSet, videoSet, screenshareSet, chatSet];\n socket.emit('updateSettingsForRequests', { settings, roomName });\n\n // Close modal\n updateIsSettingsModalVisible(false);\n}\n","var cookie = {};\n\n/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\nvar hasRequiredCookie;\n\nfunction requireCookie () {\n\tif (hasRequiredCookie) return cookie;\n\thasRequiredCookie = 1;\n\n\t/**\n\t * Module exports.\n\t * @public\n\t */\n\n\tcookie.parse = parse;\n\tcookie.serialize = serialize;\n\n\t/**\n\t * Module variables.\n\t * @private\n\t */\n\n\tvar __toString = Object.prototype.toString;\n\tvar __hasOwnProperty = Object.prototype.hasOwnProperty;\n\n\t/**\n\t * RegExp to match cookie-name in RFC 6265 sec 4.1.1\n\t * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2\n\t * which has been replaced by the token definition in RFC 7230 appendix B.\n\t *\n\t * cookie-name = token\n\t * token = 1*tchar\n\t * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" /\n\t * \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" /\n\t * \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n\t */\n\n\tvar cookieNameRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n\t/**\n\t * RegExp to match cookie-value in RFC 6265 sec 4.1.1\n\t *\n\t * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n\t * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n\t * ; US-ASCII characters excluding CTLs,\n\t * ; whitespace DQUOTE, comma, semicolon,\n\t * ; and backslash\n\t */\n\n\tvar cookieValueRegExp = /^(\"?)[\\u0021\\u0023-\\u002B\\u002D-\\u003A\\u003C-\\u005B\\u005D-\\u007E]*\\1$/;\n\n\t/**\n\t * RegExp to match domain-value in RFC 6265 sec 4.1.1\n\t *\n\t * domain-value = <subdomain>\n\t * ; defined in [RFC1034], Section 3.5, as\n\t * ; enhanced by [RFC1123], Section 2.1\n\t * <subdomain> = <label> | <subdomain> \".\" <label>\n\t * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]\n\t * Labels must be 63 characters or less.\n\t * 'let-dig' not 'letter' in the first char, per RFC1123\n\t * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>\n\t * <let-dig-hyp> = <let-dig> | \"-\"\n\t * <let-dig> = <letter> | <digit>\n\t * <letter> = any one of the 52 alphabetic characters A through Z in\n\t * upper case and a through z in lower case\n\t * <digit> = any one of the ten digits 0 through 9\n\t *\n\t * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173\n\t *\n\t * > (Note that a leading %x2E (\".\"), if present, is ignored even though that\n\t * character is not permitted, but a trailing %x2E (\".\"), if present, will\n\t * cause the user agent to ignore the attribute.)\n\t */\n\n\tvar domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;\n\n\t/**\n\t * RegExp to match path-value in RFC 6265 sec 4.1.1\n\t *\n\t * path-value = <any CHAR except CTLs or \";\">\n\t * CHAR = %x01-7F\n\t * ; defined in RFC 5234 appendix B.1\n\t */\n\n\tvar pathValueRegExp = /^[\\u0020-\\u003A\\u003D-\\u007E]*$/;\n\n\t/**\n\t * Parse a cookie header.\n\t *\n\t * Parse the given cookie header string into an object\n\t * The object has the various cookies as keys(names) => values\n\t *\n\t * @param {string} str\n\t * @param {object} [opt]\n\t * @return {object}\n\t * @public\n\t */\n\n\tfunction parse(str, opt) {\n\t if (typeof str !== 'string') {\n\t throw new TypeError('argument str must be a string');\n\t }\n\n\t var obj = {};\n\t var len = str.length;\n\t // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.\n\t if (len < 2) return obj;\n\n\t var dec = (opt && opt.decode) || decode;\n\t var index = 0;\n\t var eqIdx = 0;\n\t var endIdx = 0;\n\n\t do {\n\t eqIdx = str.indexOf('=', index);\n\t if (eqIdx === -1) break; // No more cookie pairs.\n\n\t endIdx = str.indexOf(';', index);\n\n\t if (endIdx === -1) {\n\t endIdx = len;\n\t } else if (eqIdx > endIdx) {\n\t // backtrack on prior semicolon\n\t index = str.lastIndexOf(';', eqIdx - 1) + 1;\n\t continue;\n\t }\n\n\t var keyStartIdx = startIndex(str, index, eqIdx);\n\t var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);\n\t var key = str.slice(keyStartIdx, keyEndIdx);\n\n\t // only assign once\n\t if (!__hasOwnProperty.call(obj, key)) {\n\t var valStartIdx = startIndex(str, eqIdx + 1, endIdx);\n\t var valEndIdx = endIndex(str, endIdx, valStartIdx);\n\n\t if (str.charCodeAt(valStartIdx) === 0x22 /* \" */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* \" */) {\n\t valStartIdx++;\n\t valEndIdx--;\n\t }\n\n\t var val = str.slice(valStartIdx, valEndIdx);\n\t obj[key] = tryDecode(val, dec);\n\t }\n\n\t index = endIdx + 1;\n\t } while (index < len);\n\n\t return obj;\n\t}\n\n\tfunction startIndex(str, index, max) {\n\t do {\n\t var code = str.charCodeAt(index);\n\t if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index;\n\t } while (++index < max);\n\t return max;\n\t}\n\n\tfunction endIndex(str, index, min) {\n\t while (index > min) {\n\t var code = str.charCodeAt(--index);\n\t if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index + 1;\n\t }\n\t return min;\n\t}\n\n\t/**\n\t * Serialize data into a cookie header.\n\t *\n\t * Serialize a name value pair into a cookie string suitable for\n\t * http headers. An optional options object specifies cookie parameters.\n\t *\n\t * serialize('foo', 'bar', { httpOnly: true })\n\t * => \"foo=bar; httpOnly\"\n\t *\n\t * @param {string} name\n\t * @param {string} val\n\t * @param {object} [opt]\n\t * @return {string}\n\t * @public\n\t */\n\n\tfunction serialize(name, val, opt) {\n\t var enc = (opt && opt.encode) || encodeURIComponent;\n\n\t if (typeof enc !== 'function') {\n\t throw new TypeError('option encode is invalid');\n\t }\n\n\t if (!cookieNameRegExp.test(name)) {\n\t throw new TypeError('argument name is invalid');\n\t }\n\n\t var value = enc(val);\n\n\t if (!cookieValueRegExp.test(value)) {\n\t throw new TypeError('argument val is invalid');\n\t }\n\n\t var str = name + '=' + value;\n\t if (!opt) return str;\n\n\t if (null != opt.maxAge) {\n\t var maxAge = Math.floor(opt.maxAge);\n\n\t if (!isFinite(maxAge)) {\n\t throw new TypeError('option maxAge is invalid')\n\t }\n\n\t str += '; Max-Age=' + maxAge;\n\t }\n\n\t if (opt.domain) {\n\t if (!domainValueRegExp.test(opt.domain)) {\n\t throw new TypeError('option domain is invalid');\n\t }\n\n\t str += '; Domain=' + opt.domain;\n\t }\n\n\t if (opt.path) {\n\t if (!pathValueRegExp.test(opt.path)) {\n\t throw new TypeError('option path is invalid');\n\t }\n\n\t str += '; Path=' + opt.path;\n\t }\n\n\t if (opt.expires) {\n\t var expires = opt.expires;\n\n\t if (!isDate(expires) || isNaN(expires.valueOf())) {\n\t throw new TypeError('option expires is invalid');\n\t }\n\n\t str += '; Expires=' + expires.toUTCString();\n\t }\n\n\t if (opt.httpOnly) {\n\t str += '; HttpOnly';\n\t }\n\n\t if (opt.secure) {\n\t str += '; Secure';\n\t }\n\n\t if (opt.partitioned) {\n\t str += '; Partitioned';\n\t }\n\n\t if (opt.priority) {\n\t var priority = typeof opt.priority === 'string'\n\t ? opt.priority.toLowerCase() : opt.priority;\n\n\t switch (priority) {\n\t case 'low':\n\t str += '; Priority=Low';\n\t break\n\t case 'medium':\n\t str += '; Priority=Medium';\n\t break\n\t case 'high':\n\t str += '; Priority=High';\n\t break\n\t default:\n\t throw new TypeError('option priority is invalid')\n\t }\n\t }\n\n\t if (opt.sameSite) {\n\t var sameSite = typeof opt.sameSite === 'string'\n\t ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n\t switch (sameSite) {\n\t case true:\n\t str += '; SameSite=Strict';\n\t break;\n\t case 'lax':\n\t str += '; SameSite=Lax';\n\t break;\n\t case 'strict':\n\t str += '; SameSite=Strict';\n\t break;\n\t case 'none':\n\t str += '; SameSite=None';\n\t break;\n\t default:\n\t throw new TypeError('option sameSite is invalid');\n\t }\n\t }\n\n\t return str;\n\t}\n\n\t/**\n\t * URL-decode string value. Optimized to skip native call when no %.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\n\tfunction decode (str) {\n\t return str.indexOf('%') !== -1\n\t ? decodeURIComponent(str)\n\t : str\n\t}\n\n\t/**\n\t * Determine if value is a Date.\n\t *\n\t * @param {*} val\n\t * @private\n\t */\n\n\tfunction isDate (val) {\n\t return __toString.call(val) === '[object Date]';\n\t}\n\n\t/**\n\t * Try decoding a string using a decoding function.\n\t *\n\t * @param {string} str\n\t * @param {function} decode\n\t * @private\n\t */\n\n\tfunction tryDecode(str, decode) {\n\t try {\n\t return decode(str);\n\t } catch (e) {\n\t return str;\n\t }\n\t}\n\treturn cookie;\n}\n\nvar cookieExports = requireCookie();\n\nfunction hasDocumentCookie() {\n const testingValue = typeof global === 'undefined'\n ? undefined\n : global.TEST_HAS_DOCUMENT_COOKIE;\n if (typeof testingValue === 'boolean') {\n return testingValue;\n }\n // Can we get/set cookies on document.cookie?\n return typeof document === 'object' && typeof document.cookie === 'string';\n}\nfunction parseCookies(cookies) {\n if (typeof cookies === 'string') {\n return cookieExports.parse(cookies);\n }\n else if (typeof cookies === 'object' && cookies !== null) {\n return cookies;\n }\n else {\n return {};\n }\n}\nfunction readCookie(value, options = {}) {\n const cleanValue = cleanupCookieValue(value);\n if (!options.doNotParse) {\n try {\n return JSON.parse(cleanValue);\n }\n catch (e) {\n // At least we tried\n }\n }\n // Ignore clean value if we failed the deserialization\n // It is not relevant anymore to trim those values\n return value;\n}\nfunction cleanupCookieValue(value) {\n // express prepend j: before serializing a cookie\n if (value && value[0] === 'j' && value[1] === ':') {\n return value.substr(2);\n }\n return value;\n}\n\nclass Cookies {\n constructor(cookies, defaultSetOptions = {}) {\n this.changeListeners = [];\n this.HAS_DOCUMENT_COOKIE = false;\n this.update = () => {\n if (!this.HAS_DOCUMENT_COOKIE) {\n return;\n }\n const previousCookies = this.cookies;\n this.cookies = cookieExports.parse(document.cookie);\n this._checkChanges(previousCookies);\n };\n const domCookies = typeof document === 'undefined' ? '' : document.cookie;\n this.cookies = parseCookies(cookies || domCookies);\n this.defaultSetOptions = defaultSetOptions;\n this.HAS_DOCUMENT_COOKIE = hasDocumentCookie();\n }\n _emitChange(params) {\n for (let i = 0; i < this.changeListeners.length; ++i) {\n this.changeListeners[i](params);\n }\n }\n _checkChanges(previousCookies) {\n const names = new Set(Object.keys(previousCookies).concat(Object.keys(this.cookies)));\n names.forEach((name) => {\n if (previousCookies[name] !== this.cookies[name]) {\n this._emitChange({\n name,\n value: readCookie(this.cookies[name]),\n });\n }\n });\n }\n _startPolling() {\n this.pollingInterval = setInterval(this.update, 300);\n }\n _stopPolling() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n }\n get(name, options = {}) {\n if (!options.doNotUpdate) {\n this.update();\n }\n return readCookie(this.cookies[name], options);\n }\n getAll(options = {}) {\n if (!options.doNotUpdate) {\n this.update();\n }\n const result = {};\n for (let name in this.cookies) {\n result[name] = readCookie(this.cookies[name], options);\n }\n return result;\n }\n set(name, value, options) {\n if (options) {\n options = Object.assign(Object.assign({}, this.defaultSetOptions), options);\n }\n else {\n options = this.defaultSetOptions;\n }\n const stringValue = typeof value === 'string' ? value : JSON.stringify(value);\n this.cookies = Object.assign(Object.assign({}, this.cookies), { [name]: stringValue });\n if (this.HAS_DOCUMENT_COOKIE) {\n document.cookie = cookieExports.serialize(name, stringValue, options);\n }\n this._emitChange({ name, value, options });\n }\n remove(name, options) {\n const finalOptions = (options = Object.assign(Object.assign(Object.assign({}, this.defaultSetOptions), options), { expires: new Date(1970, 1, 1, 0, 0, 1), maxAge: 0 }));\n this.cookies = Object.assign({}, this.cookies);\n delete this.cookies[name];\n if (this.HAS_DOCUMENT_COOKIE) {\n document.cookie = cookieExports.serialize(name, '', finalOptions);\n }\n this._emitChange({ name, value: undefined, options });\n }\n addChangeListener(callback) {\n this.changeListeners.push(callback);\n if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 1) {\n if (typeof window === 'object' && 'cookieStore' in window) {\n window.cookieStore.addEventListener('change', this.update);\n }\n else {\n this._startPolling();\n }\n }\n }\n removeChangeListener(callback) {\n const idx = this.changeListeners.indexOf(callback);\n if (idx >= 0) {\n this.changeListeners.splice(idx, 1);\n }\n if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 0) {\n if (typeof window === 'object' && 'cookieStore' in window) {\n window.cookieStore.removeEventListener('change', this.update);\n }\n else {\n this._stopPolling();\n }\n }\n }\n}\n\nexport { Cookies as default };\n","import { PreJoinPageParameters } from \"../../types/types\";\nimport type { Socket } from \"socket.io-client\";\nimport Cookies from \"universal-cookie\";\n\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10; // Maximum number of unsuccessful attempts before rate limiting\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours in milliseconds\n\nexport interface CheckLimitsStorageAdapter {\n getItem: (key: string) => Promise<string | null | undefined> | string | null | undefined;\n setItem: (key: string, value: string) => Promise<void> | void;\n}\n\nexport interface CheckLimitsAndMakeRequestWithStorageOptions {\n apiUserName: string;\n apiToken: string;\n link: string;\n apiKey?: string;\n userName: string;\n parameters: PreJoinPageParameters;\n validate?: boolean;\n storageAdapter: CheckLimitsStorageAdapter;\n}\n\nexport type CheckLimitsAndMakeRequestWithStorageType = (\n options: CheckLimitsAndMakeRequestWithStorageOptions,\n) => Promise<void>;\n\nconst readStoredNumber = async (\n adapter: CheckLimitsStorageAdapter,\n key: string,\n): Promise<number> => {\n const value = await adapter.getItem(key);\n const parsed = parseInt((value ?? '0').toString(), 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n};\n\nconst writeStoredNumber = async (\n adapter: CheckLimitsStorageAdapter,\n key: string,\n value: number,\n): Promise<void> => {\n await adapter.setItem(key, value.toString());\n};\n\nconst hasConnectedSocketId = (socket: unknown): socket is Socket & { id: string } => {\n if (!socket || typeof socket !== 'object') {\n return false;\n }\n\n const candidate = socket as { id?: unknown };\n return typeof candidate.id === 'string' && candidate.id.length > 0;\n};\n\n/**\n * Mobile/storage-adapter variant used by RN/Expo wrappers to share one canonical implementation.\n */\nexport const checkLimitsAndMakeRequestWithStorage: CheckLimitsAndMakeRequestWithStorageType = async ({\n apiUserName,\n apiToken,\n link,\n apiKey = '',\n userName,\n parameters,\n validate = true,\n storageAdapter,\n}) => {\n const TIMEOUT_DURATION = 10000; // 10 seconds\n\n try {\n let unsuccessfulAttempts = await readStoredNumber(storageAdapter, 'unsuccessfulAttempts');\n const lastRequestTimestamp = await readStoredNumber(storageAdapter, 'lastRequestTimestamp');\n\n if (\n unsuccessfulAttempts >= MAX_ATTEMPTS\n && Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION\n ) {\n parameters.showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n return;\n }\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n unsuccessfulAttempts = 0;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n }\n\n parameters.updateIsLoadingModalVisible(true);\n\n const socketPromise = parameters.connectSocket({\n apiUserName,\n apiKey,\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<never>((_, reject) => setTimeout(\n () => reject(new Error('Request timed out')),\n TIMEOUT_DURATION,\n ));\n\n const socket = await Promise.race([socketPromise, timeoutPromise]);\n\n if (hasConnectedSocketId(socket)) {\n unsuccessfulAttempts = 0;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n\n if (validate) {\n parameters.updateSocket(socket);\n } else {\n parameters.updateLocalSocket?.(socket);\n }\n\n parameters.updateApiUserName(apiUserName);\n parameters.updateApiToken(apiToken);\n parameters.updateLink(link);\n parameters.updateRoomName(apiUserName);\n parameters.updateMember(userName);\n if (validate) {\n parameters.updateValidated(true);\n }\n } else {\n unsuccessfulAttempts += 1;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n parameters.updateIsLoadingModalVisible(false);\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n parameters.showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n } else {\n parameters.showAlert?.({\n message: 'Invalid credentials.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch (error) {\n console.error('Error connecting to socket:', error);\n parameters.showAlert?.({\n message: 'Unable to connect. Check your credentials and try again.',\n type: 'danger',\n duration: 3000,\n });\n\n let unsuccessfulAttempts = await readStoredNumber(storageAdapter, 'unsuccessfulAttempts');\n unsuccessfulAttempts += 1;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n parameters.updateIsLoadingModalVisible(false);\n }\n};\n\n\nexport const checkLimitsAndMakeRequest = async ({\n apiUserName,\n apiToken,\n link,\n apiKey = \"\",\n userName,\n parameters,\n validate = true,\n }: {\n apiUserName: string;\n apiToken: string;\n link: string;\n apiKey?: string;\n userName: string;\n parameters: PreJoinPageParameters;\n validate?: boolean;\n }) => {\n const TIMEOUT_DURATION = 10000; // 10 seconds\n let unsuccessfulAttempts =\n parseInt(cookies.get(\"unsuccessfulAttempts\")) || 0;\n let lastRequestTimestamp =\n parseInt(cookies.get(\"lastRequestTimestamp\")) || 0;\n \n if (\n unsuccessfulAttempts >= MAX_ATTEMPTS &&\n Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION\n ) {\n parameters.showAlert?.({\n message: \"Too many unsuccessful attempts. Please try again later.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n } else {\n unsuccessfulAttempts = 0;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n }\n \n try {\n parameters.updateIsLoadingModalVisible(true);\n const socketPromise = await parameters.connectSocket({\n apiUserName,\n apiKey,\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<null>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Request timed out\")),\n TIMEOUT_DURATION\n )\n );\n \n const socket = await Promise.race([socketPromise, timeoutPromise]);\n if (hasConnectedSocketId(socket)) {\n unsuccessfulAttempts = 0;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n if (validate){\n // only one connection is established, no local socket\n parameters.updateSocket(socket);\n }else{\n // local socket is also established, mediaSFU connection is now the local socket\n parameters.updateLocalSocket?.(socket);\n }\n parameters.updateApiUserName(apiUserName);\n parameters.updateApiToken(apiToken);\n parameters.updateLink(link);\n parameters.updateRoomName(apiUserName);\n parameters.updateMember(userName);\n if (validate) parameters.updateValidated(true);\n } else {\n unsuccessfulAttempts += 1;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n parameters.updateIsLoadingModalVisible(false);\n parameters.showAlert?.({\n message: \"Invalid credentials.\",\n type: \"danger\",\n duration: 3000,\n });\n }\n } catch {\n parameters.showAlert?.({\n message: \"Unable to connect. Check your credentials and try again.\",\n type: \"danger\",\n duration: 3000,\n });\n unsuccessfulAttempts += 1;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n parameters.updateIsLoadingModalVisible(false);\n }\n };","import type { Request, RequestResponse, ShowAlert } from '../../types/types';\n\nexport interface HostRequestResponseOptions {\n requestResponse: RequestResponse;\n showAlert?: ShowAlert;\n requestList: Request[];\n updateRequestList: (requestList: Request[]) => void;\n updateMicAction: (action: boolean) => void;\n updateVideoAction: (action: boolean) => void;\n updateScreenAction: (action: boolean) => void;\n updateChatAction: (action: boolean) => void;\n updateAudioRequestState: (state: string | null) => void;\n updateVideoRequestState: (state: string | null) => void;\n updateScreenRequestState: (state: string | null) => void;\n updateChatRequestState: (state: string | null) => void;\n updateAudioRequestTime: (time: number) => void;\n updateVideoRequestTime: (time: number) => void;\n updateScreenRequestTime: (time: number) => void;\n updateChatRequestTime: (time: number) => void;\n updateRequestIntervalSeconds: number;\n}\n\nexport type HostRequestResponseType = (options: HostRequestResponseOptions) => Promise<void>;\n\n/**\n * Applies a host's response to a pending participant request.\n *\n * This helper removes the resolved request from the pending list, updates the\n * caller's relevant request state, and triggers acceptance or rejection alerts\n * with the correct retry cooldown timestamps.\n *\n * @param options Function options for processing the host response.\n * @returns A promise that resolves after request state has been updated.\n */\nexport const hostRequestResponse = async ({\n requestResponse,\n showAlert,\n requestList,\n updateRequestList,\n updateMicAction,\n updateVideoAction,\n updateScreenAction,\n updateChatAction,\n updateAudioRequestState,\n updateVideoRequestState,\n updateScreenRequestState,\n updateChatRequestState,\n updateAudioRequestTime,\n updateVideoRequestTime,\n updateScreenRequestTime,\n updateChatRequestTime,\n updateRequestIntervalSeconds,\n}: HostRequestResponseOptions): Promise<void> => {\n const filteredRequests = requestList.filter(\n (request) =>\n request.id !== requestResponse.id &&\n request.icon !== requestResponse.type &&\n request.name !== requestResponse.name &&\n request.username !== requestResponse.username,\n );\n updateRequestList(filteredRequests);\n\n const requestType = requestResponse.type;\n\n if (requestResponse.action === 'accepted') {\n switch (requestType) {\n case 'fa-microphone':\n showAlert?.({\n message: 'Unmute request was accepted; click the mic button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateMicAction(true);\n updateAudioRequestState('accepted');\n break;\n case 'fa-video':\n showAlert?.({\n message: 'Video request was accepted; click the video button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateVideoAction(true);\n updateVideoRequestState('accepted');\n break;\n case 'fa-desktop':\n showAlert?.({\n message: 'Screenshare request was accepted; click the screen button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateScreenAction(true);\n updateScreenRequestState('accepted');\n break;\n case 'fa-comments':\n showAlert?.({\n message: 'Chat request was accepted; click the chat button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateChatAction(true);\n updateChatRequestState('accepted');\n break;\n }\n } else {\n let timerDate: Date;\n switch (requestType) {\n case 'fa-microphone':\n showAlert?.({\n message: 'Unmute request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateAudioRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateAudioRequestTime(timerDate.getTime());\n break;\n case 'fa-video':\n showAlert?.({\n message: 'Video request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateVideoRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateVideoRequestTime(timerDate.getTime());\n break;\n case 'fa-desktop':\n showAlert?.({\n message: 'Screenshare request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateScreenRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateScreenRequestTime(timerDate.getTime());\n break;\n case 'fa-comments':\n showAlert?.({\n message: 'Chat request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateChatRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateChatRequestTime(timerDate.getTime());\n break;\n }\n }\n};","import { Socket } from 'socket.io-client';\nimport {\n CheckPermissionType,\n DisconnectSendTransportAudioParameters,\n DisconnectSendTransportAudioType,\n Participant,\n RequestPermissionAudioType,\n ResumeSendTransportAudioParameters,\n ResumeSendTransportAudioType,\n ShowAlert,\n StreamSuccessAudioParameters,\n StreamSuccessAudioType,\n} from '../../types/types';\nimport type { PermissionConfig } from '../permissions/updatePermissionConfig';\n\nexport interface ClickAudioParameters\n extends DisconnectSendTransportAudioParameters,\n ResumeSendTransportAudioParameters,\n StreamSuccessAudioParameters {\n checkMediaPermission: boolean;\n hasAudioPermission: boolean;\n audioPaused: boolean;\n audioAlreadyOn: boolean;\n audioOnlyRoom: boolean;\n recordStarted: boolean;\n recordResumed: boolean;\n recordPaused: boolean;\n recordStopped: boolean;\n recordingMediaOptions: string;\n islevel: string;\n youAreCoHost: boolean;\n adminRestrictSetting: boolean;\n audioRequestState: string | null;\n audioRequestTime: number;\n member: string;\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n userDefaultAudioInputDevice: string;\n micAction: boolean;\n localStream: MediaStream | null;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n permissionConfig?: PermissionConfig | null;\n updateRequestIntervalSeconds: number;\n participants: Participant[];\n mediaDevices: MediaDevices;\n transportCreated: boolean;\n transportCreatedAudio: boolean;\n supportFlexRoom?: boolean;\n supportMaxRoom?: boolean;\n\n updateAudioAlreadyOn: (status: boolean) => void;\n updateAudioRequestState: (state: string | null) => void;\n updateAudioPaused: (status: boolean) => void;\n updateLocalStream: (stream: MediaStream | null) => void;\n updateParticipants: (participants: Participant[]) => void;\n updateTransportCreated: (status: boolean) => void;\n updateTransportCreatedAudio: (status: boolean) => void;\n updateMicAction: (action: boolean) => void;\n showAlert?: ShowAlert;\n\n checkPermission: CheckPermissionType;\n streamSuccessAudio: StreamSuccessAudioType;\n disconnectSendTransportAudio: DisconnectSendTransportAudioType;\n requestPermissionAudio: RequestPermissionAudioType;\n resumeSendTransportAudio: ResumeSendTransportAudioType;\n\n getUpdatedAllParams: () => ClickAudioParameters;\n [key: string]: any;\n}\n\nexport interface ClickAudioOptions {\n parameters: ClickAudioParameters;\n}\n\nexport type ClickAudioType = (options: ClickAudioOptions) => Promise<void>;\n\n/**\n * Handles microphone toggle flow for a participant.\n *\n * This helper enforces host permission rules, request cooldowns, recording\n * constraints, and transport resume/disconnect behavior before updating the\n * caller's local media state.\n *\n * @param options Function options containing the full runtime parameter bag.\n * @returns A promise that resolves after the microphone action has been processed.\n */\nexport const clickAudio = async ({ parameters }: ClickAudioOptions): Promise<void> => {\n let {\n checkMediaPermission,\n hasAudioPermission,\n audioPaused,\n audioAlreadyOn,\n audioOnlyRoom,\n recordStarted,\n recordResumed,\n recordPaused,\n recordStopped,\n recordingMediaOptions,\n islevel,\n youAreCoHost,\n adminRestrictSetting,\n audioRequestState,\n audioRequestTime,\n member,\n socket,\n localSocket,\n roomName,\n userDefaultAudioInputDevice,\n micAction,\n localStream,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n updateRequestIntervalSeconds,\n participants,\n mediaDevices,\n showAlert,\n transportCreated,\n transportCreatedAudio,\n\n updateAudioAlreadyOn,\n updateAudioRequestState,\n updateAudioPaused,\n updateLocalStream,\n updateParticipants,\n updateTransportCreated,\n updateTransportCreatedAudio,\n updateMicAction,\n\n checkPermission,\n streamSuccessAudio,\n requestPermissionAudio,\n resumeSendTransportAudio,\n disconnectSendTransportAudio,\n } = parameters;\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: 'You cannot turn on your camera in an audio-only event.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (audioAlreadyOn) {\n if (islevel === '2' && (recordStarted || recordResumed)) {\n if (!(recordPaused || recordStopped)) {\n if (recordingMediaOptions === 'audio') {\n showAlert?.({\n message: 'You cannot turn off your audio while recording, please pause or stop recording first.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n }\n\n audioAlreadyOn = false;\n updateAudioAlreadyOn(audioAlreadyOn);\n if (localStream && localStream.getAudioTracks().length > 0) {\n localStream.getAudioTracks()[0].enabled = false;\n updateLocalStream(localStream);\n }\n await disconnectSendTransportAudio({ parameters });\n audioPaused = true;\n updateAudioPaused(audioPaused);\n } else {\n if (adminRestrictSetting) {\n showAlert?.({\n message: 'You cannot turn on your microphone. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n const supportMaxRoom = parameters.supportMaxRoom;\n const supportFlexRoom = parameters.supportFlexRoom;\n if ((supportMaxRoom || supportFlexRoom) && islevel !== '2') {\n try {\n const checkResult = await new Promise<{\n allowed: boolean;\n reason?: string;\n producingCount?: number;\n producerLimit?: number;\n }>((resolve) => {\n socket.emit(\n 'checkProduce',\n { kind: 'audio' },\n (response: {\n allowed: boolean;\n reason?: string;\n producingCount?: number;\n producerLimit?: number;\n }) => {\n resolve(response || { allowed: false, reason: 'No response from server' });\n },\n );\n\n setTimeout(() => resolve({ allowed: true }), 5000);\n });\n\n if (!checkResult.allowed) {\n showAlert?.({\n message:\n checkResult.reason ||\n `Audio producer limit reached (${checkResult.producingCount}/${checkResult.producerLimit}).`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n } catch (error) {\n console.warn('Failed to check producer limit:', error);\n }\n }\n\n const panelistsFocused = parameters.panelistsFocused;\n const muteOthersMic = parameters.muteOthersMic;\n const panelists = parameters.panelists;\n\n if (panelistsFocused && muteOthersMic && islevel !== '2') {\n const isPanelist =\n panelists?.some((panelist: { name: string }) => panelist.name === member) || false;\n\n if (!isPanelist) {\n showAlert?.({\n message:\n 'You cannot turn on your microphone. Only panelists can unmute while focus mode is active.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n\n let response = 2;\n if (!micAction && islevel !== '2' && !youAreCoHost) {\n response = await checkPermission({\n permissionType: 'audioSetting',\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n permissionConfig: parameters.permissionConfig,\n participantLevel: islevel,\n });\n } else {\n response = 0;\n }\n\n switch (response) {\n case 1: {\n if (audioRequestState === 'pending') {\n showAlert?.({\n message: 'A request is pending. Please wait for the host to respond.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (\n audioRequestState === 'rejected' &&\n Date.now() - audioRequestTime < updateRequestIntervalSeconds * 1000\n ) {\n showAlert?.({\n message: `A request was rejected. Please wait for ${updateRequestIntervalSeconds} seconds before sending another request.`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n showAlert?.({\n message: 'Request sent to host.',\n type: 'success',\n duration: 3000,\n });\n\n audioRequestState = 'pending';\n updateAudioRequestState(audioRequestState);\n\n const userRequest = {\n id: socket.id,\n name: member,\n icon: 'fa-microphone',\n };\n socket.emit('participantRequest', { userRequest, roomName });\n break;\n }\n\n case 2:\n showAlert?.({\n message: 'You cannot turn on your microphone. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n break;\n\n case 0:\n if (audioPaused) {\n if (localStream && localStream.getAudioTracks().length > 0) {\n localStream.getAudioTracks()[0].enabled = true;\n }\n updateAudioAlreadyOn(true);\n await resumeSendTransportAudio({ parameters });\n socket.emit('resumeProducerAudio', { mediaTag: 'audio', roomName });\n\n try {\n if (localSocket && localSocket.id) {\n localSocket.emit('resumeProducerAudio', { mediaTag: 'audio', roomName });\n }\n } catch (error) {\n console.log('Error in resumeProducerAudio', error);\n }\n\n updateLocalStream(localStream);\n\n if (micAction === true) {\n micAction = false;\n updateMicAction(micAction);\n }\n\n participants.forEach((participant) => {\n if (participant.socketId === socket.id && participant.name === member) {\n participant.muted = false;\n }\n });\n updateParticipants(participants);\n\n transportCreated = true;\n updateTransportCreated(transportCreated);\n\n transportCreatedAudio = true;\n updateTransportCreatedAudio(transportCreatedAudio);\n } else {\n if (!hasAudioPermission && checkMediaPermission) {\n const statusMic = await requestPermissionAudio();\n if (statusMic !== 'granted') {\n showAlert?.({\n message:\n 'Allow access to your microphone or check if your microphone is not being used by another application.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n\n const mediaConstraints = userDefaultAudioInputDevice\n ? { audio: { deviceId: userDefaultAudioInputDevice }, video: false }\n : { audio: true, video: false };\n\n try {\n const stream = await mediaDevices.getUserMedia(mediaConstraints);\n await streamSuccessAudio({ stream, parameters });\n } catch (error) {\n console.error(error);\n showAlert?.({\n message:\n 'Allow access to your microphone or check if your microphone is not being used by another application.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n break;\n\n default:\n }\n }\n};","import { Socket } from 'socket.io-client';\nimport type {\n CheckPermissionType,\n CheckScreenShareParameters,\n CheckScreenShareType,\n ShowAlert,\n StopShareScreenParameters,\n StopShareScreenType,\n} from '../../types/types';\nimport type { PermissionConfig } from '../permissions/updatePermissionConfig';\n\nexport interface ClickScreenShareParameters\n extends CheckScreenShareParameters,\n StopShareScreenParameters {\n showAlert?: ShowAlert;\n roomName: string;\n member: string;\n socket: Socket;\n islevel: string;\n youAreCoHost: boolean;\n adminRestrictSetting: boolean;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n permissionConfig?: PermissionConfig | null;\n screenAction: boolean;\n screenAlreadyOn: boolean;\n screenRequestState: string | null;\n screenRequestTime: number;\n audioOnlyRoom: boolean;\n updateRequestIntervalSeconds: number;\n updateScreenRequestState: (state: string | null) => void;\n updateScreenAlreadyOn: (status: boolean) => void;\n\n checkPermission: CheckPermissionType;\n checkScreenShare: CheckScreenShareType;\n stopShareScreen: StopShareScreenType;\n\n getUpdatedAllParams: () => ClickScreenShareParameters;\n [key: string]: any;\n}\n\nexport interface ClickScreenShareOptions {\n parameters: ClickScreenShareParameters;\n}\n\nexport type ClickScreenShareType = (options: ClickScreenShareOptions) => Promise<void>;\n\n/**\n * Handles screen-share toggle flow for a participant.\n *\n * This helper checks room restrictions, host permission policies, request\n * cooldowns, and then delegates to the supplied start/stop share helpers.\n *\n * @param options Function options containing the full runtime parameter bag.\n * @returns A promise that resolves after the screen-share action has been processed.\n */\nexport const clickScreenShare = async ({ parameters }: ClickScreenShareOptions): Promise<void> => {\n let {\n showAlert,\n roomName,\n member,\n socket,\n islevel,\n youAreCoHost,\n adminRestrictSetting,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n screenAction,\n screenAlreadyOn,\n screenRequestState,\n screenRequestTime,\n audioOnlyRoom,\n updateRequestIntervalSeconds,\n updateScreenRequestState,\n updateScreenAlreadyOn,\n checkPermission,\n checkScreenShare,\n stopShareScreen,\n } = parameters;\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: 'You cannot turn on your camera in an audio-only event.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (screenAlreadyOn) {\n screenAlreadyOn = false;\n updateScreenAlreadyOn(screenAlreadyOn);\n await stopShareScreen({ parameters });\n } else {\n if (adminRestrictSetting) {\n showAlert?.({\n message: 'You cannot start screen share. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n let response = 2;\n if (!screenAction && islevel !== '2' && !youAreCoHost) {\n response = await checkPermission({\n permissionType: 'screenshareSetting',\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n permissionConfig: parameters.permissionConfig,\n participantLevel: islevel,\n });\n } else {\n response = 0;\n }\n\n switch (response) {\n case 0:\n checkScreenShare({ parameters });\n break;\n case 1: {\n if (screenRequestState === 'pending') {\n showAlert?.({\n message: 'A request is already pending. Please wait for the host to respond.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (\n screenRequestState === 'rejected' &&\n Date.now() - screenRequestTime < updateRequestIntervalSeconds\n ) {\n showAlert?.({\n message: 'You cannot send another request at this time.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n showAlert?.({\n message: 'Your request has been sent to the host.',\n type: 'success',\n duration: 3000,\n });\n\n screenRequestState = 'pending';\n updateScreenRequestState(screenRequestState);\n\n const userRequest = { id: socket.id, name: member, icon: 'fa-desktop' };\n socket.emit('participantRequest', { userRequest, roomName });\n break;\n }\n case 2:\n showAlert?.({\n message: 'You are not allowed to start screen share.',\n type: 'danger',\n duration: 3000,\n });\n break;\n default:\n break;\n }\n }\n};","import type { ShowAlert } from '../../types/types';\n\nexport interface TimeLeftRecordingOptions {\n timeLeft: number;\n showAlert?: ShowAlert;\n}\n\nexport type TimeLeftRecordingType = (options: TimeLeftRecordingOptions) => void;\n\n/**\n * Shows a short warning that the current recording session is about to end.\n *\n * @param options Function options including the remaining recording time in seconds.\n */\nexport const timeLeftRecording = ({ timeLeft, showAlert }: TimeLeftRecordingOptions): void => {\n try {\n showAlert?.({\n message: `The recording will stop in less than ${timeLeft} seconds.`,\n duration: 3000,\n type: 'danger',\n });\n } catch (error) {\n console.log('Error in timeLeftRecording: ', error);\n }\n};","import type { Producer } from 'mediasoup-client/lib/types';\nimport type {\n ConnectSendTransportScreenParameters,\n ConnectSendTransportScreenType,\n CreateSendTransportParameters,\n CreateSendTransportType,\n DisconnectSendTransportScreenParameters,\n DisconnectSendTransportScreenType,\n SleepType,\n} from '../../types/types';\nimport type { Socket } from 'socket.io-client';\n\nexport interface CaptureCanvasStreamParameters\n extends CreateSendTransportParameters,\n DisconnectSendTransportScreenParameters,\n ConnectSendTransportScreenParameters {\n canvasWhiteboard: HTMLCanvasElement | null;\n canvasStream: MediaStream | null;\n updateCanvasStream: (stream: MediaStream | null) => void;\n screenProducer: Producer | null;\n localScreenProducer?: Producer | null;\n transportCreated: boolean;\n localTransportCreated?: boolean;\n localSocket?: Socket;\n updateScreenProducer: (producer: Producer | null) => void;\n updateLocalScreenProducer?: (localProducer: Producer | null) => void;\n\n sleep: SleepType;\n createSendTransport: CreateSendTransportType;\n connectSendTransportScreen: ConnectSendTransportScreenType;\n disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n\n getUpdatedAllParams: () => CaptureCanvasStreamParameters;\n [key: string]: any;\n}\n\nexport interface CaptureCanvasStreamOptions {\n parameters: CaptureCanvasStreamParameters;\n start?: boolean;\n}\n\nexport type CaptureCanvasStreamType = (options: CaptureCanvasStreamOptions) => Promise<void>;\n\n/**\n * Captures or tears down a whiteboard canvas stream used for screen-style sharing.\n *\n * When starting, this helper captures the canvas at 30 FPS and ensures the\n * correct screen transport is created or reconnected. When stopping, it ends all\n * canvas tracks and disconnects the corresponding transport.\n *\n * @param options Function options for starting or stopping the captured canvas stream.\n * @returns A promise that resolves after the whiteboard stream lifecycle step completes.\n */\nexport const captureCanvasStream = async ({\n parameters,\n start = true,\n}: CaptureCanvasStreamOptions): Promise<void> => {\n try {\n let {\n canvasWhiteboard,\n canvasStream,\n updateCanvasStream,\n screenProducer,\n localScreenProducer,\n transportCreated,\n localTransportCreated,\n updateScreenProducer,\n updateLocalScreenProducer,\n localSocket,\n sleep,\n createSendTransport,\n connectSendTransportScreen,\n disconnectSendTransportScreen,\n } = parameters;\n\n if (start && !canvasStream) {\n const stream = canvasWhiteboard!.captureStream(30);\n canvasStream = stream;\n updateCanvasStream(stream);\n\n if (localSocket && !localSocket.id) {\n try {\n if (!localTransportCreated) {\n await createSendTransport({ option: 'screen', parameters });\n } else {\n try {\n if (localScreenProducer) {\n localScreenProducer.close();\n if (updateLocalScreenProducer) {\n updateLocalScreenProducer(null);\n }\n await sleep({ ms: 500 });\n }\n } catch (error) {\n console.error(error);\n }\n await connectSendTransportScreen({ stream, parameters });\n }\n } catch {\n }\n\n return;\n }\n\n if (!transportCreated) {\n await createSendTransport({ option: 'screen', parameters });\n } else {\n try {\n if (screenProducer) {\n screenProducer.close();\n updateScreenProducer(null);\n await sleep({ ms: 500 });\n }\n } catch (error) {\n console.error(error);\n }\n await connectSendTransportScreen({ stream, parameters });\n }\n } else if (canvasStream && !start) {\n canvasStream.getTracks().forEach((track) => track.stop());\n canvasStream = null;\n updateCanvasStream(null);\n disconnectSendTransportScreen({ parameters });\n }\n } catch (error) {\n console.error(error, 'error in captureCanvasStream');\n }\n};","import * as mediasoupClient from \"mediasoup-client\";\nimport type { RtpCapabilities, Device } from 'mediasoup-client/lib/types';\n\nexport interface CreateDeviceClientOptions {\n rtpCapabilities: RtpCapabilities | null;\n}\n\n\n// Export the type definition for the function\nexport type CreateDeviceClientType = (options: CreateDeviceClientOptions) => Promise<Device | null>;\n\n\n/**\n * Creates a mediasoup client device with the provided RTP capabilities.\n *\n * @param {CreateDeviceClientOptions} options - The options for creating the device client.\n * @param {RTPCapabilities} options.rtpCapabilities - The RTP capabilities required for the device.\n * @returns {Promise<Device | null>} A promise that resolves to the created Device or null if creation fails.\n * @throws {Error} Throws an error if the required parameters are not provided or if device creation is not supported.\n *\n * @example\n * const device = await createDeviceClient({ rtpCapabilities });\n * if (device) {\n * console.log(\"Device created successfully\");\n * } else {\n * console.log(\"Failed to create device\");\n * }\n */\n\nexport const createDeviceClient = async ({\n rtpCapabilities\n}: CreateDeviceClientOptions): Promise<Device | null> => {\n try {\n // Validate input parameters\n if (!rtpCapabilities) {\n throw new Error(\n \"Both rtpCapabilities and mediasoupClient must be provided.\"\n );\n }\n\n // Create a mediasoup client device\n const device: (Device | null) = new mediasoupClient.Device();\n\n // Remove orientation capabilities\n rtpCapabilities.headerExtensions = rtpCapabilities!.headerExtensions!.filter(\n (ext) => ext.uri !== \"urn:3gpp:video-orientation\"\n );\n\n // Load the provided RTP capabilities into the device\n await device!.load({\n routerRtpCapabilities: rtpCapabilities,\n });\n\n return device;\n } catch ( error ) {\n // Handle specific errors, e.g., UnsupportedError\n if ( error as Error && (error as Error).name === \"UnsupportedError\" ) {\n // Handle unsupported device creation\n console.error(\"Device creation is not supported by this browser.\");\n }\n\n throw error; // Propagate other errors\n }\n\n};\n\n\n\n","import { Socket } from 'socket.io-client';\nimport type { RtpCapabilities } from 'mediasoup-client/lib/types';\nimport { validateAlphanumeric } from '../../methods/utils/validateAlphanumeric';\n\nexport interface JoinRoomOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n}\n\nexport interface JoinRoomResponse {\n success: boolean;\n rtpCapabilities: RtpCapabilities | null;\n reason?: string;\n banned?: boolean;\n suspended?: boolean;\n noAdmin?: boolean;\n [key: string]: any;\n}\n\nexport type JoinRoomType = (options: JoinRoomOptions) => Promise<JoinRoomResponse>;\n\n/**\n * Joins a user to a specified room via a socket connection.\n *\n * @param {JoinRoomOptions} options - The options for joining the room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token.\n * @param {string} options.apiUserName - The API username of the user.\n *\n * @returns {Promise<JoinRoomResponse>} A promise that resolves with the data received from the 'joinRoom' event or rejects with a validation error.\n */\nexport async function joinRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n}: JoinRoomOptions): Promise<JoinRoomResponse> {\n return new Promise((resolve, reject) => {\n if (!(sec && roomName && islevel && apiUserName && member)) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Missing required parameters',\n };\n reject(validationError);\n return;\n }\n\n try {\n validateAlphanumeric({ str: roomName });\n validateAlphanumeric({ str: apiUserName });\n validateAlphanumeric({ str: member });\n } catch {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or apiUserName or member',\n };\n reject(validationError);\n return;\n }\n\n if (!(roomName.startsWith('s') || roomName.startsWith('p') || roomName.startsWith('d'))) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName, must start with s or p or d',\n };\n reject(validationError);\n return;\n }\n\n if (\n !(\n sec.length === 64\n && roomName.length >= 8\n && islevel.length === 1\n && apiUserName.length >= 6\n && (islevel === '0' || islevel === '1' || islevel === '2')\n )\n ) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or islevel or apiUserName or secret',\n };\n reject(validationError);\n return;\n }\n\n socket.emit(\n 'joinRoom',\n {\n roomName, islevel, member, sec, apiUserName,\n },\n async (data: JoinRoomResponse) => {\n try {\n if (data.rtpCapabilities == null) {\n if (data.banned) {\n throw new Error('User is banned.');\n }\n if (data.suspended) {\n throw new Error('User is suspended.');\n }\n if (data.noAdmin) {\n throw new Error('Host has not joined the room yet.');\n }\n\n resolve(data);\n } else {\n resolve(data);\n }\n } catch (error) {\n console.log('Error joining room:', error);\n reject(error);\n }\n },\n );\n });\n}\n","import { Socket } from 'socket.io-client';\nimport { joinRoom, JoinRoomResponse } from '../../producers/producerEmits/joinRoom';\nimport { joinConRoom, JoinConRoomResponse } from '../../producers/producerEmits/joinConRoom';\n\nexport interface JoinRoomClientOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n consume?: boolean;\n}\n\nexport type JoinRoomClientResponse = JoinRoomResponse | JoinConRoomResponse;\nexport type JoinRoomClientType = (options: JoinRoomClientOptions) => Promise<JoinRoomClientResponse>;\n\n/**\n * Joins a room by delegating to the producer or consumer join emit based on the consume flag.\n *\n * @param {JoinRoomClientOptions} options - The options for joining the room.\n * @returns {Promise<JoinRoomClientResponse>} The response returned from the server.\n */\nexport const joinRoomClient = async ({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n consume = false,\n}: JoinRoomClientOptions): Promise<JoinRoomClientResponse> => {\n try {\n if (consume) {\n return await joinConRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n });\n }\n\n return await joinRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n });\n } catch (error) {\n console.log(error);\n throw new Error('Failed to join the room. Please check your connection and try again.');\n }\n};\n","const QnHDCons = { width: { ideal: 320 }, height: { ideal: 180 } };\nconst sdCons = { width: { ideal: 640 }, height: { ideal: 360 } };\nconst hdCons = { width: { ideal: 1280 }, height: { ideal: 720 } };\nconst fhdCons = { width: { ideal: 1920 }, height: { ideal: 1080 } };\nconst qhdCons = { width: { ideal: 2560 }, height: { ideal: 1440 } };\n\nconst QnHDConsPort = { width: { ideal: 180 }, height: { ideal: 320 } };\nconst sdConsPort = { width: { ideal: 360 }, height: { ideal: 640 } };\nconst hdConsPort = { width: { ideal: 720 }, height: { ideal: 1280 } };\nconst fhdConsPort = { width: { ideal: 1080 }, height: { ideal: 1920 } };\nconst qhdConsPort = { width: { ideal: 1440 }, height: { ideal: 2560 } };\n\nconst QnHDConsNeu = { width: { ideal: 240 }, height: { ideal: 240 } };\nconst sdConsNeu = { width: { ideal: 480 }, height: { ideal: 480 } };\nconst hdConsNeu = { width: { ideal: 960 }, height: { ideal: 960 } };\nconst fhdConsNeu = { width: { ideal: 1440 }, height: { ideal: 1440 } };\nconst qhdConsNeu = { width: { ideal: 1920 }, height: { ideal: 1920 } };\n\nconst QnHDFrameRate = 5;\nconst sdFrameRate = 10;\nconst hdFrameRate = 15;\nconst fhdFrameRate = 20;\nconst qhdFrameRate = 30;\nconst screenFrameRate = 30;\n\n/**\n * Preset video capture constraints and frame-rate defaults used by MediaSFU.\n *\n * These exports provide standard landscape, portrait, and neutral constraint\n * presets along with recommended frame-rate values for each quality tier.\n *\n * @example\n * ```typescript\n * const constraints = {\n * video: {\n * ...hdCons,\n * frameRate: { ideal: hdFrameRate },\n * },\n * audio: false,\n * };\n * ```\n */\nexport {\n QnHDCons,\n sdCons,\n hdCons,\n fhdCons,\n qhdCons,\n QnHDConsPort,\n sdConsPort,\n hdConsPort,\n fhdConsPort,\n qhdConsPort,\n QnHDConsNeu,\n sdConsNeu,\n hdConsNeu,\n fhdConsNeu,\n qhdConsNeu,\n QnHDFrameRate,\n sdFrameRate,\n hdFrameRate,\n fhdFrameRate,\n qhdFrameRate,\n screenFrameRate,\n};","import type { HParamsType } from '../../../types/types';\n\nexport const hParams: HParamsType = {\n encodings: [\n {\n rid: 'r8',\n maxBitrate: 240000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 4.0,\n },\n {\n rid: 'r9',\n maxBitrate: 480000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 2.0,\n },\n {\n rid: 'r10',\n maxBitrate: 960000,\n scalabilityMode: 'L1T3',\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 384,\n },\n};","import type { VParamsType } from '../../../types/types';\n\nexport const vParams: VParamsType = {\n encodings: [\n {\n rid: 'r3',\n maxBitrate: 200000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 4.0,\n },\n {\n rid: 'r4',\n maxBitrate: 400000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 2.0,\n },\n {\n rid: 'r5',\n maxBitrate: 800000,\n scalabilityMode: 'L1T3',\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 320,\n },\n};","import type { ScreenParamsType } from '../../../types/types';\n\nexport const screenParams: ScreenParamsType = {\n encodings: [\n {\n rid: 'r7',\n maxBitrate: 3000000,\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 1000,\n },\n};","import type { AParamsType } from '../../../types/types';\n\nexport const aParams: AParamsType = {\n encodings: [\n {\n rid: 'r0',\n maxBitrate: 64000,\n },\n ],\n};","/* eslint-disable eqeqeq */\nimport { RtpCapabilities } from 'mediasoup-client/lib/types';\nimport {\n QnHDCons,\n sdCons,\n hdCons,\n fhdCons,\n qhdCons,\n QnHDConsPort,\n sdConsPort,\n hdConsPort,\n fhdConsPort,\n qhdConsPort,\n QnHDConsNeu,\n sdConsNeu,\n hdConsNeu,\n fhdConsNeu,\n qhdConsNeu,\n QnHDFrameRate,\n hdFrameRate,\n fhdFrameRate,\n qhdFrameRate,\n} from '../../methods/utils/producer/videoCaptureConstraints';\nimport { hParams as host_Params } from '../../methods/utils/producer/hParams';\nimport { vParams as video_Params } from '../../methods/utils/producer/vParams';\nimport { screenParams as screen_Params } from '../../methods/utils/producer/screenParams';\nimport { aParams as audio_Params } from '../../methods/utils/producer/aParams';\nimport {\n HParamsType,\n VParamsType,\n ScreenParamsType,\n AParamsType,\n MeetingRoomParams,\n VidCons,\n ShowAlert,\n ResponseJoinRoom,\n EventType,\n} from '../../types/shared-base-types';\n\nexport interface UpdateRoomParametersClientParameters {\n rtpCapabilities: RtpCapabilities | null;\n roomRecvIPs: string[];\n meetingRoomParams: MeetingRoomParams | null;\n itemPageLimit: number;\n audioOnlyRoom: boolean;\n addForBasic: boolean;\n screenPageLimit: number;\n shareScreenStarted: boolean;\n shared: boolean;\n targetOrientation: string;\n vidCons: VidCons;\n recordingVideoSupport: boolean;\n frameRate: number;\n adminPasscode: string;\n eventType: EventType;\n youAreCoHost: boolean;\n autoWave: boolean;\n forceFullDisplay: boolean;\n chatSetting: string;\n meetingDisplayType: string;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n hParams: HParamsType;\n vParams: VParamsType;\n screenParams: ScreenParamsType;\n aParams: AParamsType;\n islevel: string;\n showAlert?: ShowAlert;\n data: ResponseJoinRoom;\n updateRtpCapabilities: (rtpCapabilities: RtpCapabilities | null) => void;\n updateRoomRecvIPs: (roomRecvIPs: string[]) => void;\n updateMeetingRoomParams: (meetingRoomParams: MeetingRoomParams | null) => void;\n updateItemPageLimit: (limit: number) => void;\n updateAudioOnlyRoom: (isAudioOnly: boolean) => void;\n updateAddForBasic: (addForBasic: boolean) => void;\n updateScreenPageLimit: (limit: number) => void;\n updateVidCons: (cons: VidCons) => void;\n updateFrameRate: (frameRate: number) => void;\n updateAdminPasscode: (passcode: string) => void;\n updateEventType: (eventType: EventType) => void;\n updateYouAreCoHost: (coHost: boolean) => void;\n updateAutoWave: (autoWave: boolean) => void;\n updateForceFullDisplay: (forceFull: boolean) => void;\n updateChatSetting: (setting: string) => void;\n updateMeetingDisplayType: (type: string) => void;\n updateAudioSetting: (setting: string) => void;\n updateVideoSetting: (setting: string) => void;\n updateScreenshareSetting: (setting: string) => void;\n updateHParams: (params: HParamsType) => void;\n updateVParams: (params: VParamsType) => void;\n updateScreenParams: (params: ScreenParamsType) => void;\n updateAParams: (params: AParamsType) => void;\n updateMainHeightWidth: (heightWidth: number) => void;\n updateTargetResolution: (resolution: string) => void;\n updateTargetResolutionHost: (resolution: string) => void;\n updateRecordingAudioPausesLimit: (limit: number) => void;\n updateRecordingAudioPausesCount: (count: number) => void;\n updateRecordingAudioSupport: (support: boolean) => void;\n updateRecordingAudioPeopleLimit: (limit: number) => void;\n updateRecordingAudioParticipantsTimeLimit: (limit: number) => void;\n updateRecordingVideoPausesCount: (count: number) => void;\n updateRecordingVideoPausesLimit: (limit: number) => void;\n updateRecordingVideoSupport: (support: boolean) => void;\n updateRecordingVideoPeopleLimit: (limit: number) => void;\n updateRecordingVideoParticipantsTimeLimit: (limit: number) => void;\n updateRecordingAllParticipantsSupport: (support: boolean) => void;\n updateRecordingVideoParticipantsSupport: (support: boolean) => void;\n updateRecordingAllParticipantsFullRoomSupport: (support: boolean) => void;\n updateRecordingVideoParticipantsFullRoomSupport: (support: boolean) => void;\n updateRecordingPreferredOrientation: (orientation: string) => void;\n updateRecordingSupportForOtherOrientation: (support: boolean) => void;\n updateRecordingMultiFormatsSupport: (support: boolean) => void;\n updateRecordingVideoOptions: (options: string) => void;\n updateRecordingAudioOptions: (options: string) => void;\n}\n\nexport type UpdateRoomParametersClientOptions = {\n parameters: UpdateRoomParametersClientParameters;\n};\n\nexport type UpdateRoomParametersClientType = (options: UpdateRoomParametersClientOptions) => void;\n\nexport const updateRoomParametersClient = ({ parameters }: UpdateRoomParametersClientOptions): void => {\n try {\n const {\n screenPageLimit,\n shareScreenStarted,\n shared,\n hParams = host_Params,\n vParams = video_Params,\n frameRate,\n islevel,\n showAlert,\n data,\n updateRtpCapabilities,\n updateRoomRecvIPs,\n updateMeetingRoomParams,\n updateItemPageLimit,\n updateAudioOnlyRoom,\n updateScreenPageLimit,\n updateVidCons,\n updateFrameRate,\n updateAdminPasscode,\n updateEventType,\n updateYouAreCoHost,\n updateAutoWave,\n updateForceFullDisplay,\n updateChatSetting,\n updateMeetingDisplayType,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateHParams,\n updateVParams,\n updateScreenParams,\n updateAParams,\n updateTargetResolution,\n updateTargetResolutionHost,\n updateRecordingAudioPausesLimit,\n updateRecordingAudioPausesCount,\n updateRecordingAudioSupport,\n updateRecordingAudioPeopleLimit,\n updateRecordingAudioParticipantsTimeLimit,\n updateRecordingVideoPausesCount,\n updateRecordingVideoPausesLimit,\n updateRecordingVideoSupport,\n updateRecordingVideoPeopleLimit,\n updateRecordingVideoParticipantsTimeLimit,\n updateRecordingAllParticipantsSupport,\n updateRecordingVideoParticipantsSupport,\n updateRecordingAllParticipantsFullRoomSupport,\n updateRecordingVideoParticipantsFullRoomSupport,\n updateRecordingPreferredOrientation,\n updateRecordingSupportForOtherOrientation,\n updateRecordingMultiFormatsSupport,\n updateRecordingVideoOptions,\n updateRecordingAudioOptions,\n updateMainHeightWidth,\n } = parameters;\n\n if (data.rtpCapabilities == null) {\n const reason = data.reason || '';\n showAlert?.({\n message: `Sorry, you are not allowed to join this room. ${reason}`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n updateRtpCapabilities(data.rtpCapabilities);\n updateAdminPasscode(data.secureCode);\n updateRoomRecvIPs(data.roomRecvIPs);\n updateMeetingRoomParams(data.meetingRoomParams);\n\n updateRecordingAudioPausesLimit(data.recordingParams.recordingAudioPausesLimit);\n updateRecordingAudioPausesCount(data.recordingParams.recordingAudioPausesCount!);\n updateRecordingAudioSupport(data.recordingParams.recordingAudioSupport);\n updateRecordingAudioPeopleLimit(data.recordingParams.recordingAudioPeopleLimit);\n updateRecordingAudioParticipantsTimeLimit(data.recordingParams.recordingAudioParticipantsTimeLimit);\n updateRecordingVideoPausesCount(data.recordingParams.recordingVideoPausesCount!);\n updateRecordingVideoPausesLimit(data.recordingParams.recordingVideoPausesLimit);\n updateRecordingVideoSupport(data.recordingParams.recordingVideoSupport);\n updateRecordingVideoPeopleLimit(data.recordingParams.recordingVideoPeopleLimit);\n updateRecordingVideoParticipantsTimeLimit(data.recordingParams.recordingVideoParticipantsTimeLimit);\n updateRecordingAllParticipantsSupport(data.recordingParams.recordingAllParticipantsSupport);\n updateRecordingVideoParticipantsSupport(data.recordingParams.recordingVideoParticipantsSupport);\n updateRecordingAllParticipantsFullRoomSupport(data.recordingParams.recordingAllParticipantsFullRoomSupport);\n updateRecordingVideoParticipantsFullRoomSupport(data.recordingParams.recordingVideoParticipantsFullRoomSupport);\n updateRecordingPreferredOrientation(data.recordingParams.recordingPreferredOrientation);\n updateRecordingSupportForOtherOrientation(data.recordingParams.recordingSupportForOtherOrientation);\n updateRecordingMultiFormatsSupport(data.recordingParams.recordingMultiFormatsSupport);\n\n updateItemPageLimit(data.meetingRoomParams.itemPageLimit);\n updateEventType(data.meetingRoomParams.type);\n\n if (data.meetingRoomParams.type == 'chat' && islevel != '2') {\n updateYouAreCoHost(true);\n }\n\n if (['chat', 'broadcast'].includes(data.meetingRoomParams.type)) {\n updateAutoWave(false);\n updateMeetingDisplayType('all');\n updateForceFullDisplay(true);\n updateChatSetting('allow');\n updateItemPageLimit(2);\n\n if (['broadcast'].includes(data.meetingRoomParams.type)) {\n updateRecordingVideoOptions('mainScreen');\n updateRecordingAudioOptions('host');\n updateItemPageLimit(1);\n }\n }\n\n updateAudioSetting(data.meetingRoomParams.audioSetting);\n updateVideoSetting(data.meetingRoomParams.videoSetting);\n updateScreenshareSetting(data.meetingRoomParams.screenshareSetting);\n updateChatSetting(data.meetingRoomParams.chatSetting);\n\n updateAudioOnlyRoom(data.meetingRoomParams.mediaType != 'video');\n\n if (data.meetingRoomParams.type == 'conference' && (shared || shareScreenStarted)) {\n updateMainHeightWidth(100);\n } else {\n updateMainHeightWidth(0);\n }\n\n updateScreenPageLimit(Math.min(data.meetingRoomParams.itemPageLimit, screenPageLimit));\n\n const targetOrientation = islevel == '2'\n ? data.meetingRoomParams.targetOrientationHost\n : data.meetingRoomParams.targetOrientation;\n const targetResolution = islevel == '2'\n ? data.meetingRoomParams.targetResolutionHost\n : data.meetingRoomParams.targetResolution;\n\n let vidCons: VidCons;\n if (targetOrientation == 'landscape') {\n vidCons = targetResolution == 'hd'\n ? hdCons\n : targetResolution == 'fhd'\n ? fhdCons\n : targetResolution == 'qhd'\n ? qhdCons\n : targetResolution == 'sd'\n ? sdCons\n : QnHDCons;\n } else if (targetOrientation == 'neutral') {\n vidCons = targetResolution == 'hd'\n ? hdConsNeu\n : targetResolution == 'fhd'\n ? fhdConsNeu\n : targetResolution == 'qhd'\n ? qhdConsNeu\n : targetResolution == 'sd'\n ? sdConsNeu\n : QnHDConsNeu;\n } else {\n vidCons = targetResolution == 'hd'\n ? hdConsPort\n : targetResolution == 'fhd'\n ? fhdConsPort\n : targetResolution == 'qhd'\n ? qhdConsPort\n : targetResolution == 'sd'\n ? sdConsPort\n : QnHDConsPort;\n }\n\n let frameRateValue = frameRate || 10;\n let vParamsValue = { ...vParams };\n let hParamsValue = { ...hParams };\n\n if (Object.keys(vParamsValue).length == 0) {\n vParamsValue = { ...video_Params };\n }\n\n if (Object.keys(hParamsValue).length == 0) {\n hParamsValue = { ...host_Params };\n }\n\n if (targetResolution == 'hd') {\n frameRateValue = hdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 4);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 4);\n }\n });\n } else if (targetResolution == 'QnHD') {\n frameRateValue = QnHDFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 0.25);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 0.25);\n }\n });\n\n if (hParamsValue.codecOptions && hParamsValue.codecOptions.videoGoogleStartBitrate) {\n hParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(hParamsValue.codecOptions.videoGoogleStartBitrate * 0.25);\n }\n if (vParamsValue.codecOptions && vParamsValue.codecOptions.videoGoogleStartBitrate) {\n vParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(vParamsValue.codecOptions.videoGoogleStartBitrate * 0.25);\n }\n } else if (targetResolution == 'fhd') {\n frameRateValue = fhdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 8);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 8);\n }\n });\n } else if (targetResolution == 'qhd') {\n frameRateValue = qhdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 16);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 16);\n }\n });\n }\n\n if (data.recordingParams.recordingVideoSupport) {\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 1.2);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 1.2);\n }\n });\n\n if (hParamsValue.codecOptions && hParamsValue.codecOptions.videoGoogleStartBitrate) {\n hParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(hParamsValue.codecOptions.videoGoogleStartBitrate * 1.2);\n }\n if (vParamsValue.codecOptions && vParamsValue.codecOptions.videoGoogleStartBitrate) {\n vParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(vParamsValue.codecOptions.videoGoogleStartBitrate * 1.2);\n }\n }\n\n updateVidCons(vidCons);\n updateFrameRate(frameRateValue);\n updateHParams(hParamsValue);\n updateVParams(vParamsValue);\n updateScreenParams(screen_Params);\n updateAParams(audio_Params);\n updateTargetResolution(data.meetingRoomParams.targetResolution);\n updateTargetResolutionHost(data.meetingRoomParams.targetResolutionHost);\n } catch (error) {\n console.log('updateRoomParametersClient error', error);\n parameters.showAlert?.({\n message: (error as Error).message,\n type: 'danger',\n duration: 3000,\n });\n }\n};\n","const DEFAULT_MEDIA_SFU_ROOM_API_URL = 'https://mediasfu.com/v1/rooms/';\r\n\r\ntype MediaSFURoomApiAction = 'createRoom' | 'joinRoom';\r\n\r\nexport const resolveMediaSFURoomApi = (\r\n localLink: string | undefined,\r\n action: MediaSFURoomApiAction,\r\n): string => {\r\n const normalizedLink = localLink?.trim();\r\n\r\n if (!normalizedLink || normalizedLink.includes('mediasfu.com')) {\r\n return DEFAULT_MEDIA_SFU_ROOM_API_URL;\r\n }\r\n\r\n return `${normalizedLink.replace(/\\/$/, '')}/${action}`;\r\n};","import type { CreateMediaSFURoomOptions, JoinMediaSFURoomOptions } from '../../types/types';\nimport { resolveMediaSFURoomApi } from './resolveMediaSFURoomApi';\n\nexport type CreateJoinRoomType = (options: {\n payload: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n localLink?: string;\n}) => Promise<{\n data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n success: boolean;\n}>;\n\nexport interface CreateJoinRoomResponse {\n message: string;\n roomName: string;\n secureCode?: string;\n publicURL: string;\n link: string;\n secret: string;\n success: boolean;\n}\n\nexport interface CreateJoinRoomError {\n error: string;\n success?: boolean;\n}\n\nexport type JoinRoomOnMediaSFUType = (options: {\n payload: JoinMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n localLink?: string;\n}) => Promise<{\n data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n success: boolean;\n}>;\n\nconst readResponseError = async (response: Response): Promise<string> => {\n const fallbackMessage = `HTTP error! Status: ${response.status}`;\n\n try {\n const responseText = await response.text();\n\n if (!responseText) {\n return fallbackMessage;\n }\n\n const parsedResponse = JSON.parse(responseText) as { error?: string; message?: string };\n return parsedResponse.error || parsedResponse.message || responseText;\n } catch {\n return fallbackMessage;\n }\n};\n\n/**\n * Calls the MediaSFU join-room API and returns a normalized success/error result.\n *\n * This helper supports both cloud and self-hosted deployments through the\n * optional `localLink` override.\n *\n * @param options API request options including credentials and join payload.\n * @returns A result object containing either parsed response data or an error payload.\n *\n * @example\n * ```typescript\n * const result = await joinRoomOnMediaSFU({\n * payload: { action: 'join', meetingID: 'room123', userName: 'Ada' },\n * apiUserName: 'sampleuser',\n * apiKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n * });\n *\n * if (result.success) {\n * console.log(result.data?.roomName);\n * }\n * ```\n */\nexport const joinRoomOnMediaSFU: CreateJoinRoomType = async ({\n payload,\n apiUserName,\n apiKey,\n localLink = '',\n}) => {\n try {\n if (\n !apiUserName ||\n !apiKey ||\n apiUserName === 'yourAPIUSERNAME' ||\n apiKey === 'yourAPIKEY' ||\n apiKey.length !== 64 ||\n apiUserName.length < 6\n ) {\n return { data: { error: 'Invalid credentials' }, success: false };\n }\n\n const finalLink = resolveMediaSFURoomApi(localLink, 'joinRoom');\n\n const response = await fetch(finalLink, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiUserName}:${apiKey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(await readResponseError(response));\n }\n\n const data = await response.json();\n return { data, success: true };\n } catch (error) {\n const errorMessage = (\n error as { reason?: string; message?: string }\n ).reason || (\n error as { reason?: string; message?: string }\n ).message || 'unknown error';\n return {\n data: { error: `Unable to join room, ${errorMessage}` },\n success: false,\n };\n }\n};","import { Socket } from 'socket.io-client';\nimport {\n JoinMediaSFURoomOptions,\n PreJoinPageParameters,\n ResponseJoinLocalRoom,\n} from '../../types/shared-base-types';\nimport { validateAlphanumeric } from '../../methods/utils/validateAlphanumeric';\nimport { joinRoomOnMediaSFU, JoinRoomOnMediaSFUType } from '../../methods/utils/joinRoomOnMediaSFU';\nimport { checkLimitsAndMakeRequest } from '../../methods/utils/checkLimitsAndMakeRequest';\n\nexport interface JoinLocalRoomOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n parameters: PreJoinPageParameters;\n checkConnect?: boolean;\n joinMediaSFURoom?: JoinRoomOnMediaSFUType;\n localLink?: string;\n}\n\nexport type JoinLocalRoomType = (\n options: JoinLocalRoomOptions,\n) => Promise<ResponseJoinLocalRoom>;\n\nexport interface CheckMediasfuURLOptions {\n data: ResponseJoinLocalRoom;\n member: string;\n roomName: string;\n islevel: string;\n socket: Socket;\n parameters: PreJoinPageParameters;\n joinMediaSFURoom?: JoinRoomOnMediaSFUType;\n localLink?: string;\n}\n\nexport type CheckMediasfuURLType = (options: CheckMediasfuURLOptions) => Promise<void>;\n\nexport async function checkMediasfuURL({\n data,\n member,\n roomName,\n islevel,\n socket,\n parameters,\n joinMediaSFURoom = joinRoomOnMediaSFU,\n localLink = '',\n}: CheckMediasfuURLOptions): Promise<void> {\n if (\n data.mediasfuURL\n && data.mediasfuURL !== ''\n && data.mediasfuURL.length > 10\n ) {\n let link;\n let secretCode;\n\n try {\n const splitTexts = ['/meet/', '/chat/', '/broadcast/'];\n const splitText = splitTexts.find((text) => data.mediasfuURL.includes(text)) || '/meet/';\n\n const urlParts = data.mediasfuURL.split(splitText);\n link = urlParts[0];\n secretCode = urlParts[1].split('/')[1];\n } catch {\n link = data.mediasfuURL;\n return;\n }\n\n await checkLimitsAndMakeRequest({\n apiUserName: roomName,\n apiToken: secretCode,\n link,\n apiKey: '',\n userName: member,\n parameters,\n validate: false,\n });\n\n return;\n }\n\n if (\n (!data.mediasfuURL || data.mediasfuURL.length < 10)\n && islevel !== '2'\n && data.allowRecord\n && (data.allowRecord === true || data.allowRecord === 'true')\n && data.apiKey\n && data.apiKey.length === 64\n && data.apiUserName\n && data.apiUserName.length > 5\n && (roomName.startsWith('s') || roomName.startsWith('p'))\n ) {\n const payload: JoinMediaSFURoomOptions = {\n action: 'join',\n meetingID: roomName,\n userName: member,\n };\n\n const response = await joinMediaSFURoom({\n payload,\n apiKey: data.apiKey,\n apiUserName: data.apiUserName,\n localLink,\n });\n\n if (response.success && response.data && 'roomName' in response.data) {\n try {\n socket.emit(\n 'updateMediasfuURL',\n { eventID: roomName, mediasfuURL: response.data.publicURL },\n async () => {},\n );\n } catch {\n // Do nothing\n }\n\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response.data.link,\n userName: member,\n parameters,\n validate: false,\n });\n parameters.updateApiToken(response.data.secret);\n }\n }\n}\n\nexport async function joinLocalRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n parameters,\n checkConnect = false,\n joinMediaSFURoom = joinRoomOnMediaSFU,\n localLink = '',\n}: JoinLocalRoomOptions): Promise<ResponseJoinLocalRoom> {\n return new Promise((resolve, reject) => {\n if (!(sec && roomName && islevel && apiUserName && member)) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Missing required parameters',\n };\n reject(validationError);\n return;\n }\n\n try {\n validateAlphanumeric({ str: roomName });\n validateAlphanumeric({ str: apiUserName });\n validateAlphanumeric({ str: member });\n } catch {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or apiUserName or member',\n };\n reject(validationError);\n return;\n }\n\n if (!(roomName.startsWith('s') || roomName.startsWith('p') || roomName.startsWith('m') || roomName.startsWith('d'))) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName, must start with s or p or m or d',\n };\n reject(validationError);\n return;\n }\n\n if (\n !(\n sec.length === 32\n && roomName.length >= 8\n && islevel.length === 1\n && apiUserName.length >= 6\n && (islevel === '0' || islevel === '1' || islevel === '2')\n )\n ) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or islevel or apiUserName or secret',\n };\n reject(validationError);\n return;\n }\n\n socket.emit(\n 'joinRoom',\n { roomName, islevel, member, sec, apiUserName },\n async (data: ResponseJoinLocalRoom) => {\n try {\n if (data.rtpCapabilities === null) {\n if (data.isBanned) {\n throw new Error('User is banned.');\n }\n if (data.hostNotJoined) {\n throw new Error('Host has not joined the room yet.');\n }\n\n resolve(data);\n } else {\n if (checkConnect) {\n await checkMediasfuURL({\n data,\n member,\n roomName,\n islevel,\n socket,\n parameters,\n joinMediaSFURoom,\n localLink,\n });\n } else if (data.mediasfuURL && data.mediasfuURL !== '' && data.mediasfuURL.length > 10) {\n const splitTexts = ['/meet/', '/chat/', '/broadcast/'];\n const splitText = splitTexts.find((text) => data.mediasfuURL.includes(text)) || '/meet/';\n const urlParts = data.mediasfuURL.split(splitText);\n const secretCode = urlParts[1].split('/')[1];\n parameters.updateApiToken(secretCode);\n }\n\n resolve(data);\n }\n } catch (error) {\n console.log('Error joining room:', error);\n reject(error);\n }\n },\n );\n });\n}","import { EventType } from '../types/types';\n\nexport interface AutoAdjustOptions {\n n: number;\n eventType: EventType;\n shareScreenStarted: boolean;\n shared: boolean; \n}\n\nexport type AutoAdjustType = (options: AutoAdjustOptions) => Promise<number[]>;\n\n\n/**\n * Adjusts values based on the provided options and the number of participants.\n *\n * @function\n * @async\n * @param {AutoAdjustOptions} options - The options for auto adjustment.\n * @param {number} options.n - The number of participants.\n * @param {string} options.eventType - The type of event (e.g., 'broadcast', 'chat', 'conference').\n * @param {boolean} options.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.shared - Indicates if something is shared.\n * \n * @returns {Promise<number[]>} A promise that resolves to an array containing the adjusted values.\n * \n * @example\n * import { autoAdjust } from 'mediasfu-reactjs';\n *\n * const options = {\n * n: 10,\n * eventType: 'conference',\n * shareScreenStarted: false,\n * shared: false,\n * };\n * \n * autoAdjust(options)\n * .then(values => {\n * console.log('Adjusted values:', values);\n * })\n * .catch(error => {\n * console.error('Error adjusting values:', error);\n * });\n */\n\nexport async function autoAdjust({\n n,\n eventType, shareScreenStarted, shared\n}: AutoAdjustOptions): Promise<number[]> {\n\n // Default values\n let val1 = 6;\n let val2 = 12 - val1;\n\n // Adjust values based on eventType and other conditions\n if (eventType === 'broadcast') {\n val1 = 0;\n val2 = 12 - val1;\n } else if (\n eventType === 'chat' ||\n (eventType === 'conference' && !(shareScreenStarted || shared))\n ) {\n val1 = 12;\n val2 = 12 - val1;\n } else {\n if (shareScreenStarted || shared) {\n val2 = 10;\n val1 = 12 - val2;\n } else {\n // Adjust values based on the number of participants (n)\n if (n === 0) {\n val1 = 1;\n val2 = 12 - val1;\n } else if (n >= 1 && n < 4) {\n val1 = 4;\n val2 = 12 - val1;\n } else if (n >= 4 && n < 6) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 6 && n < 9) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 9 && n < 12) {\n val1 = 6;\n val2 = 12 - val1;\n } else if (n >= 12 && n < 20) {\n val1 = 8;\n val2 = 12 - val1;\n } else if (n >= 20 && n < 50) {\n val1 = 8;\n val2 = 12 - val1;\n } else {\n val1 = 10;\n val2 = 12 - val1;\n }\n }\n }\n\n // Return an array with adjusted values\n return [val1, val2];\n}\n","export interface CalculateRowsAndColumnsOptions {\n n: number;\n}\n\n// Export the type definition for the function\nexport type CalculateRowsAndColumnsType = (options: CalculateRowsAndColumnsOptions) => [number, number];\n\n/**\n * Calculates the number of rows and columns needed to display a given number of items in a grid.\n *\n * @function\n * @param {CalculateRowsAndColumnsOptions} options - The options for calculating rows and columns.\n * @param {number} options.n - The number of items to display.\n * @returns {[number, number]} A tuple containing the number of rows and columns.\n * \n * @example\n * import { calculateRowsAndColumns } from 'mediasfu-reactjs';\n *\n * const options = {\n * n: 10,\n * };\n * \n * const [rows, cols] = calculateRowsAndColumns(options);\n * console.log(`Rows: ${rows}, Columns: ${cols}`); // Outputs: Rows: 4, Columns: 3\n */\nexport function calculateRowsAndColumns({ n }: CalculateRowsAndColumnsOptions): [number, number] {\n // Calculate the square root of n\n const sqrt = Math.sqrt(n);\n\n // Initialize columns based on the floor of the square root\n let cols = Math.floor(sqrt);\n\n // Calculate the number of rows needed to display n videos\n let rows = Math.ceil(n / cols);\n\n // Calculate the product of rows and columns\n let prod = rows * cols;\n\n // Adjust rows and columns until the product is greater than or equal to n\n while (prod < n) {\n if (cols < rows) {\n cols++;\n } else {\n rows++;\n }\n prod = rows * cols;\n }\n\n // Return an array with the calculated number of rows and columns\n return [rows, cols];\n}\n","export interface CheckGridOptions {\n rows: number;\n cols: number;\n actives: number;\n}\n\nexport type CheckGridType = (options: CheckGridOptions) => Promise<[boolean, number, number, number, number, number, number] | void>;\n\n/**\n * Checks the grid configuration and calculates various parameters based on the number of rows, columns, and active elements.\n *\n * @param {CheckGridOptions} options - The options for checking the grid.\n * @param {number} options.rows - The number of rows in the grid.\n * @param {number} options.cols - The number of columns in the grid.\n * @param {number} options.actives - The number of active elements in the grid.\n * @returns {Promise<[boolean, number, number, number, number, number, number] | void>} A promise that resolves to a tuple containing:\n * - `removeAltGrid` (boolean): Indicates whether to remove the alternate grid.\n * - `numtoadd` (number): The number of elements to add.\n * - `numRows` (number): The number of rows.\n * - `numCols` (number): The number of columns.\n * - `remainingVideos` (number): The number of remaining videos.\n * - `actualRows` (number): The actual number of rows.\n * - `lastrowcols` (number): The number of columns in the last row.\n * \n * If an error occurs, it logs the error to the console.\n *\n * @example\n * const options = {\n * rows: 3,\n * cols: 4,\n * actives: 10,\n * };\n * \n * checkGrid(options)\n * .then(result => {\n * console.log('Grid check result:', result);\n * // Example output: [true, 2, 3, 4, 2, 3, 4]\n * })\n * .catch(error => {\n * console.error('Error checking grid:', error);\n * });\n */\n\nexport async function checkGrid({ rows, cols, actives }: CheckGridOptions): Promise<[boolean, number, number, number, number, number, number] | void> {\n try {\n let numRows = 0;\n let numCols = 0;\n let lastrow = 0;\n let lastrowcols = 0;\n let remainingVideos = 0;\n let numtoadd = 0;\n let actualRows = 0;\n let removeAltGrid = false;\n\n if (rows * cols !== actives) {\n if (rows * cols > actives) {\n const res = actives - (rows - 1) * cols;\n if (cols * 0.5 < res) {\n lastrow = rows;\n lastrowcols = res;\n remainingVideos = lastrowcols;\n } else {\n lastrowcols = res + cols;\n lastrow = rows - 1;\n remainingVideos = lastrowcols;\n }\n\n numRows = lastrow - 1;\n numCols = cols;\n numtoadd = (lastrow - 1) * numCols;\n actualRows = lastrow;\n\n removeAltGrid = false;\n }\n } else {\n // Perfect fit\n numCols = cols;\n numRows = rows;\n lastrow = rows;\n lastrowcols = cols;\n remainingVideos = 0;\n numtoadd = lastrow * numCols;\n actualRows = lastrow;\n removeAltGrid = true;\n }\n\n return [\n removeAltGrid,\n numtoadd,\n numRows,\n numCols,\n remainingVideos,\n actualRows,\n lastrowcols,\n ];\n } catch (error) {\n console.log(\"checkGrid error\", error);\n // throw error;\n }\n}\n","import { PermissionConfig } from '../methods/permissions/updatePermissionConfig';\n\nexport interface CheckPermissionOptions {\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n permissionType: 'audioSetting' | 'videoSetting' | 'screenshareSetting' | 'chatSetting';\n permissionConfig?: PermissionConfig | null;\n participantLevel?: string;\n}\n\n// Export the type definition for the function\nexport type CheckPermissionType = (options: CheckPermissionOptions) => Promise<number>;\n\n/**\n * Checks the permission based on the provided settings.\n *\n * @param {CheckPermissionOptions} options - The options for checking permissions.\n * @param {string} options.permissionType - The type of permission to check. Can be \"audioSetting\", \"videoSetting\", \"screenshareSetting\", or \"chatSetting\".\n * @param {string} options.audioSetting - The setting for audio permission. Can be \"allow\", \"approval\", or other.\n * @param {string} options.videoSetting - The setting for video permission. Can be \"allow\", \"approval\", or other.\n * @param {string} options.screenshareSetting - The setting for screenshare permission. Can be \"allow\", \"approval\", or other.\n * @param {string} options.chatSetting - The setting for chat permission. Can be \"allow\", \"approval\", or other.\n * @returns {Promise<number>} - Returns 0 if the setting is \"allow\", 1 if the setting is \"approval\", and 2 for other settings or invalid permission types.\n * @throws Will throw an error if an unexpected error occurs during the permission check.\n *\n * @example\n * const options = {\n * permissionType: 'audioSetting',\n * audioSetting: 'allow',\n * videoSetting: 'approval',\n * screenshareSetting: 'approval',\n * chatSetting: 'allow',\n * };\n * \n * checkPermission(options)\n * .then(result => {\n * console.log('Permission result:', result);\n * })\n * .catch(error => {\n * console.error('Error checking permission:', error);\n * });\n */\n\nexport async function checkPermission({\n permissionType,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n permissionConfig,\n participantLevel,\n}: CheckPermissionOptions) {\n try {\n\n const permissionTypeToCapability: Record<string, keyof import('../methods/permissions/updatePermissionConfig').PermissionCapabilities> = {\n audioSetting: 'useMic',\n videoSetting: 'useCamera',\n screenshareSetting: 'useScreen',\n chatSetting: 'useChat',\n };\n\n if (permissionConfig && participantLevel && participantLevel !== '2') {\n const levelKey = `level${participantLevel}` as 'level0' | 'level1';\n const levelConfig = permissionConfig[levelKey];\n\n if (levelConfig) {\n const capability = permissionTypeToCapability[permissionType];\n if (capability) {\n const configValue = levelConfig[capability];\n if (configValue === 'allow') return 0;\n if (configValue === 'approval') return 1;\n return 2;\n }\n }\n }\n\n // PermissionType is audioSetting, videoSetting, screenshareSetting, chatSetting\n // Perform a switch case to check for the permissionType and return the response\n switch (permissionType) {\n case \"audioSetting\":\n if (audioSetting === \"allow\") {\n return 0;\n } else if (audioSetting === \"approval\") {\n return 1;\n } else {\n return 2;\n }\n case \"videoSetting\":\n if (videoSetting === \"allow\") {\n return 0;\n } else if (videoSetting === \"approval\") {\n return 1;\n } else {\n return 2;\n }\n case \"screenshareSetting\":\n if (screenshareSetting === \"allow\") {\n return 0;\n } else if (screenshareSetting === \"approval\") {\n return 1;\n } else {\n return 2;\n }\n case \"chatSetting\":\n if (chatSetting === \"allow\") {\n return 0;\n } else if (chatSetting === \"approval\") {\n return 1;\n } else {\n return 2;\n }\n default:\n // throw new Error(`Invalid permissionType: ${permissionType}`);\n return 2;\n }\n } catch {\n // console.log('checkPermission error', error);\n // throw error;\n return 2;\n }\n}\n"," \nimport { Socket } from \"socket.io-client\";\nimport { CoHostResponsibility, Participant, ShowAlert } from \"../types/types\";\n\nexport interface ControlMediaOptions {\n participantId: string;\n participantName: string;\n type: 'audio' | 'video' | 'screenshare' | 'all';\n socket: Socket;\n coHostResponsibility: CoHostResponsibility[];\n participants: Participant[];\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n coHost: string;\n roomName: string;\n}\n// Export the type definition for the function\nexport type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;\n\n/**\n * Controls the media of a participant in a media session if certain conditions are met.\n *\n * @param {ControlMediaOptions} options - The options for controlling media.\n * @param {string} options.participantId - The ID of the participant to control.\n * @param {string} options.participantName - The name of the participant to control.\n * @param {'audio' | 'video' | 'screenshare' | 'all'} options.type - The type of media to control.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {Array<CoHostResponsibility>} options.coHostResponsibility - List of co-host responsibilities.\n * @param {Array<Participant>} options.participants - List of participants in the session.\n * @param {string} options.member - The current member attempting to control media.\n * @param {string} options.islevel - The level of the current member.\n * @param {Function} [options.showAlert] - Optional function to show alerts.\n * @param {string} options.coHost - The co-host information.\n * @param {string} options.roomName - The name of the room.\n *\n * @returns {Promise<void>} A promise that resolves when the media control operation is complete.\n *\n * @throws Will log an error message if there are issues controlling the media or if participant is not found.\n *\n * @example\n * const options = {\n * participantId: '1234',\n * participantName: 'John Doe',\n * type: 'audio',\n * socket: socketInstance,\n * coHostResponsibility: [{ name: 'media', value: true }],\n * participants: participantList,\n * member: 'Admin',\n * islevel: '1',\n * showAlert: (alert) => console.log(alert.message),\n * coHost: 'CoHostName',\n * roomName: 'Room 1',\n * };\n * \n * controlMedia(options)\n * .then(() => {\n * console.log('Media control operation completed successfully.');\n * })\n * .catch((error) => {\n * console.error('Error controlling media:', error);\n * });\n */\n\nexport async function controlMedia({\n participantId,\n participantName,\n type,\n socket,\n coHostResponsibility,\n participants,\n member,\n islevel,\n showAlert,\n coHost,\n roomName,\n}: ControlMediaOptions): Promise<void> {\n try {\n let mediaValue = false;\n\n try {\n mediaValue = coHostResponsibility.find((item) => item.name === \"media\")?.value ?? false;\n } catch (error) {\n console.log(\"Error retrieving media control value\", error);\n }\n\n const participant = participants.find((obj) => obj.name === participantName);\n\n if (!participant) {\n console.log(\"Participant not found\");\n return;\n }\n\n if (islevel === \"2\" || (coHost === member && mediaValue === true)) {\n if (\n (!participant.muted && participant.islevel !== \"2\" && type === \"audio\") ||\n (participant.islevel !== \"2\" && type === \"video\" && participant.videoOn)\n ) {\n socket.emit(\"controlMedia\", {\n participantId,\n participantName,\n type,\n roomName,\n });\n }\n } else {\n if (showAlert) {\n showAlert({\n message: \"You are not allowed to control media for other participants.\",\n type: \"danger\",\n duration: 3000,\n });\n }\n }\n } catch (error) {\n console.log(\"controlMedia error\", error);\n }\n}\n","import { CalculateRowsAndColumnsType, EventType } from \"../types/types\";\n\nexport interface GetEstimateParameters {\n fixedPageLimit: number;\n screenPageLimit: number;\n shareScreenStarted: boolean;\n shared?: boolean;\n eventType: EventType;\n removeAltGrid: boolean;\n isWideScreen: boolean;\n isMediumScreen: boolean;\n updateRemoveAltGrid: (value: boolean) => void;\n\n // mediaSfu functions\n calculateRowsAndColumns: CalculateRowsAndColumnsType;\n\n [key: string]: any;\n}\n\nexport interface GetEstimateOptions {\n n: number;\n parameters: GetEstimateParameters;\n}\n\n// Export the type definition for the function\nexport type GetEstimateType = (options: GetEstimateOptions) => [number, number, number];\n\n/**\n * Estimates the number of rows and columns for a given set of parameters.\n *\n * @param {GetEstimateOptions} options - The options for the estimation.\n * @param {number} options.n - The number of items to estimate for.\n * @param {GetEstimateParameters} options.parameters - The parameters for the estimation.\n * @param {number} options.parameters.fixedPageLimit - The fixed page limit.\n * @param {number} options.parameters.screenPageLimit - The screen page limit.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} [options.parameters.shared] - Indicates if sharing is active.\n * @param {string} options.parameters.eventType - The type of event (e.g., \"chat\", \"conference\").\n * @param {boolean} options.parameters.removeAltGrid - Indicates if the alternate grid should be removed.\n * @param {boolean} options.parameters.isWideScreen - Indicates if the screen is wide.\n * @param {boolean} options.parameters.isMediumScreen - Indicates if the screen is medium-sized.\n * @param {Function} options.parameters.updateRemoveAltGrid - Function to update the removeAltGrid parameter.\n * @param {Function} options.parameters.calculateRowsAndColumns - Function to calculate rows and columns.\n *\n * @returns {[number, number, number]} An array containing the estimated number of items, rows, and columns.\n *\n * @throws Will log an error message if an error occurs during estimation.\n *\n * @example\n * const options = {\n * n: 10,\n * parameters: {\n * fixedPageLimit: 5,\n * screenPageLimit: 8,\n * shareScreenStarted: false,\n * shared: false,\n * eventType: 'conference',\n * removeAltGrid: false,\n * isWideScreen: true,\n * isMediumScreen: false,\n * updateRemoveAltGrid: (value) => console.log('Remove Alt Grid:', value),\n * calculateRowsAndColumns: ({ n }) => [3, 4], // Example implementation\n * },\n * };\n * \n * const estimate = getEstimate(options);\n * console.log('Estimated:', estimate); // Output: Estimated: [10, 3, 4]\n */\n\nexport function getEstimate({ n, parameters }: GetEstimateOptions): [number, number, number] {\n try {\n // Destructure parameters\n let {\n fixedPageLimit,\n screenPageLimit,\n shareScreenStarted,\n shared,\n eventType,\n removeAltGrid,\n isWideScreen,\n isMediumScreen,\n updateRemoveAltGrid,\n\n //mediaSfu functions\n calculateRowsAndColumns,\n } = parameters;\n\n // Calculate rows and columns\n const [rows, cols] = calculateRowsAndColumns({ n });\n\n // Check conditions for removing alt grid\n if (\n n < fixedPageLimit ||\n ((shareScreenStarted || shared) && n < screenPageLimit + 1)\n ) {\n removeAltGrid = true;\n updateRemoveAltGrid(removeAltGrid);\n\n // Return estimated values based on screen width\n if (!(isMediumScreen || isWideScreen)) {\n return eventType === \"chat\" ||\n (eventType === \"conference\" && !(shareScreenStarted || shared))\n ? [n, n, 1]\n : [n, 1, n];\n } else {\n return eventType === \"chat\" ||\n (eventType === \"conference\" && !(shareScreenStarted || shared))\n ? [n, 1, n]\n : [n, n, 1];\n }\n }\n\n return [rows * cols, rows, cols];\n } catch (error) {\n // Handle errors during estimation\n if (error instanceof Error) {\n console.log(\"Error estimating rows and columns:\", error.message);\n } else {\n console.log(\"Error estimating rows and columns:\", error);\n }\n return [0, 0, 0];\n // throw error;\n }\n}\n","import { Socket } from \"socket.io-client\";\nimport { SignalNewConsumerTransportParameters, SignalNewConsumerTransportType } from '../types/types';\n\ninterface TranslationMeta {\n speakerId: string;\n speakerName: string;\n language: string;\n originalProducerId?: string;\n isSpeakerControlled?: boolean;\n}\n\ninterface ProducerInfo {\n id: string;\n translationMeta?: TranslationMeta | null;\n}\n\nexport interface GetPipedProducersAltParameters extends Omit<SignalNewConsumerTransportParameters, 'getUpdatedAllParams'> {\n member: string;\n\n listenerTranslationPreferences?: {\n perSpeaker: Map<string, { speakerId: string; language: string | null; wantOriginal: boolean }>;\n globalLanguage: string | null;\n };\n\n // mediasfu functions\n signalNewConsumerTransport: SignalNewConsumerTransportType;\n startConsumingTranslation?: (\n producerId: string,\n speakerId: string,\n language: string,\n originalProducerId?: string,\n nsock?: Socket\n ) => Promise<void>;\n getUpdatedAllParams?: () => GetPipedProducersAltParameters;\n [key: string]: any;\n}\n\nexport interface GetPipedProducersAltOptions {\n community?: boolean;\n nsock: Socket;\n islevel: string;\n parameters: GetPipedProducersAltParameters;\n}\n\n// Export the type definition for the function\nexport type GetPipedProducersAltType = (options: GetPipedProducersAltOptions) => Promise<void>;\n\nconst shouldConsumeTranslationProducer = (\n translationMeta: TranslationMeta,\n listenerTranslationPreferences?: {\n perSpeaker: Map<string, { speakerId: string; language: string | null; wantOriginal: boolean }>;\n globalLanguage: string | null;\n }\n): boolean => {\n const normalizedLang = translationMeta.language?.toLowerCase();\n const speakerId = translationMeta.speakerId;\n const isSpeakerControlled = translationMeta.isSpeakerControlled === true;\n\n if (listenerTranslationPreferences) {\n const perSpeakerPref = listenerTranslationPreferences.perSpeaker?.get(speakerId);\n if (perSpeakerPref) {\n if (perSpeakerPref.wantOriginal) {\n return false;\n }\n if (perSpeakerPref.language) {\n return perSpeakerPref.language.toLowerCase() === normalizedLang;\n }\n }\n\n const globalPref = listenerTranslationPreferences.globalLanguage;\n if (globalPref) {\n return globalPref.toLowerCase() === normalizedLang;\n }\n }\n\n if (isSpeakerControlled) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Retrieves piped producers and signals new consumer transport for each retrieved producer.\n *\n * @param {GetPipedProducersAltOptions} options - The options for retrieving piped producers.\n * @param {boolean} options.community - A flag indicating if the room is a community edition room.\n * @param {Socket} options.nsock - The WebSocket instance used for communication.\n * @param {string} options.islevel - A flag indicating the level of the request.\n * @param {GetPipedProducersAltParameters} options.parameters - Additional parameters for the request.\n * @param {string} options.parameters.member - The member identifier.\n * @param {Function} options.parameters.signalNewConsumerTransport - A function to signal new consumer transport.\n *\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n *\n * @throws {Error} If an error occurs during the process of retrieving producers.\n *\n * @example\n * const options = {\n * community: false,\n * nsock: socketInstance,\n * islevel: '1',\n * parameters: {\n * member: 'memberId',\n * signalNewConsumerTransport: async ({ nsock, remoteProducerId, islevel, parameters }) => {\n * // Implementation for signaling new consumer transport\n * },\n * },\n * };\n *\n * getPipedProducersAlt(options)\n * .then(() => {\n * console.log('Successfully retrieved piped producers');\n * })\n * .catch((error) => {\n * console.error('Error retrieving piped producers:', error);\n * });\n */\n\nexport const getPipedProducersAlt = async ({\n community = false,\n nsock,\n islevel,\n parameters,\n}: GetPipedProducersAltOptions): Promise<void> => {\n try {\n const freshParams = parameters.getUpdatedAllParams ? parameters.getUpdatedAllParams() : parameters;\n\n const {\n member,\n signalNewConsumerTransport,\n startConsumingTranslation,\n listenerTranslationPreferences,\n } = freshParams;\n\n const emitName = community ? \"getProducersAlt\" : \"getProducersPipedAlt\";\n\n // Emit request to get piped producers using WebSocket\n await nsock.emit(\n emitName,\n { islevel, member },\n async (producers: (string | ProducerInfo)[]) => {\n // Check if producers are retrieved\n if (producers.length > 0) {\n for (const producer of producers) {\n let producerId: string;\n let translationMeta: TranslationMeta | null = null;\n\n if (typeof producer === 'string') {\n producerId = producer;\n } else {\n producerId = producer.id;\n translationMeta = producer.translationMeta || null;\n }\n\n if (translationMeta) {\n const shouldConsume = shouldConsumeTranslationProducer(\n translationMeta,\n listenerTranslationPreferences,\n );\n\n if (!shouldConsume) {\n continue;\n }\n\n if (startConsumingTranslation) {\n await startConsumingTranslation(\n producerId,\n translationMeta.speakerId,\n translationMeta.language,\n translationMeta.originalProducerId,\n nsock,\n );\n continue;\n }\n }\n\n await signalNewConsumerTransport({\n nsock,\n remoteProducerId: producerId,\n islevel,\n parameters: freshParams as unknown as SignalNewConsumerTransportParameters,\n });\n }\n }\n }\n );\n } catch (error) {\n // Handle errors during the process of retrieving producers\n console.log(\"Error getting piped producers:\", (error as Error).message);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport { SignalNewConsumerTransportParameters, SignalNewConsumerTransportType } from \"../types/types\";\nexport interface GetProducersPipedParameters extends SignalNewConsumerTransportParameters {\n member: string;\n\n // mediasfu functions\n signalNewConsumerTransport: SignalNewConsumerTransportType,\n [key: string]: any;\n}\n\nexport interface GetProducersPipedOptions {\n nsock: Socket;\n islevel: string;\n parameters: GetProducersPipedParameters;\n}\n\n// Export the type definition for the function\nexport type GetProducersPipedType = (options: GetProducersPipedOptions) => Promise<void>;\n\n/**\n * Retrieves piped producers and signals new consumer transport for each retrieved producer.\n *\n * @param {GetProducersPipedOptions} options - The options for getting piped producers.\n * @param {Socket} options.nsock - The WebSocket instance used for communication.\n * @param {string} options.islevel - A flag indicating the level of the operation.\n * @param {GetProducersPipedParameters} options.parameters - Additional parameters for the operation.\n * @param {string} options.parameters.member - The member identifier.\n * @param {Function} options.parameters.signalNewConsumerTransport - The function to signal new consumer transport.\n *\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n *\n * @throws {Error} If an error occurs during the process of retrieving producers.\n *\n * @example\n * const options = {\n * nsock: socketInstance,\n * islevel: '1',\n * parameters: {\n * member: 'memberId',\n * signalNewConsumerTransport: async ({ remoteProducerId, islevel, nsock, parameters }) => {\n * // Implementation for signaling new consumer transport\n * },\n * },\n * };\n *\n * getProducersPiped(options)\n * .then(() => {\n * console.log('Successfully retrieved piped producers');\n * })\n * .catch((error) => {\n * console.error('Error retrieving piped producers:', error);\n * });\n */\n\nexport const getProducersPiped = async ({\n nsock,\n islevel,\n parameters,\n}: GetProducersPipedOptions): Promise<void> => {\n try {\n // Destructure parameters\n const { member, signalNewConsumerTransport } = parameters;\n\n // Emit request to get piped producers using WebSocket\n await nsock.emit(\n \"getProducersPipedAlt\",\n { islevel, member },\n async (producerIds: string[]) => {\n // Check if producers are retrieved\n if (producerIds.length > 0) {\n // Signal new consumer transport for each retrieved producer\n await Promise.all(\n producerIds.map((id) =>\n signalNewConsumerTransport({\n remoteProducerId: id,\n islevel,\n nsock,\n parameters,\n })\n )\n );\n }\n }\n );\n } catch (error) {\n // Handle errors during the process of retrieving producers\n console.log(\"Error getting piped producers:\", (error as Error).message);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport { Message } from \"../types/types\";\nexport interface ReceiveRoomMessagesOptions {\n socket: Socket;\n roomName: string;\n updateMessages: (messages: Message[]) => void;\n}\n\n// Export the type definition for the function\nexport type ReceiveRoomMessagesType = (options: ReceiveRoomMessagesOptions) => Promise<void>;\n\n/**\n * Retrieves messages from a specified room and updates the message state.\n *\n * @param {ReceiveRoomMessagesOptions} options - The options for receiving room messages.\n * @param {Socket} options.socket - The socket instance used for communication.\n * @param {string} options.roomName - The name of the room from which to retrieve messages.\n * @param {Function} options.updateMessages - Function to update the state with retrieved messages.\n *\n * @returns {Promise<void>} A promise that resolves when the messages have been retrieved and updated.\n *\n * @throws Will log an error message if there is an issue retrieving the messages.\n *\n * @example\n * ```typescript\n * await receiveRoomMessages({\n * socket: socketInstance,\n * roomName: 'Room1',\n * updateMessages: (messages) => console.log(messages),\n * });\n * ```\n */\n\n\nexport async function receiveRoomMessages({ \n socket,\n roomName,\n updateMessages,\n}: ReceiveRoomMessagesOptions): Promise<void> {\n\n try {\n // Retrieve messages from the server\n socket.emit(\"getMessage\", { roomName }, async ({ messages_ }: { messages_: Message[]; }) => {\n updateMessages(messages_);\n });\n } catch (error) {\n // Handle errors if any\n if (error instanceof Error) {\n console.log(\"Error tuning messages:\", error.message);\n } else {\n console.log(\"Error tuning messages:\", error);\n }\n }\n}\n\n","import type { Producer } from 'mediasoup-client/lib/types';\nimport { PrepopulateUserMediaParameters, PrepopulateUserMediaType } from \"../types/types\";\n\nexport interface ResumeSendTransportAudioParameters extends PrepopulateUserMediaParameters {\n audioProducer: Producer | null;\n localAudioProducer?: Producer | null;\n islevel: string;\n hostLabel: string;\n lock_screen: boolean;\n shared: boolean;\n videoAlreadyOn: boolean;\n updateAudioProducer: (audioProducer: Producer | null) => void;\n updateLocalAudioProducer?: (localAudioProducer: Producer | null) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n // mediasfu functions\n prepopulateUserMedia: PrepopulateUserMediaType;\n prepopulateLocalUserMedia?: PrepopulateUserMediaType;\n [key: string]: any;\n}\n\nexport interface ResumeSendTransportAudioOptions {\n parameters: ResumeSendTransportAudioParameters;\n}\n\n// Export the type definition for the function\nexport type ResumeSendTransportAudioType = (options: ResumeSendTransportAudioOptions) => Promise<void>;\n\nconst resumeLocalSendTransportAudio = async ({\n parameters,\n}: ResumeSendTransportAudioOptions): Promise<void> => {\n try {\n const {\n localAudioProducer,\n updateLocalAudioProducer,\n } = parameters;\n\n // Resume local audio producer\n if (localAudioProducer) {\n localAudioProducer.resume();\n updateLocalAudioProducer?.(localAudioProducer);\n }\n } catch (error) {\n console.error(\"Error resuming local audio send transport:\", error);\n throw error; // Re-throw to propagate the error\n }\n};\n\n/**\n * Resumes the send transport for audio and updates the UI and audio producer state accordingly.\n *\n * This function supports both a primary and a local audio producer, delegating the local logic to a separate function.\n *\n * @param {ResumeSendTransportAudioOptions} options - The options for resuming the send transport.\n * @param {ResumeSendTransportAudioParameters} options.parameters - The parameters for resuming the send transport.\n * @param {Producer} options.parameters.audioProducer - The primary audio producer to resume.\n * @param {Producer} [options.parameters.localAudioProducer] - The local audio producer to resume.\n * @param {string} options.parameters.islevel - The level of the audio producer.\n * @param {string} options.parameters.hostLabel - The label for the host.\n * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.\n * @param {boolean} options.parameters.shared - Indicates if the screen is shared.\n * @param {boolean} options.parameters.videoAlreadyOn - Indicates if the video is already on.\n * @param {Function} options.parameters.updateAudioProducer - Function to update the audio producer state.\n * @param {Function} [options.parameters.updateLocalAudioProducer] - Function to update the local audio producer state.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n * @returns {Promise<void>} A promise that resolves when the send transport is resumed and the UI is updated.\n *\n * @throws {Error} Throws an error if there is an issue during the process of resuming the audio send transport.\n *\n * @example\n * ```typescript\n * await resumeSendTransportAudio({\n * parameters: {\n * audioProducer: producer,\n * localAudioProducer: localProducer,\n * islevel: '1',\n * hostLabel: 'Host',\n * lock_screen: false,\n * shared: false,\n * updateAudioProducer: updateProducerFunction,\n * updateLocalAudioProducer: updateLocalProducerFunction,\n * videoAlreadyOn: false,\n * updateUpdateMainWindow: updateWindowFunction,\n * prepopulateUserMedia: prepopulateFunction,\n * prepopulateLocalUserMedia: prepopulateLocalFunction,\n * },\n * });\n * ```\n */\n\nexport const resumeSendTransportAudio: ResumeSendTransportAudioType = async ({\n parameters,\n}: ResumeSendTransportAudioOptions): Promise<void> => {\n try {\n const {\n audioProducer,\n islevel,\n hostLabel,\n lock_screen,\n shared,\n updateAudioProducer,\n videoAlreadyOn,\n updateUpdateMainWindow,\n\n //mediasfu functions\n prepopulateUserMedia,\n } = parameters;\n\n // Resume send transport for audio\n audioProducer!.resume();\n\n // Update UI for primary producer\n if (!videoAlreadyOn && islevel === \"2\") {\n if (!lock_screen && !shared) {\n let updatedMainWindow = true;\n updateUpdateMainWindow(updatedMainWindow);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updatedMainWindow = false;\n updateUpdateMainWindow(updatedMainWindow);\n }\n }\n\n // Update audio producer state\n updateAudioProducer(audioProducer);\n\n // Attempt to handle local audio producer if primary fails\n try {\n await resumeLocalSendTransportAudio({ parameters });\n } catch (localError) {\n console.error(\n \"local audio send transport resuming failed:\",\n localError\n );\n }\n } catch (error: any) {\n // Handle errors during the process of resuming the audio send transport\n throw new Error(\n `Error during resuming audio send transport: ${error.message}`\n );\n\n }\n};\n","import { GridSizes, ComponentSizes, EventType } from \"../types/types\";\nexport interface UpdateMiniCardsGridParameters {\n updateGridRows: (rows: number) => void;\n updateGridCols: (cols: number) => void;\n updateAltGridRows: (rows: number) => void;\n updateAltGridCols: (cols: number) => void;\n updateGridSizes: (gridSizes: GridSizes) => void;\n gridSizes: GridSizes;\n paginationDirection: string;\n paginationHeightWidth: number;\n doPaginate: boolean;\n componentSizes: ComponentSizes;\n eventType: EventType;\n\n getUpdatedAllParams: () => UpdateMiniCardsGridParameters;\n [key: string]: any;\n}\n\nexport interface UpdateMiniCardsGridOptions {\n rows: number;\n cols: number;\n defal?: boolean;\n actualRows?: number;\n parameters: UpdateMiniCardsGridParameters;\n}\n\n// Export the type definition for the function\nexport type UpdateMiniCardsGridType = (options: UpdateMiniCardsGridOptions) => Promise<void>;\n\n/**\n * Updates the mini cards grid based on the specified rows and columns.\n *\n * @param {UpdateMiniCardsGridOptions} options - The function parameters.\n * @param {number} options.rows - The number of rows in the grid.\n * @param {number} options.cols - The number of columns in the grid.\n * @param {boolean} [options.defal] - Flag indicating whether to update the default grid or an alternative grid.\n * @param {number} [options.actualRows] - The actual number of rows in the grid.\n * @param {UpdateMiniCardsGridParameters} options.parameters - Additional parameters needed for the function.\n * @returns {Promise<void>} A promise that resolves when the mini cards grid is updated.\n *\n * @throws Will throw an error if the update operation fails.\n *\n * @example\n * ```typescript\n * const options = {\n * rows: 2,\n * cols: 3,\n * defal: true,\n * actualRows: 2,\n * parameters: {\n * updateGridRows: updateGridRowsFunction,\n * updateGridCols: updateGridColsFunction,\n * updateAltGridRows: updateAltGridRowsFunction,\n * updateAltGridCols: updateAltGridColsFunction,\n * updateGridSizes: updateGridSizesFunction,\n * gridSizes: { gridWidth: 100, gridHeight: 100 },\n * paginationDirection: 'horizontal',\n * paginationHeightWidth: 50,\n * doPaginate: true,\n * componentSizes: { otherWidth: 300, otherHeight: 200 },\n * eventType: 'chat',\n * getUpdatedAllParams: getUpdatedAllParamsFunction,\n * },\n * };\n * \n * await updateMiniCardsGrid(options);\n * ```\n */\n\n\nexport async function updateMiniCardsGrid({\n rows,\n cols,\n defal = true,\n actualRows = 2,\n parameters,\n}: UpdateMiniCardsGridOptions): Promise<void> {\n let { getUpdatedAllParams } = parameters;\n\n parameters = getUpdatedAllParams();\n\n let {\n updateGridRows,\n updateGridCols,\n updateAltGridRows,\n updateAltGridCols,\n updateGridSizes,\n\n gridSizes,\n paginationDirection,\n paginationHeightWidth,\n doPaginate,\n componentSizes,\n eventType,\n } = parameters;\n\n let containerWidth = componentSizes.otherWidth;\n let containerHeight = componentSizes.otherHeight;\n\n if (doPaginate) {\n // Adjust container size based on pagination\n if (paginationDirection === \"horizontal\") {\n containerHeight -= paginationHeightWidth;\n } else {\n containerWidth -= paginationHeightWidth;\n }\n }\n\n let cardSpacing = 3; // 3px margin between cards\n if (eventType === \"chat\") {\n cardSpacing = 0;\n }\n\n let totalSpacingHorizontal = (cols - 1) * cardSpacing;\n let totalSpacingVertical = (actualRows - 1) * cardSpacing;\n\n let cardWidth: number;\n let cardHeight: number;\n\n if (cols === 0 || actualRows === 0) {\n cardWidth = 0;\n cardHeight = 0;\n } else {\n cardWidth = Math.floor(\n (containerWidth - totalSpacingHorizontal) / cols\n );\n cardHeight = Math.floor(\n (containerHeight - totalSpacingVertical) / actualRows\n );\n }\n\n if (defal) {\n updateGridRows(rows);\n updateGridCols(cols);\n\n gridSizes = { ...gridSizes, gridWidth: cardWidth, gridHeight: cardHeight };\n updateGridSizes(gridSizes);\n } else {\n updateAltGridRows(rows);\n updateAltGridCols(cols);\n\n gridSizes = {\n ...gridSizes,\n altGridWidth: cardWidth,\n altGridHeight: cardHeight,\n };\n updateGridSizes(gridSizes);\n }\n}\n\n","import { AudioDecibels } from \"../types/types\";\nexport interface UpdateParticipantAudioDecibelsOptions {\n name: string;\n averageLoudness: number;\n audioDecibels: AudioDecibels[];\n updateAudioDecibels: (audioDecibels: AudioDecibels[]) => void;\n}\n\n// Export the type definition for the function\nexport type UpdateParticipantAudioDecibelsType = (options: UpdateParticipantAudioDecibelsOptions) => void;\n\n\n/**\n * Updates the audio decibels for a participant.\n *\n * @param {UpdateParticipantAudioDecibelsOptions} options - The options for updating participant audio decibels.\n * @param {string} options.name - The name of the participant.\n * @param {number} options.averageLoudness - The average loudness of the participant.\n * @param {Array<AudioDecibels>} options.audioDecibels - The array of audio decibels entries.\n * @param {Function} options.updateAudioDecibels - The function to update the audio decibels array.\n *\n * @returns {void}\n * \n * @example\n * const options = {\n * name: 'participant1',\n * averageLoudness: 50,\n * audioDecibels: [{ name: 'participant1', averageLoudness: 50 }],\n * updateAudioDecibels: updateAudioDecibelsFunction,\n * };\n * \n * updateParticipantAudioDecibels(options);\n */\n\nexport function updateParticipantAudioDecibels({\n name,\n averageLoudness,\n audioDecibels, \n updateAudioDecibels,\n}: UpdateParticipantAudioDecibelsOptions): void {\n\n // Function to update the audioDecibels array\n // Check if the entry already exists in audioDecibels\n const existingEntry = audioDecibels.find((entry) => entry.name === name);\n\n if (existingEntry) {\n // Entry exists, update the averageLoudness\n existingEntry.averageLoudness = averageLoudness;\n } else {\n // Entry doesn't exist, add a new entry to audioDecibels\n audioDecibels.push({ name, averageLoudness });\n }\n\n // Update the audioDecibels array\n updateAudioDecibels(audioDecibels);\n}\n","export interface GridPlanEntry<T> {\n stream: T;\n index: number;\n}\n\nexport interface BuildAddVideosGridPlanOptions<T> {\n mainGridStreams: T[];\n altGridStreams: T[];\n numToAdd?: number;\n}\n\nexport interface AddVideosGridPlan<T> {\n mainEntries: GridPlanEntry<T>[];\n altEntries: GridPlanEntry<T>[];\n}\n\n/**\n * Pure planning engine for addVideosGrid.\n * Produces deterministic main/alt stream iteration plans without rendering concerns.\n */\nexport function buildAddVideosGridPlan<T>({\n mainGridStreams,\n altGridStreams,\n numToAdd,\n}: BuildAddVideosGridPlanOptions<T>): AddVideosGridPlan<T> {\n const safeMain = Array.isArray(mainGridStreams) ? mainGridStreams : [];\n const safeAlt = Array.isArray(altGridStreams) ? altGridStreams : [];\n\n const bounded = Math.max(0, Math.min(numToAdd ?? safeMain.length, safeMain.length));\n\n const mainEntries = safeMain.slice(0, bounded).map((stream, index) => ({\n stream,\n index,\n }));\n\n const altEntries = safeAlt.map((stream, index) => ({\n stream,\n index,\n }));\n\n return { mainEntries, altEntries };\n}\n","export interface PrepopulateParticipantLike {\n name?: string;\n islevel?: string;\n ScreenID?: string;\n ScreenOn?: boolean;\n [key: string]: any;\n}\n\nexport interface PrepopulateStreamLike {\n producerId?: string;\n stream?: any;\n [key: string]: any;\n}\n\nexport interface BuildPrepopulateUserMediaPlanOptions<\n P extends PrepopulateParticipantLike,\n S extends PrepopulateStreamLike,\n> {\n participants: P[];\n allVideoStreams: S[];\n member: string;\n islevel: string;\n shared: boolean;\n shareScreenStarted: boolean;\n eventType: string;\n screenId?: string;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n remoteScreenStream: S[];\n localStreamScreen: any;\n checkOrientation: () => string;\n isWideScreen: boolean;\n forceFullDisplay: boolean;\n includeWhiteboardAsScreenFlow?: boolean;\n}\n\nexport interface PrepopulateUserMediaPlan<P extends PrepopulateParticipantLike> {\n screenFlowActive: boolean;\n shouldReturnEarly: boolean;\n shouldUpdateAdminOnMainScreen: boolean;\n screenForceFullDisplay: boolean;\n host: P | null;\n hostStream: any;\n adminOnMainScreen: boolean;\n mainScreenPerson: string;\n}\n\nexport interface ResolveMainHostRenderModeOptions {\n islevel: string;\n localUIMode: boolean;\n videoAlreadyOn: boolean;\n audioAlreadyOn: boolean;\n hostVideoOn: boolean;\n hostMuted?: boolean;\n}\n\nexport type MainHostRenderMode = 'adminVideo' | 'audio' | 'mini' | 'video';\n\nexport interface ResolveHostVideoStreamOptions<TStreamLike = PrepopulateStreamLike> {\n islevel: string;\n keepBackground: boolean;\n virtualStream: any;\n localStreamVideo: any;\n oldAllStreams: TStreamLike[];\n hostVideoID?: string;\n}\n\nexport interface BuildMainScreenStateOptions {\n filled: boolean;\n adminOnMainScreen: boolean;\n mainScreenPerson: string;\n}\n\nexport interface MainScreenState {\n filled: boolean;\n adminOnMainScreen: boolean;\n mainScreenPerson: string;\n}\n\nexport interface BuildMainHostCardPlanOptions<TStreamLike = PrepopulateStreamLike> {\n islevel: string;\n localUIMode: boolean;\n videoAlreadyOn: boolean;\n audioAlreadyOn: boolean;\n hostVideoOn: boolean;\n hostMuted?: boolean;\n hostIsAdmin: boolean;\n hostName: string;\n hostVideoID?: string;\n fallbackName: string;\n member: string;\n keepBackground: boolean;\n virtualStream: any;\n localStreamVideo: any;\n oldAllStreams: TStreamLike[];\n}\n\nexport interface MainHostCardPlan {\n kind: 'video' | 'audio' | 'mini';\n key: string;\n name: string;\n initials?: string;\n remoteProducerId?: string;\n videoStream?: any;\n doMirror?: boolean;\n state: MainScreenState;\n}\n\nexport interface BuildScreenShareHostCardPlanOptions {\n hostName: string;\n hostScreenID?: string;\n hostIsAdmin: boolean;\n shared: boolean;\n hostStream: any;\n screenForceFullDisplay: boolean;\n annotateScreenStream: boolean;\n}\n\nexport interface ScreenShareHostCardPlan {\n key: string;\n name: string;\n remoteProducerId: string;\n videoStream: any;\n forceFullDisplay: boolean;\n doMirror: false;\n state: MainScreenState;\n}\n\n/**\n * Pure helper for resolving which non-screen-share host card mode should render.\n */\nexport function resolveMainHostRenderMode({\n islevel,\n localUIMode,\n videoAlreadyOn,\n audioAlreadyOn,\n hostVideoOn,\n hostMuted,\n}: ResolveMainHostRenderModeOptions): MainHostRenderMode {\n const hostVideoOffPath =\n (islevel !== '2' && !hostVideoOn)\n || (islevel === '2' && (!hostVideoOn || !videoAlreadyOn))\n || localUIMode === true;\n\n if (!hostVideoOffPath) {\n return 'video';\n }\n\n if (islevel === '2' && videoAlreadyOn) {\n return 'adminVideo';\n }\n\n const audOn =\n (islevel === '2' && audioAlreadyOn)\n || (islevel !== '2' && hostMuted === false);\n\n return audOn ? 'audio' : 'mini';\n}\n\n/**\n * Resolves the correct host video stream source for non-screen-share rendering.\n */\nexport function resolveHostVideoStream<TStreamLike extends PrepopulateStreamLike = PrepopulateStreamLike>({\n islevel,\n keepBackground,\n virtualStream,\n localStreamVideo,\n oldAllStreams,\n hostVideoID,\n}: ResolveHostVideoStreamOptions<TStreamLike>): any {\n if (islevel === '2') {\n return keepBackground && virtualStream ? virtualStream : localStreamVideo;\n }\n\n const safeOldStreams = Array.isArray(oldAllStreams) ? oldAllStreams : [];\n const matched = safeOldStreams.find((stream) => stream.producerId === hostVideoID);\n return matched?.stream ?? null;\n}\n\n/**\n * Pure helper for normalizing main-screen state updates.\n */\nexport function buildMainScreenState({\n filled,\n adminOnMainScreen,\n mainScreenPerson,\n}: BuildMainScreenStateOptions): MainScreenState {\n return {\n filled,\n adminOnMainScreen,\n mainScreenPerson,\n };\n}\n\n/**\n * Pure helper for resolving the non-screen-share host card to render on the main screen.\n */\nexport function buildMainHostCardPlan<TStreamLike extends PrepopulateStreamLike = PrepopulateStreamLike>({\n islevel,\n localUIMode,\n videoAlreadyOn,\n audioAlreadyOn,\n hostVideoOn,\n hostMuted,\n hostIsAdmin,\n hostName,\n hostVideoID,\n fallbackName,\n member,\n keepBackground,\n virtualStream,\n localStreamVideo,\n oldAllStreams,\n}: BuildMainHostCardPlanOptions<TStreamLike>): MainHostCardPlan {\n const mode = resolveMainHostRenderMode({\n islevel,\n localUIMode,\n videoAlreadyOn,\n audioAlreadyOn,\n hostVideoOn,\n hostMuted,\n });\n\n if (mode === 'adminVideo') {\n return {\n kind: 'video',\n key: hostVideoID || hostName || 'host-video',\n name: hostName,\n remoteProducerId: hostVideoID || '',\n videoStream: keepBackground && virtualStream ? virtualStream : localStreamVideo,\n doMirror: true,\n state: buildMainScreenState({\n filled: true,\n adminOnMainScreen: true,\n mainScreenPerson: hostName,\n }),\n };\n }\n\n if (mode === 'audio') {\n return {\n kind: 'audio',\n key: hostName || fallbackName,\n name: hostName,\n state: buildMainScreenState({\n filled: true,\n adminOnMainScreen: islevel === '2',\n mainScreenPerson: hostName,\n }),\n };\n }\n\n if (mode === 'mini') {\n return {\n kind: 'mini',\n key: fallbackName,\n name: hostName,\n initials: fallbackName,\n state: buildMainScreenState({\n filled: false,\n adminOnMainScreen: islevel === '2',\n mainScreenPerson: hostName,\n }),\n };\n }\n\n const hostStream = resolveHostVideoStream({\n islevel,\n keepBackground,\n virtualStream,\n localStreamVideo,\n oldAllStreams,\n hostVideoID,\n });\n\n if (!hostStream) {\n return {\n kind: 'mini',\n key: fallbackName,\n name: hostName,\n initials: fallbackName,\n state: buildMainScreenState({\n filled: false,\n adminOnMainScreen: islevel === '2',\n mainScreenPerson: hostName,\n }),\n };\n }\n\n return {\n kind: 'video',\n key: hostVideoID || hostName || 'host-video',\n name: hostName,\n remoteProducerId: hostVideoID || '',\n videoStream: hostStream,\n doMirror: member === hostName,\n state: buildMainScreenState({\n filled: true,\n adminOnMainScreen: hostIsAdmin,\n mainScreenPerson: hostName,\n }),\n };\n}\n\n/**\n * Pure helper for resolving the screen-share host card to render on the main screen.\n */\nexport function buildScreenShareHostCardPlan({\n hostName,\n hostScreenID,\n hostIsAdmin,\n shared,\n hostStream,\n screenForceFullDisplay,\n annotateScreenStream,\n}: BuildScreenShareHostCardPlanOptions): ScreenShareHostCardPlan {\n return {\n key: hostScreenID || hostName || 'host-screen',\n name: hostName,\n remoteProducerId: hostScreenID || '',\n videoStream: shared ? hostStream : hostStream?.stream ?? null,\n forceFullDisplay: annotateScreenStream && shared ? false : screenForceFullDisplay,\n doMirror: false,\n state: buildMainScreenState({\n filled: true,\n adminOnMainScreen: hostIsAdmin,\n mainScreenPerson: hostName,\n }),\n };\n}\n\n/**\n * Pure planning engine for prepopulateUserMedia host/screen-flow resolution.\n * Returns deterministic state decisions without rendering concerns.\n */\nexport function buildPrepopulateUserMediaPlan<\n P extends PrepopulateParticipantLike,\n S extends PrepopulateStreamLike,\n>({\n participants,\n allVideoStreams,\n member,\n shared,\n shareScreenStarted,\n eventType,\n screenId,\n whiteboardStarted,\n whiteboardEnded,\n remoteScreenStream,\n localStreamScreen,\n checkOrientation,\n isWideScreen,\n forceFullDisplay,\n includeWhiteboardAsScreenFlow = false,\n}: BuildPrepopulateUserMediaPlanOptions<P, S>): PrepopulateUserMediaPlan<P> {\n const safeParticipants = Array.isArray(participants) ? participants : [];\n const safeVideoStreams = Array.isArray(allVideoStreams) ? allVideoStreams : [];\n const safeRemoteScreenStreams = Array.isArray(remoteScreenStream) ? remoteScreenStream : [];\n\n const whiteboardActive = whiteboardStarted && !whiteboardEnded;\n const screenFlowActive =\n shareScreenStarted || shared || (includeWhiteboardAsScreenFlow && whiteboardActive);\n\n let screenForceFullDisplay = forceFullDisplay;\n const orientation = checkOrientation();\n if ((orientation === 'portrait' || !isWideScreen) && (shareScreenStarted || shared)) {\n screenForceFullDisplay = false;\n }\n\n if (!screenFlowActive) {\n if (eventType === 'conference') {\n return {\n screenFlowActive,\n shouldReturnEarly: true,\n shouldUpdateAdminOnMainScreen: false,\n screenForceFullDisplay,\n host: null,\n hostStream: null,\n adminOnMainScreen: false,\n mainScreenPerson: '',\n };\n }\n\n const host = safeParticipants.find((participant) => participant.islevel === '2') ?? null;\n\n return {\n screenFlowActive,\n shouldReturnEarly: false,\n shouldUpdateAdminOnMainScreen: false,\n screenForceFullDisplay,\n host,\n hostStream: null,\n adminOnMainScreen: false,\n mainScreenPerson: host?.name ?? '',\n };\n }\n\n let host: P | null = null;\n let hostStream: any = null;\n\n if (shared) {\n host = { name: member, audioID: '', videoID: '' } as unknown as P;\n hostStream = localStreamScreen;\n } else {\n host =\n safeParticipants.find(\n (participant) => participant.ScreenID === screenId && participant.ScreenOn === true,\n ) ?? null;\n\n if (whiteboardActive) {\n host = {\n name: 'WhiteboardActive',\n islevel: '2',\n audioID: '',\n videoID: '',\n } as unknown as P;\n hostStream = { producerId: 'WhiteboardActive' };\n }\n\n if (host === null) {\n host = safeParticipants.find((participant) => participant.ScreenOn === true) ?? null;\n }\n\n if (host && !String(host.name ?? '').includes('WhiteboardActive')) {\n if (safeRemoteScreenStreams.length === 0) {\n hostStream =\n safeVideoStreams.find((stream) => stream.producerId === host?.ScreenID) ?? null;\n } else {\n hostStream = safeRemoteScreenStreams[0];\n }\n }\n }\n\n return {\n screenFlowActive,\n shouldReturnEarly: false,\n shouldUpdateAdminOnMainScreen: true,\n screenForceFullDisplay,\n host,\n hostStream,\n adminOnMainScreen: (host && host.islevel === '2') ?? false,\n mainScreenPerson: host?.name ?? '',\n };\n}\n","import { BreakoutParticipant, EventType, Participant, Transport } from '../types/types';\n\nexport interface TranslationConsumerSwitchParameters {\n consumerTransports: Transport[];\n roomName: string;\n member: string;\n updateConsumerTransports: (transports: Transport[]) => void;\n breakOutRoomStarted?: boolean;\n breakOutRoomEnded?: boolean;\n breakoutRooms?: BreakoutParticipant[][];\n limitedBreakRoom?: BreakoutParticipant[];\n participants?: Participant[];\n ref_participants?: Participant[];\n islevel?: string;\n eventType?: EventType;\n hostNewRoom?: number;\n [key: string]: any;\n}\n\nexport interface PauseOriginalProducerOptions {\n originalProducerId: string;\n speakerId?: string;\n parameters: TranslationConsumerSwitchParameters;\n}\n\nexport interface ResumeOriginalProducerOptions {\n originalProducerId: string;\n speakerId?: string;\n parameters: TranslationConsumerSwitchParameters;\n}\n\nexport type PauseOriginalProducerType = (options: PauseOriginalProducerOptions) => Promise<void>;\nexport type ResumeOriginalProducerType = (options: ResumeOriginalProducerOptions) => Promise<void>;\n\nexport interface StopConsumingTranslationOptions {\n speakerId?: string;\n language: string;\n translationProducerMap: Record<string, Record<string, string>>;\n parameters: TranslationConsumerSwitchParameters;\n}\n\nexport type StopConsumingTranslationType = (options: StopConsumingTranslationOptions) => Promise<string | null>;\n\nexport const isSpeakerInMyBreakoutRoom = (\n speakerName: string,\n parameters: TranslationConsumerSwitchParameters\n): boolean => {\n const {\n breakOutRoomStarted = false,\n breakOutRoomEnded = false,\n limitedBreakRoom = [],\n participants = [],\n islevel = '1',\n eventType = 'conference',\n hostNewRoom = -1,\n breakoutRooms = [],\n member = '',\n } = parameters;\n\n if (!breakOutRoomStarted || breakOutRoomEnded) {\n return true;\n }\n\n const host = participants.find((p) => p.islevel === '2');\n const speakerIsHost = host?.name === speakerName;\n\n if (islevel !== '2') {\n if (eventType === 'webinar' && speakerIsHost) {\n return true;\n }\n\n if (eventType === 'conference' && speakerIsHost) {\n const roomMember = breakoutRooms.find((r) =>\n r.find((p) => p.name === member)\n );\n const memberBreakRoom = roomMember ? breakoutRooms.indexOf(roomMember) : -1;\n const inBreakRoom = memberBreakRoom !== -1;\n\n if (inBreakRoom) {\n return memberBreakRoom === hostNewRoom;\n }\n\n if (hostNewRoom === -1) {\n return true;\n }\n\n return hostNewRoom === memberBreakRoom && memberBreakRoom !== -1;\n }\n }\n\n return limitedBreakRoom.some((p) => p.name === speakerName);\n};\n\nexport const pauseOriginalProducer = async ({\n originalProducerId,\n speakerId,\n parameters,\n}: PauseOriginalProducerOptions): Promise<void> => {\n try {\n const { consumerTransports } = parameters;\n\n if (speakerId && !isSpeakerInMyBreakoutRoom(speakerId, parameters)) {\n return;\n }\n\n const transport = consumerTransports.find(\n (t) => t.producerId === originalProducerId && t.consumer?.kind === 'audio'\n );\n\n if (transport && transport.consumer && !transport.consumer.paused) {\n transport.consumer.pause();\n\n transport.socket_?.emit(\n 'consumer-pause',\n { serverConsumerId: transport.serverConsumerTransportId },\n async () => {}\n );\n }\n } catch (error) {\n console.error('[TranslationSwitch] Error pausing original producer:', error);\n }\n};\n\nexport const resumeOriginalProducer = async ({\n originalProducerId,\n speakerId,\n parameters,\n}: ResumeOriginalProducerOptions): Promise<void> => {\n try {\n const { consumerTransports } = parameters;\n\n if (speakerId && !isSpeakerInMyBreakoutRoom(speakerId, parameters)) {\n return;\n }\n\n const transport = consumerTransports.find(\n (t) => t.producerId === originalProducerId && t.consumer?.kind === 'audio'\n );\n\n if (transport && transport.consumer && transport.consumer.paused) {\n transport.socket_?.emit(\n 'consumer-resume',\n { serverConsumerId: transport.serverConsumerTransportId },\n async ({ resumed }: { resumed: boolean }) => {\n if (resumed) {\n transport.consumer.resume();\n }\n }\n );\n }\n } catch (error) {\n console.error('[TranslationSwitch] Error resuming original producer:', error);\n }\n};\n\nexport const isConsumingTranslationForSpeaker = (\n speakerId: string,\n consumerTransports: Transport[],\n translationProducerMap: Map<string, { translationProducerId: string; originalProducerId: string; language: string }>\n): { consuming: boolean; language?: string; translationProducerId?: string; originalProducerId?: string } => {\n const translationInfo = translationProducerMap.get(speakerId);\n\n if (translationInfo) {\n const hasConsumer = consumerTransports.some(\n (t) => t.producerId === translationInfo.translationProducerId\n );\n\n if (hasConsumer) {\n return {\n consuming: true,\n language: translationInfo.language,\n translationProducerId: translationInfo.translationProducerId,\n originalProducerId: translationInfo.originalProducerId,\n };\n }\n }\n\n return { consuming: false };\n};\n\nexport const getActiveTranslationConsumers = (\n translationProducerMap: Map<string, { translationProducerId: string; originalProducerId: string; language: string }>,\n consumerTransports: Transport[]\n): Array<{ speakerId: string; translationProducerId: string; originalProducerId: string; language: string }> => {\n const results: Array<{ speakerId: string; translationProducerId: string; originalProducerId: string; language: string }> = [];\n\n translationProducerMap.forEach((info, speakerId) => {\n const hasConsumer = consumerTransports.some(\n (t) => t.producerId === info.translationProducerId\n );\n\n if (hasConsumer) {\n results.push({\n speakerId,\n ...info,\n });\n }\n });\n\n return results;\n};\n\nexport const findOriginalProducerForSpeaker = (\n speakerId: string,\n allAudioStreams: Array<{ producerId: string; name?: string; [key: string]: any }>\n): string | null => {\n const stream = allAudioStreams.find(\n (s) => s.name === speakerId || s.producerId?.includes(speakerId)\n );\n return stream?.producerId || null;\n};\n\nexport const stopConsumingTranslation = async (options: StopConsumingTranslationOptions): Promise<string | null> => {\n const { language, translationProducerMap, parameters } = options;\n try {\n const { consumerTransports, updateConsumerTransports } = parameters;\n\n let originalProducerId: string | null = null;\n let translationProducerId: string | null = null;\n\n for (const [origId, langMap] of Object.entries(translationProducerMap)) {\n if (langMap && langMap[language]) {\n translationProducerId = langMap[language];\n originalProducerId = origId;\n break;\n }\n }\n\n if (!translationProducerId) {\n return originalProducerId;\n }\n\n const transportIndex = consumerTransports.findIndex(\n (t) => t.producerId === translationProducerId\n );\n\n if (transportIndex === -1) {\n return originalProducerId;\n }\n\n const transport = consumerTransports[transportIndex];\n\n if (transport.socket_ && transport.consumer) {\n transport.socket_.emit(\n 'consumer-close',\n { serverConsumerId: transport.serverConsumerTransportId },\n () => {}\n );\n }\n\n if (transport.consumer) {\n transport.consumer.close();\n }\n\n const updatedTransports = consumerTransports.filter((_, i) => i !== transportIndex);\n updateConsumerTransports(updatedTransports);\n\n return originalProducerId;\n } catch (error) {\n console.error('[TranslationSwitch] Error stopping translation consumer:', error);\n return null;\n }\n};\n\nexport const syncTranslationStateAfterBreakoutChange = async (\n translationProducerMap: Record<string, Record<string, string>>,\n speakerIdByProducerId: Record<string, string>,\n parameters: TranslationConsumerSwitchParameters\n): Promise<void> => {\n try {\n const { consumerTransports } = parameters;\n\n for (const [originalProducerId, langMap] of Object.entries(translationProducerMap)) {\n const speakerId = speakerIdByProducerId[originalProducerId];\n if (!speakerId) continue;\n\n const inMyRoom = isSpeakerInMyBreakoutRoom(speakerId, parameters);\n const hasTranslation = Object.keys(langMap).length > 0;\n\n const originalConsumer = consumerTransports.find(\n (t) => t.producerId === originalProducerId && t.consumer?.kind === 'audio'\n );\n\n if (!originalConsumer) continue;\n\n if (inMyRoom && hasTranslation) {\n if (!originalConsumer.consumer.paused) {\n await pauseOriginalProducer({\n originalProducerId,\n speakerId,\n parameters,\n });\n }\n }\n }\n } catch (error) {\n console.error('[TranslationSwitch] Error syncing translation state:', error);\n }\n};\n","export interface LaunchBackgroundOptions {\n updateIsBackgroundModalVisible: (isVisible: boolean) => void\n isBackgroundModalVisible: boolean\n}\n\nexport type LaunchBackgroundType = (options: LaunchBackgroundOptions) => void\n\n/**\n * Toggles the visibility of the background modal.\n */\nexport const launchBackground: LaunchBackgroundType = ({\n updateIsBackgroundModalVisible,\n isBackgroundModalVisible,\n}: LaunchBackgroundOptions): void => {\n updateIsBackgroundModalVisible(!isBackgroundModalVisible)\n}\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\n\n\nexport interface HandleStartBreakoutOptions {\n socket: Socket;\n localSocket?: Socket;\n breakoutRooms: Array<Array<{ name: string; breakRoom?: number | null }>>;\n newParticipantAction: string;\n roomName: string;\n breakOutRoomStarted: boolean;\n breakOutRoomEnded: boolean;\n showAlert?: ShowAlert;\n updateBreakOutRoomStarted: (started: boolean) => void;\n updateBreakOutRoomEnded: (ended: boolean) => void;\n onBreakoutRoomsClose: () => void;\n meetingDisplayType: string;\n updateMeetingDisplayType: (displayType: string) => void;\n}\n\nexport type HandleStartBreakoutType = (options: HandleStartBreakoutOptions) => void;\n\n/**\n * Handles the start of breakout rooms.\n * @function\n * @param {HandleStartBreakoutOptions} options - The options for starting breakout rooms.\n * @param {Socket} options.socket - The main socket instance.\n * @param {Socket} [options.localSocket] - The local socket instance (optional).\n * @param {Array<Array<{name: string, breakRoom: number | null}>>} options.breakoutRooms - The array of breakout rooms with participant data.\n * @param {string} options.newParticipantAction - The action to take for new participants.\n * @param {string} options.roomName - The name of the main room.\n * @param {boolean} options.breakOutRoomStarted - Whether breakout rooms have already started.\n * @param {boolean} options.breakOutRoomEnded - Whether breakout rooms have ended.\n * @param {ShowAlert} [options.showAlert] - Function to show alerts.\n * @param {Function} options.updateBreakOutRoomStarted - Function to update breakout room started state.\n * @param {Function} options.updateBreakOutRoomEnded - Function to update breakout room ended state.\n * @param {Function} options.onBreakoutRoomsClose - Function to close breakout rooms modal.\n * @param {string} options.meetingDisplayType - Current meeting display type.\n * @param {Function} options.updateMeetingDisplayType - Function to update meeting display type.\n * @returns {void}\n */\nexport const handleStartBreakout = ({\n socket,\n localSocket,\n breakoutRooms,\n newParticipantAction,\n roomName,\n breakOutRoomStarted,\n breakOutRoomEnded,\n showAlert,\n updateBreakOutRoomStarted,\n updateBreakOutRoomEnded,\n onBreakoutRoomsClose,\n meetingDisplayType,\n updateMeetingDisplayType,\n}: HandleStartBreakoutOptions): void => {\n const emitName = breakOutRoomStarted && !breakOutRoomEnded ? 'updateBreakout' : 'startBreakout';\n const filteredBreakoutRooms = breakoutRooms.map((room) =>\n room.map(({ name, breakRoom }) => ({ name, breakRoom }))\n );\n\n socket.emit(\n emitName,\n { breakoutRooms: filteredBreakoutRooms, newParticipantAction, roomName },\n (response: { success: boolean; reason: string }) => {\n if (response.success) {\n showAlert?.({ message: 'Breakout rooms active', type: 'success' });\n updateBreakOutRoomStarted(true);\n updateBreakOutRoomEnded(false);\n onBreakoutRoomsClose();\n if (meetingDisplayType !== 'all') {\n updateMeetingDisplayType('all');\n }\n } else {\n showAlert?.({ message: response.reason, type: 'danger' });\n }\n }\n );\n\n if (localSocket && localSocket.id) {\n try {\n localSocket.emit(\n emitName,\n { breakoutRooms: filteredBreakoutRooms, newParticipantAction, roomName },\n (response: { success: boolean; reason: string }) => {\n if (response.success) {\n // do nothing\n }\n }\n );\n } catch {\n console.log('Error starting local breakout rooms:');\n }\n }\n};\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface HandleStopBreakoutOptions {\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n showAlert?: ShowAlert;\n updateBreakOutRoomStarted: (started: boolean) => void;\n updateBreakOutRoomEnded: (ended: boolean) => void;\n onBreakoutRoomsClose: () => void;\n meetingDisplayType: string;\n prevMeetingDisplayType: string;\n updateMeetingDisplayType: (displayType: string) => void;\n}\n\nexport type HandleStopBreakoutType = (options: HandleStopBreakoutOptions) => void;\n\n/**\n * Handles stopping breakout rooms.\n * @function\n * @param {HandleStopBreakoutOptions} options - The options for stopping breakout rooms.\n * @param {Socket} options.socket - The main socket instance.\n * @param {Socket} [options.localSocket] - The local socket instance (optional).\n * @param {string} options.roomName - The name of the main room.\n * @param {ShowAlert} [options.showAlert] - Function to show alerts.\n * @param {Function} options.updateBreakOutRoomStarted - Function to update breakout room started state.\n * @param {Function} options.updateBreakOutRoomEnded - Function to update breakout room ended state.\n * @param {Function} options.onBreakoutRoomsClose - Function to close breakout rooms modal.\n * @param {string} options.meetingDisplayType - Current meeting display type.\n * @param {string} options.prevMeetingDisplayType - Previous meeting display type.\n * @param {Function} options.updateMeetingDisplayType - Function to update meeting display type.\n * @returns {void}\n */\nexport const handleStopBreakout = ({\n socket,\n localSocket,\n roomName,\n showAlert,\n updateBreakOutRoomStarted,\n updateBreakOutRoomEnded,\n onBreakoutRoomsClose,\n meetingDisplayType,\n prevMeetingDisplayType,\n updateMeetingDisplayType,\n}: HandleStopBreakoutOptions): void => {\n socket.emit('stopBreakout', { roomName }, (response: { success: boolean; reason: string }) => {\n if (response.success) {\n showAlert?.({ message: 'Breakout rooms stopped', type: 'success' });\n updateBreakOutRoomStarted(false);\n updateBreakOutRoomEnded(true);\n onBreakoutRoomsClose();\n if (meetingDisplayType !== prevMeetingDisplayType) {\n updateMeetingDisplayType(prevMeetingDisplayType);\n }\n } else {\n showAlert?.({ message: response.reason, type: 'danger' });\n }\n });\n\n if (localSocket && localSocket.id) {\n try {\n localSocket.emit('stopBreakout', { roomName }, (response: { success: boolean; reason: string }) => {\n if (response.success) {\n // do nothing\n }\n });\n } catch {\n console.log('Error stopping local breakout rooms:');\n }\n }\n};\n","export interface LaunchBreakoutRoomsOptions {\n updateIsBreakoutRoomsModalVisible: (isVisible: boolean) => void\n isBreakoutRoomsModalVisible: boolean\n}\n\nexport type LaunchBreakoutRoomsType = (options: LaunchBreakoutRoomsOptions) => void\n\n/**\n * Launches the breakout rooms by toggling the visibility of the breakout rooms modal.\n *\n * @param {LaunchBreakoutRoomsOptions} options - The options object.\n * @param {Function} options.updateIsBreakoutRoomsModalVisible - Function to update the visibility state of the breakout rooms modal.\n * @param {boolean} options.isBreakoutRoomsModalVisible - Current visibility state of the breakout rooms modal.\n *\n * @example\n * ```typescript\n * const options: LaunchBreakoutRoomsOptions = {\n * updateIsBreakoutRoomsModalVisible: setModalVisible,\n * isBreakoutRoomsModalVisible: false,\n * }\n *\n * launchBreakoutRooms(options)\n * // Toggles the breakout rooms modal to visible.\n * ```\n */\nexport const launchBreakoutRooms: LaunchBreakoutRoomsType = ({\n updateIsBreakoutRoomsModalVisible,\n isBreakoutRoomsModalVisible,\n}) => {\n updateIsBreakoutRoomsModalVisible(!isBreakoutRoomsModalVisible)\n}\n","export interface LaunchCoHostOptions {\n updateIsCoHostModalVisible: (isVisible: boolean) => void\n isCoHostModalVisible: boolean\n}\n\nexport type LaunchCoHostType = (options: LaunchCoHostOptions) => void\n\n/**\n * Toggles the visibility of the co-host modal.\n *\n * @param {LaunchCoHostOptions} options - The options object.\n * @param {Function} options.updateIsCoHostModalVisible - Function to update the visibility state of the co-host modal.\n * @param {boolean} options.isCoHostModalVisible - Current visibility state of the co-host modal.\n *\n * @example\n * ```typescript\n * const options: LaunchCoHostOptions = {\n * updateIsCoHostModalVisible: setModalVisible,\n * isCoHostModalVisible: false,\n * }\n *\n * launchCoHost(options)\n * // Toggles the co-host modal to visible.\n * ```\n */\nexport const launchCoHost: LaunchCoHostType = ({ updateIsCoHostModalVisible, isCoHostModalVisible }) => {\n updateIsCoHostModalVisible(!isCoHostModalVisible)\n}\n","import type { Socket } from 'socket.io-client';\nimport type { ShowAlert, CoHostResponsibility } from '../../types/types';\n\n\nexport interface ModifyCoHostSettingsOptions {\n roomName: string;\n showAlert?: ShowAlert;\n selectedParticipant: string;\n coHost: string;\n coHostResponsibility: CoHostResponsibility[];\n updateIsCoHostModalVisible: (isVisible: boolean) => void;\n updateCoHostResponsibility: (coHostResponsibility: CoHostResponsibility[]) => void;\n updateCoHost: (coHost: string) => void;\n socket: Socket;\n}\n\nexport type ModifyCoHostSettingsType = (options: ModifyCoHostSettingsOptions) => Promise<void>;\n\n/**\n * Modifies the co-host settings for a given room.\n * @function\n * @param {ModifyCoHostSettingsOptions} options - The options for modifying co-host settings.\n * @param {string} options.roomName - The name of the room.\n * @param {ShowAlert} [options.showAlert] - Function to show an alert message.\n * @param {string} options.selectedParticipant - The participant selected to be co-host.\n * @param {string} options.coHost - The current co-host.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - The responsibilities assigned to the co-host.\n * @param {Function} options.updateIsCoHostModalVisible - Function to update the visibility of the co-host modal.\n * @param {Function} options.updateCoHostResponsibility - Function to update the co-host responsibility.\n * @param {Function} options.updateCoHost - Function to update the co-host.\n * @param {Socket} options.socket - The socket instance for emitting events.\n * @returns {Promise<void>} A promise that resolves when the co-host settings have been modified.\n *\n * @example\n * ```typescript\n * const options: ModifyCoHostSettingsOptions = {\n * roomName: \"mainRoom\",\n * showAlert: (alert) => console.log(alert.message),\n * selectedParticipant: \"User123\",\n * coHost: \"No coHost\",\n * coHostResponsibility: [{ name: \"media\", value: true, dedicated: false }],\n * updateIsCoHostModalVisible: setModalVisible,\n * updateCoHostResponsibility: setCoHostResponsibility,\n * updateCoHost: setCoHost,\n * socket: socketInstance,\n * };\n *\n * modifyCoHostSettings(options);\n * // Sets User123 as the new co-host with specific responsibilities and emits the update event.\n * ```\n */\nexport const modifyCoHostSettings = async ({\n roomName,\n // showAlert,\n selectedParticipant,\n coHost,\n coHostResponsibility,\n updateIsCoHostModalVisible,\n updateCoHostResponsibility,\n updateCoHost,\n socket,\n}: ModifyCoHostSettingsOptions): Promise<void> => {\n // Check if the chat room is in demo mode\n // if (roomName.toLowerCase().startsWith('d')) {\n // showAlert?.({\n // message: 'You cannot add co-host in demo mode.',\n // type: 'danger',\n // duration: 3000,\n // });\n\n // return;\n // }\n\n let newCoHost = coHost;\n\n if (coHost !== 'No coHost' || (selectedParticipant && selectedParticipant !== 'Select a participant')) {\n if (selectedParticipant && selectedParticipant !== 'Select a participant') {\n newCoHost = selectedParticipant;\n updateCoHost(newCoHost);\n }\n\n updateCoHostResponsibility(coHostResponsibility);\n\n // Emit a socket event to update co-host information\n socket.emit('updateCoHost', {\n roomName,\n coHost: newCoHost,\n coHostResponsibility,\n });\n }\n\n // Close the co-host modal\n updateIsCoHostModalVisible(false);\n};\n","export interface LaunchDisplaySettingsOptions {\n updateIsDisplaySettingsModalVisible: (isVisible: boolean) => void\n isDisplaySettingsModalVisible: boolean\n}\n\nexport type LaunchDisplaySettingsType = (options: LaunchDisplaySettingsOptions) => void\n\n/**\n * Toggles the visibility of the display settings modal.\n *\n * @param {LaunchDisplaySettingsOptions} options - The options object.\n * @param {Function} options.updateIsDisplaySettingsModalVisible - Function to update the visibility state of the display settings modal.\n * @param {boolean} options.isDisplaySettingsModalVisible - Current visibility state of the display settings modal.\n *\n * @example\n * ```typescript\n * const options: LaunchDisplaySettingsOptions = {\n * updateIsDisplaySettingsModalVisible: setModalVisibilityFunction,\n * isDisplaySettingsModalVisible: false,\n * }\n *\n * launchDisplaySettings(options)\n * // This will open the display settings modal if it's currently closed, or close it if it's open.\n * ```\n */\nexport const launchDisplaySettings: LaunchDisplaySettingsType = ({\n updateIsDisplaySettingsModalVisible,\n isDisplaySettingsModalVisible,\n}) => {\n updateIsDisplaySettingsModalVisible(!isDisplaySettingsModalVisible)\n}\n","import type { ShowAlert, OnScreenChangesParameters, OnScreenChangesType } from '../../types/types'\n\n\nexport interface ModifyDisplaySettingsParameters extends OnScreenChangesParameters {\n showAlert?: ShowAlert\n meetingDisplayType: string\n autoWave: boolean\n forceFullDisplay: boolean\n showSubtitlesOnCards?: boolean\n meetingVideoOptimized: boolean\n islevel: string\n recordStarted: boolean\n recordResumed: boolean\n recordStopped: boolean\n recordPaused: boolean\n recordingDisplayType: 'video' | 'media' | 'all'\n recordingVideoOptimized: boolean\n prevForceFullDisplay: boolean\n prevMeetingDisplayType: string\n updateMeetingDisplayType: (displayType: string) => void\n updateAutoWave: (autoWave: boolean) => void\n updateForceFullDisplay: (forceFullDisplay: boolean) => void\n updateShowSubtitlesOnCards?: (showSubtitlesOnCards: boolean) => void\n updateMeetingVideoOptimized: (optimized: boolean) => void\n updatePrevForceFullDisplay: (forceFullDisplay: boolean) => void\n updatePrevMeetingDisplayType: (displayType: string) => void\n updateIsDisplaySettingsModalVisible: (isVisible: boolean) => void\n updateFirstAll: (firstAll: boolean) => void\n updateUpdateMainWindow: (update: boolean) => void\n breakOutRoomStarted: boolean\n breakOutRoomEnded: boolean\n\n // mediasfu functions\n onScreenChanges: OnScreenChangesType\n\n [key: string]: any\n}\n\nexport interface ModifyDisplaySettingsOptions {\n parameters: ModifyDisplaySettingsParameters\n}\n\n// Export the type definition for the function\nexport type ModifyDisplaySettingsType = (\n options: ModifyDisplaySettingsOptions\n) => Promise<void>\n\n/**\n * Modifies the display settings based on the provided parameters.\n *\n * @param {ModifyDisplaySettingsOptions} options - The options containing the parameters to modify the display settings.\n * @param {Object} options.parameters - The parameters for modifying the display settings.\n * @param {Function} options.parameters.showAlert - Function to show alert messages.\n * @param {string} options.parameters.meetingDisplayType - The current meeting display type.\n * @param {boolean} options.parameters.autoWave - Flag indicating if auto wave is enabled.\n * @param {boolean} options.parameters.forceFullDisplay - Flag indicating if full display is forced.\n * @param {boolean} options.parameters.meetingVideoOptimized - Flag indicating if the meeting video is optimized.\n * @param {string} options.parameters.islevel - The current level of the meeting.\n * @param {boolean} options.parameters.recordStarted - Flag indicating if recording has started.\n * @param {boolean} options.parameters.recordResumed - Flag indicating if recording has resumed.\n * @param {boolean} options.parameters.recordStopped - Flag indicating if recording has stopped.\n * @param {boolean} options.parameters.recordPaused - Flag indicating if recording is paused.\n * @param {string} options.parameters.recordingDisplayType - The current recording display type.\n * @param {boolean} options.parameters.recordingVideoOptimized - Flag indicating if the recording video is optimized.\n * @param {string} options.parameters.prevForceFullDisplay - The previous force full display value.\n * @param {string} options.parameters.prevMeetingDisplayType - The previous meeting display type.\n * @param {Function} options.parameters.updateMeetingDisplayType - Function to update the meeting display type.\n * @param {Function} options.parameters.updateAutoWave - Function to update the auto wave setting.\n * @param {Function} options.parameters.updateForceFullDisplay - Function to update the force full display setting.\n * @param {Function} options.parameters.updateMeetingVideoOptimized - Function to update the meeting video optimization setting.\n * @param {Function} options.parameters.updatePrevForceFullDisplay - Function to update the previous force full display setting.\n * @param {Function} options.parameters.updatePrevMeetingDisplayType - Function to update the previous meeting display type.\n * @param {Function} options.parameters.updateIsDisplaySettingsModalVisible - Function to update the visibility of the display settings modal.\n * @param {Function} options.parameters.updateFirstAll - Function to update the first all setting.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {boolean} options.parameters.breakOutRoomStarted - Flag indicating if a breakout room has started.\n * @param {boolean} options.parameters.breakOutRoomEnded - Flag indicating if a breakout room has ended.\n * @param {Function} options.parameters.onScreenChanges - Function to handle screen changes.\n *\n * @example\n * ```typescript\n * const options: ModifyDisplaySettingsOptions = {\n * parameters: {\n * showAlert: showAlertFunction,\n * meetingDisplayType: \"video\",\n * autoWave: true,\n * forceFullDisplay: false,\n * meetingVideoOptimized: true,\n * islevel: \"2\",\n * recordStarted: true,\n * recordResumed: false,\n * recordStopped: false,\n * recordPaused: false,\n * recordingDisplayType: \"video\",\n * recordingVideoOptimized: true,\n * prevForceFullDisplay: false,\n * prevMeetingDisplayType: \"media\",\n * updateMeetingDisplayType: updateDisplayTypeFunction,\n * updateAutoWave: updateAutoWaveFunction,\n * updateForceFullDisplay: updateForceFullDisplayFunction,\n * updateMeetingVideoOptimized: updateVideoOptimizedFunction,\n * updatePrevForceFullDisplay: updatePrevForceFullFunction,\n * updatePrevMeetingDisplayType: updatePrevDisplayTypeFunction,\n * updateIsDisplaySettingsModalVisible: setModalVisibilityFunction,\n * updateFirstAll: setFirstAllFunction,\n * updateUpdateMainWindow: setMainWindowUpdateFunction,\n * breakOutRoomStarted: false,\n * breakOutRoomEnded: true,\n * onScreenChanges: onScreenChangesFunction\n * }\n * };\n *\n * await modifyDisplaySettings(options);\n * ```\n */\n\nexport const modifyDisplaySettings = async ({\n parameters\n}: ModifyDisplaySettingsOptions): Promise<void> => {\n // Destructure the parameters\n let {\n showAlert,\n meetingDisplayType,\n autoWave,\n forceFullDisplay,\n showSubtitlesOnCards = true,\n meetingVideoOptimized,\n islevel,\n recordStarted,\n recordResumed,\n recordStopped,\n recordPaused,\n recordingDisplayType,\n recordingVideoOptimized,\n prevForceFullDisplay,\n prevMeetingDisplayType,\n updateMeetingDisplayType,\n updateAutoWave,\n updateForceFullDisplay,\n updateShowSubtitlesOnCards,\n updateMeetingVideoOptimized,\n updatePrevForceFullDisplay,\n updatePrevMeetingDisplayType,\n updateIsDisplaySettingsModalVisible,\n updateFirstAll,\n updateUpdateMainWindow,\n breakOutRoomStarted,\n breakOutRoomEnded,\n onScreenChanges\n } = parameters\n\n // Update previous states\n updateAutoWave(autoWave)\n updateForceFullDisplay(forceFullDisplay)\n updateShowSubtitlesOnCards?.(showSubtitlesOnCards)\n\n if (\n islevel === '2' &&\n (recordStarted || recordResumed) &&\n !recordStopped &&\n !recordPaused\n ) {\n if (\n recordingDisplayType === 'video' &&\n meetingDisplayType === 'video' &&\n meetingVideoOptimized &&\n !recordingVideoOptimized\n ) {\n showAlert?.({\n message:\n 'Meeting display type can be either video, media, or all when recording display type is non-optimized video.',\n type: 'danger',\n duration: 3000\n })\n // Reset to previous values or handle as needed\n meetingDisplayType = recordingDisplayType\n updateMeetingDisplayType(meetingDisplayType)\n meetingVideoOptimized = recordingVideoOptimized\n updateMeetingVideoOptimized(meetingVideoOptimized)\n return\n } else if (\n recordingDisplayType === 'media' &&\n meetingDisplayType === 'video'\n ) {\n showAlert?.({\n message:\n 'Meeting display type can be either media or all when recording display type is media.',\n type: 'danger',\n duration: 3000\n })\n\n // Reset to previous values or handle as needed\n meetingDisplayType = recordingDisplayType\n updateMeetingDisplayType(meetingDisplayType)\n return\n } else if (\n recordingDisplayType === 'all' &&\n (meetingDisplayType === 'video' || meetingDisplayType === 'media')\n ) {\n showAlert?.({\n message:\n 'Meeting display type can be only all when recording display type is all.',\n type: 'danger',\n duration: 3000\n })\n // Reset to previous values or handle as needed\n meetingDisplayType = recordingDisplayType\n updateMeetingDisplayType(meetingDisplayType)\n return\n }\n }\n\n updateMeetingDisplayType(meetingDisplayType)\n updateMeetingVideoOptimized(meetingVideoOptimized)\n\n // Close the modal or perform additional actions\n updateIsDisplaySettingsModalVisible(false)\n\n if (\n prevMeetingDisplayType !== meetingDisplayType ||\n prevForceFullDisplay !== forceFullDisplay\n ) {\n if (\n breakOutRoomStarted &&\n !breakOutRoomEnded &&\n meetingDisplayType !== 'all'\n ) {\n showAlert?.({\n message:\n 'Breakout room is active. Display type can only be all.',\n type: 'danger'\n })\n meetingDisplayType = prevMeetingDisplayType\n updateMeetingDisplayType(prevMeetingDisplayType)\n return\n }\n\n updateFirstAll(meetingDisplayType !== 'all' ? true : false)\n updateUpdateMainWindow(true)\n await onScreenChanges({\n changed: true,\n parameters: { ...parameters, meetingDisplayType, forceFullDisplay }\n })\n updatePrevForceFullDisplay(forceFullDisplay)\n updatePrevMeetingDisplayType(meetingDisplayType)\n }\n}\n","import type { Socket } from 'socket.io-client'\n\nexport interface ConfirmExitOptions {\n socket: Socket\n localSocket?: Socket\n member: string\n roomName: string\n ban?: boolean\n}\n\n// Export the type definition for the function\nexport type ConfirmExitType = (options: ConfirmExitOptions) => Promise<void>\n\n/**\n * Confirms the exit of a member from a room and optionally bans them.\n *\n * @param {ConfirmExitOptions} options - The options for confirming the exit.\n * @param {Socket} options.socket - The socket instance to emit the event.\n * @param {Socket} [options.localSocket] - The local socket instance to emit the event.\n * @param {string} options.member - The member who is exiting.\n * @param {string} options.roomName - The name of the room the member is exiting from.\n * @param {boolean} [options.ban=false] - Whether to ban the member from the room.\n * @returns {Promise<void>} A promise that resolves when the exit is confirmed.\n *\n * @example\n * ```typescript\n * const options = {\n * socket: socketInstance,\n * localSocket: localSocketInstance,\n * member: \"JohnDoe\",\n * roomName: \"Room123\",\n * ban: true,\n * };\n * await confirmExit(options);\n * ```\n */\n\nexport const confirmExit = async ({\n socket,\n localSocket,\n member,\n roomName,\n ban = false\n}: ConfirmExitOptions): Promise<void> => {\n // Emit a socket event to disconnect the user from the room\n socket.emit('disconnectUser', {\n member: member,\n roomName: roomName,\n ban: ban\n })\n\n if (localSocket && localSocket.id) {\n // Emit a local socket event to disconnect the user from the room\n localSocket.emit('disconnectUser', {\n member: member,\n roomName: roomName,\n ban: ban\n })\n }\n}\n","export interface LaunchConfirmExitOptions {\n updateIsConfirmExitModalVisible: (isVisible: boolean) => void\n isConfirmExitModalVisible: boolean\n}\n\nexport type LaunchConfirmExitType = (options: LaunchConfirmExitOptions) => void\n\n/**\n * Toggles the visibility of the confirmation exit modal.\n *\n * @param {LaunchConfirmExitOptions} options - The options for launching the confirmation exit modal.\n * @param {Function} options.updateIsConfirmExitModalVisible - Function to update the visibility state of the confirmation exit modal.\n * @param {boolean} options.isConfirmExitModalVisible - Current visibility state of the confirmation exit modal.\n *\n * @example\n * ```typescript\n * const options = {\n * updateIsConfirmExitModalVisible: setIsConfirmExitModalVisible,\n * isConfirmExitModalVisible: false,\n * }\n * launchConfirmExit(options)\n * ```\n */\nexport const launchConfirmExit: LaunchConfirmExitType = ({\n updateIsConfirmExitModalVisible,\n isConfirmExitModalVisible,\n}) => {\n updateIsConfirmExitModalVisible(!isConfirmExitModalVisible)\n}\n","export interface LaunchMediaSettingsOptions {\n updateIsMediaSettingsModalVisible: (isVisible: boolean) => void\n isMediaSettingsModalVisible: boolean\n mediaDevices: MediaDevices\n audioInputs: MediaDeviceInfo[]\n videoInputs: MediaDeviceInfo[]\n updateAudioInputs: (inputs: MediaDeviceInfo[]) => void\n updateVideoInputs: (inputs: MediaDeviceInfo[]) => void\n}\n\nexport type LaunchMediaSettingsType = (options: LaunchMediaSettingsOptions) => Promise<void>\n\n/**\n * Launches the media settings modal and updates the available audio and video input devices.\n *\n * @param {LaunchMediaSettingsOptions} options - The options for launching media settings.\n * @param {Function} options.updateIsMediaSettingsModalVisible - Function to update the visibility state of the media settings modal.\n * @param {boolean} options.isMediaSettingsModalVisible - Current visibility state of the media settings modal.\n * @param {MediaDevices} options.mediaDevices - MediaDevices interface to enumerate media devices.\n * @param {MediaDeviceInfo[]} options.audioInputs - Array to store available audio input devices.\n * @param {MediaDeviceInfo[]} options.videoInputs - Array to store available video input devices.\n * @param {Function} options.updateAudioInputs - Function to update the available audio input devices.\n * @param {Function} options.updateVideoInputs - Function to update the available video input devices.\n * @returns {Promise<void>} A promise that resolves when the media settings have been updated.\n *\n * @example\n * ```typescript\n * launchMediaSettings({\n * updateIsMediaSettingsModalVisible: (isVisible) => console.log('Modal visible:', isVisible),\n * isMediaSettingsModalVisible: false,\n * mediaDevices: navigator.mediaDevices,\n * audioInputs: [],\n * videoInputs: [],\n * updateAudioInputs: (inputs) => console.log('Audio Inputs:', inputs),\n * updateVideoInputs: (inputs) => console.log('Video Inputs:', inputs),\n * })\n * ```\n */\nexport const launchMediaSettings: LaunchMediaSettingsType = async ({\n updateIsMediaSettingsModalVisible,\n isMediaSettingsModalVisible,\n mediaDevices,\n audioInputs,\n videoInputs,\n updateAudioInputs,\n updateVideoInputs,\n}) => {\n if (!isMediaSettingsModalVisible) {\n try {\n const devices = await mediaDevices.enumerateDevices()\n videoInputs = devices.filter((device) => device.kind === 'videoinput')\n audioInputs = devices.filter((device) => device.kind === 'audioinput')\n updateVideoInputs(videoInputs)\n updateAudioInputs(audioInputs)\n } catch (error) {\n console.log('Error getting media devices', error)\n }\n }\n\n updateIsMediaSettingsModalVisible(!isMediaSettingsModalVisible)\n}\n","export interface LaunchMenuModalOptions {\n updateIsMenuModalVisible: (isVisible: boolean) => void\n isMenuModalVisible: boolean\n}\n\nexport type LaunchMenuModalType = (options: LaunchMenuModalOptions) => void\n\n/**\n * Toggles the visibility of the menu modal.\n *\n * @param {LaunchMenuModalOptions} options - The options for launching the menu modal.\n * @param {Function} options.updateIsMenuModalVisible - Function to update the visibility state of the menu modal.\n * @param {boolean} options.isMenuModalVisible - Current visibility state of the menu modal.\n *\n * @example\n * ```typescript\n * launchMenuModal({\n * updateIsMenuModalVisible: (isVisible) => console.log(\"Menu modal visibility:\", isVisible),\n * isMenuModalVisible: false,\n * });\n * ```\n */\nexport const launchMenuModal: LaunchMenuModalType = ({\n updateIsMenuModalVisible,\n isMenuModalVisible,\n}) => {\n updateIsMenuModalVisible(!isMenuModalVisible)\n}\n","export interface LaunchMessagesOptions {\n updateIsMessagesModalVisible: (visible: boolean) => void\n isMessagesModalVisible: boolean\n}\n\nexport type LaunchMessagesType = (options: LaunchMessagesOptions) => void\n\n/**\n * Toggles the visibility state of the messages modal.\n *\n * @param {LaunchMessagesOptions} options - The options object.\n * @param {Function} options.updateIsMessagesModalVisible - Function to update the visibility state of the messages modal.\n * @param {boolean} options.isMessagesModalVisible - Current visibility state of the messages modal.\n *\n * @example\n * ```typescript\n * const options: LaunchMessagesOptions = {\n * updateIsMessagesModalVisible: setModalVisibilityFunction,\n * isMessagesModalVisible: false,\n * }\n *\n * launchMessages(options)\n * ```\n */\nexport const launchMessages: LaunchMessagesType = ({ updateIsMessagesModalVisible, isMessagesModalVisible }) => {\n updateIsMessagesModalVisible(!isMessagesModalVisible)\n}\n","import { Socket } from \"socket.io-client\";\nimport type {\n CoHostResponsibility,\n EventType,\n Message,\n ShowAlert,\n} from \"../../types/types\";\n\nexport interface SendMessageOptions {\n message: string;\n receivers: string[];\n group: boolean;\n messagesLength: number;\n member: string;\n sender: string;\n islevel: string;\n eventType?: EventType;\n showAlert?: ShowAlert;\n coHostResponsibility: CoHostResponsibility[];\n coHost: string;\n roomName: string;\n socket: Socket;\n chatSetting: string;\n}\n\n// Export the type\nexport type SendMessageType = (options: SendMessageOptions) => Promise<void>;\n\n/**\n * Sends a message to the server.\n *\n * @param {SendMessageOptions} options - The options for sending a message.\n * @param {string} options.message - The message content to be sent.\n * @param {string[]} options.receivers - The list of receivers for the message.\n * @param {boolean} options.group - Indicates if the message is for a group.\n * @param {number} options.messagesLength - The current number of messages.\n * @param {string} options.member - The member sending the message.\n * @param {string} options.sender - The sender of the message.\n * @param {string} options.islevel - The level of the sender (e.g., \"2\" for admin).\n * @param {EventType} [options.eventType] - The type of event (e.g., \"broadcast\", \"chat\", \"conference\").\n * @param {ShowAlert} [options.showAlert] - Function to show alerts to the user.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - Array of co-host responsibilities.\n * @param {string} options.coHost - The co-host member name.\n * @param {string} options.roomName - The name of the room.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {string} options.chatSetting - The chat setting for the event room.\n * @returns {Promise<void>} A promise that resolves when the message is sent.\n *\n * @throws Will show an alert if the message count exceeds the limit, if the message is invalid, or if the user is not allowed to send a message.\n *\n * @example\n * ```typescript\n * await sendMessage({\n * message: \"Hello, World!\",\n * receivers: [\"user1\", \"user2\"],\n * group: true,\n * messagesLength: 50,\n * member: \"user3\",\n * sender: \"user3\",\n * islevel: \"2\",\n * eventType: \"chat\",\n * showAlert: ({ message, type }) => console.log(message, type),\n * coHostResponsibility: [{ name: \"chat\", value: true }],\n * coHost: \"coHostUser\",\n * roomName: \"mainRoom\",\n * socket: socketInstance,\n * chatSetting: \"allow\",\n * });\n * ```\n */\n\nexport const sendMessage = async ({\n message,\n receivers,\n group,\n messagesLength,\n member,\n sender,\n islevel,\n showAlert,\n coHostResponsibility,\n coHost,\n roomName,\n socket,\n chatSetting,\n}: SendMessageOptions): Promise<void> => {\n let chatValue = false;\n\n // Check message count limit based on room type prefix\n if (\n (messagesLength > 100 && roomName.startsWith(\"d\")) ||\n (messagesLength > 500 && roomName.startsWith(\"s\")) ||\n (messagesLength > 100000 && roomName.startsWith(\"p\"))\n ) {\n showAlert?.({\n message: \"You have reached the maximum number of messages allowed.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // Check if message is valid\n if (!message || message === \"\") {\n showAlert?.({\n message: \"Message is not valid.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // Check if receivers is valid\n if (receivers.length < 1 && group === false) {\n showAlert?.({\n message: \"Please select a message to reply to\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n\n // Create message object\n const messageObject: Message = {\n sender: sender ? sender : member,\n receivers: receivers,\n message: message,\n timestamp: new Date().toLocaleTimeString(),\n group: group !== undefined && group !== null ? group : false,\n };\n\n try {\n // Check co-host responsibility for chat\n chatValue = coHostResponsibility.find((item) => item.name === \"chat\")?.value ?? false;\n } catch (error) {\n console.error(error);\n }\n\n if (islevel === \"2\" || (coHost === member && chatValue === true)) {\n // Allow sending message\n } else {\n // Check if user is allowed to send a message in the event room\n if (!chatSetting) {\n showAlert?.({\n message: \"You are not allowed to send a message in this event room\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n }\n\n // Send the message to the server\n socket.emit(\"sendMessage\", {\n messageObject: messageObject,\n roomName: roomName,\n });\n};\n","export interface LaunchParticipantsOptions {\n updateIsParticipantsModalVisible: (isVisible: boolean) => void\n isParticipantsModalVisible: boolean\n}\n\nexport type LaunchParticipantsType = (options: LaunchParticipantsOptions) => void\n\n/**\n * Toggles the visibility of the participants modal.\n *\n * @param {LaunchParticipantsOptions} options - The options for toggling the participants modal.\n * @param {Function} options.updateIsParticipantsModalVisible - Function to update the visibility state of the participants modal.\n * @param {boolean} options.isParticipantsModalVisible - Current visibility state of the participants modal.\n *\n * @example\n * ```typescript\n * launchParticipants({\n * updateIsParticipantsModalVisible: (isVisible) => setParticipantsModalVisible(isVisible),\n * isParticipantsModalVisible: true,\n * })\n * ```\n */\nexport const launchParticipants: LaunchParticipantsType = ({ updateIsParticipantsModalVisible, isParticipantsModalVisible }) => {\n updateIsParticipantsModalVisible(!isParticipantsModalVisible)\n}\n","import type { Participant, CoHostResponsibility, ShowAlert } from \"../../types/types\";\n\nexport interface MessageParticipantsOptions {\n coHostResponsibility?: CoHostResponsibility[];\n participant: Participant;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n coHost: string;\n updateIsMessagesModalVisible: (isVisible: boolean) => void;\n updateDirectMessageDetails: (participant: Participant | null) => void;\n updateStartDirectMessage: (start: boolean) => void;\n}\n\n/**\n * Sends a direct message to a participant if the current member has the necessary permissions.\n *\n * @param {MessageParticipantsOptions} options - The options for messaging participants.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - Array of responsibilities assigned to the co-host.\n * @param {Participant} options.participant - The participant to whom the message is to be sent.\n * @param {string} options.member - The current member attempting to send the message.\n * @param {string} options.islevel - The level of the current member.\n * @param {ShowAlert} [options.showAlert] - Function to show an alert message.\n * @param {string} options.coHost - The co-host member.\n * @param {Function} options.updateIsMessagesModalVisible - Function to update the visibility of the messages modal.\n * @param {Function} options.updateDirectMessageDetails - Function to update the details of the direct message.\n * @param {Function} options.updateStartDirectMessage - Function to start the direct message.\n *\n * @example\n * ```typescript\n * messageParticipants({\n * coHostResponsibility: [{ name: \"chat\", value: true }],\n * participant: { name: \"John Doe\", islevel: \"1\" },\n * member: \"currentMember\",\n * islevel: \"2\",\n * showAlert: (alert) => console.log(alert.message),\n * coHost: \"coHostMember\",\n * updateIsMessagesModalVisible: (isVisible) => setMessagesModalVisible(isVisible),\n * updateDirectMessageDetails: (participant) => setDirectMessageDetails(participant),\n * updateStartDirectMessage: (start) => setStartDirectMessage(start),\n * });\n * ```\n */\n\nexport const messageParticipants = ({\n coHostResponsibility = [],\n participant,\n member,\n islevel,\n showAlert,\n coHost,\n updateIsMessagesModalVisible,\n updateDirectMessageDetails,\n updateStartDirectMessage,\n}: MessageParticipantsOptions): void => {\n let chatValue = false;\n\n try {\n chatValue = coHostResponsibility.find((item) => item.name === \"chat\")?.value ?? false;\n } catch (error) {\n console.error(error);\n }\n\n if (islevel === \"2\" || (coHost === member && chatValue === true)) {\n if (participant.islevel !== \"2\") {\n updateDirectMessageDetails(participant);\n updateStartDirectMessage(true);\n updateIsMessagesModalVisible(true);\n }\n } else {\n showAlert?.({\n message: \"You are not allowed to send this message\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport type { Participant, CoHostResponsibility, ShowAlert } from \"../../types/types\";\n\nexport interface MuteParticipantsOptions {\n socket: Socket;\n coHostResponsibility?: CoHostResponsibility[];\n participant: Participant;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n coHost: string;\n roomName: string;\n}\n\n/**\n * Mutes a participant in a media session if the current member has the necessary permissions.\n *\n * @param {MuteParticipantsOptions} options - The options for muting participants.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - List of co-host responsibilities.\n * @param {Participant} options.participant - The participant to be muted.\n * @param {string} options.member - The current member attempting to mute.\n * @param {string} options.islevel - The level of the current member.\n * @param {ShowAlert} [options.showAlert] - Optional function to show alerts.\n * @param {string} options.coHost - The co-host information.\n * @param {string} options.roomName - The name of the room.\n *\n * @example\n * ```typescript\n * muteParticipants({\n * socket,\n * coHostResponsibility: [{ name: \"media\", value: true }],\n * participant: { id: \"123\", name: \"John Doe\", muted: false, islevel: \"1\" },\n * member: \"currentMember\",\n * islevel: \"2\",\n * showAlert: (alert) => console.log(alert.message),\n * coHost: \"coHostMember\",\n * roomName: \"room1\",\n * });\n * ```\n */\n\nexport const muteParticipants = async ({\n socket,\n coHostResponsibility = [],\n participant,\n member,\n islevel,\n showAlert,\n coHost,\n roomName,\n}: MuteParticipantsOptions): Promise<void> => {\n let mediaValue = false;\n\n try {\n mediaValue =\n coHostResponsibility.find((item) => item.name === \"media\")?.value ?? false;\n } catch (error) {\n console.error(error);\n }\n\n if (islevel === \"2\" || (coHost === member && mediaValue)) {\n if (!participant.muted && participant.islevel !== \"2\") {\n const participantId = participant.id;\n socket.emit(\"controlMedia\", {\n participantId,\n participantName: participant.name,\n type: \"all\",\n roomName,\n });\n }\n } else {\n showAlert?.({\n message: \"You are not allowed to mute other participants\",\n type: \"danger\",\n duration: 3000,\n });\n }\n};\n","import { Socket } from 'socket.io-client';\nimport type { CoHostResponsibility, Participant, ShowAlert } from '../../types/types';\n\nexport interface RemoveParticipantsOptions {\n coHostResponsibility: CoHostResponsibility[];\n participant: Participant;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n coHost: string;\n participants: Participant[];\n socket: Socket;\n roomName: string;\n updateParticipants: (participants: Participant[]) => void;\n}\n\n/**\n * Removes a participant from the room if the user has the necessary permissions.\n *\n * @param {RemoveParticipantsOptions} options - The options for removing a participant.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - The responsibilities assigned to the co-host.\n * @param {Participant} options.participant - The participant to be removed from the room.\n * @param {string} options.member - The current member attempting to remove the participant.\n * @param {string} options.islevel - The level of the current member.\n * @param {ShowAlert} [options.showAlert] - Optional function to display an alert.\n * @param {string} options.coHost - The co-host identifier.\n * @param {Participant[]} options.participants - List of current participants.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {string} options.roomName - The name of the room.\n * @param {Function} options.updateParticipants - Function to update the participants list.\n *\n * @example\n * ```typescript\n * removeParticipants({\n * coHostResponsibility: [{ name: \"participants\", value: true }],\n * participant: { id: \"123\", name: \"John Doe\", islevel: \"1\" },\n * member: \"currentMember\",\n * islevel: \"2\",\n * showAlert: (alert) => console.log(alert.message),\n * coHost: \"coHostMember\",\n * participants: [{ id: \"123\", name: \"John Doe\", islevel: \"1\" }],\n * socket,\n * roomName: \"room1\",\n * updateParticipants: (updatedParticipants) => console.log(updatedParticipants),\n * });\n * ```\n */\n\nexport const removeParticipants = async ({\n coHostResponsibility,\n participant,\n member,\n islevel,\n showAlert,\n coHost,\n participants,\n socket,\n roomName,\n updateParticipants\n}: RemoveParticipantsOptions): Promise<void> => {\n let participantsValue = false;\n\n try {\n participantsValue =\n coHostResponsibility.find((item) => item.name === 'participants')?.value ?? false;\n } catch {\n participantsValue = false;\n }\n\n if (islevel === '2' || (coHost === member && participantsValue === true)) {\n if (participant.islevel !== '2') {\n const participantId = participant.id;\n\n // Emit a socket event to disconnect the user\n socket.emit('disconnectUserInitiate', {\n member: participant.name,\n roomName,\n id: participantId,\n });\n\n // Remove the participant from the local array\n const index = participants.findIndex((obj) => obj.name === participant.name);\n if (index !== -1) {\n participants.splice(index, 1);\n }\n\n // Update the participants array\n updateParticipants(participants);\n }\n } else {\n showAlert?.({\n message: 'You are not allowed to remove other participants',\n type: 'danger',\n duration: 3000,\n });\n }\n};\n","export interface LaunchPanelistsOptions {\n updateIsPanelistsModalVisible: (visible: boolean) => void;\n isPanelistsModalVisible: boolean;\n}\n\nexport type LaunchPanelistsType = (options: LaunchPanelistsOptions) => void;\n\nexport const launchPanelists = ({\n updateIsPanelistsModalVisible,\n isPanelistsModalVisible,\n}: LaunchPanelistsOptions): void => {\n updateIsPanelistsModalVisible(!isPanelistsModalVisible);\n};\n","import { Socket } from 'socket.io-client';\nimport type { Participant, ShowAlert } from '../../types/types';\n\nexport interface UpdatePanelistsOptions {\n socket: Socket;\n panelists: Participant[];\n roomName: string;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport interface AddPanelistOptions {\n socket: Socket;\n participant: Participant;\n currentPanelists: Participant[];\n maxPanelists: number;\n roomName: string;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport interface RemovePanelistOptions {\n socket: Socket;\n participant: Participant;\n roomName: string;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport type UpdatePanelistsType = (options: UpdatePanelistsOptions) => Promise<void>;\nexport type AddPanelistType = (options: AddPanelistOptions) => Promise<boolean>;\nexport type RemovePanelistType = (options: RemovePanelistOptions) => Promise<void>;\n\nexport const updatePanelists = async ({\n socket,\n panelists,\n roomName,\n member: _member,\n islevel,\n showAlert,\n}: UpdatePanelistsOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can update panelists', type: 'danger', duration: 3000 });\n return;\n }\n\n socket.emit(\n 'updatePanelists',\n {\n panelists: panelists.map((p) => ({ id: p.id, name: p.name })),\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to update panelists', type: 'danger', duration: 3000 });\n }\n }\n );\n};\n\nexport const addPanelist = async ({\n socket,\n participant,\n currentPanelists,\n maxPanelists,\n roomName,\n member: _member,\n islevel,\n showAlert,\n}: AddPanelistOptions): Promise<boolean> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can add panelists', type: 'danger', duration: 3000 });\n return false;\n }\n\n if (currentPanelists.some((p) => p.id === participant.id)) {\n showAlert?.({ message: `${participant.name} is already a panelist`, type: 'success', duration: 3000 });\n return false;\n }\n\n if (currentPanelists.length >= maxPanelists) {\n showAlert?.({ message: `Maximum panelist limit (${maxPanelists}) reached`, type: 'danger', duration: 3000 });\n return false;\n }\n\n return new Promise((resolve) => {\n socket.emit(\n 'addPanelist',\n {\n participantId: participant.id,\n participantName: participant.name,\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to add panelist', type: 'danger', duration: 3000 });\n resolve(false);\n } else {\n resolve(true);\n }\n }\n );\n });\n};\n\nexport const removePanelist = async ({\n socket,\n participant,\n roomName,\n member: _member,\n islevel,\n showAlert,\n}: RemovePanelistOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can remove panelists', type: 'danger', duration: 3000 });\n return;\n }\n\n socket.emit(\n 'removePanelist',\n {\n participantId: participant.id,\n participantName: participant.name,\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to remove panelist', type: 'danger', duration: 3000 });\n }\n }\n );\n};\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface FocusPanelistsOptions {\n socket: Socket;\n roomName: string;\n member: string;\n islevel: string;\n focusEnabled: boolean;\n muteOthersMic?: boolean;\n muteOthersCamera?: boolean;\n showAlert?: ShowAlert;\n}\n\nexport interface UnfocusPanelistsOptions {\n socket: Socket;\n roomName: string;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport type FocusPanelistsType = (options: FocusPanelistsOptions) => Promise<void>;\nexport type UnfocusPanelistsType = (options: UnfocusPanelistsOptions) => Promise<void>;\n\nexport const focusPanelists = async ({\n socket,\n roomName,\n member: _member,\n islevel,\n focusEnabled,\n muteOthersMic = false,\n muteOthersCamera = false,\n showAlert,\n}: FocusPanelistsOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can focus panelists', type: 'danger', duration: 3000 });\n return;\n }\n\n socket.emit(\n 'focusPanelists',\n {\n roomName,\n focusEnabled,\n muteOthersMic,\n muteOthersCamera,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to focus panelists', type: 'danger', duration: 3000 });\n }\n }\n );\n};\n\nexport const unfocusPanelists = async ({\n socket,\n roomName,\n member: _member,\n islevel,\n showAlert,\n}: UnfocusPanelistsOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can unfocus panelists', type: 'danger', duration: 3000 });\n return;\n }\n\n socket.emit(\n 'focusPanelists',\n {\n roomName,\n focusEnabled: false,\n muteOthersMic: false,\n muteOthersCamera: false,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to unfocus panelists', type: 'danger', duration: 3000 });\n }\n }\n );\n};\n","export interface LaunchPermissionsOptions {\n updateIsPermissionsModalVisible: (visible: boolean) => void;\n isPermissionsModalVisible: boolean;\n}\n\nexport type LaunchPermissionsType = (options: LaunchPermissionsOptions) => void;\n\nexport const launchPermissions = ({\n updateIsPermissionsModalVisible,\n isPermissionsModalVisible,\n}: LaunchPermissionsOptions): void => {\n updateIsPermissionsModalVisible(!isPermissionsModalVisible);\n};\n","import { Socket } from 'socket.io-client';\nimport type { Participant, ShowAlert } from '../../types/types';\n\nexport type PermissionLevel = '0' | '1' | '2';\n\nexport interface UpdateParticipantPermissionOptions {\n socket: Socket;\n participant: Participant;\n newLevel: PermissionLevel;\n member: string;\n islevel: string;\n roomName: string;\n showAlert?: ShowAlert;\n}\n\nexport interface BulkUpdateParticipantPermissionsOptions {\n socket: Socket;\n participants: Participant[];\n newLevel: PermissionLevel;\n member: string;\n islevel: string;\n roomName: string;\n showAlert?: ShowAlert;\n maxBatchSize?: number;\n}\n\nexport const updateParticipantPermission = async ({\n socket,\n participant,\n newLevel,\n member: _member,\n islevel,\n roomName,\n showAlert,\n}: UpdateParticipantPermissionOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can update participant permissions', type: 'danger', duration: 3000 });\n return;\n }\n\n if (participant.islevel === '2') {\n showAlert?.({ message: \"Cannot change the host's permission level\", type: 'danger', duration: 3000 });\n return;\n }\n\n if (participant.islevel === newLevel) return;\n\n return new Promise<void>((resolve) => {\n socket.emit(\n 'updateParticipantPermission',\n {\n participantId: participant.id,\n participantName: participant.name,\n newLevel,\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to update permission', type: 'danger', duration: 3000 });\n }\n resolve();\n }\n );\n });\n};\n\nexport const bulkUpdateParticipantPermissions = async ({\n socket,\n participants,\n newLevel,\n member: _member,\n islevel,\n roomName,\n showAlert,\n maxBatchSize = 50,\n}: BulkUpdateParticipantPermissionsOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can update participant permissions', type: 'danger', duration: 3000 });\n return;\n }\n\n const eligibleParticipants = participants.filter(\n (p) => p.islevel !== '2' && p.islevel !== newLevel\n );\n\n if (eligibleParticipants.length === 0) {\n showAlert?.({\n message: 'No participants to update',\n type: 'info',\n duration: 3000,\n });\n return;\n }\n\n const batch = eligibleParticipants.slice(0, maxBatchSize);\n\n return new Promise<void>((resolve) => {\n socket.emit(\n 'bulkUpdateParticipantPermissions',\n {\n updates: batch.map((p) => ({\n participantId: p.id,\n participantName: p.name,\n newLevel,\n })),\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({\n message: response?.reason || 'Failed to update permissions',\n type: 'danger',\n duration: 3000,\n });\n } else if (eligibleParticipants.length > maxBatchSize) {\n showAlert?.({\n message: `Updated ${batch.length} participants. ${eligibleParticipants.length - maxBatchSize} remaining.`,\n type: 'info',\n duration: 3000,\n });\n }\n\n resolve();\n }\n );\n });\n};\n","import { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface PermissionCapabilities {\n useMic: 'allow' | 'approval' | 'disallow';\n useCamera: 'allow' | 'approval' | 'disallow';\n useScreen: 'allow' | 'approval' | 'disallow';\n useChat: 'allow' | 'disallow';\n}\n\nexport interface PermissionConfig {\n level0: PermissionCapabilities;\n level1: PermissionCapabilities;\n}\n\nexport interface UpdatePermissionConfigOptions {\n socket: Socket;\n config: PermissionConfig;\n member: string;\n islevel: string;\n roomName: string;\n showAlert?: ShowAlert;\n}\n\nexport const updatePermissionConfig = async ({\n socket,\n config,\n islevel,\n roomName,\n showAlert,\n}: UpdatePermissionConfigOptions): Promise<void> => {\n if (islevel !== '2') {\n showAlert?.({ message: 'Only the host can update permission configuration', type: 'danger', duration: 3000 });\n return;\n }\n\n return new Promise<void>((resolve) => {\n socket.emit(\n 'updatePermissionConfig',\n {\n config,\n roomName,\n },\n (response: { success: boolean; reason?: string }) => {\n if (!response?.success) {\n showAlert?.({ message: response?.reason || 'Failed to update permission config', type: 'danger', duration: 3000 });\n }\n resolve();\n }\n );\n });\n};\n","import { Socket } from \"socket.io-client\";\nimport type { ShowAlert } from \"../../types/types\";\n\ninterface NewPoll {\n question: string;\n type: string;\n options: string[];\n}\n\nexport interface HandleCreatePollOptions {\n poll: NewPoll;\n socket: Socket;\n roomName: string;\n showAlert?: ShowAlert;\n updateIsPollModalVisible: (visible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type HandleCreatePollType = (options: HandleCreatePollOptions) => Promise<void>;\n\n/**\n * Handles the creation of a poll by emitting a \"createPoll\" event with the provided details.\n *\n * @param {HandleCreatePollOptions} options - The options for creating the poll.\n * @param {NewPoll} options.poll - The poll object containing the poll question, type, and options.\n * @param {Socket} options.socket - The socket instance used to communicate with the server.\n * @param {string} options.roomName - The name of the room where the poll is created.\n * @param {Function} [options.showAlert] - Optional function to show alert messages.\n * @param {Function} options.updateIsPollModalVisible - Function to toggle the poll modal visibility.\n *\n * @example\n * ```typescript\n * handleCreatePoll({\n * poll: { question: \"Favorite color?\", type: \"singleChoice\", options: [\"Red\", \"Blue\", \"Green\"] },\n * socket: socketInstance,\n * roomName: \"roomA\",\n * showAlert: (message) => console.log(message),\n * updateIsPollModalVisible: (isVisible) => setIsPollModalVisible(isVisible),\n * });\n * ```\n */\n\nexport const handleCreatePoll = async ({\n poll,\n socket,\n roomName,\n showAlert,\n updateIsPollModalVisible,\n}: HandleCreatePollOptions): Promise<void> => {\n try {\n socket.emit(\n \"createPoll\",\n { roomName, poll },\n (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({ message: \"Poll created successfully\", type: \"success\" });\n updateIsPollModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || \"Failed to create poll\", type: \"danger\" });\n }\n }\n );\n } catch (error) {\n console.error(\"Error creating poll:\", error);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport type { ShowAlert } from \"../../types/types\";\n\nexport interface HandleEndPollOptions {\n pollId: string;\n socket: Socket;\n showAlert?: ShowAlert;\n roomName: string;\n updateIsPollModalVisible: (isVisible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type HandleEndPollType = (options: HandleEndPollOptions) => Promise<void>;\n\n/**\n * Handles the end of a poll by emitting an \"endPoll\" event through the provided socket.\n * Displays an alert based on the success or failure of the operation.\n *\n * @param {HandleEndPollOptions} options - The options for ending the poll.\n * @param {string} options.pollId - The ID of the poll to end.\n * @param {Socket} options.socket - The socket instance to emit the event.\n * @param {Function} [options.showAlert] - Optional function to display alerts.\n * @param {string} options.roomName - The name of the room where the poll is being conducted.\n * @param {Function} options.updateIsPollModalVisible - Function to update the poll modal visibility.\n *\n * @example\n * ```typescript\n * handleEndPoll({\n * pollId: \"poll123\",\n * socket: socketInstance,\n * showAlert: (message) => console.log(message),\n * roomName: \"roomA\",\n * updateIsPollModalVisible: (isVisible) => setIsPollModalVisible(isVisible),\n * });\n * ```\n */\n\nexport const handleEndPoll = async ({\n pollId,\n socket,\n showAlert,\n roomName,\n updateIsPollModalVisible,\n}: HandleEndPollOptions): Promise<void> => {\n try {\n socket.emit(\n \"endPoll\",\n { roomName, poll_id: pollId },\n (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({\n message: \"Poll ended successfully\",\n type: \"success\",\n });\n updateIsPollModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || \"Failed to end poll\", type: \"danger\" });\n }\n }\n );\n } catch (error) {\n console.error(\"Error ending poll:\", error);\n }\n};\n","import { Socket } from \"socket.io-client\";\nimport type { ShowAlert } from \"../../types/types\";\n\nexport interface HandleVotePollOptions {\n pollId: string;\n optionIndex: number;\n socket: Socket;\n showAlert?: ShowAlert;\n member: string;\n roomName: string;\n updateIsPollModalVisible: (isVisible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type HandleVotePollType = (options: HandleVotePollOptions) => Promise<void>;\n\n/**\n * Handles the voting process for a poll.\n *\n * @param {HandleVotePollOptions} options - The options for handling the vote.\n * @param {string} options.pollId - The ID of the poll.\n * @param {number} options.optionIndex - The index of the selected option.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {Function} [options.showAlert] - Optional function to show alerts.\n * @param {string} options.member - The member who is voting.\n * @param {string} options.roomName - The name of the room where the poll is conducted.\n * @param {Function} options.updateIsPollModalVisible - Function to update the visibility of the poll modal.\n *\n * @example\n * ```typescript\n * handleVotePoll({\n * pollId: \"poll123\",\n * optionIndex: 1,\n * socket: socketInstance,\n * showAlert: (message) => console.log(message),\n * member: \"user1\",\n * roomName: \"roomA\",\n * updateIsPollModalVisible: (isVisible) => setIsPollModalVisible(isVisible),\n * });\n * ```\n */\n\nexport const handleVotePoll = async ({\n pollId,\n optionIndex,\n socket,\n showAlert,\n member,\n roomName,\n updateIsPollModalVisible,\n}: HandleVotePollOptions): Promise<void> => {\n try {\n socket.emit(\n \"votePoll\",\n {\n roomName,\n poll_id: pollId,\n member,\n choice: optionIndex,\n },\n (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({\n message: \"Vote submitted successfully\",\n type: \"success\",\n });\n updateIsPollModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || \"Failed to submit vote\", type: \"danger\" });\n }\n }\n );\n } catch (error) {\n console.error(\"Error submitting vote:\", error);\n }\n};\n","export interface LaunchPollOptions {\n updateIsPollModalVisible: (isVisible: boolean) => void\n isPollModalVisible: boolean\n}\n\nexport type LaunchPollType = (options: LaunchPollOptions) => void\n\n/**\n * Toggles the visibility of the poll modal.\n *\n * @param {LaunchPollOptions} options - The options for toggling the poll modal visibility.\n * @param {Function} options.updateIsPollModalVisible - Function to update the visibility state of the poll modal.\n * @param {boolean} options.isPollModalVisible - Current visibility state of the poll modal.\n *\n * @example\n * ```typescript\n * launchPoll({\n * updateIsPollModalVisible: (visible) => setIsPollModalVisible(visible),\n * isPollModalVisible: false,\n * })\n * ```\n */\nexport const launchPoll: LaunchPollType = ({ updateIsPollModalVisible, isPollModalVisible }) => {\n updateIsPollModalVisible(!isPollModalVisible)\n}\n","import type { Poll, PollUpdatedData, ShowAlert } from '../../types/types';\n\nexport interface PollUpdatedOptions {\n data: PollUpdatedData;\n polls: Poll[];\n poll: Poll;\n member: string;\n islevel: string;\n showAlert?: ShowAlert;\n updatePolls: (polls: Poll[]) => void;\n updatePoll: (poll: Poll) => void;\n updateIsPollModalVisible: (isVisible: boolean) => void;\n}\n\nexport type PollUpdatedType = (options: PollUpdatedOptions) => Promise<void>;\n\n/**\n * Reconciles poll update payloads with current poll state.\n *\n * This helper updates the poll collection, manages active poll visibility, and\n * emits user-facing alerts when a new poll starts or an active poll ends.\n *\n * @param options Poll update handling options.\n * @returns A promise that resolves after local poll state has been synchronized.\n *\n * @example\n * ```typescript\n * await pollUpdated({\n * data,\n * polls,\n * poll,\n * member: 'Ada',\n * islevel: '1',\n * updatePolls: setPolls,\n * updatePoll: setCurrentPoll,\n * updateIsPollModalVisible: setPollModalVisible,\n * });\n * ```\n */\nexport const pollUpdated = async ({\n data,\n polls,\n poll,\n member,\n islevel,\n showAlert,\n updatePolls,\n updatePoll,\n updateIsPollModalVisible,\n}: PollUpdatedOptions): Promise<void> => {\n try {\n if (data.polls) {\n polls = data.polls;\n updatePolls(data.polls);\n } else {\n polls = [data.poll];\n updatePolls(polls);\n }\n\n let tempPoll: Poll | { id: string } = { id: '' };\n\n if (poll) {\n tempPoll = { ...poll };\n }\n\n if (data.status !== 'ended') {\n poll = data.poll;\n updatePoll(data.poll);\n }\n\n if (data.status === 'started' && islevel !== '2') {\n if (!poll.voters || (poll.voters && !poll.voters[member])) {\n showAlert?.({\n message: 'New poll started',\n type: 'success',\n duration: 3000,\n });\n updateIsPollModalVisible(true);\n }\n } else if (data.status === 'ended') {\n if (tempPoll.id === data.poll.id) {\n showAlert?.({ message: 'Poll ended', type: 'danger', duration: 3000 });\n updatePoll(data.poll);\n }\n }\n } catch {\n }\n};","import { Socket } from 'socket.io-client';\nimport type {\n CreateMediaSFURoomOptions,\n CreateRoomOnMediaSFUType,\n RecordingParams,\n MeetingRoomParams,\n ResponseLocalConnectionData,\n PreJoinPageParameters,\n} from '../../types/types';\nimport { checkLimitsAndMakeRequest } from '../utils/checkLimitsAndMakeRequest';\n\n/**\n * Parameters for creating a local room\n */\nexport interface CreateLocalRoomParameters {\n eventID: string;\n duration: number;\n capacity: number;\n userName: string;\n scheduledDate: Date;\n secureCode: string;\n waitRoom?: boolean;\n recordingParams?: RecordingParams;\n eventRoomParams?: MeetingRoomParams;\n videoPreference?: string | null;\n audioPreference?: string | null;\n audioOutputPreference?: string | null;\n mediasfuURL?: string;\n}\n\n/**\n * Options for creating a local room\n */\nexport interface CreateLocalRoomOptions {\n createData: CreateLocalRoomParameters;\n link?: string;\n}\n\n/**\n * Response from creating/joining a local room\n */\nexport interface CreateJoinLocalRoomResponse {\n success: boolean;\n secret: string;\n reason?: string;\n url?: string;\n}\n\n/**\n * Options for handleCreateRoom function\n */\nexport interface HandleCreateRoomOptions {\n payload: CreateMediaSFURoomOptions;\n localLink?: string;\n connectMediaSFU?: boolean;\n apiUserName: string;\n apiKey: string;\n validate?: boolean;\n parameters: PreJoinPageParameters;\n initSocket?: Socket;\n localData?: ResponseLocalConnectionData;\n createMediaSFURoom: CreateRoomOnMediaSFUType;\n}\n\n/**\n * Handles room creation with MediaSFU and/or local server\n * \n * @param {HandleCreateRoomOptions} options - Configuration for creating a room\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleCreateRoom({\n * payload: {\n * action: 'create',\n * duration: 30,\n * capacity: 10,\n * eventType: 'conference',\n * userName: 'John Doe',\n * recordOnly: false,\n * },\n * apiUserName: 'user123',\n * apiKey: 'key123',\n * parameters,\n * createMediaSFURoom,\n * });\n * ```\n */\nexport async function handleCreateRoom({\n payload,\n localLink = '',\n connectMediaSFU = true,\n apiUserName,\n apiKey,\n validate = true,\n parameters,\n initSocket,\n localData,\n createMediaSFURoom,\n}: HandleCreateRoomOptions): Promise<void> {\n const {\n updateIsLoadingModalVisible,\n updateSocket,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n updateValidated,\n showAlert,\n } = parameters;\n\n /**\n * Creates a local room by emitting to the socket\n */\n const createLocalRoom = async ({\n createData,\n link = localLink,\n }: CreateLocalRoomOptions) => {\n initSocket?.emit('createRoom', createData, (response: CreateJoinLocalRoomResponse) => {\n if (response.success) {\n updateSocket(initSocket!);\n updateApiUserName(localData?.apiUserName || '');\n updateApiToken(response.secret);\n updateLink(link);\n updateRoomName(createData.eventID);\n // local needs islevel updated from here\n // we update member as `userName` + \"_2\" and split it in the room\n updateMember(createData.userName + '_2');\n updateIsLoadingModalVisible(false);\n updateValidated(true);\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${response.reason}`,\n type: 'danger',\n duration: 3000,\n });\n }\n });\n };\n\n /**\n * Creates a room on MediaSFU\n */\n const roomCreator = async ({\n payload: createPayload,\n apiUserName: userName,\n apiKey: key,\n validate: shouldValidate = true,\n }: {\n payload: CreateMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n validate?: boolean;\n }) => {\n const response = await createMediaSFURoom({\n payload: createPayload,\n apiUserName: userName,\n apiKey: key,\n localLink: localLink,\n });\n if (response.success && response.data && 'roomName' in response.data) {\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response!.data.link,\n userName: createPayload.userName,\n parameters: parameters,\n validate: shouldValidate,\n });\n return response;\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${\n response.data ? ('error' in response.data ? response.data.error : '') : ''\n }`,\n type: 'danger',\n duration: 3000,\n });\n }\n };\n\n updateIsLoadingModalVisible(true);\n\n if (localLink.length > 0) {\n const secureCode =\n Math.random().toString(30).substring(2, 14) +\n Math.random().toString(30).substring(2, 14);\n let eventID =\n new Date().getTime().toString(30) +\n new Date().getUTCMilliseconds() +\n Math.floor(10 + Math.random() * 99).toString();\n eventID = 'm' + eventID;\n const eventRoomParams = localData?.meetingRoomParams_;\n if (eventRoomParams && payload.eventType) {\n eventRoomParams.type = payload.eventType;\n }\n\n const createData: CreateLocalRoomParameters = {\n eventID: eventID,\n duration: payload.duration,\n capacity: payload.capacity,\n userName: payload.userName,\n scheduledDate: new Date(),\n secureCode: secureCode,\n waitRoom: false,\n recordingParams: localData?.recordingParams_,\n eventRoomParams: eventRoomParams,\n videoPreference: null,\n audioPreference: null,\n audioOutputPreference: null,\n mediasfuURL: '',\n };\n\n if (connectMediaSFU && initSocket && localData && localData.apiUserName && localData.apiKey) {\n // Store references to prevent race conditions\n const localApiUserName = localData.apiUserName;\n const localApiKey = localData.apiKey;\n\n // Build a unique identifier for this create request\n const roomIdentifier = `local_create_${payload.userName}_${payload.duration}_${payload.capacity}`;\n const pendingKey = `prejoin_pending_${roomIdentifier}`;\n const PENDING_TIMEOUT = 30 * 1000; // 30 seconds\n\n // Check pending status to prevent duplicate requests\n try {\n const pendingRequest = localStorage.getItem(pendingKey);\n if (pendingRequest) {\n const pendingData = JSON.parse(pendingRequest);\n const timeSincePending = Date.now() - (pendingData?.timestamp ?? 0);\n if (timeSincePending < PENDING_TIMEOUT) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: 'Room creation already in progress',\n type: 'danger',\n duration: 3000,\n });\n return;\n } else {\n // Stale lock, clear it\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }\n }\n } catch {\n // Ignore localStorage read/JSON errors\n }\n\n // Mark request as pending\n try {\n localStorage.setItem(\n pendingKey,\n JSON.stringify({\n timestamp: Date.now(),\n payload: {\n action: 'create',\n userName: payload.userName,\n duration: payload.duration,\n capacity: payload.capacity,\n },\n })\n );\n\n // Auto-clear the pending flag after timeout to avoid stale locks\n setTimeout(() => {\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }, PENDING_TIMEOUT);\n } catch {\n // Ignore localStorage write errors\n }\n\n payload.recordOnly = true; // allow production to mediasfu only; no consumption\n\n try {\n const response = await roomCreator({\n payload,\n apiUserName: localApiUserName,\n apiKey: localApiKey,\n validate: false,\n });\n\n // Clear pending status on completion\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n\n if (response && response.success && response.data && 'roomName' in response.data) {\n createData.eventID = response.data.roomName;\n createData.secureCode = response.data.secureCode || '';\n createData.mediasfuURL = response.data.publicURL;\n await createLocalRoom({\n createData: createData,\n link: response.data.link,\n });\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room on MediaSFU.`,\n type: 'danger',\n duration: 3000,\n });\n try {\n updateSocket(initSocket);\n await createLocalRoom({ createData: createData });\n } catch (error) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch (error) {\n // Clear pending status on error\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room on MediaSFU. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n } else {\n try {\n updateSocket(initSocket!);\n await createLocalRoom({ createData: createData });\n } catch (error) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } else {\n // Build a unique identifier for this create request (non-local)\n const roomIdentifier = `mediasfu_create_${payload.userName}_${payload.duration}_${payload.capacity}`;\n const pendingKey = `prejoin_pending_${roomIdentifier}`;\n const PENDING_TIMEOUT = 30 * 1000; // 30 seconds\n\n // Check pending status to prevent duplicate requests\n try {\n const pendingRequest = localStorage.getItem(pendingKey);\n if (pendingRequest) {\n const pendingData = JSON.parse(pendingRequest);\n const timeSincePending = Date.now() - (pendingData?.timestamp ?? 0);\n if (timeSincePending < PENDING_TIMEOUT) {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: 'Room creation already in progress',\n type: 'danger',\n duration: 3000,\n });\n return;\n } else {\n // Stale lock, clear it\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }\n }\n } catch {\n // Ignore localStorage read/JSON errors\n }\n\n // Mark request as pending\n try {\n localStorage.setItem(\n pendingKey,\n JSON.stringify({\n timestamp: Date.now(),\n payload: {\n action: 'create',\n userName: payload.userName,\n duration: payload.duration,\n capacity: payload.capacity,\n },\n })\n );\n\n // Auto-clear the pending flag after timeout to avoid stale locks\n setTimeout(() => {\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n // Ignore localStorage errors\n }\n }, PENDING_TIMEOUT);\n } catch {\n // Ignore localStorage write errors\n }\n\n try {\n await roomCreator({\n payload,\n apiUserName: apiUserName,\n apiKey: apiKey,\n validate: validate,\n });\n\n // Clear pending status on completion\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n } catch (error) {\n // Clear pending status on error\n try {\n localStorage.removeItem(pendingKey);\n } catch {\n /* ignore */\n }\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to create room. ${error}`,\n type: 'danger',\n duration: 3000,\n });\n }\n }\n}\n","import { Socket } from 'socket.io-client';\nimport type {\n JoinMediaSFURoomOptions,\n JoinRoomOnMediaSFUType,\n PreJoinPageParameters,\n} from '../../types/types';\nimport { checkLimitsAndMakeRequest } from '../utils/checkLimitsAndMakeRequest';\nimport type { CreateJoinLocalRoomResponse } from './handleCreateRoom';\n\n/**\n * Parameters for joining a local event room\n */\nexport interface JoinLocalEventRoomParameters {\n eventID: string;\n userName: string;\n secureCode?: string;\n videoPreference?: string | null;\n audioPreference?: string | null;\n audioOutputPreference?: string | null;\n}\n\n/**\n * Options for joining a local event room\n */\nexport interface JoinLocalEventRoomOptions {\n joinData: JoinLocalEventRoomParameters;\n link?: string;\n}\n\n/**\n * Options for handleJoinRoom function\n */\nexport interface HandleJoinRoomOptions {\n payload: JoinMediaSFURoomOptions;\n localLink?: string;\n apiUserName: string;\n apiKey: string;\n parameters: PreJoinPageParameters;\n initSocket?: Socket;\n localData?: any;\n joinMediaSFURoom: JoinRoomOnMediaSFUType;\n}\n\n/**\n * Handles joining an existing room on MediaSFU or local server\n * \n * @param {HandleJoinRoomOptions} options - Configuration for joining a room\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleJoinRoom({\n * payload: {\n * action: 'join',\n * meetingID: 'room123',\n * userName: 'John Doe',\n * },\n * apiUserName: 'user123',\n * apiKey: 'key123',\n * parameters,\n * joinMediaSFURoom,\n * });\n * ```\n */\nexport async function handleJoinRoom({\n payload,\n localLink = '',\n apiUserName,\n apiKey,\n parameters,\n initSocket,\n localData,\n joinMediaSFURoom,\n}: HandleJoinRoomOptions): Promise<void> {\n const {\n updateIsLoadingModalVisible,\n updateSocket,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n updateValidated,\n showAlert,\n } = parameters;\n\n /**\n * Joins a local room by emitting to the socket\n */\n const joinLocalRoom = async ({ joinData, link = localLink }: JoinLocalEventRoomOptions) => {\n initSocket?.emit('joinEventRoom', joinData, (response: CreateJoinLocalRoomResponse) => {\n if (response.success) {\n updateSocket(initSocket!);\n updateApiUserName(localData?.apiUserName || '');\n updateApiToken(response.secret);\n updateLink(link);\n updateRoomName(joinData.eventID);\n updateMember(joinData.userName);\n updateIsLoadingModalVisible(false);\n updateValidated(true);\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to join room. ${response.reason}`,\n type: 'danger',\n duration: 3000,\n });\n }\n });\n };\n\n if (localLink.length > 0 && !localLink.includes('mediasfu.com')) {\n const joinData: JoinLocalEventRoomParameters = {\n eventID: payload.meetingID,\n userName: payload.userName,\n secureCode: '',\n videoPreference: null,\n audioPreference: null,\n audioOutputPreference: null,\n };\n\n await joinLocalRoom({ joinData: joinData });\n return;\n }\n\n updateIsLoadingModalVisible(true);\n\n const response = await joinMediaSFURoom({\n payload,\n apiUserName: apiUserName,\n apiKey: apiKey,\n localLink: localLink,\n });\n\n if (response.success && response.data && 'roomName' in response.data) {\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response.data.link,\n userName: payload.userName,\n parameters: parameters,\n });\n } else {\n updateIsLoadingModalVisible(false);\n showAlert?.({\n message: `Unable to join room. ${\n response.data ? ('error' in response.data ? response.data.error : '') : ''\n }`,\n type: 'danger',\n duration: 3000,\n });\n }\n}\n","import type { ShowAlert } from '../../types/types'\n\nexport interface CheckPauseStateOptions {\n recordingMediaOptions: string\n recordingVideoPausesLimit: number\n recordingAudioPausesLimit: number\n pauseRecordCount: number\n showAlert?: ShowAlert\n}\n\nexport type CheckPauseStateType = (options: CheckPauseStateOptions) => Promise<boolean>\n\n/**\n * Checks if the recording can be paused based on the current pause count and the allowed pause limits.\n *\n * @param {Object} options - The options for checking the pause state.\n * @param {string} options.recordingMediaOptions - The type of media being recorded (\"video\" or \"audio\").\n * @param {number} options.recordingVideoPausesLimit - The maximum number of pauses allowed for video recordings.\n * @param {number} options.recordingAudioPausesLimit - The maximum number of pauses allowed for audio recordings.\n * @param {number} options.pauseRecordCount - The current count of pauses that have been made.\n * @param {Function} options.showAlert - Function to show an alert message if the pause limit is reached.\n *\n * @returns {Promise<boolean>} - Resolves to `true` if the recording can be paused, otherwise `false`.\n *\n * @example\n * ```typescript\n * const canPause = await checkPauseState({\n * recordingMediaOptions: 'audio',\n * recordingVideoPausesLimit: 3,\n * recordingAudioPausesLimit: 5,\n * pauseRecordCount: 4,\n * showAlert: ({ message }) => console.log(message),\n * })\n * ```\n */\nexport const checkPauseState: CheckPauseStateType = async ({\n recordingMediaOptions,\n recordingVideoPausesLimit,\n recordingAudioPausesLimit,\n pauseRecordCount,\n showAlert,\n}) => {\n const refLimit = recordingMediaOptions === 'video'\n ? recordingVideoPausesLimit\n : recordingAudioPausesLimit\n\n if (pauseRecordCount < refLimit) {\n return true\n }\n\n showAlert?.({\n message: 'You have reached the limit of pauses - you can choose to stop recording.',\n type: 'danger',\n duration: 3000,\n })\n return false\n}\n","export interface CheckResumeStateOptions {\n recordingMediaOptions: string\n recordingVideoPausesLimit: number\n recordingAudioPausesLimit: number\n pauseRecordCount: number\n}\n\nexport type CheckResumeStateType = (options: CheckResumeStateOptions) => Promise<boolean>\n\n/**\n * Checks if the recording can be resumed based on the media type and pause limits.\n *\n * @param {Object} options - The options for checking resume state.\n * @param {string} options.recordingMediaOptions - The type of media being recorded (\"video\" or \"audio\").\n * @param {number} options.recordingVideoPausesLimit - The maximum number of pauses allowed for video recording.\n * @param {number} options.recordingAudioPausesLimit - The maximum number of pauses allowed for audio recording.\n * @param {number} options.pauseRecordCount - The current number of pauses that have occurred.\n *\n * @returns {Promise<boolean>} - Resolves to `true` if the recording can be resumed, otherwise `false`.\n *\n * @example\n * ```typescript\n * const canResume = await checkResumeState({\n * recordingMediaOptions: 'video',\n * recordingVideoPausesLimit: 3,\n * recordingAudioPausesLimit: 5,\n * pauseRecordCount: 2,\n * })\n * ```\n */\nexport const checkResumeState: CheckResumeStateType = async ({\n recordingMediaOptions,\n recordingVideoPausesLimit,\n recordingAudioPausesLimit,\n pauseRecordCount,\n}) => {\n const refLimit = recordingMediaOptions === 'video'\n ? recordingVideoPausesLimit\n : recordingAudioPausesLimit\n\n return pauseRecordCount <= refLimit\n}\n","import type {\n ShowAlert,\n MainSpecs,\n DispSpecs,\n TextSpecs,\n EventType,\n UserRecordingParams,\n} from '../../types/types'\n\nexport interface ConfirmRecordingParameters {\n showAlert?: ShowAlert\n recordingMediaOptions: string\n recordingAudioOptions: string\n recordingVideoOptions: string\n recordingVideoType: string\n recordingDisplayType: 'video' | 'media' | 'all'\n recordingNameTags: boolean\n recordingBackgroundColor: string\n recordingNameTagsColor: string\n recordingOrientationVideo: string\n recordingAddHLS: boolean\n recordingAddText: boolean\n recordingCustomText: string\n recordingCustomTextPosition: string\n recordingCustomTextColor: string\n meetingDisplayType: string\n recordingVideoParticipantsFullRoomSupport: boolean\n recordingAllParticipantsSupport: boolean\n recordingVideoParticipantsSupport: boolean\n recordingSupportForOtherOrientation: boolean\n recordingPreferredOrientation: string\n recordingMultiFormatsSupport: boolean\n recordingVideoOptimized: boolean\n recordingAllParticipantsFullRoomSupport: boolean\n meetingVideoOptimized: boolean\n eventType: EventType\n breakOutRoomStarted: boolean\n breakOutRoomEnded: boolean\n updateRecordingDisplayType: (value: 'video' | 'media' | 'all') => void\n updateRecordingVideoOptimized: (value: boolean) => void\n updateUserRecordingParams: (params: UserRecordingParams) => void\n updateConfirmedToRecord: (value: boolean) => void\n getUpdatedAllParams: () => ConfirmRecordingParameters\n [key: string]: any\n}\n\nexport interface ConfirmRecordingOptions {\n parameters: ConfirmRecordingParameters\n}\n\nexport type ConfirmRecordingType = (options: ConfirmRecordingOptions) => Promise<void>\n\nconst ALERT_DURATION = 6000\nconst FULL_PARTICIPANT_RECORDING_ALERT_MESSAGE =\n 'You are not allowed to record videos of all participants while the meeting display is set to All. Switch the meeting display to Media and try again.'\n\n/**\n * Confirms the recording settings based on the provided parameters and updates the recording state.\n */\nexport const confirmRecording: ConfirmRecordingType = async ({\n parameters,\n}) => {\n parameters = parameters.getUpdatedAllParams()\n\n let {\n showAlert,\n recordingMediaOptions,\n recordingAudioOptions,\n recordingVideoOptions,\n recordingVideoType,\n recordingDisplayType,\n recordingNameTags,\n recordingBackgroundColor,\n recordingNameTagsColor,\n recordingOrientationVideo,\n recordingAddHLS,\n recordingAddText,\n recordingCustomText,\n recordingCustomTextPosition,\n recordingCustomTextColor,\n meetingDisplayType,\n recordingVideoParticipantsFullRoomSupport,\n recordingAllParticipantsSupport,\n recordingVideoParticipantsSupport,\n recordingSupportForOtherOrientation,\n recordingPreferredOrientation,\n recordingMultiFormatsSupport,\n recordingVideoOptimized,\n recordingAllParticipantsFullRoomSupport,\n meetingVideoOptimized,\n eventType,\n breakOutRoomStarted,\n breakOutRoomEnded,\n updateRecordingDisplayType,\n updateRecordingVideoOptimized,\n updateUserRecordingParams,\n updateConfirmedToRecord,\n } = parameters\n\n if (\n !recordingVideoParticipantsFullRoomSupport &&\n recordingVideoOptions === 'all' &&\n recordingMediaOptions === 'video'\n ) {\n if (meetingDisplayType === 'all' && !(breakOutRoomStarted && !breakOutRoomEnded)) {\n showAlert?.({\n message: FULL_PARTICIPANT_RECORDING_ALERT_MESSAGE,\n type: 'danger',\n duration: ALERT_DURATION,\n })\n return\n }\n }\n\n if (!recordingAllParticipantsSupport && recordingVideoOptions === 'all') {\n showAlert?.({\n message: 'You are only allowed to record yourself.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n return\n }\n\n if (!recordingVideoParticipantsSupport && recordingDisplayType === 'video') {\n showAlert?.({\n message: 'You are not allowed to record other video participants.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n return\n }\n\n if (!recordingSupportForOtherOrientation && recordingOrientationVideo === 'all') {\n showAlert?.({\n message: 'You are not allowed to record all orientations.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n return\n }\n\n if (\n (recordingPreferredOrientation === 'landscape' && recordingOrientationVideo === 'portrait') ||\n (recordingPreferredOrientation === 'portrait' && recordingOrientationVideo === 'landscape')\n ) {\n if (!recordingSupportForOtherOrientation) {\n showAlert?.({\n message: 'You are not allowed to record this orientation.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n return\n }\n }\n\n if (!recordingMultiFormatsSupport && recordingVideoType === 'all') {\n showAlert?.({\n message: 'You are not allowed to record all formats.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n return\n }\n\n if (eventType !== 'broadcast') {\n if (recordingMediaOptions === 'video') {\n if (meetingDisplayType === 'media' && recordingDisplayType === 'all') {\n showAlert?.({\n message:\n 'Recording display type can be either video, video optimized, or media when meeting display type is media.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n updateRecordingDisplayType(meetingDisplayType as 'video' | 'media' | 'all')\n return\n }\n\n if (meetingDisplayType === 'video') {\n if (recordingDisplayType === 'all' || recordingDisplayType === 'media') {\n showAlert?.({\n message:\n 'Recording display type can be either video or video optimized when meeting display type is video.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n updateRecordingDisplayType(meetingDisplayType as 'video' | 'media' | 'all')\n return\n }\n\n if (meetingVideoOptimized && !recordingVideoOptimized) {\n showAlert?.({\n message:\n 'Recording display type can only be video optimized when meeting display type is video optimized.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n updateRecordingVideoOptimized(meetingVideoOptimized)\n return\n }\n }\n } else {\n updateRecordingDisplayType('media')\n updateRecordingVideoOptimized(false)\n }\n }\n\n if (recordingDisplayType === 'all' && !recordingAllParticipantsFullRoomSupport) {\n showAlert?.({\n message: 'You can only record all participants with media.',\n type: 'danger',\n duration: ALERT_DURATION,\n })\n return\n }\n\n const mainSpecs: MainSpecs = {\n mediaOptions: recordingMediaOptions,\n audioOptions: recordingAudioOptions,\n videoOptions: recordingVideoOptions,\n videoType: recordingVideoType,\n videoOptimized: recordingVideoOptimized,\n recordingDisplayType,\n addHLS: recordingAddHLS,\n }\n\n const dispSpecs: DispSpecs = {\n nameTags: recordingNameTags,\n backgroundColor: recordingBackgroundColor,\n nameTagsColor: recordingNameTagsColor,\n orientationVideo: recordingOrientationVideo,\n }\n\n const textSpecs: TextSpecs = {\n addText: recordingAddText,\n customText: recordingCustomText,\n customTextPosition: recordingCustomTextPosition,\n customTextColor: recordingCustomTextColor,\n }\n\n const userRecordingParams = { mainSpecs, dispSpecs, textSpecs }\n\n updateUserRecordingParams(userRecordingParams)\n updateConfirmedToRecord(true)\n}\n","import type { ShowAlert } from '../../types/types'\n\nexport interface LaunchRecordingOptions {\n updateIsRecordingModalVisible: (visible: boolean) => void\n isRecordingModalVisible: boolean\n showAlert?: ShowAlert\n stopLaunchRecord: boolean\n canLaunchRecord: boolean\n recordingAudioSupport: boolean\n recordingVideoSupport: boolean\n updateCanRecord: (canRecord: boolean) => void\n updateClearedToRecord: (cleared: boolean) => void\n recordStarted: boolean\n recordPaused: boolean\n localUIMode: boolean\n [key: string]: any\n}\n\nexport type LaunchRecordingType = (options: LaunchRecordingOptions) => void\n\n/**\n * Launches the recording process based on various conditions and updates the UI accordingly.\n *\n * @param {Object} options - The options for launching the recording.\n * @param {Function} options.updateIsRecordingModalVisible - Function to update the visibility of the recording modal.\n * @param {boolean} options.isRecordingModalVisible - Indicates if the recording modal is currently visible.\n * @param {Function} options.showAlert - Function to show an alert message.\n * @param {boolean} options.stopLaunchRecord - Indicates if the recording launch should be stopped.\n * @param {boolean} options.canLaunchRecord - Indicates if the recording can be launched.\n * @param {boolean} options.recordingAudioSupport - Indicates if audio recording is supported.\n * @param {boolean} options.recordingVideoSupport - Indicates if video recording is supported.\n * @param {Function} options.updateCanRecord - Function to update the recording capability.\n * @param {Function} options.updateClearedToRecord - Function to update the cleared-to-record status.\n * @param {boolean} options.recordStarted - Indicates if the recording has started.\n * @param {boolean} options.recordPaused - Indicates if the recording is paused.\n * @param {boolean} options.localUIMode - Indicates if the local UI mode is active.\n *\n * @returns {void}\n *\n * @example\n * ```typescript\n * launchRecording({\n * updateIsRecordingModalVisible: (visible) => console.log(`Modal visible: ${visible}`),\n * isRecordingModalVisible: false,\n * showAlert: (alert) => console.log(alert.message),\n * stopLaunchRecord: false,\n * canLaunchRecord: true,\n * recordingAudioSupport: true,\n * recordingVideoSupport: true,\n * updateCanRecord: (canRecord) => console.log(`Can record: ${canRecord}`),\n * updateClearedToRecord: (cleared) => console.log(`Cleared to record: ${cleared}`),\n * recordStarted: false,\n * recordPaused: false,\n * localUIMode: false,\n * })\n * ```\n */\nexport const launchRecording: LaunchRecordingType = ({\n updateIsRecordingModalVisible,\n isRecordingModalVisible,\n showAlert,\n stopLaunchRecord,\n canLaunchRecord,\n recordingAudioSupport,\n recordingVideoSupport,\n updateCanRecord,\n updateClearedToRecord,\n recordStarted,\n recordPaused,\n localUIMode,\n}) => {\n if (!isRecordingModalVisible && stopLaunchRecord && !localUIMode) {\n showAlert?.({\n message: 'Recording has already ended or you are not allowed to record',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (!isRecordingModalVisible && canLaunchRecord && !localUIMode) {\n if (!recordingAudioSupport && !recordingVideoSupport) {\n showAlert?.({\n message: 'You are not allowed to record',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n updateClearedToRecord(false)\n updateCanRecord(false)\n }\n\n if (!isRecordingModalVisible && recordStarted && !recordPaused) {\n showAlert?.({\n message: 'You can only re-configure recording after pausing it',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (!isRecordingModalVisible && !recordingAudioSupport && !recordingVideoSupport && !localUIMode) {\n showAlert?.({\n message: 'You are not allowed to record',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n updateIsRecordingModalVisible(!isRecordingModalVisible)\n}\n","import type { ShowAlert } from '../../types/types'\n\nexport interface RecordPauseTimerOptions {\n stop?: boolean\n isTimerRunning: boolean\n canPauseResume: boolean\n showAlert?: ShowAlert\n}\n\nexport type RecordPauseTimerType = (options: RecordPauseTimerOptions) => boolean\n\n/**\n * Records the pause timer.\n *\n * @param {RecordPauseTimerOptions} options - The options for recording the pause timer.\n * @param {boolean} options.stop - A flag to stop the timer.\n * @param {boolean} options.isTimerRunning - Indicates if the timer is running.\n * @param {boolean} options.canPauseResume - Indicates if the timer can be paused or resumed.\n * @param {Function} options.showAlert - Function to show alerts.\n *\n * @returns {boolean} `true` if the timer can be paused or resumed, otherwise `false`.\n *\n * @example\n * ```typescript\n * const canPause = recordPauseTimer({\n * stop: false,\n * isTimerRunning: true,\n * canPauseResume: true,\n * showAlert: (alert) => console.log(alert.message),\n * })\n * ```\n */\nexport const recordPauseTimer: RecordPauseTimerType = ({\n stop = false,\n isTimerRunning,\n canPauseResume,\n showAlert,\n}) => {\n if (isTimerRunning && canPauseResume) {\n return true\n }\n\n const message = stop\n ? 'Can only stop after 15 seconds of starting or pausing or resuming recording'\n : 'Can only pause or resume after 15 seconds of starting or pausing or resuming recording'\n\n showAlert?.({\n message,\n type: 'danger',\n })\n return false\n}\n","export interface RecordUpdateTimerOptions {\n recordElapsedTime: number\n recordStartTime: number\n updateRecordElapsedTime: (elapsedTime: number) => void\n updateRecordingProgressTime: (formattedTime: string) => void\n}\n\nexport type RecordUpdateTimerType = (options: RecordUpdateTimerOptions) => void\n\n/**\n * Updates the recording timer by calculating the elapsed time since the recording started\n * and formatting it in HH:MM:SS format.\n *\n * @param {RecordUpdateTimerOptions} options - The options object.\n * @param {number} options.recordElapsedTime - The elapsed recording time in seconds.\n * @param {number} options.recordStartTime - The timestamp when the recording started.\n * @param {Function} options.updateRecordElapsedTime - Callback to update the elapsed recording time.\n * @param {Function} options.updateRecordingProgressTime - Callback to update the formatted recording time.\n *\n * @example\n * ```typescript\n * recordUpdateTimer({\n * recordElapsedTime: 0,\n * recordStartTime: Date.now(),\n * updateRecordElapsedTime: (elapsedTime) => console.log('Elapsed:', elapsedTime),\n * updateRecordingProgressTime: (formatted) => console.log('Progress:', formatted),\n * })\n * ```\n */\nexport const recordUpdateTimer: RecordUpdateTimerType = ({\n recordElapsedTime,\n recordStartTime,\n updateRecordElapsedTime,\n updateRecordingProgressTime,\n}) => {\n const padNumber = (value: number): string => value.toString().padStart(2, '0')\n\n const currentTime = new Date().getTime()\n let elapsedSeconds = recordElapsedTime\n elapsedSeconds = Math.floor((currentTime - recordStartTime) / 1000)\n updateRecordElapsedTime(elapsedSeconds)\n\n const hours = Math.floor(elapsedSeconds / 3600)\n const minutes = Math.floor((elapsedSeconds % 3600) / 60)\n const seconds = elapsedSeconds % 60\n const formattedTime = `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`\n\n updateRecordingProgressTime(formattedTime)\n}\n","import type { ShowAlert } from '../../types/types'\nimport { recordUpdateTimer } from './recordUpdateTimer'\n\nexport interface RecordResumeTimerParameters {\n isTimerRunning: boolean\n canPauseResume: boolean\n recordElapsedTime: number\n recordStartTime: number\n recordTimerInterval?: ReturnType<typeof setInterval> | null\n showAlert?: ShowAlert\n recordPaused: boolean\n recordStopped: boolean\n roomName: string | null\n updateRecordStartTime: (time: number) => void\n updateRecordTimerInterval: (interval: ReturnType<typeof setInterval> | null) => void\n updateIsTimerRunning: (isRunning: boolean) => void\n updateCanPauseResume: (canPause: boolean) => void\n updateRecordElapsedTime: (elapsed: number) => void\n updateRecordingProgressTime: (formatted: string) => void\n getUpdatedAllParams: () => RecordResumeTimerParameters\n [key: string]: any\n}\n\nexport interface RecordResumeTimerOptions {\n parameters: RecordResumeTimerParameters\n}\n\nexport type RecordResumeTimerType = (options: RecordResumeTimerOptions) => Promise<boolean>\n\n/**\n * Resumes the recording timer if it is not already running and can be paused/resumed.\n */\nexport const recordResumeTimer: RecordResumeTimerType = async ({ parameters }) => {\n const { getUpdatedAllParams } = parameters\n parameters = getUpdatedAllParams()\n\n let {\n isTimerRunning,\n canPauseResume,\n recordElapsedTime,\n recordStartTime,\n recordTimerInterval,\n showAlert,\n updateRecordStartTime,\n updateRecordTimerInterval,\n updateIsTimerRunning,\n updateCanPauseResume,\n } = parameters\n\n if (!isTimerRunning && canPauseResume) {\n recordStartTime = new Date().getTime() - recordElapsedTime * 1000\n updateRecordStartTime(recordStartTime)\n\n recordTimerInterval = setInterval(() => {\n recordUpdateTimer({\n recordElapsedTime,\n recordStartTime,\n updateRecordElapsedTime: parameters.updateRecordElapsedTime,\n updateRecordingProgressTime: parameters.updateRecordingProgressTime,\n })\n\n parameters = getUpdatedAllParams()\n\n if (\n parameters.recordPaused ||\n parameters.recordStopped ||\n parameters.roomName === '' ||\n parameters.roomName === null\n ) {\n clearInterval(recordTimerInterval!)\n updateRecordTimerInterval(null)\n isTimerRunning = false\n updateIsTimerRunning(isTimerRunning)\n canPauseResume = false\n updateCanPauseResume(canPauseResume)\n }\n }, 1000)\n\n updateRecordTimerInterval(recordTimerInterval!)\n isTimerRunning = true\n updateIsTimerRunning(isTimerRunning)\n canPauseResume = false\n updateCanPauseResume(canPauseResume)\n return true\n }\n\n showAlert?.({\n type: 'danger',\n message: 'Can only pause or resume after 15 seconds of starting or pausing or resuming recording',\n })\n return false\n}\n","import { recordUpdateTimer } from './recordUpdateTimer'\n\nexport interface RecordStartTimerParameters {\n recordStartTime: number\n recordTimerInterval?: ReturnType<typeof setInterval> | null\n isTimerRunning: boolean\n canPauseResume: boolean\n recordChangeSeconds: number\n recordPaused: boolean\n recordStopped: boolean\n roomName: string | null\n updateRecordStartTime: (time: number) => void\n updateRecordTimerInterval: (interval: ReturnType<typeof setInterval> | null) => void\n updateIsTimerRunning: (isRunning: boolean) => void\n updateCanPauseResume: (canPause: boolean) => void\n recordElapsedTime: number\n updateRecordElapsedTime: (elapsed: number) => void\n updateRecordingProgressTime: (formatted: string) => void\n getUpdatedAllParams: () => RecordStartTimerParameters\n [key: string]: any\n}\n\nexport interface RecordStartTimerOptions {\n parameters: RecordStartTimerParameters\n}\n\nexport type RecordStartTimerType = (options: RecordStartTimerOptions) => Promise<void>\n\n/**\n * Starts a recording timer and manages its state.\n *\n * @param {RecordStartTimerOptions} options - The options for starting the recording timer.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * @param {number} options.parameters.recordStartTime - The start time of the recording.\n * @param {number | null} options.parameters.recordTimerInterval - The interval ID for the recording timer.\n * @param {boolean} options.parameters.isTimerRunning - Flag indicating if the timer is running.\n * @param {boolean} options.parameters.canPauseResume - Flag indicating if pause/resume actions are enabled.\n * @param {number} options.parameters.recordChangeSeconds - The time after which pause/resume actions are enabled.\n * @param {Function} options.parameters.updateRecordStartTime - Function to update the recording start time.\n * @param {Function} options.parameters.updateRecordTimerInterval - Function to update the recording timer interval.\n * @param {Function} options.parameters.updateIsTimerRunning - Function to update the timer running state.\n * @param {Function} options.parameters.updateCanPauseResume - Function to update the pause/resume state.\n *\n * @example\n * ```typescript\n * await recordStartTimer({ parameters })\n * ```\n */\nexport const recordStartTimer: RecordStartTimerType = async ({ parameters }) => {\n const { getUpdatedAllParams } = parameters\n parameters = getUpdatedAllParams()\n\n let {\n recordStartTime,\n recordTimerInterval,\n isTimerRunning,\n canPauseResume,\n recordChangeSeconds,\n updateRecordStartTime,\n updateRecordTimerInterval,\n updateIsTimerRunning,\n updateCanPauseResume,\n } = parameters\n\n const enablePauseResume = (): void => {\n canPauseResume = true\n updateCanPauseResume(canPauseResume)\n }\n\n if (!isTimerRunning) {\n recordStartTime = new Date().getTime()\n updateRecordStartTime(recordStartTime)\n\n recordTimerInterval = setInterval(() => {\n recordUpdateTimer({\n recordElapsedTime: parameters.recordElapsedTime,\n recordStartTime,\n updateRecordElapsedTime: parameters.updateRecordElapsedTime,\n updateRecordingProgressTime: parameters.updateRecordingProgressTime,\n })\n\n parameters = getUpdatedAllParams()\n\n if (\n parameters.recordPaused ||\n parameters.recordStopped ||\n parameters.roomName === '' ||\n parameters.roomName === null\n ) {\n clearInterval(recordTimerInterval!)\n updateRecordTimerInterval(null)\n isTimerRunning = false\n updateIsTimerRunning(isTimerRunning)\n canPauseResume = false\n updateCanPauseResume(canPauseResume)\n }\n }, 1000)\n\n updateRecordTimerInterval(recordTimerInterval)\n isTimerRunning = true\n updateIsTimerRunning(isTimerRunning)\n canPauseResume = false\n updateCanPauseResume(canPauseResume)\n setTimeout(enablePauseResume, recordChangeSeconds)\n }\n}\n","import type { Socket } from 'socket.io-client'\nimport {\n recordStartTimer,\n type RecordStartTimerParameters,\n} from './recordStartTimer'\nimport {\n recordResumeTimer,\n type RecordResumeTimerParameters,\n} from './recordResumeTimer'\nimport type { UserRecordingParams, ShowAlert } from '../../types/types'\n\nexport interface StartRecordingParameters\n extends RecordStartTimerParameters,\n RecordResumeTimerParameters {\n roomName: string\n userRecordingParams: UserRecordingParams\n socket: Socket\n localSocket?: Socket\n updateIsRecordingModalVisible: (visible: boolean) => void\n confirmedToRecord: boolean\n showAlert?: ShowAlert\n recordingMediaOptions: string\n videoAlreadyOn: boolean\n audioAlreadyOn: boolean\n recordStarted: boolean\n recordPaused: boolean\n recordResumed: boolean\n recordStopped: boolean\n startReport: boolean\n endReport: boolean\n canRecord: boolean\n updateClearedToRecord: (cleared: boolean) => void\n updateRecordStarted: (started: boolean) => void\n updateRecordPaused: (paused: boolean) => void\n updateRecordResumed: (resumed: boolean) => void\n updateStartReport: (started: boolean) => void\n updateEndReport: (ended: boolean) => void\n updateCanRecord: (canRecord: boolean) => void\n whiteboardStarted: boolean\n whiteboardEnded: boolean\n rePort: StartRecordingRePort\n captureCanvasStream: StartRecordingCaptureCanvasStream\n getUpdatedAllParams: () => StartRecordingParameters\n [key: string]: any\n}\n\nexport type StartRecordingRePort = (options: {\n restart?: boolean\n parameters: any\n}) => Promise<void>\n\nexport type StartRecordingCaptureCanvasStream = (options: {\n parameters: any\n start?: boolean\n}) => Promise<void>\n\nexport interface StartRecordingOptions {\n parameters: StartRecordingParameters\n}\n\nexport type StartRecordingType = (\n options: StartRecordingOptions,\n) => Promise<boolean | undefined>\n\n/**\n * Starts the recording process based on the provided parameters.\n *\n * @param {StartRecordingOptions} options - The options for starting the recording.\n * @param {object} options.parameters - The parameters required for starting the recording.\n * @param {string} options.parameters.roomName - The name of the room where recording is to be started.\n * @param {object} options.parameters.userRecordingParams - User-specific recording parameters.\n * @param {object} options.parameters.socket - The socket instance for communication.\n * @param {object} options.parameters.localSocket - The local socket instance for communication.\n * @param {function} options.parameters.updateIsRecordingModalVisible - Function to update the visibility of the recording modal.\n * @param {boolean} options.parameters.confirmedToRecord - Flag indicating if the user has confirmed to record.\n * @param {function} options.parameters.showAlert - Function to show alerts.\n * @param {string} options.parameters.recordingMediaOptions - The media options for recording (e.g., \"video\", \"audio\").\n * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if the video is already on.\n * @param {boolean} options.parameters.audioAlreadyOn - Flag indicating if the audio is already on.\n * @param {boolean} options.parameters.recordStarted - Flag indicating if the recording has started.\n * @param {boolean} options.parameters.recordPaused - Flag indicating if the recording is paused.\n * @param {boolean} options.parameters.recordResumed - Flag indicating if the recording is resumed.\n * @param {boolean} options.parameters.recordStopped - Flag indicating if the recording is stopped.\n * @param {boolean} options.parameters.startReport - Flag indicating if the start report is active.\n * @param {boolean} options.parameters.endReport - Flag indicating if the end report is active.\n * @param {boolean} options.parameters.canRecord - Flag indicating if recording is allowed.\n * @param {function} options.parameters.updateClearedToRecord - Function to update the cleared to record status.\n * @param {function} options.parameters.updateRecordStarted - Function to update the record started status.\n * @param {function} options.parameters.updateRecordPaused - Function to update the record paused status.\n * @param {function} options.parameters.updateRecordResumed - Function to update the record resumed status.\n * @param {function} options.parameters.updateStartReport - Function to update the start report status.\n * @param {function} options.parameters.updateEndReport - Function to update the end report status.\n * @param {function} options.parameters.updateCanRecord - Function to update the can record status.\n * @param {boolean} options.parameters.whiteboardStarted - Flag indicating if the whiteboard has started.\n * @param {boolean} options.parameters.whiteboardEnded - Flag indicating if the whiteboard has ended.\n * @param {function} options.parameters.rePort - Function to report the recording status.\n * @param {function} options.parameters.captureCanvasStream - Function to capture the canvas stream.\n *\n * @returns {Promise<boolean | undefined>} - A promise that resolves to a boolean indicating if the recording attempt was successful, or undefined if not applicable.\n *\n * @example\n * ```typescript\n * startRecording({\n * parameters: {\n * roomName: \"Room101\",\n * userRecordingParams: myUserRecordingParams,\n * socket: mySocket,\n * localSocket: myLocalSocket,\n * updateIsRecordingModalVisible: setIsRecordingModalVisible,\n * confirmedToRecord: true,\n * showAlert: myShowAlert,\n * recordingMediaOptions: \"video\",\n * videoAlreadyOn: true,\n * audioAlreadyOn: true,\n * recordStarted: false,\n * recordPaused: false,\n * recordResumed: false,\n * recordStopped: false,\n * startReport: false,\n * endReport: false,\n * canRecord: true,\n * updateClearedToRecord: setClearedToRecord,\n * updateRecordStarted: setRecordStarted,\n * updateRecordPaused: setRecordPaused,\n * updateRecordResumed: setRecordResumed,\n * updateStartReport: setStartReport,\n * updateEndReport: setEndReport,\n * updateCanRecord: setCanRecord,\n * whiteboardStarted: true,\n * whiteboardEnded: false,\n * rePort: myRePort,\n * captureCanvasStream: myCaptureCanvasStream,\n * },\n * })\n * ```\n */\nexport const startRecording: StartRecordingType = async ({\n parameters,\n}) => {\n parameters = parameters.getUpdatedAllParams()\n\n let {\n roomName,\n userRecordingParams,\n socket,\n localSocket,\n updateIsRecordingModalVisible,\n confirmedToRecord,\n showAlert,\n recordingMediaOptions,\n videoAlreadyOn,\n audioAlreadyOn,\n recordStarted,\n recordPaused,\n recordResumed,\n recordStopped,\n startReport,\n endReport,\n canRecord,\n updateClearedToRecord,\n updateRecordStarted,\n updateRecordPaused,\n updateRecordResumed,\n updateStartReport,\n updateEndReport,\n updateCanRecord,\n whiteboardStarted,\n whiteboardEnded,\n rePort,\n captureCanvasStream,\n } = parameters\n\n if (!confirmedToRecord) {\n showAlert?.({\n message: 'You must click confirm before you can start recording',\n type: 'danger',\n })\n return false\n }\n\n if (recordingMediaOptions === 'video' && !videoAlreadyOn) {\n showAlert?.({\n message: 'You must turn on your video before you can start recording',\n type: 'danger',\n })\n return false\n }\n\n if (recordingMediaOptions === 'audio' && !audioAlreadyOn) {\n showAlert?.({\n message: 'You must turn on your audio before you can start recording',\n type: 'danger',\n })\n return false\n }\n\n updateClearedToRecord(true)\n\n let action = 'startRecord'\n if (recordStarted && recordPaused && !recordResumed && !recordStopped) {\n action = 'resumeRecord'\n }\n\n let recAttempt = false\n const socketRef = localSocket && localSocket.connected ? localSocket : socket\n\n await new Promise<void>((resolve) => {\n socketRef.emit(\n action,\n { roomName, userRecordingParams },\n async ({ success, reason }: { success: boolean; reason: string }) => {\n if (success) {\n recordStarted = true\n startReport = true\n endReport = false\n recordPaused = false\n recAttempt = true\n\n updateRecordStarted(recordStarted)\n updateStartReport(startReport)\n updateEndReport(endReport)\n updateRecordPaused(recordPaused)\n\n if (action === 'startRecord') {\n await rePort({ parameters: parameters.getUpdatedAllParams() })\n await recordStartTimer({ parameters })\n } else {\n updateRecordResumed(true)\n await rePort({ restart: true, parameters: parameters.getUpdatedAllParams() })\n await recordResumeTimer({ parameters })\n }\n } else {\n showAlert?.({\n message: `Recording could not start - ${reason}`,\n type: 'danger',\n })\n canRecord = true\n startReport = false\n endReport = true\n recAttempt = false\n\n updateCanRecord(canRecord)\n updateStartReport(startReport)\n updateEndReport(endReport)\n }\n\n resolve()\n },\n )\n })\n\n try {\n if (\n recAttempt &&\n whiteboardStarted &&\n !whiteboardEnded &&\n recordingMediaOptions === 'video'\n ) {\n await captureCanvasStream({ parameters: parameters.getUpdatedAllParams() })\n }\n } catch (error) {\n console.error('Error capturing canvas stream:', error)\n }\n\n updateIsRecordingModalVisible(false)\n\n return recAttempt\n}\n","import type { Socket } from 'socket.io-client'\nimport { recordPauseTimer } from './recordPauseTimer'\nimport type { ShowAlert } from '../../types/types'\n\nexport interface StopRecordingParameters {\n roomName: string\n socket: Socket\n localSocket?: Socket\n showAlert?: ShowAlert\n startReport: boolean\n endReport: boolean\n recordStarted: boolean\n recordPaused: boolean\n recordStopped: boolean\n updateRecordPaused: (paused: boolean) => void\n updateRecordStopped: (stopped: boolean) => void\n updateStartReport: (startReport: boolean) => void\n updateEndReport: (endReport: boolean) => void\n updateShowRecordButtons: (show: boolean) => void\n whiteboardStarted: boolean\n whiteboardEnded: boolean\n recordingMediaOptions: string\n captureCanvasStream: (options: { parameters: any; start?: boolean }) => void\n getUpdatedAllParams: () => StopRecordingParameters\n [key: string]: any\n}\n\nexport interface StopRecordingOptions {\n parameters: StopRecordingParameters\n}\n\nexport type StopRecordingType = (options: StopRecordingOptions) => Promise<void>\n\n/**\n * Stops the recording process if it has been started and not yet stopped.\n */\nexport const stopRecording: StopRecordingType = async ({ parameters }) => {\n let {\n roomName,\n socket,\n localSocket,\n showAlert,\n startReport,\n endReport,\n recordStarted,\n recordPaused,\n recordStopped,\n updateRecordPaused,\n updateRecordStopped,\n updateStartReport,\n updateEndReport,\n updateShowRecordButtons,\n whiteboardStarted,\n whiteboardEnded,\n recordingMediaOptions,\n captureCanvasStream,\n } = parameters\n\n let recAttempt = false\n\n if (recordStarted && !recordStopped) {\n const stop = recordPauseTimer({\n stop: true,\n isTimerRunning: parameters.isTimerRunning,\n canPauseResume: parameters.canPauseResume,\n showAlert: parameters.showAlert,\n })\n\n if (stop) {\n const action = 'stopRecord'\n\n const socketRef = localSocket && localSocket.connected ? localSocket : socket\n\n await new Promise<void>((resolve) => {\n socketRef.emit(\n action,\n { roomName },\n ({ success, reason, recordState }: { success: boolean; reason: string; recordState: string }) => {\n if (success) {\n startReport = false\n endReport = true\n recordPaused = false\n recordStopped = true\n recAttempt = true\n\n updateStartReport(startReport)\n updateEndReport(endReport)\n updateRecordPaused(recordPaused)\n updateRecordStopped(recordStopped)\n showAlert?.({ message: 'Recording Stopped', type: 'success' })\n updateShowRecordButtons(false)\n } else {\n const reasonMessage = `Recording Stop Failed: ${reason}; the recording is currently ${recordState}`\n showAlert?.({ message: reasonMessage, type: 'danger' })\n recAttempt = false\n }\n\n resolve()\n },\n )\n })\n\n try {\n if (\n recAttempt &&\n whiteboardStarted &&\n !whiteboardEnded &&\n recordingMediaOptions === 'video'\n ) {\n captureCanvasStream({ parameters: parameters.getUpdatedAllParams(), start: false })\n }\n } catch (error) {\n console.error('Error capturing canvas stream:', error)\n }\n } else {\n return\n }\n } else {\n showAlert?.({\n message: 'Recording is not started yet or already stopped',\n type: 'danger',\n })\n }\n}\n","import type { Socket } from 'socket.io-client'\nimport { checkPauseState } from './checkPauseState'\nimport { checkResumeState } from './checkResumeState'\nimport { recordPauseTimer } from './recordPauseTimer'\nimport {\n recordResumeTimer,\n type RecordResumeTimerParameters,\n} from './recordResumeTimer'\nimport type { ShowAlert, UserRecordingParams } from '../../types/types'\n\nexport interface UpdateRecordingParameters extends RecordResumeTimerParameters {\n roomName: string\n userRecordingParams: UserRecordingParams\n socket: Socket\n localSocket?: Socket\n updateIsRecordingModalVisible: (visible: boolean) => void\n confirmedToRecord: boolean\n showAlert?: ShowAlert\n recordingMediaOptions: string\n videoAlreadyOn: boolean\n audioAlreadyOn: boolean\n recordStarted: boolean\n recordPaused: boolean\n recordResumed: boolean\n recordStopped: boolean\n recordChangeSeconds: number\n pauseRecordCount: number\n startReport: boolean\n endReport: boolean\n canRecord: boolean\n canPauseResume: boolean\n updateCanPauseResume: (canPauseResume: boolean) => void\n updatePauseRecordCount: (count: number) => void\n updateClearedToRecord: (cleared: boolean) => void\n updateRecordPaused: (paused: boolean) => void\n updateRecordResumed: (resumed: boolean) => void\n updateStartReport: (start: boolean) => void\n updateEndReport: (end: boolean) => void\n updateCanRecord: (canRecord: boolean) => void\n rePort: UpdateRecordingRePort\n getUpdatedAllParams: () => UpdateRecordingParameters\n [key: string]: any\n}\n\nexport type UpdateRecordingRePort = (options: {\n restart?: boolean\n parameters: any\n}) => Promise<void>\n\nexport interface UpdateRecordingOptions {\n parameters: UpdateRecordingParameters\n}\n\nexport type UpdateRecordingType = (options: UpdateRecordingOptions) => Promise<void>\n\n/**\n * Updates the recording state based on the provided parameters.\n */\nexport const updateRecording: UpdateRecordingType = async ({ parameters }) => {\n let {\n roomName,\n userRecordingParams,\n socket,\n localSocket,\n updateIsRecordingModalVisible,\n confirmedToRecord,\n showAlert,\n recordingMediaOptions,\n videoAlreadyOn,\n audioAlreadyOn,\n recordStarted,\n recordPaused,\n recordResumed,\n recordStopped,\n recordChangeSeconds,\n pauseRecordCount,\n startReport,\n endReport,\n canRecord,\n canPauseResume,\n updateCanPauseResume,\n updatePauseRecordCount,\n updateClearedToRecord,\n updateRecordPaused,\n updateRecordResumed,\n updateStartReport,\n updateEndReport,\n updateCanRecord,\n rePort,\n } = parameters\n\n if (recordStopped) {\n showAlert?.({\n message: 'Recording has already stopped',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (recordingMediaOptions === 'video' && !videoAlreadyOn) {\n showAlert?.({\n message: 'You must turn on your video before you can start recording',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n if (recordingMediaOptions === 'audio' && !audioAlreadyOn) {\n showAlert?.({\n message: 'You must turn on your audio before you can start recording',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n const socketRef = localSocket && localSocket.connected ? localSocket : socket\n\n if (recordStarted && !recordPaused && !recordStopped) {\n const proceed = await checkPauseState({\n recordingMediaOptions,\n recordingVideoPausesLimit: parameters.recordingVideoPausesLimit,\n recordingAudioPausesLimit: parameters.recordingAudioPausesLimit,\n pauseRecordCount,\n showAlert,\n })\n\n if (!proceed) return\n\n const record = recordPauseTimer({\n stop: false,\n isTimerRunning: parameters.isTimerRunning,\n canPauseResume: parameters.canPauseResume,\n showAlert,\n })\n\n if (record) {\n const action = 'pauseRecord'\n await new Promise<void>((resolve) => {\n socketRef.emit(\n action,\n { roomName },\n async ({ success, reason, recordState, pauseCount }: { success: boolean; reason: string; recordState: string; pauseCount: number }) => {\n pauseRecordCount = pauseCount\n updatePauseRecordCount(pauseRecordCount)\n\n if (success) {\n startReport = false\n endReport = true\n recordPaused = true\n updateStartReport(startReport)\n updateEndReport(endReport)\n updateRecordPaused(recordPaused)\n\n showAlert?.({\n message: 'Recording paused',\n type: 'success',\n duration: 3000,\n })\n\n updateIsRecordingModalVisible(false)\n\n setTimeout(() => {\n canPauseResume = true\n updateCanPauseResume(canPauseResume)\n }, recordChangeSeconds)\n } else {\n showAlert?.({\n message: `Recording Pause Failed: ${reason}; the current state is: ${recordState}`,\n type: 'danger',\n duration: 3000,\n })\n }\n resolve()\n },\n )\n })\n }\n } else if (recordStarted && recordPaused && !recordStopped) {\n if (!confirmedToRecord) {\n showAlert?.({\n message: 'You must click confirm before you can start recording',\n type: 'danger',\n duration: 3000,\n })\n return\n }\n\n const proceed = await checkResumeState({\n recordingMediaOptions,\n recordingVideoPausesLimit: parameters.recordingVideoPausesLimit,\n recordingAudioPausesLimit: parameters.recordingAudioPausesLimit,\n pauseRecordCount,\n })\n\n if (!proceed) return\n\n const resume = await recordResumeTimer({ parameters })\n if (resume) {\n updateClearedToRecord(true)\n\n const action = 'resumeRecord'\n await new Promise<void>((resolve) => {\n socketRef.emit(\n action,\n { roomName, userRecordingParams },\n async ({ success, reason }: { success: boolean; reason: string }) => {\n if (success) {\n recordResumed = true\n recordPaused = false\n\n updateRecordPaused(recordPaused)\n updateRecordResumed(recordResumed)\n\n await rePort({ restart: true, parameters: parameters.getUpdatedAllParams() })\n } else {\n showAlert?.({\n message: `Recording could not resume - ${reason}`,\n type: 'danger',\n duration: 3000,\n })\n }\n canRecord = true\n startReport = false\n endReport = true\n\n updateCanRecord(canRecord)\n updateStartReport(startReport)\n updateEndReport(endReport)\n\n resolve()\n },\n )\n })\n\n updateIsRecordingModalVisible(false)\n\n setTimeout(() => {\n updateCanPauseResume(true)\n }, recordChangeSeconds)\n }\n }\n}\n","export interface LaunchRequestsOptions {\n updateIsRequestsModalVisible: (isVisible: boolean) => void\n isRequestsModalVisible: boolean\n}\n\nexport type LaunchRequestsType = (options: LaunchRequestsOptions) => void\n\n/**\n * Toggles the visibility state of the requests modal.\n *\n * @param {LaunchRequestsOptions} options - The options for launching requests.\n * @param {Function} options.updateIsRequestsModalVisible - Function to update the visibility state of the requests modal.\n * @param {boolean} options.isRequestsModalVisible - Current visibility state of the requests modal.\n *\n * @example\n * ```typescript\n * launchRequests({\n * updateIsRequestsModalVisible: setRequestsModalVisible,\n * isRequestsModalVisible: true,\n * })\n * ```\n */\nexport const launchRequests: LaunchRequestsType = ({ updateIsRequestsModalVisible, isRequestsModalVisible }) => {\n updateIsRequestsModalVisible(!isRequestsModalVisible)\n}\n","import { Socket } from \"socket.io-client\";\nimport type { Request, RequestResponse } from \"../../types/types\";\n\nexport interface RespondToRequestsOptions {\n socket: Socket;\n request: Request;\n updateRequestList: (newRequestList: Request[]) => void;\n requestList?: Request[];\n action: string;\n roomName: string;\n}\n\n// Export the type definition for the function\nexport type RespondToRequestsType = (options: RespondToRequestsOptions) => Promise<void>;\n\n/**\n * Responds to incoming requests by updating the request list and emitting a response to the server.\n *\n * @param {Object} options - The options for responding to requests.\n * @param {Socket} options.socket - The socket instance used to emit the response.\n * @param {Request} options.request - The request object containing details of the request.\n * @param {Function} options.updateRequestList - The function to update the request list.\n * @param {Request[]} options.requestList - The current list of requests.\n * @param {string} options.action - The action to be taken on the request.\n * @param {string} options.roomName - The name of the room to which the response should be emitted.\n *\n * @returns {Promise<void>} A promise that resolves when the response has been emitted.\n * \n * @example\n * ```typescript\n * respondToRequests({\n * socket,\n * request: { id: \"123\", name: \"John\", icon: \"fa-microphone\" },\n * updateRequestList: setRequestList,\n * requestList: currentRequests,\n * action: \"accept\",\n * roomName: \"mainRoom\"\n * });\n * ```\n */\n\nexport const respondToRequests = async ({\n socket,\n request,\n updateRequestList,\n requestList = [],\n action,\n roomName,\n}: RespondToRequestsOptions): Promise<void> => {\n if (!request || typeof request !== \"object\") {\n return;\n }\n\n if (!updateRequestList) {\n console.warn(\"[respondToRequests] Missing updateRequestList handler; aborting emit.\");\n return;\n }\n\n const currentList = Array.isArray(requestList) ? requestList : [];\n\n const requestIdRaw = (request as { id?: string | number }).id;\n const requestIcon = (request as { icon?: string }).icon;\n const requestName = (request as { name?: string }).name;\n\n if (requestIdRaw === undefined || requestIcon === undefined || requestName === undefined) {\n console.warn(\"[respondToRequests] Request payload is missing required fields; aborting emit.\", request);\n return;\n }\n\n const requestId = String(requestIdRaw);\n\n if (!requestId || !requestIcon || !requestName) {\n console.warn(\"[respondToRequests] Request payload contains empty fields; aborting emit.\", request);\n return;\n }\n\n // Filter out the request from the request list\n const newRequestList = currentList.filter(\n (request_) =>\n !(\n request_ &&\n request_.id === requestId &&\n request_.icon === requestIcon &&\n request_.name === requestName\n )\n );\n\n // Update the request list with the filtered list\n updateRequestList(newRequestList);\n\n // Prepare the request response\n const requestResponse: RequestResponse = {\n id: requestId,\n name: requestName,\n type: requestIcon,\n action,\n };\n\n // Emit the request response to the server\n const socketReady = socket && typeof (socket as Socket).emit === \"function\";\n\n if (!socketReady) {\n console.warn(\"[respondToRequests] Socket is not ready; skipping emit.\");\n return;\n }\n\n (socket as Socket).emit(\"updateUserofRequestStatus\", { requestResponse, roomName });\n};\n","export interface LaunchSettingsOptions {\n updateIsSettingsModalVisible: (isVisible: boolean) => void\n isSettingsModalVisible: boolean\n}\n\nexport type LaunchSettingsType = (options: LaunchSettingsOptions) => void\n\n/**\n * Toggles the visibility state of the settings modal.\n *\n * @param {LaunchSettingsOptions} options - The options for launching settings.\n * @param {Function} options.updateIsSettingsModalVisible - Function to update the visibility state of the settings modal.\n * @param {boolean} options.isSettingsModalVisible - Current visibility state of the settings modal.\n *\n * @example\n * ```typescript\n * launchSettings({\n * isSettingsModalVisible: false,\n * updateIsSettingsModalVisible: (visible) => setSettingsModalVisible(visible),\n * })\n * ```\n */\nexport const launchSettings: LaunchSettingsType = ({ updateIsSettingsModalVisible, isSettingsModalVisible }) => {\n updateIsSettingsModalVisible(!isSettingsModalVisible)\n}\n","import type { SwitchUserAudioType, SwitchUserAudioParameters } from '../../types/types';\n\nexport interface SwitchAudioParameters extends SwitchUserAudioParameters {\n defAudioID: string\n userDefaultAudioInputDevice: string\n prevAudioInputDevice: string\n updateUserDefaultAudioInputDevice: (deviceId: string) => void\n updatePrevAudioInputDevice: (deviceId: string) => void\n\n // mediasfu functions\n switchUserAudio: SwitchUserAudioType\n\n getUpdatedAllParams: () => SwitchAudioParameters\n [key: string]: any\n}\n\nexport interface SwitchAudioOptions {\n audioPreference: string\n parameters: SwitchAudioParameters\n}\n\n// Export the type definition for the function\nexport type SwitchAudioType = (options: SwitchAudioOptions) => Promise<void>\n\n/**\n * Switches the audio input device based on user preference.\n *\n * @param {SwitchAudioOptions} options - The function parameters.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * switchAudio({\n * audioPreference: \"newAudioDeviceID\",\n * parameters: {\n * defAudioID: \"defaultAudioDeviceID\",\n * userDefaultAudioInputDevice: \"currentAudioDeviceID\",\n * prevAudioInputDevice: \"previousAudioDeviceID\",\n * updateUserDefaultAudioInputDevice: (deviceId) => setUserDefaultAudio(deviceId),\n * updatePrevAudioInputDevice: (deviceId) => setPrevAudioDevice(deviceId),\n * switchUserAudio: switchUserAudioFunction,\n * getUpdatedAllParams: getUpdatedParamsFunction\n * }\n * });\n * ```\n */\n\nexport const switchAudio = async ({\n audioPreference,\n parameters\n}: SwitchAudioOptions): Promise<void> => {\n let {\n defAudioID,\n userDefaultAudioInputDevice,\n prevAudioInputDevice,\n updateUserDefaultAudioInputDevice,\n updatePrevAudioInputDevice,\n\n //mediasfu functions\n switchUserAudio\n } = parameters\n\n if (audioPreference !== defAudioID) {\n prevAudioInputDevice = userDefaultAudioInputDevice\n updatePrevAudioInputDevice(prevAudioInputDevice)\n userDefaultAudioInputDevice = audioPreference\n updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice)\n\n if (defAudioID) {\n await switchUserAudio({ audioPreference, parameters })\n }\n }\n}\n","import type { ShowAlert, SwitchUserVideoType, SwitchUserVideoParameters } from '../../types/types'\n\n\nexport interface SwitchVideoParameters extends SwitchUserVideoParameters {\n recordStarted: boolean\n recordResumed: boolean\n recordStopped: boolean\n recordPaused: boolean\n recordingMediaOptions: string\n videoAlreadyOn: boolean\n userDefaultVideoInputDevice: string\n defVideoID: string\n allowed: boolean\n updateDefVideoID: (deviceId: string) => void\n updatePrevVideoInputDevice: (deviceId: string) => void\n updateUserDefaultVideoInputDevice: (deviceId: string) => void\n updateIsMediaSettingsModalVisible: (isVisible: boolean) => void\n showAlert?: ShowAlert\n\n // Mediasfu functions\n switchUserVideo: SwitchUserVideoType\n\n [key: string]: any\n}\n\nexport interface SwitchVideoOptions {\n videoPreference: string\n parameters: SwitchVideoParameters\n}\n\n// Export the type definition for the function\nexport type SwitchVideoType = (options: SwitchVideoOptions) => Promise<void>\n\n/**\n * Switches the user's video device based on the provided video preference.\n *\n * @param {SwitchVideoOptions} options - The function parameters.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * switchVideo({\n * videoPreference: \"newVideoDeviceID\",\n * parameters: {\n * recordStarted: true,\n * recordResumed: false,\n * recordStopped: false,\n * recordPaused: false,\n * recordingMediaOptions: \"video\",\n * videoAlreadyOn: true,\n * userDefaultVideoInputDevice: \"currentVideoDeviceID\",\n * defVideoID: \"defaultVideoDeviceID\",\n * allowed: true,\n * updateDefVideoID: (deviceId) => setDefVideoID(deviceId),\n * updatePrevVideoInputDevice: (deviceId) => setPrevVideoDevice(deviceId),\n * updateUserDefaultVideoInputDevice: (deviceId) => setUserDefaultVideo(deviceId),\n * updateIsMediaSettingsModalVisible: (isVisible) => setMediaSettingsModal(isVisible),\n * showAlert: (alertOptions) => showAlert(alertOptions),\n * switchUserVideo: switchUserVideoFunction,\n * }\n * });\n * ```\n */\n\nexport const switchVideo = async ({\n videoPreference,\n parameters\n}: SwitchVideoOptions): Promise<void> => {\n let {\n recordStarted,\n recordResumed,\n recordStopped,\n recordPaused,\n recordingMediaOptions,\n videoAlreadyOn,\n userDefaultVideoInputDevice,\n defVideoID,\n allowed,\n updateDefVideoID,\n updatePrevVideoInputDevice,\n updateUserDefaultVideoInputDevice,\n updateIsMediaSettingsModalVisible,\n\n //mediasfu functions\n showAlert,\n switchUserVideo\n } = parameters\n\n // Check if recording is in progress and whether the selected video device is the default one\n let checkoff = false\n if ((recordStarted || recordResumed) && !recordStopped && !recordPaused) {\n if (recordingMediaOptions === 'video') {\n checkoff = true\n }\n }\n\n // Check camera access permission\n if (!allowed) {\n showAlert?.({\n message:\n 'Allow access to your camera by starting it for the first time.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n\n // Check video state and display appropriate alert messages\n if (checkoff) {\n if (videoAlreadyOn) {\n showAlert?.({\n message: 'Please turn off your video before switching.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n } else {\n if (!videoAlreadyOn) {\n showAlert?.({\n message: 'Please turn on your video before switching.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n }\n\n // Set default video ID if not already set\n if (!defVideoID) {\n defVideoID = userDefaultVideoInputDevice ?? 'default'\n updateDefVideoID(defVideoID)\n }\n\n // Switch video only if the selected video device is different from the default\n if (videoPreference !== defVideoID) {\n const prevVideoInputDevice = userDefaultVideoInputDevice\n updatePrevVideoInputDevice(prevVideoInputDevice)\n\n userDefaultVideoInputDevice = videoPreference\n updateUserDefaultVideoInputDevice(userDefaultVideoInputDevice)\n\n if (defVideoID) {\n updateIsMediaSettingsModalVisible(false)\n await switchUserVideo({ videoPreference, checkoff, parameters })\n }\n }\n}\n","import type { ShowAlert, SwitchUserVideoAltParameters, SwitchUserVideoAltType } from '../../types/types'\n\n\nexport interface SwitchVideoAltParameters extends SwitchUserVideoAltParameters {\n recordStarted: boolean\n recordResumed: boolean\n recordStopped: boolean\n recordPaused: boolean\n recordingMediaOptions: string\n videoAlreadyOn: boolean\n currentFacingMode: string\n prevFacingMode: string\n allowed: boolean\n audioOnlyRoom: boolean\n updateCurrentFacingMode: (mode: string) => void\n updatePrevFacingMode: (mode: string) => void\n updateIsMediaSettingsModalVisible: (isVisible: boolean) => void\n showAlert?: ShowAlert\n\n // mediasfu functions\n switchUserVideoAlt: SwitchUserVideoAltType\n\n getUpdatedAllParams: () => SwitchVideoAltParameters\n [key: string]: any\n}\n\nexport interface SwitchVideoAltOptions {\n parameters: SwitchVideoAltParameters\n}\n\n// Export the type definition for the function\nexport type SwitchVideoAltType = (\n options: SwitchVideoAltOptions\n) => Promise<void>\n\n/**\n * Switches the user's video device with alternate logic, taking into account recording state and camera access permissions.\n *\n * @param {SwitchVideoAltOptions} options - The parameters object containing necessary variables.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * switchVideoAlt({\n * parameters: {\n * recordStarted: true,\n * recordResumed: false,\n * recordStopped: false,\n * recordPaused: false,\n * recordingMediaOptions: 'video',\n * videoAlreadyOn: true,\n * currentFacingMode: 'user',\n * prevFacingMode: 'environment',\n * allowed: true,\n * audioOnlyRoom: false,\n * updateCurrentFacingMode: (mode) => setCurrentFacingMode(mode),\n * updatePrevFacingMode: (mode) => setPrevFacingMode(mode),\n * updateIsMediaSettingsModalVisible: (isVisible) => setMediaSettingsModal(isVisible),\n * showAlert: (alertOptions) => showAlert(alertOptions),\n * switchUserVideoAlt: switchUserVideoAltFunction,\n * }\n * });\n * ```\n */\n\nexport const switchVideoAlt = async ({\n parameters\n}: SwitchVideoAltOptions): Promise<void> => {\n let {\n recordStarted,\n recordResumed,\n recordStopped,\n recordPaused,\n recordingMediaOptions,\n videoAlreadyOn,\n currentFacingMode,\n prevFacingMode,\n allowed,\n audioOnlyRoom,\n updateCurrentFacingMode,\n updateIsMediaSettingsModalVisible,\n updatePrevFacingMode,\n\n showAlert,\n\n //media functions\n switchUserVideoAlt\n } = parameters\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: 'You cannot turn on your camera in an audio-only event.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n\n let checkoff = false\n if (\n (recordStarted || recordResumed) &&\n !recordStopped &&\n !recordPaused &&\n recordingMediaOptions === 'video'\n ) {\n checkoff = true\n }\n\n if (!allowed) {\n showAlert?.({\n message:\n 'Allow access to your camera by starting it for the first time.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n\n if (checkoff) {\n if (videoAlreadyOn) {\n showAlert?.({\n message: 'Please turn off your video before switching.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n } else {\n if (!videoAlreadyOn) {\n showAlert?.({\n message: 'Please turn on your video before switching.',\n type: 'danger',\n duration: 3000\n })\n return\n }\n }\n\n // Camera switching logic\n prevFacingMode = currentFacingMode\n updatePrevFacingMode(prevFacingMode)\n\n currentFacingMode = currentFacingMode === 'environment' ? 'user' : 'environment'\n updateCurrentFacingMode(currentFacingMode)\n\n updateIsMediaSettingsModalVisible(false)\n await switchUserVideoAlt({\n videoPreference: currentFacingMode,\n checkoff,\n parameters\n })\n}\n","import type { ShowAlert } from '../../types/types';\n\nexport interface ClickChatOptions {\n isMessagesModalVisible: boolean;\n updateIsMessagesModalVisible: (isVisible: boolean) => void;\n chatSetting: string;\n islevel: string;\n showAlert?: ShowAlert;\n}\n\nexport type ClickChatType = (options: ClickChatOptions) => Promise<void>;\n\nexport const clickChat = async ({\n isMessagesModalVisible,\n updateIsMessagesModalVisible,\n chatSetting,\n islevel,\n showAlert,\n}: ClickChatOptions): Promise<void> => {\n if (isMessagesModalVisible) {\n updateIsMessagesModalVisible(false);\n return;\n }\n\n if (chatSetting !== 'allow' && islevel !== '2') {\n updateIsMessagesModalVisible(false);\n showAlert?.({\n message: 'Chat is disabled for this event.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n updateIsMessagesModalVisible(true);\n};\n","export interface TranslationTranscriptData {\n speakerId: string;\n speakerName?: string;\n language: string;\n originalText: string;\n translatedText?: string;\n timestamp?: number;\n targetLanguage?: string;\n isFinal?: boolean;\n [key: string]: any;\n}\n\nexport interface LiveSubtitle {\n text: string;\n language: string;\n timestamp: number;\n expiresAt: number;\n speakerId: string;\n speakerName?: string;\n}\n\nexport interface UpdateLiveSubtitlesOptions {\n currentSubtitles: Map<string, LiveSubtitle>;\n transcript: TranslationTranscriptData;\n now?: number;\n}\n\nexport const createLiveSubtitle = (params: {\n text: string;\n language: string;\n speakerId: string;\n speakerName?: string;\n timestamp?: number;\n}): LiveSubtitle => {\n const timestamp = params.timestamp ?? Date.now();\n const duration = Math.min(8000, Math.max(3000, 3000 + params.text.length * 50));\n\n return {\n text: params.text,\n language: params.language,\n timestamp,\n expiresAt: timestamp + duration,\n speakerId: params.speakerId,\n speakerName: params.speakerName,\n };\n};\n\nexport const isSubtitleExpired = (subtitle: LiveSubtitle, now = Date.now()): boolean => {\n return now >= subtitle.expiresAt;\n};\n\nexport const pruneExpiredSubtitles = (\n subtitles: Map<string, LiveSubtitle>,\n now = Date.now(),\n): Map<string, LiveSubtitle> => {\n const next = new Map(subtitles);\n\n for (const [key, subtitle] of next.entries()) {\n if (isSubtitleExpired(subtitle, now)) {\n next.delete(key);\n }\n }\n\n return next;\n};\n\nexport const updateLiveSubtitlesFromTranscript = ({\n currentSubtitles,\n transcript,\n now,\n}: UpdateLiveSubtitlesOptions): Map<string, LiveSubtitle> => {\n const subtitle = createLiveSubtitle({\n text: transcript.translatedText || transcript.originalText,\n language: transcript.language,\n speakerId: transcript.speakerId,\n speakerName: transcript.speakerName,\n timestamp: now ?? transcript.timestamp,\n });\n\n const next = pruneExpiredSubtitles(currentSubtitles, subtitle.timestamp);\n next.set(transcript.speakerId, subtitle);\n\n if (transcript.speakerName) {\n next.set(transcript.speakerName, subtitle);\n }\n\n return next;\n};\n\nexport const getSubtitleForSpeaker = (\n subtitles: Map<string, LiveSubtitle>,\n speakerId: string,\n speakerName?: string,\n now = Date.now(),\n): LiveSubtitle | null => {\n const activeSubtitles = pruneExpiredSubtitles(subtitles, now);\n\n if (speakerId && activeSubtitles.has(speakerId)) {\n return activeSubtitles.get(speakerId) || null;\n }\n\n if (speakerName && activeSubtitles.has(speakerName)) {\n return activeSubtitles.get(speakerName) || null;\n }\n\n return null;\n};","export type VoiceGender = 'male' | 'female' | 'neutral';\n\nexport type TTSSupport = 'excellent' | 'good' | 'moderate' | 'limited' | 'unknown' | 'n/a';\n\nexport type LanguageRegion =\n | 'global'\n | 'europe'\n | 'asia'\n | 'south-asia'\n | 'mena'\n | 'africa'\n | 'caucasus'\n | 'central-asia'\n | 'constructed'\n | 'special'\n | 'other';\n\nexport interface LanguageMetadata {\n name: string;\n nativeName: string;\n region: LanguageRegion;\n ttsSupport: TTSSupport;\n}\n\nexport interface LanguageOption {\n code: string;\n name: string;\n nativeName: string;\n region: LanguageRegion;\n ttsSupport: TTSSupport;\n}\n\nexport interface VoiceOption {\n id: string;\n name: string;\n gender: VoiceGender;\n provider: string;\n language: string;\n style?: string;\n}\n\nexport interface VoiceSelectionPreference {\n gender: VoiceGender;\n voiceId?: string;\n style?: string;\n}\n\nexport interface TranslationVoiceConfig {\n voiceGender?: VoiceGender;\n voiceId?: string;\n voiceClone?: {\n provider: 'elevenlabs' | 'playht' | 'coqui' | 'cartesia';\n voiceId: string;\n stability?: number;\n similarity?: number;\n };\n sttNickName?: string;\n llmNickName?: string;\n ttsNickName?: string;\n ttsProvider?: string;\n sttParams?: Record<string, string | number | boolean>;\n llmParams?: Record<string, string | number | boolean>;\n ttsParams?: Record<string, string | number | boolean>;\n}\n\nexport interface TranslationLanguageEntry {\n code: string;\n nickname?: string;\n voiceConfig?: TranslationVoiceConfig;\n}\n\nexport const SUPPORTED_LANGUAGE_CODES: string[] = [\n 'en', 'es', 'fr', 'de', 'it', 'pt', 'ru', 'zh', 'ja', 'ko', 'ar',\n 'hi', 'bn', 'pa', 'te', 'mr', 'ta', 'ur', 'gu', 'kn', 'ml', 'ne', 'si',\n 'nl', 'pl', 'tr', 'cs', 'el', 'hu', 'ro', 'sv', 'da', 'fi', 'no', 'sk',\n 'uk', 'bg', 'hr', 'et', 'lt', 'lv', 'sl', 'sr', 'bs', 'mk', 'is',\n 'ga', 'cy', 'mt', 'lb', 'sq', 'be',\n 'he', 'fa', 'ps', 'ku',\n 'vi', 'th', 'id', 'ms', 'tl', 'km', 'lo', 'my',\n 'sw', 'yo', 'ig', 'ha', 'zu', 'xh', 'af', 'st', 'tn', 'sn', 'am', 'so', 'rw', 'mg', 'ny',\n 'ee', 'tw', 'gaa',\n 'ka', 'hy', 'az',\n 'eu', 'gl', 'ca', 'la', 'eo',\n 'kk', 'uz', 'tg', 'ky', 'tk', 'mn',\n 'auto',\n];\n\nconst REGION_BY_LANGUAGE: Record<string, LanguageRegion> = {\n en: 'global', es: 'global', fr: 'europe', de: 'europe', it: 'europe', pt: 'global', ru: 'europe', zh: 'asia', ja: 'asia', ko: 'asia', ar: 'mena',\n hi: 'south-asia', bn: 'south-asia', pa: 'south-asia', te: 'south-asia', mr: 'south-asia', ta: 'south-asia', ur: 'south-asia', gu: 'south-asia', kn: 'south-asia', ml: 'south-asia', ne: 'south-asia', si: 'south-asia',\n nl: 'europe', pl: 'europe', tr: 'europe', cs: 'europe', el: 'europe', hu: 'europe', ro: 'europe', sv: 'europe', da: 'europe', fi: 'europe', no: 'europe', sk: 'europe', uk: 'europe', bg: 'europe', hr: 'europe', et: 'europe', lt: 'europe', lv: 'europe', sl: 'europe', sr: 'europe', bs: 'europe', mk: 'europe', is: 'europe', ga: 'europe', cy: 'europe', mt: 'europe', lb: 'europe', sq: 'europe', be: 'europe',\n he: 'mena', fa: 'mena', ps: 'mena', ku: 'mena',\n vi: 'asia', th: 'asia', id: 'asia', ms: 'asia', tl: 'asia', km: 'asia', lo: 'asia', my: 'asia',\n sw: 'africa', yo: 'africa', ig: 'africa', ha: 'africa', zu: 'africa', xh: 'africa', af: 'africa', st: 'africa', tn: 'africa', sn: 'africa', am: 'africa', so: 'africa', rw: 'africa', mg: 'africa', ny: 'africa', ee: 'africa', tw: 'africa', gaa: 'africa',\n ka: 'caucasus', hy: 'caucasus', az: 'caucasus',\n eu: 'europe', gl: 'europe', ca: 'europe', la: 'europe', eo: 'constructed',\n kk: 'central-asia', uz: 'central-asia', tg: 'central-asia', ky: 'central-asia', tk: 'central-asia', mn: 'central-asia',\n auto: 'special',\n};\n\nconst TTS_SUPPORT_BY_LANGUAGE: Record<string, TTSSupport> = {\n en: 'excellent', es: 'excellent', fr: 'excellent', de: 'excellent', it: 'excellent', pt: 'excellent', ru: 'excellent', zh: 'excellent', ja: 'excellent', ko: 'excellent', ar: 'excellent',\n hi: 'good', bn: 'good', te: 'good', mr: 'good', ta: 'good', ur: 'good', nl: 'excellent', pl: 'excellent', tr: 'excellent', cs: 'good', el: 'good', hu: 'good', ro: 'good', sv: 'excellent',\n da: 'good', fi: 'good', no: 'good', uk: 'good', he: 'good', vi: 'good', th: 'good', id: 'good', ms: 'good', af: 'good', ca: 'good',\n auto: 'n/a',\n};\n\nconst getDisplayName = (code: string, locale: string, fallback: string) => {\n try {\n const displayNames = new Intl.DisplayNames([locale], { type: 'language' });\n return displayNames.of(code) || fallback;\n } catch {\n return fallback;\n }\n};\n\nexport const normalizeLanguageCode = (code: string): string => {\n if (!code || typeof code !== 'string') {\n return 'en';\n }\n\n return code.trim().toLowerCase().split('-')[0];\n};\n\nexport const isLanguageSupported = (code: string): boolean => {\n const normalized = normalizeLanguageCode(code);\n return SUPPORTED_LANGUAGE_CODES.includes(normalized);\n};\n\nexport const getLanguageName = (code: string, displayLocale = 'en'): string => {\n const normalized = normalizeLanguageCode(code);\n if (normalized === 'auto') {\n return 'Auto-detect';\n }\n\n return getDisplayName(normalized, displayLocale, normalized.toUpperCase());\n};\n\nexport const getLanguageNativeName = (code: string): string => {\n const normalized = normalizeLanguageCode(code);\n if (normalized === 'auto') {\n return 'Auto';\n }\n\n return getDisplayName(normalized, normalized, getLanguageName(normalized));\n};\n\nexport const getLanguageMetadata = (code: string): LanguageMetadata => {\n const normalized = normalizeLanguageCode(code);\n\n return {\n name: getLanguageName(normalized),\n nativeName: getLanguageNativeName(normalized),\n region: REGION_BY_LANGUAGE[normalized] || 'other',\n ttsSupport: TTS_SUPPORT_BY_LANGUAGE[normalized] || 'unknown',\n };\n};\n\nexport const getSupportedLanguages = (displayLocale = 'en'): LanguageOption[] => {\n return SUPPORTED_LANGUAGE_CODES.map((code) => {\n const metadata = getLanguageMetadata(code);\n return {\n code,\n name: getLanguageName(code, displayLocale),\n nativeName: metadata.nativeName,\n region: metadata.region,\n ttsSupport: metadata.ttsSupport,\n };\n }).sort((left, right) => left.name.localeCompare(right.name));\n};\n\nexport type TTSProvider =\n | 'deepgram'\n | 'openai'\n | 'azure'\n | 'google'\n | 'aws'\n | 'elevenlabs'\n | 'playht'\n | 'cartesia'\n | 'rime'\n | 'kokoro'\n | 'gemini'\n | 'assemblyai';\n\nexport const TTS_PROVIDERS: Record<TTSProvider, { name: string; supportsSSML: boolean; multilingual?: boolean; isDefault?: boolean }> = {\n deepgram: { name: 'Deepgram Aura', supportsSSML: false, isDefault: true },\n openai: { name: 'OpenAI TTS', supportsSSML: false, multilingual: true },\n azure: { name: 'Azure Neural TTS', supportsSSML: true },\n google: { name: 'Google Cloud TTS', supportsSSML: true },\n aws: { name: 'AWS Polly', supportsSSML: true },\n elevenlabs: { name: 'ElevenLabs', supportsSSML: false, multilingual: true },\n playht: { name: 'PlayHT', supportsSSML: false, multilingual: true },\n cartesia: { name: 'Cartesia Sonic', supportsSSML: false, multilingual: true },\n rime: { name: 'Rime AI', supportsSSML: false, multilingual: true },\n kokoro: { name: 'Kokoro', supportsSSML: false, multilingual: true },\n gemini: { name: 'Google Gemini TTS', supportsSSML: false, multilingual: true },\n assemblyai: { name: 'AssemblyAI', supportsSSML: false },\n};\n\nexport interface SocketVoiceResponse {\n provider: string;\n language: string;\n voices: { male: VoiceOption[]; female: VoiceOption[] };\n providers?: Record<string, unknown>;\n error?: string;\n}\n\nconst buildFallbackVoices = (langCode: string, provider: string): { male: VoiceOption[]; female: VoiceOption[] } => {\n const normalizedLanguage = normalizeLanguageCode(langCode === 'auto' ? 'en' : langCode);\n const providerKey = provider.toLowerCase();\n const providerName = TTS_PROVIDERS[providerKey as TTSProvider]?.name || provider;\n const languageName = getLanguageName(normalizedLanguage);\n\n return {\n female: [\n {\n id: `${providerKey}-${normalizedLanguage}-female-1`,\n name: `${providerName} ${languageName} Female`,\n gender: 'female',\n provider: providerKey,\n language: normalizedLanguage,\n },\n {\n id: `${providerKey}-${normalizedLanguage}-female-2`,\n name: `${providerName} ${languageName} Female 2`,\n gender: 'female',\n provider: providerKey,\n language: normalizedLanguage,\n },\n ],\n male: [\n {\n id: `${providerKey}-${normalizedLanguage}-male-1`,\n name: `${providerName} ${languageName} Male`,\n gender: 'male',\n provider: providerKey,\n language: normalizedLanguage,\n },\n {\n id: `${providerKey}-${normalizedLanguage}-male-2`,\n name: `${providerName} ${languageName} Male 2`,\n gender: 'male',\n provider: providerKey,\n language: normalizedLanguage,\n },\n ],\n };\n};\n\nexport const getAvailableVoices = (\n langCode: string,\n provider: TTSProvider | string = 'deepgram'\n): { male: VoiceOption[]; female: VoiceOption[] } => {\n return buildFallbackVoices(langCode, provider.toString());\n};\n\nexport const fetchVoicesViaSocket = (\n socket: { emit: (event: string, data: unknown, callback?: (response: SocketVoiceResponse) => void) => void },\n provider: TTSProvider | string = 'deepgram',\n language: string = 'en'\n): Promise<SocketVoiceResponse> => {\n return new Promise((resolve) => {\n const providerName = provider.toString();\n const fallbackVoices = getAvailableVoices(language, providerName);\n\n const timeout = setTimeout(() => {\n resolve({\n provider: providerName,\n language,\n voices: fallbackVoices,\n error: 'Request timed out, using shared fallback voices',\n });\n }, 5000);\n\n socket.emit('translation:getVoices', { provider, language }, (response: SocketVoiceResponse) => {\n clearTimeout(timeout);\n\n if (response?.voices) {\n resolve(response);\n return;\n }\n\n resolve({\n provider: response?.provider || providerName,\n language: response?.language || language,\n voices: fallbackVoices,\n error: response?.error || 'No voices returned, using shared fallback voices',\n });\n });\n });\n};\n\nexport const fetchLanguagesViaSocket = (\n socket: { emit: (event: string, data: unknown, callback?: (response: { languages?: LanguageOption[] }) => void) => void },\n displayLocale: string = 'en'\n): Promise<LanguageOption[]> => {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n resolve(getSupportedLanguages(displayLocale));\n }, 5000);\n\n socket.emit('translation:getLanguages', { displayLocale }, (response: { languages?: LanguageOption[] }) => {\n clearTimeout(timeout);\n resolve(response?.languages?.length ? response.languages : getSupportedLanguages(displayLocale));\n });\n });\n};","export interface SoundPlayerOptions {\n soundUrl: string;\n}\n\nexport type SoundPlayerType = (options: SoundPlayerOptions) => void | Promise<void>;\n\n/**\n * Attempts to play a remote sound asset when the runtime supports browser audio playback.\n *\n * @param {SoundPlayerOptions} options - The sound asset URL to play.\n * @returns {void | Promise<void>} Completes after playback attempt starts/completes or is skipped.\n *\n * @example\n * ```typescript\n * await SoundPlayer({\n * soundUrl: 'https://www.mediasfu.com/sounds/record-progress.mp3',\n * });\n * ```\n */\nexport const SoundPlayer = async ({ soundUrl }: SoundPlayerOptions): Promise<void> => {\n if (!soundUrl || typeof Audio === 'undefined') {\n return;\n }\n\n try {\n const audio = new Audio(soundUrl);\n await audio.play();\n } catch (error) {\n console.error('Error playing sound:', error);\n }\n};","import type { OverlayPositionStyle } from '../../types/types';\n\nexport interface GetOverlayPositionOptions {\n position: string;\n}\n\nexport type GetOverlayPositionType = (options: GetOverlayPositionOptions) => OverlayPositionStyle;\n\n/**\n * Maps a symbolic overlay position to CSS-style edge coordinates.\n *\n * This is used by display card components to anchor badges, audio indicators,\n * or auxiliary overlays to a participant tile corner.\n *\n * @param options Overlay position options.\n * @returns A partial coordinate object suitable for inline style application.\n *\n * @example\n * ```typescript\n * const style = getOverlayPosition({ position: 'bottomRight' });\n * // style === { bottom: 0, right: 0 }\n * ```\n */\nexport const getOverlayPosition = ({ position }: GetOverlayPositionOptions): OverlayPositionStyle => {\n switch (position) {\n case 'topLeft':\n return { top: 0, left: 0 };\n case 'topRight':\n return { top: 0, right: 0 };\n case 'bottomLeft':\n return { bottom: 0, left: 0 };\n case 'bottomRight':\n return { bottom: 0, right: 0 };\n default:\n return {};\n }\n};","import { ModalPositionStyle } from '../../types/shared-base-types';\n\nexport interface GetModalPositionOptions {\n position: string;\n}\n\nexport type GetModalPositionType = (options: GetModalPositionOptions) => ModalPositionStyle;\n\nexport const getModalPosition = ({ position }: GetModalPositionOptions): ModalPositionStyle => {\n switch (position) {\n case 'center':\n return { justifyContent: 'center', alignItems: 'center' };\n case 'topLeft':\n return { justifyContent: 'flex-start', alignItems: 'flex-start' };\n case 'topRight':\n return { justifyContent: 'flex-start', alignItems: 'flex-end' };\n case 'bottomLeft':\n return { justifyContent: 'flex-end', alignItems: 'flex-start' };\n case 'bottomRight':\n default:\n return { justifyContent: 'flex-end', alignItems: 'flex-end' };\n }\n};","export interface SleepOptions {\n ms: number;\n}\n\nexport type SleepType = (options: SleepOptions) => Promise<void>;\n\n/**\n * Delays execution for a specified number of milliseconds.\n *\n * This helper is used throughout MediaSFU to wait for short transport or media\n * lifecycle transitions before continuing work.\n *\n * @param options Delay configuration.\n * @returns A promise that resolves after the requested delay.\n *\n * @example\n * ```typescript\n * await sleep({ ms: 500 });\n * // Continue after a half-second pause.\n * ```\n */\nexport function sleep({ ms }: SleepOptions): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}","export interface FormatNumberOptions {\n number: number;\n}\n\nexport type FormatNumberType = (options: FormatNumberOptions) => Promise<string | undefined>;\n\n/**\n * Formats large numbers into compact display strings.\n *\n * Values are converted to `K`, `M`, or `B` suffixes for UI-friendly display.\n * Falsy values return `undefined` to match existing MediaSFU display behavior.\n *\n * @param options Number formatting options.\n * @returns A compact string such as `1.2K` or `3.4M`, or `undefined` for empty input.\n *\n * @example\n * ```typescript\n * const viewers = await formatNumber({ number: 1530 });\n * // viewers === '1.5K'\n * ```\n */\nexport const formatNumber = async ({ number }: FormatNumberOptions): Promise<string | undefined> => {\n if (number) {\n if (number < 1e3) {\n return number.toString();\n }\n\n if (number < 1e6) {\n return `${(number / 1e3).toFixed(1)}K`;\n }\n\n if (number < 1e9) {\n return `${(number / 1e6).toFixed(1)}M`;\n }\n\n if (number < 1e12) {\n return `${(number / 1e9).toFixed(1)}B`;\n }\n }\n\n return undefined;\n};","import type { Message, Participant } from '../../types/shared-base-types';\n\nexport interface GenerateRandomMessagesOptions {\n participants: Participant[];\n member: string;\n coHost?: string;\n host: string;\n forChatBroadcast?: boolean;\n}\n\nexport type GenerateRandomMessagesType = (options: GenerateRandomMessagesOptions) => Message[];\n\nexport const generateRandomMessages = ({\n participants,\n member,\n coHost = '',\n host,\n forChatBroadcast = false,\n}: GenerateRandomMessagesOptions): Message[] => {\n const messages: Message[] = [];\n\n const getRandomReceiver = (sender: string): string => {\n const potentialReceivers = participants.filter((participant) => participant.name !== sender);\n const randomReceiver = potentialReceivers[Math.floor(Math.random() * potentialReceivers.length)];\n return randomReceiver?.name || '';\n };\n\n let refNames: string[] = [];\n if (forChatBroadcast) {\n refNames = [member, host];\n } else if (coHost) {\n refNames = [\n member,\n coHost,\n host,\n ...participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),\n ];\n } else {\n refNames = [\n member,\n host,\n ...participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),\n ];\n }\n\n refNames = [...new Set(refNames)];\n\n let timeIncrement = 0;\n refNames.forEach((sender) => {\n messages.push({\n sender,\n receivers: [getRandomReceiver(sender)],\n message: `Direct message from ${sender}`,\n timestamp: new Date(Date.now() + timeIncrement).toLocaleTimeString(),\n group: false,\n });\n\n messages.push({\n sender,\n receivers: participants.map((participant) => participant.name).filter((name): name is string => name !== undefined),\n message: `Group message from ${sender}`,\n timestamp: new Date(Date.now() + timeIncrement).toLocaleTimeString(),\n group: true,\n });\n\n timeIncrement += 15000;\n });\n\n return messages;\n};\n","import type { Participant } from '../../types/shared-base-types';\n\nexport interface GenerateRandomParticipantsOptions {\n member: string;\n coHost?: string;\n host: string;\n forChatBroadcast?: boolean;\n}\n\nexport type GenerateRandomParticipantsType = (\n options: GenerateRandomParticipantsOptions,\n) => Participant[];\n\nexport const generateRandomParticipants = ({\n member,\n coHost = '',\n host,\n forChatBroadcast = false,\n}: GenerateRandomParticipantsOptions): Participant[] => {\n const participants: Participant[] = [];\n let names: string[] = [\n 'Alice',\n 'Bob',\n 'Charlie',\n 'David',\n 'Eve',\n 'Frank',\n 'Grace',\n 'Hank',\n 'Ivy',\n 'Jack',\n 'Kate',\n 'Liam',\n 'Mia',\n 'Nina',\n 'Olivia',\n 'Pete',\n 'Quinn',\n 'Rachel',\n 'Steve',\n 'Tina',\n 'Ursula',\n 'Vince',\n 'Wendy',\n 'Xander',\n 'Yvonne',\n 'Zack',\n ];\n\n if (forChatBroadcast) {\n names.splice(2);\n }\n\n if (!names.includes(member)) {\n names.unshift(member);\n }\n\n if (!names.includes(coHost) && !forChatBroadcast) {\n names.unshift(coHost);\n }\n\n if (!names.includes(host)) {\n names.unshift(host);\n }\n\n if (forChatBroadcast) {\n names.splice(2);\n }\n\n names = names.filter((name) => name.length > 1);\n\n const shuffledNames = [...names];\n for (let index = shuffledNames.length - 1; index > 0; index -= 1) {\n const randomIndex = Math.floor(Math.random() * (index + 1));\n [shuffledNames[index], shuffledNames[randomIndex]] = [shuffledNames[randomIndex], shuffledNames[index]];\n }\n\n let hasLevel2Participant = false;\n\n for (let index = 0; index < shuffledNames.length; index += 1) {\n const randomName = shuffledNames[index];\n const randomLevel = hasLevel2Participant ? '1' : randomName === host ? '2' : '1';\n const randomMuted = forChatBroadcast ? true : Math.random() < 0.5;\n\n if (randomLevel === '2') {\n hasLevel2Participant = true;\n }\n\n participants.push({\n name: randomName,\n islevel: randomLevel,\n muted: randomMuted,\n id: index.toString(),\n audioID: `audio-${index}`,\n videoID: `video-${index}`,\n });\n }\n\n return participants;\n};\n","import type { Poll } from '../../types/shared-base-types';\n\nexport interface GenerateRandomPollsOptions {\n numberOfPolls: number;\n}\n\nexport type GenerateRandomPollsType = (options: GenerateRandomPollsOptions) => Poll[];\n\nexport const generateRandomPolls = ({ numberOfPolls }: GenerateRandomPollsOptions): Poll[] => {\n const pollTypes: string[] = ['trueFalse', 'yesNo', 'custom'];\n const polls: Poll[] = [];\n\n for (let index = 0; index < numberOfPolls; index += 1) {\n const type = pollTypes[Math.floor(Math.random() * pollTypes.length)];\n let options: string[];\n\n switch (type) {\n case 'trueFalse':\n options = ['True', 'False'];\n break;\n case 'yesNo':\n options = ['Yes', 'No'];\n break;\n case 'custom':\n options = Array.from({ length: Math.floor(Math.random() * 5) + 2 }, (_, optionIndex) => `Option ${optionIndex + 1}`);\n break;\n default:\n options = [];\n }\n\n polls.push({\n id: `${index + 1}`,\n question: `Random Question ${index + 1}`,\n type,\n options,\n votes: Array(options.length).fill(0),\n status: 'inactive',\n voters: {},\n });\n }\n\n return polls;\n};\n","import type { Participant, Request } from '../../types/shared-base-types';\n\nexport interface GenerateRandomRequestListOptions {\n participants: Participant[];\n hostName: string;\n coHostName?: string;\n numberOfRequests: number;\n}\n\nexport type GenerateRandomRequestListType = (options: GenerateRandomRequestListOptions) => Request[];\n\nexport const generateRandomRequestList = ({\n participants,\n hostName,\n coHostName,\n numberOfRequests,\n}: GenerateRandomRequestListOptions): Request[] => {\n const filteredParticipants = participants.filter(\n (participant) => participant.name !== hostName && participant.name !== coHostName,\n );\n\n const requestIcons = ['fa-video', 'fa-desktop', 'fa-microphone'];\n\n for (let index = requestIcons.length - 1; index > 0; index -= 1) {\n const randomIndex = Math.floor(Math.random() * (index + 1));\n [requestIcons[index], requestIcons[randomIndex]] = [requestIcons[randomIndex], requestIcons[index]];\n }\n\n return filteredParticipants.flatMap((participant) => {\n const uniqueIcons = new Set<string>();\n const requests: Request[] = [];\n\n for (let index = 0; index < numberOfRequests; index += 1) {\n let randomIcon: string;\n do {\n randomIcon = requestIcons[Math.floor(Math.random() * requestIcons.length)];\n } while (uniqueIcons.has(randomIcon));\n\n uniqueIcons.add(randomIcon);\n\n requests.push({\n id: participant.id || '',\n name: participant.name ? participant.name.toLowerCase().replace(/\\s/g, '_') : '',\n icon: randomIcon,\n username: participant.name ? participant.name.toLowerCase().replace(/\\s/g, '_') : '',\n });\n }\n\n return requests;\n });\n};\n","import type { WaitingRoomParticipant } from '../../types/shared-base-types';\n\nexport type GenerateRandomWaitingRoomListType = () => WaitingRoomParticipant[];\n\nexport const generateRandomWaitingRoomList = (): WaitingRoomParticipant[] => {\n const names = ['Dimen', 'Nore', 'Ker', 'Lor', 'Mik'];\n\n const waitingRoomList: WaitingRoomParticipant[] = [];\n for (let index = 0; index < names.length; index += 1) {\n waitingRoomList.push({\n name: names[index],\n id: index.toString(),\n });\n }\n\n return waitingRoomList;\n};\n","export const initialValuesState = {\n // The following are the initial values\n\n roomName: '',\n member: '',\n adminPasscode: '',\n islevel: '1',\n coHost: 'No coHost',\n coHostResponsibility: [\n { name: 'participants', value: false, dedicated: false },\n { name: 'media', value: false, dedicated: false },\n { name: 'waiting', value: false, dedicated: false },\n { name: 'chat', value: false, dedicated: false },\n ],\n youAreCoHost: false,\n youAreHost: false,\n confirmedToRecord: false,\n meetingDisplayType: 'media',\n meetingVideoOptimized: false,\n eventType: 'webinar',\n participants: [],\n filteredParticipants: [],\n participantsCounter: 0,\n participantsFilter: '',\n\n validated: false,\n localUIMode: false,\n socket: {},\n localSocket: undefined,\n roomData: null,\n device: null,\n apiKey: '',\n apiUserName: '',\n apiToken: '',\n link: '',\n\n consume_sockets: [],\n rtpCapabilities: null,\n roomRecvIPs: [],\n meetingRoomParams: null,\n itemPageLimit: 4,\n audioOnlyRoom: false,\n addForBasic: false,\n screenPageLimit: 4,\n shareScreenStarted: false,\n shared: false,\n targetOrientation: 'landscape',\n targetResolution: 'sd',\n targetResolutionHost: 'sd',\n vidCons: { width: 640, height: 360 },\n frameRate: 10,\n hParams: {},\n vParams: {},\n screenParams: {},\n aParams: {},\n\n // Initial Values for New Recording Fields\n recordingAudioPausesLimit: 0,\n recordingAudioPausesCount: 0,\n recordingAudioSupport: false,\n recordingAudioPeopleLimit: 0,\n recordingAudioParticipantsTimeLimit: 0,\n recordingVideoPausesCount: 0,\n recordingVideoPausesLimit: 0,\n recordingVideoSupport: false,\n recordingVideoPeopleLimit: 0,\n recordingVideoParticipantsTimeLimit: 0,\n recordingAllParticipantsSupport: false,\n recordingVideoParticipantsSupport: false,\n recordingAllParticipantsFullRoomSupport: false,\n recordingVideoParticipantsFullRoomSupport: false,\n recordingPreferredOrientation: 'landscape',\n recordingSupportForOtherOrientation: false,\n recordingMultiFormatsSupport: false,\n\n userRecordingParams: {\n mainSpecs: {\n mediaOptions: 'video',\n audioOptions: 'all',\n videoOptions: 'all',\n videoType: 'fullDisplay',\n videoOptimized: false,\n recordingDisplayType: 'media',\n addHLS: false,\n },\n dispSpecs: {\n nameTags: true,\n backgroundColor: '#000000',\n nameTagsColor: '#ffffff',\n orientationVideo: 'portrait',\n },\n },\n\n canRecord: false,\n startReport: false,\n endReport: false,\n recordTimerInterval: null,\n recordStartTime: 0,\n recordElapsedTime: 0,\n isTimerRunning: false,\n canPauseResume: false,\n recordChangeSeconds: 15000,\n pauseLimit: 0,\n pauseRecordCount: 0,\n canLaunchRecord: true,\n stopLaunchRecord: false,\n\n // Room properties\n participantsAll: [],\n firstAll: false,\n updateMainWindow: false,\n first_round: false,\n landScaped: false,\n lock_screen: false,\n screenId: '',\n allVideoStreams: [],\n newLimitedStreams: [],\n newLimitedStreamsIDs: [],\n activeSounds: [],\n screenShareIDStream: '',\n screenShareNameStream: '',\n adminIDStream: '',\n adminNameStream: '',\n youYouStream: [],\n youYouStreamIDs: [],\n localStream: null,\n recordStarted: false,\n recordResumed: false,\n recordPaused: false,\n recordStopped: false,\n adminRestrictSetting: false,\n videoRequestState: null,\n videoRequestTime: 0,\n videoAction: false,\n localStreamVideo: null,\n userDefaultVideoInputDevice: '',\n currentFacingMode: 'user',\n prevFacingMode: 'user',\n defVideoID: '',\n allowed: false,\n dispActiveNames: [],\n activeNames: [],\n prevActiveNames: [],\n p_activeNames: [],\n p_dispActiveNames: [],\n membersReceived: false,\n deferScreenReceived: false,\n hostFirstSwitch: false,\n micAction: false,\n screenAction: false,\n chatAction: false,\n audioRequestState: null,\n screenRequestState: null,\n chatRequestState: null,\n audioRequestTime: 0,\n screenRequestTime: 0,\n chatRequestTime: 0,\n updateRequestIntervalSeconds: 240,\n oldSoundIds: [],\n hostLabel: 'Host',\n mainScreenFilled: false,\n localStreamScreen: null,\n screenAlreadyOn: false,\n chatAlreadyOn: false,\n redirectURL: '',\n oldAllStreams: [],\n adminVidID: '',\n streamNames: [],\n non_alVideoStreams: [],\n sortAudioLoudness: false,\n audioDecibels: [],\n mixed_alVideoStreams: [],\n non_alVideoStreams_muted: [],\n paginatedStreams: [],\n localStreamAudio: null,\n defAudioID: '',\n userDefaultAudioInputDevice: '',\n userDefaultAudioOutputDevice: '',\n prevAudioInputDevice: '',\n prevVideoInputDevice: '',\n audioPaused: false,\n mainScreenPerson: '',\n adminOnMainScreen: false,\n screenStates: [{\n mainScreenPerson: '',\n mainScreenProducerId: '',\n mainScreenFilled: false,\n adminOnMainScreen: false,\n }],\n prevScreenStates: [{\n mainScreenPerson: '',\n mainScreenProducerId: '',\n mainScreenFilled: false,\n adminOnMainScreen: false,\n }],\n updateDateState: null,\n lastUpdate: null,\n nForReadjustRecord: 0,\n fixedPageLimit: 4,\n removeAltGrid: false,\n nForReadjust: 0,\n reorderInterval: 30000,\n fastReorderInterval: 10000,\n lastReorderTime: 0,\n audStreamNames: [],\n currentUserPage: 0,\n mainHeightWidth: 0,\n prevMainHeightWidth: 0,\n prevDoPaginate: false,\n doPaginate: false,\n shareEnded: false,\n lStreams: [],\n chatRefStreams: [],\n controlHeight: 0,\n isWideScreen: false,\n isMediumScreen: false,\n isSmallScreen: false,\n addGrid: false,\n addAltGrid: false,\n gridRows: 0,\n gridCols: 0,\n altGridRows: 0,\n altGridCols: 0,\n numberPages: 0,\n currentStreams: [],\n showMiniView: false,\n nStream: null,\n defer_receive: false,\n allAudioStreams: [],\n remoteScreenStream: [],\n screenProducer: null,\n localScreenProducer: null,\n gotAllVids: false,\n paginationHeightWidth: 40,\n paginationDirection: 'horizontal',\n gridSizes: {\n gridWidth: 0, gridHeight: 0, altGridWidth: 0, altGridHeight: 0,\n },\n screenForceFullDisplay: false,\n mainGridStream: [],\n otherGridStreams: [[], []],\n audioOnlyStreams: [],\n videoInputs: [],\n audioInputs: [],\n meetingProgressTime: '00:00:00',\n meetingElapsedTime: 0,\n ref_participants: [],\n\n // Messaging, event, modals, and other UI states\n messages: [],\n startDirectMessage: false,\n directMessageDetails: null,\n showMessagesBadge: false,\n audioSetting: 'allow',\n videoSetting: 'allow',\n screenshareSetting: 'allow',\n chatSetting: 'allow',\n displayOption: 'media',\n autoWave: true,\n forceFullDisplay: true,\n prevForceFullDisplay: false,\n prevMeetingDisplayType: 'video',\n waitingRoomFilter: '',\n waitingRoomList: [],\n waitingRoomCounter: 0,\n filteredWaitingRoomList: [],\n requestFilter: '',\n requestList: [],\n requestCounter: 0,\n filteredRequestList: [],\n totalReqWait: 0,\n alertVisible: false,\n alertMessage: '',\n alertType: 'success',\n alertDuration: 3000,\n progressTimerVisible: true,\n progressTimerValue: 0,\n isMenuModalVisible: false,\n isRecordingModalVisible: false,\n isSettingsModalVisible: false,\n isRequestsModalVisible: false,\n isWaitingModalVisible: false,\n isCoHostModalVisible: false,\n isMediaSettingsModalVisible: false,\n isDisplaySettingsModalVisible: false,\n isParticipantsModalVisible: false,\n isMessagesModalVisible: false,\n isConfirmExitModalVisible: false,\n isConfirmHereModalVisible: false,\n isShareEventModalVisible: false,\n isLoadingModalVisible: false,\n\n recordingMediaOptions: 'video',\n recordingAudioOptions: 'all',\n recordingVideoOptions: 'all',\n recordingVideoType: 'fullDisplay',\n recordingVideoOptimized: false,\n recordingDisplayType: 'video',\n recordingAddHLS: true,\n recordingNameTags: true,\n recordingBackgroundColor: '#83c0e9',\n recordingNameTagsColor: '#ffffff',\n recordingAddText: false,\n recordingCustomText: 'Add Text',\n recordingCustomTextPosition: 'top',\n recordingCustomTextColor: '#ffffff',\n recordingOrientationVideo: 'landscape',\n clearedToResume: true,\n clearedToRecord: true,\n recordState: 'green',\n showRecordButtons: false,\n recordingProgressTime: '00:00:00',\n audioSwitching: false,\n videoSwitching: false,\n videoAlreadyOn: false,\n audioAlreadyOn: false,\n componentSizes: {\n mainHeight: 0, otherHeight: 0, mainWidth: 0, otherWidth: 0,\n },\n hasCameraPermission: false,\n hasAudioPermission: false,\n transportCreated: false,\n localTransportCreated: false,\n transportCreatedVideo: false,\n transportCreatedAudio: false,\n transportCreatedScreen: false,\n producerTransport: null,\n localProducerTransport: null,\n videoProducer: null,\n localVideoProducer: null,\n params: {},\n videoParams: {},\n audioParams: {},\n audioProducer: null,\n localAudioProducer: null,\n consumerTransports: [],\n consumingTransports: [],\n\n // Polls\n polls: [],\n poll: null,\n isPollModalVisible: false,\n\n // Background\n customImage: '',\n selectedImage: '',\n segmentVideo: null,\n selfieSegmentation: null,\n pauseSegmentation: false,\n processedStream: null,\n keepBackground: false,\n backgroundHasChanged: false,\n virtualStream: null,\n mainCanvas: null,\n prevKeepBackground: false,\n appliedBackground: false,\n isBackgroundModalVisible: false,\n autoClickBackground: false,\n\n // Breakout Rooms\n breakoutRooms: [],\n currentRoomIndex: 0,\n canStartBreakout: false,\n breakOutRoomStarted: false,\n breakOutRoomEnded: false,\n hostNewRoom: -1,\n limitedBreakRoom: [],\n mainRoomsLength: 0,\n memberRoom: -1,\n isBreakoutRoomsModalVisible: false,\n\n // Whiteboard\n whiteboardUsers: [],\n currentWhiteboardIndex: 0,\n canStartWhiteboard: false,\n whiteboardStarted: false,\n whiteboardEnded: false,\n whiteboardLimit: 4,\n isWhiteboardModalVisible: false,\n isConfigureWhiteboardModalVisible: false,\n shapes: [],\n useImageBackground: true,\n redoStack: [],\n undoStack: [],\n canvasStream: null,\n canvasWhiteboard: null,\n\n // Screenboard\n canvasScreenboard: null,\n processedScreenStream: null,\n annotateScreenStream: false,\n mainScreenCanvas: null,\n isScreenboardModalVisible: false,\n\n // Control Buttons\n micActive: false,\n videoActive: false,\n screenShareActive: false,\n endCallActive: false,\n participantsActive: false,\n menuActive: false,\n commentsActive: false,\n};\n\nexport type InitialValuesStateType = typeof initialValuesState;\n","// Default fallback\n// Fallback for mediaDevices with support for getUserMedia\nexport const mediaDevices = {\n getUserMedia: async (_constraints: MediaStreamConstraints): Promise<MediaStream> => {\n // Fallback logic or mock implementation for getUserMedia\n console.warn('getUserMedia is not implemented in this environment.');\n return new MediaStream(); // Return an empty MediaStream as a fallback\n },\n\n getDisplayMedia: async (_constraints: MediaStreamConstraints): Promise<MediaStream> => {\n // Fallback logic or mock implementation for getDisplayMedia\n console.warn('getDisplayMedia is not implemented in this environment.');\n return new MediaStream(); // Return an empty MediaStream as a fallback\n },\n\n enumerateDevices: async (): Promise<MediaDeviceInfo[]> => {\n // Fallback logic or mock implementation for enumerateDevices\n console.warn('enumerateDevices is not implemented in this environment.');\n return []; // Return an empty array as a fallback\n },\n};\n\nexport function registerGlobals() {}\n\nexport class MediaStream {\n tracks: any[];\n\n constructor(tracks: any[] = []) {\n this.tracks = tracks; // Assign tracks to the MediaStream instance\n }\n\n // You can add additional methods or properties if needed\n [key: string]: any;\n}\n\nexport class MediaStreamTrack {\n [key: string]: any;\n}\n\nexport class RTCView {\n render(): null {\n return null; // Empty RTCView implementation\n }\n}\n","import type { ResponseJoinLocalRoom, ResponseJoinRoom } from '../../types/types';\n\nexport interface CreateResponseJoinRoomOptions {\n localRoom: ResponseJoinLocalRoom;\n}\n\nexport type CreateResponseJoinRoomType = (options: CreateResponseJoinRoomOptions) => Promise<ResponseJoinRoom>;\n\n/**\n * Converts a local-room join response into the broader MediaSFU join response shape.\n *\n * This helper is useful when local/demo or self-hosted room flows need to be\n * normalized to the same response contract consumed by the main runtime.\n *\n * @param options Response conversion options.\n * @returns A normalized `ResponseJoinRoom` object.\n *\n * @example\n * ```typescript\n * const normalized = await createResponseJoinRoom({ localRoom });\n * if (normalized.success) {\n * console.log(normalized.meetingRoomParams);\n * }\n * ```\n */\nexport const createResponseJoinRoom: CreateResponseJoinRoomType = async ({\n localRoom,\n}: CreateResponseJoinRoomOptions): Promise<ResponseJoinRoom> => {\n return {\n rtpCapabilities: localRoom.rtpCapabilities ?? null,\n success: localRoom.rtpCapabilities !== null,\n roomRecvIPs: [],\n meetingRoomParams: localRoom.eventRoomParams,\n recordingParams: localRoom.recordingParams,\n secureCode: localRoom.secureCode,\n recordOnly: false,\n isHost: localRoom.isHost,\n safeRoom: false,\n autoStartSafeRoom: false,\n safeRoomStarted: false,\n safeRoomEnded: false,\n reason: localRoom.isBanned ? 'User is banned from the room.' : undefined,\n banned: localRoom.isBanned,\n suspended: false,\n noAdmin: localRoom.hostNotJoined,\n };\n};","import type {\n CreateRoomOnMediaSFUOptions,\n CreateRoomOnMediaSFUType,\n PendingRequestStorage,\n} from '../../types/types';\nimport type { CreateJoinRoomError, CreateJoinRoomResponse } from './joinRoomOnMediaSFU';\nimport { resolveMediaSFURoomApi } from './resolveMediaSFURoomApi';\n\nconst readResponseError = async (response: Response): Promise<string> => {\n const fallbackMessage = `HTTP error! Status: ${response.status}`;\n\n try {\n const responseText = await response.text();\n\n if (!responseText) {\n return fallbackMessage;\n }\n\n const parsedResponse = JSON.parse(responseText) as { error?: string; message?: string };\n return parsedResponse.error || parsedResponse.message || responseText;\n } catch {\n return fallbackMessage;\n }\n};\n\nconst createBrowserPendingRequestStorage = (): PendingRequestStorage | undefined => {\n if (typeof localStorage === 'undefined') {\n return undefined;\n }\n\n return {\n getItem: async (key: string) => localStorage.getItem(key),\n setItem: async (key: string, value: string) => {\n localStorage.setItem(key, value);\n },\n removeItem: async (key: string) => {\n localStorage.removeItem(key);\n },\n };\n};\n\n/**\n * Calls the MediaSFU create-room API and guards against duplicate in-flight room requests.\n *\n * A short-lived `localStorage` marker is used to prevent accidental duplicate\n * submissions while a room create request is still pending.\n *\n * @param options API request options including credentials and create payload.\n * @returns A result object containing either parsed response data or an error payload.\n *\n * @example\n * ```typescript\n * const created = await createRoomOnMediaSFU({\n * payload: {\n * action: 'create',\n * userName: 'Ada',\n * duration: 60,\n * capacity: 10,\n * } as CreateMediaSFURoomOptions,\n * apiUserName: 'sampleuser',\n * apiKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n * });\n *\n * console.log(created.success);\n * ```\n */\nexport const createRoomOnMediaSFU: CreateRoomOnMediaSFUType = async ({\n payload,\n apiUserName,\n apiKey,\n localLink = '',\n pendingRequestStorage,\n}: CreateRoomOnMediaSFUOptions): Promise<{\n data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n success: boolean;\n}> => {\n const storage = pendingRequestStorage ?? createBrowserPendingRequestStorage();\n const roomIdentifier = `create_${payload.userName}_${payload.duration}_${payload.capacity}`;\n\n const pendingKey = `mediasfu_pending_${roomIdentifier}`;\n const pendingTimeout = 30 * 1000;\n\n try {\n const pendingRequest = storage ? await storage.getItem(pendingKey) : null;\n if (storage && pendingRequest) {\n const pendingData = JSON.parse(pendingRequest) as { timestamp: number };\n const timeSincePending = Date.now() - pendingData.timestamp;\n\n if (timeSincePending < pendingTimeout) {\n return {\n data: { error: 'Room creation already in progress' },\n success: false,\n };\n }\n\n await storage.removeItem(pendingKey);\n }\n\n if (\n !apiUserName ||\n !apiKey ||\n apiUserName === 'yourAPIUSERNAME' ||\n apiKey === 'yourAPIKEY' ||\n apiKey.length !== 64 ||\n apiUserName.length < 6\n ) {\n return { data: { error: 'Invalid credentials' }, success: false };\n }\n\n const finalLink = resolveMediaSFURoomApi(localLink, 'createRoom');\n\n if (storage) {\n await storage.setItem(pendingKey, JSON.stringify({\n timestamp: Date.now(),\n payload: {\n action: payload.action,\n userName: payload.userName,\n meetingID: 'create',\n },\n }));\n\n setTimeout(() => {\n storage.removeItem(pendingKey).catch(() => {\n });\n }, pendingTimeout);\n }\n\n const response = await fetch(finalLink, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiUserName}:${apiKey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(await readResponseError(response));\n }\n\n const data: CreateJoinRoomResponse = await response.json();\n if (storage) {\n await storage.removeItem(pendingKey);\n }\n return { data, success: true };\n } catch (error) {\n if (storage) {\n try {\n await storage.removeItem(pendingKey);\n } catch {\n }\n }\n\n const errorMessage = (error as Error).message || 'unknown error';\n return {\n data: { error: `Unable to create room, ${errorMessage}` },\n success: false,\n };\n }\n};","export interface StartMeetingProgressTimerParameters {\n updateMeetingProgressTime: (formattedTime: string) => void;\n validated: boolean;\n roomName: string;\n getUpdatedAllParams: () => StartMeetingProgressTimerParameters;\n [key: string]: any;\n}\n\nexport interface StartMeetingProgressTimerOptions {\n startTime: number;\n parameters: StartMeetingProgressTimerParameters;\n}\n\nexport type StartMeetingProgressTimerType = (options: StartMeetingProgressTimerOptions) => void;\n\n/**\n * Starts a one-second meeting progress timer and updates a formatted elapsed-time string.\n *\n * The timer automatically stops when the current runtime parameters indicate the\n * meeting is no longer validated or no room is active.\n *\n * @param options Timer start options.\n *\n * @example\n * ```typescript\n * startMeetingProgressTimer({\n * startTime: Math.floor(Date.now() / 1000),\n * parameters: {\n * validated: true,\n * roomName: 'room123',\n * updateMeetingProgressTime: setMeetingTime,\n * getUpdatedAllParams: () => currentParams,\n * },\n * });\n * ```\n */\nexport function startMeetingProgressTimer({\n startTime,\n parameters,\n}: StartMeetingProgressTimerOptions): void {\n let { updateMeetingProgressTime, getUpdatedAllParams } = parameters;\n\n function calculateElapsedTime(currentStartTime: number): number {\n const currentTime = Math.floor(new Date().getTime() / 1000);\n return currentTime - currentStartTime;\n }\n\n function padNumber(value: number): string {\n return value.toString().padStart(2, '0');\n }\n\n function formatTime(time: number): string {\n const hours = Math.floor(time / 3600);\n const minutes = Math.floor((time % 3600) / 60);\n const seconds = Math.floor(time % 60);\n return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`;\n }\n\n let elapsedTime = calculateElapsedTime(startTime);\n\n let timeProgress: ReturnType<typeof setInterval> | null = setInterval(() => {\n elapsedTime++;\n updateMeetingProgressTime(formatTime(elapsedTime));\n\n parameters = getUpdatedAllParams();\n\n if (!parameters.validated || !parameters.roomName) {\n clearInterval(timeProgress!);\n timeProgress = null;\n }\n }, 1000);\n}","import type { EventType, ShowAlert } from '../../types/types';\n\nexport interface MeetingTimeRemainingOptions {\n timeRemaining: number;\n showAlert?: ShowAlert;\n eventType: EventType;\n}\n\nexport type MeetingTimeRemainingType = (options: MeetingTimeRemainingOptions) => Promise<void>;\n\n/**\n * Shows a meeting countdown alert for non-chat event types.\n *\n * @param options Function options including the remaining time in milliseconds.\n * @returns A promise that resolves after the alert has been evaluated and dispatched.\n */\nexport const meetingTimeRemaining = async ({\n timeRemaining,\n showAlert,\n eventType,\n}: MeetingTimeRemainingOptions): Promise<void> => {\n const minutes = Math.floor(timeRemaining / 60000);\n const seconds = Math.floor((timeRemaining % 60000) / 1000);\n const timeRemainingString = `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n\n if (eventType !== 'chat') {\n showAlert?.({\n message: `The event will end in ${timeRemainingString} minutes.`,\n type: 'success',\n duration: 3000,\n });\n }\n};","import type { WaitingRoomParticipant } from '../../types/types';\n\nexport interface AllWaitingRoomMembersOptions {\n waitingParticipants: WaitingRoomParticipant[];\n updateWaitingRoomList: (participants: WaitingRoomParticipant[]) => void;\n updateTotalReqWait: (totalReqs: number) => void;\n}\n\nexport type AllWaitingRoomMembersType = (\n options: AllWaitingRoomMembersOptions,\n) => Promise<void>;\n\n/**\n * Replaces the waiting-room list and recalculates the combined waiting count.\n *\n * @param {AllWaitingRoomMembersOptions} options - Waiting-room state setters.\n * @returns {Promise<void>} Resolves after the state updates run.\n *\n * @example\n * ```typescript\n * await allWaitingRoomMembers({\n * waitingParticipants,\n * updateWaitingRoomList: setWaitingRoomList,\n * updateTotalReqWait: setTotalReqWait,\n * });\n * ```\n */\nexport const allWaitingRoomMembers = async ({\n waitingParticipants,\n updateWaitingRoomList,\n updateTotalReqWait,\n}: AllWaitingRoomMembersOptions): Promise<void> => {\n updateWaitingRoomList(waitingParticipants);\n updateTotalReqWait(waitingParticipants.length);\n};\n","import type { Socket } from 'socket.io-client';\nimport type {\n ConnectIpsParameters,\n ConnectLocalIpsParameters,\n OnScreenChangesParameters,\n ReorderStreamsParameters,\n} from '../../types/types';\n\nexport interface AllMembersParticipantLike {\n id?: string | number;\n isBanned?: boolean;\n isSuspended?: boolean;\n name?: string | null;\n audioID?: string | null;\n videoID?: string | null;\n}\n\nexport interface AllMembersRequestLike {\n id?: string | number;\n}\n\nexport interface AllMembersOnScreenChangesOptions<TParameters = unknown> {\n parameters: TParameters;\n}\n\nexport type AllMembersOnScreenChangesType<TParameters = unknown> = (\n options: AllMembersOnScreenChangesOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface AllMembersConnectIpsOptions<\n TParameters = unknown,\n TConsumeSocket = unknown,\n> {\n consume_sockets: TConsumeSocket[];\n remIP: string[];\n parameters: TParameters;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n}\n\nexport type AllMembersConnectIpsType<\n TParameters = unknown,\n TConsumeSocket = unknown,\n> = (\n options: AllMembersConnectIpsOptions<TParameters, TConsumeSocket>,\n) => Promise<[TConsumeSocket[], string[]]>;\n\nexport interface AllMembersConnectLocalIpsOptions<\n TParameters = unknown,\n TSocket = Socket,\n> {\n socket: TSocket;\n parameters: TParameters;\n}\n\nexport type AllMembersConnectLocalIpsType<\n TParameters = unknown,\n TSocket = Socket,\n> = (\n options: AllMembersConnectLocalIpsOptions<TParameters, TSocket>,\n) => Promise<unknown>;\n\nexport interface AllMembersSleepOptions {\n ms: number;\n}\n\nexport type AllMembersSleepType = (\n options: AllMembersSleepOptions,\n) => Promise<unknown>;\n\nexport interface AllMembersReorderStreamsOptions<TParameters = unknown> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type AllMembersReorderStreamsType<TParameters = unknown> = (\n options: AllMembersReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface AllMembersParameters<\n TParticipantSummary extends AllMembersParticipantLike = AllMembersParticipantLike,\n TParticipant extends AllMembersParticipantLike = AllMembersParticipantLike,\n TRequest extends AllMembersRequestLike = AllMembersRequestLike,\n TCoHostResponsibility = unknown,\n TWaitingRoomParticipant = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters,\n> {\n participantsAll: TParticipantSummary[];\n participants: TParticipant[];\n dispActiveNames: string[];\n requestList: TRequest[];\n coHost: string;\n coHostResponsibility: TCoHostResponsibility[];\n lock_screen: boolean;\n firstAll: boolean;\n membersReceived: boolean;\n roomRecvIPs: string[];\n deferScreenReceived: boolean;\n screenId?: string;\n shareScreenStarted: boolean;\n meetingDisplayType: string;\n hostFirstSwitch: boolean;\n waitingRoomList: TWaitingRoomParticipant[];\n islevel: string;\n socket: TSocket;\n updateParticipantsAll: (participantsAll: TParticipantSummary[]) => void;\n updateParticipants: (participants: TParticipant[]) => void;\n updateRequestList: (requestList: TRequest[]) => void;\n updateCoHost: (coHost: string) => void;\n updateCoHostResponsibility: (coHostRes: TCoHostResponsibility[]) => void;\n updateFirstAll: (firstAll: boolean) => void;\n updateMembersReceived: (membersReceived: boolean) => void;\n updateDeferScreenReceived: (deferScreenReceived: boolean) => void;\n updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n updateHostFirstSwitch: (hostFirstSwitch: boolean) => void;\n updateConsume_sockets: (sockets: TConsumeSocket[]) => void;\n updateRoomRecvIPs: (ips: string[]) => void;\n updateIsLoadingModalVisible: (visible: boolean) => void;\n updateTotalReqWait: (total: number) => void;\n onScreenChanges: AllMembersOnScreenChangesType<TOnScreenChangesParameters>;\n connectIps: AllMembersConnectIpsType<TConnectIpsParameters, TConsumeSocket>;\n connectLocalIps?: AllMembersConnectLocalIpsType<TConnectLocalIpsParameters, TSocket>;\n sleep: AllMembersSleepType;\n reorderStreams: AllMembersReorderStreamsType<TReorderStreamsParameters>;\n getUpdatedAllParams: () =>\n AllMembersParameters<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TWaitingRoomParticipant,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TConnectLocalIpsParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface AllMembersOptions<\n TParticipantSummary extends AllMembersParticipantLike = AllMembersParticipantLike,\n TParticipant extends AllMembersParticipantLike = AllMembersParticipantLike,\n TRequest extends AllMembersRequestLike = AllMembersRequestLike,\n TCoHostResponsibility = unknown,\n TWaitingRoomParticipant = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters,\n> {\n members: TParticipant[];\n requestss: TRequest[];\n coHoste: string;\n coHostRes: TCoHostResponsibility[];\n parameters:\n AllMembersParameters<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TWaitingRoomParticipant,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TConnectLocalIpsParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n consume_sockets: TConsumeSocket[];\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n}\n\nexport type AllMembersType<\n TParticipantSummary extends AllMembersParticipantLike = AllMembersParticipantLike,\n TParticipant extends AllMembersParticipantLike = AllMembersParticipantLike,\n TRequest extends AllMembersRequestLike = AllMembersRequestLike,\n TCoHostResponsibility = unknown,\n TWaitingRoomParticipant = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters,\n> = (\n options: AllMembersOptions<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TWaitingRoomParticipant,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TConnectLocalIpsParameters,\n TReorderStreamsParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Reconciles the authoritative member list with local UI state and receiver-domain setup.\n *\n * @param {AllMembersOptions} options - Member payload, host metadata, and receiver connection helpers.\n * @returns {Promise<void>} Resolves once participant state, requests, and receiver sockets are synchronized.\n *\n * @example\n * ```typescript\n * await allMembers({\n * members,\n * requestss,\n * coHoste: 'host-2',\n * coHostRes,\n * parameters,\n * consume_sockets,\n * apiUserName: 'api-user',\n * apiKey: 'api-key',\n * apiToken: 'api-token',\n * });\n * ```\n */\nexport const allMembers = async <\n TParticipantSummary extends AllMembersParticipantLike = AllMembersParticipantLike,\n TParticipant extends AllMembersParticipantLike = AllMembersParticipantLike,\n TRequest extends AllMembersRequestLike = AllMembersRequestLike,\n TCoHostResponsibility = unknown,\n TWaitingRoomParticipant = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TConnectLocalIpsParameters &\n TReorderStreamsParameters,\n>({\n members,\n requestss,\n coHoste,\n coHostRes,\n parameters,\n consume_sockets,\n apiUserName,\n apiKey,\n apiToken,\n}: AllMembersOptions<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TWaitingRoomParticipant,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TConnectLocalIpsParameters,\n TReorderStreamsParameters,\n TAllParameters\n>): Promise<void> => {\n let {\n participantsAll,\n participants,\n dispActiveNames,\n requestList,\n lock_screen,\n firstAll,\n membersReceived,\n roomRecvIPs,\n deferScreenReceived,\n screenId,\n shareScreenStarted,\n meetingDisplayType,\n hostFirstSwitch,\n waitingRoomList,\n islevel,\n socket,\n updateParticipantsAll,\n updateParticipants,\n updateRequestList,\n updateCoHost,\n updateCoHostResponsibility,\n updateFirstAll,\n updateMembersReceived,\n updateDeferScreenReceived,\n updateShareScreenStarted,\n updateHostFirstSwitch,\n updateConsume_sockets,\n updateRoomRecvIPs,\n updateIsLoadingModalVisible,\n updateTotalReqWait,\n onScreenChanges,\n connectIps,\n connectLocalIps,\n sleep,\n reorderStreams,\n } = parameters;\n\n participantsAll = members.map(({ isBanned, isSuspended, name, audioID, videoID }) => ({\n isBanned,\n isSuspended,\n name,\n audioID,\n videoID,\n })) as TParticipantSummary[];\n updateParticipantsAll(participantsAll);\n\n participants = members.filter(\n (participant) => !participant.isBanned && !participant.isSuspended,\n );\n updateParticipants(participants);\n\n if (dispActiveNames.length > 0) {\n const missingDisplayedParticipants = dispActiveNames.filter(\n (name) => !participants.some((participant) => participant.name === name),\n );\n\n if (missingDisplayedParticipants.length > 0) {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n\n const onLocal = roomRecvIPs.length === 1 && roomRecvIPs[0] === 'none';\n\n if (!membersReceived && !onLocal) {\n if (roomRecvIPs.length < 1) {\n const checkIPs = setInterval(async () => {\n if (roomRecvIPs.length > 0) {\n clearInterval(checkIPs);\n\n if (deferScreenReceived && screenId) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n\n const [sockets_, ips_] = await connectIps({\n consume_sockets,\n remIP: roomRecvIPs,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n\n updateConsume_sockets(sockets_);\n updateRoomRecvIPs(ips_);\n membersReceived = true;\n updateMembersReceived(membersReceived);\n\n await sleep({ ms: 250 });\n updateIsLoadingModalVisible(false);\n deferScreenReceived = false;\n updateDeferScreenReceived(deferScreenReceived);\n }\n }, 10);\n } else {\n const [sockets_, ips_] = await connectIps({\n consume_sockets,\n remIP: roomRecvIPs,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n\n updateConsume_sockets(sockets_);\n updateRoomRecvIPs(ips_);\n membersReceived = true;\n updateMembersReceived(membersReceived);\n\n if (deferScreenReceived && screenId) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n\n await sleep({ ms: 250 });\n updateIsLoadingModalVisible(false);\n deferScreenReceived = false;\n updateDeferScreenReceived(deferScreenReceived);\n }\n }\n\n if (onLocal && !membersReceived) {\n if (connectLocalIps) {\n await connectLocalIps({ socket, parameters });\n }\n await sleep({ ms: 50 });\n updateIsLoadingModalVisible(false);\n }\n\n requestList = requestss.filter((request) =>\n participants.some((participant) => participant.id === request.id),\n );\n updateRequestList(requestList);\n updateTotalReqWait(requestList.length + waitingRoomList.length);\n\n updateCoHost(coHoste);\n updateCoHostResponsibility(coHostRes);\n\n if (!lock_screen && !firstAll) {\n await onScreenChanges({ parameters });\n if (meetingDisplayType !== 'all') {\n updateFirstAll(true);\n }\n } else if (islevel === '2' && !hostFirstSwitch) {\n await onScreenChanges({ parameters });\n updateHostFirstSwitch(true);\n }\n};\n","import type { Socket } from 'socket.io-client';\nimport type {\n ConnectIpsParameters,\n ConnectLocalIpsParameters,\n OnScreenChangesParameters,\n ReorderStreamsParameters,\n Settings,\n} from '../../types/types';\n\nexport interface AllMembersRestParticipantLike {\n id?: string | number;\n isBanned?: boolean;\n isSuspended?: boolean;\n name?: string | null;\n audioID?: string | null;\n videoID?: string | null;\n ScreenID?: string | null;\n ScreenOn?: boolean;\n}\n\nexport interface AllMembersRestRequestLike {\n id?: string | number;\n}\n\nexport interface AllMembersRestOnScreenChangesOptions<TParameters = unknown> {\n parameters: TParameters;\n}\n\nexport type AllMembersRestOnScreenChangesType<TParameters = unknown> = (\n options: AllMembersRestOnScreenChangesOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface AllMembersRestConnectIpsOptions<\n TParameters = unknown,\n TConsumeSocket = unknown,\n> {\n consume_sockets: TConsumeSocket[];\n remIP: string[];\n parameters: TParameters;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n}\n\nexport type AllMembersRestConnectIpsType<\n TParameters = unknown,\n TConsumeSocket = unknown,\n> = (\n options: AllMembersRestConnectIpsOptions<TParameters, TConsumeSocket>,\n) => Promise<[TConsumeSocket[], string[]]>;\n\nexport interface AllMembersRestConnectLocalIpsOptions<\n TParameters = unknown,\n TSocket = Socket,\n> {\n socket: TSocket;\n parameters: TParameters;\n}\n\nexport type AllMembersRestConnectLocalIpsType<\n TParameters = unknown,\n TSocket = Socket,\n> = (\n options: AllMembersRestConnectLocalIpsOptions<TParameters, TSocket>,\n) => Promise<unknown>;\n\nexport interface AllMembersRestSleepOptions {\n ms: number;\n}\n\nexport type AllMembersRestSleepType = (\n options: AllMembersRestSleepOptions,\n) => Promise<unknown>;\n\nexport interface AllMembersRestReorderStreamsOptions<TParameters = unknown> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type AllMembersRestReorderStreamsType<TParameters = unknown> = (\n options: AllMembersRestReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface AllMembersRestParameters<\n TParticipantSummary extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TParticipant extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TRequest extends AllMembersRestRequestLike = AllMembersRestRequestLike,\n TCoHostResponsibility = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters,\n> {\n participantsAll: TParticipantSummary[];\n participants: TParticipant[];\n dispActiveNames: string[];\n requestList: TRequest[];\n coHost: string;\n coHostResponsibility: TCoHostResponsibility[];\n lock_screen: boolean;\n firstAll: boolean;\n membersReceived: boolean;\n roomRecvIPs: string[];\n deferScreenReceived: boolean;\n screenId?: string;\n shareScreenStarted: boolean;\n meetingDisplayType: string;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n socket: TSocket;\n updateParticipantsAll: (participantsAll: TParticipantSummary[]) => void;\n updateParticipants: (participants: TParticipant[]) => void;\n updateRequestList: (requestList: TRequest[]) => void;\n updateCoHost: (coHost: string) => void;\n updateCoHostResponsibility: (\n coHostResponsibility: TCoHostResponsibility[],\n ) => void;\n updateFirstAll: (firstAll: boolean) => void;\n updateMembersReceived: (membersReceived: boolean) => void;\n updateDeferScreenReceived: (deferScreenReceived: boolean) => void;\n updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n updateAudioSetting: (audioSetting: string) => void;\n updateVideoSetting: (videoSetting: string) => void;\n updateScreenshareSetting: (screenshareSetting: string) => void;\n updateChatSetting: (chatSetting: string) => void;\n updateConsume_sockets: (consume_sockets: TConsumeSocket[]) => void;\n updateRoomRecvIPs: (ips: string[]) => void;\n updateIsLoadingModalVisible: (visible: boolean) => void;\n onScreenChanges: AllMembersRestOnScreenChangesType<TOnScreenChangesParameters>;\n connectIps: AllMembersRestConnectIpsType<TConnectIpsParameters, TConsumeSocket>;\n connectLocalIps?: AllMembersRestConnectLocalIpsType<TConnectLocalIpsParameters, TSocket>;\n sleep: AllMembersRestSleepType;\n reorderStreams: AllMembersRestReorderStreamsType<TReorderStreamsParameters>;\n getUpdatedAllParams: () =>\n AllMembersRestParameters<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TReorderStreamsParameters,\n TConnectLocalIpsParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface AllMembersRestOptions<\n TParticipantSummary extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TParticipant extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TRequest extends AllMembersRestRequestLike = AllMembersRestRequestLike,\n TCoHostResponsibility = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters,\n> {\n members: TParticipant[];\n settings: Settings;\n coHoste?: string;\n coHostRes?: TCoHostResponsibility[];\n parameters:\n AllMembersRestParameters<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TReorderStreamsParameters,\n TConnectLocalIpsParameters,\n TAllParameters\n > & TAllParameters;\n consume_sockets: TConsumeSocket[];\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n}\n\nexport type AllMembersRestType<\n TParticipantSummary extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TParticipant extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TRequest extends AllMembersRestRequestLike = AllMembersRestRequestLike,\n TCoHostResponsibility = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters,\n> = (\n options: AllMembersRestOptions<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TReorderStreamsParameters,\n TConnectLocalIpsParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Reconciles incremental member updates, consume-domain setup, and room media settings.\n *\n * @param {AllMembersRestOptions} options - Member payload, room settings, and receiver connection helpers.\n * @returns {Promise<void>} Resolves once participant state, co-host state, and settings are synchronized.\n *\n * @example\n * ```typescript\n * await allMembersRest({\n * members,\n * settings,\n * coHoste,\n * coHostRes,\n * parameters,\n * consume_sockets,\n * apiUserName: 'api-user',\n * apiKey: 'api-key',\n * apiToken: 'api-token',\n * });\n * ```\n */\nexport const allMembersRest = async <\n TParticipantSummary extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TParticipant extends AllMembersRestParticipantLike = AllMembersRestParticipantLike,\n TRequest extends AllMembersRestRequestLike = AllMembersRestRequestLike,\n TCoHostResponsibility = unknown,\n TConsumeSocket = unknown,\n TSocket = Socket,\n TOnScreenChangesParameters = OnScreenChangesParameters,\n TConnectIpsParameters = ConnectIpsParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TConnectLocalIpsParameters = ConnectLocalIpsParameters,\n TAllParameters extends TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters = TOnScreenChangesParameters &\n TConnectIpsParameters &\n TReorderStreamsParameters &\n TConnectLocalIpsParameters,\n>({\n members,\n settings,\n coHoste,\n coHostRes,\n parameters,\n consume_sockets,\n apiUserName,\n apiKey,\n apiToken,\n}: AllMembersRestOptions<\n TParticipantSummary,\n TParticipant,\n TRequest,\n TCoHostResponsibility,\n TConsumeSocket,\n TSocket,\n TOnScreenChangesParameters,\n TConnectIpsParameters,\n TReorderStreamsParameters,\n TConnectLocalIpsParameters,\n TAllParameters\n>): Promise<void> => {\n let {\n participantsAll,\n participants,\n dispActiveNames,\n requestList,\n coHost,\n coHostResponsibility,\n lock_screen,\n firstAll,\n membersReceived,\n roomRecvIPs,\n deferScreenReceived,\n screenId,\n shareScreenStarted,\n meetingDisplayType,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n socket,\n updateParticipantsAll,\n updateParticipants,\n updateRequestList,\n updateCoHost,\n updateCoHostResponsibility,\n updateFirstAll,\n updateMembersReceived,\n updateDeferScreenReceived,\n updateShareScreenStarted,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateChatSetting,\n updateConsume_sockets,\n updateRoomRecvIPs,\n updateIsLoadingModalVisible,\n onScreenChanges,\n connectIps,\n connectLocalIps,\n sleep,\n reorderStreams,\n } = parameters;\n\n participantsAll = members.map((participant) => ({\n isBanned: participant.isBanned,\n isSuspended: participant.isSuspended,\n name: participant.name,\n audioID: participant.audioID,\n videoID: participant.videoID,\n })) as TParticipantSummary[];\n updateParticipantsAll(participantsAll);\n\n participants = members.filter(\n (participant) => !participant.isBanned && !participant.isSuspended,\n );\n updateParticipants(participants);\n\n if (dispActiveNames.length > 0) {\n const missingDisplayedParticipants = dispActiveNames.filter(\n (name) => !participants.some((participant) => participant.name === name),\n );\n if (missingDisplayedParticipants.length > 0 && membersReceived) {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n\n const onLocal = roomRecvIPs.length === 1 && roomRecvIPs[0] === 'none';\n\n if (!onLocal) {\n if (!membersReceived) {\n if (roomRecvIPs.length < 1) {\n const checkIPs = setInterval(async () => {\n if (roomRecvIPs.length > 0) {\n clearInterval(checkIPs);\n\n if (deferScreenReceived && screenId) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n\n const [sockets_, ips_] = await connectIps({\n consume_sockets,\n remIP: roomRecvIPs,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n\n if (sockets_ && ips_) {\n updateConsume_sockets(sockets_);\n updateRoomRecvIPs(ips_);\n }\n\n membersReceived = true;\n updateMembersReceived(membersReceived);\n await sleep({ ms: 250 });\n updateIsLoadingModalVisible(false);\n deferScreenReceived = false;\n updateDeferScreenReceived(deferScreenReceived);\n }\n }, 10);\n } else {\n const [sockets_, ips_] = await connectIps({\n consume_sockets,\n remIP: roomRecvIPs,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n\n if (sockets_ && ips_) {\n updateConsume_sockets(sockets_);\n updateRoomRecvIPs(ips_);\n }\n membersReceived = true;\n updateMembersReceived(membersReceived);\n\n if (deferScreenReceived && screenId) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n\n await sleep({ ms: 250 });\n updateIsLoadingModalVisible(false);\n deferScreenReceived = false;\n updateDeferScreenReceived(deferScreenReceived);\n }\n } else if (screenId) {\n const host = participants.find(\n (participant) =>\n participant.ScreenID === screenId && participant.ScreenOn === true,\n );\n if (deferScreenReceived && host) {\n shareScreenStarted = true;\n updateShareScreenStarted(shareScreenStarted);\n }\n }\n }\n\n if (onLocal && !membersReceived) {\n if (connectLocalIps) {\n await connectLocalIps({ socket, parameters });\n }\n await sleep({ ms: 50 });\n updateIsLoadingModalVisible(false);\n }\n\n requestList = requestList.filter((request) =>\n participants.some((participant) => participant.id === request.id),\n );\n updateRequestList(requestList);\n\n coHost = coHoste!;\n updateCoHost(coHost);\n coHostResponsibility = coHostRes!;\n updateCoHostResponsibility(coHostResponsibility);\n\n if (!lock_screen && !firstAll) {\n await onScreenChanges({ parameters });\n if (meetingDisplayType !== 'all') {\n firstAll = true;\n updateFirstAll(firstAll);\n }\n }\n\n try {\n if (membersReceived) {\n [audioSetting, videoSetting, screenshareSetting, chatSetting] = settings;\n updateAudioSetting(audioSetting);\n updateVideoSetting(videoSetting);\n updateScreenshareSetting(screenshareSetting);\n updateChatSetting(chatSetting);\n }\n } catch {\n // no-op\n }\n};\n","import type { Participant } from '../../types/types';\n\nexport interface BanParticipantReorderOptions<TParameters = unknown> {\n add?: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type BanParticipantReorderType<TParameters = unknown> = (\n options: BanParticipantReorderOptions<TParameters>,\n) => Promise<void>;\n\nexport interface BanParticipantParameters<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n> {\n activeNames: string[];\n dispActiveNames: string[];\n participants: TParticipant[];\n updateParticipants: (participants: TParticipant[]) => void;\n reorderStreams: BanParticipantReorderType<TParameters>;\n [key: string]: any;\n}\n\nexport interface BanParticipantOptions<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n> {\n name: string;\n parameters: BanParticipantParameters<TParameters, TParticipant> & TParameters;\n}\n\nexport type BanParticipantType<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n> = (options: BanParticipantOptions<TParameters, TParticipant>) => Promise<void>;\n\n/**\n * Removes a banned participant from the rendered participant list and reorders streams if needed.\n *\n * @param {BanParticipantOptions} options - Participant name and stream reordering helpers.\n * @returns {Promise<void>} Resolves when participant state is updated.\n *\n * @example\n * ```typescript\n * await banParticipant({\n * name: 'John Doe',\n * parameters,\n * });\n * ```\n */\nexport const banParticipant = async <\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n>({\n name,\n parameters,\n}: BanParticipantOptions<TParameters, TParticipant>): Promise<void> => {\n const {\n activeNames,\n dispActiveNames,\n participants,\n updateParticipants,\n reorderStreams,\n } = parameters;\n\n if (activeNames.includes(name) || dispActiveNames.includes(name)) {\n updateParticipants(\n participants.filter((participant) => participant.name !== name),\n );\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n};\n","export interface ControlMediaHostNestedOptions<TParameters = unknown> {\n parameters: TParameters;\n}\n\nexport interface ControlMediaHostTrackLike {\n enabled: boolean;\n kind?: string;\n}\n\nexport interface ControlMediaHostMediaStreamLike {\n getAudioTracks?: () => ControlMediaHostTrackLike[];\n getVideoTracks?: () => ControlMediaHostTrackLike[];\n tracks?: ControlMediaHostTrackLike[];\n [key: string]: any;\n}\n\nexport interface ControlMediaHostOnScreenChangesOptions<TParameters = unknown>\n extends ControlMediaHostNestedOptions<TParameters> {\n changed?: boolean;\n}\n\nexport type ControlMediaHostOnScreenChangesType<TParameters = unknown> = (\n options: ControlMediaHostOnScreenChangesOptions<TParameters>,\n) => Promise<void>;\n\nexport type ControlMediaHostStopShareScreenType<TParameters = unknown> = (\n options: ControlMediaHostNestedOptions<TParameters>,\n) => Promise<void>;\n\nexport type ControlMediaHostDisconnectSendTransportVideoType<\n TParameters = unknown,\n> = (options: ControlMediaHostNestedOptions<TParameters>) => Promise<void>;\n\nexport type ControlMediaHostDisconnectSendTransportAudioType<\n TParameters = unknown,\n> = (options: ControlMediaHostNestedOptions<TParameters>) => Promise<void>;\n\nexport type ControlMediaHostDisconnectSendTransportScreenType<\n TParameters = unknown,\n> = (options: ControlMediaHostNestedOptions<TParameters>) => Promise<void>;\n\nexport interface ControlMediaHostParameters<\n TOnScreenChangesParameters = unknown,\n TStopShareScreenParameters = unknown,\n TDisconnectSendTransportVideoParameters = unknown,\n TDisconnectSendTransportAudioParameters = unknown,\n TDisconnectSendTransportScreenParameters = unknown,\n TAllParameters extends TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters,\n TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream,\n> {\n updateAdminRestrictSetting: (value: boolean) => void;\n localStream: TMediaStream | null;\n updateLocalStream: (stream: TMediaStream | null) => void;\n updateAudioAlreadyOn: (value: boolean) => void;\n localStreamScreen: TMediaStream | null;\n updateLocalStreamScreen: (stream: TMediaStream | null) => void;\n localStreamVideo: TMediaStream | null;\n updateLocalStreamVideo: (stream: TMediaStream | null) => void;\n updateScreenAlreadyOn: (value: boolean) => void;\n updateVideoAlreadyOn: (value: boolean) => void;\n updateChatAlreadyOn: (value: boolean) => void;\n onScreenChanges: ControlMediaHostOnScreenChangesType<TOnScreenChangesParameters>;\n stopShareScreen: ControlMediaHostStopShareScreenType<TStopShareScreenParameters>;\n disconnectSendTransportVideo: ControlMediaHostDisconnectSendTransportVideoType<TDisconnectSendTransportVideoParameters>;\n disconnectSendTransportAudio: ControlMediaHostDisconnectSendTransportAudioType<TDisconnectSendTransportAudioParameters>;\n disconnectSendTransportScreen: ControlMediaHostDisconnectSendTransportScreenType<TDisconnectSendTransportScreenParameters>;\n getUpdatedAllParams: () =>\n ControlMediaHostParameters<\n TOnScreenChangesParameters,\n TStopShareScreenParameters,\n TDisconnectSendTransportVideoParameters,\n TDisconnectSendTransportAudioParameters,\n TDisconnectSendTransportScreenParameters,\n TAllParameters,\n TMediaStream\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface ControlMediaHostOptions<\n TOnScreenChangesParameters = unknown,\n TStopShareScreenParameters = unknown,\n TDisconnectSendTransportVideoParameters = unknown,\n TDisconnectSendTransportAudioParameters = unknown,\n TDisconnectSendTransportScreenParameters = unknown,\n TAllParameters extends TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters,\n TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream,\n> {\n type: 'audio' | 'video' | 'screenshare' | 'chat' | 'all';\n parameters:\n ControlMediaHostParameters<\n TOnScreenChangesParameters,\n TStopShareScreenParameters,\n TDisconnectSendTransportVideoParameters,\n TDisconnectSendTransportAudioParameters,\n TDisconnectSendTransportScreenParameters,\n TAllParameters,\n TMediaStream\n > & TAllParameters;\n}\n\nexport type ControlMediaHostType<\n TOnScreenChangesParameters = unknown,\n TStopShareScreenParameters = unknown,\n TDisconnectSendTransportVideoParameters = unknown,\n TDisconnectSendTransportAudioParameters = unknown,\n TDisconnectSendTransportScreenParameters = unknown,\n TAllParameters extends TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters,\n TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream,\n> = (\n options: ControlMediaHostOptions<\n TOnScreenChangesParameters,\n TStopShareScreenParameters,\n TDisconnectSendTransportVideoParameters,\n TDisconnectSendTransportAudioParameters,\n TDisconnectSendTransportScreenParameters,\n TAllParameters,\n TMediaStream\n >,\n) => Promise<void>;\n\n/**\n * Applies host-enforced media restrictions across local audio, video, screenshare, and chat state.\n *\n * @param {ControlMediaHostOptions} options - Restriction type and shared transport/screen callbacks.\n * @returns {Promise<void>} Resolves once the requested host restriction is applied.\n *\n * @example\n * ```typescript\n * await controlMediaHost({\n * type: 'video',\n * parameters,\n * });\n * ```\n */\nexport const controlMediaHost = async <\n TOnScreenChangesParameters = unknown,\n TStopShareScreenParameters = unknown,\n TDisconnectSendTransportVideoParameters = unknown,\n TDisconnectSendTransportAudioParameters = unknown,\n TDisconnectSendTransportScreenParameters = unknown,\n TAllParameters extends TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters = TOnScreenChangesParameters &\n TStopShareScreenParameters &\n TDisconnectSendTransportVideoParameters &\n TDisconnectSendTransportAudioParameters &\n TDisconnectSendTransportScreenParameters,\n TMediaStream extends ControlMediaHostMediaStreamLike = MediaStream,\n>({\n type,\n parameters,\n}: ControlMediaHostOptions<\n TOnScreenChangesParameters,\n TStopShareScreenParameters,\n TDisconnectSendTransportVideoParameters,\n TDisconnectSendTransportAudioParameters,\n TDisconnectSendTransportScreenParameters,\n TAllParameters,\n TMediaStream\n>): Promise<void> => {\n const {\n updateAdminRestrictSetting,\n updateLocalStream,\n updateAudioAlreadyOn,\n updateLocalStreamScreen,\n updateLocalStreamVideo,\n updateScreenAlreadyOn,\n updateVideoAlreadyOn,\n updateChatAlreadyOn,\n onScreenChanges,\n stopShareScreen,\n disconnectSendTransportVideo,\n disconnectSendTransportAudio,\n disconnectSendTransportScreen,\n } = parameters;\n\n const { localStream, localStreamScreen, localStreamVideo } =\n parameters.getUpdatedAllParams();\n\n const disableTrack = (\n stream: TMediaStream | null,\n kind: 'audio' | 'video',\n ): boolean => {\n const getTracks =\n kind === 'audio' ? stream?.getAudioTracks : stream?.getVideoTracks;\n const tracks =\n typeof getTracks === 'function'\n ? getTracks.call(stream)\n : stream?.tracks?.filter((track) => track.kind === kind) ?? [];\n const track = tracks && tracks[0];\n if (track) {\n track.enabled = false;\n return true;\n }\n return false;\n };\n\n try {\n updateAdminRestrictSetting(true);\n\n if (type === 'audio') {\n disableTrack(localStream, 'audio');\n updateLocalStream(localStream ?? null);\n await disconnectSendTransportAudio({ parameters });\n updateAudioAlreadyOn(false);\n } else if (type === 'video') {\n disableTrack(localStream, 'video');\n updateLocalStream(localStream ?? null);\n await disconnectSendTransportVideo({ parameters });\n await onScreenChanges({ changed: true, parameters });\n\n disableTrack(localStreamVideo, 'video');\n updateLocalStreamVideo(localStreamVideo ?? null);\n await disconnectSendTransportVideo({ parameters });\n await onScreenChanges({ changed: true, parameters });\n\n updateVideoAlreadyOn(false);\n } else if (type === 'screenshare') {\n disableTrack(localStreamScreen, 'video');\n updateLocalStreamScreen(localStreamScreen ?? null);\n await disconnectSendTransportScreen({ parameters });\n await stopShareScreen({ parameters });\n updateScreenAlreadyOn(false);\n } else if (type === 'chat') {\n updateChatAlreadyOn(false);\n } else if (type === 'all') {\n disableTrack(localStream, 'audio');\n updateLocalStream(localStream ?? null);\n await disconnectSendTransportAudio({ parameters });\n updateAudioAlreadyOn(false);\n\n disableTrack(localStreamScreen, 'video');\n updateLocalStreamScreen(localStreamScreen ?? null);\n await disconnectSendTransportScreen({ parameters });\n await stopShareScreen({ parameters });\n updateScreenAlreadyOn(false);\n\n disableTrack(localStream, 'video');\n updateLocalStream(localStream ?? null);\n await disconnectSendTransportVideo({ parameters });\n await onScreenChanges({ changed: true, parameters });\n\n disableTrack(localStreamVideo, 'video');\n updateLocalStreamVideo(localStreamVideo ?? null);\n await disconnectSendTransportVideo({ parameters });\n await onScreenChanges({ changed: true, parameters });\n\n updateVideoAlreadyOn(false);\n }\n } catch (error) {\n console.error('Error in controlMediaHost:', error);\n }\n};\n","import type { ShowAlert } from '../../types/types';\n\nexport interface DisconnectOptions {\n showAlert?: ShowAlert;\n redirectURL?: string;\n onWeb: boolean;\n updateValidated?: (isValidated: boolean) => void;\n}\n\nexport type DisconnectType = (options: DisconnectOptions) => Promise<void>;\n\n/**\n * Handles a forced session disconnect by redirecting web users or showing a local alert fallback.\n *\n * @param {DisconnectOptions} options - Redirect and alert handlers for the disconnect flow.\n * @returns {Promise<void>} Resolves after the redirect or alert side effect is applied.\n *\n * @example\n * ```typescript\n * await disconnect({\n * onWeb: true,\n * redirectURL: 'https://example.com/exit',\n * });\n * ```\n */\nexport const disconnect = async ({\n showAlert,\n redirectURL,\n onWeb,\n}: DisconnectOptions): Promise<void> => {\n if (onWeb && redirectURL && typeof window !== 'undefined') {\n window.location.href = redirectURL;\n } else {\n showAlert?.({\n message: 'You have been disconnected from the session.',\n type: 'danger',\n duration: 2000,\n });\n }\n};\n","export interface DisconnectUserSelfSocketLike {\n id?: string;\n emit: (event: string, ...args: any[]) => void;\n}\n\nexport interface DisconnectUserSelfOptions {\n member: string;\n roomName: string;\n socket: DisconnectUserSelfSocketLike;\n localSocket?: DisconnectUserSelfSocketLike;\n}\n\nexport type DisconnectUserSelfType = (\n options: DisconnectUserSelfOptions,\n) => Promise<void>;\n\n/**\n * Emits a self-disconnect request, including the optional mirrored local socket.\n *\n * @param {DisconnectUserSelfOptions} options - Socket targets and participant identity.\n * @returns {Promise<void>} Resolves after the disconnect events are emitted.\n *\n * @example\n * ```typescript\n * await disconnectUserSelf({\n * member: 'user123',\n * roomName: 'main-room',\n * socket,\n * localSocket,\n * });\n * ```\n */\nexport async function disconnectUserSelf({\n member,\n roomName,\n socket,\n localSocket,\n}: DisconnectUserSelfOptions): Promise<void> {\n socket.emit('disconnectUser', {\n member,\n roomName,\n ban: true,\n });\n\n try {\n if (localSocket?.id) {\n localSocket.emit('disconnectUser', {\n member,\n roomName,\n ban: true,\n });\n }\n } catch {\n // no-op\n }\n}\n","import type { RtpCapabilities } from 'mediasoup-client/lib/types';\nimport type {\n AltDomains,\n ConsumeSocket,\n} from '../../types/types';\n\nexport interface ConnectIpsLikeOptions<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n> {\n consume_sockets: TConsumeSocket[];\n remIP: string[];\n apiUserName: string;\n apiKey?: string;\n apiToken: string;\n parameters: TParameters;\n}\n\nexport type ConnectIpsLikeType<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n> = (\n options: ConnectIpsLikeOptions<TParameters, TConsumeSocket>,\n) => Promise<[unknown[], string[]]>;\n\nexport interface GetDomainsParameters<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n TRtpCapabilities = RtpCapabilities,\n> {\n roomRecvIPs: string[];\n rtpCapabilities: TRtpCapabilities | null;\n consume_sockets: TConsumeSocket[];\n connectIps: ConnectIpsLikeType<TParameters, TConsumeSocket>;\n getUpdatedAllParams: () => GetDomainsParameters<TParameters, TConsumeSocket, TRtpCapabilities> & TParameters;\n [key: string]: any;\n}\n\nexport interface GetDomainsOptions<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n TRtpCapabilities = RtpCapabilities,\n> {\n domains: string[];\n alt_domains: AltDomains;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n parameters: GetDomainsParameters<TParameters, TConsumeSocket, TRtpCapabilities> & TParameters;\n}\n\nexport type GetDomainsType<\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n TRtpCapabilities = RtpCapabilities,\n> = (options: GetDomainsOptions<TParameters, TConsumeSocket, TRtpCapabilities>) => Promise<void>;\n\n/**\n * Resolves newly announced consuming domains to connection targets and connects missing ones.\n *\n * @param {GetDomainsOptions} options - Domain payload and shared consume-socket connection helpers.\n * @returns {Promise<void>} Resolves after any missing consume domains are connected.\n *\n * @example\n * ```typescript\n * await getDomains({\n * domains: ['recv-1', 'recv-2'],\n * alt_domains,\n * apiUserName: 'api-user',\n * apiKey: 'api-key',\n * apiToken: 'api-token',\n * parameters,\n * });\n * ```\n */\nexport const getDomains = async <\n TParameters = unknown,\n TConsumeSocket = ConsumeSocket,\n TRtpCapabilities = RtpCapabilities,\n>({\n domains,\n alt_domains,\n apiUserName,\n apiKey,\n apiToken,\n parameters,\n}: GetDomainsOptions<TParameters, TConsumeSocket, TRtpCapabilities>): Promise<void> => {\n let { roomRecvIPs, consume_sockets, connectIps } = parameters;\n const ipsToConnect: string[] = [];\n\n try {\n consume_sockets = parameters.getUpdatedAllParams().consume_sockets;\n\n for (const domain of domains) {\n const ipToCheck = alt_domains[domain] || domain;\n if (!roomRecvIPs.includes(ipToCheck)) {\n ipsToConnect.push(ipToCheck);\n }\n }\n\n await connectIps({\n consume_sockets,\n remIP: ipsToConnect,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n } catch (error) {\n console.error('Error in getDomains: ', error);\n }\n};\n","import type { EventType, ShowAlert } from '../../types/types';\n\nexport interface MeetingEndedOptions {\n showAlert?: ShowAlert;\n redirectURL?: string;\n onWeb: boolean;\n eventType: EventType;\n updateValidated?: (isValid: boolean) => void;\n}\n\nexport type MeetingEndedType = (options: MeetingEndedOptions) => Promise<void>;\n\n/**\n * Announces that the current event has ended and optionally redirects on web.\n *\n * @param {MeetingEndedOptions} options - Event-end behavior settings.\n * @returns {Promise<void>} Resolves after alerts and redirect scheduling are configured.\n *\n * @example\n * ```typescript\n * await meetingEnded({\n * onWeb: true,\n * eventType: 'conference',\n * redirectURL: 'https://example.com',\n * showAlert,\n * });\n * ```\n */\nexport const meetingEnded = async ({\n showAlert,\n redirectURL,\n onWeb,\n eventType,\n}: MeetingEndedOptions): Promise<void> => {\n if (eventType !== 'chat') {\n showAlert?.({\n message:\n 'The event has ended. You will be redirected to the home page in 2 seconds.',\n type: 'danger',\n duration: 2000,\n });\n }\n\n if (onWeb && redirectURL) {\n setTimeout(() => {\n window.location.href = redirectURL;\n }, 2000);\n }\n};\n","export interface MeetingStillThereOptions {\n updateIsConfirmHereModalVisible: (isVisible: boolean) => void;\n}\n\nexport type MeetingStillThereType = (\n options: MeetingStillThereOptions,\n) => Promise<void>;\n\n/**\n * Shows the \"still there\" confirmation modal.\n *\n * @param {MeetingStillThereOptions} options - Visibility setter for the confirmation modal.\n * @returns {Promise<void>} Resolves after the modal is shown.\n *\n * @example\n * ```typescript\n * await meetingStillThere({\n * updateIsConfirmHereModalVisible: setIsConfirmHereModalVisible,\n * });\n * ```\n */\nexport const meetingStillThere = async ({\n updateIsConfirmHereModalVisible,\n}: MeetingStillThereOptions): Promise<void> => {\n updateIsConfirmHereModalVisible(true);\n};\n","import type { Participant, ShowAlert } from '../../types/types';\n\nexport interface PanelistData {\n id: string;\n name: string;\n}\n\nexport interface PanelistsUpdatedData {\n panelists: PanelistData[];\n}\n\nexport interface PanelistFocusChangedData {\n focusEnabled: boolean;\n panelists: PanelistData[];\n muteOthersMic: boolean;\n muteOthersCamera: boolean;\n}\n\nexport interface ControlMediaData {\n type: 'audio' | 'video';\n action: 'mute' | 'unmute';\n reason?: string;\n}\n\nexport interface AddedAsPanelistData {\n message: string;\n}\n\nexport interface RemovedFromPanelistsData {\n message: string;\n}\n\nexport interface PanelistsUpdatedOptions {\n data: PanelistsUpdatedData;\n updatePanelists?: (panelists: Participant[]) => void;\n}\n\nexport interface PanelistFocusChangedOptions {\n data: PanelistFocusChangedData;\n updatePanelistsFocused?: (focused: boolean) => void;\n updateMuteOthersMic?: (mute: boolean) => void;\n updateMuteOthersCamera?: (mute: boolean) => void;\n updatePanelists?: (panelists: Participant[]) => void;\n currentPanelistsFocused?: boolean;\n currentPanelists?: Participant[];\n onScreenChanges?: () => Promise<void>;\n}\n\nexport interface ControlMediaOptions {\n data: ControlMediaData;\n showAlert?: ShowAlert;\n clickAudio?: () => void;\n clickVideo?: () => void;\n audioAlreadyOn?: boolean;\n videoAlreadyOn?: boolean;\n}\n\nexport interface AddedAsPanelistOptions {\n data: AddedAsPanelistData;\n showAlert?: ShowAlert;\n}\n\nexport interface RemovedFromPanelistsOptions {\n data: RemovedFromPanelistsData;\n showAlert?: ShowAlert;\n}\n\nexport type PanelistsUpdatedType = (options: PanelistsUpdatedOptions) => Promise<void>;\nexport type PanelistFocusChangedType = (options: PanelistFocusChangedOptions) => Promise<void>;\nexport type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;\nexport type AddedAsPanelistType = (options: AddedAsPanelistOptions) => Promise<void>;\nexport type RemovedFromPanelistsType = (options: RemovedFromPanelistsOptions) => Promise<void>;\n\nexport const panelistsUpdated: PanelistsUpdatedType = async ({\n data,\n updatePanelists,\n}): Promise<void> => {\n try {\n const { panelists } = data;\n\n if (updatePanelists) {\n updatePanelists(\n panelists.map((panelist) => ({\n id: panelist.id,\n name: panelist.name,\n audioID: '',\n videoID: '',\n } as Participant)),\n );\n }\n } catch (error) {\n console.error('Error handling panelistsUpdated:', error);\n }\n};\n\nexport const panelistFocusChanged: PanelistFocusChangedType = async ({\n data,\n updatePanelistsFocused,\n updateMuteOthersMic,\n updateMuteOthersCamera,\n updatePanelists,\n currentPanelistsFocused,\n currentPanelists,\n onScreenChanges,\n}): Promise<void> => {\n try {\n const { focusEnabled, panelists, muteOthersMic, muteOthersCamera } = data;\n const focusChanged = currentPanelistsFocused !== undefined && currentPanelistsFocused !== focusEnabled;\n const currentPanelistIds = (currentPanelists || []).map((panelist) => panelist.id).sort().join(',');\n const newPanelistIds = panelists.map((panelist) => panelist.id).sort().join(',');\n const panelistsChanged = currentPanelistIds !== newPanelistIds;\n\n updatePanelistsFocused?.(focusEnabled);\n updateMuteOthersMic?.(muteOthersMic);\n updateMuteOthersCamera?.(muteOthersCamera);\n\n if (updatePanelists) {\n updatePanelists(\n panelists.map((panelist) => ({\n id: panelist.id,\n name: panelist.name,\n audioID: '',\n videoID: '',\n } as Participant)),\n );\n }\n\n if ((focusChanged || panelistsChanged) && onScreenChanges) {\n await onScreenChanges();\n }\n } catch (error) {\n console.error('Error handling panelistFocusChanged:', error);\n }\n};\n\nexport const panelistControlMedia: ControlMediaType = async ({\n data,\n showAlert,\n clickAudio,\n clickVideo,\n audioAlreadyOn,\n videoAlreadyOn,\n}: ControlMediaOptions): Promise<void> => {\n try {\n const { type, action, reason } = data;\n\n if (action === 'mute') {\n if (type === 'audio' && audioAlreadyOn && clickAudio) {\n clickAudio();\n } else if (type === 'video' && videoAlreadyOn && clickVideo) {\n clickVideo();\n }\n\n if (showAlert && reason) {\n showAlert({\n message: `Your ${type === 'audio' ? 'microphone' : 'camera'} has been muted. ${reason}`,\n type: 'info',\n duration: 3000,\n });\n }\n }\n } catch (error) {\n console.error('Error handling controlMedia:', error);\n }\n};\n\nexport const addedAsPanelist: AddedAsPanelistType = async ({\n data,\n showAlert,\n}: AddedAsPanelistOptions): Promise<void> => {\n try {\n showAlert?.({\n message: data.message || 'You have been added as a panelist',\n type: 'success',\n duration: 3000,\n });\n } catch (error) {\n console.error('Error handling addedAsPanelist:', error);\n }\n};\n\nexport const removedFromPanelists: RemovedFromPanelistsType = async ({\n data,\n showAlert,\n}: RemovedFromPanelistsOptions): Promise<void> => {\n try {\n showAlert?.({\n message: data.message || 'You have been removed from panelists',\n type: 'info',\n duration: 3000,\n });\n } catch (error) {\n console.error('Error handling removedFromPanelists:', error);\n }\n};","import type { Request, WaitingRoomParticipant } from '../../types/types';\n\nexport interface ParticipantRequestedOptions {\n userRequest: Request;\n requestList: Request[];\n waitingRoomList: WaitingRoomParticipant[];\n updateTotalReqWait: (count: number) => void;\n updateRequestList: (list: Request[]) => void;\n}\n\nexport type ParticipantRequestedType = (\n options: ParticipantRequestedOptions,\n) => Promise<void>;\n\n/**\n * Appends a new participant request and refreshes the combined request/waiting count.\n *\n * @param {ParticipantRequestedOptions} options - Request payload and state setters.\n * @returns {Promise<void>} Resolves after the request state is updated.\n *\n * @example\n * ```typescript\n * await participantRequested({\n * userRequest,\n * requestList,\n * waitingRoomList,\n * updateRequestList: setRequestList,\n * updateTotalReqWait: setTotalReqWait,\n * });\n * ```\n */\nexport const participantRequested = async ({\n userRequest,\n requestList,\n waitingRoomList,\n updateTotalReqWait,\n updateRequestList,\n}: ParticipantRequestedOptions): Promise<void> => {\n const hasMatchingRequest = requestList.some(\n (request) => request.id === userRequest.id && request.icon === userRequest.icon,\n );\n\n const updatedRequestList = hasMatchingRequest\n ? requestList\n : [...requestList, userRequest];\n updateRequestList(updatedRequestList);\n updateTotalReqWait(updatedRequestList.length + waitingRoomList.length);\n};\n","import type { ShowAlert } from '../../types/types';\nimport type {\n PermissionConfig,\n} from '../permissions/updatePermissionConfig';\n\nexport interface PermissionUpdatedData {\n newLevel: string;\n message?: string;\n}\n\nexport interface PermissionConfigUpdatedData {\n config: PermissionConfig;\n}\n\nexport interface PermissionUpdatedOptions {\n data: PermissionUpdatedData;\n showAlert?: ShowAlert;\n updateIslevel?: (level: string) => void;\n}\n\nexport interface PermissionConfigUpdatedOptions {\n data: PermissionConfigUpdatedData;\n updatePermissionConfig?: (config: PermissionConfig) => void;\n}\n\nexport type PermissionUpdatedType = (options: PermissionUpdatedOptions) => Promise<void>;\nexport type PermissionConfigUpdatedType = (options: PermissionConfigUpdatedOptions) => Promise<void>;\n\nexport const permissionUpdated: PermissionUpdatedType = async ({\n data,\n showAlert,\n updateIslevel,\n}: PermissionUpdatedOptions): Promise<void> => {\n try {\n const { newLevel, message } = data;\n updateIslevel?.(newLevel);\n\n if (showAlert && message) {\n showAlert({\n message,\n type: newLevel === '1' ? 'success' : 'info',\n duration: 3000,\n });\n }\n } catch (error) {\n console.error('Error handling permissionUpdated:', error);\n }\n};\n\nexport const permissionConfigUpdated: PermissionConfigUpdatedType = async ({\n data,\n updatePermissionConfig,\n}: PermissionConfigUpdatedOptions): Promise<void> => {\n try {\n updatePermissionConfig?.(data.config);\n } catch (error) {\n console.error('Error handling permissionConfigUpdated:', error);\n }\n};","import type { ShowAlert } from '../../types/types';\n\nexport interface PersonJoinedOptions {\n showAlert?: ShowAlert;\n name: string;\n}\n\nexport type PersonJoinedType = (options: PersonJoinedOptions) => Promise<void>;\n\n/**\n * Announces that a participant has joined the event.\n *\n * @param {PersonJoinedOptions} options - Join alert settings.\n * @param {string} options.name - Participant name to display.\n * @param {ShowAlert} [options.showAlert] - Optional alert presenter.\n * @returns {Promise<void>} Resolves after the alert is dispatched.\n *\n * @example\n * ```typescript\n * await personJoined({\n * name: 'Alice',\n * showAlert: ({ message }) => console.log(message),\n * });\n * ```\n */\nexport const personJoined = async ({\n name,\n showAlert,\n}: PersonJoinedOptions): Promise<void> => {\n showAlert?.({\n message: `${name} joined the event.`,\n type: 'success',\n duration: 3000,\n });\n};\n","import type {\n CloseAndResizeParameters,\n PrepopulateUserMediaParameters,\n ReorderStreamsParameters,\n} from '../../types/types';\n\nexport interface ProducerMediaClosedCloseAndResizeOptions<TParameters = unknown> {\n producerId: string;\n kind: 'video' | 'screen' | 'audio' | 'screenshare';\n parameters: TParameters;\n}\n\nexport type ProducerMediaClosedCloseAndResizeType<TParameters = unknown> = (\n options: ProducerMediaClosedCloseAndResizeOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaClosedPrepopulateUserMediaOptions<\n TParameters = unknown,\n> {\n name: string;\n parameters: TParameters;\n}\n\nexport type ProducerMediaClosedPrepopulateUserMediaType<\n TParameters = unknown,\n> = (\n options: ProducerMediaClosedPrepopulateUserMediaOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaClosedReorderStreamsOptions<\n TParameters = unknown,\n> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type ProducerMediaClosedReorderStreamsType<TParameters = unknown> = (\n options: ProducerMediaClosedReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaClosedTransportLike {\n producerId: string;\n consumerTransport?: {\n close: () => Promise<void> | void;\n };\n consumer: {\n close: () => Promise<void> | void;\n };\n [key: string]: any;\n}\n\nexport interface ProducerMediaClosedParameters<\n TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,\n TCloseAndResizeParameters = CloseAndResizeParameters,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> {\n consumerTransports: TTransport[];\n updateConsumerTransports: (transports: TTransport[]) => void;\n hostLabel: string;\n shared: boolean;\n updateShared: (shared: boolean) => void;\n updateShareScreenStarted: (started: boolean) => void;\n updateScreenId: (screenId: string) => void;\n updateShareEnded: (ended: boolean) => void;\n closeAndResize: ProducerMediaClosedCloseAndResizeType<TCloseAndResizeParameters>;\n prepopulateUserMedia: ProducerMediaClosedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;\n reorderStreams: ProducerMediaClosedReorderStreamsType<TReorderStreamsParameters>;\n getUpdatedAllParams: () =>\n ProducerMediaClosedParameters<\n TTransport,\n TCloseAndResizeParameters,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface ProducerMediaClosedOptions<\n TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,\n TCloseAndResizeParameters = CloseAndResizeParameters,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> {\n producerId: string;\n kind: 'video' | 'screen' | 'audio' | 'screenshare';\n parameters:\n ProducerMediaClosedParameters<\n TTransport,\n TCloseAndResizeParameters,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n}\n\nexport type ProducerMediaClosedType<\n TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,\n TCloseAndResizeParameters = CloseAndResizeParameters,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> = (\n options: ProducerMediaClosedOptions<\n TTransport,\n TCloseAndResizeParameters,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Tears down a producer consumer transport and reconciles shared screen state when a producer closes.\n *\n * @param {ProducerMediaClosedOptions} options - Producer identity and shared room/media callbacks.\n * @returns {Promise<void>} Resolves once transport teardown and UI cleanup are complete.\n *\n * @example\n * ```typescript\n * await producerMediaClosed({\n * producerId: '12345',\n * kind: 'screenshare',\n * parameters,\n * });\n * ```\n */\nexport const producerMediaClosed = async <\n TTransport extends ProducerMediaClosedTransportLike = ProducerMediaClosedTransportLike,\n TCloseAndResizeParameters = CloseAndResizeParameters,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TCloseAndResizeParameters &\n TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n>({\n producerId,\n kind,\n parameters,\n}: ProducerMediaClosedOptions<\n TTransport,\n TCloseAndResizeParameters,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n>): Promise<void> => {\n const updatedParameters = parameters.getUpdatedAllParams();\n\n const {\n consumerTransports,\n updateConsumerTransports,\n hostLabel,\n shared,\n updateShared,\n updateShareScreenStarted,\n updateScreenId,\n updateShareEnded,\n closeAndResize,\n prepopulateUserMedia,\n reorderStreams,\n } = updatedParameters;\n\n const producerToClose = consumerTransports.find(\n (transportData) => transportData.producerId === producerId,\n );\n\n if (producerToClose) {\n try {\n await producerToClose.consumerTransport?.close();\n } catch (error) {\n console.error('Error closing consumer transport:', error);\n }\n\n try {\n producerToClose.consumer.close();\n } catch (error) {\n console.error('Error closing consumer:', error);\n }\n\n const updatedTransports = consumerTransports.filter(\n (transportData) => transportData.producerId !== producerId,\n );\n updateConsumerTransports(updatedTransports);\n\n await closeAndResize({\n producerId,\n kind,\n parameters: updatedParameters,\n });\n } else if (kind === 'screenshare' || kind === 'screen') {\n if (shared) {\n updateShared(false);\n } else {\n updateShareScreenStarted(false);\n updateScreenId('');\n }\n updateShareEnded(true);\n await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });\n await reorderStreams({\n add: false,\n screenChanged: true,\n parameters: updatedParameters,\n });\n }\n};\n","import type {\n PrepopulateUserMediaParameters,\n ReorderStreamsParameters,\n ReUpdateInterParameters,\n} from '../../types/types';\n\nexport interface ProducerMediaPausedPrepopulateUserMediaOptions<\n TParameters = unknown,\n> {\n name: string;\n parameters: TParameters;\n}\n\nexport type ProducerMediaPausedPrepopulateUserMediaType<\n TParameters = unknown,\n> = (\n options: ProducerMediaPausedPrepopulateUserMediaOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaPausedReorderStreamsOptions<\n TParameters = unknown,\n> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type ProducerMediaPausedReorderStreamsType<TParameters = unknown> = (\n options: ProducerMediaPausedReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaPausedReUpdateInterOptions<\n TParameters = unknown,\n> {\n name: string;\n add: boolean;\n force?: boolean;\n parameters: TParameters;\n}\n\nexport type ProducerMediaPausedReUpdateInterType<TParameters = unknown> = (\n options: ProducerMediaPausedReUpdateInterOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaPausedParticipantLike {\n name?: string | null;\n muted?: boolean;\n islevel?: string | null;\n videoID?: string | null;\n audioID?: string | null;\n}\n\nexport interface ProducerMediaPausedParameters<\n TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TReUpdateInterParameters = ReUpdateInterParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters,\n>\n {\n activeSounds: string[];\n meetingDisplayType: string;\n meetingVideoOptimized: boolean;\n participants: TParticipant[];\n oldSoundIds: string[];\n shared: boolean;\n shareScreenStarted: boolean;\n updateMainWindow: boolean;\n hostLabel: string;\n islevel: string;\n updateActiveSounds: (activeSounds: string[]) => void;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n reorderStreams: ProducerMediaPausedReorderStreamsType<TReorderStreamsParameters>;\n prepopulateUserMedia: ProducerMediaPausedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;\n reUpdateInter: ProducerMediaPausedReUpdateInterType<TReUpdateInterParameters>;\n getUpdatedAllParams: () =>\n ProducerMediaPausedParameters<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TReUpdateInterParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface ProducerMediaPausedOptions<\n TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TReUpdateInterParameters = ReUpdateInterParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters,\n> {\n producerId: string;\n kind: 'audio' | 'video' | 'screenshare' | 'screen';\n name: string;\n parameters:\n ProducerMediaPausedParameters<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TReUpdateInterParameters,\n TAllParameters\n > & TAllParameters;\n}\n\nexport type ProducerMediaPausedType<\n TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TReUpdateInterParameters = ReUpdateInterParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters,\n> = (\n options: ProducerMediaPausedOptions<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TReUpdateInterParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Reacts to a producer pause event by reconciling waveform state, main-window media, and layout ordering.\n *\n * @param {ProducerMediaPausedOptions} options - Producer identity and shared room/media callbacks.\n * @returns {Promise<void>} Resolves once paused-media side effects are synchronized.\n *\n * @example\n * ```typescript\n * await producerMediaPaused({\n * producerId: 'abc123',\n * kind: 'audio',\n * name: 'Participant1',\n * parameters,\n * });\n * ```\n */\nexport const producerMediaPaused = async <\n TParticipant extends ProducerMediaPausedParticipantLike = ProducerMediaPausedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TReUpdateInterParameters = ReUpdateInterParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters &\n TReUpdateInterParameters,\n>({\n producerId,\n kind,\n name,\n parameters,\n}: ProducerMediaPausedOptions<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TReUpdateInterParameters,\n TAllParameters\n>): Promise<void> => {\n parameters = parameters.getUpdatedAllParams();\n\n let {\n activeSounds,\n meetingDisplayType,\n meetingVideoOptimized,\n participants,\n oldSoundIds,\n shared,\n shareScreenStarted,\n updateMainWindow,\n hostLabel,\n islevel,\n updateActiveSounds,\n updateUpdateMainWindow,\n reorderStreams,\n prepopulateUserMedia,\n reUpdateInter,\n } = parameters;\n\n await Promise.all(\n participants.map(async (participant) => {\n if (participant.muted) {\n try {\n if (\n participant.islevel === '2' &&\n !participant.videoID &&\n !shared &&\n !shareScreenStarted &&\n islevel !== '2'\n ) {\n updateMainWindow = true;\n updateUpdateMainWindow(updateMainWindow);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updateMainWindow = false;\n updateUpdateMainWindow(updateMainWindow);\n }\n } catch {\n // no-op\n }\n\n if (shareScreenStarted || shared) {\n if (participant.name && activeSounds.includes(participant.name)) {\n activeSounds = activeSounds.filter(\n (audioStream) => audioStream !== participant.name,\n );\n updateActiveSounds(activeSounds);\n }\n\n reUpdateInter({\n name: participant.name!,\n add: false,\n force: true,\n parameters,\n });\n }\n }\n }),\n );\n\n if (\n meetingDisplayType === 'media' ||\n (meetingDisplayType === 'video' && !meetingVideoOptimized)\n ) {\n const participant = participants.find((item) => item.name === name);\n const hasVideo = participant?.videoID !== null && participant?.videoID !== '';\n\n if (!hasVideo && !(shareScreenStarted || shared)) {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n\n if (kind === 'audio') {\n try {\n const participant =\n participants.find((item) => item.audioID === producerId) ||\n participants.find((item) => item.name === name);\n\n if (\n participant &&\n ((participant.name && oldSoundIds.includes(participant.name)) ||\n (name && oldSoundIds.includes(name)))\n ) {\n reUpdateInter({\n name: participant.name!,\n add: false,\n force: true,\n parameters,\n });\n }\n } catch {\n // no-op\n }\n }\n};\n","import type {\n PrepopulateUserMediaParameters,\n ReorderStreamsParameters,\n} from '../../types/types';\n\nexport interface ProducerMediaResumedPrepopulateUserMediaOptions<\n TParameters = unknown,\n> {\n name: string;\n parameters: TParameters;\n}\n\nexport type ProducerMediaResumedPrepopulateUserMediaType<\n TParameters = unknown,\n> = (\n options: ProducerMediaResumedPrepopulateUserMediaOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaResumedReorderStreamsOptions<\n TParameters = unknown,\n> {\n add: boolean;\n screenChanged?: boolean;\n parameters: TParameters;\n}\n\nexport type ProducerMediaResumedReorderStreamsType<TParameters = unknown> = (\n options: ProducerMediaResumedReorderStreamsOptions<TParameters>,\n) => Promise<unknown>;\n\nexport interface ProducerMediaResumedParticipantLike {\n name?: string | null;\n islevel?: string | null;\n videoID?: string | null;\n}\n\nexport interface ProducerMediaResumedParameters<\n TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> {\n meetingDisplayType: string;\n participants: TParticipant[];\n shared: boolean;\n shareScreenStarted: boolean;\n mainScreenFilled: boolean;\n hostLabel: string;\n updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n reorderStreams: ProducerMediaResumedReorderStreamsType<TReorderStreamsParameters>;\n prepopulateUserMedia: ProducerMediaResumedPrepopulateUserMediaType<TPrepopulateUserMediaParameters>;\n getUpdatedAllParams: () =>\n ProducerMediaResumedParameters<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n [key: string]: any;\n}\n\nexport interface ProducerMediaResumedOptions<\n TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> {\n name: string;\n kind: 'audio';\n parameters:\n ProducerMediaResumedParameters<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n > & TAllParameters;\n}\n\nexport type ProducerMediaResumedType<\n TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n> = (\n options: ProducerMediaResumedOptions<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n >,\n) => Promise<void>;\n\n/**\n * Restores paused producer media state and refills the main window when needed.\n *\n * @param {ProducerMediaResumedOptions} options - Producer identity and shared room/media callbacks.\n * @returns {Promise<void>} Resolves once the resumed-media UI state is synchronized.\n *\n * @example\n * ```typescript\n * await producerMediaResumed({\n * name: 'John Doe',\n * kind: 'audio',\n * parameters,\n * });\n * ```\n */\nexport const producerMediaResumed = async <\n TParticipant extends ProducerMediaResumedParticipantLike = ProducerMediaResumedParticipantLike,\n TPrepopulateUserMediaParameters = PrepopulateUserMediaParameters,\n TReorderStreamsParameters = ReorderStreamsParameters,\n TAllParameters extends TPrepopulateUserMediaParameters &\n TReorderStreamsParameters = TPrepopulateUserMediaParameters &\n TReorderStreamsParameters,\n>({\n name,\n parameters,\n}: ProducerMediaResumedOptions<\n TParticipant,\n TPrepopulateUserMediaParameters,\n TReorderStreamsParameters,\n TAllParameters\n>): Promise<void> => {\n const {\n meetingDisplayType,\n participants,\n shared,\n shareScreenStarted,\n mainScreenFilled,\n hostLabel,\n updateUpdateMainWindow,\n reorderStreams,\n prepopulateUserMedia,\n } = parameters;\n\n const participant = participants.find((item) => item.name === name);\n\n if (participant && !mainScreenFilled && participant.islevel === '2') {\n updateUpdateMainWindow(true);\n await prepopulateUserMedia({ name: hostLabel, parameters });\n updateUpdateMainWindow(false);\n }\n\n if (meetingDisplayType === 'media' && participant) {\n const hasVideo = participant.videoID !== null && participant.videoID !== '';\n\n if (!hasVideo && !(shareScreenStarted || shared)) {\n await reorderStreams({ add: false, screenChanged: true, parameters });\n }\n }\n};\n","import type { EventType, Message, Participant } from '../../types/types';\n\nexport interface ReceiveMessageOptions {\n message: Message;\n messages: Message[];\n participantsAll: Participant[];\n member: string;\n eventType: EventType;\n islevel: string;\n coHost: string;\n updateMessages: (messages: Message[]) => void;\n updateShowMessagesBadge: (showBadge: boolean) => void;\n}\n\nexport type ReceiveMessageType = (options: ReceiveMessageOptions) => Promise<void>;\n\n/**\n * Appends an inbound chat message, filters banned senders, and updates unread badge state.\n *\n * @param {ReceiveMessageOptions} options - Message payload, participant state, and update callbacks.\n * @returns {Promise<void>} Resolves after message state is reconciled.\n *\n * @example\n * ```typescript\n * await receiveMessage({\n * message,\n * messages,\n * participantsAll,\n * member: 'Ada',\n * eventType: 'conference',\n * islevel: '1',\n * coHost: '',\n * updateMessages: setMessages,\n * updateShowMessagesBadge: setShowMessagesBadge,\n * });\n * ```\n */\nexport const receiveMessage = async ({\n message,\n messages,\n participantsAll,\n member,\n eventType,\n islevel,\n coHost,\n updateMessages,\n updateShowMessagesBadge,\n}: ReceiveMessageOptions): Promise<void> => {\n const { sender, receivers, message: content, timestamp, group } = message;\n const oldMessages = messages;\n messages = [...messages, { sender, receivers, message: content, timestamp, group }];\n\n if (eventType !== 'broadcast' && eventType !== 'chat') {\n messages = messages.filter((msg) =>\n participantsAll.some(\n (participant) => participant.name === msg.sender && !participant.isBanned,\n ),\n );\n } else {\n messages = messages.filter((msg) => {\n const participant = participantsAll.find((p) => p.name === msg.sender);\n return !participant || !participant.isBanned;\n });\n }\n\n updateMessages(messages);\n\n const oldGroupMessages = oldMessages.filter((msg) => msg.group);\n const oldDirectMessages = oldMessages.filter((msg) => !msg.group);\n const groupMessages = messages.filter((msg) => msg.group);\n const directMessages = messages.filter((msg) => !msg.group);\n\n if (eventType !== 'broadcast' && eventType !== 'chat') {\n if (oldGroupMessages.length !== groupMessages.length) {\n const newGroupMessages = groupMessages.filter(\n (msg) => !oldGroupMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp),\n );\n const relevantGroupMessages = newGroupMessages.filter(\n (msg) => msg.sender === member || msg.receivers.includes(member),\n );\n const selfSentGroupMessages = relevantGroupMessages.filter(\n (msg) => msg.sender === member,\n );\n\n if (\n newGroupMessages.length > 0 &&\n relevantGroupMessages.length > selfSentGroupMessages.length\n ) {\n updateShowMessagesBadge(true);\n }\n }\n\n if (oldDirectMessages.length !== directMessages.length) {\n const newDirectMessages = directMessages.filter(\n (msg) => !oldDirectMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp),\n );\n const relevantDirectMessages = newDirectMessages.filter(\n (msg) => msg.sender === member || msg.receivers.includes(member),\n );\n const selfSentDirectMessages = relevantDirectMessages.filter(\n (msg) => msg.sender === member,\n );\n\n const isPrivileged = islevel === '2' || coHost === member;\n const hasRelevantDirectMessages = isPrivileged\n ? newDirectMessages.length > 0\n : relevantDirectMessages.length > 0;\n\n if (\n hasRelevantDirectMessages &&\n newDirectMessages.length > selfSentDirectMessages.length\n ) {\n updateShowMessagesBadge(true);\n }\n }\n }\n};\n","import type { EventType, UserRecordingParams } from '../../types/types';\nimport { SoundPlayer, type SoundPlayerType } from '../utils/SoundPlayer';\n\nexport interface RecordingNoticeUserRecordingParamsLike {\n mainSpecs: {\n mediaOptions: string;\n audioOptions: string;\n videoOptions: string;\n videoType: string;\n videoOptimized: boolean;\n recordingDisplayType: 'video' | 'media' | 'all';\n addHLS: boolean;\n };\n dispSpecs: {\n nameTags: boolean;\n backgroundColor: string;\n nameTagsColor: string;\n orientationVideo: string;\n };\n textSpecs?: {\n addText?: boolean;\n customText?: string;\n customTextPosition?: string;\n customTextColor?: string;\n };\n}\n\nexport interface RecordingNoticeParameters<\n TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,\n TEventType = EventType,\n> {\n islevel: string;\n userRecordingParams: TUserRecordingParams;\n pauseRecordCount?: number;\n recordElapsedTime: number;\n recordStartTime: number;\n recordStarted: boolean;\n recordPaused: boolean;\n canLaunchRecord: boolean;\n stopLaunchRecord: boolean;\n recordStopped: boolean;\n isTimerRunning: boolean;\n canPauseResume: boolean;\n eventType: TEventType;\n updateRecordingProgressTime: (time: string) => void;\n updateShowRecordButtons: (show: boolean) => void;\n updateUserRecordingParams: (params: TUserRecordingParams) => void;\n updateRecordingMediaOptions: (options: string) => void;\n updateRecordingAudioOptions: (options: string) => void;\n updateRecordingVideoOptions: (options: string) => void;\n updateRecordingVideoType: (type: string) => void;\n updateRecordingVideoOptimized: (optimized: boolean) => void;\n updateRecordingDisplayType: (type: 'video' | 'media' | 'all') => void;\n updateRecordingAddHLS: (addHLS: boolean) => void;\n updateRecordingNameTags: (nameTags: boolean) => void;\n updateRecordingBackgroundColor: (color: string) => void;\n updateRecordingNameTagsColor: (color: string) => void;\n updateRecordingOrientationVideo: (orientation: string) => void;\n updateRecordingAddText: (addText: boolean) => void;\n updateRecordingCustomText: (text: string) => void;\n updateRecordingCustomTextPosition: (position: string) => void;\n updateRecordingCustomTextColor: (color: string) => void;\n updatePauseRecordCount: (count: number) => void;\n updateRecordElapsedTime: (time: number) => void;\n updateRecordStarted: (started: boolean) => void;\n updateRecordPaused: (paused: boolean) => void;\n updateCanLaunchRecord: (canLaunch: boolean) => void;\n updateStopLaunchRecord: (stop: boolean) => void;\n updateRecordStopped: (stopped: boolean) => void;\n updateIsTimerRunning: (running: boolean) => void;\n updateCanPauseResume: (canPause: boolean) => void;\n updateRecordStartTime: (startTime: number) => void;\n updateRecordState: (state: string) => void;\n [key: string]: any;\n}\n\nexport interface RecordingNoticeOptions<\n TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,\n TEventType = EventType,\n> {\n state: string;\n userRecordingParam: TUserRecordingParams | null;\n pauseCount: number;\n timeDone: number;\n parameters: RecordingNoticeParameters<TUserRecordingParams, TEventType>;\n soundPlayer?: SoundPlayerType;\n}\n\nexport type RecordingNoticeType<\n TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,\n TEventType = EventType,\n> = (\n options: RecordingNoticeOptions<TUserRecordingParams, TEventType>,\n) => Promise<void>;\n\n/**\n * Reconciles recording state updates, user recording settings, and progress UI after a recording socket notice.\n *\n * @param {RecordingNoticeOptions} options - Recording state payload and room-level update callbacks.\n * @returns {Promise<void>} Resolves once recording state, UI flags, and progress text are synchronized.\n *\n * @example\n * ```typescript\n * await recordingNotice({\n * state: 'pause',\n * userRecordingParam,\n * pauseCount: 2,\n * timeDone: 3600,\n * parameters,\n * });\n * ```\n */\nexport const recordingNotice = async <\n TUserRecordingParams extends RecordingNoticeUserRecordingParamsLike = UserRecordingParams,\n TEventType = EventType,\n>({\n state,\n userRecordingParam,\n pauseCount,\n timeDone,\n parameters,\n soundPlayer,\n}: RecordingNoticeOptions<TUserRecordingParams, TEventType>): Promise<void> => {\n let {\n islevel,\n userRecordingParams,\n pauseRecordCount,\n recordElapsedTime,\n recordStartTime,\n recordStarted,\n recordPaused,\n canLaunchRecord,\n stopLaunchRecord,\n recordStopped,\n isTimerRunning,\n canPauseResume,\n eventType,\n updateRecordingProgressTime,\n updateShowRecordButtons,\n updateUserRecordingParams,\n updateRecordingMediaOptions,\n updateRecordingAudioOptions,\n updateRecordingVideoOptions,\n updateRecordingVideoType,\n updateRecordingVideoOptimized,\n updateRecordingDisplayType,\n updateRecordingAddHLS,\n updateRecordingNameTags,\n updateRecordingBackgroundColor,\n updateRecordingNameTagsColor,\n updateRecordingOrientationVideo,\n updateRecordingAddText,\n updateRecordingCustomText,\n updateRecordingCustomTextPosition,\n updateRecordingCustomTextColor,\n updatePauseRecordCount,\n updateRecordElapsedTime,\n updateRecordStartTime,\n updateRecordStarted,\n updateRecordPaused,\n updateCanLaunchRecord,\n updateStopLaunchRecord,\n updateRecordStopped,\n updateIsTimerRunning,\n updateCanPauseResume,\n updateRecordState,\n } = parameters;\n\n const playSound = async (soundUrl: string): Promise<void> => {\n await (soundPlayer ?? SoundPlayer)({ soundUrl });\n };\n\n try {\n if (islevel !== '2') {\n if (state === 'pause') {\n updateRecordStarted(true);\n updateRecordPaused(true);\n updateRecordState('yellow');\n if (eventType !== 'broadcast') {\n await playSound('https://www.mediasfu.com/sounds/record-paused.mp3');\n }\n } else if (state === 'stop') {\n updateRecordStarted(true);\n updateRecordStopped(true);\n updateRecordState('green');\n if (eventType !== 'broadcast') {\n await playSound('https://www.mediasfu.com/sounds/record-stopped.mp3');\n }\n } else {\n updateRecordState('red');\n updateRecordStarted(true);\n updateRecordPaused(false);\n if (eventType !== 'broadcast') {\n await playSound('https://www.mediasfu.com/sounds/record-progress.mp3');\n }\n }\n } else {\n if (state === 'pause') {\n updateRecordState('yellow');\n if (userRecordingParam) {\n userRecordingParams.mainSpecs = userRecordingParam.mainSpecs;\n userRecordingParams.dispSpecs = userRecordingParam.dispSpecs;\n userRecordingParams.textSpecs = userRecordingParam.textSpecs;\n\n updateUserRecordingParams(userRecordingParams);\n updateRecordingMediaOptions(userRecordingParams.mainSpecs.mediaOptions);\n updateRecordingAudioOptions(userRecordingParams.mainSpecs.audioOptions);\n updateRecordingVideoOptions(userRecordingParams.mainSpecs.videoOptions);\n updateRecordingVideoType(userRecordingParams.mainSpecs.videoType);\n updateRecordingVideoOptimized(userRecordingParams.mainSpecs.videoOptimized);\n updateRecordingDisplayType(userRecordingParams.mainSpecs.recordingDisplayType);\n updateRecordingAddHLS(userRecordingParams.mainSpecs.addHLS);\n updateRecordingNameTags(userRecordingParams.dispSpecs.nameTags);\n updateRecordingBackgroundColor(userRecordingParams.dispSpecs.backgroundColor);\n updateRecordingNameTagsColor(userRecordingParams.dispSpecs.nameTagsColor);\n updateRecordingOrientationVideo(userRecordingParams.dispSpecs.orientationVideo);\n updateRecordingAddText(userRecordingParams.textSpecs?.addText ?? false);\n updateRecordingCustomText(userRecordingParams.textSpecs?.customText ?? '');\n updateRecordingCustomTextPosition(\n userRecordingParams.textSpecs?.customTextPosition ?? '',\n );\n updateRecordingCustomTextColor(\n userRecordingParams.textSpecs?.customTextColor ?? '',\n );\n\n pauseRecordCount = pauseCount;\n updatePauseRecordCount(pauseRecordCount);\n\n recordElapsedTime = Math.floor(timeDone / 1000);\n recordStartTime = Math.floor(Date.now() / 1000) - recordElapsedTime;\n updateRecordStartTime(recordStartTime);\n updateRecordElapsedTime(recordElapsedTime);\n\n recordStarted = true;\n recordPaused = true;\n canLaunchRecord = false;\n recordStopped = false;\n\n updateRecordStarted(recordStarted);\n updateRecordPaused(recordPaused);\n updateCanLaunchRecord(canLaunchRecord);\n updateRecordStopped(recordStopped);\n updateShowRecordButtons(true);\n\n isTimerRunning = false;\n canPauseResume = true;\n\n updateIsTimerRunning(isTimerRunning);\n updateCanPauseResume(canPauseResume);\n updateRecordingProgressTime(formatElapsedTime(recordElapsedTime));\n }\n await playSound('https://www.mediasfu.com/sounds/record-paused.mp3');\n } else if (state === 'stop') {\n recordStarted = true;\n recordStopped = true;\n canLaunchRecord = false;\n stopLaunchRecord = true;\n\n updateRecordStarted(recordStarted);\n updateRecordStopped(recordStopped);\n updateCanLaunchRecord(canLaunchRecord);\n updateStopLaunchRecord(stopLaunchRecord);\n updateShowRecordButtons(false);\n updateRecordState('green');\n await playSound('https://www.mediasfu.com/sounds/record-stopped.mp3');\n } else {\n updateRecordState('red');\n updateRecordStarted(true);\n updateRecordPaused(false);\n await playSound('https://www.mediasfu.com/sounds/record-progress.mp3');\n }\n }\n } catch (error) {\n console.log('Error in RecordingNotice: ', error);\n }\n};\n\nconst formatElapsedTime = (recordElapsedTime: number): string => {\n const hours = Math.floor(recordElapsedTime / 3600);\n const minutes = Math.floor((recordElapsedTime % 3600) / 60);\n const seconds = recordElapsedTime % 60;\n\n return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`;\n};\n\nconst padNumber = (value: number): string => value.toString().padStart(2, '0');\n","export interface ReInitiateRecordingSocketLike {\n emit: (\n event: string,\n payload: { roomName: string; member: string },\n callback?: (response: { success: boolean }) => void,\n ) => void;\n}\n\nexport interface ReInitiateRecordingOptions {\n roomName: string;\n member: string;\n socket: ReInitiateRecordingSocketLike;\n adminRestrictSetting: boolean;\n}\n\nexport type ReInitiateRecordingType = (\n options: ReInitiateRecordingOptions,\n) => Promise<void>;\n\n/**\n * Re-requests recording startup when host controls allow it.\n *\n * @param {ReInitiateRecordingOptions} options - Room identity, socket, and admin restriction state.\n * @returns {Promise<void>} Resolves after the emit request is sent or skipped.\n *\n * @example\n * ```typescript\n * await reInitiateRecording({\n * roomName: 'exampleRoom',\n * member: 'adminUser',\n * socket,\n * adminRestrictSetting: false,\n * });\n * ```\n */\nexport const reInitiateRecording = async ({\n roomName,\n member,\n socket,\n adminRestrictSetting,\n}: ReInitiateRecordingOptions): Promise<void> => {\n if (!adminRestrictSetting) {\n socket.emit(\n 'startRecordIng',\n { roomName, member },\n ({ success }: { success: boolean }) => {\n if (!success) {\n // no-op: caller-controlled UX\n }\n },\n );\n }\n};\n","export interface RecordParams {\n recordingAudioPausesLimit: number;\n recordingAudioPausesCount: number;\n recordingAudioSupport: boolean;\n recordingAudioPeopleLimit: number;\n recordingAudioParticipantsTimeLimit: number;\n recordingVideoPausesCount: number;\n recordingVideoPausesLimit: number;\n recordingVideoSupport: boolean;\n recordingVideoPeopleLimit: number;\n recordingVideoParticipantsTimeLimit: number;\n recordingAllParticipantsSupport: boolean;\n recordingVideoParticipantsSupport: boolean;\n recordingAllParticipantsFullRoomSupport: boolean;\n recordingVideoParticipantsFullRoomSupport: boolean;\n recordingPreferredOrientation: string;\n recordingSupportForOtherOrientation: boolean;\n recordingMultiFormatsSupport: boolean;\n}\n\nexport interface RoomRecordParamsParameters {\n updateRecordingAudioPausesLimit: (value: number) => void;\n updateRecordingAudioPausesCount: (value: number) => void;\n updateRecordingAudioSupport: (value: boolean) => void;\n updateRecordingAudioPeopleLimit: (value: number) => void;\n updateRecordingAudioParticipantsTimeLimit: (value: number) => void;\n updateRecordingVideoPausesCount: (value: number) => void;\n updateRecordingVideoPausesLimit: (value: number) => void;\n updateRecordingVideoSupport: (value: boolean) => void;\n updateRecordingVideoPeopleLimit: (value: number) => void;\n updateRecordingVideoParticipantsTimeLimit: (value: number) => void;\n updateRecordingAllParticipantsSupport: (value: boolean) => void;\n updateRecordingVideoParticipantsSupport: (value: boolean) => void;\n updateRecordingAllParticipantsFullRoomSupport: (value: boolean) => void;\n updateRecordingVideoParticipantsFullRoomSupport: (value: boolean) => void;\n updateRecordingPreferredOrientation: (value: string) => void;\n updateRecordingSupportForOtherOrientation: (value: boolean) => void;\n updateRecordingMultiFormatsSupport: (value: boolean) => void;\n [key: string]: any;\n}\n\nexport interface RoomRecordParamsOptions {\n recordParams: RecordParams;\n parameters: RoomRecordParamsParameters;\n}\n\nexport type RoomRecordParamsType = (\n options: RoomRecordParamsOptions,\n) => Promise<void>;\n\n/**\n * Applies room-level recording capability limits and toggles to UI state.\n *\n * @param {RoomRecordParamsOptions} options - Recording capability payload and setters.\n * @returns {Promise<void>} Resolves after all setters are applied.\n *\n * @example\n * ```typescript\n * await roomRecordParams({\n * recordParams,\n * parameters: recordingSetters,\n * });\n * ```\n */\nexport const roomRecordParams = async ({\n recordParams,\n parameters,\n}: RoomRecordParamsOptions): Promise<void> => {\n const {\n updateRecordingAudioPausesLimit,\n updateRecordingAudioPausesCount,\n updateRecordingAudioSupport,\n updateRecordingAudioPeopleLimit,\n updateRecordingAudioParticipantsTimeLimit,\n updateRecordingVideoPausesCount,\n updateRecordingVideoPausesLimit,\n updateRecordingVideoSupport,\n updateRecordingVideoPeopleLimit,\n updateRecordingVideoParticipantsTimeLimit,\n updateRecordingAllParticipantsSupport,\n updateRecordingVideoParticipantsSupport,\n updateRecordingAllParticipantsFullRoomSupport,\n updateRecordingVideoParticipantsFullRoomSupport,\n updateRecordingPreferredOrientation,\n updateRecordingSupportForOtherOrientation,\n updateRecordingMultiFormatsSupport,\n } = parameters;\n\n updateRecordingAudioPausesLimit(recordParams.recordingAudioPausesLimit);\n updateRecordingAudioPausesCount(recordParams.recordingAudioPausesCount);\n updateRecordingAudioSupport(recordParams.recordingAudioSupport);\n updateRecordingAudioPeopleLimit(recordParams.recordingAudioPeopleLimit);\n updateRecordingAudioParticipantsTimeLimit(\n recordParams.recordingAudioParticipantsTimeLimit,\n );\n updateRecordingVideoPausesCount(recordParams.recordingVideoPausesCount);\n updateRecordingVideoPausesLimit(recordParams.recordingVideoPausesLimit);\n updateRecordingVideoSupport(recordParams.recordingVideoSupport);\n updateRecordingVideoPeopleLimit(recordParams.recordingVideoPeopleLimit);\n updateRecordingVideoParticipantsTimeLimit(\n recordParams.recordingVideoParticipantsTimeLimit,\n );\n updateRecordingAllParticipantsSupport(\n recordParams.recordingAllParticipantsSupport,\n );\n updateRecordingVideoParticipantsSupport(\n recordParams.recordingVideoParticipantsSupport,\n );\n updateRecordingAllParticipantsFullRoomSupport(\n recordParams.recordingAllParticipantsFullRoomSupport,\n );\n updateRecordingVideoParticipantsFullRoomSupport(\n recordParams.recordingVideoParticipantsFullRoomSupport,\n );\n updateRecordingPreferredOrientation(\n recordParams.recordingPreferredOrientation,\n );\n updateRecordingSupportForOtherOrientation(\n recordParams.recordingSupportForOtherOrientation,\n );\n updateRecordingMultiFormatsSupport(recordParams.recordingMultiFormatsSupport);\n};\n","import type { Participant } from '../../types/types';\n\nexport interface ScreenProducerIdOptions {\n producerId: string;\n screenId: string;\n membersReceived: boolean;\n shareScreenStarted: boolean;\n deferScreenReceived: boolean;\n participants: Participant[];\n updateScreenId: (id: string) => void;\n updateShareScreenStarted: (started: boolean) => void;\n updateDeferScreenReceived: (received: boolean) => void;\n}\n\nexport type ScreenProducerIdType = (options: ScreenProducerIdOptions) => void;\n\n/**\n * Reconciles a screen-share producer id with current participant state.\n *\n * @param {ScreenProducerIdOptions} options - Screen-share identifiers and setters.\n * @returns {void} Updates screen state synchronously.\n *\n * @example\n * ```typescript\n * screenProducerId({\n * producerId: 'screen-producer',\n * screenId: 'host-screen',\n * membersReceived: true,\n * shareScreenStarted: false,\n * deferScreenReceived: false,\n * participants,\n * updateScreenId: setScreenId,\n * updateShareScreenStarted: setShareScreenStarted,\n * updateDeferScreenReceived: setDeferScreenReceived,\n * });\n * ```\n */\nexport const screenProducerId = ({\n producerId,\n screenId,\n membersReceived,\n participants,\n updateScreenId,\n updateShareScreenStarted,\n updateDeferScreenReceived,\n}: ScreenProducerIdOptions): void => {\n const host = participants.find(\n (participant) =>\n participant.ScreenID === screenId && participant.ScreenOn === true,\n );\n\n if (host && membersReceived) {\n updateScreenId(producerId);\n updateShareScreenStarted(true);\n updateDeferScreenReceived(false);\n return;\n }\n\n updateScreenId(producerId);\n updateDeferScreenReceived(true);\n};\n","export interface StartRecordsSocketLike {\n emit: (\n event: string,\n payload: { roomName: string; member: string },\n callback?: (response: { success: boolean }) => void,\n ) => void;\n}\n\nexport interface StartRecordsOptions {\n roomName: string;\n member: string;\n socket: StartRecordsSocketLike;\n}\n\nexport type StartRecordsType = (options: StartRecordsOptions) => Promise<void>;\n\n/**\n * Requests recording startup for the current room.\n *\n * @param {StartRecordsOptions} options - Room, member, and socket details.\n * @returns {Promise<void>} Resolves after the emit request is sent.\n *\n * @example\n * ```typescript\n * await startRecords({\n * roomName: 'RoomA',\n * member: 'AdminUser',\n * socket,\n * });\n * ```\n */\nexport const startRecords = async ({\n roomName,\n member,\n socket,\n}: StartRecordsOptions): Promise<void> => {\n socket.emit(\n 'startRecordIng',\n { roomName, member },\n ({ success }: { success: boolean }) => {\n if (!success) {\n // no-op: caller-controlled UX\n }\n },\n );\n};\n","import type { ShowAlert } from '../../types/types';\n\nexport interface StoppedRecordingOptions {\n state: string;\n reason: string;\n showAlert?: ShowAlert;\n}\n\nexport type StoppedRecordingType = (\n options: StoppedRecordingOptions,\n) => Promise<void>;\n\n/**\n * Shows a reasoned alert when the backend reports that recording has stopped.\n *\n * @param {StoppedRecordingOptions} options - Recording stop state and alert helper.\n * @returns {Promise<void>} Resolves after the alert is dispatched.\n *\n * @example\n * ```typescript\n * await stoppedRecording({\n * state: 'stop',\n * reason: 'The session ended',\n * showAlert,\n * });\n * ```\n */\nexport const stoppedRecording = async ({\n state,\n reason,\n showAlert,\n}: StoppedRecordingOptions): Promise<void> => {\n try {\n if (state === 'stop') {\n showAlert?.({\n message: `The recording has stopped - ${reason}.`,\n duration: 3000,\n type: 'danger',\n });\n }\n } catch (error) {\n console.log('Error in stoppedRecording: ', error);\n }\n};\n","import type { ShowAlert } from '../../types/types';\nimport type {\n TranslationTranscriptData,\n} from '../utils/liveSubtitle';\nimport type { TranslationVoiceConfig } from '../utils/translationLanguages';\nimport { getLanguageName } from '../utils/translationLanguages';\n\nexport type LanguageMode = 'allowlist' | 'blocklist' | 'any';\n\nexport interface LanguageEntry {\n code: string;\n nickname?: string;\n voiceConfig?: TranslationVoiceConfig;\n}\n\nexport interface TranslationRoomConfig {\n supportTranslation: boolean;\n spokenLanguageMode: LanguageMode;\n allowedSpokenLanguages?: LanguageEntry[];\n blockedSpokenLanguages?: string[];\n listenLanguageMode: LanguageMode;\n allowedListenLanguages?: LanguageEntry[];\n blockedListenLanguages?: string[];\n maxActiveChannelsPerSpeaker: number;\n autoDetectSpokenLanguage: boolean;\n allowSpokenLanguageChange?: boolean;\n allowListenLanguageChange?: boolean;\n translationVoiceConfig?: TranslationVoiceConfig | null;\n providerGroups?: {\n groupA?: {\n languages: string[];\n sttNickName?: string;\n llmNickName?: string;\n ttsNickName?: string;\n };\n groupB?: {\n languages: string[];\n sttNickName?: string;\n llmNickName?: string;\n ttsNickName?: string;\n };\n default?: {\n sttNickName?: string;\n llmNickName?: string;\n ttsNickName?: string;\n };\n } | null;\n}\n\nexport interface TranslationRoomConfigData {\n config: TranslationRoomConfig;\n}\n\nexport interface TranslationConfigUpdatedData {\n config: TranslationRoomConfig;\n}\n\nexport interface TranslationLanguageSetData {\n success: boolean;\n language: string;\n enabled: boolean;\n error?: string;\n}\n\nexport interface TranslationSubscribedData {\n speakerId: string;\n speakerName?: string;\n language: string;\n channelCreated: boolean;\n producerId?: string;\n originalProducerId?: string;\n}\n\nexport interface TranslationUnsubscribedData {\n speakerId: string;\n language: string;\n channelClosed: boolean;\n}\n\nexport interface TranslationProducerReadyData {\n speakerId: string;\n speakerName?: string;\n language: string;\n producerId: string;\n originalProducerId: string;\n}\n\nexport interface TranslationProducerClosedData {\n speakerId: string;\n language: string;\n producerId: string;\n reason?: string;\n}\n\nexport interface TranslationChannelsAvailableData {\n speakerId: string;\n speakerName?: string;\n languages: string[];\n originalProducerId: string;\n}\n\nexport interface TranslationMemberStateData {\n memberId: string;\n memberName?: string;\n state: {\n speaking?: {\n enabled: boolean;\n inputLanguage: string;\n originalProducerId: string;\n };\n listening?: {\n [speakerId: string]: {\n language: string;\n producerId: string | null;\n };\n };\n };\n}\n\nexport interface TranslationErrorData {\n error: string;\n code?: string;\n details?: unknown;\n availableChannels?: string[];\n maxChannels?: number;\n message?: string;\n}\n\nexport interface TranslationSpeakerOutputChangedData {\n speakerId: string;\n speakerName: string;\n inputLanguage: string;\n outputLanguage: string | null;\n originalProducerId: string;\n enabled: boolean;\n}\n\nexport interface TranslationProducerMap {\n [originalProducerId: string]: {\n [languageCode: string]: string;\n };\n}\n\nexport interface TranslationRoomConfigOptions {\n data: TranslationRoomConfigData;\n updateTranslationConfig?: (config: TranslationRoomConfig) => void;\n updateTranslationSupported?: (supported: boolean) => void;\n}\n\nexport interface TranslationConfigUpdatedOptions {\n data: TranslationConfigUpdatedData;\n updateTranslationConfig?: (config: TranslationRoomConfig) => void;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationLanguageSetOptions {\n data: TranslationLanguageSetData;\n updateMySpokenLanguage?: (lang: string) => void;\n updateMySpokenLanguageEnabled?: (enabled: boolean) => void;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationSubscribedOptions {\n data: TranslationSubscribedData;\n updateListenPreferences?: (updater: (prev: Map<string, string>) => Map<string, string>) => void;\n updateTranslationProducerMap?: (updater: (prev: TranslationProducerMap) => TranslationProducerMap) => void;\n startConsumingTranslation?: (producerId: string, speakerId: string, language: string) => Promise<void>;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationUnsubscribedOptions {\n data: TranslationUnsubscribedData;\n updateListenPreferences?: (updater: (prev: Map<string, string>) => Map<string, string>) => void;\n stopConsumingTranslation?: (speakerId: string, language: string) => Promise<void>;\n}\n\nexport interface TranslationProducerReadyOptions {\n data: TranslationProducerReadyData;\n updateTranslationProducerMap?: (updater: (prev: TranslationProducerMap) => TranslationProducerMap) => void;\n startConsumingTranslation?: (producerId: string, speakerId: string, language: string, originalProducerId: string) => Promise<void>;\n pauseOriginalProducer?: (originalProducerId: string) => Promise<void>;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationProducerClosedOptions {\n data: TranslationProducerClosedData;\n updateTranslationProducerMap?: (updater: (prev: TranslationProducerMap) => TranslationProducerMap) => void;\n stopConsumingTranslation?: (producerId: string) => Promise<void>;\n resumeOriginalProducer?: (speakerId: string) => Promise<void>;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationChannelsAvailableOptions {\n data: TranslationChannelsAvailableData;\n updateAvailableTranslationChannels?: (speakerId: string, languages: string[], originalProducerId: string) => void;\n myDefaultListenLanguage?: string | null;\n socket?: {\n emit: (event: string, payload: Record<string, unknown>) => void;\n } | null;\n roomName?: string;\n}\n\nexport interface TranslationMemberStateOptions {\n data: TranslationMemberStateData;\n updateParticipantTranslationState?: (memberId: string, state: TranslationMemberStateData['state']) => void;\n}\n\nexport interface TranslationErrorOptions {\n data: TranslationErrorData;\n showAlert?: ShowAlert;\n}\n\nexport interface TranslationTranscriptOptions {\n data: TranslationTranscriptData;\n updateTranscripts?: (updater: (prev: TranslationTranscriptData[]) => TranslationTranscriptData[]) => void;\n onTranscriptReceived?: (transcript: TranslationTranscriptData) => void;\n maxTranscripts?: number;\n}\n\nexport interface TranslationSpeakerOutputChangedOptions {\n data: TranslationSpeakerOutputChangedData;\n pauseOriginalProducer?: (originalProducerId: string, speakerId: string) => Promise<void>;\n resumeOriginalProducer?: (originalProducerId: string, speakerId: string) => Promise<void>;\n stopConsumingTranslationForSpeaker?: (speakerId: string) => Promise<void>;\n updateSpeakerTranslationState?: (speakerId: string, outputLanguage: string | null, originalProducerId: string) => void;\n showAlert?: ShowAlert;\n listenerOverride?: { speakerId: string; wantOriginal: boolean; preferredLanguage?: string } | null;\n}\n\nexport type TranslationRoomConfigType = (options: TranslationRoomConfigOptions) => Promise<void>;\nexport type TranslationConfigUpdatedType = (options: TranslationConfigUpdatedOptions) => Promise<void>;\nexport type TranslationLanguageSetType = (options: TranslationLanguageSetOptions) => Promise<void>;\nexport type TranslationSubscribedType = (options: TranslationSubscribedOptions) => Promise<void>;\nexport type TranslationUnsubscribedType = (options: TranslationUnsubscribedOptions) => Promise<void>;\nexport type TranslationProducerReadyType = (options: TranslationProducerReadyOptions) => Promise<void>;\nexport type TranslationProducerClosedType = (options: TranslationProducerClosedOptions) => Promise<void>;\nexport type TranslationChannelsAvailableType = (options: TranslationChannelsAvailableOptions) => Promise<void>;\nexport type TranslationMemberStateType = (options: TranslationMemberStateOptions) => Promise<void>;\nexport type TranslationErrorType = (options: TranslationErrorOptions) => Promise<void>;\nexport type TranslationTranscriptType = (options: TranslationTranscriptOptions) => Promise<void>;\nexport type TranslationSpeakerOutputChangedType = (options: TranslationSpeakerOutputChangedOptions) => Promise<void>;\n\nexport const translationRoomConfig: TranslationRoomConfigType = async ({\n data,\n updateTranslationConfig,\n updateTranslationSupported,\n}): Promise<void> => {\n try {\n const { config } = data;\n updateTranslationSupported?.(config.supportTranslation);\n\n if (updateTranslationConfig && config.supportTranslation) {\n updateTranslationConfig(config);\n }\n } catch (error) {\n console.error('Error handling translation:roomConfig:', error);\n }\n};\n\nexport const translationConfigUpdated: TranslationConfigUpdatedType = async ({\n data,\n updateTranslationConfig,\n showAlert,\n}): Promise<void> => {\n try {\n updateTranslationConfig?.(data.config);\n showAlert?.({\n message: 'Translation settings updated by host',\n type: 'info',\n duration: 2000,\n });\n } catch (error) {\n console.error('Error handling translation:configUpdated:', error);\n }\n};\n\nexport const translationLanguageSet: TranslationLanguageSetType = async ({\n data,\n updateMySpokenLanguage,\n updateMySpokenLanguageEnabled,\n showAlert,\n}): Promise<void> => {\n try {\n if (data.success) {\n updateMySpokenLanguage?.(data.language);\n updateMySpokenLanguageEnabled?.(data.enabled);\n } else if (showAlert && data.error) {\n showAlert({\n message: data.error,\n type: 'danger',\n duration: 3000,\n });\n }\n } catch (error) {\n console.error('Error handling translation:languageSet:', error);\n }\n};\n\nexport const translationSubscribed: TranslationSubscribedType = async ({\n data,\n updateListenPreferences,\n updateTranslationProducerMap,\n startConsumingTranslation,\n showAlert,\n}): Promise<void> => {\n try {\n const { speakerId, language, channelCreated, producerId, originalProducerId } = data;\n\n updateListenPreferences?.((prev) => {\n const next = new Map(prev);\n next.set(speakerId, language);\n return next;\n });\n\n if (producerId && originalProducerId && updateTranslationProducerMap) {\n updateTranslationProducerMap((prev) => ({\n ...prev,\n [originalProducerId]: {\n ...(prev[originalProducerId] || {}),\n [language]: producerId,\n },\n }));\n }\n\n if (producerId && startConsumingTranslation) {\n await startConsumingTranslation(producerId, speakerId, language);\n }\n\n if (showAlert && channelCreated) {\n showAlert({\n message: `Translation channel created for ${language}`,\n type: 'success',\n duration: 2000,\n });\n }\n } catch (error) {\n console.error('Error handling translation:subscribed:', error);\n }\n};\n\nexport const translationUnsubscribed: TranslationUnsubscribedType = async ({\n data,\n updateListenPreferences,\n stopConsumingTranslation,\n}): Promise<void> => {\n try {\n updateListenPreferences?.((prev) => {\n const next = new Map(prev);\n next.delete(data.speakerId);\n return next;\n });\n\n if (stopConsumingTranslation) {\n await stopConsumingTranslation(data.speakerId, data.language);\n }\n } catch (error) {\n console.error('Error handling translation:unsubscribed:', error);\n }\n};\n\nexport const translationProducerReady: TranslationProducerReadyType = async ({\n data,\n updateTranslationProducerMap,\n pauseOriginalProducer,\n}): Promise<void> => {\n try {\n updateTranslationProducerMap?.((prev) => ({\n ...prev,\n [data.originalProducerId]: {\n ...(prev[data.originalProducerId] || {}),\n [data.language]: data.producerId,\n },\n }));\n\n if (pauseOriginalProducer) {\n await pauseOriginalProducer(data.originalProducerId);\n }\n } catch (error) {\n console.error('Error handling translation:producerReady:', error);\n }\n};\n\nexport const translationProducerClosed: TranslationProducerClosedType = async ({\n data,\n updateTranslationProducerMap,\n stopConsumingTranslation,\n resumeOriginalProducer,\n showAlert,\n}): Promise<void> => {\n try {\n if (updateTranslationProducerMap) {\n updateTranslationProducerMap((prev) => {\n const next = { ...prev };\n for (const [originalProducerId, languageMap] of Object.entries(next)) {\n if (languageMap[data.language] === data.producerId) {\n delete languageMap[data.language];\n if (Object.keys(languageMap).length === 0) {\n delete next[originalProducerId];\n }\n }\n }\n return next;\n });\n }\n\n if (stopConsumingTranslation) {\n await stopConsumingTranslation(data.producerId);\n }\n\n if (resumeOriginalProducer) {\n await resumeOriginalProducer(data.speakerId);\n }\n\n if (showAlert && data.reason) {\n showAlert({\n message: `Translation stopped: ${data.reason}`,\n type: 'info',\n duration: 2000,\n });\n }\n } catch (error) {\n console.error('Error handling translation:producerClosed:', error);\n }\n};\n\nexport const translationChannelsAvailable: TranslationChannelsAvailableType = async ({\n data,\n updateAvailableTranslationChannels,\n myDefaultListenLanguage,\n socket,\n roomName,\n}): Promise<void> => {\n try {\n updateAvailableTranslationChannels?.(data.speakerId, data.languages, data.originalProducerId);\n\n if (myDefaultListenLanguage && data.languages.includes(myDefaultListenLanguage) && socket && roomName) {\n socket.emit('translation:subscribe', {\n roomName,\n speakerId: data.speakerId,\n language: myDefaultListenLanguage,\n originalProducerId: data.originalProducerId,\n });\n }\n } catch (error) {\n console.error('Error handling translation:channelsAvailable:', error);\n }\n};\n\nexport const translationMemberState: TranslationMemberStateType = async ({\n data,\n updateParticipantTranslationState,\n}): Promise<void> => {\n try {\n updateParticipantTranslationState?.(data.memberId, data.state);\n } catch (error) {\n console.error('Error handling translation:memberState:', error);\n }\n};\n\nexport const translationError: TranslationErrorType = async ({\n data,\n showAlert,\n}): Promise<void> => {\n try {\n if (showAlert) {\n let message = data.error;\n\n switch (data.code) {\n case 'max_channels':\n if (data.availableChannels && data.availableChannels.length > 0) {\n message = `Maximum ${data.maxChannels || 5} translation channels reached. Available: ${data.availableChannels.join(', ')}`;\n } else {\n message = data.message || 'Maximum translation channels reached. Please wait for a slot to open.';\n }\n break;\n case 'speaker_not_found':\n message = 'Speaker not found or has left the meeting.';\n break;\n case 'language_not_allowed':\n message = 'This language is not available for translation in this room.';\n break;\n default:\n message = data.error || 'Translation error occurred';\n }\n\n showAlert({\n message,\n type: 'danger',\n duration: 5000,\n });\n }\n } catch (err) {\n console.error('Error handling translation:error:', err);\n }\n};\n\nexport const translationTranscript: TranslationTranscriptType = async ({\n data,\n updateTranscripts,\n onTranscriptReceived,\n maxTranscripts = 100,\n}): Promise<void> => {\n try {\n if (updateTranscripts) {\n updateTranscripts((prev) => {\n const next = [...prev, data];\n return next.length > maxTranscripts ? next.slice(-maxTranscripts) : next;\n });\n }\n\n onTranscriptReceived?.(data);\n } catch (err) {\n console.error('Error handling translation:transcript:', err);\n }\n};\n\nexport const translationSpeakerOutputChanged: TranslationSpeakerOutputChangedType = async ({\n data,\n pauseOriginalProducer,\n resumeOriginalProducer,\n stopConsumingTranslationForSpeaker,\n updateSpeakerTranslationState,\n showAlert,\n listenerOverride,\n}): Promise<void> => {\n try {\n updateSpeakerTranslationState?.(data.speakerId, data.outputLanguage, data.originalProducerId);\n\n const listenerWantsOriginal = listenerOverride?.wantOriginal === true;\n const listenerWantsDifferentLanguage = Boolean(\n listenerOverride?.preferredLanguage &&\n listenerOverride.preferredLanguage.toLowerCase() !== data.outputLanguage?.toLowerCase(),\n );\n\n if (listenerWantsOriginal) {\n showAlert?.({\n message: `${data.speakerName} is speaking in ${data.outputLanguage ? getLanguageName(data.outputLanguage) : 'translated'} but you're hearing original`,\n type: 'info',\n duration: 3000,\n });\n return;\n }\n\n if (listenerWantsDifferentLanguage) {\n if (pauseOriginalProducer && data.originalProducerId) {\n await pauseOriginalProducer(data.originalProducerId, data.speakerId);\n }\n return;\n }\n\n if (data.enabled && data.outputLanguage && data.originalProducerId) {\n if (pauseOriginalProducer) {\n await pauseOriginalProducer(data.originalProducerId, data.speakerId);\n }\n\n showAlert?.({\n message: `${data.speakerName} is now speaking in ${getLanguageName(data.outputLanguage)}`,\n type: 'info',\n duration: 3000,\n });\n } else if (!data.enabled || !data.outputLanguage) {\n if (stopConsumingTranslationForSpeaker) {\n await stopConsumingTranslationForSpeaker(data.speakerId);\n }\n\n if (resumeOriginalProducer && data.originalProducerId) {\n await resumeOriginalProducer(data.originalProducerId, data.speakerId);\n }\n\n if (showAlert && !data.enabled) {\n showAlert({\n message: `${data.speakerName} returned to original language`,\n type: 'info',\n duration: 3000,\n });\n }\n }\n } catch (err) {\n console.error('Error handling translation:speakerOutputChanged:', err);\n }\n};","import type { Settings } from '../../types/types';\n\nexport interface UpdateMediaSettingsOptions {\n settings: Settings;\n updateAudioSetting: (value: string) => void;\n updateVideoSetting: (value: string) => void;\n updateScreenshareSetting: (value: string) => void;\n updateChatSetting: (value: string) => void;\n}\n\nexport type UpdateMediaSettingsType = (\n options: UpdateMediaSettingsOptions,\n) => void;\n\n/**\n * Expands the shared `Settings` tuple into individual media setting updaters.\n *\n * @param {UpdateMediaSettingsOptions} options - Settings tuple and update callbacks.\n * @returns {void} Updates state synchronously.\n *\n * @example\n * ```typescript\n * updateMediaSettings({\n * settings: ['allow', 'allow', 'deny', 'allow'],\n * updateAudioSetting: setAudioSetting,\n * updateVideoSetting: setVideoSetting,\n * updateScreenshareSetting: setScreenshareSetting,\n * updateChatSetting: setChatSetting,\n * });\n * ```\n */\nexport const updateMediaSettings = ({\n settings,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateChatSetting,\n}: UpdateMediaSettingsOptions): void => {\n const [audioSetting, videoSetting, screenshareSetting, chatSetting] = settings;\n\n updateAudioSetting(audioSetting);\n updateVideoSetting(videoSetting);\n updateScreenshareSetting(screenshareSetting);\n updateChatSetting(chatSetting);\n};\n","import type {\n AltDomains,\n ConsumeSocket,\n Participant,\n} from '../../types/types';\nimport type { ConnectIpsLikeType } from './getDomains';\n\nexport interface UpdateConsumingDomainsGetDomainsOptions<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n> {\n domains: string[];\n alt_domains: AltDomains;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n parameters:\n UpdateConsumingDomainsParameters<TParameters, TParticipant, TConsumeSocket> &\n TParameters;\n}\n\nexport type UpdateConsumingDomainsGetDomainsType<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n> = (\n options: UpdateConsumingDomainsGetDomainsOptions<TParameters, TParticipant, TConsumeSocket>,\n) => Promise<void>;\n\nexport interface UpdateConsumingDomainsParameters\n <\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n > {\n participants: TParticipant[];\n consume_sockets: TConsumeSocket[];\n connectIps: ConnectIpsLikeType<TParameters, TConsumeSocket>;\n getDomains: UpdateConsumingDomainsGetDomainsType<TParameters, TParticipant, TConsumeSocket>;\n getUpdatedAllParams: () =>\n UpdateConsumingDomainsParameters<TParameters, TParticipant, TConsumeSocket> &\n TParameters;\n [key: string]: any;\n}\n\nexport interface UpdateConsumingDomainsOptions<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n> {\n domains: string[];\n alt_domains: AltDomains;\n apiUserName: string;\n apiKey: string;\n apiToken: string;\n parameters:\n UpdateConsumingDomainsParameters<TParameters, TParticipant, TConsumeSocket> &\n TParameters;\n}\n\nexport type UpdateConsumingDomainsType<\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n> = (\n options: UpdateConsumingDomainsOptions<TParameters, TParticipant, TConsumeSocket>,\n) => Promise<void>;\n\n/**\n * Connects newly announced consuming domains, routing through alternate-domain lookup when needed.\n *\n * @param {UpdateConsumingDomainsOptions} options - Domain payload and consume-domain connection helpers.\n * @returns {Promise<void>} Resolves once the needed consume domains are connected.\n *\n * @example\n * ```typescript\n * await updateConsumingDomains({\n * domains,\n * alt_domains,\n * apiUserName: 'api-user',\n * apiKey: 'api-key',\n * apiToken: 'api-token',\n * parameters,\n * });\n * ```\n */\nexport const updateConsumingDomains = async <\n TParameters = unknown,\n TParticipant extends { name?: string | null } = Participant,\n TConsumeSocket = ConsumeSocket,\n>({\n domains,\n alt_domains,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n}: UpdateConsumingDomainsOptions<TParameters, TParticipant, TConsumeSocket>): Promise<void> => {\n let { participants, getDomains, consume_sockets, connectIps } = parameters;\n consume_sockets = parameters.getUpdatedAllParams().consume_sockets;\n\n try {\n if (participants.length > 0) {\n if (Object.keys(alt_domains).length > 0) {\n await getDomains({\n domains,\n alt_domains,\n apiUserName,\n apiKey,\n apiToken,\n parameters,\n });\n } else {\n await connectIps({\n consume_sockets,\n remIP: domains,\n parameters,\n apiUserName,\n apiKey,\n apiToken,\n });\n }\n }\n } catch (error) {\n console.log('Error in updateConsumingDomains: ', error);\n }\n};\n","import type {\n CoHostResponsibility,\n EventType,\n ShowAlert,\n} from '../../types/types';\n\nexport interface UpdatedCoHostOptions {\n coHost: string;\n coHostResponsibility: CoHostResponsibility[];\n showAlert?: ShowAlert;\n eventType: EventType;\n islevel: string;\n member: string;\n youAreCoHost: boolean;\n updateCoHost: (coHost: string) => void;\n updateCoHostResponsibility: (responsibility: CoHostResponsibility[]) => void;\n updateYouAreCoHost: (youAreCoHost: boolean) => void;\n}\n\nexport type UpdatedCoHostType = (options: UpdatedCoHostOptions) => Promise<void>;\n\n/**\n * Synchronizes co-host assignment state and optionally alerts the newly assigned co-host.\n *\n * @param {UpdatedCoHostOptions} options - Co-host payload and state setters.\n * @returns {Promise<void>} Resolves after co-host state is synchronized.\n *\n * @example\n * ```typescript\n * await updatedCoHost({\n * coHost: 'user123',\n * coHostResponsibility: responsibilities,\n * eventType: 'conference',\n * islevel: '1',\n * member: 'user123',\n * youAreCoHost: false,\n * updateCoHost: setCoHost,\n * updateCoHostResponsibility: setCoHostResponsibility,\n * updateYouAreCoHost: setYouAreCoHost,\n * showAlert,\n * });\n * ```\n */\nexport const updatedCoHost = async ({\n coHost,\n coHostResponsibility,\n showAlert,\n eventType,\n islevel,\n member,\n youAreCoHost,\n updateCoHost,\n updateCoHostResponsibility,\n updateYouAreCoHost,\n}: UpdatedCoHostOptions): Promise<void> => {\n if (eventType !== 'broadcast' && eventType !== 'chat') {\n updateCoHost(coHost);\n updateCoHostResponsibility(coHostResponsibility);\n\n if (member === coHost) {\n if (!youAreCoHost) {\n updateYouAreCoHost(true);\n showAlert?.({\n message: 'You are now a co-host.',\n type: 'success',\n duration: 3000,\n });\n }\n } else {\n updateYouAreCoHost(false);\n }\n } else if (islevel !== '2') {\n updateYouAreCoHost(true);\n }\n};\n","import type { ShowAlert } from '../../types/types';\n\nexport interface UserWaitingOptions {\n name: string;\n showAlert?: ShowAlert;\n totalReqWait: number;\n updateTotalReqWait: (total: number) => void;\n}\n\nexport type UserWaitingType = (options: UserWaitingOptions) => Promise<void>;\n\n/**\n * Handles a participant joining the waiting room by notifying the UI and bumping the pending total.\n *\n * @param {UserWaitingOptions} options - Waiting-room notification settings.\n * @param {string} options.name - Participant name shown in the alert.\n * @param {ShowAlert} [options.showAlert] - Optional alert presenter.\n * @param {number} options.totalReqWait - Current combined waiting/request count.\n * @param {(total: number) => void} options.updateTotalReqWait - Updates the combined waiting/request count.\n * @returns {Promise<void>} Resolves after state updates complete.\n *\n * @example\n * ```typescript\n * await userWaiting({\n * name: 'Ada',\n * totalReqWait: 2,\n * updateTotalReqWait: setTotalReqWait,\n * showAlert: ({ message }) => console.log(message),\n * });\n * ```\n */\nexport const userWaiting = async ({\n name,\n showAlert,\n totalReqWait,\n updateTotalReqWait,\n}: UserWaitingOptions): Promise<void> => {\n showAlert?.({\n message: `${name} joined the waiting room.`,\n type: 'success',\n duration: 3000,\n });\n\n updateTotalReqWait(totalReqWait + 1);\n};\n","export interface LaunchWaitingOptions {\n updateIsWaitingModalVisible: (visible: boolean) => void\n isWaitingModalVisible: boolean\n}\n\nexport type LaunchWaitingType = (options: LaunchWaitingOptions) => void\n\n/**\n * Toggles the visibility of the waiting modal.\n *\n * @param {LaunchWaitingOptions} options - The options for toggling the waiting modal visibility.\n * @param {Function} options.updateIsWaitingModalVisible - Function to update the visibility state of the waiting modal.\n * @param {boolean} options.isWaitingModalVisible - Current visibility state of the waiting modal.\n *\n * @example\n * ```typescript\n * const options = {\n * updateIsWaitingModalVisible: (visible: boolean) => console.log('Waiting modal visibility updated:', visible),\n * isWaitingModalVisible: true,\n * }\n * launchWaiting(options)\n * ```\n */\nexport const launchWaiting: LaunchWaitingType = ({ updateIsWaitingModalVisible, isWaitingModalVisible }) => {\n updateIsWaitingModalVisible(!isWaitingModalVisible)\n}\n","import { Socket } from \"socket.io-client\";\nimport type { WaitingRoomParticipant } from \"../../types/types\";\n\nexport interface RespondToWaitingOptions {\n participantId: string;\n participantName: string;\n updateWaitingList: (waitingList: WaitingRoomParticipant[]) => void;\n waitingList?: WaitingRoomParticipant[];\n type: string | boolean;\n roomName: string;\n socket: Socket;\n}\n\n// Export the type definition for the function\nexport type RespondToWaitingType = (options: RespondToWaitingOptions) => Promise<void>;\n\n/**\n * Responds to a participant waiting to join a room by either allowing or denying their entry.\n *\n * @param {RespondToWaitingOptions} options - The options for responding to the waiting participant.\n * @param {string} options.participantId - The ID of the participant.\n * @param {string} options.participantName - The name of the participant.\n * @param {Function} options.updateWaitingList - The function to update the waiting list.\n * @param {WaitingRoomParticipant[]} options.waitingList - The current waiting list of participants.\n * @param {boolean | string} options.type - The type of response, either \"true\" or \"false\".\n * @param {string} options.roomName - The name of the room.\n * @param {Socket} options.socket - The socket instance to emit events.\n * \n * @example\n * ```typescript\n * const options = {\n * participantId: \"12345\",\n * participantName: \"John Doe\",\n * updateWaitingList: (list) => console.log(\"Updated Waiting List:\", list),\n * waitingList: [{ id: \"12345\", name: \"John Doe\" }],\n * type: true,\n * roomName: \"room1\",\n * socket: socketInstance,\n * };\n * respondToWaiting(options);\n * ```\n */\n\nexport const respondToWaiting = async ({\n participantId,\n participantName,\n updateWaitingList,\n waitingList = [],\n type,\n roomName,\n socket,\n}: RespondToWaitingOptions): Promise<void> => {\n if (!participantId || !participantName) {\n return;\n }\n\n if (!updateWaitingList) {\n console.warn('[respondToWaiting] Missing updateWaitingList handler; aborting emit.');\n return;\n }\n\n if (!socket || typeof (socket as Socket).emit !== 'function') {\n console.warn('[respondToWaiting] Socket is not ready; skipping emit.');\n return;\n }\n\n // Filter out the participant from the waiting list\n const newWaitingList = waitingList.filter((item) => item.name !== participantName);\n\n // Update the waiting list\n updateWaitingList(newWaitingList);\n\n const responseType = type === \"true\" || type === true ? \"true\" : \"false\";\n\n // Emit an event to allow or deny the participant based on the response type\n socket.emit(\"allowUserIn\", {\n participantId,\n participantName,\n type: responseType,\n roomName,\n });\n};\n","import type { Socket } from 'socket.io-client';\nimport Cookies from 'universal-cookie';\nimport type { PreJoinPageParameters } from '../../types/types';\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10;\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours\n\nconst hasConnectedSocketId = (socket: unknown): socket is Socket & { id: string } => {\n if (!socket || typeof socket !== 'object') {\n return false;\n }\n\n const candidate = socket as { id?: unknown };\n return typeof candidate.id === 'string' && candidate.id.length > 0;\n};\n\n/**\n * Options for handleWelcomeRequest function\n */\nexport interface HandleWelcomeRequestOptions {\n apiUserName: string;\n apiToken: string;\n link: string;\n userName: string;\n parameters: PreJoinPageParameters;\n}\n\n/**\n * Validates alphanumeric strings\n */\nexport function validateAlphanumeric(str: string): boolean {\n if (str.length === 0) return true;\n const alphanumericRegex = /^[a-zA-Z0-9]+$/;\n return alphanumericRegex.test(str);\n}\n\n/**\n * Validates welcome page form inputs\n */\nexport interface ValidateWelcomeInputsOptions {\n name: string;\n secret: string;\n eventID: string;\n link: string;\n}\n\nexport function validateWelcomeInputs({\n name,\n secret,\n eventID,\n link,\n}: ValidateWelcomeInputsOptions): { valid: boolean; message?: string } {\n if (name.length === 0 || secret.length === 0 || eventID.length === 0 || link.length === 0) {\n return { valid: false, message: 'Please fill all the fields.' };\n }\n\n if (\n !validateAlphanumeric(name) ||\n !validateAlphanumeric(secret) ||\n !validateAlphanumeric(eventID) ||\n !link.includes('mediasfu.com') ||\n eventID.toLowerCase().startsWith('d')\n ) {\n return { valid: false, message: 'Please enter valid details.' };\n }\n\n if (\n secret.length != 64 ||\n name.length > 12 ||\n name.length < 2 ||\n eventID.length > 32 ||\n eventID.length < 8 ||\n link.length < 12\n ) {\n return { valid: false, message: 'Please enter valid details.' };\n }\n\n return { valid: true };\n}\n\n/**\n * Handles connection request with rate limiting for welcome page\n * \n * @param {HandleWelcomeRequestOptions} options - Configuration for the request\n * @returns {Promise<void>}\n * \n * @example\n * ```typescript\n * await handleWelcomeRequest({\n * apiUserName: 'room123',\n * apiToken: 'secret123',\n * link: 'https://mediasfu.com/meeting',\n * userName: 'John Doe',\n * parameters,\n * });\n * ```\n */\nexport async function handleWelcomeRequest({\n apiUserName,\n apiToken,\n link,\n userName,\n parameters,\n}: HandleWelcomeRequestOptions): Promise<void> {\n const {\n showAlert,\n updateIsLoadingModalVisible,\n connectSocket,\n updateSocket,\n updateValidated,\n updateApiUserName,\n updateApiToken,\n updateLink,\n updateRoomName,\n updateMember,\n } = parameters;\n\n const TIMEOUT_DURATION = 10000; // 10 seconds\n\n let unsuccessfulAttempts = parseInt(cookies.get('unsuccessfulAttempts') || '0');\n let lastRequestTimestamp = parseInt(cookies.get('lastRequestTimestamp') || '0');\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n if (Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {\n showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n cookies.set('lastRequestTimestamp', Date.now().toString());\n return;\n } else {\n unsuccessfulAttempts = 0;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n }\n }\n\n try {\n updateIsLoadingModalVisible(true);\n\n const socketPromise = connectSocket({\n apiUserName,\n apiKey: '',\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('Request timed out')), TIMEOUT_DURATION)\n );\n\n const socket = await Promise.race([socketPromise, timeoutPromise]);\n\n if (hasConnectedSocketId(socket)) {\n unsuccessfulAttempts = 0;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateSocket(socket);\n updateApiUserName(apiUserName);\n updateApiToken(apiToken);\n updateLink(link);\n updateRoomName(apiUserName);\n updateMember(userName);\n updateValidated(true);\n } else {\n unsuccessfulAttempts += 1;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateIsLoadingModalVisible(false);\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n } else {\n showAlert?.({\n message: 'Invalid credentials.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch {\n showAlert?.({\n message: 'Unable to connect. Check your credentials and try again.',\n type: 'danger',\n duration: 3000,\n });\n\n unsuccessfulAttempts += 1;\n cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());\n cookies.set('lastRequestTimestamp', Date.now().toString());\n updateIsLoadingModalVisible(false);\n }\n}\n","import type { Socket } from 'socket.io-client';\nimport type { ShowAlert, WhiteboardUser } from '../../types/types';\n\n\nexport interface HandleStartWhiteboardOptions {\n socket: Socket;\n whiteboardUsers: WhiteboardUser[];\n roomName: string;\n whiteboardStarted: boolean;\n whiteboardEnded: boolean;\n showAlert?: ShowAlert;\n updateWhiteboardStarted: (started: boolean) => void;\n updateWhiteboardEnded: (ended: boolean) => void;\n updateIsConfigureWhiteboardModalVisible: (isVisible: boolean) => void;\n}\n\nexport type HandleStartWhiteboardType = (options: HandleStartWhiteboardOptions) => Promise<boolean>;\n\n/**\n * Handles the start of a whiteboard session.\n * @function\n * @param {HandleStartWhiteboardOptions} options - The options for starting the whiteboard.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {WhiteboardUser[]} options.whiteboardUsers - Array of users assigned to the whiteboard.\n * @param {string} options.roomName - The name of the room.\n * @param {boolean} options.whiteboardStarted - Whether the whiteboard has already started.\n * @param {boolean} options.whiteboardEnded - Whether the whiteboard has ended.\n * @param {ShowAlert} [options.showAlert] - Function to show alerts.\n * @param {Function} options.updateWhiteboardStarted - Function to update whiteboard started state.\n * @param {Function} options.updateWhiteboardEnded - Function to update whiteboard ended state.\n * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to close the configure modal.\n * @returns {Promise<boolean>}\n */\nexport const handleStartWhiteboard = async ({\n socket,\n whiteboardUsers,\n roomName,\n whiteboardStarted,\n whiteboardEnded,\n showAlert,\n updateWhiteboardStarted,\n updateWhiteboardEnded,\n updateIsConfigureWhiteboardModalVisible,\n}: HandleStartWhiteboardOptions): Promise<boolean> => {\n const emitName = whiteboardStarted && !whiteboardEnded ? 'updateWhiteboard' : 'startWhiteboard';\n const filteredWhiteboardUsers = whiteboardUsers.map(({ name, useBoard }) => ({ name, useBoard }));\n\n return new Promise((resolve) => {\n socket.emit(\n emitName,\n { whiteboardUsers: filteredWhiteboardUsers, roomName },\n (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({ message: 'Whiteboard active', type: 'success' });\n updateWhiteboardStarted(true);\n updateWhiteboardEnded(false);\n updateIsConfigureWhiteboardModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || 'Failed to start whiteboard', type: 'danger' });\n }\n resolve(response.success);\n }\n );\n });\n};\n","import type { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../types/types';\n\nexport interface HandleStopWhiteboardOptions {\n socket: Socket;\n roomName: string;\n showAlert?: ShowAlert;\n updateWhiteboardStarted: (started: boolean) => void;\n updateWhiteboardEnded: (ended: boolean) => void;\n updateIsConfigureWhiteboardModalVisible: (isVisible: boolean) => void;\n}\n\nexport type HandleStopWhiteboardType = (options: HandleStopWhiteboardOptions) => Promise<boolean>;\n\n/**\n * Handles stopping a whiteboard session.\n * @function\n * @param {HandleStopWhiteboardOptions} options - The options for stopping the whiteboard.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {string} options.roomName - The name of the room.\n * @param {ShowAlert} [options.showAlert] - Function to show alerts.\n * @param {Function} options.updateWhiteboardStarted - Function to update whiteboard started state.\n * @param {Function} options.updateWhiteboardEnded - Function to update whiteboard ended state.\n * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to close the configure modal.\n * @returns {Promise<boolean>}\n */\nexport const handleStopWhiteboard = async ({\n socket,\n roomName,\n showAlert,\n updateWhiteboardStarted,\n updateWhiteboardEnded,\n updateIsConfigureWhiteboardModalVisible,\n}: HandleStopWhiteboardOptions): Promise<boolean> => {\n return new Promise((resolve) => {\n socket.emit('stopWhiteboard', { roomName }, (response: { success: boolean; reason?: string }) => {\n if (response.success) {\n showAlert?.({ message: 'Whiteboard stopped', type: 'success' });\n updateWhiteboardStarted(false);\n updateWhiteboardEnded(true);\n updateIsConfigureWhiteboardModalVisible(false);\n } else {\n showAlert?.({ message: response.reason || 'Failed to stop whiteboard', type: 'danger' });\n }\n resolve(response.success);\n });\n });\n};\n","export interface LaunchConfigureWhiteboardOptions {\n updateIsConfigureWhiteboardModalVisible: (visible: boolean) => void\n isConfigureWhiteboardModalVisible: boolean\n}\n\nexport type LaunchConfigureWhiteboardType = (options: LaunchConfigureWhiteboardOptions) => void\n\n/**\n * Toggles the visibility of the configure whiteboard modal.\n *\n * @param {LaunchConfigureWhiteboardOptions} options - The options for toggling the whiteboard modal visibility.\n * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to update the visibility state of the configure whiteboard modal.\n * @param {boolean} options.isConfigureWhiteboardModalVisible - Current visibility state of the configure whiteboard modal.\n *\n * @example\n * ```typescript\n * const options = {\n * updateIsConfigureWhiteboardModalVisible: (visible: boolean) => console.log('Modal visibility updated:', visible),\n * isConfigureWhiteboardModalVisible: false,\n * }\n * launchConfigureWhiteboard(options)\n * ```\n */\nexport const launchConfigureWhiteboard: LaunchConfigureWhiteboardType = ({\n updateIsConfigureWhiteboardModalVisible,\n isConfigureWhiteboardModalVisible,\n}) => {\n updateIsConfigureWhiteboardModalVisible(!isConfigureWhiteboardModalVisible)\n}\n"],"names":["mixStreams","dispStreams","temp","streame","stopShareScreen","requestScreenShare","reorderStreams","prepopulateUserMedia","getVideos","rePort","participant","trigger","connectRecvTransport","closeAndResize","validateAlphanumeric","receiveAllPipedTransports","createDeviceClient","consumerResume","connectSendTransportAudio","connectSendTransportVideo","connectSendTransportScreen","codec","screenParams","connectSendTransport","parameters","processConsumerTransports","resumePauseStreams","readjust","addVideosGrid","checkGrid","getEstimate","resumePauseAudioStreams","getProducerId","sleep","getPipedProducersAlt","changeVids","compareActiveNames","compareScreenStates","startShareScreen","processConsumerTransportsAudio","breakRoom","onScreenChanges","stream","mediaDevices","streamSuccessScreen","disconnectSendTransportScreen","aParams","createSendTransport","resumeSendTransportAudio","vParams","hParams","streamSuccessAudioSwitch","streamSuccessVideo","disconnectSendTransportVideo","checkPermission","autoAdjust","decode","cookies","MAX_ATTEMPTS","RATE_LIMIT_DURATION","hasConnectedSocketId","streamSuccessAudio","disconnectSendTransportAudio","response","checkScreenShare","host_Params","video_Params","screen_Params","audio_Params","readResponseError","calculateRowsAndColumns","signalNewConsumerTransport","host","joinLocalRoom","padNumber","captureCanvasStream","switchUserAudio","switchUserVideo","switchUserVideoAlt","MediaStream","connectIps","connectLocalIps","track","updatePanelists","clickAudio","clickVideo","updatePermissionConfig","reUpdateInter","stopConsumingTranslation","pauseOriginalProducer","resumeOriginalProducer","getDomains","connectSocket"],"mappings":"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","x_google_ignoreList":[55]}
|