{"version":3,"file":"index.cjs","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","Socket","mediasoupClient","calculateRowsAndColumns","signalNewConsumerTransport","response","switchUserAudio","switchUserVideo","switchUserVideoAlt","connectSocket"],"mappings":"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","x_google_ignoreList":[54]}