mediasfu-vue 1.0.0 → 1.0.2
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/README.md +362 -152
- package/dist/index.cjs +35561 -17132
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +36509 -18168
- package/dist/index.js.map +1 -1
- package/dist/mediasfu-vue.css +5180 -931
- package/package.json +22 -9
- package/src/@types/types.ts +3 -0
- package/src/App.vue +34 -56
- package/src/AppBroadcast.vue +6 -6
- package/src/AppChat.vue +6 -6
- package/src/AppConference.vue +6 -6
- package/src/AppGeneric.vue +6 -6
- package/src/AppUnique.vue +18 -13
- package/src/AppWebinar.vue +6 -6
- package/src/{react-legacy/src/ProducerClient → ProducerClient}/producerClientEmits/joinRoomClient.ts +1 -1
- package/src/{react-legacy/src/ProducerClient → ProducerClient}/producerClientEmits/updateRoomParametersClient.ts +10 -10
- package/src/SharedTypes/index.ts +4 -2
- package/src/components/backgroundComponents/BackgroundModal.vue +6 -1
- package/src/components/breakoutComponents/BreakoutRoomsModal.vue +12 -2
- package/src/components/coHostComponents/CoHostModal.vue +89 -15
- package/src/components/displayComponents/AudioCard.vue +65 -2
- package/src/components/displayComponents/AudioGrid.vue +1 -1
- package/src/components/displayComponents/MiniAudio.vue +1 -1
- package/src/components/displayComponents/MiniCard.vue +16 -4
- package/src/components/displayComponents/MiniCardAudio.vue +1 -1
- package/src/components/displayComponents/Pagination.vue +73 -19
- package/src/components/displayComponents/SubAspectComponent.vue +40 -14
- package/src/components/displayComponents/VideoCard.vue +64 -2
- package/src/components/displaySettingsComponents/DisplaySettingsModal.vue +29 -0
- package/src/components/eventSettingsComponents/EventSettingsModal.vue +7 -2
- package/src/components/exitComponents/ConfirmExitModal.vue +31 -14
- package/src/components/mediaSettingsComponents/MediaSettingsModal.vue +6 -1
- package/src/components/mediasfuComponents/MediasfuGeneric.vue +3215 -344
- package/src/components/menuComponents/MeetingIDComponent.vue +9 -6
- package/src/components/menuComponents/MeetingPasscodeComponent.vue +89 -12
- package/src/components/menuComponents/ShareButtonsComponent.vue +72 -16
- package/src/components/messageComponents/MessagePanel.vue +268 -52
- package/src/components/messageComponents/MessagesModal.vue +6 -1
- package/src/components/miscComponents/ConfirmHereModal.vue +6 -1
- package/src/components/miscComponents/PreJoinPage.vue +12 -552
- package/src/components/miscComponents/ShareEventModal.vue +11 -8
- package/src/components/miscComponents/WelcomePage.vue +12 -239
- package/src/components/panelistsComponents/PanelistsModal.vue +959 -0
- package/src/components/participantsComponents/ParticipantListOthers.vue +2 -0
- package/src/components/participantsComponents/ParticipantListOthersItem.vue +2 -0
- package/src/components/participantsComponents/ParticipantsModal.vue +7 -1
- package/src/components/permissionsComponents/PermissionsModal.vue +1092 -0
- package/src/components/pollsComponents/PollModal.vue +6 -2
- package/src/components/recordingComponents/RecordingModal.vue +57 -2
- package/src/components/requestsComponents/RenderRequestComponent.vue +24 -4
- package/src/components/requestsComponents/RequestsModal.vue +10 -2
- package/src/components/screenboardComponents/ScreenboardModal.vue +4 -4
- package/src/components/translationComponents/TranslationSettingsModal.vue +1639 -0
- package/src/components/waitingComponents/WaitingModal.vue +294 -102
- package/src/components/whiteboardComponents/ConfigureWhiteboardModal.vue +6 -1
- package/src/composables/panelistsComposables/index.ts +3 -0
- package/src/composables/panelistsComposables/useFocusPanelists.ts +8 -0
- package/src/composables/panelistsComposables/useLaunchPanelists.ts +5 -0
- package/src/composables/panelistsComposables/useUpdatePanelists.ts +11 -0
- package/src/composables/permissionsComposables/index.ts +3 -0
- package/src/composables/permissionsComposables/useLaunchPermissions.ts +5 -0
- package/src/composables/permissionsComposables/useUpdateParticipantPermission.ts +5 -0
- package/src/composables/permissionsComposables/useUpdatePermissionConfig.ts +6 -0
- package/src/composables/useMediasfuDemo.ts +6 -4
- package/src/composables/useUIOverrides.ts +14 -3
- package/src/consumers/addVideosGrid.ts +51 -33
- package/src/consumers/consumerResume.ts +53 -2
- package/src/consumers/prepopulateUserMedia.ts +35 -27
- package/src/docs.ts +7 -0
- package/src/examples/ModernUIParityAudit.vue +3290 -0
- package/src/index.ts +10 -0
- package/src/main.ts +17 -3
- package/src/methods/polls/pollUpdated.ts +2 -0
- package/src/methods/streamMethods/clickAudio.ts +2 -0
- package/src/methods/streamMethods/clickScreenShare.ts +6 -0
- package/src/methods/utils/MiniAudioPlayer/MiniAudioPlayer.vue +159 -14
- package/src/methods/utils/SoundPlayer.ts +5 -0
- package/src/methods/utils/TranslationAudioPlayer/TranslationAudioPlayer.vue +143 -0
- package/src/methods/utils/checkLimitsAndMakeRequest.ts +1 -0
- package/src/methods/utils/createResponseJoinRoom.ts +2 -0
- package/src/methods/utils/createRoomOnMediaSFU.ts +2 -0
- package/src/methods/utils/formatNumber.ts +2 -0
- package/src/methods/utils/joinRoomOnMediaSFU.ts +8 -0
- package/src/methods/utils/meetingTimer/startMeetingProgressTimer.ts +6 -0
- package/src/methods/utils/producer/aParams.ts +1 -0
- package/src/methods/utils/producer/hParams.ts +1 -0
- package/src/methods/utils/producer/screenParams.ts +1 -0
- package/src/methods/utils/producer/vParams.ts +1 -0
- package/src/methods/utils/producer/videoCaptureConstraints.ts +23 -0
- package/src/methods/utils/sleep.ts +2 -0
- package/src/methods/utils/validateAlphanumeric.ts +5 -0
- package/src/methods/whiteboardMethods/captureCanvasStream.ts +6 -0
- package/src/modern/display_components/ModernAlertComponent.vue +161 -0
- package/src/modern/display_components/ModernAudioCard.vue +653 -0
- package/src/modern/display_components/ModernControlButtonsComponent.vue +423 -0
- package/src/modern/display_components/ModernControlButtonsComponentTouch.vue +254 -0
- package/src/modern/display_components/ModernFlexibleGrid.vue +351 -0
- package/src/modern/display_components/ModernFlexibleVideo.vue +460 -0
- package/src/modern/display_components/ModernLoadingModal.vue +114 -0
- package/src/modern/display_components/ModernMainAspect.vue +29 -0
- package/src/modern/display_components/ModernMainContainer.vue +30 -0
- package/src/modern/display_components/ModernMainGrid.vue +47 -0
- package/src/modern/display_components/ModernMeetingProgressTimer.vue +337 -0
- package/src/modern/display_components/ModernMiniCard.vue +406 -0
- package/src/modern/display_components/ModernOtherGrid.vue +47 -0
- package/src/modern/display_components/ModernPagination.vue +533 -0
- package/src/modern/display_components/ModernParticipantsCounterBadge.vue +108 -0
- package/src/modern/display_components/ModernSubAspect.vue +30 -0
- package/src/modern/display_components/ModernVideoCard.vue +481 -0
- package/src/modern/display_components/index.ts +32 -0
- package/src/modern/display_components/styleUtils.ts +62 -0
- package/src/modern/index.ts +5 -0
- package/src/modern/mediasfu_components/ModernMediasfuGeneric.vue +218 -0
- package/src/modern/mediasfu_components/index.ts +3 -0
- package/src/modern/misc_components/ModernEntryShell.vue +182 -0
- package/src/modern/misc_components/ModernPreJoinPage.vue +635 -0
- package/src/modern/misc_components/ModernWelcomePage.vue +226 -0
- package/src/modern/misc_components/index.ts +7 -0
- package/src/modern/modal_components/ModernBackgroundModal.vue +1492 -0
- package/src/modern/modal_components/ModernBreakoutRoomsModal.vue +1628 -0
- package/src/modern/modal_components/ModernCoHostModal.vue +967 -0
- package/src/modern/modal_components/ModernConfigureWhiteboardModal.vue +823 -0
- package/src/modern/modal_components/ModernConfirmExitModal.vue +266 -0
- package/src/modern/modal_components/ModernConfirmHereModal.vue +666 -0
- package/src/modern/modal_components/ModernDisplaySettingsModal.vue +604 -0
- package/src/modern/modal_components/ModernEventSettingsModal.vue +560 -0
- package/src/modern/modal_components/ModernMediaSettingsModal.vue +826 -0
- package/src/modern/modal_components/ModernMenuModal.vue +698 -0
- package/src/modern/modal_components/ModernMessagesModal.vue +651 -0
- package/src/modern/modal_components/ModernPanelistsModal.vue +283 -0
- package/src/modern/modal_components/ModernParticipantsModal.vue +947 -0
- package/src/modern/modal_components/ModernPermissionsModal.vue +254 -0
- package/src/modern/modal_components/ModernPollModal.vue +1113 -0
- package/src/modern/modal_components/ModernRecordingModal.vue +775 -0
- package/src/modern/modal_components/ModernRequestsModal.vue +499 -0
- package/src/modern/modal_components/ModernScreenboardModal.vue +122 -0
- package/src/modern/modal_components/ModernShareEventModal.vue +295 -0
- package/src/modern/modal_components/ModernTranslationSettingsModal.vue +1912 -0
- package/src/modern/modal_components/ModernWaitingModal.vue +448 -0
- package/src/modern/primitives/ModernButton.vue +99 -0
- package/src/modern/primitives/ModernField.vue +149 -0
- package/src/modern/primitives/ModernSurface.vue +59 -0
- package/src/modern/primitives/ModernTooltip.vue +270 -0
- package/src/modern/primitives/index.ts +8 -0
- package/src/modern/recording_components/ModernAdvancedPanelComponent.vue +471 -0
- package/src/modern/recording_components/ModernStandardPanelComponent.vue +250 -0
- package/src/modern/screenboard_components/ModernScreenboard.vue +103 -0
- package/src/modern/theme/index.ts +4 -0
- package/src/modern/theme/tokens.ts +62 -0
- package/src/modern/theme/variables.css +49 -0
- package/src/modern/whiteboard_components/ModernWhiteboard.vue +156 -0
- package/src/{react-legacy/src/producers → producers}/producerEmits/joinLocalRoom.ts +2 -2
- package/src/{react-legacy/src/producers → producers}/producerEmits/joinRoom.ts +10 -0
- package/src/producers/socketReceiveMethods/allMembers.ts +6 -0
- package/src/producers/socketReceiveMethods/allMembersRest.ts +6 -0
- package/src/producers/socketReceiveMethods/allWaitingRoomMembers.ts +2 -0
- package/src/producers/socketReceiveMethods/banParticipant.ts +6 -0
- package/src/producers/socketReceiveMethods/controlMediaHost.ts +6 -0
- package/src/producers/socketReceiveMethods/disconnect.ts +5 -0
- package/src/producers/socketReceiveMethods/disconnectUserSelf.ts +2 -0
- package/src/producers/socketReceiveMethods/getDomains.ts +6 -0
- package/src/producers/socketReceiveMethods/hostRequestResponse.ts +2 -0
- package/src/producers/socketReceiveMethods/meetingEnded.ts +2 -0
- package/src/producers/socketReceiveMethods/meetingStillThere.ts +2 -0
- package/src/producers/socketReceiveMethods/meetingTimeRemaining.ts +2 -0
- package/src/producers/socketReceiveMethods/participantRequested.ts +2 -0
- package/src/producers/socketReceiveMethods/personJoined.ts +2 -0
- package/src/producers/socketReceiveMethods/producerMediaClosed.ts +6 -0
- package/src/producers/socketReceiveMethods/producerMediaPaused.ts +6 -0
- package/src/producers/socketReceiveMethods/producerMediaResumed.ts +6 -0
- package/src/producers/socketReceiveMethods/reInitiateRecording.ts +2 -0
- package/src/producers/socketReceiveMethods/receiveMessage.ts +2 -0
- package/src/producers/socketReceiveMethods/recordingNotice.ts +6 -0
- package/src/producers/socketReceiveMethods/roomRecordParams.ts +7 -0
- package/src/producers/socketReceiveMethods/screenProducerId.ts +2 -0
- package/src/producers/socketReceiveMethods/startRecords.ts +2 -0
- package/src/producers/socketReceiveMethods/stoppedRecording.ts +2 -0
- package/src/producers/socketReceiveMethods/timeLeftRecording.ts +2 -0
- package/src/producers/socketReceiveMethods/updateConsumingDomains.ts +6 -0
- package/src/producers/socketReceiveMethods/updateMediaSettings.ts +2 -0
- package/src/producers/socketReceiveMethods/updatedCoHost.ts +2 -0
- package/src/producers/socketReceiveMethods/userWaiting.ts +2 -0
- package/src/services/liveSubtitleService.ts +96 -0
- package/src/services/translationReceiveMethods.ts +32 -0
- package/src/types/custom-renderers.ts +26 -0
- package/src/types/ui-overrides.ts +6 -0
- package/src/utils/getOverlayPosition.ts +6 -0
- package/src/utils/mediasfuRooms.ts +28 -8
- package/src/utils/translationLanguages.ts +27 -0
- package/src/react-legacy/README.md +0 -18
- package/src/react-legacy/src/@types/types.ts +0 -299
- package/src/react-legacy/src/App.css +0 -38
- package/src/react-legacy/src/App.test.tsx +0 -8
- package/src/react-legacy/src/App.tsx +0 -770
- package/src/react-legacy/src/AppBroadcast.tsx +0 -488
- package/src/react-legacy/src/AppChat.tsx +0 -488
- package/src/react-legacy/src/AppConference.tsx +0 -488
- package/src/react-legacy/src/AppGeneric.tsx +0 -897
- package/src/react-legacy/src/AppWebinar.tsx +0 -488
- package/src/react-legacy/src/ProducerClient/producerClientEmits/createDeviceClient.ts +0 -68
- package/src/react-legacy/src/components/backgroundComponents/BackgroundModal.tsx +0 -1059
- package/src/react-legacy/src/components/breakoutComponents/BreakoutRoomsModal.tsx +0 -631
- package/src/react-legacy/src/components/coHostComponents/CoHostModal.css +0 -21
- package/src/react-legacy/src/components/coHostComponents/CoHostModal.tsx +0 -310
- package/src/react-legacy/src/components/displayComponents/AlertComponent.tsx +0 -132
- package/src/react-legacy/src/components/displayComponents/AudioCard.css +0 -0
- package/src/react-legacy/src/components/displayComponents/AudioCard.tsx +0 -465
- package/src/react-legacy/src/components/displayComponents/AudioGrid.tsx +0 -58
- package/src/react-legacy/src/components/displayComponents/CardVideoDisplay.tsx +0 -109
- package/src/react-legacy/src/components/displayComponents/ControlButtonsAltComponent.tsx +0 -218
- package/src/react-legacy/src/components/displayComponents/ControlButtonsComponent.css +0 -30
- package/src/react-legacy/src/components/displayComponents/ControlButtonsComponent.tsx +0 -196
- package/src/react-legacy/src/components/displayComponents/ControlButtonsComponentTouch.tsx +0 -238
- package/src/react-legacy/src/components/displayComponents/FlexibleGrid.tsx +0 -121
- package/src/react-legacy/src/components/displayComponents/FlexibleVideo.tsx +0 -196
- package/src/react-legacy/src/components/displayComponents/LoadingModal.tsx +0 -95
- package/src/react-legacy/src/components/displayComponents/MainAspectComponent.tsx +0 -154
- package/src/react-legacy/src/components/displayComponents/MainContainerComponent.tsx +0 -132
- package/src/react-legacy/src/components/displayComponents/MainGridComponent.tsx +0 -96
- package/src/react-legacy/src/components/displayComponents/MainScreenComponent.tsx +0 -169
- package/src/react-legacy/src/components/displayComponents/MeetingProgressTimer.tsx +0 -97
- package/src/react-legacy/src/components/displayComponents/MiniAudio.tsx +0 -292
- package/src/react-legacy/src/components/displayComponents/MiniCard.tsx +0 -131
- package/src/react-legacy/src/components/displayComponents/MiniCardAudio.tsx +0 -226
- package/src/react-legacy/src/components/displayComponents/OtherGridComponent.tsx +0 -100
- package/src/react-legacy/src/components/displayComponents/Pagination.css +0 -0
- package/src/react-legacy/src/components/displayComponents/Pagination.tsx +0 -307
- package/src/react-legacy/src/components/displayComponents/SubAspectComponent.tsx +0 -121
- package/src/react-legacy/src/components/displayComponents/VideoCard.tsx +0 -430
- package/src/react-legacy/src/components/displaySettingsComponents/DisplaySettingsModal.tsx +0 -362
- package/src/react-legacy/src/components/eventSettingsComponents/EventSettingsModal.tsx +0 -258
- package/src/react-legacy/src/components/exitComponents/ConfirmExitModal.tsx +0 -193
- package/src/react-legacy/src/components/mediaSettingsComponents/MediaSettingsModal.tsx +0 -225
- package/src/react-legacy/src/components/mediasfuComponents/MediasfuBroadcast.tsx +0 -4563
- package/src/react-legacy/src/components/mediasfuComponents/MediasfuCSS.css +0 -299
- package/src/react-legacy/src/components/mediasfuComponents/MediasfuChat.tsx +0 -4179
- package/src/react-legacy/src/components/mediasfuComponents/MediasfuConference.tsx +0 -5269
- package/src/react-legacy/src/components/mediasfuComponents/MediasfuGeneric.tsx +0 -5677
- package/src/react-legacy/src/components/mediasfuComponents/MediasfuWebinar.tsx +0 -5269
- package/src/react-legacy/src/components/menuComponents/CustomButtons.css +0 -34
- package/src/react-legacy/src/components/menuComponents/CustomButtons.tsx +0 -133
- package/src/react-legacy/src/components/menuComponents/MeetingIDComponent.tsx +0 -115
- package/src/react-legacy/src/components/menuComponents/MeetingPasscodeComponent.tsx +0 -77
- package/src/react-legacy/src/components/menuComponents/MenuItemComponent.tsx +0 -80
- package/src/react-legacy/src/components/menuComponents/MenuModal.tsx +0 -213
- package/src/react-legacy/src/components/menuComponents/ShareButtonsComponent.tsx +0 -180
- package/src/react-legacy/src/components/messageComponents/MessagePanel.tsx +0 -415
- package/src/react-legacy/src/components/messageComponents/MessagesModal.tsx +0 -394
- package/src/react-legacy/src/components/miscComponents/ConfirmHereModal.tsx +0 -223
- package/src/react-legacy/src/components/miscComponents/PreJoinPage.tsx +0 -936
- package/src/react-legacy/src/components/miscComponents/ShareEventModal.tsx +0 -161
- package/src/react-legacy/src/components/miscComponents/WelcomePage.tsx +0 -561
- package/src/react-legacy/src/components/participantsComponents/ParticipantList.tsx +0 -139
- package/src/react-legacy/src/components/participantsComponents/ParticipantListItem.tsx +0 -268
- package/src/react-legacy/src/components/participantsComponents/ParticipantListOthers.tsx +0 -66
- package/src/react-legacy/src/components/participantsComponents/ParticipantListOthersItem.tsx +0 -98
- package/src/react-legacy/src/components/participantsComponents/ParticipantsModal.tsx +0 -286
- package/src/react-legacy/src/components/pollsComponents/PollModal.tsx +0 -558
- package/src/react-legacy/src/components/recordingComponents/AdvancedPanelComponent.tsx +0 -397
- package/src/react-legacy/src/components/recordingComponents/RecordingModal.tsx +0 -321
- package/src/react-legacy/src/components/recordingComponents/StandardPanelComponent.tsx +0 -163
- package/src/react-legacy/src/components/requestsComponents/RenderRequestComponent.tsx +0 -140
- package/src/react-legacy/src/components/requestsComponents/RequestsModal.css +0 -1
- package/src/react-legacy/src/components/requestsComponents/RequestsModal.tsx +0 -229
- package/src/react-legacy/src/components/screenboardComponents/Screenboard.css +0 -147
- package/src/react-legacy/src/components/screenboardComponents/Screenboard.tsx +0 -879
- package/src/react-legacy/src/components/screenboardComponents/ScreenboardModal.tsx +0 -528
- package/src/react-legacy/src/components/waitingComponents/WaitingModal.tsx +0 -252
- package/src/react-legacy/src/components/waitingComponents/WaitingRoomModal.css +0 -31
- package/src/react-legacy/src/components/whiteboardComponents/ConfigureWhiteboardModal.tsx +0 -549
- package/src/react-legacy/src/components/whiteboardComponents/Whiteboard.css +0 -146
- package/src/react-legacy/src/components/whiteboardComponents/Whiteboard.tsx +0 -1713
- package/src/react-legacy/src/consumers/addVideosGrid.tsx +0 -543
- package/src/react-legacy/src/consumers/autoAdjust.ts +0 -100
- package/src/react-legacy/src/consumers/calculateRowsAndColumns.ts +0 -51
- package/src/react-legacy/src/consumers/changeVids.ts +0 -753
- package/src/react-legacy/src/consumers/checkGrid.ts +0 -100
- package/src/react-legacy/src/consumers/checkPermission.ts +0 -89
- package/src/react-legacy/src/consumers/checkScreenShare.ts +0 -114
- package/src/react-legacy/src/consumers/closeAndResize.ts +0 -401
- package/src/react-legacy/src/consumers/compareActiveNames.ts +0 -122
- package/src/react-legacy/src/consumers/compareScreenStates.ts +0 -117
- package/src/react-legacy/src/consumers/connectIps.ts +0 -175
- package/src/react-legacy/src/consumers/connectLocalIps.ts +0 -103
- package/src/react-legacy/src/consumers/connectRecvTransport.ts +0 -158
- package/src/react-legacy/src/consumers/connectSendTransport.ts +0 -150
- package/src/react-legacy/src/consumers/connectSendTransportAudio.ts +0 -161
- package/src/react-legacy/src/consumers/connectSendTransportScreen.ts +0 -169
- package/src/react-legacy/src/consumers/connectSendTransportVideo.ts +0 -149
- package/src/react-legacy/src/consumers/consumerResume.tsx +0 -591
- package/src/react-legacy/src/consumers/controlMedia.ts +0 -118
- package/src/react-legacy/src/consumers/createSendTransport.ts +0 -312
- package/src/react-legacy/src/consumers/disconnectSendTransportAudio.ts +0 -170
- package/src/react-legacy/src/consumers/disconnectSendTransportScreen.ts +0 -130
- package/src/react-legacy/src/consumers/disconnectSendTransportVideo.ts +0 -161
- package/src/react-legacy/src/consumers/dispStreams.ts +0 -694
- package/src/react-legacy/src/consumers/generatePageContent.ts +0 -118
- package/src/react-legacy/src/consumers/getEstimate.ts +0 -124
- package/src/react-legacy/src/consumers/getPipedProducersAlt.ts +0 -96
- package/src/react-legacy/src/consumers/getProducersPiped.ts +0 -89
- package/src/react-legacy/src/consumers/getVideos.ts +0 -107
- package/src/react-legacy/src/consumers/mixStreams.ts +0 -97
- package/src/react-legacy/src/consumers/onScreenChanges.ts +0 -106
- package/src/react-legacy/src/consumers/prepopulateUserMedia.tsx +0 -688
- package/src/react-legacy/src/consumers/processConsumerTransports.ts +0 -157
- package/src/react-legacy/src/consumers/processConsumerTransportsAudio.ts +0 -121
- package/src/react-legacy/src/consumers/rePort.ts +0 -123
- package/src/react-legacy/src/consumers/reUpdateInter.ts +0 -289
- package/src/react-legacy/src/consumers/readjust.ts +0 -170
- package/src/react-legacy/src/consumers/receiveAllPipedTransports.ts +0 -77
- package/src/react-legacy/src/consumers/receiveRoomMessages.ts +0 -55
- package/src/react-legacy/src/consumers/reorderStreams.ts +0 -246
- package/src/react-legacy/src/consumers/requestScreenShare.ts +0 -103
- package/src/react-legacy/src/consumers/resumePauseAudioStreams.ts +0 -174
- package/src/react-legacy/src/consumers/resumePauseStreams.ts +0 -110
- package/src/react-legacy/src/consumers/resumeSendTransportAudio.ts +0 -143
- package/src/react-legacy/src/consumers/signalNewConsumerTransport.ts +0 -179
- package/src/react-legacy/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +0 -130
- package/src/react-legacy/src/consumers/socketReceiveMethods/newPipeProducer.ts +0 -138
- package/src/react-legacy/src/consumers/socketReceiveMethods/producerClosed.ts +0 -102
- package/src/react-legacy/src/consumers/startShareScreen.ts +0 -124
- package/src/react-legacy/src/consumers/stopShareScreen.ts +0 -241
- package/src/react-legacy/src/consumers/streamSuccessAudio.ts +0 -297
- package/src/react-legacy/src/consumers/streamSuccessAudioSwitch.ts +0 -315
- package/src/react-legacy/src/consumers/streamSuccessScreen.ts +0 -255
- package/src/react-legacy/src/consumers/streamSuccessVideo.ts +0 -390
- package/src/react-legacy/src/consumers/switchUserAudio.ts +0 -145
- package/src/react-legacy/src/consumers/switchUserVideo.ts +0 -209
- package/src/react-legacy/src/consumers/switchUserVideoAlt.ts +0 -335
- package/src/react-legacy/src/consumers/trigger.ts +0 -250
- package/src/react-legacy/src/consumers/updateMiniCardsGrid.ts +0 -150
- package/src/react-legacy/src/consumers/updateParticipantAudioDecibels.ts +0 -56
- package/src/react-legacy/src/docs.tsx +0 -428
- package/src/react-legacy/src/examples/CustomMediaSFUExample.tsx +0 -335
- package/src/react-legacy/src/global.d.ts +0 -36
- package/src/react-legacy/src/index.css +0 -13
- package/src/react-legacy/src/index.tsx +0 -10
- package/src/react-legacy/src/logo.svg +0 -1
- package/src/react-legacy/src/main.tsx +0 -428
- package/src/react-legacy/src/methods/backgroundMethods/launchBackground.ts +0 -36
- package/src/react-legacy/src/methods/breakoutRoomsMethods/breakoutRoomUpdated.ts +0 -184
- package/src/react-legacy/src/methods/breakoutRoomsMethods/launchBreakoutRooms.ts +0 -35
- package/src/react-legacy/src/methods/coHostMethods/launchCoHost.ts +0 -33
- package/src/react-legacy/src/methods/coHostMethods/modifyCoHostSettings.ts +0 -100
- package/src/react-legacy/src/methods/displaySettingsMethods/launchDisplaySettings.ts +0 -34
- package/src/react-legacy/src/methods/displaySettingsMethods/modifyDisplaySettings.ts +0 -193
- package/src/react-legacy/src/methods/exitMethods/confirmExit.ts +0 -60
- package/src/react-legacy/src/methods/exitMethods/launchConfirmExit.ts +0 -33
- package/src/react-legacy/src/methods/mediaSettingsMethods/launchMediaSettings.ts +0 -70
- package/src/react-legacy/src/methods/menuMethods/launchMenuModal.ts +0 -31
- package/src/react-legacy/src/methods/messageMethods/launchMessages.ts +0 -34
- package/src/react-legacy/src/methods/messageMethods/sendMessage.ts +0 -133
- package/src/react-legacy/src/methods/participantsMethods/launchParticipants.ts +0 -34
- package/src/react-legacy/src/methods/participantsMethods/messageParticipants.ts +0 -83
- package/src/react-legacy/src/methods/participantsMethods/muteParticipants.ts +0 -83
- package/src/react-legacy/src/methods/participantsMethods/removeParticipants.ts +0 -103
- package/src/react-legacy/src/methods/pollsMethods/handleCreatePoll.ts +0 -70
- package/src/react-legacy/src/methods/pollsMethods/handleEndPoll.ts +0 -64
- package/src/react-legacy/src/methods/pollsMethods/handleVotePoll.ts +0 -79
- package/src/react-legacy/src/methods/pollsMethods/launchPoll.ts +0 -33
- package/src/react-legacy/src/methods/pollsMethods/pollUpdated.ts +0 -101
- package/src/react-legacy/src/methods/recordingMethods/checkPauseState.ts +0 -64
- package/src/react-legacy/src/methods/recordingMethods/checkResumeState.ts +0 -46
- package/src/react-legacy/src/methods/recordingMethods/confirmRecording.ts +0 -317
- package/src/react-legacy/src/methods/recordingMethods/launchRecording.ts +0 -130
- package/src/react-legacy/src/methods/recordingMethods/recordPauseTimer.ts +0 -55
- package/src/react-legacy/src/methods/recordingMethods/recordResumeTimer.ts +0 -131
- package/src/react-legacy/src/methods/recordingMethods/recordStartTimer.ts +0 -138
- package/src/react-legacy/src/methods/recordingMethods/recordUpdateTimer.ts +0 -66
- package/src/react-legacy/src/methods/recordingMethods/startRecording.ts +0 -263
- package/src/react-legacy/src/methods/recordingMethods/stopRecording.ts +0 -177
- package/src/react-legacy/src/methods/recordingMethods/updateRecording.ts +0 -329
- package/src/react-legacy/src/methods/requestsMethods/launchRequests.ts +0 -31
- package/src/react-legacy/src/methods/requestsMethods/respondToRequests.ts +0 -74
- package/src/react-legacy/src/methods/settingsMethods/launchSettings.ts +0 -29
- package/src/react-legacy/src/methods/settingsMethods/modifySettings.ts +0 -116
- package/src/react-legacy/src/methods/streamMethods/clickAudio.ts +0 -310
- package/src/react-legacy/src/methods/streamMethods/clickChat.ts +0 -60
- package/src/react-legacy/src/methods/streamMethods/clickScreenShare.ts +0 -209
- package/src/react-legacy/src/methods/streamMethods/clickVideo.ts +0 -340
- package/src/react-legacy/src/methods/streamMethods/switchAudio.ts +0 -70
- package/src/react-legacy/src/methods/streamMethods/switchVideo.ts +0 -143
- package/src/react-legacy/src/methods/streamMethods/switchVideoAlt.ts +0 -139
- package/src/react-legacy/src/methods/utils/MiniAudioPlayer/MiniAudioPlayer.tsx +0 -362
- package/src/react-legacy/src/methods/utils/SoundPlayer.ts +0 -36
- package/src/react-legacy/src/methods/utils/checkLimitsAndMakeRequest.ts +0 -109
- package/src/react-legacy/src/methods/utils/createResponseJoinRoom.ts +0 -59
- package/src/react-legacy/src/methods/utils/createRoomOnMediaSFU.ts +0 -163
- package/src/react-legacy/src/methods/utils/formatNumber.ts +0 -38
- package/src/react-legacy/src/methods/utils/generateRandomMessages.ts +0 -112
- package/src/react-legacy/src/methods/utils/generateRandomParticipants.ts +0 -139
- package/src/react-legacy/src/methods/utils/generateRandomPolls.ts +0 -69
- package/src/react-legacy/src/methods/utils/generateRandomRequestList.ts +0 -103
- package/src/react-legacy/src/methods/utils/generateRandomWaitingRoomList.ts +0 -47
- package/src/react-legacy/src/methods/utils/getModalPosition.ts +0 -42
- package/src/react-legacy/src/methods/utils/getOverlayPosition.ts +0 -40
- package/src/react-legacy/src/methods/utils/joinRoomOnMediaSFU.ts +0 -153
- package/src/react-legacy/src/methods/utils/meetingTimer/startMeetingProgressTimer.ts +0 -95
- package/src/react-legacy/src/methods/utils/producer/aParams.ts +0 -26
- package/src/react-legacy/src/methods/utils/producer/hParams.ts +0 -45
- package/src/react-legacy/src/methods/utils/producer/screenParams.ts +0 -32
- package/src/react-legacy/src/methods/utils/producer/vParams.ts +0 -45
- package/src/react-legacy/src/methods/utils/producer/videoCaptureConstraints.ts +0 -79
- package/src/react-legacy/src/methods/utils/sleep.ts +0 -24
- package/src/react-legacy/src/methods/utils/validateAlphanumeric.ts +0 -41
- package/src/react-legacy/src/methods/waitingMethods/launchWaiting.ts +0 -34
- package/src/react-legacy/src/methods/waitingMethods/respondToWaiting.ts +0 -72
- package/src/react-legacy/src/methods/whiteboardMethods/captureCanvasStream.ts +0 -164
- package/src/react-legacy/src/methods/whiteboardMethods/launchConfigureWhiteboard.ts +0 -35
- package/src/react-legacy/src/producers/producerEmits/joinConRoom.ts +0 -153
- package/src/react-legacy/src/producers/socketReceiveMethods/allMembers.ts +0 -278
- package/src/react-legacy/src/producers/socketReceiveMethods/allMembersRest.ts +0 -309
- package/src/react-legacy/src/producers/socketReceiveMethods/allWaitingRoomMembers.ts +0 -48
- package/src/react-legacy/src/producers/socketReceiveMethods/banParticipant.ts +0 -85
- package/src/react-legacy/src/producers/socketReceiveMethods/controlMediaHost.ts +0 -189
- package/src/react-legacy/src/producers/socketReceiveMethods/disconnect.ts +0 -53
- package/src/react-legacy/src/producers/socketReceiveMethods/disconnectUserSelf.ts +0 -56
- package/src/react-legacy/src/producers/socketReceiveMethods/getDomains.ts +0 -116
- package/src/react-legacy/src/producers/socketReceiveMethods/hostRequestResponse.ts +0 -198
- package/src/react-legacy/src/producers/socketReceiveMethods/meetingEnded.ts +0 -67
- package/src/react-legacy/src/producers/socketReceiveMethods/meetingStillThere.ts +0 -34
- package/src/react-legacy/src/producers/socketReceiveMethods/meetingTimeRemaining.ts +0 -52
- package/src/react-legacy/src/producers/socketReceiveMethods/participantRequested.ts +0 -58
- package/src/react-legacy/src/producers/socketReceiveMethods/personJoined.ts +0 -40
- package/src/react-legacy/src/producers/socketReceiveMethods/producerMediaClosed.ts +0 -140
- package/src/react-legacy/src/producers/socketReceiveMethods/producerMediaPaused.ts +0 -177
- package/src/react-legacy/src/producers/socketReceiveMethods/producerMediaResumed.ts +0 -106
- package/src/react-legacy/src/producers/socketReceiveMethods/reInitiateRecording.ts +0 -54
- package/src/react-legacy/src/producers/socketReceiveMethods/receiveMessage.ts +0 -144
- package/src/react-legacy/src/producers/socketReceiveMethods/recordingNotice.ts +0 -313
- package/src/react-legacy/src/producers/socketReceiveMethods/roomRecordParams.ts +0 -184
- package/src/react-legacy/src/producers/socketReceiveMethods/screenProducerId.ts +0 -90
- package/src/react-legacy/src/producers/socketReceiveMethods/startRecords.ts +0 -54
- package/src/react-legacy/src/producers/socketReceiveMethods/stoppedRecording.ts +0 -53
- package/src/react-legacy/src/producers/socketReceiveMethods/timeLeftRecording.ts +0 -46
- package/src/react-legacy/src/producers/socketReceiveMethods/updateConsumingDomains.ts +0 -107
- package/src/react-legacy/src/producers/socketReceiveMethods/updateMediaSettings.ts +0 -64
- package/src/react-legacy/src/producers/socketReceiveMethods/updatedCoHost.ts +0 -95
- package/src/react-legacy/src/producers/socketReceiveMethods/userWaiting.ts +0 -52
- package/src/react-legacy/src/reportWebVitals.js +0 -13
- package/src/react-legacy/src/setupTests.js +0 -5
- package/src/react-legacy/src/setupTests.ts +0 -5
- package/src/react-legacy/src/sockets/SocketManager.ts +0 -232
- package/src/types/legacy.d.ts +0 -4
- /package/src/{react-legacy/src/components → components}/eventSettingsComponents/EventSettingsModal.css +0 -0
- /package/src/{react-legacy/src/methods → methods}/utils/initialValuesState.ts +0 -0
- /package/src/{react-legacy/src/methods → methods}/utils/webrtc/webrtc.ts +0 -0
package/README.md
CHANGED
|
@@ -37,32 +37,118 @@
|
|
|
37
37
|
|
|
38
38
|
---
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
# MediaSFU Vue SDK
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
- 🇺🇸 **+1 (785) 369-1724** - Mixed Support Demo
|
|
44
|
-
- 🇬🇧 **+44 7445 146575** - AI Conversation Demo
|
|
45
|
-
- 🇨🇦 **+1 (587) 407-1990** - Technical Support Demo
|
|
46
|
-
- 🇨🇦 **+1 (647) 558-6650** - Friendly AI Chat Demo
|
|
42
|
+
MediaSFU Vue is a Vue 3 WebRTC SDK for building video calling, voice calling, conferencing, webinars, live streaming, chat, recording, screen sharing, whiteboards, polls, live subtitles, translation, and collaboration workflows.
|
|
47
43
|
|
|
48
|
-
|
|
44
|
+
It is designed for teams that want to start with prebuilt room UI and then progressively customize or replace that UI without rebuilding the media runtime, signaling, or room orchestration from scratch.
|
|
49
45
|
|
|
50
|
-
|
|
51
|
-
✅ **Works with ANY SIP provider** (Twilio, Telnyx, Zadarma, etc.)
|
|
52
|
-
✅ **Seamless AI-to-human handoffs**
|
|
53
|
-
✅ **Real-time call analytics & transcription**
|
|
46
|
+
## Why Vue teams choose MediaSFU
|
|
54
47
|
|
|
55
|
-
|
|
48
|
+
- Start fast with `MediasfuGeneric` or the themed `ModernMediasfuGeneric`, plus `MediasfuConference`, `MediasfuWebinar`, `MediasfuBroadcast`, and `MediasfuChat`.
|
|
49
|
+
- Keep the bundled UI, override targeted surfaces with `uiOverrides`, or run the runtime headless with `returnUI={false}`.
|
|
50
|
+
- Connect to MediaSFU Cloud or your self-hosted MediaSFU Open deployment.
|
|
51
|
+
- Use Vue 3 and Composition API-friendly wrappers without losing access to the broader MediaSFU product model.
|
|
56
52
|
|
|
57
|
-
|
|
53
|
+
## Quick Start: First Working Room
|
|
58
54
|
|
|
59
|
-
|
|
55
|
+
```bash
|
|
56
|
+
npm install mediasfu-vue
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Import the package stylesheet once in your app entry, usually `main.ts`:
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
import 'mediasfu-vue/dist/mediasfu-vue.css';
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Then render one of the prebuilt room components. Keep real production credentials on your server. For local development, copy `.env.example` to `.env` and use Vite variables, or pass values from your own secure backend flow.
|
|
66
|
+
|
|
67
|
+
```vue
|
|
68
|
+
<script setup lang="ts">
|
|
69
|
+
import { MediasfuGeneric } from 'mediasfu-vue';
|
|
70
|
+
|
|
71
|
+
const credentials = {
|
|
72
|
+
apiUserName: import.meta.env.VITE_MEDIASFU_API_USERNAME ?? '',
|
|
73
|
+
apiKey: import.meta.env.VITE_MEDIASFU_API_KEY ?? '',
|
|
74
|
+
};
|
|
60
75
|
|
|
61
|
-
|
|
76
|
+
const localLink = import.meta.env.VITE_MEDIASFU_LOCAL_LINK ?? '';
|
|
77
|
+
const connectMediaSFU = localLink !== '' || Boolean(credentials.apiUserName && credentials.apiKey);
|
|
78
|
+
</script>
|
|
79
|
+
|
|
80
|
+
<template>
|
|
81
|
+
<MediasfuGeneric
|
|
82
|
+
:credentials="credentials"
|
|
83
|
+
:local-link="localLink"
|
|
84
|
+
:connectMediaSFU="connectMediaSFU"
|
|
85
|
+
/>
|
|
86
|
+
</template>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
You still need a MediaSFU-compatible backend for room lifecycle, signaling, and media routing. Use MediaSFU Cloud for managed infrastructure, or pass `localLink` to point at your self-hosted MediaSFU Open / Community Edition server.
|
|
90
|
+
|
|
91
|
+
If you want the same room runtime with the modern themed shell, import `ModernMediasfuGeneric` from the package root:
|
|
92
|
+
|
|
93
|
+
```vue
|
|
94
|
+
<script setup lang="ts">
|
|
95
|
+
import { ModernMediasfuGeneric } from 'mediasfu-vue';
|
|
96
|
+
|
|
97
|
+
const credentials = {
|
|
98
|
+
apiUserName: import.meta.env.VITE_MEDIASFU_API_USERNAME ?? '',
|
|
99
|
+
apiKey: import.meta.env.VITE_MEDIASFU_API_KEY ?? '',
|
|
100
|
+
};
|
|
101
|
+
</script>
|
|
102
|
+
|
|
103
|
+
<template>
|
|
104
|
+
<ModernMediasfuGeneric
|
|
105
|
+
:credentials="credentials"
|
|
106
|
+
:container-style="{
|
|
107
|
+
minHeight: '100vh',
|
|
108
|
+
background: 'linear-gradient(135deg, #0f172a, #1e3a8a)'
|
|
109
|
+
}"
|
|
110
|
+
/>
|
|
111
|
+
</template>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Use `MediasfuGeneric` when you want the classic entry flow and broadest parity with older examples. Use `ModernMediasfuGeneric` when you want the newer themed shell, modern modal system, and glassmorphism layout from the start.
|
|
115
|
+
|
|
116
|
+
### Choose an integration path
|
|
117
|
+
|
|
118
|
+
| Path | Best for | What you pass |
|
|
119
|
+
| --- | --- | --- |
|
|
120
|
+
| MediaSFU Cloud | Managed rooms, signaling, and media routing | `credentials` and `connectMediaSFU` |
|
|
121
|
+
| MediaSFU Open / CE | Self-hosted infrastructure | `localLink` and your CE server settings |
|
|
122
|
+
| Modern themed UI | New Vue apps that want the polished glassmorphism shell | `ModernMediasfuGeneric` with the same core room props |
|
|
123
|
+
| Secure production proxy | Public apps that must keep keys off the client | custom `createMediaSFURoom` and `joinMediaSFURoom` functions |
|
|
124
|
+
| Local UI mode | Storybook, demos, tests, and screenshots | `useLocalUIMode`, `useSeed`, and `seedData` |
|
|
125
|
+
|
|
126
|
+
Use the generic component when users choose the event type on a welcome screen. Use the named components when your product already knows the experience type.
|
|
127
|
+
|
|
128
|
+
```vue
|
|
129
|
+
<template>
|
|
130
|
+
<MediasfuConference :credentials="credentials" />
|
|
131
|
+
<MediasfuWebinar :credentials="credentials" />
|
|
132
|
+
<MediasfuBroadcast :credentials="credentials" />
|
|
133
|
+
<MediasfuChat :credentials="credentials" />
|
|
134
|
+
</template>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
For demos without a backend connection, seed the UI locally:
|
|
138
|
+
|
|
139
|
+
```vue
|
|
140
|
+
<template>
|
|
141
|
+
<MediasfuGeneric
|
|
142
|
+
:useLocalUIMode="true"
|
|
143
|
+
:useSeed="true"
|
|
144
|
+
:seedData="{ member: 'DemoUser', eventType: 'conference' }"
|
|
145
|
+
/>
|
|
146
|
+
</template>
|
|
147
|
+
```
|
|
62
148
|
|
|
63
149
|
---
|
|
64
150
|
|
|
65
|
-
##
|
|
151
|
+
## Required: Import CSS Styles
|
|
66
152
|
|
|
67
153
|
**MediaSFU UI will NOT display correctly without importing the CSS file!**
|
|
68
154
|
|
|
@@ -76,11 +162,32 @@ This is required for all MediaSFU components to render with proper styling. With
|
|
|
76
162
|
|
|
77
163
|
---
|
|
78
164
|
|
|
165
|
+
## Also available: AI phone agents, SIP, and PSTN flows
|
|
166
|
+
|
|
167
|
+
MediaSFU also supports AI phone agents and telephony workflows on top of the same broader communications platform.
|
|
168
|
+
|
|
169
|
+
Call the live demos:
|
|
170
|
+
|
|
171
|
+
- 🇺🇸 **+1 (785) 369-1724** - Mixed Support Demo
|
|
172
|
+
- 🇬🇧 **+44 7445 146575** - AI Conversation Demo
|
|
173
|
+
- 🇨🇦 **+1 (587) 407-1990** - Technical Support Demo
|
|
174
|
+
- 🇨🇦 **+1 (647) 558-6650** - Friendly AI Chat Demo
|
|
175
|
+
|
|
176
|
+
Why teams evaluate the telephony side:
|
|
177
|
+
|
|
178
|
+
- Deploy AI phone agents in about 30 minutes
|
|
179
|
+
- Works with SIP providers such as Twilio, Telnyx, and Zadarma
|
|
180
|
+
- Supports AI-to-human handoffs, analytics, and transcription
|
|
181
|
+
|
|
182
|
+
📖 **[Complete SIP/PSTN Documentation →](https://mediasfu.com/telephony)**
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
79
186
|
## Quick Reference: Component Props & UI Overrides
|
|
80
187
|
|
|
81
188
|
> **New:** UI override parity now extends across Webinar and Chat layouts, unifying customization for every MediaSFU interface.
|
|
82
189
|
|
|
83
|
-
Every primary MediaSFU UI export—`MediasfuGeneric`, `MediasfuBroadcast`, `MediasfuConference`, `MediasfuWebinar`, and `MediasfuChat`—now ships with a consistent prop surface and a powerful `uiOverrides` map, so you can bend the bundled experience to match your product without losing MediaSFU’s hardened real-time logic.
|
|
190
|
+
Every primary MediaSFU UI export—`MediasfuGeneric`, `ModernMediasfuGeneric`, `MediasfuBroadcast`, `MediasfuConference`, `MediasfuWebinar`, and `MediasfuChat`—now ships with a consistent core prop surface and a powerful `uiOverrides` map, so you can bend the bundled experience to match your product without losing MediaSFU’s hardened real-time logic.
|
|
84
191
|
|
|
85
192
|
### Shared component props (applies to every MediaSFU UI component)
|
|
86
193
|
|
|
@@ -103,7 +210,23 @@ Every primary MediaSFU UI export—`MediasfuGeneric`, `MediasfuBroadcast`, `Medi
|
|
|
103
210
|
| `containerStyle` | `StyleValue` | `undefined` | Apply inline styles to the root wrapper (dashboards, split views, etc.). |
|
|
104
211
|
| `uiOverrides` | `MediasfuUICustomOverrides` | `undefined` | Targeted component/function overrides described below. |
|
|
105
212
|
|
|
106
|
-
> **Power combo:** Set
|
|
213
|
+
> **Power combo:** Set `:returnUI="false"` to run MediaSFU logic headless, capture helpers via `updateSourceParameters`, and selectively bring UI pieces back with `uiOverrides`. That gives you progressive migration with minimal code churn.
|
|
214
|
+
|
|
215
|
+
### Launch contract for custom UI and sidebar panels
|
|
216
|
+
|
|
217
|
+
When you build on top of `sourceParameters`, `customComponent`, or `uiOverrides`, treat the raw `updateIs...Visible(true)` helpers as low-level state setters, not the preferred integration surface.
|
|
218
|
+
|
|
219
|
+
1. Use the SDK's sidebar-aware open helpers for desktop menu and side-panel flows whenever they are available. They preserve sidebar navigation history and choose the correct render mode for the current viewport.
|
|
220
|
+
2. `launchMediaSettings` and the recording launch path do setup work before the panel is shown. Media settings refreshes the latest camera and microphone lists, while recording re-checks permission and recording state. A direct visibility toggle can skip that setup.
|
|
221
|
+
3. If you wrap a modal or embedded sidebar body, resolve live params from `parameters.getUpdatedAllParams?.()` when it exists instead of caching the first `parameters` snapshot. That keeps device lists, recording state, and other mutable room data current.
|
|
222
|
+
|
|
223
|
+
```ts
|
|
224
|
+
const liveParameters = computed(
|
|
225
|
+
() => parameters.getUpdatedAllParams?.() ?? parameters
|
|
226
|
+
);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
This is especially important for custom media-settings, recording, and other sidebar-rendered panels that depend on fresh runtime state.
|
|
107
230
|
|
|
108
231
|
```ts
|
|
109
232
|
import type { MediasfuUICustomOverrides } from "mediasfu-vue";
|
|
@@ -113,142 +236,217 @@ const overrides: MediasfuUICustomOverrides = { /* ... */ };
|
|
|
113
236
|
|
|
114
237
|
Bring the types into your project to unlock full IntelliSense for every override slot.
|
|
115
238
|
|
|
116
|
-
###
|
|
239
|
+
### Vue Customization Playbook
|
|
117
240
|
|
|
118
|
-
Use
|
|
241
|
+
Use this progression when moving from a stock MediaSFU room to a product-specific Vue experience. Start with the prebuilt UI, add targeted overrides, then move to `customComponent` or `returnUI` only when your app needs full ownership of the interface.
|
|
119
242
|
|
|
120
|
-
####
|
|
243
|
+
#### 1. Switch event types and connection modes
|
|
121
244
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
245
|
+
```vue
|
|
246
|
+
<script setup lang="ts">
|
|
247
|
+
import { computed, ref } from 'vue';
|
|
248
|
+
import {
|
|
249
|
+
MediasfuBroadcast,
|
|
250
|
+
MediasfuChat,
|
|
251
|
+
MediasfuConference,
|
|
252
|
+
MediasfuGeneric,
|
|
253
|
+
MediasfuWebinar,
|
|
254
|
+
} from 'mediasfu-vue';
|
|
255
|
+
import type { MediasfuUICustomOverrides } from 'mediasfu-vue';
|
|
128
256
|
|
|
129
|
-
|
|
257
|
+
type ConnectionScenario = 'cloud' | 'hybrid' | 'ce';
|
|
258
|
+
type ExperienceKey = 'generic' | 'broadcast' | 'webinar' | 'conference' | 'chat';
|
|
130
259
|
|
|
131
|
-
|
|
132
|
-
const
|
|
133
|
-
const selectedExperience = "generic" as const;
|
|
134
|
-
const showPrebuiltUI = true;
|
|
135
|
-
const enableFullCustomUI = false;
|
|
260
|
+
const connectionScenario = ref<ConnectionScenario>('cloud');
|
|
261
|
+
const selectedExperience = ref<ExperienceKey>('generic');
|
|
136
262
|
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
ce: { credentials: undefined, localLink: "http://localhost:3000", connectMediaSFU: false },
|
|
263
|
+
const credentials = {
|
|
264
|
+
apiUserName: import.meta.env.VITE_MEDIASFU_API_USERNAME ?? '',
|
|
265
|
+
apiKey: import.meta.env.VITE_MEDIASFU_API_KEY ?? '',
|
|
141
266
|
};
|
|
142
267
|
|
|
143
|
-
const
|
|
268
|
+
const hasCloudCredentials = computed(
|
|
269
|
+
() => credentials.apiUserName.trim() !== '' && credentials.apiKey.trim() !== '',
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
const connectionPresets = computed(() => ({
|
|
273
|
+
cloud: {
|
|
274
|
+
credentials,
|
|
275
|
+
localLink: '',
|
|
276
|
+
connectMediaSFU: hasCloudCredentials.value,
|
|
277
|
+
},
|
|
278
|
+
hybrid: {
|
|
279
|
+
credentials,
|
|
280
|
+
localLink: 'http://localhost:3000',
|
|
281
|
+
connectMediaSFU: true,
|
|
282
|
+
},
|
|
283
|
+
ce: {
|
|
284
|
+
credentials: undefined,
|
|
285
|
+
localLink: 'http://localhost:3000',
|
|
286
|
+
connectMediaSFU: false,
|
|
287
|
+
},
|
|
288
|
+
}));
|
|
289
|
+
|
|
290
|
+
const experiences = {
|
|
144
291
|
generic: MediasfuGeneric,
|
|
145
292
|
broadcast: MediasfuBroadcast,
|
|
146
293
|
webinar: MediasfuWebinar,
|
|
147
294
|
conference: MediasfuConference,
|
|
148
295
|
chat: MediasfuChat,
|
|
149
|
-
}[selectedExperience];
|
|
150
|
-
|
|
151
|
-
export const CustomUIPlaybook = () => {
|
|
152
|
-
const overrides = useMemo(() => ({
|
|
153
|
-
mainContainer: enableFullCustomUI
|
|
154
|
-
? {
|
|
155
|
-
render: (props) => (
|
|
156
|
-
<div style={{ border: "4px dashed purple", borderRadius: 24, padding: 16 }}>
|
|
157
|
-
<MainContainerComponent {...props} />
|
|
158
|
-
</div>
|
|
159
|
-
),
|
|
160
|
-
}
|
|
161
|
-
: undefined,
|
|
162
|
-
}), [enableFullCustomUI]);
|
|
163
|
-
|
|
164
|
-
const current = connectionPresets[connectionScenario];
|
|
165
|
-
|
|
166
|
-
return (
|
|
167
|
-
<Experience
|
|
168
|
-
{...current}
|
|
169
|
-
showPrebuiltUI={showPrebuiltUI}
|
|
170
|
-
uiOverrides={overrides}
|
|
171
|
-
containerStyle={{ background: "linear-gradient(135deg, #0f172a, #1e3a8a)", minHeight: "100vh" }}
|
|
172
|
-
/>
|
|
173
|
-
);
|
|
174
296
|
};
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
Toggle the configuration values at the top of the playbook and watch the UI reconfigure instantly. It’s the fastest path to understand MediaSFU’s override surface before you fold the patterns into your production entrypoint.
|
|
178
297
|
|
|
179
|
-
|
|
298
|
+
const Experience = computed(() => experiences[selectedExperience.value]);
|
|
299
|
+
const currentConnection = computed(() => connectionPresets.value[connectionScenario.value]);
|
|
180
300
|
|
|
181
|
-
|
|
301
|
+
const uiOverrides = computed<MediasfuUICustomOverrides>(() => ({}));
|
|
302
|
+
</script>
|
|
182
303
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
border: "3px solid #4c1d95",
|
|
190
|
-
boxShadow: "0 28px 65px rgba(76,29,149,0.35)",
|
|
191
|
-
background: "linear-gradient(140deg, rgba(15,23,42,0.78), rgba(30,64,175,0.45))",
|
|
192
|
-
...(props.customStyle ?? {}),
|
|
193
|
-
}}
|
|
304
|
+
<template>
|
|
305
|
+
<component
|
|
306
|
+
:is="Experience"
|
|
307
|
+
v-bind="currentConnection"
|
|
308
|
+
:ui-overrides="uiOverrides"
|
|
309
|
+
:container-style="{ minHeight: '100vh' }"
|
|
194
310
|
/>
|
|
195
|
-
|
|
311
|
+
</template>
|
|
312
|
+
```
|
|
196
313
|
|
|
197
|
-
|
|
198
|
-
<AudioCard
|
|
199
|
-
{...props}
|
|
200
|
-
barColor="#22c55e"
|
|
201
|
-
customStyle={{ borderRadius: 22, background: "rgba(34,197,94,0.1)" }}
|
|
202
|
-
/>
|
|
203
|
-
);
|
|
314
|
+
#### 2. Replace cards, controls, or modals
|
|
204
315
|
|
|
205
|
-
|
|
206
|
-
<MiniCard
|
|
207
|
-
{...props}
|
|
208
|
-
renderContainer={({ defaultContainer }) => (
|
|
209
|
-
<div style={{ display: "grid", placeItems: "center", height: "100%" }}>{defaultContainer}</div>
|
|
210
|
-
)}
|
|
211
|
-
/>
|
|
212
|
-
);
|
|
316
|
+
Create normal Vue components for the parts your product owns, then wire them through `uiOverrides`.
|
|
213
317
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
},
|
|
318
|
+
```vue
|
|
319
|
+
<script setup lang="ts">
|
|
320
|
+
import { computed } from 'vue';
|
|
321
|
+
import { MediasfuConference } from 'mediasfu-vue';
|
|
322
|
+
import type { MediasfuUICustomOverrides } from 'mediasfu-vue';
|
|
323
|
+
import BrandedVideoCard from './BrandedVideoCard.vue';
|
|
324
|
+
import ProductControls from './ProductControls.vue';
|
|
325
|
+
import TeamMessagesModal from './TeamMessagesModal.vue';
|
|
326
|
+
|
|
327
|
+
const uiOverrides = computed<MediasfuUICustomOverrides>(() => ({
|
|
328
|
+
videoCard: { component: BrandedVideoCard },
|
|
329
|
+
controlButtons: { component: ProductControls },
|
|
330
|
+
messagesModal: { component: TeamMessagesModal },
|
|
225
331
|
consumerResume: {
|
|
226
332
|
wrap: (original) => async (params) => {
|
|
227
333
|
const startedAt = performance.now();
|
|
228
334
|
const result = await original(params);
|
|
229
|
-
|
|
230
|
-
|
|
335
|
+
|
|
336
|
+
console.info('consumer_resume', {
|
|
337
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
231
338
|
consumerId: params?.consumer?.id,
|
|
232
339
|
});
|
|
340
|
+
|
|
233
341
|
return result;
|
|
234
342
|
},
|
|
235
343
|
},
|
|
236
|
-
})
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
344
|
+
}));
|
|
345
|
+
</script>
|
|
346
|
+
|
|
347
|
+
<template>
|
|
348
|
+
<MediasfuConference :credentials="credentials" :ui-overrides="uiOverrides" />
|
|
349
|
+
</template>
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
#### 3. Own the whole shell with `customComponent`
|
|
353
|
+
|
|
354
|
+
Use `customComponent` when your app needs a branded workspace but still wants MediaSFU to manage room state, media transports, socket events, and helpers.
|
|
355
|
+
|
|
356
|
+
```vue
|
|
357
|
+
<script setup lang="ts">
|
|
358
|
+
import { computed, markRaw, ref } from 'vue';
|
|
359
|
+
import { MediasfuGeneric } from 'mediasfu-vue';
|
|
360
|
+
import ProductRoomShell from './ProductRoomShell.vue';
|
|
361
|
+
|
|
362
|
+
const enableProductShell = ref(true);
|
|
363
|
+
const customComponent = computed(() => (
|
|
364
|
+
enableProductShell.value ? markRaw(ProductRoomShell) : undefined
|
|
365
|
+
));
|
|
366
|
+
</script>
|
|
367
|
+
|
|
368
|
+
<template>
|
|
369
|
+
<MediasfuGeneric
|
|
370
|
+
:credentials="credentials"
|
|
371
|
+
:custom-component="customComponent"
|
|
247
372
|
/>
|
|
248
|
-
|
|
373
|
+
</template>
|
|
249
374
|
```
|
|
250
375
|
|
|
251
|
-
|
|
376
|
+
#### 4. Go headless with `returnUI=false`
|
|
377
|
+
|
|
378
|
+
Use headless mode when your app supplies every visible surface. MediaSFU still creates or joins the room and gives you helpers through `updateSourceParameters`.
|
|
379
|
+
|
|
380
|
+
```vue
|
|
381
|
+
<script setup lang="ts">
|
|
382
|
+
import { shallowRef } from 'vue';
|
|
383
|
+
import { MediasfuGeneric } from 'mediasfu-vue';
|
|
384
|
+
|
|
385
|
+
const sourceParameters = shallowRef<Record<string, unknown>>({});
|
|
386
|
+
|
|
387
|
+
const updateSourceParameters = (helpers: Record<string, unknown>) => {
|
|
388
|
+
sourceParameters.value = helpers;
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
const noUIPreJoinOptions = {
|
|
392
|
+
action: 'create',
|
|
393
|
+
eventType: 'conference',
|
|
394
|
+
userName: 'Host',
|
|
395
|
+
duration: 60,
|
|
396
|
+
capacity: 25,
|
|
397
|
+
};
|
|
398
|
+
</script>
|
|
399
|
+
|
|
400
|
+
<template>
|
|
401
|
+
<MediasfuGeneric
|
|
402
|
+
:credentials="credentials"
|
|
403
|
+
:returnUI="false"
|
|
404
|
+
:noUIPreJoinOptions="noUIPreJoinOptions"
|
|
405
|
+
:sourceParameters="sourceParameters"
|
|
406
|
+
:updateSourceParameters="updateSourceParameters"
|
|
407
|
+
/>
|
|
408
|
+
</template>
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
#### 5. Keep production credentials server-side
|
|
412
|
+
|
|
413
|
+
For public applications, proxy room creation and join calls through your own backend. The browser sends ordinary user/session data to your server, and your server calls MediaSFU Cloud with real credentials.
|
|
414
|
+
|
|
415
|
+
```vue
|
|
416
|
+
<script setup lang="ts">
|
|
417
|
+
import { MediasfuGeneric } from 'mediasfu-vue';
|
|
418
|
+
|
|
419
|
+
const createMediaSFURoom = async (options: unknown) => {
|
|
420
|
+
const response = await fetch('/api/mediasfu/create-room', {
|
|
421
|
+
method: 'POST',
|
|
422
|
+
headers: { 'Content-Type': 'application/json' },
|
|
423
|
+
body: JSON.stringify(options),
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
return response.json();
|
|
427
|
+
};
|
|
428
|
+
|
|
429
|
+
const joinMediaSFURoom = async (options: unknown) => {
|
|
430
|
+
const response = await fetch('/api/mediasfu/join-room', {
|
|
431
|
+
method: 'POST',
|
|
432
|
+
headers: { 'Content-Type': 'application/json' },
|
|
433
|
+
body: JSON.stringify(options),
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
return response.json();
|
|
437
|
+
};
|
|
438
|
+
</script>
|
|
439
|
+
|
|
440
|
+
<template>
|
|
441
|
+
<MediasfuGeneric
|
|
442
|
+
:createMediaSFURoom="createMediaSFURoom"
|
|
443
|
+
:joinMediaSFURoom="joinMediaSFURoom"
|
|
444
|
+
:connectMediaSFU="true"
|
|
445
|
+
/>
|
|
446
|
+
</template>
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Because these patterns all work through Vue components, refs, computed values, and normal template bindings, they are easier to lift into Nuxt, dashboards, learning platforms, telehealth apps, livestream studios, and collaboration tools.
|
|
252
450
|
|
|
253
451
|
### `uiOverrides` map — override keys at a glance
|
|
254
452
|
|
|
@@ -276,7 +474,7 @@ Each key accepts a `CustomComponentOverride<Props>` object with optional `compon
|
|
|
276
474
|
|
|
277
475
|
| Key | Default component | Typical use |
|
|
278
476
|
| --- | --- | --- |
|
|
279
|
-
| `videoCard` | `VideoCard` | Add host badges,
|
|
477
|
+
| `videoCard` | `VideoCard` | Add host badges, captions, or CRM overlays. |
|
|
280
478
|
| `audioCard` | `AudioCard` | Swap avatars or expose spoken-language info. |
|
|
281
479
|
| `miniCard` | `MiniCard` | Customize thumbnails in picture-in-picture modes. |
|
|
282
480
|
| `miniAudio` | `MiniAudio` | Re-style the audio-only mini indicators. |
|
|
@@ -329,47 +527,59 @@ Each key accepts a `CustomComponentOverride<Props>` object with optional `compon
|
|
|
329
527
|
|
|
330
528
|
### Example: swap the chat modal and theme the controls
|
|
331
529
|
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
import {
|
|
335
|
-
import {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
<MediasfuGeneric credentials=
|
|
348
|
-
|
|
530
|
+
```vue
|
|
531
|
+
<script setup lang="ts">
|
|
532
|
+
import { computed } from 'vue';
|
|
533
|
+
import { MediasfuGeneric } from 'mediasfu-vue';
|
|
534
|
+
import type { MediasfuUICustomOverrides } from 'mediasfu-vue';
|
|
535
|
+
import MyChatModal from './ui/MyChatModal.vue';
|
|
536
|
+
import MyControls from './ui/MyControls.vue';
|
|
537
|
+
|
|
538
|
+
const uiOverrides = computed<MediasfuUICustomOverrides>(() => ({
|
|
539
|
+
messagesModal: { component: MyChatModal },
|
|
540
|
+
controlButtons: { component: MyControls },
|
|
541
|
+
}));
|
|
542
|
+
</script>
|
|
543
|
+
|
|
544
|
+
<template>
|
|
545
|
+
<MediasfuGeneric :credentials="credentials" :ui-overrides="uiOverrides" />
|
|
546
|
+
</template>
|
|
349
547
|
```
|
|
350
548
|
|
|
351
549
|
### Example: wrap a MediaSFU helper instead of replacing it
|
|
352
550
|
|
|
353
|
-
```
|
|
354
|
-
|
|
551
|
+
```vue
|
|
552
|
+
<script setup lang="ts">
|
|
553
|
+
import { computed } from 'vue';
|
|
554
|
+
import { MediasfuConference } from 'mediasfu-vue';
|
|
555
|
+
import type { MediasfuUICustomOverrides } from 'mediasfu-vue';
|
|
556
|
+
|
|
557
|
+
const uiOverrides = computed<MediasfuUICustomOverrides>(() => ({
|
|
355
558
|
consumerResume: {
|
|
356
559
|
wrap: (original) => async (params) => {
|
|
357
560
|
const startedAt = performance.now();
|
|
358
561
|
const result = await original(params);
|
|
359
|
-
|
|
360
|
-
|
|
562
|
+
|
|
563
|
+
console.info('consumer_resume', {
|
|
564
|
+
durationMs: Math.round(performance.now() - startedAt),
|
|
361
565
|
consumerId: params?.consumer?.id,
|
|
362
566
|
});
|
|
567
|
+
|
|
363
568
|
return result;
|
|
364
569
|
},
|
|
365
570
|
},
|
|
366
|
-
};
|
|
571
|
+
}));
|
|
572
|
+
</script>
|
|
367
573
|
|
|
368
|
-
<
|
|
574
|
+
<template>
|
|
575
|
+
<MediasfuConference :credentials="credentials" :ui-overrides="uiOverrides" />
|
|
576
|
+
</template>
|
|
369
577
|
```
|
|
370
578
|
|
|
371
579
|
The same override hooks power the newly refreshed `MediasfuWebinar` and `MediasfuChat` layouts, so you can guarantee a unified experience across events, webinars, or chat-first rooms.
|
|
372
580
|
|
|
581
|
+
The sections below keep the broader API reference and migration history. For new Vue 3 apps, prefer the Vue Composition API examples above whenever syntax differs.
|
|
582
|
+
|
|
373
583
|
---
|
|
374
584
|
|
|
375
585
|
MediaSFU offers a cutting-edge streaming experience that empowers users to customize their recordings and engage their audience with high-quality streams. Whether you're a content creator, educator, or business professional, MediaSFU provides the tools you need to elevate your streaming game.
|
|
@@ -3460,7 +3670,7 @@ export default App;
|
|
|
3460
3670
|
* return res.status(401).json({ error: "Invalid or expired credentials" });
|
|
3461
3671
|
* }
|
|
3462
3672
|
*
|
|
3463
|
-
* const response = await fetch("https://mediasfu.com/v1/rooms", {
|
|
3673
|
+
* const response = await fetch("https://mediasfu.com/v1/rooms/", {
|
|
3464
3674
|
* method: "POST",
|
|
3465
3675
|
* headers: {
|
|
3466
3676
|
* "Content-Type": "application/json",
|
|
@@ -3548,7 +3758,7 @@ export default App;
|
|
|
3548
3758
|
* localLink = '',
|
|
3549
3759
|
* }) => {
|
|
3550
3760
|
* try {
|
|
3551
|
-
* let finalLink = 'https://mediasfu.com/v1/rooms/
|
|
3761
|
+
* let finalLink = 'https://mediasfu.com/v1/rooms/';
|
|
3552
3762
|
*
|
|
3553
3763
|
* // Update finalLink if using a local server
|
|
3554
3764
|
* if (localLink) {
|
|
@@ -4755,16 +4965,16 @@ To implement your custom UI for media display:
|
|
|
4755
4965
|
|
|
4756
4966
|
1. **Custom MainGrid (Host's Video)**:
|
|
4757
4967
|
- Modify the UI in the `prepopulateUserMedia` function.
|
|
4758
|
-
|
|
4968
|
+
- Example link to MediaSFU's default implementation: [`prepopulateUserMedia`](https://github.com/MediaSFU/MediaSFU-Vue/blob/main/src/consumers/prepopulateUserMedia.ts).
|
|
4759
4969
|
|
|
4760
4970
|
2. **Custom MiniGrid (Participants' Media)**:
|
|
4761
4971
|
- Modify the UI in the `addVideosGrid` function.
|
|
4762
|
-
|
|
4972
|
+
- Example link to MediaSFU's default implementation: [`addVideosGrid`](https://github.com/MediaSFU/MediaSFU-Vue/blob/main/src/consumers/addVideosGrid.ts).
|
|
4763
4973
|
|
|
4764
4974
|
To create a custom UI, you can refer to existing MediaSFU implementations like:
|
|
4765
4975
|
|
|
4766
|
-
- [MediasfuGeneric](https://github.com/MediaSFU/MediaSFU-Vue/blob/main/src/components/mediasfuComponents/MediasfuGeneric.
|
|
4767
|
-
- [MediasfuBroadcast](https://github.com/MediaSFU/MediaSFU-Vue/blob/main/src/components/mediasfuComponents/MediasfuBroadcast.
|
|
4976
|
+
- [MediasfuGeneric](https://github.com/MediaSFU/MediaSFU-Vue/blob/main/src/components/mediasfuComponents/MediasfuGeneric.vue)
|
|
4977
|
+
- [MediasfuBroadcast](https://github.com/MediaSFU/MediaSFU-Vue/blob/main/src/components/mediasfuComponents/MediasfuBroadcast.vue)
|
|
4768
4978
|
|
|
4769
4979
|
Once your custom components are built, modify the imports of `prepopulateUserMedia` and `addVideosGrid` to point to your custom implementations instead of the default MediaSFU ones.
|
|
4770
4980
|
|
|
@@ -5004,7 +5214,7 @@ https://github.com/user-attachments/assets/310cb87c-dade-445d-aee7-dea1889d6dc4
|
|
|
5004
5214
|
|
|
5005
5215
|
# Contributing <a name="contributing"></a>
|
|
5006
5216
|
|
|
5007
|
-
We welcome contributions from the community to improve the project! If you'd like to contribute, please check out our [GitHub repository](https://github.com/MediaSFU-Vue) and follow the guidelines outlined in the README.
|
|
5217
|
+
We welcome contributions from the community to improve the project! If you'd like to contribute, please check out our [GitHub repository](https://github.com/MediaSFU/MediaSFU-Vue) and follow the guidelines outlined in the README.
|
|
5008
5218
|
|
|
5009
5219
|
If you encounter any issues or have suggestions for improvement, please feel free to open an issue on GitHub.
|
|
5010
5220
|
|