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,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Viewers who are part of a session without joining the room.
|
|
3
|
+
*
|
|
4
|
+
* **Why this exists.** Joining a MediaSFU room auto-consumes WebRTC: the SDK
|
|
5
|
+
* creates consumers from the server's `newProducer` events, unconditionally —
|
|
6
|
+
* there is no receive-nothing mode. For a large passive audience watching over
|
|
7
|
+
* HLS that is pure waste: transports, consumers and layout churn for media they
|
|
8
|
+
* will never render. Joining and then pausing the consumers is worse than it
|
|
9
|
+
* looks, because the layout pass keeps resuming them.
|
|
10
|
+
*
|
|
11
|
+
* So an HLS viewer does not join at all. They hold a *viewer session* instead —
|
|
12
|
+
* enough to be counted, to raise a hand, and to be told when the host approves —
|
|
13
|
+
* and they only perform a real SDK join at the moment they reach the floor.
|
|
14
|
+
*
|
|
15
|
+
* How that session is stored is deliberately not decided here. The transport,
|
|
16
|
+
* lifecycle and state machine are the SDK's business; issuing playback URLs and
|
|
17
|
+
* tracking presence belong to whatever backend you run. You supply a
|
|
18
|
+
* `ViewerSessionProvider`; this drives it. Same reasoning as `hlsFactory`: the
|
|
19
|
+
* SDK owns the mechanism, the app owns the dependency.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export type ViewerSessionPhase =
|
|
23
|
+
| 'idle'
|
|
24
|
+
| 'joining'
|
|
25
|
+
| 'watching'
|
|
26
|
+
| 'requested'
|
|
27
|
+
| 'approved'
|
|
28
|
+
| 'left'
|
|
29
|
+
| 'error';
|
|
30
|
+
|
|
31
|
+
export interface ViewerSessionIdentity {
|
|
32
|
+
/** Opaque id for this viewer, issued by the provider. */
|
|
33
|
+
viewerId: string;
|
|
34
|
+
/** The room being watched. */
|
|
35
|
+
roomName: string;
|
|
36
|
+
/** Where to play from. Absent until the provider issues one. */
|
|
37
|
+
playbackUrl?: string;
|
|
38
|
+
/** 'hls' or 'whep'; inferred from the URL when omitted. */
|
|
39
|
+
protocol?: 'hls' | 'whep';
|
|
40
|
+
/** Anything the provider needs handed back on later calls. */
|
|
41
|
+
token?: string;
|
|
42
|
+
[key: string]: any;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ViewerSessionStatus {
|
|
46
|
+
/** True once the host has approved this viewer for the floor. */
|
|
47
|
+
approved: boolean;
|
|
48
|
+
/** True while a request is outstanding. */
|
|
49
|
+
pending?: boolean;
|
|
50
|
+
/** Free-text reason when a request was refused. */
|
|
51
|
+
reason?: string;
|
|
52
|
+
/** Provider may refresh the playback URL (signed URLs expire). */
|
|
53
|
+
playbackUrl?: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* What your backend has to do. Only `join` is required — a provider that just
|
|
58
|
+
* hands back a playback URL is a valid provider, it simply cannot support
|
|
59
|
+
* promotion.
|
|
60
|
+
*/
|
|
61
|
+
export interface ViewerSessionProvider {
|
|
62
|
+
join(options: {
|
|
63
|
+
roomName: string;
|
|
64
|
+
displayName?: string;
|
|
65
|
+
signal?: AbortSignal;
|
|
66
|
+
}): Promise<ViewerSessionIdentity>;
|
|
67
|
+
/** Keep the viewer counted as present. */
|
|
68
|
+
heartbeat?(options: { session: ViewerSessionIdentity; signal?: AbortSignal }): Promise<void>;
|
|
69
|
+
/** Raise a hand for the floor. */
|
|
70
|
+
requestPromotion?(options: { session: ViewerSessionIdentity; signal?: AbortSignal }): Promise<void>;
|
|
71
|
+
/** Has the host decided yet? */
|
|
72
|
+
poll?(options: { session: ViewerSessionIdentity; signal?: AbortSignal }): Promise<ViewerSessionStatus>;
|
|
73
|
+
/** Release the session. */
|
|
74
|
+
leave?(options: { session: ViewerSessionIdentity }): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface ViewerSessionSnapshot {
|
|
78
|
+
phase: ViewerSessionPhase;
|
|
79
|
+
session: ViewerSessionIdentity | null;
|
|
80
|
+
status: ViewerSessionStatus | null;
|
|
81
|
+
error: string;
|
|
82
|
+
/** True when the provider can accept a promotion request at all. */
|
|
83
|
+
canRequestPromotion: boolean;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export interface CreateViewerSessionOptions {
|
|
87
|
+
provider: ViewerSessionProvider;
|
|
88
|
+
roomName: string;
|
|
89
|
+
displayName?: string;
|
|
90
|
+
/** Poll interval for approval, ms. Defaults to 5000. */
|
|
91
|
+
pollIntervalMs?: number;
|
|
92
|
+
/** Heartbeat interval, ms. Defaults to 30000. Ignored without a heartbeat. */
|
|
93
|
+
heartbeatIntervalMs?: number;
|
|
94
|
+
/** Called on every state change. */
|
|
95
|
+
onChange?: (snapshot: ViewerSessionSnapshot) => void;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface ViewerSessionHandle {
|
|
99
|
+
/** Current state, readable at any time. */
|
|
100
|
+
getSnapshot: () => ViewerSessionSnapshot;
|
|
101
|
+
/** Register with the provider and begin watching. */
|
|
102
|
+
start: () => Promise<ViewerSessionSnapshot>;
|
|
103
|
+
/** Raise a hand for the floor. */
|
|
104
|
+
requestPromotion: () => Promise<ViewerSessionSnapshot>;
|
|
105
|
+
/** Stop everything and release the session. */
|
|
106
|
+
stop: () => Promise<void>;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const MIN_INTERVAL_MS = 1000;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Drive a viewer session.
|
|
113
|
+
*
|
|
114
|
+
* Deliberately framework-agnostic — no hooks, no observables — so the same
|
|
115
|
+
* implementation serves React, Vue and Angular. Wrap it in whatever your
|
|
116
|
+
* framework prefers.
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```ts
|
|
120
|
+
* const viewer = createViewerSession({
|
|
121
|
+
* provider: myProvider,
|
|
122
|
+
* roomName,
|
|
123
|
+
* onChange: (snapshot) => setState(snapshot),
|
|
124
|
+
* });
|
|
125
|
+
* await viewer.start(); // watching over HLS, never joined
|
|
126
|
+
* await viewer.requestPromotion(); // hand raised
|
|
127
|
+
* // when snapshot.phase === 'approved', perform a real SDK join.
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
export function createViewerSession({
|
|
131
|
+
provider,
|
|
132
|
+
roomName,
|
|
133
|
+
displayName,
|
|
134
|
+
pollIntervalMs = 5000,
|
|
135
|
+
heartbeatIntervalMs = 30000,
|
|
136
|
+
onChange,
|
|
137
|
+
}: CreateViewerSessionOptions): ViewerSessionHandle {
|
|
138
|
+
let snapshot: ViewerSessionSnapshot = {
|
|
139
|
+
phase: 'idle',
|
|
140
|
+
session: null,
|
|
141
|
+
status: null,
|
|
142
|
+
error: '',
|
|
143
|
+
canRequestPromotion: typeof provider?.requestPromotion === 'function',
|
|
144
|
+
};
|
|
145
|
+
let pollTimer: any = null;
|
|
146
|
+
let heartbeatTimer: any = null;
|
|
147
|
+
let stopped = false;
|
|
148
|
+
|
|
149
|
+
const emit = (next: Partial<ViewerSessionSnapshot>) => {
|
|
150
|
+
snapshot = { ...snapshot, ...next };
|
|
151
|
+
try {
|
|
152
|
+
onChange?.(snapshot);
|
|
153
|
+
} catch {
|
|
154
|
+
// A consumer's observer must never break the session.
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const clearTimers = () => {
|
|
159
|
+
if (pollTimer) { clearInterval(pollTimer); pollTimer = null; }
|
|
160
|
+
if (heartbeatTimer) { clearInterval(heartbeatTimer); heartbeatTimer = null; }
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const startTimers = () => {
|
|
164
|
+
clearTimers();
|
|
165
|
+
if (typeof provider.poll === 'function') {
|
|
166
|
+
pollTimer = setInterval(async () => {
|
|
167
|
+
if (stopped || !snapshot.session) return;
|
|
168
|
+
try {
|
|
169
|
+
const status = await provider.poll!({ session: snapshot.session });
|
|
170
|
+
if (stopped) return;
|
|
171
|
+
// A refreshed URL matters: signed playback URLs expire mid-session,
|
|
172
|
+
// and a silently dead player looks like a broken stream.
|
|
173
|
+
const session = status?.playbackUrl
|
|
174
|
+
? { ...snapshot.session, playbackUrl: status.playbackUrl }
|
|
175
|
+
: snapshot.session;
|
|
176
|
+
emit({
|
|
177
|
+
status,
|
|
178
|
+
session,
|
|
179
|
+
phase: status?.approved ? 'approved' : snapshot.phase === 'requested' ? 'requested' : 'watching',
|
|
180
|
+
});
|
|
181
|
+
// Once approved there is nothing left to poll for.
|
|
182
|
+
if (status?.approved) clearTimers();
|
|
183
|
+
} catch {
|
|
184
|
+
// Transient poll failures are normal; the session is not lost.
|
|
185
|
+
}
|
|
186
|
+
}, Math.max(MIN_INTERVAL_MS, pollIntervalMs));
|
|
187
|
+
}
|
|
188
|
+
if (typeof provider.heartbeat === 'function') {
|
|
189
|
+
heartbeatTimer = setInterval(() => {
|
|
190
|
+
if (stopped || !snapshot.session) return;
|
|
191
|
+
Promise.resolve(provider.heartbeat!({ session: snapshot.session })).catch(() => {});
|
|
192
|
+
}, Math.max(MIN_INTERVAL_MS, heartbeatIntervalMs));
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
return {
|
|
197
|
+
getSnapshot: () => snapshot,
|
|
198
|
+
|
|
199
|
+
async start() {
|
|
200
|
+
if (snapshot.phase !== 'idle' && snapshot.phase !== 'left' && snapshot.phase !== 'error') {
|
|
201
|
+
return snapshot;
|
|
202
|
+
}
|
|
203
|
+
stopped = false;
|
|
204
|
+
emit({ phase: 'joining', error: '' });
|
|
205
|
+
try {
|
|
206
|
+
const session = await provider.join({ roomName, displayName });
|
|
207
|
+
if (stopped) return snapshot;
|
|
208
|
+
if (!session?.viewerId) throw new Error('The viewer session provider returned no viewerId.');
|
|
209
|
+
emit({ phase: 'watching', session, error: '' });
|
|
210
|
+
startTimers();
|
|
211
|
+
} catch (error: any) {
|
|
212
|
+
emit({ phase: 'error', error: error?.message || 'The viewer session could not start.' });
|
|
213
|
+
}
|
|
214
|
+
return snapshot;
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
async requestPromotion() {
|
|
218
|
+
if (!snapshot.session) {
|
|
219
|
+
emit({ error: 'Start the viewer session before requesting the floor.' });
|
|
220
|
+
return snapshot;
|
|
221
|
+
}
|
|
222
|
+
if (typeof provider.requestPromotion !== 'function') {
|
|
223
|
+
emit({ error: 'This viewer session provider does not support promotion.' });
|
|
224
|
+
return snapshot;
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
await provider.requestPromotion({ session: snapshot.session });
|
|
228
|
+
emit({ phase: 'requested', error: '' });
|
|
229
|
+
} catch (error: any) {
|
|
230
|
+
emit({ error: error?.message || 'The request could not be sent.' });
|
|
231
|
+
}
|
|
232
|
+
return snapshot;
|
|
233
|
+
},
|
|
234
|
+
|
|
235
|
+
async stop() {
|
|
236
|
+
stopped = true;
|
|
237
|
+
clearTimers();
|
|
238
|
+
const session = snapshot.session;
|
|
239
|
+
emit({ phase: 'left' });
|
|
240
|
+
if (session && typeof provider.leave === 'function') {
|
|
241
|
+
// Best-effort: teardown often runs during unload.
|
|
242
|
+
try { await provider.leave({ session }); } catch { /* ignore */ }
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { SelfieSegmentation } from '@mediapipe/selfie_segmentation';
|
|
2
|
+
import { HeadlessOptions } from './headlessTypes';
|
|
3
|
+
import { getCurrentParams } from './getCurrentParams';
|
|
4
|
+
import { getLocalVideoStream } from './getMediaStreams';
|
|
5
|
+
import { HeadlessActionResult } from './roomActions';
|
|
6
|
+
import { compositeVirtualBackgroundFrame } from '../virtualBackgroundCompositor';
|
|
7
|
+
|
|
8
|
+
const MEDIAPIPE_CDN = 'https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* One running background session. Kept module-level because the pipeline owns
|
|
12
|
+
* real resources (a MediaPipe instance, a RAF loop, an offscreen canvas) that
|
|
13
|
+
* must be torn down exactly once, and because a second call should replace the
|
|
14
|
+
* first rather than stack another loop on the same camera.
|
|
15
|
+
*/
|
|
16
|
+
interface BackgroundSession {
|
|
17
|
+
stop: () => void;
|
|
18
|
+
stream: MediaStream;
|
|
19
|
+
/** A live raw-camera clone that can be returned to the producer on clear. */
|
|
20
|
+
restoreTrack: MediaStreamTrack | null;
|
|
21
|
+
}
|
|
22
|
+
let session: BackgroundSession | null = null;
|
|
23
|
+
|
|
24
|
+
function loadImage(src: string): Promise<HTMLImageElement> {
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const image = new Image();
|
|
27
|
+
// Backgrounds are usually served cross-origin; without this the canvas is
|
|
28
|
+
// tainted and captureStream() throws a SecurityError instead of producing
|
|
29
|
+
// frames — a failure that looks like "virtual background silently does nothing".
|
|
30
|
+
image.crossOrigin = 'anonymous';
|
|
31
|
+
image.onload = () => resolve(image);
|
|
32
|
+
image.onerror = () => reject(new Error('The background image could not be loaded.'));
|
|
33
|
+
image.src = src;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ApplyVirtualBackgroundOptions extends HeadlessOptions {
|
|
38
|
+
/**
|
|
39
|
+
* Background image URL, or a ready `HTMLImageElement` / `HTMLCanvasElement`.
|
|
40
|
+
* Pass `null` to segment the person onto a transparent background.
|
|
41
|
+
*/
|
|
42
|
+
image: string | HTMLImageElement | HTMLCanvasElement | null;
|
|
43
|
+
/** Capture frame rate for the processed stream. Defaults to 30. */
|
|
44
|
+
frameRate?: number;
|
|
45
|
+
/** MediaPipe model: 0 = general, 1 = landscape (faster). Defaults to 1. */
|
|
46
|
+
modelSelection?: 0 | 1;
|
|
47
|
+
/**
|
|
48
|
+
* Replace the live producer's track so remote viewers see the background
|
|
49
|
+
* immediately. Defaults to true; set false to preview locally first.
|
|
50
|
+
*/
|
|
51
|
+
publish?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Where to load the MediaPipe model and wasm from. Defaults to the jsDelivr
|
|
54
|
+
* CDN. Point this at a self-hosted copy of
|
|
55
|
+
* `node_modules/@mediapipe/selfie_segmentation` for offline or air-gapped
|
|
56
|
+
* deployments, or where a Content-Security-Policy forbids the CDN.
|
|
57
|
+
* A trailing slash is added if missing.
|
|
58
|
+
*/
|
|
59
|
+
assetPath?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type ApplyVirtualBackgroundType = (
|
|
63
|
+
options: ApplyVirtualBackgroundOptions
|
|
64
|
+
) => Promise<HeadlessActionResult & { stream: MediaStream | null }>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Apply a virtual background headlessly — no modal, no DOM of your own.
|
|
68
|
+
*
|
|
69
|
+
* The SDK's own background support lives inside `BackgroundModal`, whose apply
|
|
70
|
+
* path is bound to that component's refs (a preview `<video>` and a `<canvas>`)
|
|
71
|
+
* and is driven by `autoClickBackground` / `isBackgroundModalVisible`. A
|
|
72
|
+
* `returnUI={false}` surface therefore had no way to turn a background on
|
|
73
|
+
* without mounting the modal off-screen and simulating a click.
|
|
74
|
+
*
|
|
75
|
+
* This runs the same MediaPipe pipeline the modal uses — identical compositing:
|
|
76
|
+
* draw the segmentation mask, retain the person with `source-in`, then paint
|
|
77
|
+
* the replacement behind them with `destination-over` — against an offscreen video and
|
|
78
|
+
* canvas it creates and owns.
|
|
79
|
+
*
|
|
80
|
+
* It also keeps the SDK's own state honest (`virtualStream`, `processedStream`,
|
|
81
|
+
* `keepBackground`), so `getLocalVideoStream` keeps returning the right
|
|
82
|
+
* self-view without the caller choosing. Callers should not select the
|
|
83
|
+
* processed stream themselves.
|
|
84
|
+
*
|
|
85
|
+
* The camera must already be on: this processes `localStreamVideo`, it does not
|
|
86
|
+
* acquire one.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* await applyVirtualBackground({ parameters, image: '/backgrounds/office.jpg' });
|
|
91
|
+
* await clearVirtualBackground({ parameters });
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export async function applyVirtualBackground({
|
|
95
|
+
parameters,
|
|
96
|
+
image,
|
|
97
|
+
frameRate = 30,
|
|
98
|
+
modelSelection = 1,
|
|
99
|
+
publish = true,
|
|
100
|
+
assetPath = MEDIAPIPE_CDN,
|
|
101
|
+
}: ApplyVirtualBackgroundOptions): Promise<HeadlessActionResult & { stream: MediaStream | null }> {
|
|
102
|
+
const live = getCurrentParams({ parameters });
|
|
103
|
+
if (live.audioOnlyRoom) {
|
|
104
|
+
return { ok: false, error: 'You cannot use a background in an audio-only event.', stream: null };
|
|
105
|
+
}
|
|
106
|
+
if (typeof document === 'undefined' || typeof window === 'undefined') {
|
|
107
|
+
return { ok: false, error: 'Virtual backgrounds require a browser environment.', stream: null };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Always process the *raw* camera. Reading through getLocalVideoStream would
|
|
111
|
+
// feed an already-processed stream back through segmentation once a
|
|
112
|
+
// background is running, compounding artefacts on every change.
|
|
113
|
+
const camera = (live.localStreamVideo as MediaStream | null)
|
|
114
|
+
|| getLocalVideoStream({ parameters: live });
|
|
115
|
+
const sourceTrack = camera?.getVideoTracks?.()[0] || null;
|
|
116
|
+
if (!sourceTrack || sourceTrack.readyState !== 'live') {
|
|
117
|
+
return { ok: false, error: 'Turn your camera on before applying a background.', stream: null };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const previousSession = session;
|
|
121
|
+
let candidateStop: (() => void) | null = null;
|
|
122
|
+
try {
|
|
123
|
+
const settings = sourceTrack.getSettings ? sourceTrack.getSettings() : {};
|
|
124
|
+
const width = Number(settings.width) || 640;
|
|
125
|
+
const height = Number(settings.height) || 360;
|
|
126
|
+
|
|
127
|
+
const backgroundImage = typeof image === 'string' ? await loadImage(image) : image;
|
|
128
|
+
const producer = publish ? (live.videoProducer || live.localVideoProducer) : null;
|
|
129
|
+
|
|
130
|
+
// mediasoup Producers normally own their track (`stopTracks: true`). Their
|
|
131
|
+
// replaceTrack operation therefore stops the old raw track. Keep MediaPipe
|
|
132
|
+
// on an isolated clone and retain a second live clone for a clean clear.
|
|
133
|
+
const processingTrack = sourceTrack.clone?.();
|
|
134
|
+
if (!processingTrack) throw new Error('This camera cannot create the isolated track required for a virtual background.');
|
|
135
|
+
const restoreTrack = producer ? sourceTrack.clone?.() : sourceTrack;
|
|
136
|
+
if (!restoreTrack) {
|
|
137
|
+
processingTrack.stop();
|
|
138
|
+
throw new Error('This camera cannot preserve a track for restoring the original view.');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const video = document.createElement('video');
|
|
142
|
+
video.autoplay = true;
|
|
143
|
+
video.muted = true;
|
|
144
|
+
video.playsInline = true;
|
|
145
|
+
video.srcObject = new MediaStream([processingTrack]);
|
|
146
|
+
await video.play().catch(() => {});
|
|
147
|
+
|
|
148
|
+
const canvas = document.createElement('canvas');
|
|
149
|
+
canvas.width = width;
|
|
150
|
+
canvas.height = height;
|
|
151
|
+
const ctx = canvas.getContext('2d');
|
|
152
|
+
if (!ctx) throw new Error('This browser cannot composite a background.');
|
|
153
|
+
|
|
154
|
+
const base = assetPath.endsWith('/') ? assetPath.slice(0, -1) : assetPath;
|
|
155
|
+
const segmentation = new SelfieSegmentation({
|
|
156
|
+
locateFile: (file: string) => `${base}/${file}`,
|
|
157
|
+
});
|
|
158
|
+
segmentation.setOptions({ modelSelection, selfieMode: false });
|
|
159
|
+
await segmentation.initialize();
|
|
160
|
+
|
|
161
|
+
// Same compositing as the SDK's modal, so the result is visually identical.
|
|
162
|
+
segmentation.onResults((results: any) => {
|
|
163
|
+
try {
|
|
164
|
+
if (!canvas.width || !canvas.height) return;
|
|
165
|
+
compositeVirtualBackgroundFrame({
|
|
166
|
+
ctx,
|
|
167
|
+
segmentationMask: results.segmentationMask,
|
|
168
|
+
sourceImage: results.image,
|
|
169
|
+
backgroundImage: backgroundImage as CanvasImageSource | null,
|
|
170
|
+
width: canvas.width,
|
|
171
|
+
height: canvas.height,
|
|
172
|
+
});
|
|
173
|
+
} catch {
|
|
174
|
+
// A dropped frame must never kill the loop.
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
let stopped = false;
|
|
179
|
+
let frameHandle = 0;
|
|
180
|
+
const pump = async () => {
|
|
181
|
+
if (stopped) return;
|
|
182
|
+
try {
|
|
183
|
+
if (video.readyState >= 2) await segmentation.send({ image: video });
|
|
184
|
+
} catch {
|
|
185
|
+
// Ignore a single failed frame; the next one is already queued.
|
|
186
|
+
}
|
|
187
|
+
frameHandle = window.requestAnimationFrame(() => { void pump(); });
|
|
188
|
+
};
|
|
189
|
+
void pump();
|
|
190
|
+
|
|
191
|
+
const processed: MediaStream = (canvas as any).captureStream(frameRate);
|
|
192
|
+
if (!processed?.getVideoTracks?.().length) {
|
|
193
|
+
throw new Error('The processed background stream produced no video track.');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const stop = () => {
|
|
197
|
+
if (stopped) return;
|
|
198
|
+
stopped = true;
|
|
199
|
+
window.cancelAnimationFrame(frameHandle);
|
|
200
|
+
try { segmentation.close(); } catch { /* already closed */ }
|
|
201
|
+
processed.getTracks().forEach((track) => track.stop());
|
|
202
|
+
processingTrack.stop();
|
|
203
|
+
video.srcObject = null;
|
|
204
|
+
};
|
|
205
|
+
candidateStop = stop;
|
|
206
|
+
|
|
207
|
+
if (producer) {
|
|
208
|
+
const track = processed.getVideoTracks()[0];
|
|
209
|
+
if (producer && typeof producer.replaceTrack === 'function' && track) {
|
|
210
|
+
// replaceTrack avoids renegotiation, so remote viewers see the
|
|
211
|
+
// background appear without the call visibly reconnecting.
|
|
212
|
+
await producer.replaceTrack({ track });
|
|
213
|
+
}
|
|
214
|
+
if (camera?.removeTrack && camera?.addTrack && restoreTrack !== sourceTrack) {
|
|
215
|
+
camera.removeTrack(sourceTrack);
|
|
216
|
+
camera.addTrack(restoreTrack);
|
|
217
|
+
if (sourceTrack.readyState === 'live') sourceTrack.stop();
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
previousSession?.stop();
|
|
222
|
+
session = { stop, stream: processed, restoreTrack };
|
|
223
|
+
candidateStop = null;
|
|
224
|
+
live.updateVirtualStream?.(processed);
|
|
225
|
+
live.updateProcessedStream?.(processed);
|
|
226
|
+
live.updateKeepBackground?.(true);
|
|
227
|
+
|
|
228
|
+
return { ok: true, error: '', stream: processed };
|
|
229
|
+
} catch (error: any) {
|
|
230
|
+
candidateStop?.();
|
|
231
|
+
return {
|
|
232
|
+
ok: false,
|
|
233
|
+
error: error?.message || 'The virtual background could not be applied.',
|
|
234
|
+
stream: null,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export type ClearVirtualBackgroundType = (
|
|
240
|
+
options: HeadlessOptions
|
|
241
|
+
) => Promise<HeadlessActionResult>;
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Remove the virtual background and go back to the raw camera.
|
|
245
|
+
*
|
|
246
|
+
* Restores the original camera track on the live producer before tearing the
|
|
247
|
+
* pipeline down, so viewers transition straight from processed to raw rather
|
|
248
|
+
* than through a frozen or black frame.
|
|
249
|
+
*/
|
|
250
|
+
export async function clearVirtualBackground({
|
|
251
|
+
parameters,
|
|
252
|
+
}: HeadlessOptions): Promise<HeadlessActionResult> {
|
|
253
|
+
const live = getCurrentParams({ parameters });
|
|
254
|
+
const active = session;
|
|
255
|
+
if (!active) {
|
|
256
|
+
live.updateKeepBackground?.(false);
|
|
257
|
+
return { ok: true, error: '' };
|
|
258
|
+
}
|
|
259
|
+
try {
|
|
260
|
+
const producer = live.videoProducer || live.localVideoProducer;
|
|
261
|
+
const original = active.restoreTrack;
|
|
262
|
+
if (producer && typeof producer.replaceTrack === 'function'
|
|
263
|
+
&& original && original.readyState === 'live') {
|
|
264
|
+
await producer.replaceTrack({ track: original });
|
|
265
|
+
}
|
|
266
|
+
active.stop();
|
|
267
|
+
session = null;
|
|
268
|
+
live.updateVirtualStream?.(null);
|
|
269
|
+
live.updateProcessedStream?.(null);
|
|
270
|
+
live.updateKeepBackground?.(false);
|
|
271
|
+
return { ok: true, error: '' };
|
|
272
|
+
} catch (error: any) {
|
|
273
|
+
return { ok: false, error: error?.message || 'The virtual background could not be cleared.' };
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/** True while a headless background pipeline is running in this tab. */
|
|
278
|
+
export function isVirtualBackgroundRunning(): boolean {
|
|
279
|
+
return session !== null;
|
|
280
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const DEFAULT_MEDIA_SFU_ROOM_API_URL = 'https://mediasfu.com/v1/rooms/';
|
|
1
|
+
const DEFAULT_MEDIA_SFU_ROOM_API_URL = 'https://mediasfu.com/v1/rooms/';
|
|
2
2
|
|
|
3
3
|
type MediaSFURoomApiAction = 'createRoom' | 'joinRoom';
|
|
4
4
|
|
|
@@ -28,4 +28,4 @@ export const resolveMediaSFURoomApi = (
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
return `${normalizedLink.replace(/\/$/, '')}/${action}`;
|
|
31
|
-
};
|
|
31
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Options for composing one segmented camera frame. */
|
|
2
|
+
export interface CompositeVirtualBackgroundFrameOptions {
|
|
3
|
+
ctx: CanvasRenderingContext2D;
|
|
4
|
+
segmentationMask: CanvasImageSource;
|
|
5
|
+
sourceImage: CanvasImageSource;
|
|
6
|
+
backgroundImage?: CanvasImageSource | null;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
repeatPattern?: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat';
|
|
10
|
+
blurFallbackPixels?: number;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Paint the segmented person over a replacement background.
|
|
15
|
+
*
|
|
16
|
+
* Keeping this operation in the shared runtime makes headless web adapters and
|
|
17
|
+
* the React SDK use the same compositing contract. It is deliberately not
|
|
18
|
+
* exported from the native entry point; native platforms use their camera
|
|
19
|
+
* processor instead of a browser canvas.
|
|
20
|
+
*/
|
|
21
|
+
export function compositeVirtualBackgroundFrame({
|
|
22
|
+
ctx,
|
|
23
|
+
segmentationMask,
|
|
24
|
+
sourceImage,
|
|
25
|
+
backgroundImage = null,
|
|
26
|
+
width,
|
|
27
|
+
height,
|
|
28
|
+
repeatPattern = 'repeat',
|
|
29
|
+
blurFallbackPixels = 0,
|
|
30
|
+
}: CompositeVirtualBackgroundFrameOptions): void {
|
|
31
|
+
const previousFilter = ctx.filter;
|
|
32
|
+
ctx.save();
|
|
33
|
+
try {
|
|
34
|
+
ctx.clearRect(0, 0, width, height);
|
|
35
|
+
ctx.globalCompositeOperation = 'source-over';
|
|
36
|
+
ctx.drawImage(segmentationMask, 0, 0, width, height);
|
|
37
|
+
ctx.globalCompositeOperation = 'source-in';
|
|
38
|
+
ctx.drawImage(sourceImage, 0, 0, width, height);
|
|
39
|
+
ctx.globalCompositeOperation = 'destination-over';
|
|
40
|
+
if (backgroundImage) {
|
|
41
|
+
const pattern = ctx.createPattern(backgroundImage, repeatPattern);
|
|
42
|
+
ctx.fillStyle = pattern || 'transparent';
|
|
43
|
+
ctx.fillRect(0, 0, width, height);
|
|
44
|
+
} else if (blurFallbackPixels > 0) {
|
|
45
|
+
ctx.filter = `blur(${blurFallbackPixels}px)`;
|
|
46
|
+
ctx.drawImage(sourceImage, 0, 0, width, height);
|
|
47
|
+
}
|
|
48
|
+
} finally {
|
|
49
|
+
ctx.filter = previousFilter || 'none';
|
|
50
|
+
ctx.globalCompositeOperation = 'source-over';
|
|
51
|
+
ctx.restore();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Producer } from 'mediasoup-client/
|
|
1
|
+
import type { Producer } from 'mediasoup-client/types';
|
|
2
2
|
import type {
|
|
3
3
|
ConnectSendTransportScreenParameters,
|
|
4
4
|
ConnectSendTransportScreenType,
|
|
@@ -125,4 +125,4 @@ export const captureCanvasStream = async ({
|
|
|
125
125
|
} catch (error) {
|
|
126
126
|
console.error(error, 'error in captureCanvasStream');
|
|
127
127
|
}
|
|
128
|
-
};
|
|
128
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Socket } from "socket.io-client";
|
|
2
2
|
import { validateAlphanumeric } from "../../methods/utils/validateAlphanumeric"; // Import the validateAlphanumeric function from the validateAlphanumeric file
|
|
3
|
-
import type { RtpCapabilities } from "mediasoup-client/
|
|
3
|
+
import type { RtpCapabilities } from "mediasoup-client/types";
|
|
4
4
|
|
|
5
5
|
export interface JoinConRoomOptions {
|
|
6
6
|
socket: Socket;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Socket } from 'socket.io-client';
|
|
2
|
-
import type { RtpCapabilities } from 'mediasoup-client/
|
|
2
|
+
import type { RtpCapabilities } from 'mediasoup-client/types';
|
|
3
3
|
import { validateAlphanumeric } from '../../methods/utils/validateAlphanumeric';
|
|
4
4
|
|
|
5
5
|
export interface JoinRoomOptions {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './types';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Socket } from 'socket.io-client';
|
|
2
|
-
import type { Consumer, DtlsParameters, IceCandidate, IceParameters, ProducerCodecOptions, RtpCapabilities } from 'mediasoup-client/
|
|
3
|
-
import type { RtpEncodingParameters } from 'mediasoup-client/
|
|
2
|
+
import type { Consumer, DtlsParameters, IceCandidate, IceParameters, ProducerCodecOptions, RtpCapabilities } from 'mediasoup-client/types';
|
|
3
|
+
import type { RtpEncodingParameters } from 'mediasoup-client/types';
|
|
4
4
|
|
|
5
5
|
export interface Participant {
|
|
6
6
|
id?: string;
|
|
@@ -760,4 +760,3 @@ export type MessageParticipantsType = (options: any) => void;
|
|
|
760
760
|
export type RemoveParticipantsType = (options: any) => Promise<void>;
|
|
761
761
|
|
|
762
762
|
// Consumer types - import from consumer-types file
|
|
763
|
-
|