mediasfu-shared 1.2.3 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/audioProcessing-0z5KlcmO.js +35 -0
  3. package/dist/audioProcessing-0z5KlcmO.js.map +1 -0
  4. package/dist/audioProcessing-BpbrdCk-.cjs +34 -0
  5. package/dist/audioProcessing-BpbrdCk-.cjs.map +1 -0
  6. package/dist/consumers/audioProcessing.d.ts +8 -0
  7. package/dist/consumers/audioProcessing.d.ts.map +1 -0
  8. package/dist/consumers/createSendTransport.d.ts.map +1 -1
  9. package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts +6 -0
  10. package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts.map +1 -1
  11. package/dist/consumers/index.cjs +3 -2
  12. package/dist/consumers/index.cjs.map +1 -1
  13. package/dist/consumers/index.js +14 -13
  14. package/dist/consumers/signalNewConsumerTransport.d.ts.map +1 -1
  15. package/dist/consumers/switchUserAudio.d.ts +3 -1
  16. package/dist/consumers/switchUserAudio.d.ts.map +1 -1
  17. package/dist/consumers/transportRecovery.d.ts +8 -0
  18. package/dist/consumers/transportRecovery.d.ts.map +1 -0
  19. package/dist/{getParticipantMedia-AwwtMCTz.cjs → getParticipantMedia-CP4hE5Rg.cjs} +9 -4
  20. package/dist/getParticipantMedia-CP4hE5Rg.cjs.map +1 -0
  21. package/dist/{getParticipantMedia-CyaOk2oD.js → getParticipantMedia-CvXdDj03.js} +9 -4
  22. package/dist/getParticipantMedia-CvXdDj03.js.map +1 -0
  23. package/dist/index.cjs +106 -22
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +173 -89
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.native.cjs +8 -7
  30. package/dist/index.native.cjs.map +1 -1
  31. package/dist/index.native.js +19 -18
  32. package/dist/{joinLocalRoom-Bu3gz27d.js → joinLocalRoom-Cx1y3Ojj.js} +4 -4
  33. package/dist/{joinLocalRoom-Bu3gz27d.js.map → joinLocalRoom-Cx1y3Ojj.js.map} +1 -1
  34. package/dist/{joinLocalRoom-Cii5D5IG.cjs → joinLocalRoom-DNJ2zb8W.cjs} +10 -10
  35. package/dist/{joinLocalRoom-Cii5D5IG.cjs.map → joinLocalRoom-DNJ2zb8W.cjs.map} +1 -1
  36. package/dist/{joinRoomOnMediaSFU-y6vJ1OBo.js → joinRoomOnMediaSFU-BnAWLciF.js} +9 -3
  37. package/dist/joinRoomOnMediaSFU-BnAWLciF.js.map +1 -0
  38. package/dist/{joinRoomOnMediaSFU-CC8RVJgr.cjs → joinRoomOnMediaSFU-D2C7q1GK.cjs} +9 -3
  39. package/dist/joinRoomOnMediaSFU-D2C7q1GK.cjs.map +1 -0
  40. package/dist/methods/index.cjs +3 -3
  41. package/dist/methods/index.js +3 -3
  42. package/dist/methods/stream/clickAudio.d.ts +3 -1
  43. package/dist/methods/stream/clickAudio.d.ts.map +1 -1
  44. package/dist/methods/stream/switchAudio.d.ts +3 -1
  45. package/dist/methods/stream/switchAudio.d.ts.map +1 -1
  46. package/dist/methods/utils/headless/virtualBackground.d.ts +3 -1
  47. package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -1
  48. package/dist/methods/utils/virtualBackgroundFrameLoop.d.ts +10 -0
  49. package/dist/methods/utils/virtualBackgroundFrameLoop.d.ts.map +1 -0
  50. package/dist/{translationConsumerSwitch-C20MfNNq.cjs → translationConsumerSwitch-BAsQUpH6.cjs} +9 -1
  51. package/dist/translationConsumerSwitch-BAsQUpH6.cjs.map +1 -0
  52. package/dist/{translationConsumerSwitch-zKuS5wgH.js → translationConsumerSwitch-BUODiT6o.js} +20 -12
  53. package/dist/translationConsumerSwitch-BUODiT6o.js.map +1 -0
  54. package/dist/types/index.cjs +3 -3
  55. package/dist/types/index.js +3 -3
  56. package/dist/types/shared-base-types.d.ts +12 -0
  57. package/dist/types/shared-base-types.d.ts.map +1 -1
  58. package/dist/{updateParticipantAudioDecibels-QZyahisU.cjs → updateParticipantAudioDecibels-BJ2PxJJD.cjs} +203 -46
  59. package/dist/updateParticipantAudioDecibels-BJ2PxJJD.cjs.map +1 -0
  60. package/dist/{updateParticipantAudioDecibels-CnEXJBmc.js → updateParticipantAudioDecibels-DiJ_LFfH.js} +200 -43
  61. package/dist/updateParticipantAudioDecibels-DiJ_LFfH.js.map +1 -0
  62. package/package.json +1 -1
  63. package/src/consumers/audioProcessing.ts +26 -0
  64. package/src/consumers/createSendTransport.ts +5 -20
  65. package/src/consumers/gridLayout/addVideosGrid.engine.ts +13 -0
  66. package/src/consumers/signalNewConsumerTransport.ts +7 -25
  67. package/src/consumers/switchUserAudio.ts +18 -5
  68. package/src/consumers/transportRecovery.ts +170 -0
  69. package/src/index.ts +2 -0
  70. package/src/methods/stream/clickAudio.ts +13 -5
  71. package/src/methods/stream/switchAudio.ts +10 -1
  72. package/src/methods/utils/headless/virtualBackground.ts +21 -13
  73. package/src/methods/utils/virtualBackgroundFrameLoop.ts +69 -0
  74. package/src/types/shared-base-types.ts +3 -0
  75. package/dist/getParticipantMedia-AwwtMCTz.cjs.map +0 -1
  76. package/dist/getParticipantMedia-CyaOk2oD.js.map +0 -1
  77. package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs.map +0 -1
  78. package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js.map +0 -1
  79. package/dist/translationConsumerSwitch-C20MfNNq.cjs.map +0 -1
  80. package/dist/translationConsumerSwitch-zKuS5wgH.js.map +0 -1
  81. package/dist/updateParticipantAudioDecibels-CnEXJBmc.js.map +0 -1
  82. package/dist/updateParticipantAudioDecibels-QZyahisU.cjs.map +0 -1
  83. package/dist/validateAlphanumeric-DKn5BsUP.cjs +0 -15
  84. package/dist/validateAlphanumeric-DKn5BsUP.cjs.map +0 -1
  85. package/dist/validateAlphanumeric-Dk1JB80W.js +0 -16
  86. package/dist/validateAlphanumeric-Dk1JB80W.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"joinLocalRoom-Cii5D5IG.cjs","sources":["../src/consumers/addVideosGrid.ts","../src/consumers/prepopulateUserMedia.ts","../src/methods/breakoutRooms/breakoutRoomUpdated.ts","../src/methods/settings/modifySettings.ts","../src/ProducerClient/producerClientEmits/createDeviceClient.ts","../src/producers/producerEmits/joinRoom.ts","../src/ProducerClient/producerClientEmits/joinRoomClient.ts","../src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts","../src/producers/producerEmits/joinLocalRoom.ts"],"sourcesContent":["// Stub export for addVideosGrid\n// This is a React component in the original and not needed for the shared package\n\nimport { createFrameworkConsumerContractError } from './frameworkConsumerContract';\n\nexport interface AddVideosGridParameters {\n [key: string]: any;\n}\n\nexport interface AddVideosGridOptions {\n parameters: AddVideosGridParameters;\n [key: string]: any; // Accept any additional properties\n}\n\nexport type AddVideosGridType = (options: AddVideosGridOptions) => Promise<void>;\n\nexport const addVideosGrid: AddVideosGridType = async () => {\n throw createFrameworkConsumerContractError('addVideosGrid');\n};\n","// Stub export for prepopulateUserMedia\n// This is a React component in the original and not needed for the shared package\n\nimport { createFrameworkConsumerContractError } from './frameworkConsumerContract';\n\nexport interface PrepopulateUserMediaParameters {\n [key: string]: any;\n}\n\nexport interface PrepopulateUserMediaOptions {\n name: string;\n parameters: PrepopulateUserMediaParameters;\n}\n\nexport type PrepopulateUserMediaType = (options: PrepopulateUserMediaOptions) => Promise<void>;\n\nexport const prepopulateUserMedia: PrepopulateUserMediaType = async () => {\n throw createFrameworkConsumerContractError('prepopulateUserMedia');\n};\n","import 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","import * as mediasoupClient from \"mediasoup-client\";\nimport type { RtpCapabilities, Device } from 'mediasoup-client/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","import { Socket } from 'socket.io-client';\nimport type { RtpCapabilities } from 'mediasoup-client/types';\nimport { validateAlphanumeric } from '../../methods/utils/validateAlphanumeric';\n\nexport interface JoinRoomOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n}\n\nexport interface JoinRoomResponse {\n success: boolean;\n rtpCapabilities: RtpCapabilities | null;\n reason?: string;\n banned?: boolean;\n suspended?: boolean;\n noAdmin?: boolean;\n [key: string]: any;\n}\n\nexport type JoinRoomType = (options: JoinRoomOptions) => Promise<JoinRoomResponse>;\n\n/**\n * Joins a user to a specified room via a socket connection.\n *\n * @param {JoinRoomOptions} options - The options for joining the room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token.\n * @param {string} options.apiUserName - The API username of the user.\n *\n * @returns {Promise<JoinRoomResponse>} A promise that resolves with the data received from the 'joinRoom' event or rejects with a validation error.\n */\nexport async function joinRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n}: JoinRoomOptions): Promise<JoinRoomResponse> {\n return new Promise((resolve, reject) => {\n if (!(sec && roomName && islevel && apiUserName && member)) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Missing required parameters',\n };\n reject(validationError);\n return;\n }\n\n try {\n validateAlphanumeric({ str: roomName });\n validateAlphanumeric({ str: apiUserName });\n validateAlphanumeric({ str: member });\n } catch {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or apiUserName or member',\n };\n reject(validationError);\n return;\n }\n\n if (!(roomName.startsWith('s') || roomName.startsWith('p') || roomName.startsWith('d'))) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName, must start with s or p or d',\n };\n reject(validationError);\n return;\n }\n\n if (\n !(\n sec.length === 64\n && roomName.length >= 8\n && islevel.length === 1\n && apiUserName.length >= 6\n && (islevel === '0' || islevel === '1' || islevel === '2')\n )\n ) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or islevel or apiUserName or secret',\n };\n reject(validationError);\n return;\n }\n\n socket.emit(\n 'joinRoom',\n {\n roomName, islevel, member, sec, apiUserName,\n },\n async (data: JoinRoomResponse) => {\n try {\n if (data.rtpCapabilities == null) {\n if (data.banned) {\n throw new Error('User is banned.');\n }\n if (data.suspended) {\n throw new Error('User is suspended.');\n }\n if (data.noAdmin) {\n throw new Error('Host has not joined the room yet.');\n }\n\n resolve(data);\n } else {\n resolve(data);\n }\n } catch (error) {\n console.log('Error joining room:', error);\n reject(error);\n }\n },\n );\n });\n}\n","import { Socket } from 'socket.io-client';\nimport { joinRoom, JoinRoomResponse } from '../../producers/producerEmits/joinRoom';\nimport { joinConRoom, JoinConRoomResponse } from '../../producers/producerEmits/joinConRoom';\n\nexport interface JoinRoomClientOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n consume?: boolean;\n}\n\nexport type JoinRoomClientResponse = JoinRoomResponse | JoinConRoomResponse;\nexport type JoinRoomClientType = (options: JoinRoomClientOptions) => Promise<JoinRoomClientResponse>;\n\n/**\n * Joins a room by delegating to the producer or consumer join emit based on the consume flag.\n *\n * @param {JoinRoomClientOptions} options - The options for joining the room.\n * @returns {Promise<JoinRoomClientResponse>} The response returned from the server.\n */\nexport const joinRoomClient = async ({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n consume = false,\n}: JoinRoomClientOptions): Promise<JoinRoomClientResponse> => {\n try {\n if (consume) {\n return await joinConRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n });\n }\n\n return await joinRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n });\n } catch (error) {\n console.log(error);\n throw new Error('Failed to join the room. Please check your connection and try again.');\n }\n};\n","/* eslint-disable eqeqeq */\nimport { RtpCapabilities } from 'mediasoup-client/types';\nimport {\n QnHDCons,\n sdCons,\n hdCons,\n fhdCons,\n qhdCons,\n QnHDConsPort,\n sdConsPort,\n hdConsPort,\n fhdConsPort,\n qhdConsPort,\n QnHDConsNeu,\n sdConsNeu,\n hdConsNeu,\n fhdConsNeu,\n qhdConsNeu,\n QnHDFrameRate,\n hdFrameRate,\n fhdFrameRate,\n qhdFrameRate,\n} from '../../methods/utils/producer/videoCaptureConstraints';\nimport { hParams as host_Params } from '../../methods/utils/producer/hParams';\nimport { vParams as video_Params } from '../../methods/utils/producer/vParams';\nimport { screenParams as screen_Params } from '../../methods/utils/producer/screenParams';\nimport { aParams as audio_Params } from '../../methods/utils/producer/aParams';\nimport {\n HParamsType,\n VParamsType,\n ScreenParamsType,\n AParamsType,\n MeetingRoomParams,\n VidCons,\n ShowAlert,\n ResponseJoinRoom,\n EventType,\n} from '../../types/shared-base-types';\n\nexport interface UpdateRoomParametersClientParameters {\n rtpCapabilities: RtpCapabilities | null;\n roomRecvIPs: string[];\n meetingRoomParams: MeetingRoomParams | null;\n itemPageLimit: number;\n audioOnlyRoom: boolean;\n addForBasic: boolean;\n screenPageLimit: number;\n shareScreenStarted: boolean;\n shared: boolean;\n targetOrientation: string;\n vidCons: VidCons;\n recordingVideoSupport: boolean;\n frameRate: number;\n adminPasscode: string;\n eventType: EventType;\n youAreCoHost: boolean;\n autoWave: boolean;\n forceFullDisplay: boolean;\n chatSetting: string;\n meetingDisplayType: string;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n hParams: HParamsType;\n vParams: VParamsType;\n screenParams: ScreenParamsType;\n aParams: AParamsType;\n islevel: string;\n showAlert?: ShowAlert;\n data: ResponseJoinRoom;\n updateRtpCapabilities: (rtpCapabilities: RtpCapabilities | null) => void;\n updateRoomRecvIPs: (roomRecvIPs: string[]) => void;\n updateMeetingRoomParams: (meetingRoomParams: MeetingRoomParams | null) => void;\n updateItemPageLimit: (limit: number) => void;\n updateAudioOnlyRoom: (isAudioOnly: boolean) => void;\n updateAddForBasic: (addForBasic: boolean) => void;\n updateScreenPageLimit: (limit: number) => void;\n updateVidCons: (cons: VidCons) => void;\n updateFrameRate: (frameRate: number) => void;\n updateAdminPasscode: (passcode: string) => void;\n updateEventType: (eventType: EventType) => void;\n updateYouAreCoHost: (coHost: boolean) => void;\n updateAutoWave: (autoWave: boolean) => void;\n updateForceFullDisplay: (forceFull: boolean) => void;\n updateChatSetting: (setting: string) => void;\n updateMeetingDisplayType: (type: string) => void;\n updateAudioSetting: (setting: string) => void;\n updateVideoSetting: (setting: string) => void;\n updateScreenshareSetting: (setting: string) => void;\n updateHParams: (params: HParamsType) => void;\n updateVParams: (params: VParamsType) => void;\n updateScreenParams: (params: ScreenParamsType) => void;\n updateAParams: (params: AParamsType) => void;\n updateMainHeightWidth: (heightWidth: number) => void;\n updateTargetResolution: (resolution: string) => void;\n updateTargetResolutionHost: (resolution: string) => void;\n updateRecordingAudioPausesLimit: (limit: number) => void;\n updateRecordingAudioPausesCount: (count: number) => void;\n updateRecordingAudioSupport: (support: boolean) => void;\n updateRecordingAudioPeopleLimit: (limit: number) => void;\n updateRecordingAudioParticipantsTimeLimit: (limit: number) => void;\n updateRecordingVideoPausesCount: (count: number) => void;\n updateRecordingVideoPausesLimit: (limit: number) => void;\n updateRecordingVideoSupport: (support: boolean) => void;\n updateRecordingVideoPeopleLimit: (limit: number) => void;\n updateRecordingVideoParticipantsTimeLimit: (limit: number) => void;\n updateRecordingAllParticipantsSupport: (support: boolean) => void;\n updateRecordingVideoParticipantsSupport: (support: boolean) => void;\n updateRecordingAllParticipantsFullRoomSupport: (support: boolean) => void;\n updateRecordingVideoParticipantsFullRoomSupport: (support: boolean) => void;\n updateRecordingPreferredOrientation: (orientation: string) => void;\n updateRecordingSupportForOtherOrientation: (support: boolean) => void;\n updateRecordingMultiFormatsSupport: (support: boolean) => void;\n updateRecordingVideoOptions: (options: string) => void;\n updateRecordingAudioOptions: (options: string) => void;\n}\n\nexport type UpdateRoomParametersClientOptions = {\n parameters: UpdateRoomParametersClientParameters;\n};\n\nexport type UpdateRoomParametersClientType = (options: UpdateRoomParametersClientOptions) => void;\n\nexport const updateRoomParametersClient = ({ parameters }: UpdateRoomParametersClientOptions): void => {\n try {\n const {\n screenPageLimit,\n shareScreenStarted,\n shared,\n hParams = host_Params,\n vParams = video_Params,\n frameRate,\n islevel,\n showAlert,\n data,\n updateRtpCapabilities,\n updateRoomRecvIPs,\n updateMeetingRoomParams,\n updateItemPageLimit,\n updateAudioOnlyRoom,\n updateScreenPageLimit,\n updateVidCons,\n updateFrameRate,\n updateAdminPasscode,\n updateEventType,\n updateYouAreCoHost,\n updateAutoWave,\n updateForceFullDisplay,\n updateChatSetting,\n updateMeetingDisplayType,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateHParams,\n updateVParams,\n updateScreenParams,\n updateAParams,\n updateTargetResolution,\n updateTargetResolutionHost,\n updateRecordingAudioPausesLimit,\n updateRecordingAudioPausesCount,\n updateRecordingAudioSupport,\n updateRecordingAudioPeopleLimit,\n updateRecordingAudioParticipantsTimeLimit,\n updateRecordingVideoPausesCount,\n updateRecordingVideoPausesLimit,\n updateRecordingVideoSupport,\n updateRecordingVideoPeopleLimit,\n updateRecordingVideoParticipantsTimeLimit,\n updateRecordingAllParticipantsSupport,\n updateRecordingVideoParticipantsSupport,\n updateRecordingAllParticipantsFullRoomSupport,\n updateRecordingVideoParticipantsFullRoomSupport,\n updateRecordingPreferredOrientation,\n updateRecordingSupportForOtherOrientation,\n updateRecordingMultiFormatsSupport,\n updateRecordingVideoOptions,\n updateRecordingAudioOptions,\n updateMainHeightWidth,\n } = parameters;\n\n if (data.rtpCapabilities == null) {\n const reason = data.reason || '';\n showAlert?.({\n message: `Sorry, you are not allowed to join this room. ${reason}`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n updateRtpCapabilities(data.rtpCapabilities);\n updateAdminPasscode(data.secureCode);\n updateRoomRecvIPs(data.roomRecvIPs);\n updateMeetingRoomParams(data.meetingRoomParams);\n\n updateRecordingAudioPausesLimit(data.recordingParams.recordingAudioPausesLimit);\n updateRecordingAudioPausesCount(data.recordingParams.recordingAudioPausesCount!);\n updateRecordingAudioSupport(data.recordingParams.recordingAudioSupport);\n updateRecordingAudioPeopleLimit(data.recordingParams.recordingAudioPeopleLimit);\n updateRecordingAudioParticipantsTimeLimit(data.recordingParams.recordingAudioParticipantsTimeLimit);\n updateRecordingVideoPausesCount(data.recordingParams.recordingVideoPausesCount!);\n updateRecordingVideoPausesLimit(data.recordingParams.recordingVideoPausesLimit);\n updateRecordingVideoSupport(data.recordingParams.recordingVideoSupport);\n updateRecordingVideoPeopleLimit(data.recordingParams.recordingVideoPeopleLimit);\n updateRecordingVideoParticipantsTimeLimit(data.recordingParams.recordingVideoParticipantsTimeLimit);\n updateRecordingAllParticipantsSupport(data.recordingParams.recordingAllParticipantsSupport);\n updateRecordingVideoParticipantsSupport(data.recordingParams.recordingVideoParticipantsSupport);\n updateRecordingAllParticipantsFullRoomSupport(data.recordingParams.recordingAllParticipantsFullRoomSupport);\n updateRecordingVideoParticipantsFullRoomSupport(data.recordingParams.recordingVideoParticipantsFullRoomSupport);\n updateRecordingPreferredOrientation(data.recordingParams.recordingPreferredOrientation);\n updateRecordingSupportForOtherOrientation(data.recordingParams.recordingSupportForOtherOrientation);\n updateRecordingMultiFormatsSupport(data.recordingParams.recordingMultiFormatsSupport);\n\n updateItemPageLimit(data.meetingRoomParams.itemPageLimit);\n updateEventType(data.meetingRoomParams.type);\n\n if (data.meetingRoomParams.type == 'chat' && islevel != '2') {\n updateYouAreCoHost(true);\n }\n\n if (['chat', 'broadcast'].includes(data.meetingRoomParams.type)) {\n updateAutoWave(false);\n updateMeetingDisplayType('all');\n updateForceFullDisplay(true);\n updateChatSetting('allow');\n updateItemPageLimit(2);\n\n if (['broadcast'].includes(data.meetingRoomParams.type)) {\n updateRecordingVideoOptions('mainScreen');\n updateRecordingAudioOptions('host');\n updateItemPageLimit(1);\n }\n }\n\n updateAudioSetting(data.meetingRoomParams.audioSetting);\n updateVideoSetting(data.meetingRoomParams.videoSetting);\n updateScreenshareSetting(data.meetingRoomParams.screenshareSetting);\n updateChatSetting(data.meetingRoomParams.chatSetting);\n\n updateAudioOnlyRoom(data.meetingRoomParams.mediaType != 'video');\n\n if (data.meetingRoomParams.type == 'conference' && (shared || shareScreenStarted)) {\n updateMainHeightWidth(100);\n } else {\n updateMainHeightWidth(0);\n }\n\n updateScreenPageLimit(Math.min(data.meetingRoomParams.itemPageLimit, screenPageLimit));\n\n const targetOrientation = islevel == '2'\n ? data.meetingRoomParams.targetOrientationHost\n : data.meetingRoomParams.targetOrientation;\n const targetResolution = islevel == '2'\n ? data.meetingRoomParams.targetResolutionHost\n : data.meetingRoomParams.targetResolution;\n\n let vidCons: VidCons;\n if (targetOrientation == 'landscape') {\n vidCons = targetResolution == 'hd'\n ? hdCons\n : targetResolution == 'fhd'\n ? fhdCons\n : targetResolution == 'qhd'\n ? qhdCons\n : targetResolution == 'sd'\n ? sdCons\n : QnHDCons;\n } else if (targetOrientation == 'neutral') {\n vidCons = targetResolution == 'hd'\n ? hdConsNeu\n : targetResolution == 'fhd'\n ? fhdConsNeu\n : targetResolution == 'qhd'\n ? qhdConsNeu\n : targetResolution == 'sd'\n ? sdConsNeu\n : QnHDConsNeu;\n } else {\n vidCons = targetResolution == 'hd'\n ? hdConsPort\n : targetResolution == 'fhd'\n ? fhdConsPort\n : targetResolution == 'qhd'\n ? qhdConsPort\n : targetResolution == 'sd'\n ? sdConsPort\n : QnHDConsPort;\n }\n\n let frameRateValue = frameRate || 10;\n let vParamsValue = { ...vParams };\n let hParamsValue = { ...hParams };\n\n if (Object.keys(vParamsValue).length == 0) {\n vParamsValue = { ...video_Params };\n }\n\n if (Object.keys(hParamsValue).length == 0) {\n hParamsValue = { ...host_Params };\n }\n\n if (targetResolution == 'hd') {\n frameRateValue = hdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 4);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 4);\n }\n });\n } else if (targetResolution == 'QnHD') {\n frameRateValue = QnHDFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 0.25);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 0.25);\n }\n });\n\n if (hParamsValue.codecOptions && hParamsValue.codecOptions.videoGoogleStartBitrate) {\n hParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(hParamsValue.codecOptions.videoGoogleStartBitrate * 0.25);\n }\n if (vParamsValue.codecOptions && vParamsValue.codecOptions.videoGoogleStartBitrate) {\n vParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(vParamsValue.codecOptions.videoGoogleStartBitrate * 0.25);\n }\n } else if (targetResolution == 'fhd') {\n frameRateValue = fhdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 8);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 8);\n }\n });\n } else if (targetResolution == 'qhd') {\n frameRateValue = qhdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 16);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 16);\n }\n });\n }\n\n if (data.recordingParams.recordingVideoSupport) {\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 1.2);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 1.2);\n }\n });\n\n if (hParamsValue.codecOptions && hParamsValue.codecOptions.videoGoogleStartBitrate) {\n hParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(hParamsValue.codecOptions.videoGoogleStartBitrate * 1.2);\n }\n if (vParamsValue.codecOptions && vParamsValue.codecOptions.videoGoogleStartBitrate) {\n vParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(vParamsValue.codecOptions.videoGoogleStartBitrate * 1.2);\n }\n }\n\n updateVidCons(vidCons);\n updateFrameRate(frameRateValue);\n updateHParams(hParamsValue);\n updateVParams(vParamsValue);\n updateScreenParams(screen_Params);\n updateAParams(audio_Params);\n updateTargetResolution(data.meetingRoomParams.targetResolution);\n updateTargetResolutionHost(data.meetingRoomParams.targetResolutionHost);\n } catch (error) {\n console.log('updateRoomParametersClient error', error);\n parameters.showAlert?.({\n message: (error as Error).message,\n type: 'danger',\n duration: 3000,\n });\n }\n};\n","import { Socket } from 'socket.io-client';\nimport {\n JoinMediaSFURoomOptions,\n PreJoinPageParameters,\n ResponseJoinLocalRoom,\n} from '../../types/shared-base-types';\nimport { validateAlphanumeric } from '../../methods/utils/validateAlphanumeric';\nimport { joinRoomOnMediaSFU, JoinRoomOnMediaSFUType } from '../../methods/utils/joinRoomOnMediaSFU';\nimport { checkLimitsAndMakeRequest } from '../../methods/utils/checkLimitsAndMakeRequest';\n\nexport interface JoinLocalRoomOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n parameters: PreJoinPageParameters;\n checkConnect?: boolean;\n joinMediaSFURoom?: JoinRoomOnMediaSFUType;\n localLink?: string;\n}\n\nexport type JoinLocalRoomType = (\n options: JoinLocalRoomOptions,\n) => Promise<ResponseJoinLocalRoom>;\n\nexport interface CheckMediasfuURLOptions {\n data: ResponseJoinLocalRoom;\n member: string;\n roomName: string;\n islevel: string;\n socket: Socket;\n parameters: PreJoinPageParameters;\n joinMediaSFURoom?: JoinRoomOnMediaSFUType;\n localLink?: string;\n}\n\nexport type CheckMediasfuURLType = (options: CheckMediasfuURLOptions) => Promise<void>;\n\nexport async function checkMediasfuURL({\n data,\n member,\n roomName,\n islevel,\n socket,\n parameters,\n joinMediaSFURoom = joinRoomOnMediaSFU,\n localLink = '',\n}: CheckMediasfuURLOptions): Promise<void> {\n if (\n data.mediasfuURL\n && data.mediasfuURL !== ''\n && data.mediasfuURL.length > 10\n ) {\n let link;\n let secretCode;\n\n try {\n const splitTexts = ['/meet/', '/chat/', '/broadcast/'];\n const splitText = splitTexts.find((text) => data.mediasfuURL.includes(text)) || '/meet/';\n\n const urlParts = data.mediasfuURL.split(splitText);\n link = urlParts[0];\n secretCode = urlParts[1].split('/')[1];\n } catch {\n link = data.mediasfuURL;\n return;\n }\n\n await checkLimitsAndMakeRequest({\n apiUserName: roomName,\n apiToken: secretCode,\n link,\n apiKey: '',\n userName: member,\n parameters,\n validate: false,\n });\n\n return;\n }\n\n if (\n (!data.mediasfuURL || data.mediasfuURL.length < 10)\n && islevel !== '2'\n && data.allowRecord\n && (data.allowRecord === true || data.allowRecord === 'true')\n && data.apiKey\n && data.apiKey.length === 64\n && data.apiUserName\n && data.apiUserName.length > 5\n && (roomName.startsWith('s') || roomName.startsWith('p'))\n ) {\n const payload: JoinMediaSFURoomOptions = {\n action: 'join',\n meetingID: roomName,\n userName: member,\n };\n\n const response = await joinMediaSFURoom({\n payload,\n apiKey: data.apiKey,\n apiUserName: data.apiUserName,\n localLink,\n });\n\n if (response.success && response.data && 'roomName' in response.data) {\n try {\n socket.emit(\n 'updateMediasfuURL',\n { eventID: roomName, mediasfuURL: response.data.publicURL },\n async () => {},\n );\n } catch {\n // Do nothing\n }\n\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response.data.link,\n userName: member,\n parameters,\n validate: false,\n });\n parameters.updateApiToken(response.data.secret);\n }\n }\n}\n\nexport async function joinLocalRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n parameters,\n checkConnect = false,\n joinMediaSFURoom = joinRoomOnMediaSFU,\n localLink = '',\n}: JoinLocalRoomOptions): Promise<ResponseJoinLocalRoom> {\n return new Promise((resolve, reject) => {\n if (!(sec && roomName && islevel && apiUserName && member)) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Missing required parameters',\n };\n reject(validationError);\n return;\n }\n\n try {\n validateAlphanumeric({ str: roomName });\n validateAlphanumeric({ str: apiUserName });\n validateAlphanumeric({ str: member });\n } catch {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or apiUserName or member',\n };\n reject(validationError);\n return;\n }\n\n if (!(roomName.startsWith('s') || roomName.startsWith('p') || roomName.startsWith('m') || roomName.startsWith('d'))) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName, must start with s or p or m or d',\n };\n reject(validationError);\n return;\n }\n\n if (\n !(\n sec.length === 32\n && roomName.length >= 8\n && islevel.length === 1\n && apiUserName.length >= 6\n && (islevel === '0' || islevel === '1' || islevel === '2')\n )\n ) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or islevel or apiUserName or secret',\n };\n reject(validationError);\n return;\n }\n\n socket.emit(\n 'joinRoom',\n { roomName, islevel, member, sec, apiUserName },\n async (data: ResponseJoinLocalRoom) => {\n try {\n if (data.rtpCapabilities === null) {\n if (data.isBanned) {\n throw new Error('User is banned.');\n }\n if (data.hostNotJoined) {\n throw new Error('Host has not joined the room yet.');\n }\n\n resolve(data);\n } else {\n if (checkConnect) {\n await checkMediasfuURL({\n data,\n member,\n roomName,\n islevel,\n socket,\n parameters,\n joinMediaSFURoom,\n localLink,\n });\n } else if (data.mediasfuURL && data.mediasfuURL !== '' && data.mediasfuURL.length > 10) {\n const splitTexts = ['/meet/', '/chat/', '/broadcast/'];\n const splitText = splitTexts.find((text) => data.mediasfuURL.includes(text)) || '/meet/';\n const urlParts = data.mediasfuURL.split(splitText);\n const secretCode = urlParts[1].split('/')[1];\n parameters.updateApiToken(secretCode);\n }\n\n resolve(data);\n }\n } catch (error) {\n console.log('Error joining room:', error);\n reject(error);\n }\n },\n );\n });\n}"],"names":["createFrameworkConsumerContractError","mediasoupClient","validateAlphanumeric","joinConRoom","host_Params","video_Params","hdCons","fhdCons","qhdCons","sdCons","QnHDCons","hdConsNeu","fhdConsNeu","qhdConsNeu","sdConsNeu","QnHDConsNeu","hdConsPort","fhdConsPort","qhdConsPort","sdConsPort","QnHDConsPort","hdFrameRate","QnHDFrameRate","fhdFrameRate","qhdFrameRate","screen_Params","audio_Params","joinRoomOnMediaSFU","checkLimitsAndMakeRequest"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAgBO,MAAM,gBAAmC,YAAY;AAC1D,QAAMA,+BAAAA,qCAAqC,eAAe;AAC5D;ACFO,MAAM,uBAAiD,YAAY;AACxE,QAAMA,+BAAAA,qCAAqC,sBAAsB;AACnE;AC2DO,MAAM,sBAA+C,OAAO,EAAE,MAAM,iBAAiB;AAC1F,MAAI;AACF,QAAI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACE;AAEJ,QAAI,KAAK,SAAS;AAChB,oBAAc,KAAK;AACnB,wBAAkB,WAAY;AAC9B,YAAM,gBAAgB,EAAE,SAAS,MAAM,YAAY;AACnD;AAAA,IACF;AAEA,QAAI,YAAY,OAAO,KAAK,SAAS;AACnC,wBAAkB,KAAK,QAAQ,IAAI,CAAC,iBAAiB;AAAA,QACnD,UAAU,YAAY;AAAA,QACtB,MAAM,YAAY;AAAA,QAClB,SAAS,YAAY;AAAA,QACrB,SAAS,YAAY;AAAA,MAAA,EACrB;AACF,4BAAsB,eAAe;AAErC,qBAAe,KAAK,QAAQ,OAAO,CAAC,gBAAgB,CAAC,YAAY,QAAQ;AACzE,yBAAmB,YAAY;AAAA,IACjC;AAEA,oBAAgB,KAAK,iBAAiB,CAAA;AACtC,wBAAoB,aAAa;AAEjC,QAAI,KAAK,WAAW,cAAc,CAAC,uBAAuB,oBAAoB;AAC5E,4BAAsB;AACtB,0BAAoB;AACpB,gCAA0B,IAAI;AAC9B,8BAAwB,KAAK;AAC7B,+BAAyB;AACzB,UAAI,uBAAuB,OAAO;AAChC,6BAAqB;AACrB,iCAAyB,KAAK;AAAA,MAChC;AACA,YAAM,gBAAgB,EAAE,SAAS,MAAM,YAAY;AACnD,UAAI,YAAY,KAAK;AACnB,cAAM,OAAO,EAAE,SAAS,MAAM,YAAY;AAAA,MAC5C;AAAA,IACF,WAAW,KAAK,WAAW,SAAS;AAClC,0BAAoB;AACpB,8BAAwB,IAAI;AAC5B,UAAI,uBAAuB,wBAAwB;AACjD,iCAAyB,sBAAsB;AAAA,MACjD;AACA,YAAM,gBAAgB,EAAE,SAAS,MAAM,YAAY;AACnD,UAAI,YAAY,KAAK;AACnB,cAAM,OAAO,EAAE,SAAS,MAAM,YAAY;AAAA,MAC5C;AAAA,IACF,WAAW,KAAK,WAAW,aAAa,qBAAqB;AAC3D,4BAAsB;AACtB,0BAAoB;AACpB,gCAA0B,IAAI;AAC9B,8BAAwB,KAAK;AAC7B,YAAM,gBAAgB,EAAE,SAAS,MAAM,YAAY;AACnD,UAAI,YAAY,KAAK;AACnB,cAAM,OAAO,EAAE,SAAS,MAAM,YAAY;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;ACjHA,eAAsB,eAAe;AAAA;AAAA,EAEnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AAoBvC,MAAI,UAAU;AACZ,uBAAmB,QAAQ;AAAA,EAC7B;AACA,MAAI,UAAU;AACZ,uBAAmB,QAAQ;AAAA,EAC7B;AACA,MAAI,gBAAgB;AAClB,6BAAyB,cAAc;AAAA,EACzC;AACA,MAAI,SAAS;AACX,sBAAkB,OAAO;AAAA,EAC3B;AAEA,QAAM,WAAW,CAAC,UAAU,UAAU,gBAAgB,OAAO;AAC7D,SAAO,KAAK,6BAA6B,EAAE,UAAU,UAAU;AAG/D,+BAA6B,KAAK;AACpC;ACrEO,MAAM,qBAAqB,OAAO;AAAA,EACvC;AACF,MAAyD;AACvD,MAAI;AAEF,QAAI,CAAC,iBAAiB;AACpB,YAAM,IAAI;AAAA,QACR;AAAA,MAAA;AAAA,IAEJ;AAGA,UAAM,SAA0B,IAAIC,2BAAgB,OAAA;AAGpD,oBAAgB,mBAAmB,gBAAiB,iBAAkB;AAAA,MACpE,CAAC,QAAQ,IAAI,QAAQ;AAAA,IAAA;AAIvB,UAAM,OAAQ,KAAK;AAAA,MACjB,uBAAuB;AAAA,IAAA,CACxB;AAED,WAAO;AAAA,EACT,SAAU,OAAQ;AAEhB,QAAK,SAAmB,MAAgB,SAAS,oBAAqB;AAEpE,cAAQ,MAAM,mDAAmD;AAAA,IACnE;AAEA,UAAM;AAAA,EACR;AAEF;AC1BA,eAAsB,SAAS;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA+C;AAC7C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,EAAE,OAAO,YAAY,WAAW,eAAe,SAAS;AAC1D,YAAM,kBAAoC;AAAA,QACxC,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAO,eAAe;AACtB;AAAA,IACF;AAEA,QAAI;AACFC,gDAAqB,EAAE,KAAK,UAAU;AACtCA,gDAAqB,EAAE,KAAK,aAAa;AACzCA,gDAAqB,EAAE,KAAK,QAAQ;AAAA,IACtC,QAAQ;AACN,YAAM,kBAAoC;AAAA,QACxC,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAO,eAAe;AACtB;AAAA,IACF;AAEA,QAAI,EAAE,SAAS,WAAW,GAAG,KAAK,SAAS,WAAW,GAAG,KAAK,SAAS,WAAW,GAAG,IAAI;AACvF,YAAM,kBAAoC;AAAA,QACxC,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAO,eAAe;AACtB;AAAA,IACF;AAEA,QACE,EACE,IAAI,WAAW,MACZ,SAAS,UAAU,KACnB,QAAQ,WAAW,KACnB,YAAY,UAAU,MACrB,YAAY,OAAO,YAAY,OAAO,YAAY,OAExD;AACA,YAAM,kBAAoC;AAAA,QACxC,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAO,eAAe;AACtB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,QACE;AAAA,QAAU;AAAA,QAAS;AAAA,QAAQ;AAAA,QAAK;AAAA,MAAA;AAAA,MAElC,OAAO,SAA2B;AAChC,YAAI;AACF,cAAI,KAAK,mBAAmB,MAAM;AAChC,gBAAI,KAAK,QAAQ;AACf,oBAAM,IAAI,MAAM,iBAAiB;AAAA,YACnC;AACA,gBAAI,KAAK,WAAW;AAClB,oBAAM,IAAI,MAAM,oBAAoB;AAAA,YACtC;AACA,gBAAI,KAAK,SAAS;AAChB,oBAAM,IAAI,MAAM,mCAAmC;AAAA,YACrD;AAEA,oBAAQ,IAAI;AAAA,UACd,OAAO;AACL,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,IAAI,uBAAuB,KAAK;AACxC,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;ACzGO,MAAM,iBAAiB,OAAO;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AACZ,MAA8D;AAC5D,MAAI;AACF,QAAI,SAAS;AACX,aAAO,MAAMC,+BAAAA,YAAY;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAEA,WAAO,MAAM,SAAS;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,IAAI,KAAK;AACjB,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AACF;ACmEO,MAAM,6BAA6B,CAAC,EAAE,iBAA0D;AACrG,MAAI;AACF,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAUC,mBAAAA;AAAAA,MACV,UAAUC,mBAAAA;AAAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACE;AAEJ,QAAI,KAAK,mBAAmB,MAAM;AAChC,YAAM,SAAS,KAAK,UAAU;AAC9B,kBAAY;AAAA,QACV,SAAS,iDAAiD,MAAM;AAAA,QAChE,MAAM;AAAA,QACN,UAAU;AAAA,MAAA,CACX;AACD;AAAA,IACF;AAEA,0BAAsB,KAAK,eAAe;AAC1C,wBAAoB,KAAK,UAAU;AACnC,sBAAkB,KAAK,WAAW;AAClC,4BAAwB,KAAK,iBAAiB;AAE9C,oCAAgC,KAAK,gBAAgB,yBAAyB;AAC9E,oCAAgC,KAAK,gBAAgB,yBAA0B;AAC/E,gCAA4B,KAAK,gBAAgB,qBAAqB;AACtE,oCAAgC,KAAK,gBAAgB,yBAAyB;AAC9E,8CAA0C,KAAK,gBAAgB,mCAAmC;AAClG,oCAAgC,KAAK,gBAAgB,yBAA0B;AAC/E,oCAAgC,KAAK,gBAAgB,yBAAyB;AAC9E,gCAA4B,KAAK,gBAAgB,qBAAqB;AACtE,oCAAgC,KAAK,gBAAgB,yBAAyB;AAC9E,8CAA0C,KAAK,gBAAgB,mCAAmC;AAClG,0CAAsC,KAAK,gBAAgB,+BAA+B;AAC1F,4CAAwC,KAAK,gBAAgB,iCAAiC;AAC9F,kDAA8C,KAAK,gBAAgB,uCAAuC;AAC1G,oDAAgD,KAAK,gBAAgB,yCAAyC;AAC9G,wCAAoC,KAAK,gBAAgB,6BAA6B;AACtF,8CAA0C,KAAK,gBAAgB,mCAAmC;AAClG,uCAAmC,KAAK,gBAAgB,4BAA4B;AAEpF,wBAAoB,KAAK,kBAAkB,aAAa;AACxD,oBAAgB,KAAK,kBAAkB,IAAI;AAE3C,QAAI,KAAK,kBAAkB,QAAQ,UAAU,WAAW,KAAK;AAC3D,yBAAmB,IAAI;AAAA,IACzB;AAEA,QAAI,CAAC,QAAQ,WAAW,EAAE,SAAS,KAAK,kBAAkB,IAAI,GAAG;AAC/D,qBAAe,KAAK;AACpB,+BAAyB,KAAK;AAC9B,6BAAuB,IAAI;AAC3B,wBAAkB,OAAO;AACzB,0BAAoB,CAAC;AAErB,UAAI,CAAC,WAAW,EAAE,SAAS,KAAK,kBAAkB,IAAI,GAAG;AACvD,oCAA4B,YAAY;AACxC,oCAA4B,MAAM;AAClC,4BAAoB,CAAC;AAAA,MACvB;AAAA,IACF;AAEA,uBAAmB,KAAK,kBAAkB,YAAY;AACtD,uBAAmB,KAAK,kBAAkB,YAAY;AACtD,6BAAyB,KAAK,kBAAkB,kBAAkB;AAClE,sBAAkB,KAAK,kBAAkB,WAAW;AAEpD,wBAAoB,KAAK,kBAAkB,aAAa,OAAO;AAE/D,QAAI,KAAK,kBAAkB,QAAQ,iBAAiB,UAAU,qBAAqB;AACjF,4BAAsB,GAAG;AAAA,IAC3B,OAAO;AACL,4BAAsB,CAAC;AAAA,IACzB;AAEA,0BAAsB,KAAK,IAAI,KAAK,kBAAkB,eAAe,eAAe,CAAC;AAErF,UAAM,oBAAoB,WAAW,MACjC,KAAK,kBAAkB,wBACvB,KAAK,kBAAkB;AAC3B,UAAM,mBAAmB,WAAW,MAChC,KAAK,kBAAkB,uBACvB,KAAK,kBAAkB;AAE3B,QAAI;AACJ,QAAI,qBAAqB,aAAa;AACpC,gBAAU,oBAAoB,OAC1BC,mBAAAA,SACA,oBAAoB,QAClBC,mBAAAA,UACA,oBAAoB,QAClBC,mBAAAA,UACA,oBAAoB,OAClBC,mBAAAA,SACAC,mBAAAA;AAAAA,IACZ,WAAW,qBAAqB,WAAW;AACzC,gBAAU,oBAAoB,OAC1BC,mBAAAA,YACA,oBAAoB,QAClBC,mBAAAA,aACA,oBAAoB,QAClBC,mBAAAA,aACA,oBAAoB,OAClBC,mBAAAA,YACAC,mBAAAA;AAAAA,IACZ,OAAO;AACL,gBAAU,oBAAoB,OAC1BC,mBAAAA,aACA,oBAAoB,QAClBC,mBAAAA,cACA,oBAAoB,QAClBC,mBAAAA,cACA,oBAAoB,OAClBC,mBAAAA,aACAC,mBAAAA;AAAAA,IACZ;AAEA,QAAI,iBAAiB,aAAa;AAClC,QAAI,eAAe,EAAE,GAAG,QAAA;AACxB,QAAI,eAAe,EAAE,GAAG,QAAA;AAExB,QAAI,OAAO,KAAK,YAAY,EAAE,UAAU,GAAG;AACzC,qBAAe,EAAE,GAAGf,2BAAA;AAAA,IACtB;AAEA,QAAI,OAAO,KAAK,YAAY,EAAE,UAAU,GAAG;AACzC,qBAAe,EAAE,GAAGD,2BAAA;AAAA,IACtB;AAEA,QAAI,oBAAoB,MAAM;AAC5B,uBAAiBiB,mBAAAA;AACjB,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,CAAC;AAAA,QAC1D;AAAA,MACF,CAAC;AAED,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,CAAC;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH,WAAW,oBAAoB,QAAQ;AACrC,uBAAiBC,mBAAAA;AACjB,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,IAAI;AAAA,QAC7D;AAAA,MACF,CAAC;AAED,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,IAAI;AAAA,QAC7D;AAAA,MACF,CAAC;AAED,UAAI,aAAa,gBAAgB,aAAa,aAAa,yBAAyB;AAClF,qBAAa,aAAa,0BAA0B,KAAK,MAAM,aAAa,aAAa,0BAA0B,IAAI;AAAA,MACzH;AACA,UAAI,aAAa,gBAAgB,aAAa,aAAa,yBAAyB;AAClF,qBAAa,aAAa,0BAA0B,KAAK,MAAM,aAAa,aAAa,0BAA0B,IAAI;AAAA,MACzH;AAAA,IACF,WAAW,oBAAoB,OAAO;AACpC,uBAAiBC,mBAAAA;AACjB,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,CAAC;AAAA,QAC1D;AAAA,MACF,CAAC;AAED,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,CAAC;AAAA,QAC1D;AAAA,MACF,CAAC;AAAA,IACH,WAAW,oBAAoB,OAAO;AACpC,uBAAiBC,mBAAAA;AACjB,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,EAAE;AAAA,QAC3D;AAAA,MACF,CAAC;AAED,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,EAAE;AAAA,QAC3D;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,gBAAgB,uBAAuB;AAC9C,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,GAAG;AAAA,QAC5D;AAAA,MACF,CAAC;AAED,mBAAa,UAAU,QAAQ,CAAC,aAAmD;AACjF,YAAI,SAAS,YAAY;AACvB,mBAAS,aAAa,KAAK,MAAM,SAAS,aAAa,GAAG;AAAA,QAC5D;AAAA,MACF,CAAC;AAED,UAAI,aAAa,gBAAgB,aAAa,aAAa,yBAAyB;AAClF,qBAAa,aAAa,0BAA0B,KAAK,MAAM,aAAa,aAAa,0BAA0B,GAAG;AAAA,MACxH;AACA,UAAI,aAAa,gBAAgB,aAAa,aAAa,yBAAyB;AAClF,qBAAa,aAAa,0BAA0B,KAAK,MAAM,aAAa,aAAa,0BAA0B,GAAG;AAAA,MACxH;AAAA,IACF;AAEA,kBAAc,OAAO;AACrB,oBAAgB,cAAc;AAC9B,kBAAc,YAAY;AAC1B,kBAAc,YAAY;AAC1B,uBAAmBC,mBAAAA,YAAa;AAChC,kBAAcC,mBAAAA,OAAY;AAC1B,2BAAuB,KAAK,kBAAkB,gBAAgB;AAC9D,+BAA2B,KAAK,kBAAkB,oBAAoB;AAAA,EACxE,SAAS,OAAO;AACd,YAAQ,IAAI,oCAAoC,KAAK;AACrD,eAAW,YAAY;AAAA,MACrB,SAAU,MAAgB;AAAA,MAC1B,MAAM;AAAA,MACN,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AACF;ACxWA,eAAsB,iBAAiB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmBC,mBAAAA;AAAAA,EACnB,YAAY;AACd,GAA2C;AACzC,MACE,KAAK,eACF,KAAK,gBAAgB,MACrB,KAAK,YAAY,SAAS,IAC7B;AACA,QAAI;AACJ,QAAI;AAEJ,QAAI;AACF,YAAM,aAAa,CAAC,UAAU,UAAU,aAAa;AACrD,YAAM,YAAY,WAAW,KAAK,CAAC,SAAS,KAAK,YAAY,SAAS,IAAI,CAAC,KAAK;AAEhF,YAAM,WAAW,KAAK,YAAY,MAAM,SAAS;AACjD,aAAO,SAAS,CAAC;AACjB,mBAAa,SAAS,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IACvC,QAAQ;AACN,aAAO,KAAK;AACZ;AAAA,IACF;AAEA,UAAMC,6CAA0B;AAAA,MAC9B,aAAa;AAAA,MACb,UAAU;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV;AAAA,MACA,UAAU;AAAA,IAAA,CACX;AAED;AAAA,EACF;AAEA,OACG,CAAC,KAAK,eAAe,KAAK,YAAY,SAAS,OAC7C,YAAY,OACZ,KAAK,gBACJ,KAAK,gBAAgB,QAAQ,KAAK,gBAAgB,WACnD,KAAK,UACL,KAAK,OAAO,WAAW,MACvB,KAAK,eACL,KAAK,YAAY,SAAS,MACzB,SAAS,WAAW,GAAG,KAAK,SAAS,WAAW,GAAG,IACvD;AACA,UAAM,UAAmC;AAAA,MACvC,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,IAAA;AAGZ,UAAM,WAAW,MAAM,iBAAiB;AAAA,MACtC;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,aAAa,KAAK;AAAA,MAClB;AAAA,IAAA,CACD;AAED,QAAI,SAAS,WAAW,SAAS,QAAQ,cAAc,SAAS,MAAM;AACpE,UAAI;AACF,eAAO;AAAA,UACL;AAAA,UACA,EAAE,SAAS,UAAU,aAAa,SAAS,KAAK,UAAA;AAAA,UAChD,YAAY;AAAA,UAAC;AAAA,QAAA;AAAA,MAEjB,QAAQ;AAAA,MAER;AAEA,YAAMA,6CAA0B;AAAA,QAC9B,aAAa,SAAS,KAAK;AAAA,QAC3B,UAAU,SAAS,KAAK;AAAA,QACxB,MAAM,SAAS,KAAK;AAAA,QACpB,UAAU;AAAA,QACV;AAAA,QACA,UAAU;AAAA,MAAA,CACX;AACD,iBAAW,eAAe,SAAS,KAAK,MAAM;AAAA,IAChD;AAAA,EACF;AACF;AAEA,eAAsB,cAAc;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,mBAAmBD,mBAAAA;AAAAA,EACnB,YAAY;AACd,GAAyD;AACvD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI,EAAE,OAAO,YAAY,WAAW,eAAe,SAAS;AAC1D,YAAM,kBAAkB;AAAA,QACtB,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAO,eAAe;AACtB;AAAA,IACF;AAEA,QAAI;AACFzB,gDAAqB,EAAE,KAAK,UAAU;AACtCA,gDAAqB,EAAE,KAAK,aAAa;AACzCA,gDAAqB,EAAE,KAAK,QAAQ;AAAA,IACtC,QAAQ;AACN,YAAM,kBAAkB;AAAA,QACtB,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAO,eAAe;AACtB;AAAA,IACF;AAEA,QAAI,EAAE,SAAS,WAAW,GAAG,KAAK,SAAS,WAAW,GAAG,KAAK,SAAS,WAAW,GAAG,KAAK,SAAS,WAAW,GAAG,IAAI;AACnH,YAAM,kBAAkB;AAAA,QACtB,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAO,eAAe;AACtB;AAAA,IACF;AAEA,QACE,EACE,IAAI,WAAW,MACZ,SAAS,UAAU,KACnB,QAAQ,WAAW,KACnB,YAAY,UAAU,MACrB,YAAY,OAAO,YAAY,OAAO,YAAY,OAExD;AACA,YAAM,kBAAkB;AAAA,QACtB,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,MAAA;AAEV,aAAO,eAAe;AACtB;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,EAAE,UAAU,SAAS,QAAQ,KAAK,YAAA;AAAA,MAClC,OAAO,SAAgC;AACrC,YAAI;AACF,cAAI,KAAK,oBAAoB,MAAM;AACjC,gBAAI,KAAK,UAAU;AACjB,oBAAM,IAAI,MAAM,iBAAiB;AAAA,YACnC;AACA,gBAAI,KAAK,eAAe;AACtB,oBAAM,IAAI,MAAM,mCAAmC;AAAA,YACrD;AAEA,oBAAQ,IAAI;AAAA,UACd,OAAO;AACL,gBAAI,cAAc;AAChB,oBAAM,iBAAiB;AAAA,gBACrB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA,CACD;AAAA,YACH,WAAW,KAAK,eAAe,KAAK,gBAAgB,MAAM,KAAK,YAAY,SAAS,IAAI;AACtF,oBAAM,aAAa,CAAC,UAAU,UAAU,aAAa;AACrD,oBAAM,YAAY,WAAW,KAAK,CAAC,SAAS,KAAK,YAAY,SAAS,IAAI,CAAC,KAAK;AAChF,oBAAM,WAAW,KAAK,YAAY,MAAM,SAAS;AACjD,oBAAM,aAAa,SAAS,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAC3C,yBAAW,eAAe,UAAU;AAAA,YACtC;AAEA,oBAAQ,IAAI;AAAA,UACd;AAAA,QACF,SAAS,OAAO;AACd,kBAAQ,IAAI,uBAAuB,KAAK;AACxC,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;;;;;;;;;;;"}
1
+ {"version":3,"file":"joinLocalRoom-DNJ2zb8W.cjs","sources":["../src/consumers/addVideosGrid.ts","../src/consumers/prepopulateUserMedia.ts","../src/methods/breakoutRooms/breakoutRoomUpdated.ts","../src/methods/settings/modifySettings.ts","../src/ProducerClient/producerClientEmits/createDeviceClient.ts","../src/producers/producerEmits/joinRoom.ts","../src/ProducerClient/producerClientEmits/joinRoomClient.ts","../src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts","../src/producers/producerEmits/joinLocalRoom.ts"],"sourcesContent":["// Stub export for addVideosGrid\n// This is a React component in the original and not needed for the shared package\n\nimport { createFrameworkConsumerContractError } from './frameworkConsumerContract';\n\nexport interface AddVideosGridParameters {\n [key: string]: any;\n}\n\nexport interface AddVideosGridOptions {\n parameters: AddVideosGridParameters;\n [key: string]: any; // Accept any additional properties\n}\n\nexport type AddVideosGridType = (options: AddVideosGridOptions) => Promise<void>;\n\nexport const addVideosGrid: AddVideosGridType = async () => {\n throw createFrameworkConsumerContractError('addVideosGrid');\n};\n","// Stub export for prepopulateUserMedia\n// This is a React component in the original and not needed for the shared package\n\nimport { createFrameworkConsumerContractError } from './frameworkConsumerContract';\n\nexport interface PrepopulateUserMediaParameters {\n [key: string]: any;\n}\n\nexport interface PrepopulateUserMediaOptions {\n name: string;\n parameters: PrepopulateUserMediaParameters;\n}\n\nexport type PrepopulateUserMediaType = (options: PrepopulateUserMediaOptions) => Promise<void>;\n\nexport const prepopulateUserMedia: PrepopulateUserMediaType = async () => {\n throw createFrameworkConsumerContractError('prepopulateUserMedia');\n};\n","import 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","import * as mediasoupClient from \"mediasoup-client\";\nimport type { RtpCapabilities, Device } from 'mediasoup-client/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","import { Socket } from 'socket.io-client';\nimport type { RtpCapabilities } from 'mediasoup-client/types';\nimport { validateAlphanumeric } from '../../methods/utils/validateAlphanumeric';\n\nexport interface JoinRoomOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n}\n\nexport interface JoinRoomResponse {\n success: boolean;\n rtpCapabilities: RtpCapabilities | null;\n reason?: string;\n banned?: boolean;\n suspended?: boolean;\n noAdmin?: boolean;\n [key: string]: any;\n}\n\nexport type JoinRoomType = (options: JoinRoomOptions) => Promise<JoinRoomResponse>;\n\n/**\n * Joins a user to a specified room via a socket connection.\n *\n * @param {JoinRoomOptions} options - The options for joining the room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token.\n * @param {string} options.apiUserName - The API username of the user.\n *\n * @returns {Promise<JoinRoomResponse>} A promise that resolves with the data received from the 'joinRoom' event or rejects with a validation error.\n */\nexport async function joinRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n}: JoinRoomOptions): Promise<JoinRoomResponse> {\n return new Promise((resolve, reject) => {\n if (!(sec && roomName && islevel && apiUserName && member)) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Missing required parameters',\n };\n reject(validationError);\n return;\n }\n\n try {\n validateAlphanumeric({ str: roomName });\n validateAlphanumeric({ str: apiUserName });\n validateAlphanumeric({ str: member });\n } catch {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or apiUserName or member',\n };\n reject(validationError);\n return;\n }\n\n if (!(roomName.startsWith('s') || roomName.startsWith('p') || roomName.startsWith('d'))) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName, must start with s or p or d',\n };\n reject(validationError);\n return;\n }\n\n if (\n !(\n sec.length === 64\n && roomName.length >= 8\n && islevel.length === 1\n && apiUserName.length >= 6\n && (islevel === '0' || islevel === '1' || islevel === '2')\n )\n ) {\n const validationError: JoinRoomResponse = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or islevel or apiUserName or secret',\n };\n reject(validationError);\n return;\n }\n\n socket.emit(\n 'joinRoom',\n {\n roomName, islevel, member, sec, apiUserName,\n },\n async (data: JoinRoomResponse) => {\n try {\n if (data.rtpCapabilities == null) {\n if (data.banned) {\n throw new Error('User is banned.');\n }\n if (data.suspended) {\n throw new Error('User is suspended.');\n }\n if (data.noAdmin) {\n throw new Error('Host has not joined the room yet.');\n }\n\n resolve(data);\n } else {\n resolve(data);\n }\n } catch (error) {\n console.log('Error joining room:', error);\n reject(error);\n }\n },\n );\n });\n}\n","import { Socket } from 'socket.io-client';\nimport { joinRoom, JoinRoomResponse } from '../../producers/producerEmits/joinRoom';\nimport { joinConRoom, JoinConRoomResponse } from '../../producers/producerEmits/joinConRoom';\n\nexport interface JoinRoomClientOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n consume?: boolean;\n}\n\nexport type JoinRoomClientResponse = JoinRoomResponse | JoinConRoomResponse;\nexport type JoinRoomClientType = (options: JoinRoomClientOptions) => Promise<JoinRoomClientResponse>;\n\n/**\n * Joins a room by delegating to the producer or consumer join emit based on the consume flag.\n *\n * @param {JoinRoomClientOptions} options - The options for joining the room.\n * @returns {Promise<JoinRoomClientResponse>} The response returned from the server.\n */\nexport const joinRoomClient = async ({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n consume = false,\n}: JoinRoomClientOptions): Promise<JoinRoomClientResponse> => {\n try {\n if (consume) {\n return await joinConRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n });\n }\n\n return await joinRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n });\n } catch (error) {\n console.log(error);\n throw new Error('Failed to join the room. Please check your connection and try again.');\n }\n};\n","/* eslint-disable eqeqeq */\nimport { RtpCapabilities } from 'mediasoup-client/types';\nimport {\n QnHDCons,\n sdCons,\n hdCons,\n fhdCons,\n qhdCons,\n QnHDConsPort,\n sdConsPort,\n hdConsPort,\n fhdConsPort,\n qhdConsPort,\n QnHDConsNeu,\n sdConsNeu,\n hdConsNeu,\n fhdConsNeu,\n qhdConsNeu,\n QnHDFrameRate,\n hdFrameRate,\n fhdFrameRate,\n qhdFrameRate,\n} from '../../methods/utils/producer/videoCaptureConstraints';\nimport { hParams as host_Params } from '../../methods/utils/producer/hParams';\nimport { vParams as video_Params } from '../../methods/utils/producer/vParams';\nimport { screenParams as screen_Params } from '../../methods/utils/producer/screenParams';\nimport { aParams as audio_Params } from '../../methods/utils/producer/aParams';\nimport {\n HParamsType,\n VParamsType,\n ScreenParamsType,\n AParamsType,\n MeetingRoomParams,\n VidCons,\n ShowAlert,\n ResponseJoinRoom,\n EventType,\n} from '../../types/shared-base-types';\n\nexport interface UpdateRoomParametersClientParameters {\n rtpCapabilities: RtpCapabilities | null;\n roomRecvIPs: string[];\n meetingRoomParams: MeetingRoomParams | null;\n itemPageLimit: number;\n audioOnlyRoom: boolean;\n addForBasic: boolean;\n screenPageLimit: number;\n shareScreenStarted: boolean;\n shared: boolean;\n targetOrientation: string;\n vidCons: VidCons;\n recordingVideoSupport: boolean;\n frameRate: number;\n adminPasscode: string;\n eventType: EventType;\n youAreCoHost: boolean;\n autoWave: boolean;\n forceFullDisplay: boolean;\n chatSetting: string;\n meetingDisplayType: string;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n hParams: HParamsType;\n vParams: VParamsType;\n screenParams: ScreenParamsType;\n aParams: AParamsType;\n islevel: string;\n showAlert?: ShowAlert;\n data: ResponseJoinRoom;\n updateRtpCapabilities: (rtpCapabilities: RtpCapabilities | null) => void;\n updateRoomRecvIPs: (roomRecvIPs: string[]) => void;\n updateMeetingRoomParams: (meetingRoomParams: MeetingRoomParams | null) => void;\n updateItemPageLimit: (limit: number) => void;\n updateAudioOnlyRoom: (isAudioOnly: boolean) => void;\n updateAddForBasic: (addForBasic: boolean) => void;\n updateScreenPageLimit: (limit: number) => void;\n updateVidCons: (cons: VidCons) => void;\n updateFrameRate: (frameRate: number) => void;\n updateAdminPasscode: (passcode: string) => void;\n updateEventType: (eventType: EventType) => void;\n updateYouAreCoHost: (coHost: boolean) => void;\n updateAutoWave: (autoWave: boolean) => void;\n updateForceFullDisplay: (forceFull: boolean) => void;\n updateChatSetting: (setting: string) => void;\n updateMeetingDisplayType: (type: string) => void;\n updateAudioSetting: (setting: string) => void;\n updateVideoSetting: (setting: string) => void;\n updateScreenshareSetting: (setting: string) => void;\n updateHParams: (params: HParamsType) => void;\n updateVParams: (params: VParamsType) => void;\n updateScreenParams: (params: ScreenParamsType) => void;\n updateAParams: (params: AParamsType) => void;\n updateMainHeightWidth: (heightWidth: number) => void;\n updateTargetResolution: (resolution: string) => void;\n updateTargetResolutionHost: (resolution: string) => void;\n updateRecordingAudioPausesLimit: (limit: number) => void;\n updateRecordingAudioPausesCount: (count: number) => void;\n updateRecordingAudioSupport: (support: boolean) => void;\n updateRecordingAudioPeopleLimit: (limit: number) => void;\n updateRecordingAudioParticipantsTimeLimit: (limit: number) => void;\n updateRecordingVideoPausesCount: (count: number) => void;\n updateRecordingVideoPausesLimit: (limit: number) => void;\n updateRecordingVideoSupport: (support: boolean) => void;\n updateRecordingVideoPeopleLimit: (limit: number) => void;\n updateRecordingVideoParticipantsTimeLimit: (limit: number) => void;\n updateRecordingAllParticipantsSupport: (support: boolean) => void;\n updateRecordingVideoParticipantsSupport: (support: boolean) => void;\n updateRecordingAllParticipantsFullRoomSupport: (support: boolean) => void;\n updateRecordingVideoParticipantsFullRoomSupport: (support: boolean) => void;\n updateRecordingPreferredOrientation: (orientation: string) => void;\n updateRecordingSupportForOtherOrientation: (support: boolean) => void;\n updateRecordingMultiFormatsSupport: (support: boolean) => void;\n updateRecordingVideoOptions: (options: string) => void;\n updateRecordingAudioOptions: (options: string) => void;\n}\n\nexport type UpdateRoomParametersClientOptions = {\n parameters: UpdateRoomParametersClientParameters;\n};\n\nexport type UpdateRoomParametersClientType = (options: UpdateRoomParametersClientOptions) => void;\n\nexport const updateRoomParametersClient = ({ parameters }: UpdateRoomParametersClientOptions): void => {\n try {\n const {\n screenPageLimit,\n shareScreenStarted,\n shared,\n hParams = host_Params,\n vParams = video_Params,\n frameRate,\n islevel,\n showAlert,\n data,\n updateRtpCapabilities,\n updateRoomRecvIPs,\n updateMeetingRoomParams,\n updateItemPageLimit,\n updateAudioOnlyRoom,\n updateScreenPageLimit,\n updateVidCons,\n updateFrameRate,\n updateAdminPasscode,\n updateEventType,\n updateYouAreCoHost,\n updateAutoWave,\n updateForceFullDisplay,\n updateChatSetting,\n updateMeetingDisplayType,\n updateAudioSetting,\n updateVideoSetting,\n updateScreenshareSetting,\n updateHParams,\n updateVParams,\n updateScreenParams,\n updateAParams,\n updateTargetResolution,\n updateTargetResolutionHost,\n updateRecordingAudioPausesLimit,\n updateRecordingAudioPausesCount,\n updateRecordingAudioSupport,\n updateRecordingAudioPeopleLimit,\n updateRecordingAudioParticipantsTimeLimit,\n updateRecordingVideoPausesCount,\n updateRecordingVideoPausesLimit,\n updateRecordingVideoSupport,\n updateRecordingVideoPeopleLimit,\n updateRecordingVideoParticipantsTimeLimit,\n updateRecordingAllParticipantsSupport,\n updateRecordingVideoParticipantsSupport,\n updateRecordingAllParticipantsFullRoomSupport,\n updateRecordingVideoParticipantsFullRoomSupport,\n updateRecordingPreferredOrientation,\n updateRecordingSupportForOtherOrientation,\n updateRecordingMultiFormatsSupport,\n updateRecordingVideoOptions,\n updateRecordingAudioOptions,\n updateMainHeightWidth,\n } = parameters;\n\n if (data.rtpCapabilities == null) {\n const reason = data.reason || '';\n showAlert?.({\n message: `Sorry, you are not allowed to join this room. ${reason}`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n updateRtpCapabilities(data.rtpCapabilities);\n updateAdminPasscode(data.secureCode);\n updateRoomRecvIPs(data.roomRecvIPs);\n updateMeetingRoomParams(data.meetingRoomParams);\n\n updateRecordingAudioPausesLimit(data.recordingParams.recordingAudioPausesLimit);\n updateRecordingAudioPausesCount(data.recordingParams.recordingAudioPausesCount!);\n updateRecordingAudioSupport(data.recordingParams.recordingAudioSupport);\n updateRecordingAudioPeopleLimit(data.recordingParams.recordingAudioPeopleLimit);\n updateRecordingAudioParticipantsTimeLimit(data.recordingParams.recordingAudioParticipantsTimeLimit);\n updateRecordingVideoPausesCount(data.recordingParams.recordingVideoPausesCount!);\n updateRecordingVideoPausesLimit(data.recordingParams.recordingVideoPausesLimit);\n updateRecordingVideoSupport(data.recordingParams.recordingVideoSupport);\n updateRecordingVideoPeopleLimit(data.recordingParams.recordingVideoPeopleLimit);\n updateRecordingVideoParticipantsTimeLimit(data.recordingParams.recordingVideoParticipantsTimeLimit);\n updateRecordingAllParticipantsSupport(data.recordingParams.recordingAllParticipantsSupport);\n updateRecordingVideoParticipantsSupport(data.recordingParams.recordingVideoParticipantsSupport);\n updateRecordingAllParticipantsFullRoomSupport(data.recordingParams.recordingAllParticipantsFullRoomSupport);\n updateRecordingVideoParticipantsFullRoomSupport(data.recordingParams.recordingVideoParticipantsFullRoomSupport);\n updateRecordingPreferredOrientation(data.recordingParams.recordingPreferredOrientation);\n updateRecordingSupportForOtherOrientation(data.recordingParams.recordingSupportForOtherOrientation);\n updateRecordingMultiFormatsSupport(data.recordingParams.recordingMultiFormatsSupport);\n\n updateItemPageLimit(data.meetingRoomParams.itemPageLimit);\n updateEventType(data.meetingRoomParams.type);\n\n if (data.meetingRoomParams.type == 'chat' && islevel != '2') {\n updateYouAreCoHost(true);\n }\n\n if (['chat', 'broadcast'].includes(data.meetingRoomParams.type)) {\n updateAutoWave(false);\n updateMeetingDisplayType('all');\n updateForceFullDisplay(true);\n updateChatSetting('allow');\n updateItemPageLimit(2);\n\n if (['broadcast'].includes(data.meetingRoomParams.type)) {\n updateRecordingVideoOptions('mainScreen');\n updateRecordingAudioOptions('host');\n updateItemPageLimit(1);\n }\n }\n\n updateAudioSetting(data.meetingRoomParams.audioSetting);\n updateVideoSetting(data.meetingRoomParams.videoSetting);\n updateScreenshareSetting(data.meetingRoomParams.screenshareSetting);\n updateChatSetting(data.meetingRoomParams.chatSetting);\n\n updateAudioOnlyRoom(data.meetingRoomParams.mediaType != 'video');\n\n if (data.meetingRoomParams.type == 'conference' && (shared || shareScreenStarted)) {\n updateMainHeightWidth(100);\n } else {\n updateMainHeightWidth(0);\n }\n\n updateScreenPageLimit(Math.min(data.meetingRoomParams.itemPageLimit, screenPageLimit));\n\n const targetOrientation = islevel == '2'\n ? data.meetingRoomParams.targetOrientationHost\n : data.meetingRoomParams.targetOrientation;\n const targetResolution = islevel == '2'\n ? data.meetingRoomParams.targetResolutionHost\n : data.meetingRoomParams.targetResolution;\n\n let vidCons: VidCons;\n if (targetOrientation == 'landscape') {\n vidCons = targetResolution == 'hd'\n ? hdCons\n : targetResolution == 'fhd'\n ? fhdCons\n : targetResolution == 'qhd'\n ? qhdCons\n : targetResolution == 'sd'\n ? sdCons\n : QnHDCons;\n } else if (targetOrientation == 'neutral') {\n vidCons = targetResolution == 'hd'\n ? hdConsNeu\n : targetResolution == 'fhd'\n ? fhdConsNeu\n : targetResolution == 'qhd'\n ? qhdConsNeu\n : targetResolution == 'sd'\n ? sdConsNeu\n : QnHDConsNeu;\n } else {\n vidCons = targetResolution == 'hd'\n ? hdConsPort\n : targetResolution == 'fhd'\n ? fhdConsPort\n : targetResolution == 'qhd'\n ? qhdConsPort\n : targetResolution == 'sd'\n ? sdConsPort\n : QnHDConsPort;\n }\n\n let frameRateValue = frameRate || 10;\n let vParamsValue = { ...vParams };\n let hParamsValue = { ...hParams };\n\n if (Object.keys(vParamsValue).length == 0) {\n vParamsValue = { ...video_Params };\n }\n\n if (Object.keys(hParamsValue).length == 0) {\n hParamsValue = { ...host_Params };\n }\n\n if (targetResolution == 'hd') {\n frameRateValue = hdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 4);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 4);\n }\n });\n } else if (targetResolution == 'QnHD') {\n frameRateValue = QnHDFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 0.25);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 0.25);\n }\n });\n\n if (hParamsValue.codecOptions && hParamsValue.codecOptions.videoGoogleStartBitrate) {\n hParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(hParamsValue.codecOptions.videoGoogleStartBitrate * 0.25);\n }\n if (vParamsValue.codecOptions && vParamsValue.codecOptions.videoGoogleStartBitrate) {\n vParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(vParamsValue.codecOptions.videoGoogleStartBitrate * 0.25);\n }\n } else if (targetResolution == 'fhd') {\n frameRateValue = fhdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 8);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 8);\n }\n });\n } else if (targetResolution == 'qhd') {\n frameRateValue = qhdFrameRate;\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 16);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 16);\n }\n });\n }\n\n if (data.recordingParams.recordingVideoSupport) {\n vParamsValue.encodings.forEach((encoding: Partial<VParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 1.2);\n }\n });\n\n hParamsValue.encodings.forEach((encoding: Partial<HParamsType['encodings'][0]>) => {\n if (encoding.maxBitrate) {\n encoding.maxBitrate = Math.floor(encoding.maxBitrate * 1.2);\n }\n });\n\n if (hParamsValue.codecOptions && hParamsValue.codecOptions.videoGoogleStartBitrate) {\n hParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(hParamsValue.codecOptions.videoGoogleStartBitrate * 1.2);\n }\n if (vParamsValue.codecOptions && vParamsValue.codecOptions.videoGoogleStartBitrate) {\n vParamsValue.codecOptions.videoGoogleStartBitrate = Math.floor(vParamsValue.codecOptions.videoGoogleStartBitrate * 1.2);\n }\n }\n\n updateVidCons(vidCons);\n updateFrameRate(frameRateValue);\n updateHParams(hParamsValue);\n updateVParams(vParamsValue);\n updateScreenParams(screen_Params);\n updateAParams(audio_Params);\n updateTargetResolution(data.meetingRoomParams.targetResolution);\n updateTargetResolutionHost(data.meetingRoomParams.targetResolutionHost);\n } catch (error) {\n console.log('updateRoomParametersClient error', error);\n parameters.showAlert?.({\n message: (error as Error).message,\n type: 'danger',\n duration: 3000,\n });\n }\n};\n","import { Socket } from 'socket.io-client';\nimport {\n JoinMediaSFURoomOptions,\n PreJoinPageParameters,\n ResponseJoinLocalRoom,\n} from '../../types/shared-base-types';\nimport { validateAlphanumeric } from '../../methods/utils/validateAlphanumeric';\nimport { joinRoomOnMediaSFU, JoinRoomOnMediaSFUType } from '../../methods/utils/joinRoomOnMediaSFU';\nimport { checkLimitsAndMakeRequest } from '../../methods/utils/checkLimitsAndMakeRequest';\n\nexport interface JoinLocalRoomOptions {\n socket: Socket;\n roomName: string;\n islevel: string;\n member: string;\n sec: string;\n apiUserName: string;\n parameters: PreJoinPageParameters;\n checkConnect?: boolean;\n joinMediaSFURoom?: JoinRoomOnMediaSFUType;\n localLink?: string;\n}\n\nexport type JoinLocalRoomType = (\n options: JoinLocalRoomOptions,\n) => Promise<ResponseJoinLocalRoom>;\n\nexport interface CheckMediasfuURLOptions {\n data: ResponseJoinLocalRoom;\n member: string;\n roomName: string;\n islevel: string;\n socket: Socket;\n parameters: PreJoinPageParameters;\n joinMediaSFURoom?: JoinRoomOnMediaSFUType;\n localLink?: string;\n}\n\nexport type CheckMediasfuURLType = (options: CheckMediasfuURLOptions) => Promise<void>;\n\nexport async function checkMediasfuURL({\n data,\n member,\n roomName,\n islevel,\n socket,\n parameters,\n joinMediaSFURoom = joinRoomOnMediaSFU,\n localLink = '',\n}: CheckMediasfuURLOptions): Promise<void> {\n if (\n data.mediasfuURL\n && data.mediasfuURL !== ''\n && data.mediasfuURL.length > 10\n ) {\n let link;\n let secretCode;\n\n try {\n const splitTexts = ['/meet/', '/chat/', '/broadcast/'];\n const splitText = splitTexts.find((text) => data.mediasfuURL.includes(text)) || '/meet/';\n\n const urlParts = data.mediasfuURL.split(splitText);\n link = urlParts[0];\n secretCode = urlParts[1].split('/')[1];\n } catch {\n link = data.mediasfuURL;\n return;\n }\n\n await checkLimitsAndMakeRequest({\n apiUserName: roomName,\n apiToken: secretCode,\n link,\n apiKey: '',\n userName: member,\n parameters,\n validate: false,\n });\n\n return;\n }\n\n if (\n (!data.mediasfuURL || data.mediasfuURL.length < 10)\n && islevel !== '2'\n && data.allowRecord\n && (data.allowRecord === true || data.allowRecord === 'true')\n && data.apiKey\n && data.apiKey.length === 64\n && data.apiUserName\n && data.apiUserName.length > 5\n && (roomName.startsWith('s') || roomName.startsWith('p'))\n ) {\n const payload: JoinMediaSFURoomOptions = {\n action: 'join',\n meetingID: roomName,\n userName: member,\n };\n\n const response = await joinMediaSFURoom({\n payload,\n apiKey: data.apiKey,\n apiUserName: data.apiUserName,\n localLink,\n });\n\n if (response.success && response.data && 'roomName' in response.data) {\n try {\n socket.emit(\n 'updateMediasfuURL',\n { eventID: roomName, mediasfuURL: response.data.publicURL },\n async () => {},\n );\n } catch {\n // Do nothing\n }\n\n await checkLimitsAndMakeRequest({\n apiUserName: response.data.roomName,\n apiToken: response.data.secret,\n link: response.data.link,\n userName: member,\n parameters,\n validate: false,\n });\n parameters.updateApiToken(response.data.secret);\n }\n }\n}\n\nexport async function joinLocalRoom({\n socket,\n roomName,\n islevel,\n member,\n sec,\n apiUserName,\n parameters,\n checkConnect = false,\n joinMediaSFURoom = joinRoomOnMediaSFU,\n localLink = '',\n}: JoinLocalRoomOptions): Promise<ResponseJoinLocalRoom> {\n return new Promise((resolve, reject) => {\n if (!(sec && roomName && islevel && apiUserName && member)) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Missing required parameters',\n };\n reject(validationError);\n return;\n }\n\n try {\n validateAlphanumeric({ str: roomName });\n validateAlphanumeric({ str: apiUserName });\n validateAlphanumeric({ str: member });\n } catch {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or apiUserName or member',\n };\n reject(validationError);\n return;\n }\n\n if (!(roomName.startsWith('s') || roomName.startsWith('p') || roomName.startsWith('m') || roomName.startsWith('d'))) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName, must start with s or p or m or d',\n };\n reject(validationError);\n return;\n }\n\n if (\n !(\n sec.length === 32\n && roomName.length >= 8\n && islevel.length === 1\n && apiUserName.length >= 6\n && (islevel === '0' || islevel === '1' || islevel === '2')\n )\n ) {\n const validationError = {\n success: false,\n rtpCapabilities: null,\n reason: 'Invalid roomName or islevel or apiUserName or secret',\n };\n reject(validationError);\n return;\n }\n\n socket.emit(\n 'joinRoom',\n { roomName, islevel, member, sec, apiUserName },\n async (data: ResponseJoinLocalRoom) => {\n try {\n if (data.rtpCapabilities === null) {\n if (data.isBanned) {\n throw new Error('User is banned.');\n }\n if (data.hostNotJoined) {\n throw new Error('Host has not joined the room yet.');\n }\n\n resolve(data);\n } else {\n if (checkConnect) {\n await checkMediasfuURL({\n data,\n member,\n roomName,\n islevel,\n socket,\n parameters,\n joinMediaSFURoom,\n localLink,\n });\n } else if (data.mediasfuURL && data.mediasfuURL !== '' && data.mediasfuURL.length > 10) {\n const splitTexts = ['/meet/', '/chat/', '/broadcast/'];\n const splitText = splitTexts.find((text) => data.mediasfuURL.includes(text)) || '/meet/';\n const urlParts = data.mediasfuURL.split(splitText);\n const secretCode = urlParts[1].split('/')[1];\n parameters.updateApiToken(secretCode);\n }\n\n resolve(data);\n }\n } catch (error) {\n console.log('Error joining room:', error);\n reject(error);\n }\n },\n );\n });\n}"],"names":["createFrameworkConsumerContractError","mediasoupClient","validateAlphanumeric","joinConRoom","host_Params","video_Params","hdCons","fhdCons","qhdCons","sdCons","QnHDCons","hdConsNeu","fhdConsNeu","qhdConsNeu","sdConsNeu","QnHDConsNeu","hdConsPort","fhdConsPort","qhdConsPort","sdConsPort","QnHDConsPort","hdFrameRate","QnHDFrameRate","fhdFrameRate","qhdFrameRate","screen_Params","audio_Params","joinRoomOnMediaSFU","checkLimitsAndMakeRequest"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { a as applyAudioProcessing, b as audioProcessingConstraints } from "./audioProcessing-0z5KlcmO.js";
1
2
  var cookie = {};
2
3
  /*!
3
4
  * cookie
@@ -608,7 +609,7 @@ const hostRequestResponse = async ({
608
609
  }
609
610
  }
610
611
  };
611
- const clickAudio = async ({ parameters }) => {
612
+ const clickAudio = async ({ parameters, audioProcessing }) => {
612
613
  let {
613
614
  checkMediaPermission,
614
615
  hasAudioPermission,
@@ -791,6 +792,7 @@ const clickAudio = async ({ parameters }) => {
791
792
  break;
792
793
  case 0:
793
794
  if (audioPaused) {
795
+ await applyAudioProcessing(localStream.getAudioTracks()[0], audioProcessing);
794
796
  if (localStream && localStream.getAudioTracks().length > 0) {
795
797
  localStream.getAudioTracks()[0].enabled = true;
796
798
  }
@@ -831,7 +833,11 @@ const clickAudio = async ({ parameters }) => {
831
833
  return;
832
834
  }
833
835
  }
834
- const mediaConstraints = userDefaultAudioInputDevice ? { audio: { deviceId: userDefaultAudioInputDevice }, video: false } : { audio: true, video: false };
836
+ const processing = audioProcessingConstraints(audioProcessing);
837
+ const mediaConstraints = {
838
+ audio: userDefaultAudioInputDevice || Object.keys(processing).length ? { ...userDefaultAudioInputDevice ? { deviceId: userDefaultAudioInputDevice } : {}, ...processing } : true,
839
+ video: false
840
+ };
835
841
  try {
836
842
  const stream = await mediaDevices.getUserMedia(mediaConstraints);
837
843
  await streamSuccessAudio({ stream, parameters });
@@ -1220,4 +1226,4 @@ export {
1220
1226
  fhdConsNeu as y,
1221
1227
  qhdConsNeu as z
1222
1228
  };
1223
- //# sourceMappingURL=joinRoomOnMediaSFU-y6vJ1OBo.js.map
1229
+ //# sourceMappingURL=joinRoomOnMediaSFU-BnAWLciF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joinRoomOnMediaSFU-BnAWLciF.js","sources":["../node_modules/universal-cookie/esm/index.mjs","../src/methods/utils/checkLimitsAndMakeRequest.ts","../src/methods/requests/hostRequestResponse.ts","../src/methods/stream/clickAudio.ts","../src/methods/stream/clickScreenShare.ts","../src/methods/recording/timeLeftRecording.ts","../src/methods/whiteboard/captureCanvasStream.ts","../src/methods/utils/producer/videoCaptureConstraints.ts","../src/methods/utils/producer/hParams.ts","../src/methods/utils/producer/vParams.ts","../src/methods/utils/producer/screenParams.ts","../src/methods/utils/producer/aParams.ts","../src/methods/utils/resolveMediaSFURoomApi.ts","../src/methods/utils/joinRoomOnMediaSFU.ts"],"sourcesContent":["var cookie = {};\n\n/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\nvar hasRequiredCookie;\n\nfunction requireCookie () {\n\tif (hasRequiredCookie) return cookie;\n\thasRequiredCookie = 1;\n\n\t/**\n\t * Module exports.\n\t * @public\n\t */\n\n\tcookie.parse = parse;\n\tcookie.serialize = serialize;\n\n\t/**\n\t * Module variables.\n\t * @private\n\t */\n\n\tvar __toString = Object.prototype.toString;\n\tvar __hasOwnProperty = Object.prototype.hasOwnProperty;\n\n\t/**\n\t * RegExp to match cookie-name in RFC 6265 sec 4.1.1\n\t * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2\n\t * which has been replaced by the token definition in RFC 7230 appendix B.\n\t *\n\t * cookie-name = token\n\t * token = 1*tchar\n\t * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" /\n\t * \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" /\n\t * \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n\t */\n\n\tvar cookieNameRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n\t/**\n\t * RegExp to match cookie-value in RFC 6265 sec 4.1.1\n\t *\n\t * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n\t * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n\t * ; US-ASCII characters excluding CTLs,\n\t * ; whitespace DQUOTE, comma, semicolon,\n\t * ; and backslash\n\t */\n\n\tvar cookieValueRegExp = /^(\"?)[\\u0021\\u0023-\\u002B\\u002D-\\u003A\\u003C-\\u005B\\u005D-\\u007E]*\\1$/;\n\n\t/**\n\t * RegExp to match domain-value in RFC 6265 sec 4.1.1\n\t *\n\t * domain-value = <subdomain>\n\t * ; defined in [RFC1034], Section 3.5, as\n\t * ; enhanced by [RFC1123], Section 2.1\n\t * <subdomain> = <label> | <subdomain> \".\" <label>\n\t * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]\n\t * Labels must be 63 characters or less.\n\t * 'let-dig' not 'letter' in the first char, per RFC1123\n\t * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>\n\t * <let-dig-hyp> = <let-dig> | \"-\"\n\t * <let-dig> = <letter> | <digit>\n\t * <letter> = any one of the 52 alphabetic characters A through Z in\n\t * upper case and a through z in lower case\n\t * <digit> = any one of the ten digits 0 through 9\n\t *\n\t * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173\n\t *\n\t * > (Note that a leading %x2E (\".\"), if present, is ignored even though that\n\t * character is not permitted, but a trailing %x2E (\".\"), if present, will\n\t * cause the user agent to ignore the attribute.)\n\t */\n\n\tvar domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;\n\n\t/**\n\t * RegExp to match path-value in RFC 6265 sec 4.1.1\n\t *\n\t * path-value = <any CHAR except CTLs or \";\">\n\t * CHAR = %x01-7F\n\t * ; defined in RFC 5234 appendix B.1\n\t */\n\n\tvar pathValueRegExp = /^[\\u0020-\\u003A\\u003D-\\u007E]*$/;\n\n\t/**\n\t * Parse a cookie header.\n\t *\n\t * Parse the given cookie header string into an object\n\t * The object has the various cookies as keys(names) => values\n\t *\n\t * @param {string} str\n\t * @param {object} [opt]\n\t * @return {object}\n\t * @public\n\t */\n\n\tfunction parse(str, opt) {\n\t if (typeof str !== 'string') {\n\t throw new TypeError('argument str must be a string');\n\t }\n\n\t var obj = {};\n\t var len = str.length;\n\t // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.\n\t if (len < 2) return obj;\n\n\t var dec = (opt && opt.decode) || decode;\n\t var index = 0;\n\t var eqIdx = 0;\n\t var endIdx = 0;\n\n\t do {\n\t eqIdx = str.indexOf('=', index);\n\t if (eqIdx === -1) break; // No more cookie pairs.\n\n\t endIdx = str.indexOf(';', index);\n\n\t if (endIdx === -1) {\n\t endIdx = len;\n\t } else if (eqIdx > endIdx) {\n\t // backtrack on prior semicolon\n\t index = str.lastIndexOf(';', eqIdx - 1) + 1;\n\t continue;\n\t }\n\n\t var keyStartIdx = startIndex(str, index, eqIdx);\n\t var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);\n\t var key = str.slice(keyStartIdx, keyEndIdx);\n\n\t // only assign once\n\t if (!__hasOwnProperty.call(obj, key)) {\n\t var valStartIdx = startIndex(str, eqIdx + 1, endIdx);\n\t var valEndIdx = endIndex(str, endIdx, valStartIdx);\n\n\t if (str.charCodeAt(valStartIdx) === 0x22 /* \" */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* \" */) {\n\t valStartIdx++;\n\t valEndIdx--;\n\t }\n\n\t var val = str.slice(valStartIdx, valEndIdx);\n\t obj[key] = tryDecode(val, dec);\n\t }\n\n\t index = endIdx + 1;\n\t } while (index < len);\n\n\t return obj;\n\t}\n\n\tfunction startIndex(str, index, max) {\n\t do {\n\t var code = str.charCodeAt(index);\n\t if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index;\n\t } while (++index < max);\n\t return max;\n\t}\n\n\tfunction endIndex(str, index, min) {\n\t while (index > min) {\n\t var code = str.charCodeAt(--index);\n\t if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index + 1;\n\t }\n\t return min;\n\t}\n\n\t/**\n\t * Serialize data into a cookie header.\n\t *\n\t * Serialize a name value pair into a cookie string suitable for\n\t * http headers. An optional options object specifies cookie parameters.\n\t *\n\t * serialize('foo', 'bar', { httpOnly: true })\n\t * => \"foo=bar; httpOnly\"\n\t *\n\t * @param {string} name\n\t * @param {string} val\n\t * @param {object} [opt]\n\t * @return {string}\n\t * @public\n\t */\n\n\tfunction serialize(name, val, opt) {\n\t var enc = (opt && opt.encode) || encodeURIComponent;\n\n\t if (typeof enc !== 'function') {\n\t throw new TypeError('option encode is invalid');\n\t }\n\n\t if (!cookieNameRegExp.test(name)) {\n\t throw new TypeError('argument name is invalid');\n\t }\n\n\t var value = enc(val);\n\n\t if (!cookieValueRegExp.test(value)) {\n\t throw new TypeError('argument val is invalid');\n\t }\n\n\t var str = name + '=' + value;\n\t if (!opt) return str;\n\n\t if (null != opt.maxAge) {\n\t var maxAge = Math.floor(opt.maxAge);\n\n\t if (!isFinite(maxAge)) {\n\t throw new TypeError('option maxAge is invalid')\n\t }\n\n\t str += '; Max-Age=' + maxAge;\n\t }\n\n\t if (opt.domain) {\n\t if (!domainValueRegExp.test(opt.domain)) {\n\t throw new TypeError('option domain is invalid');\n\t }\n\n\t str += '; Domain=' + opt.domain;\n\t }\n\n\t if (opt.path) {\n\t if (!pathValueRegExp.test(opt.path)) {\n\t throw new TypeError('option path is invalid');\n\t }\n\n\t str += '; Path=' + opt.path;\n\t }\n\n\t if (opt.expires) {\n\t var expires = opt.expires;\n\n\t if (!isDate(expires) || isNaN(expires.valueOf())) {\n\t throw new TypeError('option expires is invalid');\n\t }\n\n\t str += '; Expires=' + expires.toUTCString();\n\t }\n\n\t if (opt.httpOnly) {\n\t str += '; HttpOnly';\n\t }\n\n\t if (opt.secure) {\n\t str += '; Secure';\n\t }\n\n\t if (opt.partitioned) {\n\t str += '; Partitioned';\n\t }\n\n\t if (opt.priority) {\n\t var priority = typeof opt.priority === 'string'\n\t ? opt.priority.toLowerCase() : opt.priority;\n\n\t switch (priority) {\n\t case 'low':\n\t str += '; Priority=Low';\n\t break\n\t case 'medium':\n\t str += '; Priority=Medium';\n\t break\n\t case 'high':\n\t str += '; Priority=High';\n\t break\n\t default:\n\t throw new TypeError('option priority is invalid')\n\t }\n\t }\n\n\t if (opt.sameSite) {\n\t var sameSite = typeof opt.sameSite === 'string'\n\t ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n\t switch (sameSite) {\n\t case true:\n\t str += '; SameSite=Strict';\n\t break;\n\t case 'lax':\n\t str += '; SameSite=Lax';\n\t break;\n\t case 'strict':\n\t str += '; SameSite=Strict';\n\t break;\n\t case 'none':\n\t str += '; SameSite=None';\n\t break;\n\t default:\n\t throw new TypeError('option sameSite is invalid');\n\t }\n\t }\n\n\t return str;\n\t}\n\n\t/**\n\t * URL-decode string value. Optimized to skip native call when no %.\n\t *\n\t * @param {string} str\n\t * @returns {string}\n\t */\n\n\tfunction decode (str) {\n\t return str.indexOf('%') !== -1\n\t ? decodeURIComponent(str)\n\t : str\n\t}\n\n\t/**\n\t * Determine if value is a Date.\n\t *\n\t * @param {*} val\n\t * @private\n\t */\n\n\tfunction isDate (val) {\n\t return __toString.call(val) === '[object Date]';\n\t}\n\n\t/**\n\t * Try decoding a string using a decoding function.\n\t *\n\t * @param {string} str\n\t * @param {function} decode\n\t * @private\n\t */\n\n\tfunction tryDecode(str, decode) {\n\t try {\n\t return decode(str);\n\t } catch (e) {\n\t return str;\n\t }\n\t}\n\treturn cookie;\n}\n\nvar cookieExports = requireCookie();\n\nfunction hasDocumentCookie() {\n const testingValue = typeof global === 'undefined'\n ? undefined\n : global.TEST_HAS_DOCUMENT_COOKIE;\n if (typeof testingValue === 'boolean') {\n return testingValue;\n }\n // Can we get/set cookies on document.cookie?\n return typeof document === 'object' && typeof document.cookie === 'string';\n}\nfunction parseCookies(cookies) {\n if (typeof cookies === 'string') {\n return cookieExports.parse(cookies);\n }\n else if (typeof cookies === 'object' && cookies !== null) {\n return cookies;\n }\n else {\n return {};\n }\n}\nfunction readCookie(value, options = {}) {\n const cleanValue = cleanupCookieValue(value);\n if (!options.doNotParse) {\n try {\n return JSON.parse(cleanValue);\n }\n catch (e) {\n // At least we tried\n }\n }\n // Ignore clean value if we failed the deserialization\n // It is not relevant anymore to trim those values\n return value;\n}\nfunction cleanupCookieValue(value) {\n // express prepend j: before serializing a cookie\n if (value && value[0] === 'j' && value[1] === ':') {\n return value.substr(2);\n }\n return value;\n}\n\nclass Cookies {\n constructor(cookies, defaultSetOptions = {}) {\n this.changeListeners = [];\n this.HAS_DOCUMENT_COOKIE = false;\n this.update = () => {\n if (!this.HAS_DOCUMENT_COOKIE) {\n return;\n }\n const previousCookies = this.cookies;\n this.cookies = cookieExports.parse(document.cookie);\n this._checkChanges(previousCookies);\n };\n const domCookies = typeof document === 'undefined' ? '' : document.cookie;\n this.cookies = parseCookies(cookies || domCookies);\n this.defaultSetOptions = defaultSetOptions;\n this.HAS_DOCUMENT_COOKIE = hasDocumentCookie();\n }\n _emitChange(params) {\n for (let i = 0; i < this.changeListeners.length; ++i) {\n this.changeListeners[i](params);\n }\n }\n _checkChanges(previousCookies) {\n const names = new Set(Object.keys(previousCookies).concat(Object.keys(this.cookies)));\n names.forEach((name) => {\n if (previousCookies[name] !== this.cookies[name]) {\n this._emitChange({\n name,\n value: readCookie(this.cookies[name]),\n });\n }\n });\n }\n _startPolling() {\n this.pollingInterval = setInterval(this.update, 300);\n }\n _stopPolling() {\n if (this.pollingInterval) {\n clearInterval(this.pollingInterval);\n }\n }\n get(name, options = {}) {\n if (!options.doNotUpdate) {\n this.update();\n }\n return readCookie(this.cookies[name], options);\n }\n getAll(options = {}) {\n if (!options.doNotUpdate) {\n this.update();\n }\n const result = {};\n for (let name in this.cookies) {\n result[name] = readCookie(this.cookies[name], options);\n }\n return result;\n }\n set(name, value, options) {\n if (options) {\n options = Object.assign(Object.assign({}, this.defaultSetOptions), options);\n }\n else {\n options = this.defaultSetOptions;\n }\n const stringValue = typeof value === 'string' ? value : JSON.stringify(value);\n this.cookies = Object.assign(Object.assign({}, this.cookies), { [name]: stringValue });\n if (this.HAS_DOCUMENT_COOKIE) {\n document.cookie = cookieExports.serialize(name, stringValue, options);\n }\n this._emitChange({ name, value, options });\n }\n remove(name, options) {\n const finalOptions = (options = Object.assign(Object.assign(Object.assign({}, this.defaultSetOptions), options), { expires: new Date(1970, 1, 1, 0, 0, 1), maxAge: 0 }));\n this.cookies = Object.assign({}, this.cookies);\n delete this.cookies[name];\n if (this.HAS_DOCUMENT_COOKIE) {\n document.cookie = cookieExports.serialize(name, '', finalOptions);\n }\n this._emitChange({ name, value: undefined, options });\n }\n addChangeListener(callback) {\n this.changeListeners.push(callback);\n if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 1) {\n if (typeof window === 'object' && 'cookieStore' in window) {\n window.cookieStore.addEventListener('change', this.update);\n }\n else {\n this._startPolling();\n }\n }\n }\n removeChangeListener(callback) {\n const idx = this.changeListeners.indexOf(callback);\n if (idx >= 0) {\n this.changeListeners.splice(idx, 1);\n }\n if (this.HAS_DOCUMENT_COOKIE && this.changeListeners.length === 0) {\n if (typeof window === 'object' && 'cookieStore' in window) {\n window.cookieStore.removeEventListener('change', this.update);\n }\n else {\n this._stopPolling();\n }\n }\n }\n}\n\nexport { Cookies as default };\n","import { PreJoinPageParameters } from \"../../types/types\";\nimport type { Socket } from \"socket.io-client\";\nimport Cookies from \"universal-cookie\";\n\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10; // Maximum number of unsuccessful attempts before rate limiting\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours in milliseconds\n\nexport interface CheckLimitsStorageAdapter {\n getItem: (key: string) => Promise<string | null | undefined> | string | null | undefined;\n setItem: (key: string, value: string) => Promise<void> | void;\n}\n\nexport interface CheckLimitsAndMakeRequestWithStorageOptions {\n apiUserName: string;\n apiToken: string;\n link: string;\n apiKey?: string;\n userName: string;\n parameters: PreJoinPageParameters;\n validate?: boolean;\n storageAdapter: CheckLimitsStorageAdapter;\n}\n\nexport type CheckLimitsAndMakeRequestWithStorageType = (\n options: CheckLimitsAndMakeRequestWithStorageOptions,\n) => Promise<void>;\n\nconst readStoredNumber = async (\n adapter: CheckLimitsStorageAdapter,\n key: string,\n): Promise<number> => {\n const value = await adapter.getItem(key);\n const parsed = parseInt((value ?? '0').toString(), 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n};\n\nconst writeStoredNumber = async (\n adapter: CheckLimitsStorageAdapter,\n key: string,\n value: number,\n): Promise<void> => {\n await adapter.setItem(key, value.toString());\n};\n\nconst hasConnectedSocketId = (socket: unknown): socket is Socket & { id: string } => {\n if (!socket || typeof socket !== 'object') {\n return false;\n }\n\n const candidate = socket as { id?: unknown };\n return typeof candidate.id === 'string' && candidate.id.length > 0;\n};\n\n/**\n * Mobile/storage-adapter variant used by RN/Expo wrappers to share one canonical implementation.\n */\nexport const checkLimitsAndMakeRequestWithStorage: CheckLimitsAndMakeRequestWithStorageType = async ({\n apiUserName,\n apiToken,\n link,\n apiKey = '',\n userName,\n parameters,\n validate = true,\n storageAdapter,\n}) => {\n const TIMEOUT_DURATION = 10000; // 10 seconds\n\n try {\n let unsuccessfulAttempts = await readStoredNumber(storageAdapter, 'unsuccessfulAttempts');\n const lastRequestTimestamp = await readStoredNumber(storageAdapter, 'lastRequestTimestamp');\n\n if (\n unsuccessfulAttempts >= MAX_ATTEMPTS\n && Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION\n ) {\n parameters.showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n return;\n }\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n unsuccessfulAttempts = 0;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n }\n\n parameters.updateIsLoadingModalVisible(true);\n\n const socketPromise = parameters.connectSocket({\n apiUserName,\n apiKey,\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<never>((_, reject) => setTimeout(\n () => reject(new Error('Request timed out')),\n TIMEOUT_DURATION,\n ));\n\n const socket = await Promise.race([socketPromise, timeoutPromise]);\n\n if (hasConnectedSocketId(socket)) {\n unsuccessfulAttempts = 0;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n\n if (validate) {\n parameters.updateSocket(socket);\n } else {\n parameters.updateLocalSocket?.(socket);\n }\n\n parameters.updateApiUserName(apiUserName);\n parameters.updateApiToken(apiToken);\n parameters.updateLink(link);\n parameters.updateRoomName(apiUserName);\n parameters.updateMember(userName);\n if (validate) {\n parameters.updateValidated(true);\n }\n } else {\n unsuccessfulAttempts += 1;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n parameters.updateIsLoadingModalVisible(false);\n\n if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n parameters.showAlert?.({\n message: 'Too many unsuccessful attempts. Please try again later.',\n type: 'danger',\n duration: 3000,\n });\n } else {\n parameters.showAlert?.({\n message: 'Invalid credentials.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n } catch (error) {\n console.error('Error connecting to socket:', error);\n parameters.showAlert?.({\n message: 'Unable to connect. Check your credentials and try again.',\n type: 'danger',\n duration: 3000,\n });\n\n let unsuccessfulAttempts = await readStoredNumber(storageAdapter, 'unsuccessfulAttempts');\n unsuccessfulAttempts += 1;\n await writeStoredNumber(storageAdapter, 'unsuccessfulAttempts', unsuccessfulAttempts);\n await writeStoredNumber(storageAdapter, 'lastRequestTimestamp', Date.now());\n parameters.updateIsLoadingModalVisible(false);\n }\n};\n\n\nexport const checkLimitsAndMakeRequest = async ({\n apiUserName,\n apiToken,\n link,\n apiKey = \"\",\n userName,\n parameters,\n validate = true,\n }: {\n apiUserName: string;\n apiToken: string;\n link: string;\n apiKey?: string;\n userName: string;\n parameters: PreJoinPageParameters;\n validate?: boolean;\n }) => {\n const TIMEOUT_DURATION = 10000; // 10 seconds\n let unsuccessfulAttempts =\n parseInt(cookies.get(\"unsuccessfulAttempts\")) || 0;\n let lastRequestTimestamp =\n parseInt(cookies.get(\"lastRequestTimestamp\")) || 0;\n \n if (\n unsuccessfulAttempts >= MAX_ATTEMPTS &&\n Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION\n ) {\n parameters.showAlert?.({\n message: \"Too many unsuccessful attempts. Please try again later.\",\n type: \"danger\",\n duration: 3000,\n });\n return;\n } else {\n unsuccessfulAttempts = 0;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n }\n \n try {\n parameters.updateIsLoadingModalVisible(true);\n const socketPromise = await parameters.connectSocket({\n apiUserName,\n apiKey,\n apiToken,\n link,\n });\n const timeoutPromise = new Promise<null>((_, reject) =>\n setTimeout(\n () => reject(new Error(\"Request timed out\")),\n TIMEOUT_DURATION\n )\n );\n \n const socket = await Promise.race([socketPromise, timeoutPromise]);\n if (hasConnectedSocketId(socket)) {\n unsuccessfulAttempts = 0;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n if (validate){\n // only one connection is established, no local socket\n parameters.updateSocket(socket);\n }else{\n // local socket is also established, mediaSFU connection is now the local socket\n parameters.updateLocalSocket?.(socket);\n }\n parameters.updateApiUserName(apiUserName);\n parameters.updateApiToken(apiToken);\n parameters.updateLink(link);\n parameters.updateRoomName(apiUserName);\n parameters.updateMember(userName);\n if (validate) parameters.updateValidated(true);\n } else {\n unsuccessfulAttempts += 1;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n parameters.updateIsLoadingModalVisible(false);\n parameters.showAlert?.({\n message: \"Invalid credentials.\",\n type: \"danger\",\n duration: 3000,\n });\n }\n } catch {\n parameters.showAlert?.({\n message: \"Unable to connect. Check your credentials and try again.\",\n type: \"danger\",\n duration: 3000,\n });\n unsuccessfulAttempts += 1;\n cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n parameters.updateIsLoadingModalVisible(false);\n }\n };","import type { Request, RequestResponse, ShowAlert } from '../../types/types';\n\nexport interface HostRequestResponseOptions {\n requestResponse: RequestResponse;\n showAlert?: ShowAlert;\n requestList: Request[];\n updateRequestList: (requestList: Request[]) => void;\n updateMicAction: (action: boolean) => void;\n updateVideoAction: (action: boolean) => void;\n updateScreenAction: (action: boolean) => void;\n updateChatAction: (action: boolean) => void;\n updateAudioRequestState: (state: string | null) => void;\n updateVideoRequestState: (state: string | null) => void;\n updateScreenRequestState: (state: string | null) => void;\n updateChatRequestState: (state: string | null) => void;\n updateAudioRequestTime: (time: number) => void;\n updateVideoRequestTime: (time: number) => void;\n updateScreenRequestTime: (time: number) => void;\n updateChatRequestTime: (time: number) => void;\n updateRequestIntervalSeconds: number;\n}\n\nexport type HostRequestResponseType = (options: HostRequestResponseOptions) => Promise<void>;\n\n/**\n * Applies a host's response to a pending participant request.\n *\n * This helper removes the resolved request from the pending list, updates the\n * caller's relevant request state, and triggers acceptance or rejection alerts\n * with the correct retry cooldown timestamps.\n *\n * @param options Function options for processing the host response.\n * @returns A promise that resolves after request state has been updated.\n */\nexport const hostRequestResponse = async ({\n requestResponse,\n showAlert,\n requestList,\n updateRequestList,\n updateMicAction,\n updateVideoAction,\n updateScreenAction,\n updateChatAction,\n updateAudioRequestState,\n updateVideoRequestState,\n updateScreenRequestState,\n updateChatRequestState,\n updateAudioRequestTime,\n updateVideoRequestTime,\n updateScreenRequestTime,\n updateChatRequestTime,\n updateRequestIntervalSeconds,\n}: HostRequestResponseOptions): Promise<void> => {\n const requestType = requestResponse.type ?? requestResponse.icon;\n\n // Remove only the specific request that received a host response.\n const filteredRequests = requestList.filter(\n (request) => {\n const matchesId = request.id === requestResponse.id;\n const matchesType = requestType == null || request.icon === requestType;\n const matchesName = requestResponse.name == null || request.name === requestResponse.name;\n const matchesUsername =\n requestResponse.username == null || request.username === requestResponse.username;\n\n return !(matchesId && matchesType && matchesName && matchesUsername);\n }\n );\n updateRequestList(filteredRequests);\n\n if (requestResponse.action === 'accepted') {\n switch (requestType) {\n case 'fa-microphone':\n showAlert?.({\n message: 'Unmute request was accepted; click the mic button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateMicAction(true);\n updateAudioRequestState('accepted');\n break;\n case 'fa-video':\n showAlert?.({\n message: 'Video request was accepted; click the video button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateVideoAction(true);\n updateVideoRequestState('accepted');\n break;\n case 'fa-desktop':\n showAlert?.({\n message: 'Screenshare request was accepted; click the screen button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateScreenAction(true);\n updateScreenRequestState('accepted');\n break;\n case 'fa-comments':\n showAlert?.({\n message: 'Chat request was accepted; click the chat button again to begin.',\n type: 'success',\n duration: 10000,\n });\n updateChatAction(true);\n updateChatRequestState('accepted');\n break;\n }\n } else {\n let timerDate: Date;\n switch (requestType) {\n case 'fa-microphone':\n showAlert?.({\n message: 'Unmute request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateAudioRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateAudioRequestTime(timerDate.getTime());\n break;\n case 'fa-video':\n showAlert?.({\n message: 'Video request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateVideoRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateVideoRequestTime(timerDate.getTime());\n break;\n case 'fa-desktop':\n showAlert?.({\n message: 'Screenshare request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateScreenRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateScreenRequestTime(timerDate.getTime());\n break;\n case 'fa-comments':\n showAlert?.({\n message: 'Chat request was not accepted',\n type: 'danger',\n duration: 10000,\n });\n updateChatRequestState('rejected');\n timerDate = new Date();\n timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n updateChatRequestTime(timerDate.getTime());\n break;\n }\n }\n};","import { Socket } from 'socket.io-client';\nimport {\n CheckPermissionType,\n DisconnectSendTransportAudioParameters,\n DisconnectSendTransportAudioType,\n Participant,\n RequestPermissionAudioType,\n ResumeSendTransportAudioParameters,\n ResumeSendTransportAudioType,\n ShowAlert,\n StreamSuccessAudioParameters,\n StreamSuccessAudioType,\n} from '../../types/types';\nimport type { PermissionConfig } from '../permissions/updatePermissionConfig';\n\nexport interface ClickAudioParameters\n extends DisconnectSendTransportAudioParameters,\n ResumeSendTransportAudioParameters,\n StreamSuccessAudioParameters {\n checkMediaPermission: boolean;\n hasAudioPermission: boolean;\n audioPaused: boolean;\n audioAlreadyOn: boolean;\n audioOnlyRoom: boolean;\n recordStarted: boolean;\n recordResumed: boolean;\n recordPaused: boolean;\n recordStopped: boolean;\n recordingMediaOptions: string;\n islevel: string;\n youAreCoHost: boolean;\n adminRestrictSetting: boolean;\n audioRequestState: string | null;\n audioRequestTime: number;\n member: string;\n socket: Socket;\n localSocket?: Socket;\n roomName: string;\n userDefaultAudioInputDevice: string;\n micAction: boolean;\n localStream: MediaStream | null;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n permissionConfig?: PermissionConfig | null;\n updateRequestIntervalSeconds: number;\n participants: Participant[];\n mediaDevices: MediaDevices;\n transportCreated: boolean;\n transportCreatedAudio: boolean;\n supportFlexRoom?: boolean;\n supportMaxRoom?: boolean;\n\n updateAudioAlreadyOn: (status: boolean) => void;\n updateAudioRequestState: (state: string | null) => void;\n updateAudioPaused: (status: boolean) => void;\n updateLocalStream: (stream: MediaStream | null) => void;\n updateParticipants: (participants: Participant[]) => void;\n updateTransportCreated: (status: boolean) => void;\n updateTransportCreatedAudio: (status: boolean) => void;\n updateMicAction: (action: boolean) => void;\n showAlert?: ShowAlert;\n\n checkPermission: CheckPermissionType;\n streamSuccessAudio: StreamSuccessAudioType;\n disconnectSendTransportAudio: DisconnectSendTransportAudioType;\n requestPermissionAudio: RequestPermissionAudioType;\n resumeSendTransportAudio: ResumeSendTransportAudioType;\n\n getUpdatedAllParams: () => ClickAudioParameters;\n [key: string]: any;\n}\n\nimport { AudioProcessingOptions, audioProcessingConstraints, applyAudioProcessing } from '../../consumers/audioProcessing';\n\nexport interface ClickAudioOptions {\n audioProcessing?: AudioProcessingOptions;\n parameters: ClickAudioParameters;\n}\n\nexport type ClickAudioType = (options: ClickAudioOptions) => Promise<void>;\n\n/**\n * Handles microphone toggle flow for a participant.\n *\n * This helper enforces host permission rules, request cooldowns, recording\n * constraints, and transport resume/disconnect behavior before updating the\n * caller's local media state.\n *\n * @param options Function options containing the full runtime parameter bag.\n * @returns A promise that resolves after the microphone action has been processed.\n */\nexport const clickAudio = async ({ parameters, audioProcessing }: ClickAudioOptions): Promise<void> => {\n let {\n checkMediaPermission,\n hasAudioPermission,\n audioPaused,\n audioAlreadyOn,\n audioOnlyRoom,\n recordStarted,\n recordResumed,\n recordPaused,\n recordStopped,\n recordingMediaOptions,\n islevel,\n youAreCoHost,\n adminRestrictSetting,\n audioRequestState,\n audioRequestTime,\n member,\n socket,\n localSocket,\n roomName,\n userDefaultAudioInputDevice,\n micAction,\n localStream,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n updateRequestIntervalSeconds,\n participants,\n mediaDevices,\n showAlert,\n transportCreated,\n transportCreatedAudio,\n\n updateAudioAlreadyOn,\n updateAudioRequestState,\n updateAudioPaused,\n updateLocalStream,\n updateParticipants,\n updateTransportCreated,\n updateTransportCreatedAudio,\n updateMicAction,\n\n checkPermission,\n streamSuccessAudio,\n requestPermissionAudio,\n resumeSendTransportAudio,\n disconnectSendTransportAudio,\n } = parameters;\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: 'You cannot turn on your camera in an audio-only event.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (audioAlreadyOn) {\n if (islevel === '2' && (recordStarted || recordResumed)) {\n if (!(recordPaused || recordStopped)) {\n if (recordingMediaOptions === 'audio') {\n showAlert?.({\n message: 'You cannot turn off your audio while recording, please pause or stop recording first.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n }\n\n audioAlreadyOn = false;\n updateAudioAlreadyOn(audioAlreadyOn);\n if (localStream && localStream.getAudioTracks().length > 0) {\n localStream.getAudioTracks()[0].enabled = false;\n updateLocalStream(localStream);\n }\n await disconnectSendTransportAudio({ parameters });\n audioPaused = true;\n updateAudioPaused(audioPaused);\n } else {\n if (adminRestrictSetting) {\n showAlert?.({\n message: 'You cannot turn on your microphone. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n const supportMaxRoom = parameters.supportMaxRoom;\n const supportFlexRoom = parameters.supportFlexRoom;\n if ((supportMaxRoom || supportFlexRoom) && islevel !== '2') {\n try {\n const checkResult = await new Promise<{\n allowed: boolean;\n reason?: string;\n producingCount?: number;\n producerLimit?: number;\n }>((resolve) => {\n socket.emit(\n 'checkProduce',\n { kind: 'audio' },\n (response: {\n allowed: boolean;\n reason?: string;\n producingCount?: number;\n producerLimit?: number;\n }) => {\n resolve(response || { allowed: false, reason: 'No response from server' });\n },\n );\n\n setTimeout(() => resolve({ allowed: true }), 5000);\n });\n\n if (!checkResult.allowed) {\n showAlert?.({\n message:\n checkResult.reason ||\n `Audio producer limit reached (${checkResult.producingCount}/${checkResult.producerLimit}).`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n } catch (error) {\n console.warn('Failed to check producer limit:', error);\n }\n }\n\n const panelistsFocused = parameters.panelistsFocused;\n const muteOthersMic = parameters.muteOthersMic;\n const panelists = parameters.panelists;\n\n if (panelistsFocused && muteOthersMic && islevel !== '2') {\n const isPanelist =\n panelists?.some((panelist: { name: string }) => panelist.name === member) || false;\n\n if (!isPanelist) {\n showAlert?.({\n message:\n 'You cannot turn on your microphone. Only panelists can unmute while focus mode is active.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n\n let response = 2;\n if (!micAction && islevel !== '2' && !youAreCoHost) {\n response = await checkPermission({\n permissionType: 'audioSetting',\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n permissionConfig: parameters.permissionConfig,\n participantLevel: islevel,\n });\n } else {\n response = 0;\n }\n\n switch (response) {\n case 1: {\n if (audioRequestState === 'pending') {\n showAlert?.({\n message: 'A request is pending. Please wait for the host to respond.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (\n audioRequestState === 'rejected' &&\n Date.now() - audioRequestTime < updateRequestIntervalSeconds * 1000\n ) {\n showAlert?.({\n message: `A request was rejected. Please wait for ${updateRequestIntervalSeconds} seconds before sending another request.`,\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n showAlert?.({\n message: 'Request sent to host.',\n type: 'success',\n duration: 3000,\n });\n\n audioRequestState = 'pending';\n updateAudioRequestState(audioRequestState);\n\n const userRequest = {\n id: socket.id,\n name: member,\n icon: 'fa-microphone',\n };\n socket.emit('participantRequest', { userRequest, roomName });\n break;\n }\n\n case 2:\n showAlert?.({\n message: 'You cannot turn on your microphone. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n break;\n\n case 0:\n if (audioPaused) {\n await applyAudioProcessing(localStream!.getAudioTracks()[0], audioProcessing);\n if (localStream && localStream.getAudioTracks().length > 0) {\n localStream.getAudioTracks()[0].enabled = true;\n }\n updateAudioAlreadyOn(true);\n await resumeSendTransportAudio({ parameters });\n socket.emit('resumeProducerAudio', { mediaTag: 'audio', roomName });\n\n try {\n if (localSocket && localSocket.id) {\n localSocket.emit('resumeProducerAudio', { mediaTag: 'audio', roomName });\n }\n } catch (error) {\n console.log('Error in resumeProducerAudio', error);\n }\n\n updateLocalStream(localStream);\n\n if (micAction === true) {\n micAction = false;\n updateMicAction(micAction);\n }\n\n participants.forEach((participant) => {\n if (participant.socketId === socket.id && participant.name === member) {\n participant.muted = false;\n }\n });\n updateParticipants(participants);\n\n transportCreated = true;\n updateTransportCreated(transportCreated);\n\n transportCreatedAudio = true;\n updateTransportCreatedAudio(transportCreatedAudio);\n } else {\n if (!hasAudioPermission && checkMediaPermission) {\n const statusMic = await requestPermissionAudio();\n if (statusMic !== 'granted') {\n showAlert?.({\n message:\n 'Allow access to your microphone or check if your microphone is not being used by another application.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n }\n\n const processing = audioProcessingConstraints(audioProcessing);\n const mediaConstraints = {\n audio: userDefaultAudioInputDevice || Object.keys(processing).length\n ? { ...(userDefaultAudioInputDevice ? { deviceId: userDefaultAudioInputDevice } : {}), ...processing }\n : true,\n video: false,\n };\n\n try {\n const stream = await mediaDevices.getUserMedia(mediaConstraints);\n await streamSuccessAudio({ stream, parameters });\n } catch (error) {\n console.error(error);\n showAlert?.({\n message:\n 'Allow access to your microphone or check if your microphone is not being used by another application.',\n type: 'danger',\n duration: 3000,\n });\n }\n }\n break;\n\n default:\n }\n }\n};\n","import { Socket } from 'socket.io-client';\nimport type {\n CheckPermissionType,\n CheckScreenShareParameters,\n CheckScreenShareType,\n ShowAlert,\n StopShareScreenParameters,\n StopShareScreenType,\n} from '../../types/types';\nimport type { PermissionConfig } from '../permissions/updatePermissionConfig';\n\nexport interface ClickScreenShareParameters\n extends CheckScreenShareParameters,\n StopShareScreenParameters {\n showAlert?: ShowAlert;\n roomName: string;\n member: string;\n socket: Socket;\n islevel: string;\n youAreCoHost: boolean;\n adminRestrictSetting: boolean;\n audioSetting: string;\n videoSetting: string;\n screenshareSetting: string;\n chatSetting: string;\n permissionConfig?: PermissionConfig | null;\n screenAction: boolean;\n screenAlreadyOn: boolean;\n screenRequestState: string | null;\n screenRequestTime: number;\n audioOnlyRoom: boolean;\n updateRequestIntervalSeconds: number;\n updateScreenRequestState: (state: string | null) => void;\n updateScreenAlreadyOn: (status: boolean) => void;\n\n checkPermission: CheckPermissionType;\n checkScreenShare: CheckScreenShareType;\n stopShareScreen: StopShareScreenType;\n\n getUpdatedAllParams: () => ClickScreenShareParameters;\n [key: string]: any;\n}\n\nexport interface ClickScreenShareOptions {\n parameters: ClickScreenShareParameters;\n}\n\nexport type ClickScreenShareType = (options: ClickScreenShareOptions) => Promise<void>;\n\n/**\n * Handles screen-share toggle flow for a participant.\n *\n * This helper checks room restrictions, host permission policies, request\n * cooldowns, and then delegates to the supplied start/stop share helpers.\n *\n * @param options Function options containing the full runtime parameter bag.\n * @returns A promise that resolves after the screen-share action has been processed.\n */\nexport const clickScreenShare = async ({ parameters }: ClickScreenShareOptions): Promise<void> => {\n let {\n showAlert,\n roomName,\n member,\n socket,\n islevel,\n youAreCoHost,\n adminRestrictSetting,\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n screenAction,\n screenAlreadyOn,\n screenRequestState,\n screenRequestTime,\n audioOnlyRoom,\n updateRequestIntervalSeconds,\n updateScreenRequestState,\n updateScreenAlreadyOn,\n checkPermission,\n checkScreenShare,\n stopShareScreen,\n } = parameters;\n\n if (audioOnlyRoom) {\n showAlert?.({\n message: 'You cannot turn on your camera in an audio-only event.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (screenAlreadyOn) {\n screenAlreadyOn = false;\n updateScreenAlreadyOn(screenAlreadyOn);\n await stopShareScreen({ parameters });\n } else {\n if (adminRestrictSetting) {\n showAlert?.({\n message: 'You cannot start screen share. Access denied by host.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n let response = 2;\n if (!screenAction && islevel !== '2' && !youAreCoHost) {\n response = await checkPermission({\n permissionType: 'screenshareSetting',\n audioSetting,\n videoSetting,\n screenshareSetting,\n chatSetting,\n permissionConfig: parameters.permissionConfig,\n participantLevel: islevel,\n });\n } else {\n response = 0;\n }\n\n switch (response) {\n case 0:\n checkScreenShare({ parameters });\n break;\n case 1: {\n if (screenRequestState === 'pending') {\n showAlert?.({\n message: 'A request is already pending. Please wait for the host to respond.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n if (\n screenRequestState === 'rejected' &&\n Date.now() - screenRequestTime < updateRequestIntervalSeconds\n ) {\n showAlert?.({\n message: 'You cannot send another request at this time.',\n type: 'danger',\n duration: 3000,\n });\n return;\n }\n\n showAlert?.({\n message: 'Your request has been sent to the host.',\n type: 'success',\n duration: 3000,\n });\n\n screenRequestState = 'pending';\n updateScreenRequestState(screenRequestState);\n\n const userRequest = { id: socket.id, name: member, icon: 'fa-desktop' };\n socket.emit('participantRequest', { userRequest, roomName });\n break;\n }\n case 2:\n showAlert?.({\n message: 'You are not allowed to start screen share.',\n type: 'danger',\n duration: 3000,\n });\n break;\n default:\n break;\n }\n }\n};","import type { ShowAlert } from '../../types/types';\n\nexport interface TimeLeftRecordingOptions {\n timeLeft: number;\n showAlert?: ShowAlert;\n}\n\nexport type TimeLeftRecordingType = (options: TimeLeftRecordingOptions) => void;\n\n/**\n * Shows a short warning that the current recording session is about to end.\n *\n * @param options Function options including the remaining recording time in seconds.\n */\nexport const timeLeftRecording = ({ timeLeft, showAlert }: TimeLeftRecordingOptions): void => {\n try {\n showAlert?.({\n message: `The recording will stop in less than ${timeLeft} seconds.`,\n duration: 3000,\n type: 'danger',\n });\n } catch (error) {\n console.log('Error in timeLeftRecording: ', error);\n }\n};","import type { Producer } from 'mediasoup-client/types';\nimport type {\n ConnectSendTransportScreenParameters,\n ConnectSendTransportScreenType,\n CreateSendTransportParameters,\n CreateSendTransportType,\n DisconnectSendTransportScreenParameters,\n DisconnectSendTransportScreenType,\n SleepType,\n} from '../../types/types';\nimport type { Socket } from 'socket.io-client';\n\nexport interface CaptureCanvasStreamParameters\n extends CreateSendTransportParameters,\n DisconnectSendTransportScreenParameters,\n ConnectSendTransportScreenParameters {\n canvasWhiteboard: HTMLCanvasElement | null;\n canvasStream: MediaStream | null;\n updateCanvasStream: (stream: MediaStream | null) => void;\n screenProducer: Producer | null;\n localScreenProducer?: Producer | null;\n transportCreated: boolean;\n localTransportCreated?: boolean;\n localSocket?: Socket;\n updateScreenProducer: (producer: Producer | null) => void;\n updateLocalScreenProducer?: (localProducer: Producer | null) => void;\n\n sleep: SleepType;\n createSendTransport: CreateSendTransportType;\n connectSendTransportScreen: ConnectSendTransportScreenType;\n disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n\n getUpdatedAllParams: () => CaptureCanvasStreamParameters;\n [key: string]: any;\n}\n\nexport interface CaptureCanvasStreamOptions {\n parameters: CaptureCanvasStreamParameters;\n start?: boolean;\n}\n\nexport type CaptureCanvasStreamType = (options: CaptureCanvasStreamOptions) => Promise<void>;\n\n/**\n * Captures or tears down a whiteboard canvas stream used for screen-style sharing.\n *\n * When starting, this helper captures the canvas at 30 FPS and ensures the\n * correct screen transport is created or reconnected. When stopping, it ends all\n * canvas tracks and disconnects the corresponding transport.\n *\n * @param options Function options for starting or stopping the captured canvas stream.\n * @returns A promise that resolves after the whiteboard stream lifecycle step completes.\n */\nexport const captureCanvasStream = async ({\n parameters,\n start = true,\n}: CaptureCanvasStreamOptions): Promise<void> => {\n try {\n let {\n canvasWhiteboard,\n canvasStream,\n updateCanvasStream,\n screenProducer,\n localScreenProducer,\n transportCreated,\n localTransportCreated,\n updateScreenProducer,\n updateLocalScreenProducer,\n localSocket,\n sleep,\n createSendTransport,\n connectSendTransportScreen,\n disconnectSendTransportScreen,\n } = parameters;\n\n if (start && !canvasStream) {\n const stream = canvasWhiteboard!.captureStream(30);\n canvasStream = stream;\n updateCanvasStream(stream);\n\n if (localSocket && !localSocket.id) {\n try {\n if (!localTransportCreated) {\n await createSendTransport({ option: 'screen', parameters });\n } else {\n try {\n if (localScreenProducer) {\n localScreenProducer.close();\n if (updateLocalScreenProducer) {\n updateLocalScreenProducer(null);\n }\n await sleep({ ms: 500 });\n }\n } catch (error) {\n console.error(error);\n }\n await connectSendTransportScreen({ stream, parameters });\n }\n } catch {\n }\n\n return;\n }\n\n if (!transportCreated) {\n await createSendTransport({ option: 'screen', parameters });\n } else {\n try {\n if (screenProducer) {\n screenProducer.close();\n updateScreenProducer(null);\n await sleep({ ms: 500 });\n }\n } catch (error) {\n console.error(error);\n }\n await connectSendTransportScreen({ stream, parameters });\n }\n } else if (canvasStream && !start) {\n canvasStream.getTracks().forEach((track) => track.stop());\n canvasStream = null;\n updateCanvasStream(null);\n disconnectSendTransportScreen({ parameters });\n }\n } catch (error) {\n console.error(error, 'error in captureCanvasStream');\n }\n};\n","const QnHDCons = { width: { ideal: 320 }, height: { ideal: 180 } };\nconst sdCons = { width: { ideal: 640 }, height: { ideal: 360 } };\nconst hdCons = { width: { ideal: 1280 }, height: { ideal: 720 } };\nconst fhdCons = { width: { ideal: 1920 }, height: { ideal: 1080 } };\nconst qhdCons = { width: { ideal: 2560 }, height: { ideal: 1440 } };\n\nconst QnHDConsPort = { width: { ideal: 180 }, height: { ideal: 320 } };\nconst sdConsPort = { width: { ideal: 360 }, height: { ideal: 640 } };\nconst hdConsPort = { width: { ideal: 720 }, height: { ideal: 1280 } };\nconst fhdConsPort = { width: { ideal: 1080 }, height: { ideal: 1920 } };\nconst qhdConsPort = { width: { ideal: 1440 }, height: { ideal: 2560 } };\n\nconst QnHDConsNeu = { width: { ideal: 240 }, height: { ideal: 240 } };\nconst sdConsNeu = { width: { ideal: 480 }, height: { ideal: 480 } };\nconst hdConsNeu = { width: { ideal: 960 }, height: { ideal: 960 } };\nconst fhdConsNeu = { width: { ideal: 1440 }, height: { ideal: 1440 } };\nconst qhdConsNeu = { width: { ideal: 1920 }, height: { ideal: 1920 } };\n\nconst QnHDFrameRate = 5;\nconst sdFrameRate = 10;\nconst hdFrameRate = 15;\nconst fhdFrameRate = 20;\nconst qhdFrameRate = 30;\nconst screenFrameRate = 30;\n\n/**\n * Preset video capture constraints and frame-rate defaults used by MediaSFU.\n *\n * These exports provide standard landscape, portrait, and neutral constraint\n * presets along with recommended frame-rate values for each quality tier.\n *\n * @example\n * ```typescript\n * const constraints = {\n * video: {\n * ...hdCons,\n * frameRate: { ideal: hdFrameRate },\n * },\n * audio: false,\n * };\n * ```\n */\nexport {\n QnHDCons,\n sdCons,\n hdCons,\n fhdCons,\n qhdCons,\n QnHDConsPort,\n sdConsPort,\n hdConsPort,\n fhdConsPort,\n qhdConsPort,\n QnHDConsNeu,\n sdConsNeu,\n hdConsNeu,\n fhdConsNeu,\n qhdConsNeu,\n QnHDFrameRate,\n sdFrameRate,\n hdFrameRate,\n fhdFrameRate,\n qhdFrameRate,\n screenFrameRate,\n};","import type { HParamsType } from '../../../types/types';\n\nexport const hParams: HParamsType = {\n encodings: [\n {\n rid: 'r8',\n maxBitrate: 240000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 4.0,\n },\n {\n rid: 'r9',\n maxBitrate: 480000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 2.0,\n },\n {\n rid: 'r10',\n maxBitrate: 960000,\n scalabilityMode: 'L1T3',\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 384,\n },\n};","import type { VParamsType } from '../../../types/types';\n\nexport const vParams: VParamsType = {\n encodings: [\n {\n rid: 'r3',\n maxBitrate: 200000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 4.0,\n },\n {\n rid: 'r4',\n maxBitrate: 400000,\n scalabilityMode: 'L1T3',\n scaleResolutionDownBy: 2.0,\n },\n {\n rid: 'r5',\n maxBitrate: 800000,\n scalabilityMode: 'L1T3',\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 320,\n },\n};","import type { ScreenParamsType } from '../../../types/types';\n\nexport const screenParams: ScreenParamsType = {\n encodings: [\n {\n rid: 'r7',\n maxBitrate: 3000000,\n },\n ],\n codecOptions: {\n videoGoogleStartBitrate: 1000,\n },\n};","import type { AParamsType } from '../../../types/types';\n\nexport const aParams: AParamsType = {\n encodings: [\n {\n rid: 'r0',\n maxBitrate: 64000,\n },\n ],\n};","const DEFAULT_MEDIA_SFU_ROOM_API_URL = 'https://mediasfu.com/v1/rooms/';\n\r\ntype MediaSFURoomApiAction = 'createRoom' | 'joinRoom';\r\n\r\nconst getDefaultMediaSFURoomApiUrl = (): string =>\r\n DEFAULT_MEDIA_SFU_ROOM_API_URL;\r\n\r\nconst normalizeManagedRoomApi = (normalizedLink: string): string => {\r\n if (normalizedLink.includes('/v1/rooms')) {\r\n return `${normalizedLink.replace(/\\/$/, '')}/`;\r\n }\r\n\r\n return `${normalizedLink.replace(/\\/$/, '')}/v1/rooms/`;\r\n};\r\n\r\nexport const resolveMediaSFURoomApi = (\r\n localLink: string | undefined,\r\n action: MediaSFURoomApiAction,\r\n): string => {\r\n const normalizedLink = localLink?.trim();\r\n\r\n if (!normalizedLink) {\r\n return getDefaultMediaSFURoomApiUrl();\r\n }\r\n\r\n if (normalizedLink.includes('mediasfu.com')) {\r\n return normalizeManagedRoomApi(normalizedLink);\r\n }\r\n\r\n return `${normalizedLink.replace(/\\/$/, '')}/${action}`;\r\n};\n","import type { CreateMediaSFURoomOptions, JoinMediaSFURoomOptions } from '../../types/types';\nimport { resolveMediaSFURoomApi } from './resolveMediaSFURoomApi';\n\nexport type CreateJoinRoomType = (options: {\n payload: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n localLink?: string;\n}) => Promise<{\n data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n success: boolean;\n}>;\n\nexport interface CreateJoinRoomResponse {\n message: string;\n roomName: string;\n secureCode?: string;\n publicURL: string;\n link: string;\n secret: string;\n success: boolean;\n}\n\nexport interface CreateJoinRoomError {\n error: string;\n success?: boolean;\n}\n\nexport type JoinRoomOnMediaSFUType = (options: {\n payload: JoinMediaSFURoomOptions;\n apiUserName: string;\n apiKey: string;\n localLink?: string;\n}) => Promise<{\n data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n success: boolean;\n}>;\n\nconst readResponseError = async (response: Response): Promise<string> => {\n const fallbackMessage = `HTTP error! Status: ${response.status}`;\n\n try {\n const responseText = await response.text();\n\n if (!responseText) {\n return fallbackMessage;\n }\n\n const parsedResponse = JSON.parse(responseText) as { error?: string; message?: string };\n return parsedResponse.error || parsedResponse.message || responseText;\n } catch {\n return fallbackMessage;\n }\n};\n\n/**\n * Calls the MediaSFU join-room API and returns a normalized success/error result.\n *\n * This helper supports both cloud and self-hosted deployments through the\n * optional `localLink` override.\n *\n * @param options API request options including credentials and join payload.\n * @returns A result object containing either parsed response data or an error payload.\n *\n * @example\n * ```typescript\n * const result = await joinRoomOnMediaSFU({\n * payload: { action: 'join', meetingID: 'room123', userName: 'Ada' },\n * apiUserName: 'sampleuser',\n * apiKey: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef',\n * });\n *\n * if (result.success) {\n * console.log(result.data?.roomName);\n * }\n * ```\n */\nexport const joinRoomOnMediaSFU: CreateJoinRoomType = async ({\n payload,\n apiUserName,\n apiKey,\n localLink = '',\n}) => {\n try {\n if (\n !apiUserName ||\n !apiKey ||\n apiUserName === 'yourAPIUSERNAME' ||\n apiKey === 'yourAPIKEY' ||\n apiKey.length !== 64 ||\n apiUserName.length < 6\n ) {\n return { data: { error: 'Invalid credentials' }, success: false };\n }\n\n const finalLink = resolveMediaSFURoomApi(localLink, 'joinRoom');\n\n const response = await fetch(finalLink, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiUserName}:${apiKey}`,\n },\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(await readResponseError(response));\n }\n\n const data = await response.json();\n return { data, success: true };\n } catch (error) {\n const errorMessage = (\n error as { reason?: string; message?: string }\n ).reason || (\n error as { reason?: string; message?: string }\n ).message || 'unknown error';\n return {\n data: { error: `Unable to join room, ${errorMessage}` },\n success: false,\n };\n }\n};"],"names":["decode","cookies","response"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,4 +1,5 @@
1
1
  "use strict";
2
+ const audioProcessing = require("./audioProcessing-BpbrdCk-.cjs");
2
3
  var cookie = {};
3
4
  /*!
4
5
  * cookie
@@ -609,7 +610,7 @@ const hostRequestResponse = async ({
609
610
  }
610
611
  }
611
612
  };
612
- const clickAudio = async ({ parameters }) => {
613
+ const clickAudio = async ({ parameters, audioProcessing: audioProcessing$1 }) => {
613
614
  let {
614
615
  checkMediaPermission,
615
616
  hasAudioPermission,
@@ -792,6 +793,7 @@ const clickAudio = async ({ parameters }) => {
792
793
  break;
793
794
  case 0:
794
795
  if (audioPaused) {
796
+ await audioProcessing.applyAudioProcessing(localStream.getAudioTracks()[0], audioProcessing$1);
795
797
  if (localStream && localStream.getAudioTracks().length > 0) {
796
798
  localStream.getAudioTracks()[0].enabled = true;
797
799
  }
@@ -832,7 +834,11 @@ const clickAudio = async ({ parameters }) => {
832
834
  return;
833
835
  }
834
836
  }
835
- const mediaConstraints = userDefaultAudioInputDevice ? { audio: { deviceId: userDefaultAudioInputDevice }, video: false } : { audio: true, video: false };
837
+ const processing = audioProcessing.audioProcessingConstraints(audioProcessing$1);
838
+ const mediaConstraints = {
839
+ audio: userDefaultAudioInputDevice || Object.keys(processing).length ? { ...userDefaultAudioInputDevice ? { deviceId: userDefaultAudioInputDevice } : {}, ...processing } : true,
840
+ video: false
841
+ };
836
842
  try {
837
843
  const stream = await mediaDevices.getUserMedia(mediaConstraints);
838
844
  await streamSuccessAudio({ stream, parameters });
@@ -1219,4 +1225,4 @@ exports.sdConsPort = sdConsPort;
1219
1225
  exports.sdFrameRate = sdFrameRate;
1220
1226
  exports.timeLeftRecording = timeLeftRecording;
1221
1227
  exports.vParams = vParams;
1222
- //# sourceMappingURL=joinRoomOnMediaSFU-CC8RVJgr.cjs.map
1228
+ //# sourceMappingURL=joinRoomOnMediaSFU-D2C7q1GK.cjs.map