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,336 @@
|
|
|
1
|
+
import { HeadlessOptions, HeadlessParameters } from './headlessTypes';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Explicit playback: HLS and WHEP.
|
|
5
|
+
*
|
|
6
|
+
* **This is deliberately not part of the media-card surface.** WebRTC media is
|
|
7
|
+
* *auto-consumed* — the SDK subscribes for you, and `getRemoteVideoStreams` /
|
|
8
|
+
* `getAudioGridComponents` hand you what already arrived. HLS and WHEP are the
|
|
9
|
+
* opposite: nothing is consumed until you ask, because each one opens a
|
|
10
|
+
* connection the room did not ask for and would otherwise pay for.
|
|
11
|
+
*
|
|
12
|
+
* So the API here is imperative — `attachPlayback` / `detachPlayback` — rather
|
|
13
|
+
* than a reactive getter. Mixing these into the media cards would mean every
|
|
14
|
+
* room silently opened an HLS or WHEP connection whether or not anything
|
|
15
|
+
* rendered it.
|
|
16
|
+
*
|
|
17
|
+
* When to reach for which:
|
|
18
|
+
*
|
|
19
|
+
* | | latency | cost per viewer | use it for |
|
|
20
|
+
* | --- | --- | --- | --- |
|
|
21
|
+
* | WebRTC (auto) | sub-second | an SFU consumer | anyone who takes part |
|
|
22
|
+
* | WHEP | sub-second | an SFU consumer | standards-based egress to non-SDK players |
|
|
23
|
+
* | HLS | seconds | a CDN request | audiences too large to fan out over the SFU |
|
|
24
|
+
*
|
|
25
|
+
* A large passive audience on HLS is the reason this exists: it moves the
|
|
26
|
+
* expensive part — media fan-out — off the SFU.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
export type PlaybackProtocol = 'hls' | 'whep';
|
|
30
|
+
|
|
31
|
+
export interface PlaybackSource {
|
|
32
|
+
protocol: PlaybackProtocol;
|
|
33
|
+
url: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Playback URLs the server has published for this room.
|
|
38
|
+
*
|
|
39
|
+
* Returns nothing when the room has none — HLS and WHEP are provisioned
|
|
40
|
+
* server-side, so absence means "not enabled for this room", not an error.
|
|
41
|
+
*/
|
|
42
|
+
export function getPlaybackSources({ parameters }: HeadlessOptions): PlaybackSource[] {
|
|
43
|
+
const source: HeadlessParameters = parameters || {};
|
|
44
|
+
const sources: PlaybackSource[] = [];
|
|
45
|
+
const push = (protocol: PlaybackProtocol, url: unknown) => {
|
|
46
|
+
if (typeof url === 'string' && /^https:\/\//i.test(url)) sources.push({ protocol, url });
|
|
47
|
+
};
|
|
48
|
+
push('hls', source.hlsUrl || source.hlsPlaybackUrl || source.playbackUrl);
|
|
49
|
+
push('whep', source.whepUrl || source.whepPlaybackUrl);
|
|
50
|
+
return sources;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** A running playback. Always `detachPlayback` it — none of this is garbage-collected. */
|
|
54
|
+
export interface PlaybackHandle {
|
|
55
|
+
protocol: PlaybackProtocol;
|
|
56
|
+
url: string;
|
|
57
|
+
/** The media, when the protocol produces one directly (WHEP). */
|
|
58
|
+
stream: MediaStream | null;
|
|
59
|
+
/** Release the connection, the player, and the element's source. */
|
|
60
|
+
detach: () => void;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface AttachPlaybackOptions {
|
|
64
|
+
/** Playback URL, or a `PlaybackSource` from `getPlaybackSources`. */
|
|
65
|
+
source: string | PlaybackSource;
|
|
66
|
+
/** The element to play into. Required for HLS; optional for WHEP. */
|
|
67
|
+
video?: HTMLVideoElement | null;
|
|
68
|
+
/** Force a protocol. Inferred from the URL when omitted. */
|
|
69
|
+
protocol?: PlaybackProtocol;
|
|
70
|
+
/**
|
|
71
|
+
* Factory returning an hls.js instance, e.g. `() => new Hls({ lowLatencyMode: true })`.
|
|
72
|
+
*
|
|
73
|
+
* Required for HLS anywhere except Safari, and injected rather than imported
|
|
74
|
+
* so hls.js never becomes a dependency of this SDK — most rooms never play
|
|
75
|
+
* HLS, and React Native cannot use it at all.
|
|
76
|
+
*/
|
|
77
|
+
hlsFactory?: () => any;
|
|
78
|
+
/** Extra headers for the WHEP POST, e.g. an auth token. */
|
|
79
|
+
headers?: Record<string, string>;
|
|
80
|
+
/** ICE servers for WHEP. Defaults to the room's own when available. */
|
|
81
|
+
iceServers?: RTCIceServer[];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function inferProtocol(url: string, explicit?: PlaybackProtocol): PlaybackProtocol {
|
|
85
|
+
if (explicit) return explicit;
|
|
86
|
+
return /\.m3u8(\?|$)/i.test(url) ? 'hls' : 'whep';
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Whether this element can genuinely play HLS from a plain `src`.
|
|
91
|
+
*
|
|
92
|
+
* **`canPlayType` alone is a trap.** Chrome answers `"maybe"` for
|
|
93
|
+
* `application/vnd.apple.mpegurl` and then plays nothing — setting `src` there
|
|
94
|
+
* produces a permanently black video with no error at all.
|
|
95
|
+
*
|
|
96
|
+
* The reliable signal is Media Source Extensions: where MSE exists, hls.js is
|
|
97
|
+
* the right player (this is hls.js's own documented rule). Native playback is
|
|
98
|
+
* only trusted where MSE is absent, which is iOS Safari — the one place hls.js
|
|
99
|
+
* cannot run and native HLS genuinely works.
|
|
100
|
+
*/
|
|
101
|
+
function canPlayHlsNatively(video: HTMLVideoElement): boolean {
|
|
102
|
+
const claimsSupport = typeof video.canPlayType === 'function'
|
|
103
|
+
&& video.canPlayType('application/vnd.apple.mpegurl') !== '';
|
|
104
|
+
const hasMse = typeof MediaSource !== 'undefined'
|
|
105
|
+
|| typeof (globalThis as any).ManagedMediaSource !== 'undefined';
|
|
106
|
+
return claimsSupport && !hasMse;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function attachHls(
|
|
110
|
+
url: string,
|
|
111
|
+
video: HTMLVideoElement | null | undefined,
|
|
112
|
+
hlsFactory?: () => any
|
|
113
|
+
): Promise<PlaybackHandle> {
|
|
114
|
+
if (!video) throw new Error('HLS playback needs a <video> element.');
|
|
115
|
+
|
|
116
|
+
// Prefer the injected player wherever one is available: hls.js works on every
|
|
117
|
+
// browser that supports MSE, including desktop Safari, and gives one code path
|
|
118
|
+
// for live-edge handling rather than two.
|
|
119
|
+
if (typeof hlsFactory !== 'function' && canPlayHlsNatively(video)) {
|
|
120
|
+
video.src = url;
|
|
121
|
+
const play = video.play?.();
|
|
122
|
+
play?.catch?.(() => {});
|
|
123
|
+
return {
|
|
124
|
+
protocol: 'hls',
|
|
125
|
+
url,
|
|
126
|
+
stream: null,
|
|
127
|
+
detach: () => { video.removeAttribute('src'); video.load?.(); },
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (typeof hlsFactory !== 'function') {
|
|
132
|
+
throw new Error(
|
|
133
|
+
'HLS needs an hlsFactory on this browser. Pass () => new Hls(...) from hls.js; '
|
|
134
|
+
+ 'it is not bundled with the SDK. Only iOS Safari, which has no Media Source '
|
|
135
|
+
+ 'Extensions, plays HLS without one — Chrome reports that it can and then '
|
|
136
|
+
+ 'plays nothing.'
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
const hls = hlsFactory();
|
|
140
|
+
hls.loadSource(url);
|
|
141
|
+
hls.attachMedia(video);
|
|
142
|
+
return {
|
|
143
|
+
protocol: 'hls',
|
|
144
|
+
url,
|
|
145
|
+
stream: null,
|
|
146
|
+
detach: () => {
|
|
147
|
+
try { hls.destroy(); } catch { /* already destroyed */ }
|
|
148
|
+
video.removeAttribute('src');
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* WHEP: POST an SDP offer, receive an answer, play the tracks.
|
|
155
|
+
*
|
|
156
|
+
* Implemented directly against RTCPeerConnection rather than via a library —
|
|
157
|
+
* WHEP is a small, standard exchange and a dependency here would be larger than
|
|
158
|
+
* the protocol.
|
|
159
|
+
*/
|
|
160
|
+
async function attachWhep(
|
|
161
|
+
url: string,
|
|
162
|
+
video: HTMLVideoElement | null | undefined,
|
|
163
|
+
headers: Record<string, string> = {},
|
|
164
|
+
iceServers?: RTCIceServer[]
|
|
165
|
+
): Promise<PlaybackHandle> {
|
|
166
|
+
if (typeof RTCPeerConnection === 'undefined') {
|
|
167
|
+
throw new Error('WHEP playback needs WebRTC support.');
|
|
168
|
+
}
|
|
169
|
+
const pc = new RTCPeerConnection(iceServers?.length ? { iceServers } : undefined);
|
|
170
|
+
const stream = new MediaStream();
|
|
171
|
+
|
|
172
|
+
// recvonly: this is egress. Adding transceivers up front means the offer
|
|
173
|
+
// advertises both kinds even before any track arrives.
|
|
174
|
+
pc.addTransceiver('video', { direction: 'recvonly' });
|
|
175
|
+
pc.addTransceiver('audio', { direction: 'recvonly' });
|
|
176
|
+
pc.ontrack = (event: RTCTrackEvent) => {
|
|
177
|
+
if (event.track) stream.addTrack(event.track);
|
|
178
|
+
if (video && video.srcObject !== stream) {
|
|
179
|
+
video.srcObject = stream;
|
|
180
|
+
const play = video.play?.();
|
|
181
|
+
play?.catch?.(() => {});
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
let resourceUrl = '';
|
|
186
|
+
try {
|
|
187
|
+
const offer = await pc.createOffer();
|
|
188
|
+
await pc.setLocalDescription(offer);
|
|
189
|
+
|
|
190
|
+
const response = await fetch(url, {
|
|
191
|
+
method: 'POST',
|
|
192
|
+
headers: { 'Content-Type': 'application/sdp', ...headers },
|
|
193
|
+
body: offer.sdp || '',
|
|
194
|
+
});
|
|
195
|
+
if (!response.ok) {
|
|
196
|
+
throw new Error(`The WHEP endpoint refused the request (${response.status}).`);
|
|
197
|
+
}
|
|
198
|
+
// The Location header names the session, and DELETEing it is the only way
|
|
199
|
+
// to tell the server to stop sending. Without it a closed page keeps a
|
|
200
|
+
// session alive server-side.
|
|
201
|
+
const location = response.headers.get('Location') || '';
|
|
202
|
+
resourceUrl = location ? new URL(location, url).toString() : '';
|
|
203
|
+
|
|
204
|
+
const answer = await response.text();
|
|
205
|
+
await pc.setRemoteDescription({ type: 'answer', sdp: answer });
|
|
206
|
+
} catch (error) {
|
|
207
|
+
pc.close();
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return {
|
|
212
|
+
protocol: 'whep',
|
|
213
|
+
url,
|
|
214
|
+
stream,
|
|
215
|
+
detach: () => {
|
|
216
|
+
if (resourceUrl) {
|
|
217
|
+
// Best-effort and deliberately unawaited: teardown often runs during
|
|
218
|
+
// page unload, where waiting is not an option.
|
|
219
|
+
try { void fetch(resourceUrl, { method: 'DELETE', headers }); } catch { /* ignore */ }
|
|
220
|
+
}
|
|
221
|
+
try { pc.close(); } catch { /* already closed */ }
|
|
222
|
+
stream.getTracks().forEach((track) => track.stop());
|
|
223
|
+
if (video && video.srcObject === stream) video.srcObject = null;
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
export type AttachPlaybackType = (options: AttachPlaybackOptions) => Promise<PlaybackHandle>;
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Start an explicit playback.
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* ```ts
|
|
235
|
+
* import Hls from 'hls.js';
|
|
236
|
+
*
|
|
237
|
+
* const [source] = getPlaybackSources({ parameters });
|
|
238
|
+
* const handle = await attachPlayback({
|
|
239
|
+
* source,
|
|
240
|
+
* video: videoRef.current,
|
|
241
|
+
* hlsFactory: () => new Hls({ lowLatencyMode: true }),
|
|
242
|
+
* });
|
|
243
|
+
* // later, always:
|
|
244
|
+
* detachPlayback(handle);
|
|
245
|
+
* ```
|
|
246
|
+
*/
|
|
247
|
+
export async function attachPlayback({
|
|
248
|
+
source,
|
|
249
|
+
video,
|
|
250
|
+
protocol,
|
|
251
|
+
hlsFactory,
|
|
252
|
+
headers,
|
|
253
|
+
iceServers,
|
|
254
|
+
}: AttachPlaybackOptions): Promise<PlaybackHandle> {
|
|
255
|
+
const url = typeof source === 'string' ? source : source?.url || '';
|
|
256
|
+
if (!url) throw new Error('A playback URL is required.');
|
|
257
|
+
const resolved = typeof source === 'string'
|
|
258
|
+
? inferProtocol(url, protocol)
|
|
259
|
+
: (protocol || source.protocol || inferProtocol(url));
|
|
260
|
+
|
|
261
|
+
return resolved === 'hls'
|
|
262
|
+
? attachHls(url, video, hlsFactory)
|
|
263
|
+
: attachWhep(url, video, headers, iceServers);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** Stop a playback and release everything it holds. Safe to call twice. */
|
|
267
|
+
export function detachPlayback(handle: PlaybackHandle | null | undefined): void {
|
|
268
|
+
if (!handle || typeof handle.detach !== 'function') return;
|
|
269
|
+
try { handle.detach(); } catch { /* teardown must not throw */ }
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/* ------------------------------------------------------------------ *
|
|
273
|
+
* WHIP — the ingest counterpart
|
|
274
|
+
* ------------------------------------------------------------------ */
|
|
275
|
+
|
|
276
|
+
export interface PublishWhipOptions {
|
|
277
|
+
/** The WHIP endpoint. */
|
|
278
|
+
url: string;
|
|
279
|
+
/** The stream to publish. */
|
|
280
|
+
stream: MediaStream;
|
|
281
|
+
headers?: Record<string, string>;
|
|
282
|
+
iceServers?: RTCIceServer[];
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Publish a stream to a WHIP endpoint.
|
|
287
|
+
*
|
|
288
|
+
* The symmetric counterpart of WHEP, and equally explicit. This is *not* how
|
|
289
|
+
* you publish into a MediaSFU room — use `produceMedia` for that, which goes
|
|
290
|
+
* through the room's own transport and respects its capture entitlements. WHIP
|
|
291
|
+
* is for pushing to a standards-based ingest that is not this room.
|
|
292
|
+
*/
|
|
293
|
+
export async function publishWhip({
|
|
294
|
+
url,
|
|
295
|
+
stream,
|
|
296
|
+
headers = {},
|
|
297
|
+
iceServers,
|
|
298
|
+
}: PublishWhipOptions): Promise<PlaybackHandle> {
|
|
299
|
+
if (typeof RTCPeerConnection === 'undefined') {
|
|
300
|
+
throw new Error('WHIP publishing needs WebRTC support.');
|
|
301
|
+
}
|
|
302
|
+
if (!stream?.getTracks?.().length) throw new Error('A stream with at least one track is required.');
|
|
303
|
+
|
|
304
|
+
const pc = new RTCPeerConnection(iceServers?.length ? { iceServers } : undefined);
|
|
305
|
+
stream.getTracks().forEach((track) => pc.addTrack(track, stream));
|
|
306
|
+
|
|
307
|
+
let resourceUrl = '';
|
|
308
|
+
try {
|
|
309
|
+
const offer = await pc.createOffer();
|
|
310
|
+
await pc.setLocalDescription(offer);
|
|
311
|
+
const response = await fetch(url, {
|
|
312
|
+
method: 'POST',
|
|
313
|
+
headers: { 'Content-Type': 'application/sdp', ...headers },
|
|
314
|
+
body: offer.sdp || '',
|
|
315
|
+
});
|
|
316
|
+
if (!response.ok) throw new Error(`The WHIP endpoint refused the request (${response.status}).`);
|
|
317
|
+
const location = response.headers.get('Location') || '';
|
|
318
|
+
resourceUrl = location ? new URL(location, url).toString() : '';
|
|
319
|
+
await pc.setRemoteDescription({ type: 'answer', sdp: await response.text() });
|
|
320
|
+
} catch (error) {
|
|
321
|
+
pc.close();
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return {
|
|
326
|
+
protocol: 'whep',
|
|
327
|
+
url,
|
|
328
|
+
stream,
|
|
329
|
+
detach: () => {
|
|
330
|
+
if (resourceUrl) {
|
|
331
|
+
try { void fetch(resourceUrl, { method: 'DELETE', headers }); } catch { /* ignore */ }
|
|
332
|
+
}
|
|
333
|
+
try { pc.close(); } catch { /* already closed */ }
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { confirmExit } from '../../exit/confirmExit';
|
|
2
|
+
import { sendMessage } from '../../message/sendMessage';
|
|
3
|
+
import { HeadlessOptions, HeadlessParameters } from './headlessTypes';
|
|
4
|
+
import { getCurrentParams } from './getCurrentParams';
|
|
5
|
+
import { getRoomReadiness } from './getRoomReadiness';
|
|
6
|
+
|
|
7
|
+
export interface HeadlessActionResult {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
/** Empty when `ok`; otherwise a short, user-safe explanation. */
|
|
10
|
+
error: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Prefer `localSocket` when it is usable, matching how the SDK routes chat.
|
|
15
|
+
* Falls back to the primary room socket.
|
|
16
|
+
*/
|
|
17
|
+
function usableSocket(parameters: HeadlessParameters): any {
|
|
18
|
+
return (
|
|
19
|
+
[parameters?.localSocket, parameters?.socket].find(
|
|
20
|
+
(socket) => socket?.connected === true && typeof socket.emit === 'function'
|
|
21
|
+
) || null
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface LeaveRoomOptions extends HeadlessOptions {
|
|
26
|
+
/** Ban the member on the way out. Requires host privileges. */
|
|
27
|
+
ban?: boolean;
|
|
28
|
+
/** Whether a host exit should end the room for everyone. Defaults to true. */
|
|
29
|
+
endRoomOnHostExit?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type LeaveRoomType = (
|
|
33
|
+
options: LeaveRoomOptions
|
|
34
|
+
) => Promise<HeadlessActionResult>;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Leave the room from a headless surface.
|
|
38
|
+
*
|
|
39
|
+
* Without this you have to pull `socket`, `localSocket`, `member` and `roomName`
|
|
40
|
+
* off the bag yourself and hand them to `confirmExit` — four chances to pass a
|
|
41
|
+
* stale value, and a silent no-op when you do.
|
|
42
|
+
*
|
|
43
|
+
* Never throws: a failed exit comes back as `{ ok: false, error }` so a Leave
|
|
44
|
+
* button can report why rather than appearing to work.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { leaveRoom } from 'mediasfu-shared';
|
|
49
|
+
*
|
|
50
|
+
* const result = await leaveRoom({
|
|
51
|
+
* parameters: parameterStore.getCurrent(),
|
|
52
|
+
* endRoomOnHostExit: false,
|
|
53
|
+
* });
|
|
54
|
+
* if (!result.ok) setNotice(result.error);
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export async function leaveRoom({
|
|
58
|
+
parameters,
|
|
59
|
+
ban = false,
|
|
60
|
+
endRoomOnHostExit = true,
|
|
61
|
+
}: LeaveRoomOptions): Promise<HeadlessActionResult> {
|
|
62
|
+
try {
|
|
63
|
+
const live = getCurrentParams({ parameters });
|
|
64
|
+
const socket = live?.socket;
|
|
65
|
+
if (!socket || typeof socket.emit !== 'function') {
|
|
66
|
+
return {
|
|
67
|
+
ok: false,
|
|
68
|
+
error: 'Room exit is unavailable until the signaling connection is ready.',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (!live?.member || !live?.roomName) {
|
|
72
|
+
return { ok: false, error: 'Room exit is unavailable until the room is joined.' };
|
|
73
|
+
}
|
|
74
|
+
await confirmExit({
|
|
75
|
+
socket,
|
|
76
|
+
localSocket: live.localSocket,
|
|
77
|
+
member: live.member,
|
|
78
|
+
roomName: live.roomName,
|
|
79
|
+
ban,
|
|
80
|
+
endRoomOnHostExit,
|
|
81
|
+
});
|
|
82
|
+
return { ok: true, error: '' };
|
|
83
|
+
} catch (error: any) {
|
|
84
|
+
return { ok: false, error: error?.message || 'The room exit request failed.' };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface SendChatMessageOptions extends HeadlessOptions {
|
|
89
|
+
message: string;
|
|
90
|
+
/** Specific recipients. Empty (default) sends to the group. */
|
|
91
|
+
receivers?: string[];
|
|
92
|
+
/** Send to everyone. Defaults to true when `receivers` is empty. */
|
|
93
|
+
group?: boolean;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export type SendChatMessageType = (
|
|
97
|
+
options: SendChatMessageOptions
|
|
98
|
+
) => Promise<HeadlessActionResult>;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Send a chat message from a headless surface.
|
|
102
|
+
*
|
|
103
|
+
* `sendMessage` takes eleven fields that all have to be lifted off the bag in
|
|
104
|
+
* the right combination; this resolves them for you, including the
|
|
105
|
+
* `localSocket`-before-`socket` preference the SDK uses for chat.
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```ts
|
|
109
|
+
* import { sendChatMessage } from 'mediasfu-shared';
|
|
110
|
+
*
|
|
111
|
+
* await sendChatMessage({ parameters, message: 'Hello everyone' });
|
|
112
|
+
* await sendChatMessage({ parameters, message: 'Just you', receivers: ['Paul'] });
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export async function sendChatMessage({
|
|
116
|
+
parameters,
|
|
117
|
+
message,
|
|
118
|
+
receivers = [],
|
|
119
|
+
group,
|
|
120
|
+
}: SendChatMessageOptions): Promise<HeadlessActionResult> {
|
|
121
|
+
try {
|
|
122
|
+
const trimmed = String(message ?? '').trim();
|
|
123
|
+
if (!trimmed) return { ok: false, error: 'The message is empty.' };
|
|
124
|
+
|
|
125
|
+
const live = getCurrentParams({ parameters });
|
|
126
|
+
const socket = usableSocket(live);
|
|
127
|
+
if (!socket) {
|
|
128
|
+
return { ok: false, error: 'Chat is unavailable until the room connection is ready.' };
|
|
129
|
+
}
|
|
130
|
+
if (!live?.roomName) {
|
|
131
|
+
return { ok: false, error: 'Chat is unavailable until the room is joined.' };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
await sendMessage({
|
|
135
|
+
member: live.member || '',
|
|
136
|
+
islevel: live.islevel || '1',
|
|
137
|
+
showAlert: live.showAlert,
|
|
138
|
+
coHostResponsibility: live.coHostResponsibility || [],
|
|
139
|
+
coHost: live.coHost || '',
|
|
140
|
+
chatSetting: live.chatSetting || '',
|
|
141
|
+
message: trimmed,
|
|
142
|
+
roomName: live.roomName,
|
|
143
|
+
messagesLength: Array.isArray(live.messages) ? live.messages.length : 0,
|
|
144
|
+
receivers,
|
|
145
|
+
group: group ?? receivers.length === 0,
|
|
146
|
+
sender: live.member || '',
|
|
147
|
+
socket,
|
|
148
|
+
});
|
|
149
|
+
return { ok: true, error: '' };
|
|
150
|
+
} catch (error: any) {
|
|
151
|
+
return { ok: false, error: error?.message || 'The message could not be sent.' };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export interface RunMediaControlOptions extends HeadlessOptions {
|
|
156
|
+
/** Which control to run. */
|
|
157
|
+
control:
|
|
158
|
+
| 'clickAudio'
|
|
159
|
+
| 'clickVideo'
|
|
160
|
+
| 'clickScreenShare'
|
|
161
|
+
| 'switchAudio'
|
|
162
|
+
| 'switchVideo'
|
|
163
|
+
| 'switchVideoAlt';
|
|
164
|
+
/** Extra arguments, e.g. `{ audioPreference: deviceId }` for `switchAudio`. */
|
|
165
|
+
extra?: Record<string, any>;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export type RunMediaControlType = (
|
|
169
|
+
options: RunMediaControlOptions
|
|
170
|
+
) => Promise<HeadlessActionResult>;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Invoke a media control safely from a headless surface.
|
|
174
|
+
*
|
|
175
|
+
* Gates on {@link getRoomReadiness} first — firing `clickVideo` before the
|
|
176
|
+
* transport exists fails silently and looks like a dead button — then resolves
|
|
177
|
+
* the control off the current bag rather than a snapshot the caller captured
|
|
178
|
+
* earlier.
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```ts
|
|
182
|
+
* import { runMediaControl } from 'mediasfu-shared';
|
|
183
|
+
*
|
|
184
|
+
* await runMediaControl({ parameters, control: 'clickVideo' });
|
|
185
|
+
* await runMediaControl({
|
|
186
|
+
* parameters,
|
|
187
|
+
* control: 'switchVideo',
|
|
188
|
+
* extra: { videoPreference: deviceId },
|
|
189
|
+
* });
|
|
190
|
+
* ```
|
|
191
|
+
*/
|
|
192
|
+
export async function runMediaControl({
|
|
193
|
+
parameters,
|
|
194
|
+
control,
|
|
195
|
+
extra,
|
|
196
|
+
}: RunMediaControlOptions): Promise<HeadlessActionResult> {
|
|
197
|
+
const live = getCurrentParams({ parameters });
|
|
198
|
+
const readiness = getRoomReadiness({ parameters: live });
|
|
199
|
+
if (!readiness.ready) return { ok: false, error: readiness.reason };
|
|
200
|
+
|
|
201
|
+
const method = live?.[control];
|
|
202
|
+
if (typeof method !== 'function') {
|
|
203
|
+
return { ok: false, error: `The SDK ${control} control is unavailable.` };
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// MediaSFU's media controls return void and report refusals — "Access denied
|
|
207
|
+
// by host", "A request is pending", recording locks, audio-only events —
|
|
208
|
+
// exclusively through showAlert. Without this, a control the host has blocked
|
|
209
|
+
// resolves normally and we would report success for something that did not
|
|
210
|
+
// happen. Compare the alert before and after and treat a new danger/warning
|
|
211
|
+
// as the failure reason.
|
|
212
|
+
const alertBefore = live?.alertMessage || '';
|
|
213
|
+
try {
|
|
214
|
+
await method({ ...(extra || {}), parameters: live });
|
|
215
|
+
} catch (error: any) {
|
|
216
|
+
return { ok: false, error: error?.message || 'The media control failed.' };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const settled = getCurrentParams({ parameters: live });
|
|
220
|
+
const alertAfter = settled?.alertMessage || '';
|
|
221
|
+
const alertType = settled?.alertType;
|
|
222
|
+
if (
|
|
223
|
+
alertAfter
|
|
224
|
+
&& alertAfter !== alertBefore
|
|
225
|
+
&& (alertType === 'danger' || alertType === 'warning')
|
|
226
|
+
) {
|
|
227
|
+
return { ok: false, error: alertAfter };
|
|
228
|
+
}
|
|
229
|
+
return { ok: true, error: '' };
|
|
230
|
+
}
|