mediasfu-shared 1.0.6 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HEADLESS_GUIDE.md +156 -0
- package/README.md +130 -62
- package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts +23 -0
- package/dist/ProducerClient/producerClientEmits/createDeviceClient.d.ts.map +1 -0
- package/dist/ProducerClient/producerClientEmits/joinRoomClient.d.ts +22 -0
- package/dist/ProducerClient/producerClientEmits/joinRoomClient.d.ts.map +1 -0
- package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts +85 -0
- package/dist/ProducerClient/producerClientEmits/updateRoomParametersClient.d.ts.map +1 -0
- package/dist/consumers/addVideosGrid.d.ts +10 -0
- package/dist/consumers/addVideosGrid.d.ts.map +1 -0
- package/dist/consumers/autoAdjust.d.ts +41 -0
- package/dist/consumers/autoAdjust.d.ts.map +1 -0
- package/dist/consumers/calculateRowsAndColumns.d.ts +24 -0
- package/dist/consumers/calculateRowsAndColumns.d.ts.map +1 -0
- package/dist/consumers/changeVids.d.ts +252 -0
- package/dist/consumers/changeVids.d.ts.map +1 -0
- package/dist/consumers/checkGrid.d.ts +42 -0
- package/dist/consumers/checkGrid.d.ts.map +1 -0
- package/dist/consumers/checkPermission.d.ts +42 -0
- package/dist/consumers/checkPermission.d.ts.map +1 -0
- package/dist/consumers/checkScreenShare.d.ts +59 -0
- package/dist/consumers/checkScreenShare.d.ts.map +1 -0
- package/dist/consumers/closeAndResize.d.ts +157 -0
- package/dist/consumers/closeAndResize.d.ts.map +1 -0
- package/dist/consumers/compareActiveNames.d.ts +50 -0
- package/dist/consumers/compareActiveNames.d.ts.map +1 -0
- package/dist/consumers/compareScreenStates.d.ts +55 -0
- package/dist/consumers/compareScreenStates.d.ts.map +1 -0
- package/dist/consumers/connectIps.d.ts +66 -0
- package/dist/consumers/connectIps.d.ts.map +1 -0
- package/dist/consumers/connectLocalIps.d.ts +52 -0
- package/dist/consumers/connectLocalIps.d.ts.map +1 -0
- package/dist/consumers/connectRecvTransport.d.ts +64 -0
- package/dist/consumers/connectRecvTransport.d.ts.map +1 -0
- package/dist/consumers/connectSendTransport.d.ts +75 -0
- package/dist/consumers/connectSendTransport.d.ts.map +1 -0
- package/dist/consumers/connectSendTransportAudio.d.ts +62 -0
- package/dist/consumers/connectSendTransportAudio.d.ts.map +1 -0
- package/dist/consumers/connectSendTransportScreen.d.ts +72 -0
- package/dist/consumers/connectSendTransportScreen.d.ts.map +1 -0
- package/dist/consumers/connectSendTransportVideo.d.ts +75 -0
- package/dist/consumers/connectSendTransportVideo.d.ts.map +1 -0
- package/dist/consumers/consumerResume.d.ts +16 -0
- package/dist/consumers/consumerResume.d.ts.map +1 -0
- package/dist/consumers/controlMedia.d.ts +61 -0
- package/dist/consumers/controlMedia.d.ts.map +1 -0
- package/dist/consumers/createSendTransport.d.ts +80 -0
- package/dist/consumers/createSendTransport.d.ts.map +1 -0
- package/dist/consumers/disconnectSendTransportAudio.d.ts +79 -0
- package/dist/consumers/disconnectSendTransportAudio.d.ts.map +1 -0
- package/dist/consumers/disconnectSendTransportScreen.d.ts +61 -0
- package/dist/consumers/disconnectSendTransportScreen.d.ts.map +1 -0
- package/dist/consumers/disconnectSendTransportVideo.d.ts +72 -0
- package/dist/consumers/disconnectSendTransportVideo.d.ts.map +1 -0
- package/dist/consumers/dispStreams.d.ts +189 -0
- package/dist/consumers/dispStreams.d.ts.map +1 -0
- package/dist/consumers/frameworkConsumerContract.d.ts +2 -0
- package/dist/consumers/frameworkConsumerContract.d.ts.map +1 -0
- package/dist/consumers/generatePageContent.d.ts +68 -0
- package/dist/consumers/generatePageContent.d.ts.map +1 -0
- package/dist/consumers/getEstimate.d.ts +62 -0
- package/dist/consumers/getEstimate.d.ts.map +1 -0
- package/dist/consumers/getPipedProducersAlt.d.ts +62 -0
- package/dist/consumers/getPipedProducersAlt.d.ts.map +1 -0
- package/dist/consumers/getProducersPiped.d.ts +49 -0
- package/dist/consumers/getProducersPiped.d.ts.map +1 -0
- package/dist/consumers/getVideos.d.ts +49 -0
- package/dist/consumers/getVideos.d.ts.map +1 -0
- package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts +19 -0
- package/dist/consumers/gridLayout/addVideosGrid.engine.d.ts.map +1 -0
- package/dist/consumers/gridLayout/prepopulateUserMedia.engine.d.ts +138 -0
- package/dist/consumers/gridLayout/prepopulateUserMedia.engine.d.ts.map +1 -0
- package/dist/consumers/index.cjs +80 -0
- package/dist/consumers/index.cjs.map +1 -0
- package/dist/consumers/index.d.ts +62 -0
- package/dist/consumers/index.d.ts.map +1 -0
- package/dist/consumers/index.js +80 -0
- package/dist/consumers/index.js.map +1 -0
- package/dist/consumers/mixStreams.d.ts +37 -0
- package/dist/consumers/mixStreams.d.ts.map +1 -0
- package/dist/consumers/onScreenChanges.d.ts +62 -0
- package/dist/consumers/onScreenChanges.d.ts.map +1 -0
- package/dist/consumers/prepopulateUserMedia.d.ts +10 -0
- package/dist/consumers/prepopulateUserMedia.d.ts.map +1 -0
- package/dist/consumers/processConsumerTransports.d.ts +73 -0
- package/dist/consumers/processConsumerTransports.d.ts.map +1 -0
- package/dist/consumers/processConsumerTransportsAudio.d.ts +57 -0
- package/dist/consumers/processConsumerTransportsAudio.d.ts.map +1 -0
- package/dist/consumers/rePort.d.ts +63 -0
- package/dist/consumers/rePort.d.ts.map +1 -0
- package/dist/consumers/reUpdateInter.d.ts +142 -0
- package/dist/consumers/reUpdateInter.d.ts.map +1 -0
- package/dist/consumers/readjust.d.ts +68 -0
- package/dist/consumers/readjust.d.ts.map +1 -0
- package/dist/consumers/receiveAllPipedTransports.d.ts +44 -0
- package/dist/consumers/receiveAllPipedTransports.d.ts.map +1 -0
- package/dist/consumers/receiveRoomMessages.d.ts +31 -0
- package/dist/consumers/receiveRoomMessages.d.ts.map +1 -0
- package/dist/consumers/reorderStreams.d.ts +98 -0
- package/dist/consumers/reorderStreams.d.ts.map +1 -0
- package/dist/consumers/requestScreenShare.d.ts +47 -0
- package/dist/consumers/requestScreenShare.d.ts.map +1 -0
- package/dist/consumers/resumePauseAudioStreams.d.ts +85 -0
- package/dist/consumers/resumePauseAudioStreams.d.ts.map +1 -0
- package/dist/consumers/resumePauseStreams.d.ts +68 -0
- package/dist/consumers/resumePauseStreams.d.ts.map +1 -0
- package/dist/consumers/resumeSendTransportAudio.d.ts +65 -0
- package/dist/consumers/resumeSendTransportAudio.d.ts.map +1 -0
- package/dist/consumers/signalNewConsumerTransport.d.ts +59 -0
- package/dist/consumers/signalNewConsumerTransport.d.ts.map +1 -0
- package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts +76 -0
- package/dist/consumers/socketReceiveMethods/joinConsumeRoom.d.ts.map +1 -0
- package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts +119 -0
- package/dist/consumers/socketReceiveMethods/newPipeProducer.d.ts.map +1 -0
- package/dist/consumers/socketReceiveMethods/producerClosed.d.ts +53 -0
- package/dist/consumers/socketReceiveMethods/producerClosed.d.ts.map +1 -0
- package/dist/consumers/startShareScreen.d.ts +58 -0
- package/dist/consumers/startShareScreen.d.ts.map +1 -0
- package/dist/consumers/stopShareScreen.d.ts +127 -0
- package/dist/consumers/stopShareScreen.d.ts.map +1 -0
- package/dist/consumers/streamSuccessAudio.d.ts +149 -0
- package/dist/consumers/streamSuccessAudio.d.ts.map +1 -0
- package/dist/consumers/streamSuccessAudioSwitch.d.ts +131 -0
- package/dist/consumers/streamSuccessAudioSwitch.d.ts.map +1 -0
- package/dist/consumers/streamSuccessScreen.d.ts +109 -0
- package/dist/consumers/streamSuccessScreen.d.ts.map +1 -0
- package/dist/consumers/streamSuccessVideo.d.ts +160 -0
- package/dist/consumers/streamSuccessVideo.d.ts.map +1 -0
- package/dist/consumers/switchUserAudio.d.ts +56 -0
- package/dist/consumers/switchUserAudio.d.ts.map +1 -0
- package/dist/consumers/switchUserVideo.d.ts +77 -0
- package/dist/consumers/switchUserVideo.d.ts.map +1 -0
- package/dist/consumers/switchUserVideoAlt.d.ts +69 -0
- package/dist/consumers/switchUserVideoAlt.d.ts.map +1 -0
- package/dist/consumers/translationConsumerSwitch.d.ts +67 -0
- package/dist/consumers/translationConsumerSwitch.d.ts.map +1 -0
- package/dist/consumers/trigger.d.ts +71 -0
- package/dist/consumers/trigger.d.ts.map +1 -0
- package/dist/consumers/updateMiniCardsGrid.d.ts +65 -0
- package/dist/consumers/updateMiniCardsGrid.d.ts.map +1 -0
- package/dist/consumers/updateParticipantAudioDecibels.d.ts +31 -0
- package/dist/consumers/updateParticipantAudioDecibels.d.ts.map +1 -0
- package/dist/getParticipantMedia-B0JS6d2b.js +3555 -0
- package/dist/getParticipantMedia-B0JS6d2b.js.map +1 -0
- package/dist/getParticipantMedia-CdcYqcbD.cjs +3554 -0
- package/dist/getParticipantMedia-CdcYqcbD.cjs.map +1 -0
- package/dist/index.cjs +2727 -13252
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +192 -11233
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2636 -13143
- package/dist/index.js.map +1 -1
- package/dist/index.native.cjs +352 -0
- package/dist/index.native.cjs.map +1 -0
- package/dist/index.native.d.ts +204 -0
- package/dist/index.native.d.ts.map +1 -0
- package/dist/index.native.js +352 -0
- package/dist/index.native.js.map +1 -0
- package/dist/joinLocalRoom-BdM1msQt.cjs +673 -0
- package/dist/joinLocalRoom-BdM1msQt.cjs.map +1 -0
- package/dist/joinLocalRoom-CvteNe4R.js +657 -0
- package/dist/joinLocalRoom-CvteNe4R.js.map +1 -0
- package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs +1222 -0
- package/dist/joinRoomOnMediaSFU-CC8RVJgr.cjs.map +1 -0
- package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js +1223 -0
- package/dist/joinRoomOnMediaSFU-y6vJ1OBo.js.map +1 -0
- package/dist/methods/background/launchBackground.d.ts +10 -0
- package/dist/methods/background/launchBackground.d.ts.map +1 -0
- package/dist/methods/breakoutRooms/breakoutRoomUpdated.d.ts +67 -0
- package/dist/methods/breakoutRooms/breakoutRoomUpdated.d.ts.map +1 -0
- package/dist/methods/breakoutRooms/handleStartBreakout.d.ts +42 -0
- package/dist/methods/breakoutRooms/handleStartBreakout.d.ts.map +1 -0
- package/dist/methods/breakoutRooms/handleStopBreakout.d.ts +33 -0
- package/dist/methods/breakoutRooms/handleStopBreakout.d.ts.map +1 -0
- package/dist/methods/breakoutRooms/index.d.ts +5 -0
- package/dist/methods/breakoutRooms/index.d.ts.map +1 -0
- package/dist/methods/breakoutRooms/launchBreakoutRooms.d.ts +25 -0
- package/dist/methods/breakoutRooms/launchBreakoutRooms.d.ts.map +1 -0
- package/dist/methods/coHost/launchCoHost.d.ts +25 -0
- package/dist/methods/coHost/launchCoHost.d.ts.map +1 -0
- package/dist/methods/coHostMethods/index.d.ts +3 -0
- package/dist/methods/coHostMethods/index.d.ts.map +1 -0
- package/dist/methods/coHostMethods/modifyCoHostSettings.d.ts +49 -0
- package/dist/methods/coHostMethods/modifyCoHostSettings.d.ts.map +1 -0
- package/dist/methods/displaySettings/index.d.ts +2 -0
- package/dist/methods/displaySettings/index.d.ts.map +1 -0
- package/dist/methods/displaySettings/launchDisplaySettings.d.ts +25 -0
- package/dist/methods/displaySettings/launchDisplaySettings.d.ts.map +1 -0
- package/dist/methods/displaySettings/modifyDisplaySettings.d.ts +106 -0
- package/dist/methods/displaySettings/modifyDisplaySettings.d.ts.map +1 -0
- package/dist/methods/exit/confirmExit.d.ts +38 -0
- package/dist/methods/exit/confirmExit.d.ts.map +1 -0
- package/dist/methods/exit/index.d.ts +3 -0
- package/dist/methods/exit/index.d.ts.map +1 -0
- package/dist/methods/exit/launchConfirmExit.d.ts +23 -0
- package/dist/methods/exit/launchConfirmExit.d.ts.map +1 -0
- package/dist/methods/index.cjs +3975 -0
- package/dist/methods/index.cjs.map +1 -0
- package/dist/methods/index.d.ts +66 -0
- package/dist/methods/index.d.ts.map +1 -0
- package/dist/methods/index.js +3976 -0
- package/dist/methods/index.js.map +1 -0
- package/dist/methods/mediaSettings/launchMediaSettings.d.ts +38 -0
- package/dist/methods/mediaSettings/launchMediaSettings.d.ts.map +1 -0
- package/dist/methods/menu/launchMenuModal.d.ts +22 -0
- package/dist/methods/menu/launchMenuModal.d.ts.map +1 -0
- package/dist/methods/message/index.d.ts +2 -0
- package/dist/methods/message/index.d.ts.map +1 -0
- package/dist/methods/message/launchMessages.d.ts +24 -0
- package/dist/methods/message/launchMessages.d.ts.map +1 -0
- package/dist/methods/message/sendMessage.d.ts +63 -0
- package/dist/methods/message/sendMessage.d.ts.map +1 -0
- package/dist/methods/panelists/focusPanelists.d.ts +24 -0
- package/dist/methods/panelists/focusPanelists.d.ts.map +1 -0
- package/dist/methods/panelists/index.d.ts +4 -0
- package/dist/methods/panelists/index.d.ts.map +1 -0
- package/dist/methods/panelists/launchPanelists.d.ts +7 -0
- package/dist/methods/panelists/launchPanelists.d.ts.map +1 -0
- package/dist/methods/panelists/updatePanelists.d.ts +35 -0
- package/dist/methods/panelists/updatePanelists.d.ts.map +1 -0
- package/dist/methods/participants/index.d.ts +4 -0
- package/dist/methods/participants/index.d.ts.map +1 -0
- package/dist/methods/participants/launchParticipants.d.ts +22 -0
- package/dist/methods/participants/launchParticipants.d.ts.map +1 -0
- package/dist/methods/participants/messageParticipants.d.ts +43 -0
- package/dist/methods/participants/messageParticipants.d.ts.map +1 -0
- package/dist/methods/participants/muteParticipants.d.ts +41 -0
- package/dist/methods/participants/muteParticipants.d.ts.map +1 -0
- package/dist/methods/participants/removeParticipants.d.ts +47 -0
- package/dist/methods/participants/removeParticipants.d.ts.map +1 -0
- package/dist/methods/permissions/index.d.ts +4 -0
- package/dist/methods/permissions/index.d.ts.map +1 -0
- package/dist/methods/permissions/launchPermissions.d.ts +7 -0
- package/dist/methods/permissions/launchPermissions.d.ts.map +1 -0
- package/dist/methods/permissions/updateParticipantPermission.d.ts +25 -0
- package/dist/methods/permissions/updateParticipantPermission.d.ts.map +1 -0
- package/dist/methods/permissions/updatePermissionConfig.d.ts +22 -0
- package/dist/methods/permissions/updatePermissionConfig.d.ts.map +1 -0
- package/dist/methods/polls/handleCreatePoll.d.ts +39 -0
- package/dist/methods/polls/handleCreatePoll.d.ts.map +1 -0
- package/dist/methods/polls/handleEndPoll.d.ts +34 -0
- package/dist/methods/polls/handleEndPoll.d.ts.map +1 -0
- package/dist/methods/polls/handleVotePoll.d.ts +39 -0
- package/dist/methods/polls/handleVotePoll.d.ts.map +1 -0
- package/dist/methods/polls/index.d.ts +4 -0
- package/dist/methods/polls/index.d.ts.map +1 -0
- package/dist/methods/polls/launchPoll.d.ts +22 -0
- package/dist/methods/polls/launchPoll.d.ts.map +1 -0
- package/dist/methods/polls/pollUpdated.d.ts +38 -0
- package/dist/methods/polls/pollUpdated.d.ts.map +1 -0
- package/dist/methods/prejoin/handleCreateRoom.d.ts +77 -0
- package/dist/methods/prejoin/handleCreateRoom.d.ts.map +1 -0
- package/dist/methods/prejoin/handleJoinRoom.d.ts +56 -0
- package/dist/methods/prejoin/handleJoinRoom.d.ts.map +1 -0
- package/dist/methods/prejoin/index.d.ts +5 -0
- package/dist/methods/prejoin/index.d.ts.map +1 -0
- package/dist/methods/recording/checkPauseState.d.ts +34 -0
- package/dist/methods/recording/checkPauseState.d.ts.map +1 -0
- package/dist/methods/recording/checkResumeState.d.ts +30 -0
- package/dist/methods/recording/checkResumeState.d.ts.map +1 -0
- package/dist/methods/recording/confirmRecording.d.ts +46 -0
- package/dist/methods/recording/confirmRecording.d.ts.map +1 -0
- package/dist/methods/recording/launchRecording.d.ts +56 -0
- package/dist/methods/recording/launchRecording.d.ts.map +1 -0
- package/dist/methods/recording/recordPauseTimer.d.ts +31 -0
- package/dist/methods/recording/recordPauseTimer.d.ts.map +1 -0
- package/dist/methods/recording/recordResumeTimer.d.ts +29 -0
- package/dist/methods/recording/recordResumeTimer.d.ts.map +1 -0
- package/dist/methods/recording/recordStartTimer.d.ts +45 -0
- package/dist/methods/recording/recordStartTimer.d.ts.map +1 -0
- package/dist/methods/recording/recordUpdateTimer.d.ts +29 -0
- package/dist/methods/recording/recordUpdateTimer.d.ts.map +1 -0
- package/dist/methods/recording/startRecording.d.ts +122 -0
- package/dist/methods/recording/startRecording.d.ts.map +1 -0
- package/dist/methods/recording/stopRecording.d.ts +36 -0
- package/dist/methods/recording/stopRecording.d.ts.map +1 -0
- package/dist/methods/recording/timeLeftRecording.d.ts +13 -0
- package/dist/methods/recording/timeLeftRecording.d.ts.map +1 -0
- package/dist/methods/recording/updateRecording.d.ts +49 -0
- package/dist/methods/recording/updateRecording.d.ts.map +1 -0
- package/dist/methods/requests/hostRequestResponse.d.ts +33 -0
- package/dist/methods/requests/hostRequestResponse.d.ts.map +1 -0
- package/dist/methods/requests/index.d.ts +2 -0
- package/dist/methods/requests/index.d.ts.map +1 -0
- package/dist/methods/requests/launchRequests.d.ts +22 -0
- package/dist/methods/requests/launchRequests.d.ts.map +1 -0
- package/dist/methods/requests/respondToRequests.d.ts +38 -0
- package/dist/methods/requests/respondToRequests.d.ts.map +1 -0
- package/dist/methods/settings/index.d.ts +3 -0
- package/dist/methods/settings/index.d.ts.map +1 -0
- package/dist/methods/settings/launchSettings.d.ts +22 -0
- package/dist/methods/settings/launchSettings.d.ts.map +1 -0
- package/dist/methods/settings/modifySettings.d.ts +45 -0
- package/dist/methods/settings/modifySettings.d.ts.map +1 -0
- package/dist/methods/socketReceive/allMembers.d.ts +117 -0
- package/dist/methods/socketReceive/allMembers.d.ts.map +1 -0
- package/dist/methods/socketReceive/allMembersRest.d.ts +122 -0
- package/dist/methods/socketReceive/allMembersRest.d.ts.map +1 -0
- package/dist/methods/socketReceive/allWaitingRoomMembers.d.ts +24 -0
- package/dist/methods/socketReceive/allWaitingRoomMembers.d.ts.map +1 -0
- package/dist/methods/socketReceive/banParticipant.d.ts +44 -0
- package/dist/methods/socketReceive/banParticipant.d.ts.map +1 -0
- package/dist/methods/socketReceive/controlMediaHost.d.ts +62 -0
- package/dist/methods/socketReceive/controlMediaHost.d.ts.map +1 -0
- package/dist/methods/socketReceive/disconnect.d.ts +24 -0
- package/dist/methods/socketReceive/disconnect.d.ts.map +1 -0
- package/dist/methods/socketReceive/disconnectUserSelf.d.ts +29 -0
- package/dist/methods/socketReceive/disconnectUserSelf.d.ts.map +1 -0
- package/dist/methods/socketReceive/getDomains.d.ts +48 -0
- package/dist/methods/socketReceive/getDomains.d.ts.map +1 -0
- package/dist/methods/socketReceive/meetingEnded.d.ts +27 -0
- package/dist/methods/socketReceive/meetingEnded.d.ts.map +1 -0
- package/dist/methods/socketReceive/meetingStillThere.d.ts +19 -0
- package/dist/methods/socketReceive/meetingStillThere.d.ts.map +1 -0
- package/dist/methods/socketReceive/panelistReceiveMethods.d.ts +66 -0
- package/dist/methods/socketReceive/panelistReceiveMethods.d.ts.map +1 -0
- package/dist/methods/socketReceive/participantRequested.d.ts +28 -0
- package/dist/methods/socketReceive/participantRequested.d.ts.map +1 -0
- package/dist/methods/socketReceive/permissionReceiveMethods.d.ts +23 -0
- package/dist/methods/socketReceive/permissionReceiveMethods.d.ts.map +1 -0
- package/dist/methods/socketReceive/personJoined.d.ts +24 -0
- package/dist/methods/socketReceive/personJoined.d.ts.map +1 -0
- package/dist/methods/socketReceive/producerMediaClosed.d.ts +66 -0
- package/dist/methods/socketReceive/producerMediaClosed.d.ts.map +1 -0
- package/dist/methods/socketReceive/producerMediaPaused.d.ts +70 -0
- package/dist/methods/socketReceive/producerMediaPaused.d.ts.map +1 -0
- package/dist/methods/socketReceive/producerMediaResumed.d.ts +53 -0
- package/dist/methods/socketReceive/producerMediaResumed.d.ts.map +1 -0
- package/dist/methods/socketReceive/reInitiateRecording.d.ts +33 -0
- package/dist/methods/socketReceive/reInitiateRecording.d.ts.map +1 -0
- package/dist/methods/socketReceive/receiveMessage.d.ts +36 -0
- package/dist/methods/socketReceive/receiveMessage.d.ts.map +1 -0
- package/dist/methods/socketReceive/recordingNotice.d.ts +98 -0
- package/dist/methods/socketReceive/recordingNotice.d.ts.map +1 -0
- package/dist/methods/socketReceive/roomRecordParams.d.ts +60 -0
- package/dist/methods/socketReceive/roomRecordParams.d.ts.map +1 -0
- package/dist/methods/socketReceive/screenProducerId.d.ts +36 -0
- package/dist/methods/socketReceive/screenProducerId.d.ts.map +1 -0
- package/dist/methods/socketReceive/startRecords.d.ts +31 -0
- package/dist/methods/socketReceive/startRecords.d.ts.map +1 -0
- package/dist/methods/socketReceive/stoppedRecording.d.ts +24 -0
- package/dist/methods/socketReceive/stoppedRecording.d.ts.map +1 -0
- package/dist/methods/socketReceive/translationReceiveMethods.d.ts +227 -0
- package/dist/methods/socketReceive/translationReceiveMethods.d.ts.map +1 -0
- package/dist/methods/socketReceive/updateConsumingDomains.d.ts +60 -0
- package/dist/methods/socketReceive/updateConsumingDomains.d.ts.map +1 -0
- package/dist/methods/socketReceive/updateMediaSettings.d.ts +28 -0
- package/dist/methods/socketReceive/updateMediaSettings.d.ts.map +1 -0
- package/dist/methods/socketReceive/updatedCoHost.d.ts +38 -0
- package/dist/methods/socketReceive/updatedCoHost.d.ts.map +1 -0
- package/dist/methods/socketReceive/userWaiting.d.ts +30 -0
- package/dist/methods/socketReceive/userWaiting.d.ts.map +1 -0
- package/dist/methods/stream/clickAudio.d.ts +71 -0
- package/dist/methods/stream/clickAudio.d.ts.map +1 -0
- package/dist/methods/stream/clickChat.d.ts +11 -0
- package/dist/methods/stream/clickChat.d.ts.map +1 -0
- package/dist/methods/stream/clickScreenShare.d.ts +45 -0
- package/dist/methods/stream/clickScreenShare.d.ts.map +1 -0
- package/dist/methods/stream/clickVideo.d.ts +101 -0
- package/dist/methods/stream/clickVideo.d.ts.map +1 -0
- package/dist/methods/stream/index.d.ts +5 -0
- package/dist/methods/stream/index.d.ts.map +1 -0
- package/dist/methods/stream/switchAudio.d.ts +40 -0
- package/dist/methods/stream/switchAudio.d.ts.map +1 -0
- package/dist/methods/stream/switchVideo.d.ts +56 -0
- package/dist/methods/stream/switchVideo.d.ts.map +1 -0
- package/dist/methods/stream/switchVideoAlt.d.ts +55 -0
- package/dist/methods/stream/switchVideoAlt.d.ts.map +1 -0
- package/dist/methods/utils/SoundPlayer.d.ts +19 -0
- package/dist/methods/utils/SoundPlayer.d.ts.map +1 -0
- package/dist/methods/utils/checkLimitsAndMakeRequest.d.ts +30 -0
- package/dist/methods/utils/checkLimitsAndMakeRequest.d.ts.map +1 -0
- package/dist/methods/utils/createResponseJoinRoom.d.ts +24 -0
- package/dist/methods/utils/createResponseJoinRoom.d.ts.map +1 -0
- package/dist/methods/utils/createRoomOnMediaSFU.d.ts +28 -0
- package/dist/methods/utils/createRoomOnMediaSFU.d.ts.map +1 -0
- package/dist/methods/utils/formatNumber.d.ts +21 -0
- package/dist/methods/utils/formatNumber.d.ts.map +1 -0
- package/dist/methods/utils/generateRandomMessages.d.ts +11 -0
- package/dist/methods/utils/generateRandomMessages.d.ts.map +1 -0
- package/dist/methods/utils/generateRandomParticipants.d.ts +10 -0
- package/dist/methods/utils/generateRandomParticipants.d.ts.map +1 -0
- package/dist/methods/utils/generateRandomPolls.d.ts +7 -0
- package/dist/methods/utils/generateRandomPolls.d.ts.map +1 -0
- package/dist/methods/utils/generateRandomRequestList.d.ts +10 -0
- package/dist/methods/utils/generateRandomRequestList.d.ts.map +1 -0
- package/dist/methods/utils/generateRandomWaitingRoomList.d.ts +4 -0
- package/dist/methods/utils/generateRandomWaitingRoomList.d.ts.map +1 -0
- package/dist/methods/utils/getModalPosition.d.ts +7 -0
- package/dist/methods/utils/getModalPosition.d.ts.map +1 -0
- package/dist/methods/utils/getOverlayPosition.d.ts +22 -0
- package/dist/methods/utils/getOverlayPosition.d.ts.map +1 -0
- package/dist/methods/utils/getParticipantMedia.d.ts +55 -0
- package/dist/methods/utils/getParticipantMedia.d.ts.map +1 -0
- package/dist/methods/utils/headless/getCurrentParams.d.ts +27 -0
- package/dist/methods/utils/headless/getCurrentParams.d.ts.map +1 -0
- package/dist/methods/utils/headless/getMediaStreams.d.ts +96 -0
- package/dist/methods/utils/headless/getMediaStreams.d.ts.map +1 -0
- package/dist/methods/utils/headless/getRoomReadiness.d.ts +25 -0
- package/dist/methods/utils/headless/getRoomReadiness.d.ts.map +1 -0
- package/dist/methods/utils/headless/headlessTypes.d.ts +89 -0
- package/dist/methods/utils/headless/headlessTypes.d.ts.map +1 -0
- package/dist/methods/utils/headless/index.d.ts +29 -0
- package/dist/methods/utils/headless/index.d.ts.map +1 -0
- package/dist/methods/utils/headless/mediaPermissions.d.ts +53 -0
- package/dist/methods/utils/headless/mediaPermissions.d.ts.map +1 -0
- package/dist/methods/utils/headless/mediaProduction.d.ts +177 -0
- package/dist/methods/utils/headless/mediaProduction.d.ts.map +1 -0
- package/dist/methods/utils/headless/moderation.d.ts +157 -0
- package/dist/methods/utils/headless/moderation.d.ts.map +1 -0
- package/dist/methods/utils/headless/participantState.d.ts +128 -0
- package/dist/methods/utils/headless/participantState.d.ts.map +1 -0
- package/dist/methods/utils/headless/playback.d.ts +106 -0
- package/dist/methods/utils/headless/playback.d.ts.map +1 -0
- package/dist/methods/utils/headless/roomActions.d.ts +88 -0
- package/dist/methods/utils/headless/roomActions.d.ts.map +1 -0
- package/dist/methods/utils/headless/sessionControls.d.ts +159 -0
- package/dist/methods/utils/headless/sessionControls.d.ts.map +1 -0
- package/dist/methods/utils/headless/sessionExtras.d.ts +291 -0
- package/dist/methods/utils/headless/sessionExtras.d.ts.map +1 -0
- package/dist/methods/utils/headless/sessionFeatures.d.ts +159 -0
- package/dist/methods/utils/headless/sessionFeatures.d.ts.map +1 -0
- package/dist/methods/utils/headless/viewerSession.d.ts +125 -0
- package/dist/methods/utils/headless/viewerSession.d.ts.map +1 -0
- package/dist/methods/utils/headless/virtualBackground.d.ts +72 -0
- package/dist/methods/utils/headless/virtualBackground.d.ts.map +1 -0
- package/dist/methods/utils/initialValuesState.d.ts +388 -0
- package/dist/methods/utils/initialValuesState.d.ts.map +1 -0
- package/dist/methods/utils/joinRoomOnMediaSFU.d.ts +56 -0
- package/dist/methods/utils/joinRoomOnMediaSFU.d.ts.map +1 -0
- package/dist/methods/utils/liveSubtitle.d.ts +36 -0
- package/dist/methods/utils/liveSubtitle.d.ts.map +1 -0
- package/dist/methods/utils/meetingTimeRemaining.d.ts +15 -0
- package/dist/methods/utils/meetingTimeRemaining.d.ts.map +1 -0
- package/dist/methods/utils/meetingTimer/startMeetingProgressTimer.d.ts +35 -0
- package/dist/methods/utils/meetingTimer/startMeetingProgressTimer.d.ts.map +1 -0
- package/dist/methods/utils/producer/aParams.d.ts +3 -0
- package/dist/methods/utils/producer/aParams.d.ts.map +1 -0
- package/dist/methods/utils/producer/hParams.d.ts +3 -0
- package/dist/methods/utils/producer/hParams.d.ts.map +1 -0
- package/dist/methods/utils/producer/screenParams.d.ts +3 -0
- package/dist/methods/utils/producer/screenParams.d.ts.map +1 -0
- package/dist/methods/utils/producer/vParams.d.ts +3 -0
- package/dist/methods/utils/producer/vParams.d.ts.map +1 -0
- package/dist/methods/utils/producer/videoCaptureConstraints.d.ts +145 -0
- package/dist/methods/utils/producer/videoCaptureConstraints.d.ts.map +1 -0
- package/dist/methods/utils/resolveMediaSFURoomApi.d.ts +4 -0
- package/dist/methods/utils/resolveMediaSFURoomApi.d.ts.map +1 -0
- package/dist/methods/utils/sleep.d.ts +21 -0
- package/dist/methods/utils/sleep.d.ts.map +1 -0
- package/dist/methods/utils/translationLanguages.d.ts +100 -0
- package/dist/methods/utils/translationLanguages.d.ts.map +1 -0
- package/dist/methods/utils/validateAlphanumeric.d.ts +21 -0
- package/dist/methods/utils/validateAlphanumeric.d.ts.map +1 -0
- package/dist/methods/utils/virtualBackgroundCompositor.d.ts +21 -0
- package/dist/methods/utils/virtualBackgroundCompositor.d.ts.map +1 -0
- package/dist/methods/utils/webrtc.d.ts +18 -0
- package/dist/methods/utils/webrtc.d.ts.map +1 -0
- package/dist/methods/waiting/index.d.ts +2 -0
- package/dist/methods/waiting/index.d.ts.map +1 -0
- package/dist/methods/waiting/launchWaiting.d.ts +23 -0
- package/dist/methods/waiting/launchWaiting.d.ts.map +1 -0
- package/dist/methods/waiting/respondToWaiting.d.ts +40 -0
- package/dist/methods/waiting/respondToWaiting.d.ts.map +1 -0
- package/dist/methods/welcome/handleWelcomeRequest.d.ts +47 -0
- package/dist/methods/welcome/handleWelcomeRequest.d.ts.map +1 -0
- package/dist/methods/welcome/index.d.ts +3 -0
- package/dist/methods/welcome/index.d.ts.map +1 -0
- package/dist/methods/whiteboard/captureCanvasStream.d.ts +38 -0
- package/dist/methods/whiteboard/captureCanvasStream.d.ts.map +1 -0
- package/dist/methods/whiteboard/handleStartWhiteboard.d.ts +31 -0
- package/dist/methods/whiteboard/handleStartWhiteboard.d.ts.map +1 -0
- package/dist/methods/whiteboard/handleStopWhiteboard.d.ts +25 -0
- package/dist/methods/whiteboard/handleStopWhiteboard.d.ts.map +1 -0
- package/dist/methods/whiteboard/index.d.ts +5 -0
- package/dist/methods/whiteboard/index.d.ts.map +1 -0
- package/dist/methods/whiteboard/launchConfigureWhiteboard.d.ts +23 -0
- package/dist/methods/whiteboard/launchConfigureWhiteboard.d.ts.map +1 -0
- package/dist/producers/producerEmits/joinConRoom.d.ts +54 -0
- package/dist/producers/producerEmits/joinConRoom.d.ts.map +1 -0
- package/dist/producers/producerEmits/joinLocalRoom.d.ts +30 -0
- package/dist/producers/producerEmits/joinLocalRoom.d.ts.map +1 -0
- package/dist/producers/producerEmits/joinRoom.d.ts +35 -0
- package/dist/producers/producerEmits/joinRoom.d.ts.map +1 -0
- package/dist/readme/mediasfu-platform-capabilities.webp +0 -0
- package/dist/sockets/SocketManager.d.ts +102 -0
- package/dist/sockets/SocketManager.d.ts.map +1 -0
- package/dist/translationConsumerSwitch-C20MfNNq.cjs +509 -0
- package/dist/translationConsumerSwitch-C20MfNNq.cjs.map +1 -0
- package/dist/translationConsumerSwitch-zKuS5wgH.js +510 -0
- package/dist/translationConsumerSwitch-zKuS5wgH.js.map +1 -0
- package/dist/types/index.cjs +85 -0
- package/dist/types/index.cjs.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +85 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/shared-base-types.d.ts +656 -0
- package/dist/types/shared-base-types.d.ts.map +1 -0
- package/dist/types/types.d.ts +124 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/updateParticipantAudioDecibels-DLd8Y-Fh.js +5392 -0
- package/dist/updateParticipantAudioDecibels-DLd8Y-Fh.js.map +1 -0
- package/dist/updateParticipantAudioDecibels-DPmHiy3K.cjs +5391 -0
- package/dist/updateParticipantAudioDecibels-DPmHiy3K.cjs.map +1 -0
- package/dist/validateAlphanumeric-DKn5BsUP.cjs +15 -0
- package/dist/validateAlphanumeric-DKn5BsUP.cjs.map +1 -0
- package/dist/validateAlphanumeric-Dk1JB80W.js +16 -0
- package/dist/validateAlphanumeric-Dk1JB80W.js.map +1 -0
- package/package.json +106 -99
- package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +1 -2
- package/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts +1 -1
- package/src/consumers/connectIps.ts +1 -1
- package/src/consumers/connectRecvTransport.ts +1 -1
- package/src/consumers/connectSendTransport.ts +1 -1
- package/src/consumers/connectSendTransportAudio.ts +1 -1
- package/src/consumers/connectSendTransportScreen.ts +5 -2
- package/src/consumers/connectSendTransportVideo.ts +1 -1
- package/src/consumers/createSendTransport.ts +34 -29
- package/src/consumers/disconnectSendTransportAudio.ts +1 -1
- package/src/consumers/disconnectSendTransportScreen.ts +1 -1
- package/src/consumers/disconnectSendTransportVideo.ts +1 -1
- package/src/consumers/index.ts +61 -0
- package/src/consumers/resumeSendTransportAudio.ts +1 -1
- package/src/consumers/signalNewConsumerTransport.ts +1 -2
- package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +1 -1
- package/src/consumers/socketReceiveMethods/newPipeProducer.ts +1 -1
- package/src/consumers/streamSuccessAudio.ts +1 -2
- package/src/consumers/streamSuccessAudioSwitch.ts +1 -2
- package/src/consumers/streamSuccessVideo.ts +35 -6
- package/src/index.native.ts +24 -1
- package/src/index.ts +7 -0
- package/src/methods/exit/confirmExit.ts +11 -4
- package/src/methods/socketReceive/getDomains.ts +1 -1
- package/src/methods/utils/getParticipantMedia.ts +112 -0
- package/src/methods/utils/headless/getCurrentParams.ts +44 -0
- package/src/methods/utils/headless/getMediaStreams.ts +256 -0
- package/src/methods/utils/headless/getRoomReadiness.ts +49 -0
- package/src/methods/utils/headless/headlessTypes.ts +102 -0
- package/src/methods/utils/headless/index.ts +28 -0
- package/src/methods/utils/headless/mediaPermissions.ts +124 -0
- package/src/methods/utils/headless/mediaProduction.ts +505 -0
- package/src/methods/utils/headless/moderation.ts +455 -0
- package/src/methods/utils/headless/participantState.ts +254 -0
- package/src/methods/utils/headless/playback.ts +336 -0
- package/src/methods/utils/headless/roomActions.ts +230 -0
- package/src/methods/utils/headless/sessionControls.ts +335 -0
- package/src/methods/utils/headless/sessionExtras.ts +593 -0
- package/src/methods/utils/headless/sessionFeatures.ts +480 -0
- package/src/methods/utils/headless/viewerSession.ts +246 -0
- package/src/methods/utils/headless/virtualBackground.ts +280 -0
- package/src/methods/utils/resolveMediaSFURoomApi.ts +2 -2
- package/src/methods/utils/virtualBackgroundCompositor.ts +53 -0
- package/src/methods/whiteboard/captureCanvasStream.ts +2 -2
- package/src/producers/producerEmits/joinConRoom.ts +1 -1
- package/src/producers/producerEmits/joinRoom.ts +1 -1
- package/src/types/index.ts +1 -0
- package/src/types/shared-base-types.ts +2 -3
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
import { HeadlessOptions, HeadlessParameters } from './headlessTypes';
|
|
2
|
+
|
|
3
|
+
/* ------------------------------------------------------------------ *
|
|
4
|
+
* Recording notices and limits
|
|
5
|
+
* ------------------------------------------------------------------ */
|
|
6
|
+
|
|
7
|
+
export interface RecordingNotice {
|
|
8
|
+
/** The SDK's current recording notice, or '' when there is none. */
|
|
9
|
+
message: string;
|
|
10
|
+
/** Formatted elapsed time as the SDK reports it (e.g. "00:12:04"). */
|
|
11
|
+
elapsed: string;
|
|
12
|
+
/** Elapsed seconds. */
|
|
13
|
+
elapsedSeconds: number;
|
|
14
|
+
/** True while pause/resume is permitted (the SDK enforces a cooldown). */
|
|
15
|
+
canPauseResume: boolean;
|
|
16
|
+
/** Pauses used so far. */
|
|
17
|
+
pausesUsed: number;
|
|
18
|
+
/** Pauses allowed for the active media type; 0 when unpublished. */
|
|
19
|
+
pauseLimit: number;
|
|
20
|
+
/** True when the pause allowance is exhausted. */
|
|
21
|
+
pauseLimitReached: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type GetRecordingNoticeType = (options: HeadlessOptions) => RecordingNotice;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The user-facing side of recording: the notice, the timer, and the pause
|
|
28
|
+
* allowance.
|
|
29
|
+
*
|
|
30
|
+
* Pause limits are per media type — `recordingAudioPausesLimit` vs
|
|
31
|
+
* `recordingVideoPausesLimit` — and the SDK picks by `recordingMediaOptions`.
|
|
32
|
+
* Reading the wrong one reports the wrong allowance, which is why this is a
|
|
33
|
+
* helper rather than a field read. Complements `getRecordingState`, which
|
|
34
|
+
* covers only the start/pause/resume/stop status.
|
|
35
|
+
*/
|
|
36
|
+
export function getRecordingNotice({ parameters }: HeadlessOptions): RecordingNotice {
|
|
37
|
+
const source: HeadlessParameters = parameters || {};
|
|
38
|
+
const isAudio = source.recordingMediaOptions === 'audio';
|
|
39
|
+
const pauseLimit = Number(
|
|
40
|
+
isAudio ? source.recordingAudioPausesLimit : source.recordingVideoPausesLimit
|
|
41
|
+
) || 0;
|
|
42
|
+
const pausesUsed = Number(source.pauseRecordCount) || 0;
|
|
43
|
+
return {
|
|
44
|
+
message: source.recordingNotice || '',
|
|
45
|
+
elapsed: source.recordingProgressTime || '00:00:00',
|
|
46
|
+
elapsedSeconds: Number(source.recordElapsedTime) || 0,
|
|
47
|
+
canPauseResume: source.canPauseResume === true,
|
|
48
|
+
pausesUsed,
|
|
49
|
+
pauseLimit,
|
|
50
|
+
pauseLimitReached: pauseLimit > 0 && pausesUsed >= pauseLimit,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface RecordingCapabilities {
|
|
55
|
+
/** Recording audio at all. */
|
|
56
|
+
audio: boolean;
|
|
57
|
+
/** Recording video at all. */
|
|
58
|
+
video: boolean;
|
|
59
|
+
/** Recording every participant, not just the active speaker. */
|
|
60
|
+
allParticipants: boolean;
|
|
61
|
+
/** Recording every participant's video. */
|
|
62
|
+
videoParticipants: boolean;
|
|
63
|
+
/** Adding an HLS output. */
|
|
64
|
+
hls: boolean;
|
|
65
|
+
/** Max people included in an audio recording; 0 when unpublished. */
|
|
66
|
+
audioPeopleLimit: number;
|
|
67
|
+
/** Max people included in a video recording; 0 when unpublished. */
|
|
68
|
+
videoPeopleLimit: number;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type GetRecordingCapabilitiesType = (
|
|
72
|
+
options: HeadlessOptions
|
|
73
|
+
) => RecordingCapabilities;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* What this room's plan actually permits recording.
|
|
77
|
+
*
|
|
78
|
+
* These are entitlement flags the server publishes per room, so a UI should
|
|
79
|
+
* gate on them rather than offering options the room will refuse.
|
|
80
|
+
*/
|
|
81
|
+
export function getRecordingCapabilities({
|
|
82
|
+
parameters,
|
|
83
|
+
}: HeadlessOptions): RecordingCapabilities {
|
|
84
|
+
const source: HeadlessParameters = parameters || {};
|
|
85
|
+
return {
|
|
86
|
+
audio: source.recordingAudioSupport === true,
|
|
87
|
+
video: source.recordingVideoSupport === true,
|
|
88
|
+
allParticipants: source.recordingAllParticipantsSupport === true,
|
|
89
|
+
videoParticipants: source.recordingVideoParticipantsSupport === true,
|
|
90
|
+
hls: source.recordingAddHLS === true,
|
|
91
|
+
audioPeopleLimit: Number(source.recordingAudioPeopleLimit) || 0,
|
|
92
|
+
videoPeopleLimit: Number(source.recordingVideoPeopleLimit) || 0,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* ------------------------------------------------------------------ *
|
|
97
|
+
* Translation
|
|
98
|
+
* ------------------------------------------------------------------ */
|
|
99
|
+
|
|
100
|
+
export interface TranslationPreference {
|
|
101
|
+
/** Language applied to every speaker, or null when unset. */
|
|
102
|
+
globalLanguage: string | null;
|
|
103
|
+
/** Per-speaker overrides, keyed by speaker id. */
|
|
104
|
+
perSpeaker: { speakerId: string; language: string | null; wantOriginal: boolean }[];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface TranslationState extends TranslationPreference {
|
|
108
|
+
/** True when any translation is currently being consumed. */
|
|
109
|
+
active: boolean;
|
|
110
|
+
/** Languages the room currently has translation producers for. */
|
|
111
|
+
availableLanguages: string[];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export type GetTranslationStateType = (options: HeadlessOptions) => TranslationState;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* What the listener is currently hearing, and what is on offer.
|
|
118
|
+
*
|
|
119
|
+
* `listenerTranslationPreferences.perSpeaker` is a `Map` on the bag, which does
|
|
120
|
+
* not survive serialisation or spread; this returns a plain array so it can be
|
|
121
|
+
* rendered and compared normally. Translation audio itself already reaches the
|
|
122
|
+
* user through `getAudioGridComponents`, which folds in `translationStreams`.
|
|
123
|
+
*/
|
|
124
|
+
export function getTranslationState({ parameters }: HeadlessOptions): TranslationState {
|
|
125
|
+
const source: HeadlessParameters = parameters || {};
|
|
126
|
+
const preferences: any = source.listenerTranslationPreferences || {};
|
|
127
|
+
const perSpeakerMap = preferences.perSpeaker;
|
|
128
|
+
const perSpeaker = perSpeakerMap instanceof Map
|
|
129
|
+
? Array.from(perSpeakerMap.values())
|
|
130
|
+
: Array.isArray(perSpeakerMap) ? perSpeakerMap : [];
|
|
131
|
+
|
|
132
|
+
const speakerStates: any = source.speakerTranslationStates;
|
|
133
|
+
const languages = new Set<string>();
|
|
134
|
+
const collect = (value: any) => {
|
|
135
|
+
if (value?.language) languages.add(value.language);
|
|
136
|
+
};
|
|
137
|
+
if (speakerStates instanceof Map) speakerStates.forEach(collect);
|
|
138
|
+
else if (Array.isArray(speakerStates)) speakerStates.forEach(collect);
|
|
139
|
+
perSpeaker.forEach(collect);
|
|
140
|
+
if (preferences.globalLanguage) languages.add(preferences.globalLanguage);
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
globalLanguage: preferences.globalLanguage ?? null,
|
|
144
|
+
perSpeaker,
|
|
145
|
+
active: Boolean(
|
|
146
|
+
preferences.globalLanguage
|
|
147
|
+
|| perSpeaker.some((entry) => entry?.language && !entry.wantOriginal)
|
|
148
|
+
),
|
|
149
|
+
availableLanguages: Array.from(languages),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export interface SetTranslationPreferenceOptions extends HeadlessOptions {
|
|
154
|
+
/** Language for every speaker. `null` restores the original audio. */
|
|
155
|
+
language?: string | null;
|
|
156
|
+
/** Limit the change to one speaker. */
|
|
157
|
+
speakerId?: string;
|
|
158
|
+
/** Explicitly prefer the untranslated audio for this speaker. */
|
|
159
|
+
wantOriginal?: boolean;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export type SetTranslationPreferenceType = (
|
|
163
|
+
options: SetTranslationPreferenceOptions
|
|
164
|
+
) => { ok: boolean; error: string };
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Choose a translation language, globally or for one speaker.
|
|
168
|
+
*
|
|
169
|
+
* Delegates to the SDK's `updateListenerTranslationPreferences`, which is what
|
|
170
|
+
* syncs the choice to the server for routing and billing — setting the bag's
|
|
171
|
+
* fields directly would change local state without telling the server.
|
|
172
|
+
*/
|
|
173
|
+
export function setTranslationPreference({
|
|
174
|
+
parameters,
|
|
175
|
+
language = null,
|
|
176
|
+
speakerId,
|
|
177
|
+
wantOriginal = false,
|
|
178
|
+
}: SetTranslationPreferenceOptions): { ok: boolean; error: string } {
|
|
179
|
+
const source: HeadlessParameters = parameters || {};
|
|
180
|
+
const update = source.updateListenerTranslationPreferences;
|
|
181
|
+
if (typeof update !== 'function') {
|
|
182
|
+
return { ok: false, error: 'Translation is not available in this room.' };
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
const current: any = source.listenerTranslationPreferences || {};
|
|
186
|
+
const perSpeaker = current.perSpeaker instanceof Map
|
|
187
|
+
? new Map(current.perSpeaker)
|
|
188
|
+
: new Map();
|
|
189
|
+
if (speakerId) {
|
|
190
|
+
perSpeaker.set(speakerId, { speakerId, language, wantOriginal });
|
|
191
|
+
update({ perSpeaker, globalLanguage: current.globalLanguage ?? null });
|
|
192
|
+
} else {
|
|
193
|
+
update({ perSpeaker, globalLanguage: language });
|
|
194
|
+
}
|
|
195
|
+
return { ok: true, error: '' };
|
|
196
|
+
} catch (error: any) {
|
|
197
|
+
return { ok: false, error: error?.message || 'The translation preference could not be set.' };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* ------------------------------------------------------------------ *
|
|
202
|
+
* Panelists and focus mode
|
|
203
|
+
* ------------------------------------------------------------------ */
|
|
204
|
+
|
|
205
|
+
export interface FocusModeState {
|
|
206
|
+
/** True while focus mode is active. */
|
|
207
|
+
active: boolean;
|
|
208
|
+
/** Participants permitted to speak/appear while focus mode is on. */
|
|
209
|
+
panelists: { name: string; [key: string]: any }[];
|
|
210
|
+
/** True when the local user is one of them. */
|
|
211
|
+
selfIsPanelist: boolean;
|
|
212
|
+
/** True when focus mode silences non-panelist microphones. */
|
|
213
|
+
mutesMicrophones: boolean;
|
|
214
|
+
/** True when focus mode blocks non-panelist cameras. */
|
|
215
|
+
mutesCameras: boolean;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export type GetFocusModeStateType = (options: HeadlessOptions) => FocusModeState;
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Focus-mode ("only panelists") state.
|
|
222
|
+
*
|
|
223
|
+
* The field is `muteOthersCamera`, not `muteOthersVideo` — worth stating,
|
|
224
|
+
* because the neighbouring flag is `muteOthersMic` and the asymmetry invites a
|
|
225
|
+
* wrong guess. {@link getMediaPermissions} already applies these rules to the
|
|
226
|
+
* local user; this exposes the room-level picture for a roster UI.
|
|
227
|
+
*/
|
|
228
|
+
export function getFocusModeState({ parameters }: HeadlessOptions): FocusModeState {
|
|
229
|
+
const source: HeadlessParameters = parameters || {};
|
|
230
|
+
const panelists = Array.isArray(source.panelists) ? source.panelists : [];
|
|
231
|
+
return {
|
|
232
|
+
active: source.panelistsFocused === true,
|
|
233
|
+
panelists,
|
|
234
|
+
selfIsPanelist: panelists.some((entry: any) => entry?.name === source.member),
|
|
235
|
+
mutesMicrophones: source.muteOthersMic === true,
|
|
236
|
+
mutesCameras: source.muteOthersCamera === true,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* ------------------------------------------------------------------ *
|
|
241
|
+
* Virtual background
|
|
242
|
+
* ------------------------------------------------------------------ */
|
|
243
|
+
|
|
244
|
+
export interface VirtualBackgroundState {
|
|
245
|
+
/** True when a processed (background-applied) stream is being published. */
|
|
246
|
+
active: boolean;
|
|
247
|
+
/** The processed stream, when one exists. */
|
|
248
|
+
stream: MediaStream | null;
|
|
249
|
+
/** The background currently applied, if the SDK reports one. */
|
|
250
|
+
appliedBackground: any;
|
|
251
|
+
/** The image the user selected, if any. */
|
|
252
|
+
selectedImage: string | null;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export type GetVirtualBackgroundStateType = (
|
|
256
|
+
options: HeadlessOptions
|
|
257
|
+
) => VirtualBackgroundState;
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Read-only virtual-background state.
|
|
261
|
+
*
|
|
262
|
+
* **You do not need this to render the right self-view.**
|
|
263
|
+
* `getLocalVideoStream` already returns the processed `virtualStream` whenever
|
|
264
|
+
* `keepBackground` is on, and the raw camera otherwise — the same rule the SDK's
|
|
265
|
+
* own grid uses. Rendering `localStreamVideo` directly is what shows a user
|
|
266
|
+
* their *unprocessed* background, so prefer the helper and ignore this.
|
|
267
|
+
*
|
|
268
|
+
* This exists for UI that needs to *describe* the state ("Background on"), not
|
|
269
|
+
* to choose a stream.
|
|
270
|
+
*
|
|
271
|
+
* Known gap: applying or clearing a background is still modal-driven in the SDK
|
|
272
|
+
* (`isBackgroundModalVisible` / `autoClickBackground`), so a `returnUI={false}`
|
|
273
|
+
* surface cannot currently turn a background on by itself. Reading works
|
|
274
|
+
* headlessly; controlling does not.
|
|
275
|
+
*/
|
|
276
|
+
export function getVirtualBackgroundState({
|
|
277
|
+
parameters,
|
|
278
|
+
}: HeadlessOptions): VirtualBackgroundState {
|
|
279
|
+
const source: HeadlessParameters = parameters || {};
|
|
280
|
+
const stream = (source.virtualStream || source.processedStream) as MediaStream | null;
|
|
281
|
+
return {
|
|
282
|
+
active: source.keepBackground === true && Boolean(stream),
|
|
283
|
+
stream: stream || null,
|
|
284
|
+
appliedBackground: source.appliedBackground ?? null,
|
|
285
|
+
selectedImage: source.selectedImage ?? null,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/* ------------------------------------------------------------------ *
|
|
290
|
+
* Local playback control (per-participant)
|
|
291
|
+
* ------------------------------------------------------------------ */
|
|
292
|
+
|
|
293
|
+
export interface SetParticipantPlaybackOptions extends HeadlessOptions {
|
|
294
|
+
/** Participant display name. */
|
|
295
|
+
name?: string;
|
|
296
|
+
/** Producer id, when you already hold one. */
|
|
297
|
+
producerId?: string;
|
|
298
|
+
/** Which of their tracks to affect. Defaults to both. */
|
|
299
|
+
kind?: 'audio' | 'video' | 'all';
|
|
300
|
+
/** True to stop receiving, false to resume. */
|
|
301
|
+
paused: boolean;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export type SetParticipantPlaybackType = (
|
|
305
|
+
options: SetParticipantPlaybackOptions
|
|
306
|
+
) => Promise<{ ok: boolean; error: string; affected: number }>;
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Producer ids this viewer has locally paused.
|
|
310
|
+
*
|
|
311
|
+
* Module-level rather than on the parameter bag: the SDK owns that bag and
|
|
312
|
+
* rebuilds it, and this is a purely local preference that must survive those
|
|
313
|
+
* rebuilds so `reapplyLocalPlayback` can re-assert it after a layout pass.
|
|
314
|
+
*/
|
|
315
|
+
const LOCALLY_PAUSED = new Set<string>();
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Stop or resume playing one participant's media **for you only**.
|
|
319
|
+
*
|
|
320
|
+
* This is a local, per-viewer control — "don't play this person to me right
|
|
321
|
+
* now". It pauses the mediasoup consumer, so the server stops sending that
|
|
322
|
+
* track to you: it saves bandwidth as well as silencing them, and it is
|
|
323
|
+
* invisible to everyone else. It is NOT moderation — the participant keeps
|
|
324
|
+
* publishing and other people keep receiving. Use `setParticipantMedia` from
|
|
325
|
+
* the moderation module to actually stop someone's media for the room.
|
|
326
|
+
*
|
|
327
|
+
* Note this is deliberately not `resumePauseStreams`, which the SDK drives from
|
|
328
|
+
* the active-speaker layout (`dispActiveNames`) and will happily undo a manual
|
|
329
|
+
* choice on its next pass. This targets the consumer directly.
|
|
330
|
+
*
|
|
331
|
+
* @example
|
|
332
|
+
* ```ts
|
|
333
|
+
* // Stop hearing and seeing Paul locally
|
|
334
|
+
* await setParticipantPlayback({ parameters, name: 'Paul', paused: true });
|
|
335
|
+
* // Just their audio
|
|
336
|
+
* await setParticipantPlayback({ parameters, name: 'Paul', kind: 'audio', paused: true });
|
|
337
|
+
* ```
|
|
338
|
+
*/
|
|
339
|
+
export async function setParticipantPlayback({
|
|
340
|
+
parameters,
|
|
341
|
+
name = '',
|
|
342
|
+
producerId = '',
|
|
343
|
+
kind = 'all',
|
|
344
|
+
paused,
|
|
345
|
+
}: SetParticipantPlaybackOptions): Promise<{ ok: boolean; error: string; affected: number }> {
|
|
346
|
+
try {
|
|
347
|
+
const source: HeadlessParameters = parameters || {};
|
|
348
|
+
const participants = Array.isArray(source.participants) ? source.participants : [];
|
|
349
|
+
const participant = name
|
|
350
|
+
? participants.find((part: any) => part?.name === name)
|
|
351
|
+
: undefined;
|
|
352
|
+
|
|
353
|
+
const targets = new Set<string>();
|
|
354
|
+
if (producerId) targets.add(producerId);
|
|
355
|
+
const usable = (value: unknown) =>
|
|
356
|
+
typeof value === 'string' && value.length > 3 && value.toLowerCase() !== 'none';
|
|
357
|
+
if (participant) {
|
|
358
|
+
if (kind !== 'video' && usable(participant.audioID)) targets.add(participant.audioID as string);
|
|
359
|
+
if (kind !== 'audio' && usable(participant.videoID)) targets.add(participant.videoID as string);
|
|
360
|
+
}
|
|
361
|
+
if (targets.size === 0) {
|
|
362
|
+
return { ok: false, error: 'That participant is not publishing anything to pause.', affected: 0 };
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
const transports = Array.isArray(source.consumerTransports) ? source.consumerTransports : [];
|
|
366
|
+
let affected = 0;
|
|
367
|
+
for (const entry of transports as any[]) {
|
|
368
|
+
const consumer = entry?.consumer;
|
|
369
|
+
const id = entry?.producerId || consumer?.producerId;
|
|
370
|
+
if (!consumer || !targets.has(id)) continue;
|
|
371
|
+
if (kind !== 'all' && consumer.track?.kind !== kind) continue;
|
|
372
|
+
try {
|
|
373
|
+
if (paused && typeof consumer.pause === 'function') {
|
|
374
|
+
await consumer.pause();
|
|
375
|
+
LOCALLY_PAUSED.add(id);
|
|
376
|
+
affected += 1;
|
|
377
|
+
} else if (!paused && typeof consumer.resume === 'function') {
|
|
378
|
+
await consumer.resume();
|
|
379
|
+
LOCALLY_PAUSED.delete(id);
|
|
380
|
+
affected += 1;
|
|
381
|
+
}
|
|
382
|
+
} catch {
|
|
383
|
+
// One failed consumer must not abort the rest.
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return affected > 0
|
|
387
|
+
? { ok: true, error: '', affected }
|
|
388
|
+
: { ok: false, error: 'No matching incoming stream was found.', affected: 0 };
|
|
389
|
+
} catch (error: any) {
|
|
390
|
+
return { ok: false, error: error?.message || 'The playback change failed.', affected: 0 };
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/* ------------------------------------------------------------------ *
|
|
395
|
+
* Breakout room composition
|
|
396
|
+
* ------------------------------------------------------------------ */
|
|
397
|
+
|
|
398
|
+
export type BreakoutParticipantRef = { name: string; breakRoom: number };
|
|
399
|
+
|
|
400
|
+
export interface SetBreakoutRoomsOptions extends HeadlessOptions {
|
|
401
|
+
/** Room composition: index in the outer array is the room number. */
|
|
402
|
+
rooms: BreakoutParticipantRef[][];
|
|
403
|
+
/** What happens to people who join later. Defaults to the room's setting. */
|
|
404
|
+
newParticipantAction?: string;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
export type SetBreakoutRoomsType = (
|
|
408
|
+
options: SetBreakoutRoomsOptions
|
|
409
|
+
) => Promise<{ ok: boolean; error: string }>;
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Publish a full breakout-room composition.
|
|
413
|
+
*
|
|
414
|
+
* The SDK models breakout rooms as an array of arrays — outer index is the room
|
|
415
|
+
* number, inner entries are `{ name, breakRoom }`. Adding, removing, or moving
|
|
416
|
+
* someone is therefore just editing that array and re-emitting it; there is no
|
|
417
|
+
* per-participant verb. `startBreakout` opens them, `updateBreakout` amends a
|
|
418
|
+
* running set, and the SDK picks by whether they are already started.
|
|
419
|
+
*
|
|
420
|
+
* Prefer {@link assignParticipantToBreakoutRoom} for single-person changes.
|
|
421
|
+
*/
|
|
422
|
+
export async function setBreakoutRooms({
|
|
423
|
+
parameters,
|
|
424
|
+
rooms,
|
|
425
|
+
newParticipantAction,
|
|
426
|
+
}: SetBreakoutRoomsOptions): Promise<{ ok: boolean; error: string }> {
|
|
427
|
+
try {
|
|
428
|
+
const source: HeadlessParameters = parameters || {};
|
|
429
|
+
const socket = source.socket;
|
|
430
|
+
if (!socket || typeof socket.emit !== 'function' || !source.roomName) {
|
|
431
|
+
return { ok: false, error: 'The room connection is not ready.' };
|
|
432
|
+
}
|
|
433
|
+
if (String(source.islevel) !== '2') {
|
|
434
|
+
return { ok: false, error: 'Only the host can change breakout rooms.' };
|
|
435
|
+
}
|
|
436
|
+
const running = source.breakOutRoomStarted === true && source.breakOutRoomEnded !== true;
|
|
437
|
+
const event = running ? 'updateBreakout' : 'startBreakout';
|
|
438
|
+
// Strip anything beyond the two fields the server accepts.
|
|
439
|
+
const payload = (Array.isArray(rooms) ? rooms : []).map((room) =>
|
|
440
|
+
(Array.isArray(room) ? room : []).map(({ name, breakRoom }) => ({ name, breakRoom }))
|
|
441
|
+
);
|
|
442
|
+
|
|
443
|
+
const response = await new Promise<any>((resolve) => {
|
|
444
|
+
socket.emit(
|
|
445
|
+
event,
|
|
446
|
+
{
|
|
447
|
+
breakoutRooms: payload,
|
|
448
|
+
newParticipantAction: newParticipantAction || source.newParticipantAction || 'autoAssignNewRoom',
|
|
449
|
+
roomName: source.roomName,
|
|
450
|
+
},
|
|
451
|
+
resolve
|
|
452
|
+
);
|
|
453
|
+
});
|
|
454
|
+
if (!response?.success) {
|
|
455
|
+
return { ok: false, error: response?.reason || 'The breakout rooms could not be updated.' };
|
|
456
|
+
}
|
|
457
|
+
source.updateBreakoutRooms?.(payload);
|
|
458
|
+
source.updateBreakOutRoomStarted?.(true);
|
|
459
|
+
source.updateBreakOutRoomEnded?.(false);
|
|
460
|
+
return { ok: true, error: '' };
|
|
461
|
+
} catch (error: any) {
|
|
462
|
+
return { ok: false, error: error?.message || 'The breakout rooms could not be updated.' };
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
export interface AssignParticipantToBreakoutRoomOptions extends HeadlessOptions {
|
|
467
|
+
/** Participant display name. */
|
|
468
|
+
name: string;
|
|
469
|
+
/** Destination room index, or `null` to remove them from breakout rooms. */
|
|
470
|
+
room: number | null;
|
|
471
|
+
newParticipantAction?: string;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
export type AssignParticipantToBreakoutRoomType = (
|
|
475
|
+
options: AssignParticipantToBreakoutRoomOptions
|
|
476
|
+
) => Promise<{ ok: boolean; error: string }>;
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Add, move, or remove one participant, without rebuilding the whole array.
|
|
480
|
+
*
|
|
481
|
+
* Covers all three cases the composition array makes awkward by hand:
|
|
482
|
+
* `room: 1` adds them to room 1 (or moves them there from wherever they are),
|
|
483
|
+
* `room: null` removes them from breakout rooms entirely. Empty trailing rooms
|
|
484
|
+
* are preserved, because room numbers are positional and collapsing them would
|
|
485
|
+
* silently renumber everyone else.
|
|
486
|
+
*
|
|
487
|
+
* @example
|
|
488
|
+
* ```ts
|
|
489
|
+
* await assignParticipantToBreakoutRoom({ parameters, name: 'Ada', room: 0 }); // add
|
|
490
|
+
* await assignParticipantToBreakoutRoom({ parameters, name: 'Ada', room: 1 }); // move 0 -> 1
|
|
491
|
+
* await assignParticipantToBreakoutRoom({ parameters, name: 'Ada', room: null }); // remove
|
|
492
|
+
* ```
|
|
493
|
+
*/
|
|
494
|
+
export async function assignParticipantToBreakoutRoom({
|
|
495
|
+
parameters,
|
|
496
|
+
name,
|
|
497
|
+
room,
|
|
498
|
+
newParticipantAction,
|
|
499
|
+
}: AssignParticipantToBreakoutRoomOptions): Promise<{ ok: boolean; error: string }> {
|
|
500
|
+
const source: HeadlessParameters = parameters || {};
|
|
501
|
+
if (!name) return { ok: false, error: 'A participant name is required.' };
|
|
502
|
+
|
|
503
|
+
const current: BreakoutParticipantRef[][] = Array.isArray(source.breakoutRooms)
|
|
504
|
+
? source.breakoutRooms.map((entry: any) => (Array.isArray(entry) ? [...entry] : []))
|
|
505
|
+
: [];
|
|
506
|
+
// Remove them from wherever they are, keeping room indices stable.
|
|
507
|
+
const next = current.map((entry) => entry.filter((person: any) => person?.name !== name));
|
|
508
|
+
|
|
509
|
+
if (room !== null && room !== undefined) {
|
|
510
|
+
if (!Number.isInteger(room) || room < 0) {
|
|
511
|
+
return { ok: false, error: 'The destination room must be a room index.' };
|
|
512
|
+
}
|
|
513
|
+
while (next.length <= room) next.push([]);
|
|
514
|
+
next[room].push({ name, breakRoom: room });
|
|
515
|
+
}
|
|
516
|
+
return setBreakoutRooms({ parameters: source, rooms: next, newParticipantAction });
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
export type StopBreakoutRoomsType = (
|
|
520
|
+
options: HeadlessOptions
|
|
521
|
+
) => Promise<{ ok: boolean; error: string }>;
|
|
522
|
+
|
|
523
|
+
/** Close every breakout room and return everyone to the main room. */
|
|
524
|
+
export async function stopBreakoutRooms({
|
|
525
|
+
parameters,
|
|
526
|
+
}: HeadlessOptions): Promise<{ ok: boolean; error: string }> {
|
|
527
|
+
try {
|
|
528
|
+
const source: HeadlessParameters = parameters || {};
|
|
529
|
+
const socket = source.socket;
|
|
530
|
+
if (!socket || typeof socket.emit !== 'function' || !source.roomName) {
|
|
531
|
+
return { ok: false, error: 'The room connection is not ready.' };
|
|
532
|
+
}
|
|
533
|
+
if (String(source.islevel) !== '2') {
|
|
534
|
+
return { ok: false, error: 'Only the host can stop breakout rooms.' };
|
|
535
|
+
}
|
|
536
|
+
const response = await new Promise<any>((resolve) => {
|
|
537
|
+
socket.emit('stopBreakout', { roomName: source.roomName }, resolve);
|
|
538
|
+
});
|
|
539
|
+
if (!response?.success) {
|
|
540
|
+
return { ok: false, error: response?.reason || 'The breakout rooms could not be stopped.' };
|
|
541
|
+
}
|
|
542
|
+
source.updateBreakOutRoomStarted?.(false);
|
|
543
|
+
source.updateBreakOutRoomEnded?.(true);
|
|
544
|
+
return { ok: true, error: '' };
|
|
545
|
+
} catch (error: any) {
|
|
546
|
+
return { ok: false, error: error?.message || 'The breakout rooms could not be stopped.' };
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
export type ReapplyLocalPlaybackType = (
|
|
551
|
+
options: HeadlessOptions
|
|
552
|
+
) => Promise<{ ok: boolean; error: string; affected: number }>;
|
|
553
|
+
|
|
554
|
+
/**
|
|
555
|
+
* Re-assert every local playback choice.
|
|
556
|
+
*
|
|
557
|
+
* Call this whenever media changes — `onMediaChanged` is the natural place. The
|
|
558
|
+
* SDK layout pass resumes consumers it believes should be visible, which would
|
|
559
|
+
* otherwise silently undo "do not play this person to me" the moment the active
|
|
560
|
+
* speaker changes. Without this the feature appears to work and then quietly
|
|
561
|
+
* stops working, which is worse than not having it.
|
|
562
|
+
*
|
|
563
|
+
* A no-op when nothing is locally paused.
|
|
564
|
+
*/
|
|
565
|
+
export async function reapplyLocalPlayback({
|
|
566
|
+
parameters,
|
|
567
|
+
}: HeadlessOptions): Promise<{ ok: boolean; error: string; affected: number }> {
|
|
568
|
+
if (LOCALLY_PAUSED.size === 0) return { ok: true, error: '', affected: 0 };
|
|
569
|
+
try {
|
|
570
|
+
const source: HeadlessParameters = parameters || {};
|
|
571
|
+
const transports = Array.isArray(source.consumerTransports) ? source.consumerTransports : [];
|
|
572
|
+
let affected = 0;
|
|
573
|
+
for (const entry of transports as any[]) {
|
|
574
|
+
const consumer = entry?.consumer;
|
|
575
|
+
const id = entry?.producerId || consumer?.producerId;
|
|
576
|
+
if (!consumer || !LOCALLY_PAUSED.has(id)) continue;
|
|
577
|
+
if (consumer.paused === true) continue;
|
|
578
|
+
try {
|
|
579
|
+
if (typeof consumer.pause === 'function') { await consumer.pause(); affected += 1; }
|
|
580
|
+
} catch {
|
|
581
|
+
// Re-assertion is best-effort; a closed consumer is not an error.
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
return { ok: true, error: '', affected };
|
|
585
|
+
} catch (error: any) {
|
|
586
|
+
return { ok: false, error: error?.message || 'Playback could not be re-applied.', affected: 0 };
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/** Producer ids currently muted for this viewer only. */
|
|
591
|
+
export function getLocallyPausedProducerIds(): string[] {
|
|
592
|
+
return Array.from(LOCALLY_PAUSED);
|
|
593
|
+
}
|