mediasfu-angular 1.0.2 → 2.0.1
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 +686 -578
- package/dist/README.md +677 -578
- package/dist/fesm2022/mediasfu-angular.mjs +5551 -2944
- package/dist/fesm2022/mediasfu-angular.mjs.map +1 -1
- package/dist/lib/@types/types.d.ts +22 -1
- package/dist/lib/components/breakout-components/breakout-rooms-modal.component.d.ts +1 -0
- package/dist/lib/components/mediasfu-components/mediasfu-broadcast.component.d.ts +153 -61
- package/dist/lib/components/mediasfu-components/mediasfu-chat.component.d.ts +154 -66
- package/dist/lib/components/mediasfu-components/mediasfu-conference.component.d.ts +190 -76
- package/dist/lib/components/mediasfu-components/mediasfu-generic.component.d.ts +184 -70
- package/dist/lib/components/mediasfu-components/mediasfu-webinar.component.d.ts +192 -78
- package/dist/lib/components/menu-components/menu-modal/menu-modal.component.d.ts +6 -1
- package/dist/lib/components/menu-components/share-buttons-component/share-buttons-component.component.d.ts +5 -2
- package/dist/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.d.ts +4 -2
- package/dist/lib/components/misc-components/pre-join-page/pre-join-page.component.d.ts +71 -66
- package/dist/lib/components/misc-components/share-event-modal/share-event-modal.component.d.ts +5 -1
- package/dist/lib/consumers/connect-local-ips.service.d.ts +81 -0
- package/dist/lib/consumers/connect-send-transport-audio.service.d.ts +43 -11
- package/dist/lib/consumers/connect-send-transport-screen.service.d.ts +87 -46
- package/dist/lib/consumers/connect-send-transport-video.service.d.ts +89 -43
- package/dist/lib/consumers/connect-send-transport.service.d.ts +5 -1
- package/dist/lib/consumers/create-send-transport.service.d.ts +130 -40
- package/dist/lib/consumers/disconnect-send-transport-audio.service.d.ts +77 -40
- package/dist/lib/consumers/disconnect-send-transport-screen.service.d.ts +48 -14
- package/dist/lib/consumers/disconnect-send-transport-video.service.d.ts +81 -44
- package/dist/lib/consumers/get-piped-producers-alt.service.d.ts +5 -1
- package/dist/lib/consumers/receive-all-piped-transports.service.d.ts +5 -1
- package/dist/lib/consumers/resume-send-transport-audio.service.d.ts +54 -21
- package/dist/lib/consumers/stream-success-audio-switch.service.d.ts +124 -40
- package/dist/lib/consumers/trigger.service.d.ts +3 -0
- package/dist/lib/methods/exit-methods/confirm-exit.service.d.ts +5 -1
- package/dist/lib/methods/recording-methods/start-recording.service.d.ts +3 -0
- package/dist/lib/methods/recording-methods/stop-recording.service.d.ts +4 -1
- package/dist/lib/methods/recording-methods/update-recording.service.d.ts +3 -0
- package/dist/lib/methods/stream-methods/click-audio.service.d.ts +3 -0
- package/dist/lib/methods/utils/check-limits-and-make-request.service.d.ts +23 -0
- package/dist/lib/methods/utils/create-response-join-room.util.d.ts +33 -0
- package/dist/lib/methods/utils/create-room-on-media-sfu.service.d.ts +25 -0
- package/dist/lib/methods/utils/initial-values.util.d.ts +6 -0
- package/dist/lib/methods/utils/join-room-on-media-sfu.service.d.ts +52 -0
- package/dist/lib/methods/whiteboard-methods/capture-canvas-stream.service.d.ts +37 -20
- package/dist/lib/producers/producer-emits/join-local-room.service.d.ts +125 -0
- package/dist/lib/producers/socket-receive-methods/all-members-rest.service.d.ts +7 -2
- package/dist/lib/producers/socket-receive-methods/all-members.service.d.ts +7 -2
- package/dist/lib/producers/socket-receive-methods/disconnect-user-self.service.d.ts +5 -1
- package/dist/lib/sockets/socket-manager.service.d.ts +90 -0
- package/dist/public-api.d.ts +11 -1
- package/package.json +17 -20
- package/dist/esm2022/lib/@types/types.mjs +0 -2
- package/dist/esm2022/lib/components/background-components/background-modal/background-modal.component.mjs +0 -799
- package/dist/esm2022/lib/components/breakout-components/breakout-rooms-modal.component.mjs +0 -366
- package/dist/esm2022/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.mjs +0 -143
- package/dist/esm2022/lib/components/breakout-components/room-list/room-list.component.mjs +0 -40
- package/dist/esm2022/lib/components/co-host-components/co-host-modal/co-host-modal.component.mjs +0 -245
- package/dist/esm2022/lib/components/display-components/alert-component/alert.component.component.mjs +0 -79
- package/dist/esm2022/lib/components/display-components/audio-card/audio-card.component.mjs +0 -356
- package/dist/esm2022/lib/components/display-components/audio-grid/audio-grid.component.mjs +0 -80
- package/dist/esm2022/lib/components/display-components/card-video-display/card-video-display.component.mjs +0 -129
- package/dist/esm2022/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.mjs +0 -138
- package/dist/esm2022/lib/components/display-components/control-buttons-component/control-buttons-component.component.mjs +0 -231
- package/dist/esm2022/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.mjs +0 -282
- package/dist/esm2022/lib/components/display-components/control-widgets/menu-participants-widget.component.mjs +0 -82
- package/dist/esm2022/lib/components/display-components/control-widgets/menu-record-widget.component.mjs +0 -65
- package/dist/esm2022/lib/components/display-components/control-widgets/menu-widget.component.mjs +0 -137
- package/dist/esm2022/lib/components/display-components/control-widgets/message-widget.component.mjs +0 -137
- package/dist/esm2022/lib/components/display-components/control-widgets/record-timer-widget.component.mjs +0 -51
- package/dist/esm2022/lib/components/display-components/control-widgets/screenshare-widget.component.mjs +0 -101
- package/dist/esm2022/lib/components/display-components/flexible-grid/flexible-grid.component.mjs +0 -151
- package/dist/esm2022/lib/components/display-components/flexible-video/flexible-video.component.mjs +0 -250
- package/dist/esm2022/lib/components/display-components/loading-modal/loading-modal.component.mjs +0 -102
- package/dist/esm2022/lib/components/display-components/main-aspect-component/main-aspect-component.component.mjs +0 -140
- package/dist/esm2022/lib/components/display-components/main-container-component/main-container-component.component.mjs +0 -131
- package/dist/esm2022/lib/components/display-components/main-grid-component/main-grid-component.component.mjs +0 -120
- package/dist/esm2022/lib/components/display-components/main-screen-component/main-screen-component.component.mjs +0 -201
- package/dist/esm2022/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.mjs +0 -115
- package/dist/esm2022/lib/components/display-components/mini-audio/mini-audio.component.mjs +0 -319
- package/dist/esm2022/lib/components/display-components/mini-card/mini-card.component.mjs +0 -161
- package/dist/esm2022/lib/components/display-components/mini-card-audio/mini-card-audio.component.mjs +0 -230
- package/dist/esm2022/lib/components/display-components/other-grid-component/other-grid-component.component.mjs +0 -126
- package/dist/esm2022/lib/components/display-components/pagination/pagination.component.mjs +0 -334
- package/dist/esm2022/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.mjs +0 -112
- package/dist/esm2022/lib/components/display-components/video-card/video-card.component.mjs +0 -392
- package/dist/esm2022/lib/components/display-settings-components/display-settings-modal.component.mjs +0 -106
- package/dist/esm2022/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.mjs +0 -199
- package/dist/esm2022/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.mjs +0 -132
- package/dist/esm2022/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.mjs +0 -220
- package/dist/esm2022/lib/components/mediasfu-components/mediasfu-broadcast.component.mjs +0 -4238
- package/dist/esm2022/lib/components/mediasfu-components/mediasfu-chat.component.mjs +0 -3754
- package/dist/esm2022/lib/components/mediasfu-components/mediasfu-conference.component.mjs +0 -5071
- package/dist/esm2022/lib/components/mediasfu-components/mediasfu-generic.component.mjs +0 -5380
- package/dist/esm2022/lib/components/mediasfu-components/mediasfu-webinar.component.mjs +0 -5068
- package/dist/esm2022/lib/components/menu-components/custom-buttons/custom-buttons.component.mjs +0 -83
- package/dist/esm2022/lib/components/menu-components/meeting-id-component/meeting-id-component.component.mjs +0 -27
- package/dist/esm2022/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.mjs +0 -27
- package/dist/esm2022/lib/components/menu-components/menu-modal/menu-modal.component.mjs +0 -125
- package/dist/esm2022/lib/components/menu-components/share-buttons-component/share-buttons-component.component.mjs +0 -106
- package/dist/esm2022/lib/components/message-components/message-panel/message-panel.component.mjs +0 -228
- package/dist/esm2022/lib/components/message-components/messages-modal/messages-modal.component.mjs +0 -277
- package/dist/esm2022/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.mjs +0 -130
- package/dist/esm2022/lib/components/misc-components/pre-join-page/pre-join-page.component.mjs +0 -343
- package/dist/esm2022/lib/components/misc-components/share-event-modal/share-event-modal.component.mjs +0 -127
- package/dist/esm2022/lib/components/misc-components/welcome-page/welcome-page.component.mjs +0 -241
- package/dist/esm2022/lib/components/participants-components/participant-list/participant-list.component.mjs +0 -82
- package/dist/esm2022/lib/components/participants-components/participant-list-item/participant-list-item.component.mjs +0 -139
- package/dist/esm2022/lib/components/participants-components/participant-list-others/participant-list-others.component.mjs +0 -40
- package/dist/esm2022/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.mjs +0 -60
- package/dist/esm2022/lib/components/participants-components/participants-modal/participants-modal.component.mjs +0 -124
- package/dist/esm2022/lib/components/polls-components/poll-modal/poll-modal.component.mjs +0 -201
- package/dist/esm2022/lib/components/recording-components/advanced-panel-component/advanced-panel-components.component.mjs +0 -92
- package/dist/esm2022/lib/components/recording-components/recording-modal/recording-modal.component.mjs +0 -133
- package/dist/esm2022/lib/components/recording-components/standard-panel-component/standard-panel-component.component.mjs +0 -90
- package/dist/esm2022/lib/components/requests-components/render-request-component/render-request-component.component.mjs +0 -81
- package/dist/esm2022/lib/components/requests-components/requests-modal/requests-modal.component.mjs +0 -147
- package/dist/esm2022/lib/components/screenboard-components/screenboard/screenboard.component.mjs +0 -627
- package/dist/esm2022/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.mjs +0 -391
- package/dist/esm2022/lib/components/waiting-components/waiting-room-modal.component.mjs +0 -201
- package/dist/esm2022/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.mjs +0 -286
- package/dist/esm2022/lib/components/whiteboard-components/whiteboard/whiteboard.component.mjs +0 -1833
- package/dist/esm2022/lib/consumers/add-videos-grid.service.mjs +0 -345
- package/dist/esm2022/lib/consumers/auto-adjust.service.mjs +0 -109
- package/dist/esm2022/lib/consumers/calculate-rows-and-columns.service.mjs +0 -60
- package/dist/esm2022/lib/consumers/change-vids.service.mjs +0 -551
- package/dist/esm2022/lib/consumers/check-grid.service.mjs +0 -93
- package/dist/esm2022/lib/consumers/check-permission.service.mjs +0 -105
- package/dist/esm2022/lib/consumers/check-screen-share.service.mjs +0 -106
- package/dist/esm2022/lib/consumers/close-and-resize.service.mjs +0 -331
- package/dist/esm2022/lib/consumers/compare-active-names.service.mjs +0 -106
- package/dist/esm2022/lib/consumers/compare-screen-states.service.mjs +0 -98
- package/dist/esm2022/lib/consumers/connect-ips.service.mjs +0 -154
- package/dist/esm2022/lib/consumers/connect-recv-transport.service.mjs +0 -146
- package/dist/esm2022/lib/consumers/connect-send-transport-audio.service.mjs +0 -84
- package/dist/esm2022/lib/consumers/connect-send-transport-screen.service.mjs +0 -102
- package/dist/esm2022/lib/consumers/connect-send-transport-video.service.mjs +0 -99
- package/dist/esm2022/lib/consumers/connect-send-transport.service.mjs +0 -140
- package/dist/esm2022/lib/consumers/consumer-resume.service.mjs +0 -368
- package/dist/esm2022/lib/consumers/control-media.service.mjs +0 -113
- package/dist/esm2022/lib/consumers/create-send-transport.service.mjs +0 -172
- package/dist/esm2022/lib/consumers/disconnect-send-transport-audio.service.mjs +0 -108
- package/dist/esm2022/lib/consumers/disconnect-send-transport-screen.service.mjs +0 -84
- package/dist/esm2022/lib/consumers/disconnect-send-transport-video.service.mjs +0 -101
- package/dist/esm2022/lib/consumers/disp-streams.service.mjs +0 -513
- package/dist/esm2022/lib/consumers/generate-page-content.service.mjs +0 -106
- package/dist/esm2022/lib/consumers/get-estimate.service.mjs +0 -120
- package/dist/esm2022/lib/consumers/get-piped-producers-alt.service.mjs +0 -82
- package/dist/esm2022/lib/consumers/get-producers-piped.service.mjs +0 -79
- package/dist/esm2022/lib/consumers/get-videos.service.mjs +0 -91
- package/dist/esm2022/lib/consumers/mix-streams.service.mjs +0 -95
- package/dist/esm2022/lib/consumers/on-screen-changes.service.mjs +0 -103
- package/dist/esm2022/lib/consumers/prepopulate-user-media.service.mjs +0 -541
- package/dist/esm2022/lib/consumers/process-consumer-transports-audio.service.mjs +0 -101
- package/dist/esm2022/lib/consumers/process-consumer-transports.service.mjs +0 -128
- package/dist/esm2022/lib/consumers/re-port.service.mjs +0 -114
- package/dist/esm2022/lib/consumers/re-update-inter.service.mjs +0 -239
- package/dist/esm2022/lib/consumers/readjust.service.mjs +0 -173
- package/dist/esm2022/lib/consumers/receive-all-piped-transports.service.mjs +0 -87
- package/dist/esm2022/lib/consumers/receive-room-messages.service.mjs +0 -69
- package/dist/esm2022/lib/consumers/reorder-streams.service.mjs +0 -239
- package/dist/esm2022/lib/consumers/request-screen-share.service.mjs +0 -101
- package/dist/esm2022/lib/consumers/resume-pause-audio-streams.service.mjs +0 -150
- package/dist/esm2022/lib/consumers/resume-pause-streams.service.mjs +0 -103
- package/dist/esm2022/lib/consumers/resume-send-transport-audio.service.mjs +0 -91
- package/dist/esm2022/lib/consumers/signal-new-consumer-transport.service.mjs +0 -136
- package/dist/esm2022/lib/consumers/socket-receive-methods/join-consume-room.service.mjs +0 -96
- package/dist/esm2022/lib/consumers/socket-receive-methods/new-pipe-producer.service.mjs +0 -100
- package/dist/esm2022/lib/consumers/socket-receive-methods/producer-closed.service.mjs +0 -78
- package/dist/esm2022/lib/consumers/start-share-screen.service.mjs +0 -120
- package/dist/esm2022/lib/consumers/stop-share-screen.service.mjs +0 -175
- package/dist/esm2022/lib/consumers/stream-success-audio-switch.service.mjs +0 -185
- package/dist/esm2022/lib/consumers/stream-success-audio.service.mjs +0 -210
- package/dist/esm2022/lib/consumers/stream-success-screen.service.mjs +0 -193
- package/dist/esm2022/lib/consumers/stream-success-video.service.mjs +0 -260
- package/dist/esm2022/lib/consumers/switch-user-audio.service.mjs +0 -120
- package/dist/esm2022/lib/consumers/switch-user-video-alt.service.mjs +0 -260
- package/dist/esm2022/lib/consumers/switch-user-video.service.mjs +0 -172
- package/dist/esm2022/lib/consumers/trigger.service.mjs +0 -210
- package/dist/esm2022/lib/consumers/update-mini-cards-grid.service.mjs +0 -135
- package/dist/esm2022/lib/consumers/update-participant-audio-decibels.service.mjs +0 -84
- package/dist/esm2022/lib/methods/background-methods/launch-background.service.mjs +0 -48
- package/dist/esm2022/lib/methods/breakout-room-methods/breakout-room-updated.service.mjs +0 -183
- package/dist/esm2022/lib/methods/breakout-room-methods/launch-breakout-rooms.service.mjs +0 -46
- package/dist/esm2022/lib/methods/co-host-methods/launch-co-host.service.mjs +0 -46
- package/dist/esm2022/lib/methods/co-host-methods/modify-co-host-settings.service.mjs +0 -104
- package/dist/esm2022/lib/methods/display-settings-methods/launch-display-settings.service.mjs +0 -46
- package/dist/esm2022/lib/methods/display-settings-methods/modify-display-settings.service.mjs +0 -194
- package/dist/esm2022/lib/methods/exit-methods/confirm-exit.service.mjs +0 -52
- package/dist/esm2022/lib/methods/exit-methods/launch-confirm-exit.service.mjs +0 -42
- package/dist/esm2022/lib/methods/media-settings-methods/launch-media-settings.service.mjs +0 -85
- package/dist/esm2022/lib/methods/menu-methods/launch-menu-modal.service.mjs +0 -44
- package/dist/esm2022/lib/methods/message-methods/launch-messages.service.mjs +0 -45
- package/dist/esm2022/lib/methods/message-methods/send-message.service.mjs +0 -143
- package/dist/esm2022/lib/methods/participants-methods/launch-participants.service.mjs +0 -47
- package/dist/esm2022/lib/methods/participants-methods/message-participants.service.mjs +0 -98
- package/dist/esm2022/lib/methods/participants-methods/mute-participants.service.mjs +0 -96
- package/dist/esm2022/lib/methods/participants-methods/remove-participants.service.mjs +0 -107
- package/dist/esm2022/lib/methods/polls-methods/handle-create-poll.service.mjs +0 -75
- package/dist/esm2022/lib/methods/polls-methods/handle-end-poll.service.mjs +0 -72
- package/dist/esm2022/lib/methods/polls-methods/handle-vote-poll.service.mjs +0 -83
- package/dist/esm2022/lib/methods/polls-methods/launch-poll.service.mjs +0 -43
- package/dist/esm2022/lib/methods/polls-methods/poll-updated.service.mjs +0 -95
- package/dist/esm2022/lib/methods/recording-methods/check-pause-state.service.mjs +0 -69
- package/dist/esm2022/lib/methods/recording-methods/check-resume-state.service.mjs +0 -56
- package/dist/esm2022/lib/methods/recording-methods/confirm-recording.service.mjs +0 -278
- package/dist/esm2022/lib/methods/recording-methods/launch-recording.service.mjs +0 -125
- package/dist/esm2022/lib/methods/recording-methods/record-pause-timer.service.mjs +0 -67
- package/dist/esm2022/lib/methods/recording-methods/record-resume-timer.service.mjs +0 -130
- package/dist/esm2022/lib/methods/recording-methods/record-start-timer.service.mjs +0 -134
- package/dist/esm2022/lib/methods/recording-methods/record-update-timer.service.mjs +0 -80
- package/dist/esm2022/lib/methods/recording-methods/start-recording.service.mjs +0 -197
- package/dist/esm2022/lib/methods/recording-methods/stop-recording.service.mjs +0 -112
- package/dist/esm2022/lib/methods/recording-methods/update-recording.service.mjs +0 -272
- package/dist/esm2022/lib/methods/requests-methods/launch-requests.service.mjs +0 -51
- package/dist/esm2022/lib/methods/requests-methods/respond-to-requests.service.mjs +0 -84
- package/dist/esm2022/lib/methods/settings-methods/launch-settings.service.mjs +0 -51
- package/dist/esm2022/lib/methods/settings-methods/modify-settings.service.mjs +0 -109
- package/dist/esm2022/lib/methods/stream-methods/click-audio.service.mjs +0 -275
- package/dist/esm2022/lib/methods/stream-methods/click-chat.service.mjs +0 -75
- package/dist/esm2022/lib/methods/stream-methods/click-screen-share.service.mjs +0 -178
- package/dist/esm2022/lib/methods/stream-methods/click-video.service.mjs +0 -271
- package/dist/esm2022/lib/methods/stream-methods/switch-audio.service.mjs +0 -80
- package/dist/esm2022/lib/methods/stream-methods/switch-video-alt.service.mjs +0 -116
- package/dist/esm2022/lib/methods/stream-methods/switch-video.service.mjs +0 -132
- package/dist/esm2022/lib/methods/utils/format-number.service.mjs +0 -57
- package/dist/esm2022/lib/methods/utils/generate-random-messages.service.mjs +0 -120
- package/dist/esm2022/lib/methods/utils/generate-random-participants.service.mjs +0 -126
- package/dist/esm2022/lib/methods/utils/generate-random-polls.service.mjs +0 -78
- package/dist/esm2022/lib/methods/utils/generate-random-request-list.service.mjs +0 -90
- package/dist/esm2022/lib/methods/utils/generate-random-waiting-room-list.service.mjs +0 -59
- package/dist/esm2022/lib/methods/utils/get-modal-position.util.mjs +0 -32
- package/dist/esm2022/lib/methods/utils/get-overlay-position.util.mjs +0 -31
- package/dist/esm2022/lib/methods/utils/initial-values.util.mjs +0 -379
- package/dist/esm2022/lib/methods/utils/meeting-timer/start-meeting-progress-timer.service.mjs +0 -96
- package/dist/esm2022/lib/methods/utils/mini-audio-player/mini-audio-player.component.mjs +0 -315
- package/dist/esm2022/lib/methods/utils/producer/a-params.service.mjs +0 -58
- package/dist/esm2022/lib/methods/utils/producer/h-params.service.mjs +0 -87
- package/dist/esm2022/lib/methods/utils/producer/screen-params.service.mjs +0 -61
- package/dist/esm2022/lib/methods/utils/producer/v-params.service.mjs +0 -87
- package/dist/esm2022/lib/methods/utils/producer/video-capture-constraints.service.mjs +0 -84
- package/dist/esm2022/lib/methods/utils/sleep.util.mjs +0 -17
- package/dist/esm2022/lib/methods/utils/sound-player.service.mjs +0 -63
- package/dist/esm2022/lib/methods/utils/validate-alphanumeric.service.mjs +0 -49
- package/dist/esm2022/lib/methods/waiting-methods/launch-waiting.service.mjs +0 -41
- package/dist/esm2022/lib/methods/waiting-methods/respond-to-waiting.service.mjs +0 -69
- package/dist/esm2022/lib/methods/whiteboard-methods/capture-canvas-stream.service.mjs +0 -98
- package/dist/esm2022/lib/methods/whiteboard-methods/launch-configure-whiteboard.service.mjs +0 -44
- package/dist/esm2022/lib/producer-client/producer-client-emits/create-device-client.service.mjs +0 -74
- package/dist/esm2022/lib/producer-client/producer-client-emits/join-room-client.service.mjs +0 -96
- package/dist/esm2022/lib/producer-client/producer-client-emits/update-room-parameters-client.service.mjs +0 -276
- package/dist/esm2022/lib/producers/producer-emits/join-con-room.service.mjs +0 -152
- package/dist/esm2022/lib/producers/producer-emits/join-room.service.mjs +0 -152
- package/dist/esm2022/lib/producers/socket-receive-methods/all-members-rest.service.mjs +0 -228
- package/dist/esm2022/lib/producers/socket-receive-methods/all-members.service.mjs +0 -218
- package/dist/esm2022/lib/producers/socket-receive-methods/all-waiting-room-members.service.mjs +0 -57
- package/dist/esm2022/lib/producers/socket-receive-methods/ban-participant.service.mjs +0 -76
- package/dist/esm2022/lib/producers/socket-receive-methods/control-media-host.service.mjs +0 -183
- package/dist/esm2022/lib/producers/socket-receive-methods/disconnect-user-self.service.mjs +0 -50
- package/dist/esm2022/lib/producers/socket-receive-methods/disconnect.service.mjs +0 -64
- package/dist/esm2022/lib/producers/socket-receive-methods/get-domains.service.mjs +0 -78
- package/dist/esm2022/lib/producers/socket-receive-methods/host-request-response.service.mjs +0 -150
- package/dist/esm2022/lib/producers/socket-receive-methods/meeting-ended.service.mjs +0 -73
- package/dist/esm2022/lib/producers/socket-receive-methods/meeting-still-there.service.mjs +0 -47
- package/dist/esm2022/lib/producers/socket-receive-methods/meeting-time-remaining.service.mjs +0 -63
- package/dist/esm2022/lib/producers/socket-receive-methods/participant-requested.service.mjs +0 -63
- package/dist/esm2022/lib/producers/socket-receive-methods/person-joined.service.mjs +0 -54
- package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-closed.service.mjs +0 -129
- package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-paused.service.mjs +0 -152
- package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-resumed.service.mjs +0 -99
- package/dist/esm2022/lib/producers/socket-receive-methods/re-initiate-recording.service.mjs +0 -67
- package/dist/esm2022/lib/producers/socket-receive-methods/receive-message.service.mjs +0 -134
- package/dist/esm2022/lib/producers/socket-receive-methods/recording-notice.service.mjs +0 -233
- package/dist/esm2022/lib/producers/socket-receive-methods/room-record-params.service.mjs +0 -121
- package/dist/esm2022/lib/producers/socket-receive-methods/screen-producer-id.service.mjs +0 -86
- package/dist/esm2022/lib/producers/socket-receive-methods/start-records.service.mjs +0 -60
- package/dist/esm2022/lib/producers/socket-receive-methods/stopped-recording.service.mjs +0 -62
- package/dist/esm2022/lib/producers/socket-receive-methods/time-left-recording.service.mjs +0 -57
- package/dist/esm2022/lib/producers/socket-receive-methods/update-consuming-domains.service.mjs +0 -105
- package/dist/esm2022/lib/producers/socket-receive-methods/update-media-settings.service.mjs +0 -66
- package/dist/esm2022/lib/producers/socket-receive-methods/updated-co-host.service.mjs +0 -96
- package/dist/esm2022/lib/producers/socket-receive-methods/user-waiting.service.mjs +0 -52
- package/dist/esm2022/lib/sockets/socket-manager.service.mjs +0 -113
- package/dist/esm2022/mediasfu-angular.mjs +0 -5
- package/dist/esm2022/public-api.mjs +0 -187
package/dist/README.md
CHANGED
|
@@ -27,6 +27,11 @@ MediaSFU offers a cutting-edge streaming experience that empowers users to custo
|
|
|
27
27
|
|
|
28
28
|
# MediaSFU Angular Module Documentation
|
|
29
29
|
|
|
30
|
+
## Unlock the Power of MediaSFU Community Edition
|
|
31
|
+
**MediaSFU Community Edition is free and open-source**—perfect for developers who want to run their own media server without upfront costs. With robust features and simple setup, you can launch your media solution in minutes. **Ready to scale?** Upgrade seamlessly to **MediaSFU Cloud** for enterprise-grade performance and global scalability.
|
|
32
|
+
**[Get started now on GitHub!](https://github.com/MediaSFU/MediaSFUOpen)**
|
|
33
|
+
---
|
|
34
|
+
|
|
30
35
|
## Table of Contents
|
|
31
36
|
|
|
32
37
|
- [Features](#features)
|
|
@@ -66,13 +71,13 @@ For comprehensive documentation on the available methods, components, and functi
|
|
|
66
71
|
|
|
67
72
|
Instructions on how to install the module using npm.
|
|
68
73
|
|
|
69
|
-
1. **Add the package to your project**
|
|
74
|
+
### 1. **Add the package to your project**
|
|
70
75
|
|
|
71
76
|
```bash
|
|
72
77
|
npm install mediasfu-angular
|
|
73
78
|
```
|
|
74
79
|
|
|
75
|
-
2. **Bootstrap Integration**
|
|
80
|
+
### 2. **Bootstrap Integration**
|
|
76
81
|
|
|
77
82
|
The `mediasfu-angular` package requires Bootstrap for styling. Bootstrap is included by default with the package, so you do not need to install it separately. Ensure that Bootstrap's CSS is correctly added to your project's styles.
|
|
78
83
|
|
|
@@ -103,7 +108,7 @@ Instructions on how to install the module using npm.
|
|
|
103
108
|
**Note:** The `mediasfu-angular` package should handle the Bootstrap's package installation automatically. If it's not present, you may need to add it manually install Bootstrap.
|
|
104
109
|
|
|
105
110
|
|
|
106
|
-
3. **Configure MediaSFU's PreJoinPage Requirements**
|
|
111
|
+
### 3. **Configure MediaSFU's PreJoinPage Requirements**
|
|
107
112
|
|
|
108
113
|
If you intend to use MediaSFU's `PreJoinPage` component, additional configuration is required. You need to provide the `HttpClient` and `CookieService` providers in your application's configuration. These packages should have been installed by default as well else add manually.
|
|
109
114
|
|
|
@@ -129,14 +134,20 @@ Instructions on how to install the module using npm.
|
|
|
129
134
|
};
|
|
130
135
|
|
|
131
136
|
```
|
|
132
|
-
|
|
133
|
-
4. **Obtain an API key from MediaSFU.** You can get your API key by signing up or logging into your account at [mediasfu.com](https://www.mediasfu.com/).
|
|
134
137
|
|
|
135
|
-
|
|
138
|
+
### 4. Obtain an API Key (If Required)
|
|
139
|
+
You can get your API key by signing up or logging into your account at [mediasfu.com](https://www.mediasfu.com/).
|
|
140
|
+
|
|
141
|
+
<div style="background-color:#f0f0f0; padding: 10px; border-radius: 5px;">
|
|
136
142
|
<h4 style="color:#d9534f;">Important:</h4>
|
|
137
|
-
<p style="font-size: 1.2em; color: black;">You must obtain an API key from <a href="https://www.mediasfu.com/">mediasfu.com</a> to use this package.</p>
|
|
143
|
+
<p style="font-size: 1.2em; color: black;">You must obtain an API key from <a href="https://www.mediasfu.com/">mediasfu.com</a> to use this package with MediaSFU Cloud. You do not need the API Key if self-hosting.</p>
|
|
138
144
|
</div>
|
|
139
145
|
|
|
146
|
+
## **Self-Hosting MediaSFU**
|
|
147
|
+
|
|
148
|
+
If you plan to self-host MediaSFU or use it without MediaSFU Cloud services, you don't need an API key. You can access the open-source version of MediaSFU from the [MediaSFU Open Repository](https://github.com/MediaSFU/MediaSFUOpen).
|
|
149
|
+
|
|
150
|
+
This setup allows full flexibility and customization while bypassing the need for cloud-dependent credentials.
|
|
140
151
|
|
|
141
152
|
|
|
142
153
|
# Basic Usage Guide <a name="basic-usage-guide"></a>
|
|
@@ -269,450 +280,469 @@ updateValidated(true);
|
|
|
269
280
|
See the following code for the PreJoinPage page logic:
|
|
270
281
|
|
|
271
282
|
```javascript
|
|
272
|
-
import { Component, Inject, Input, Optional } from '@angular/core';
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
}
|
|
283
|
+
import { Component, Inject, Input, OnInit, Optional } from '@angular/core';
|
|
284
|
+
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
285
|
+
import { CommonModule } from '@angular/common';
|
|
286
|
+
import { Socket } from 'socket.io-client';
|
|
287
|
+
import {
|
|
288
|
+
ConnectSocketType, ShowAlert,
|
|
289
|
+
ConnectLocalSocketType, ResponseLocalConnection,
|
|
290
|
+
ResponseLocalConnectionData, RecordingParams, MeetingRoomParams
|
|
291
|
+
} from '../../../@types/types';
|
|
292
|
+
import { CheckLimitsAndMakeRequest } from '../../../methods/utils/check-limits-and-make-request.service';
|
|
293
|
+
import { CreateRoomOnMediaSFU } from '../../../methods/utils/create-room-on-media-sfu.service';
|
|
294
|
+
import { JoinRoomOnMediaSFUService } from '../../../methods/utils/join-room-on-media-sfu.service';
|
|
295
|
+
|
|
296
|
+
export interface JoinLocalEventRoomParameters {
|
|
297
|
+
eventID: string;
|
|
298
|
+
userName: string;
|
|
299
|
+
secureCode?: string;
|
|
300
|
+
videoPreference?: string | null;
|
|
301
|
+
audioPreference?: string | null;
|
|
302
|
+
audioOutputPreference?: string | null;
|
|
303
|
+
}
|
|
294
304
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
305
|
+
export interface JoinLocalEventRoomOptions {
|
|
306
|
+
joinData: JoinLocalEventRoomParameters;
|
|
307
|
+
link?: string;
|
|
308
|
+
}
|
|
299
309
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
310
|
+
export interface CreateLocalRoomParameters {
|
|
311
|
+
eventID: string;
|
|
312
|
+
duration: number;
|
|
313
|
+
capacity: number;
|
|
314
|
+
userName: string;
|
|
315
|
+
scheduledDate: Date;
|
|
316
|
+
secureCode: string;
|
|
317
|
+
waitRoom?: boolean;
|
|
318
|
+
recordingParams?: RecordingParams;
|
|
319
|
+
eventRoomParams?: MeetingRoomParams;
|
|
320
|
+
videoPreference?: string | null;
|
|
321
|
+
audioPreference?: string | null;
|
|
322
|
+
audioOutputPreference?: string | null;
|
|
323
|
+
mediasfuURL?: string;
|
|
324
|
+
}
|
|
325
|
+
export interface CreateLocalRoomOptions {
|
|
326
|
+
createData: CreateLocalRoomParameters;
|
|
327
|
+
link?: string;
|
|
328
|
+
}
|
|
304
329
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
secret: string;
|
|
312
|
-
success: boolean;
|
|
313
|
-
}
|
|
330
|
+
export interface CreateJoinLocalRoomResponse {
|
|
331
|
+
success: boolean;
|
|
332
|
+
secret: string;
|
|
333
|
+
reason?: string;
|
|
334
|
+
url?: string;
|
|
335
|
+
}
|
|
314
336
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
337
|
+
// Type definitions for parameters and credentials
|
|
338
|
+
export interface PreJoinPageParameters {
|
|
339
|
+
imgSrc?: string;
|
|
340
|
+
showAlert?: ShowAlert;
|
|
341
|
+
updateIsLoadingModalVisible: (visible: boolean) => void;
|
|
342
|
+
connectSocket: ConnectSocketType;
|
|
343
|
+
connectLocalSocket?: ConnectLocalSocketType;
|
|
344
|
+
updateSocket: (socket: Socket) => void;
|
|
345
|
+
updateLocalSocket?: (socket: Socket) => void;
|
|
346
|
+
updateValidated: (validated: boolean) => void;
|
|
347
|
+
updateApiUserName: (userName: string) => void;
|
|
348
|
+
updateApiToken: (token: string) => void;
|
|
349
|
+
updateLink: (link: string) => void;
|
|
350
|
+
updateRoomName: (roomName: string) => void;
|
|
351
|
+
updateMember: (member: string) => void;
|
|
352
|
+
}
|
|
319
353
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
}) => Promise<{
|
|
325
|
-
data: CreateJoinRoomResponse | CreateJoinRoomError | null;
|
|
326
|
-
success: boolean;
|
|
327
|
-
}>;
|
|
328
|
-
|
|
329
|
-
export type CreateRoomOnMediaSFUType = (options: {
|
|
330
|
-
payload: any;
|
|
331
|
-
apiUserName: string;
|
|
332
|
-
apiKey: string;
|
|
333
|
-
}) => Promise<{
|
|
334
|
-
data: CreateJoinRoomResponse | CreateJoinRoomError | null;
|
|
335
|
-
success: boolean;
|
|
336
|
-
}>;
|
|
337
|
-
|
|
338
|
-
export type PreJoinPageType = (options: PreJoinPageOptions) => void;
|
|
339
|
-
|
|
340
|
-
const MAX_ATTEMPTS = 20; // Maximum number of unsuccessful attempts before rate limiting
|
|
341
|
-
const RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours in milliseconds
|
|
342
|
-
const TIMEOUT_DURATION = 10000; // 5 seconds in milliseconds
|
|
354
|
+
export interface Credentials {
|
|
355
|
+
apiUserName: string;
|
|
356
|
+
apiKey: string;
|
|
357
|
+
}
|
|
343
358
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
* @templateUrl ./pre-join-page.component.html
|
|
351
|
-
* @styleUrls ./pre-join-page.component.css
|
|
352
|
-
* @imports [CommonModule, ReactiveFormsModule]
|
|
353
|
-
*
|
|
354
|
-
* @description
|
|
355
|
-
* This component provides functionality for users to create or join a room on MediaSFU.
|
|
356
|
-
* It includes form validation, error handling, and API requests to the MediaSFU service.
|
|
357
|
-
*
|
|
358
|
-
* @property {any} parameters - Input parameters for the component.
|
|
359
|
-
* @property {Object} credentials - API credentials for MediaSFU.
|
|
360
|
-
* @property {string} credentials.apiUserName - API username.
|
|
361
|
-
* @property {string} credentials.apiKey - API key.
|
|
362
|
-
* @property {boolean} isCreateMode - Flag to toggle between create and join modes.
|
|
363
|
-
* @property {FormGroup} preJoinForm - Form group for pre-join form.
|
|
364
|
-
* @property {string} error - Error message to display.
|
|
365
|
-
*
|
|
366
|
-
* @constructor
|
|
367
|
-
* @param {FormBuilder} fb - FormBuilder service for creating form groups.
|
|
368
|
-
* @param {HttpClient} http - HttpClient service for making HTTP requests.
|
|
369
|
-
* @param {CookieService} cookieService - CookieService for managing cookies.
|
|
370
|
-
*
|
|
371
|
-
* @method ngOnInit
|
|
372
|
-
* @description Lifecycle hook that is called after data-bound properties are initialized.
|
|
373
|
-
*
|
|
374
|
-
* @method toggleMode
|
|
375
|
-
* @description Toggles between create and join modes and resets the error message.
|
|
376
|
-
*
|
|
377
|
-
* @method handleCreateRoom
|
|
378
|
-
* @description Handles the creation of a room on MediaSFU. Validates form inputs, sends a request to create a room, and handles the response.
|
|
379
|
-
*
|
|
380
|
-
* @method handleJoinRoom
|
|
381
|
-
* @description Handles joining a room on MediaSFU. Validates form inputs, sends a request to join a room, and handles the response.
|
|
382
|
-
*
|
|
383
|
-
* @method checkLimitsAndMakeRequest
|
|
384
|
-
* @description Checks rate limits and makes a request to connect to a room. Handles unsuccessful attempts and updates the state accordingly.
|
|
385
|
-
*
|
|
386
|
-
* @method createRoomOnMediaSFU
|
|
387
|
-
* @description Sends a request to create a room on MediaSFU.
|
|
388
|
-
* @param {Object} params - Parameters for the request.
|
|
389
|
-
* @param {any} params.payload - Payload for the request.
|
|
390
|
-
* @param {string} params.apiUserName - API username.
|
|
391
|
-
* @param {string} params.apiKey - API key.
|
|
392
|
-
* @returns {Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }>} Response from the API.
|
|
393
|
-
*
|
|
394
|
-
* @method joinRoomOnMediaSFU
|
|
395
|
-
* @description Sends a request to join a room on MediaSFU.
|
|
396
|
-
* @param {Object} params - Parameters for the request.
|
|
397
|
-
* @param {any} params.payload - Payload for the request.
|
|
398
|
-
* @param {string} params.apiUserName - API username.
|
|
399
|
-
* @param {string} params.apiKey - API key.
|
|
400
|
-
* @returns {Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }>} Response from the API.
|
|
401
|
-
*/
|
|
402
|
-
@Component({
|
|
403
|
-
selector: 'app-pre-join-page',
|
|
404
|
-
standalone: true,
|
|
405
|
-
templateUrl: './pre-join-page.component.html',
|
|
406
|
-
styleUrls: ['./pre-join-page.component.css'],
|
|
407
|
-
imports: [CommonModule, ReactiveFormsModule],
|
|
408
|
-
})
|
|
409
|
-
export class PreJoinPage {
|
|
410
|
-
@Input() parameters: PreJoinPageParameters = {} as PreJoinPageParameters;
|
|
411
|
-
@Input() credentials = { apiUserName: 'yourAPIUSERNAME', apiKey: 'yourAPIKEY' };
|
|
412
|
-
|
|
413
|
-
isCreateMode = false;
|
|
414
|
-
preJoinForm: FormGroup;
|
|
415
|
-
error = '';
|
|
416
|
-
imgSrc: string = this.parameters.imgSrc || '';
|
|
417
|
-
|
|
418
|
-
constructor(
|
|
419
|
-
private fb: FormBuilder,
|
|
420
|
-
private http: HttpClient,
|
|
421
|
-
private cookieService: CookieService,
|
|
422
|
-
@Optional() @Inject('parameters') injectedParameters: PreJoinPageParameters,
|
|
423
|
-
@Optional() @Inject('credentials') injectedCredentials: Credentials,
|
|
424
|
-
) {
|
|
425
|
-
this.preJoinForm = this.fb.group({
|
|
426
|
-
name: ['', Validators.required],
|
|
427
|
-
duration: [''],
|
|
428
|
-
eventType: [''],
|
|
429
|
-
capacity: [''],
|
|
430
|
-
eventID: [''],
|
|
431
|
-
});
|
|
432
|
-
this.parameters = injectedParameters || this.parameters;
|
|
433
|
-
this.credentials = injectedCredentials || this.credentials;
|
|
434
|
-
}
|
|
359
|
+
export interface PreJoinPageOptions {
|
|
360
|
+
localLink?: string;
|
|
361
|
+
connectMediaSFU?: boolean;
|
|
362
|
+
parameters: PreJoinPageParameters;
|
|
363
|
+
credentials?: Credentials;
|
|
364
|
+
}
|
|
435
365
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
366
|
+
export type PreJoinPageType = (options: PreJoinPageOptions) => HTMLElement;
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* @fileoverview PreJoinPage component for handling room creation and joining on MediaSFU.
|
|
370
|
+
*
|
|
371
|
+
* @component
|
|
372
|
+
* @selector app-pre-join-page
|
|
373
|
+
* @standalone true
|
|
374
|
+
* @templateUrl ./pre-join-page.component.html
|
|
375
|
+
* @styleUrls ./pre-join-page.component.css
|
|
376
|
+
* @imports [CommonModule, ReactiveFormsModule]
|
|
377
|
+
*
|
|
378
|
+
* @description
|
|
379
|
+
* This component provides functionality for users to create or join a room on MediaSFU.
|
|
380
|
+
* It includes form validation, error handling, and API requests to the MediaSFU service.
|
|
381
|
+
*
|
|
382
|
+
* @property {any} parameters - Input parameters for the component.
|
|
383
|
+
* @property {Object} credentials - API credentials for MediaSFU.
|
|
384
|
+
* @property {string} credentials.apiUserName - API username.
|
|
385
|
+
* @property {string} credentials.apiKey - API key.
|
|
386
|
+
* @property {boolean} isCreateMode - Flag to toggle between create and join modes.
|
|
387
|
+
* @property {FormGroup} preJoinForm - Form group for pre-join form.
|
|
388
|
+
* @property {string} error - Error message to display.
|
|
389
|
+
*
|
|
390
|
+
* @constructor
|
|
391
|
+
* @param {FormBuilder} fb - FormBuilder service for creating form groups.
|
|
392
|
+
* @param {HttpClient} http - HttpClient service for making HTTP requests.
|
|
393
|
+
* @param {CookieService} cookieService - CookieService for managing cookies.
|
|
394
|
+
*
|
|
395
|
+
* @method ngOnInit
|
|
396
|
+
* @description Lifecycle hook that is called after data-bound properties are initialized.
|
|
397
|
+
*
|
|
398
|
+
* @method toggleMode
|
|
399
|
+
* @description Toggles between create and join modes and resets the error message.
|
|
400
|
+
*
|
|
401
|
+
* @method handleCreateRoom
|
|
402
|
+
* @description Handles the creation of a room on MediaSFU. Validates form inputs, sends a request to create a room, and handles the response.
|
|
403
|
+
*
|
|
404
|
+
* @method handleJoinRoom
|
|
405
|
+
* @description Handles joining a room on MediaSFU. Validates form inputs, sends a request to join a room, and handles the response.
|
|
406
|
+
*
|
|
407
|
+
* @method checkLimitsAndMakeRequest
|
|
408
|
+
* @description Checks rate limits and makes a request to connect to a room. Handles unsuccessful attempts and updates the state accordingly.
|
|
409
|
+
*
|
|
410
|
+
* @method createRoomOnMediaSFU
|
|
411
|
+
* @description Sends a request to create a room on MediaSFU.
|
|
412
|
+
* @param {Object} params - Parameters for the request.
|
|
413
|
+
* @param {any} params.payload - Payload for the request.
|
|
414
|
+
* @param {string} params.apiUserName - API username.
|
|
415
|
+
* @param {string} params.apiKey - API key.
|
|
416
|
+
* @returns {Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }>} Response from the API.
|
|
417
|
+
*
|
|
418
|
+
* @method joinRoomOnMediaSFU
|
|
419
|
+
* @description Sends a request to join a room on MediaSFU.
|
|
420
|
+
* @param {Object} params - Parameters for the request.
|
|
421
|
+
* @param {any} params.payload - Payload for the request.
|
|
422
|
+
* @param {string} params.apiUserName - API username.
|
|
423
|
+
* @param {string} params.apiKey - API key.
|
|
424
|
+
* @returns {Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }>} Response from the API.
|
|
425
|
+
*
|
|
426
|
+
* @example
|
|
427
|
+
* ```html
|
|
428
|
+
* <app-pre-join-page
|
|
429
|
+
* [parameters]="preJoinPageParameters"
|
|
430
|
+
* [credentials]="{ apiUserName: 'username', apiKey: 'apiKey' }"
|
|
431
|
+
* [localLink]="'http://localhost:3000'"
|
|
432
|
+
* [connectMediaSFU]="false"
|
|
433
|
+
* ></app-pre-join-page>
|
|
434
|
+
* ```
|
|
435
|
+
*/
|
|
440
436
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
437
|
+
@Component({
|
|
438
|
+
selector: 'app-pre-join-page',
|
|
439
|
+
templateUrl: './pre-join-page.component.html',
|
|
440
|
+
styleUrls: ['./pre-join-page.component.css'],
|
|
441
|
+
imports: [CommonModule, ReactiveFormsModule]
|
|
442
|
+
})
|
|
443
|
+
export class PreJoinPage implements OnInit {
|
|
444
|
+
@Input() parameters: PreJoinPageParameters = {} as PreJoinPageParameters;
|
|
445
|
+
@Input() credentials: Credentials = { apiUserName: 'yourAPIUSERNAME', apiKey: 'yourAPIKEY' };
|
|
446
|
+
@Input() localLink: string | undefined = "";
|
|
447
|
+
@Input() connectMediaSFU: boolean | undefined = true;
|
|
446
448
|
|
|
447
|
-
|
|
449
|
+
isCreateMode = false;
|
|
450
|
+
preJoinForm: FormGroup;
|
|
451
|
+
error = '';
|
|
448
452
|
|
|
449
|
-
|
|
450
|
-
this.error = 'Please fill all the fields.';
|
|
451
|
-
return;
|
|
452
|
-
}
|
|
453
|
+
imgSrc: string = this.parameters.imgSrc || '';
|
|
453
454
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
capacity: parseInt(capacity),
|
|
458
|
-
eventType,
|
|
459
|
-
userName: name,
|
|
460
|
-
};
|
|
455
|
+
localConnected = false;
|
|
456
|
+
localData: ResponseLocalConnectionData | undefined = undefined;
|
|
457
|
+
initSocket: Socket | undefined = undefined;
|
|
461
458
|
|
|
462
|
-
|
|
459
|
+
constructor(
|
|
460
|
+
private fb: FormBuilder,
|
|
461
|
+
@Optional() @Inject('parameters') injectedParameters: PreJoinPageParameters,
|
|
462
|
+
@Optional() @Inject('credentials') injectedCredentials: Credentials,
|
|
463
|
+
@Optional() @Inject('localLink') injectedLocalLink: string,
|
|
464
|
+
@Optional() @Inject('connectMediaSFU') injectedConnectMediaSFU: boolean,
|
|
465
|
+
private checkLimitsService: CheckLimitsAndMakeRequest,
|
|
466
|
+
private createRoomService: CreateRoomOnMediaSFU,
|
|
467
|
+
private joinRoomService: JoinRoomOnMediaSFUService
|
|
468
|
+
) {
|
|
469
|
+
this.preJoinForm = this.fb.group({
|
|
470
|
+
name: ['', Validators.required],
|
|
471
|
+
duration: [''],
|
|
472
|
+
eventType: [''],
|
|
473
|
+
capacity: [''],
|
|
474
|
+
eventID: [''],
|
|
475
|
+
});
|
|
476
|
+
this.parameters = injectedParameters || this.parameters;
|
|
477
|
+
this.credentials = injectedCredentials || this.credentials;
|
|
478
|
+
this.localLink = injectedLocalLink || this.localLink;
|
|
479
|
+
this.connectMediaSFU = injectedConnectMediaSFU !== undefined ? injectedConnectMediaSFU : this.connectMediaSFU;
|
|
463
480
|
|
|
464
|
-
|
|
465
|
-
const response = await this.createRoomOnMediaSFU({
|
|
466
|
-
payload,
|
|
467
|
-
apiUserName: this.credentials.apiUserName,
|
|
468
|
-
apiKey: this.credentials.apiKey,
|
|
469
|
-
});
|
|
481
|
+
}
|
|
470
482
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
apiToken: response.data.secret,
|
|
475
|
-
link: response.data.link,
|
|
476
|
-
userName: name,
|
|
477
|
-
});
|
|
478
|
-
this.error = '';
|
|
479
|
-
} else {
|
|
480
|
-
this.parameters.updateIsLoadingModalVisible(false);
|
|
481
|
-
this.error = `${
|
|
482
|
-
response.data ? ('error' in response.data ? response.data.error : '') : ''
|
|
483
|
-
}`;
|
|
484
|
-
}
|
|
485
|
-
} catch (error) {
|
|
486
|
-
this.parameters.updateIsLoadingModalVisible(false);
|
|
487
|
-
this.error = `Unable to connect. ${(error as any).message}`;
|
|
488
|
-
}
|
|
483
|
+
ngOnInit(): void {
|
|
484
|
+
if (this.localLink && !this.localConnected && !this.initSocket) {
|
|
485
|
+
this.connectLocalSocket();
|
|
489
486
|
}
|
|
487
|
+
}
|
|
490
488
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
489
|
+
private async connectLocalSocket(): Promise<void> {
|
|
490
|
+
try {
|
|
491
|
+
const response = await this.parameters.connectLocalSocket?.({ link: this.localLink! }) as ResponseLocalConnection;
|
|
492
|
+
if (response) {
|
|
493
|
+
this.localData = response.data;
|
|
494
|
+
this.initSocket = response.socket;
|
|
495
|
+
this.localConnected = true;
|
|
495
496
|
}
|
|
497
|
+
} catch (error: any) {
|
|
498
|
+
this.parameters.showAlert?.({
|
|
499
|
+
message: `Unable to connect to ${this.localLink}. ${error}`,
|
|
500
|
+
type: 'danger',
|
|
501
|
+
duration: 3000,
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
}
|
|
496
505
|
|
|
497
|
-
|
|
506
|
+
toggleMode(): void {
|
|
507
|
+
this.isCreateMode = !this.isCreateMode;
|
|
508
|
+
this.error = '';
|
|
509
|
+
}
|
|
498
510
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
511
|
+
async joinLocalRoom(options: JoinLocalEventRoomOptions): Promise<void> {
|
|
512
|
+
this.initSocket?.emit('joinEventRoom', options.joinData, (response: CreateJoinLocalRoomResponse) => {
|
|
513
|
+
if (response.success) {
|
|
514
|
+
this.parameters.updateSocket(this.initSocket!);
|
|
515
|
+
this.parameters.updateApiUserName(this.localData?.apiUserName || '');
|
|
516
|
+
this.parameters.updateApiToken(response.secret);
|
|
517
|
+
this.parameters.updateLink(options.link || '');
|
|
518
|
+
this.parameters.updateRoomName(options.joinData.eventID);
|
|
519
|
+
this.parameters.updateMember(options.joinData.userName);
|
|
520
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
521
|
+
this.parameters.updateValidated(true);
|
|
522
|
+
} else {
|
|
523
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
524
|
+
this.error = `Unable to join room. ${response.reason}`;
|
|
502
525
|
}
|
|
526
|
+
});
|
|
527
|
+
}
|
|
503
528
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
529
|
+
async createLocalRoom(options: CreateLocalRoomOptions): Promise<void> {
|
|
530
|
+
this.initSocket?.emit('createRoom', options.createData, (response: CreateJoinLocalRoomResponse) => {
|
|
531
|
+
if (response.success) {
|
|
532
|
+
this.parameters.updateSocket(this.initSocket!);
|
|
533
|
+
this.parameters.updateApiUserName(this.localData?.apiUserName || '');
|
|
534
|
+
this.parameters.updateApiToken(response.secret);
|
|
535
|
+
this.parameters.updateLink(options.link || '');
|
|
536
|
+
this.parameters.updateRoomName(options.createData.eventID);
|
|
537
|
+
// Update member as `userName` + "_2" to split in the room
|
|
538
|
+
this.parameters.updateMember(`${options.createData.userName}_2`);
|
|
539
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
540
|
+
this.parameters.updateValidated(true);
|
|
541
|
+
} else {
|
|
542
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
543
|
+
this.error = `Unable to create room. ${response.reason}`;
|
|
544
|
+
}
|
|
545
|
+
});
|
|
546
|
+
}
|
|
509
547
|
|
|
510
|
-
|
|
548
|
+
async roomCreator(options: { payload: any; apiUserName: string; apiKey: string; validate?: boolean }): Promise<any> {
|
|
549
|
+
const { payload, apiUserName, apiKey, validate = true } = options;
|
|
550
|
+
const response = await this.createRoomService.createRoomOnMediaSFU({
|
|
551
|
+
payload,
|
|
552
|
+
apiUserName,
|
|
553
|
+
apiKey,
|
|
554
|
+
});
|
|
511
555
|
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
556
|
+
if (response.success && response.data && 'roomName' in response.data) {
|
|
557
|
+
await this.checkLimitsService.checkLimitsAndMakeRequest({
|
|
558
|
+
apiUserName: response.data.roomName,
|
|
559
|
+
apiToken: response.data.secret,
|
|
560
|
+
link: response.data.link,
|
|
561
|
+
userName: payload.userName,
|
|
562
|
+
parameters: this.parameters,
|
|
563
|
+
validate: validate,
|
|
564
|
+
});
|
|
565
|
+
return response;
|
|
566
|
+
} else {
|
|
567
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
568
|
+
this.error = `Unable to create room. ${
|
|
569
|
+
response.data
|
|
570
|
+
? 'error' in response.data
|
|
571
|
+
? response.data.error
|
|
572
|
+
: ''
|
|
573
|
+
: ''
|
|
574
|
+
}`;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
518
577
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
this.error = '';
|
|
527
|
-
} else {
|
|
528
|
-
this.parameters.updateIsLoadingModalVisible(false);
|
|
529
|
-
this.error = `Unable to connect to room. ${
|
|
530
|
-
response.data ? ('error' in response.data ? response.data.error : '') : ''
|
|
531
|
-
}`;
|
|
532
|
-
}
|
|
533
|
-
} catch (error) {
|
|
534
|
-
this.parameters.updateIsLoadingModalVisible(false);
|
|
535
|
-
this.error = `Unable to connect. ${(error as any).message}`;
|
|
536
|
-
}
|
|
578
|
+
async handleCreateRoom(): Promise<void> {
|
|
579
|
+
|
|
580
|
+
const { name, duration, eventType, capacity } = this.preJoinForm.value;
|
|
581
|
+
|
|
582
|
+
if (!name || !duration || !eventType || !capacity) {
|
|
583
|
+
this.error = 'Please fill all the fields.';
|
|
584
|
+
return;
|
|
537
585
|
}
|
|
538
586
|
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
userName,
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
apiToken: string;
|
|
548
|
-
link: string;
|
|
549
|
-
apiKey?: string;
|
|
550
|
-
userName: string;
|
|
551
|
-
}) {
|
|
552
|
-
let unsuccessfulAttempts = parseInt(this.cookieService.get('unsuccessfulAttempts')) || 0;
|
|
553
|
-
let lastRequestTimestamp = parseInt(this.cookieService.get('lastRequestTimestamp')) || 0;
|
|
554
|
-
|
|
555
|
-
if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
|
|
556
|
-
if (Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {
|
|
557
|
-
this.parameters.showAlert?.({
|
|
558
|
-
message: 'Too many unsuccessful attempts. Please try again later.',
|
|
559
|
-
type: 'danger',
|
|
560
|
-
duration: 3000,
|
|
561
|
-
});
|
|
562
|
-
this.cookieService.set('lastRequestTimestamp', Date.now().toString());
|
|
563
|
-
return;
|
|
564
|
-
} else {
|
|
565
|
-
unsuccessfulAttempts = 0;
|
|
566
|
-
this.cookieService.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
|
|
567
|
-
this.cookieService.set('lastRequestTimestamp', Date.now().toString());
|
|
568
|
-
}
|
|
569
|
-
}
|
|
587
|
+
const payload = {
|
|
588
|
+
action: 'create',
|
|
589
|
+
duration: parseInt(duration),
|
|
590
|
+
capacity: parseInt(capacity),
|
|
591
|
+
eventType,
|
|
592
|
+
userName: name,
|
|
593
|
+
recordOnly: false,
|
|
594
|
+
};
|
|
570
595
|
|
|
571
|
-
|
|
572
|
-
|
|
596
|
+
this.parameters.updateIsLoadingModalVisible(true);
|
|
597
|
+
|
|
598
|
+
if (this.localLink) {
|
|
599
|
+
const secureCode =
|
|
600
|
+
Math.random().toString(30).substring(2, 14) +
|
|
601
|
+
Math.random().toString(30).substring(2, 14);
|
|
602
|
+
let eventID =
|
|
603
|
+
new Date().getTime().toString(30) +
|
|
604
|
+
new Date().getUTCMilliseconds() +
|
|
605
|
+
Math.floor(10 + Math.random() * 99).toString();
|
|
606
|
+
eventID = 'm' + eventID;
|
|
607
|
+
const eventRoomParams = this.localData?.meetingRoomParams_;
|
|
608
|
+
eventRoomParams!.type = eventType as 'chat' | 'broadcast' | 'webinar' | 'conference';
|
|
609
|
+
|
|
610
|
+
const createData: CreateLocalRoomParameters = {
|
|
611
|
+
eventID: eventID,
|
|
612
|
+
duration: parseInt(duration, 10),
|
|
613
|
+
capacity: parseInt(capacity, 10),
|
|
614
|
+
userName: name,
|
|
615
|
+
scheduledDate: new Date(),
|
|
616
|
+
secureCode: secureCode,
|
|
617
|
+
waitRoom: false,
|
|
618
|
+
recordingParams: this.localData?.recordingParams_,
|
|
619
|
+
eventRoomParams: eventRoomParams,
|
|
620
|
+
videoPreference: null,
|
|
621
|
+
audioPreference: null,
|
|
622
|
+
audioOutputPreference: null,
|
|
623
|
+
mediasfuURL: '',
|
|
624
|
+
};
|
|
573
625
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
626
|
+
if (
|
|
627
|
+
this.connectMediaSFU &&
|
|
628
|
+
this.initSocket &&
|
|
629
|
+
this.localData &&
|
|
630
|
+
this.localData.apiUserName &&
|
|
631
|
+
this.localData.apiKey
|
|
632
|
+
) {
|
|
633
|
+
payload.recordOnly = true; // allow production to MediaSFU only; no consumption
|
|
634
|
+
const response = await this.roomCreator({
|
|
635
|
+
payload,
|
|
636
|
+
apiUserName: this.localData.apiUserName,
|
|
637
|
+
apiKey: this.localData.apiKey,
|
|
638
|
+
validate: false,
|
|
579
639
|
});
|
|
580
640
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
if (socket && socket instanceof Socket && socket.id) {
|
|
588
|
-
unsuccessfulAttempts = 0;
|
|
589
|
-
this.cookieService.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
|
|
590
|
-
this.cookieService.set('lastRequestTimestamp', Date.now().toString());
|
|
591
|
-
this.parameters.updateSocket(socket);
|
|
592
|
-
this.parameters.updateApiUserName(apiUserName);
|
|
593
|
-
this.parameters.updateApiToken(apiToken);
|
|
594
|
-
this.parameters.updateLink(link);
|
|
595
|
-
this.parameters.updateRoomName(apiUserName);
|
|
596
|
-
this.parameters.updateMember(userName);
|
|
597
|
-
this.parameters.updateValidated(true);
|
|
641
|
+
if (response && response.success && response.data && 'roomName' in response.data) {
|
|
642
|
+
createData.eventID = response.data.roomName;
|
|
643
|
+
createData.secureCode = response.data.secret;
|
|
644
|
+
createData.mediasfuURL = response.data.publicURL;
|
|
645
|
+
await this.createLocalRoom({ createData: createData, link: response.data.link });
|
|
598
646
|
} else {
|
|
599
|
-
unsuccessfulAttempts += 1;
|
|
600
|
-
this.cookieService.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
|
|
601
|
-
this.cookieService.set('lastRequestTimestamp', Date.now().toString());
|
|
602
647
|
this.parameters.updateIsLoadingModalVisible(false);
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
this.parameters.
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
}
|
|
610
|
-
} else {
|
|
611
|
-
this.parameters.showAlert?.({
|
|
612
|
-
message: 'Invalid credentials.',
|
|
613
|
-
type: 'danger',
|
|
614
|
-
duration: 3000,
|
|
615
|
-
});
|
|
648
|
+
this.error = 'Unable to create room on MediaSFU.';
|
|
649
|
+
try {
|
|
650
|
+
this.parameters.updateSocket(this.initSocket!);
|
|
651
|
+
await this.createLocalRoom({ createData: createData });
|
|
652
|
+
} catch (error: any) {
|
|
653
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
654
|
+
this.error = `Unable to create room. ${error}`;
|
|
616
655
|
}
|
|
617
656
|
}
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
this.cookieService.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
|
|
627
|
-
this.cookieService.set('lastRequestTimestamp', Date.now().toString());
|
|
628
|
-
this.parameters.updateIsLoadingModalVisible(false);
|
|
657
|
+
} else {
|
|
658
|
+
try {
|
|
659
|
+
this.parameters.updateSocket(this.initSocket!);
|
|
660
|
+
await this.createLocalRoom({ createData: createData });
|
|
661
|
+
} catch (error: any) {
|
|
662
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
663
|
+
this.error = `Unable to create room. ${error}`;
|
|
664
|
+
}
|
|
629
665
|
}
|
|
666
|
+
} else {
|
|
667
|
+
await this.roomCreator({
|
|
668
|
+
payload,
|
|
669
|
+
apiUserName: this.credentials.apiUserName,
|
|
670
|
+
apiKey: this.credentials.apiKey,
|
|
671
|
+
validate: true,
|
|
672
|
+
});
|
|
630
673
|
}
|
|
674
|
+
}
|
|
631
675
|
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
}
|
|
637
|
-
payload: any;
|
|
638
|
-
apiUserName: string;
|
|
639
|
-
apiKey: string;
|
|
640
|
-
}): Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }> {
|
|
641
|
-
try {
|
|
642
|
-
if (
|
|
643
|
-
!apiUserName ||
|
|
644
|
-
!apiKey ||
|
|
645
|
-
apiUserName === 'yourAPIUSERNAME' ||
|
|
646
|
-
apiKey === 'yourAPIKEY' ||
|
|
647
|
-
apiKey.length !== 64 ||
|
|
648
|
-
apiUserName.length < 6
|
|
649
|
-
) {
|
|
650
|
-
return { data: { error: 'Invalid credentials' }, success: false };
|
|
651
|
-
}
|
|
676
|
+
async handleJoinRoom(): Promise<void> {
|
|
677
|
+
if (this.preJoinForm.invalid) {
|
|
678
|
+
this.error = 'Please fill all the fields.';
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
652
681
|
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
}),
|
|
659
|
-
})
|
|
660
|
-
.toPromise();
|
|
661
|
-
|
|
662
|
-
return { data: response, success: true };
|
|
663
|
-
} catch (error) {
|
|
664
|
-
const errorMessage = (error as any).reason ? (error as any).reason : 'unknown error';
|
|
665
|
-
return {
|
|
666
|
-
data: { error: `Unable to create room; something went wrong ${errorMessage}` },
|
|
667
|
-
success: false,
|
|
668
|
-
};
|
|
669
|
-
}
|
|
682
|
+
const { name, eventID } = this.preJoinForm.value;
|
|
683
|
+
|
|
684
|
+
if (!name || !eventID) {
|
|
685
|
+
this.error = 'Please fill all the fields.';
|
|
686
|
+
return;
|
|
670
687
|
}
|
|
671
688
|
|
|
672
|
-
|
|
689
|
+
const payload = {
|
|
690
|
+
action: 'join',
|
|
691
|
+
meetingID: eventID,
|
|
692
|
+
userName: name,
|
|
693
|
+
};
|
|
694
|
+
|
|
695
|
+
if (this.localLink && !this.localLink.includes('mediasfu.com')) {
|
|
696
|
+
const joinData = {
|
|
697
|
+
eventID: eventID,
|
|
698
|
+
userName: name,
|
|
699
|
+
secureCode: '',
|
|
700
|
+
videoPreference: null,
|
|
701
|
+
audioPreference: null,
|
|
702
|
+
audioOutputPreference: null,
|
|
703
|
+
};
|
|
704
|
+
|
|
705
|
+
await this.joinLocalRoom({ joinData: joinData });
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
this.parameters.updateIsLoadingModalVisible(true);
|
|
710
|
+
try {
|
|
711
|
+
const response = await this.joinRoomService.joinRoomOnMediaSFU({
|
|
673
712
|
payload,
|
|
674
|
-
apiUserName,
|
|
675
|
-
apiKey,
|
|
676
|
-
}
|
|
677
|
-
payload: any;
|
|
678
|
-
apiUserName: string;
|
|
679
|
-
apiKey: string;
|
|
680
|
-
}): Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }> {
|
|
681
|
-
try {
|
|
682
|
-
if (
|
|
683
|
-
!apiUserName ||
|
|
684
|
-
!apiKey ||
|
|
685
|
-
apiUserName === 'yourAPIUSERNAME' ||
|
|
686
|
-
apiKey === 'yourAPIKEY' ||
|
|
687
|
-
apiKey.length !== 64 ||
|
|
688
|
-
apiUserName.length < 6
|
|
689
|
-
) {
|
|
690
|
-
return { data: { error: 'Invalid credentials' }, success: false };
|
|
691
|
-
}
|
|
713
|
+
apiUserName: this.credentials.apiUserName,
|
|
714
|
+
apiKey: this.credentials.apiKey,
|
|
715
|
+
});
|
|
692
716
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
};
|
|
709
|
-
}
|
|
717
|
+
if (response.success && response.data && 'roomName' in response.data) {
|
|
718
|
+
await this.checkLimitsService.checkLimitsAndMakeRequest({
|
|
719
|
+
apiUserName: response.data.roomName,
|
|
720
|
+
apiToken: response.data.secret,
|
|
721
|
+
link: response.data.link,
|
|
722
|
+
userName: name,
|
|
723
|
+
parameters: this.parameters,
|
|
724
|
+
validate: true,
|
|
725
|
+
});
|
|
726
|
+
this.error = '';
|
|
727
|
+
} else {
|
|
728
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
729
|
+
this.error = `Unable to connect to room. ${
|
|
730
|
+
response.data ? ('error' in response.data ? response.data.error : '') : ''
|
|
731
|
+
}`;
|
|
710
732
|
}
|
|
733
|
+
} catch (error) {
|
|
734
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
735
|
+
this.error = `Unable to connect. ${(error as any).message}`;
|
|
711
736
|
}
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
|
|
712
740
|
```
|
|
713
741
|
|
|
714
742
|
### IP Blockage Warning And Local UI Development
|
|
715
743
|
|
|
744
|
+
**Note:** Local UI Development Mode is deprecated. Rather use your own Community Edition (CE) server for UI development and testing. You can later switch to MediaSFU Cloud for production. Nothing changes in the codebase, and you can use the same code for both environments.
|
|
745
|
+
|
|
716
746
|
Entering the event room without the correct credentials may result in IP blockage, as the page automatically attempts to connect with MediaSFU servers, which rate limit bad requests based on IP address.
|
|
717
747
|
|
|
718
748
|
If users attempt to enter the event room without valid credentials or tokens, it may lead to IP blockage due to MediaSFU servers' rate limiting mechanism. To avoid unintentional connections to MediaSFU servers during UI development, users can pass the `useLocalUIMode` parameter as `true`.
|
|
@@ -843,211 +873,130 @@ import {
|
|
|
843
873
|
} from 'mediasfu-angular';
|
|
844
874
|
|
|
845
875
|
|
|
876
|
+
/**
|
|
877
|
+
* The main application component for MediaSFU.
|
|
878
|
+
*
|
|
879
|
+
* This component initializes the necessary configuration and credentials for the MediaSFU application.
|
|
880
|
+
* Users can specify their own Community Edition (CE) server, utilize MediaSFU Cloud by default, or enable MediaSFU Cloud for egress features.
|
|
881
|
+
*
|
|
882
|
+
* @remarks
|
|
883
|
+
* - **Using Your Own Community Edition (CE) Server**: Set the `localLink` to point to your CE server.
|
|
884
|
+
* - **Using MediaSFU Cloud by Default**: If not using a custom server (`localLink` is empty), the application connects to MediaSFU Cloud.
|
|
885
|
+
* - **MediaSFU Cloud Egress Features**: To enable cloud recording, capturing, and returning real-time images and audio buffers,
|
|
886
|
+
* set `connectMediaSFU` to `true` in addition to specifying your `localLink`.
|
|
887
|
+
* - **Credentials Requirement**: If not using your own server, provide `apiUserName` and `apiKey`. The same applies when using MediaSFU Cloud for egress.
|
|
888
|
+
* - **Deprecated Feature**: `useLocalUIMode` is deprecated due to updates for strong typing and improved configuration options.
|
|
889
|
+
*
|
|
890
|
+
* @component
|
|
891
|
+
* @example
|
|
892
|
+
* ```typescript
|
|
893
|
+
* // Example usage of the AppComponent
|
|
894
|
+
* @NgModule({
|
|
895
|
+
* declarations: [AppComponent],
|
|
896
|
+
* imports: [BrowserModule, MediasfuWebinar],
|
|
897
|
+
* bootstrap: [AppComponent]
|
|
898
|
+
* })
|
|
899
|
+
* export class AppModule { }
|
|
900
|
+
* ```
|
|
901
|
+
*/
|
|
846
902
|
@Component({
|
|
847
903
|
selector: 'app-root',
|
|
848
|
-
|
|
849
|
-
imports: [
|
|
850
|
-
MediasfuGeneric,
|
|
851
|
-
MediasfuBroadcast,
|
|
852
|
-
MediasfuChat,
|
|
853
|
-
MediasfuWebinar,
|
|
854
|
-
MediasfuConference,
|
|
855
|
-
PreJoinPage,
|
|
856
|
-
],
|
|
904
|
+
imports: [MediasfuWebinar],
|
|
857
905
|
template: `
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
2. Use Case with Pre-Join Page (Credentials Required)
|
|
874
|
-
- Uses a pre-join page that requires users to enter credentials.
|
|
875
|
-
- Provide your Mediasfu API username and key in the 'credentials' object.
|
|
876
|
-
|
|
877
|
-
<app-mediasfu-generic
|
|
878
|
-
[PrejoinPage]="PreJoinPage"
|
|
879
|
-
[credentials]="credentials"
|
|
880
|
-
></app-mediasfu-generic>
|
|
881
|
-
|
|
882
|
-
-------------------------------------------------
|
|
883
|
-
|
|
884
|
-
3. Use Case with Local UI Mode (Seed Data Required)
|
|
885
|
-
- Runs the application in local UI mode using seed data.
|
|
886
|
-
- Set 'useSeed' to true and provide seed data in 'seedData'.
|
|
887
|
-
|
|
888
|
-
<app-mediasfu-generic
|
|
889
|
-
[useLocalUIMode]="true"
|
|
890
|
-
[useSeed]="true"
|
|
891
|
-
[seedData]="seedData"
|
|
892
|
-
></app-mediasfu-generic>
|
|
893
|
-
|
|
894
|
-
-------------------------------------------------
|
|
895
|
-
|
|
896
|
-
4. Use Specific Event Type Components
|
|
897
|
-
- Uncomment the component corresponding to the event type you want to use.
|
|
898
|
-
- Options are 'broadcast', 'chat', 'webinar', 'conference'.
|
|
899
|
-
- Remember to set the 'eventType' property in the class.
|
|
900
|
-
|
|
901
|
-
Example for 'broadcast':
|
|
902
|
-
|
|
903
|
-
<app-mediasfu-broadcast
|
|
904
|
-
[credentials]="credentials"
|
|
905
|
-
[useLocalUIMode]="useLocalUIMode"
|
|
906
|
-
[useSeed]="useSeed"
|
|
907
|
-
[seedData]="useSeed ? seedData : {}"
|
|
908
|
-
></app-mediasfu-broadcast>
|
|
909
|
-
|
|
910
|
-
-->
|
|
911
|
-
|
|
912
|
-
<!-- Uncomment one of the options below to run the corresponding use case -->
|
|
913
|
-
|
|
914
|
-
<!-- Simple Use Case (Welcome Page) -->
|
|
915
|
-
<!--
|
|
916
|
-
<app-mediasfu-generic></app-mediasfu-generic>
|
|
917
|
-
-->
|
|
918
|
-
|
|
919
|
-
<!-- Use Case with Pre-Join Page (Credentials Required) -->
|
|
920
|
-
<!--
|
|
921
|
-
<app-mediasfu-generic
|
|
922
|
-
[PrejoinPage]="PreJoinPage"
|
|
923
|
-
[credentials]="credentials"
|
|
924
|
-
></app-mediasfu-generic>
|
|
925
|
-
-->
|
|
926
|
-
|
|
927
|
-
<!-- Use Case with Local UI Mode (Seed Data Required) -->
|
|
928
|
-
<!--
|
|
929
|
-
<app-mediasfu-generic
|
|
930
|
-
[useLocalUIMode]="true"
|
|
931
|
-
[useSeed]="true"
|
|
932
|
-
[seedData]="seedData"
|
|
933
|
-
></app-mediasfu-generic>
|
|
934
|
-
-->
|
|
935
|
-
|
|
936
|
-
<!-- MediasfuBroadcast Component -->
|
|
937
|
-
<!-- Uncomment to use the broadcast event type -->
|
|
938
|
-
<!--
|
|
939
|
-
<app-mediasfu-broadcast
|
|
940
|
-
[credentials]="credentials"
|
|
941
|
-
[useLocalUIMode]="useLocalUIMode"
|
|
942
|
-
[useSeed]="useSeed"
|
|
943
|
-
[seedData]="useSeed ? seedData : {}"
|
|
944
|
-
></app-mediasfu-broadcast>
|
|
945
|
-
-->
|
|
946
|
-
|
|
947
|
-
<!-- MediasfuChat Component -->
|
|
948
|
-
<!-- Uncomment to use the chat event type -->
|
|
949
|
-
<!--
|
|
950
|
-
<app-mediasfu-chat
|
|
951
|
-
[credentials]="credentials"
|
|
952
|
-
[useLocalUIMode]="useLocalUIMode"
|
|
953
|
-
[useSeed]="useSeed"
|
|
954
|
-
[seedData]="useSeed ? seedData : {}"
|
|
955
|
-
></app-mediasfu-chat>
|
|
956
|
-
-->
|
|
957
|
-
|
|
958
|
-
<!-- MediasfuWebinar Component -->
|
|
959
|
-
<!-- Uncomment to use the webinar event type -->
|
|
960
|
-
<!--
|
|
961
|
-
<app-mediasfu-webinar
|
|
962
|
-
[credentials]="credentials"
|
|
963
|
-
[useLocalUIMode]="useLocalUIMode"
|
|
964
|
-
[useSeed]="useSeed"
|
|
965
|
-
[seedData]="useSeed ? seedData : {}"
|
|
966
|
-
></app-mediasfu-webinar>
|
|
967
|
-
-->
|
|
968
|
-
|
|
969
|
-
<!-- MediasfuConference Component -->
|
|
970
|
-
<!-- Uncomment to use the conference event type -->
|
|
971
|
-
<!--
|
|
972
|
-
<app-mediasfu-conference
|
|
973
|
-
[credentials]="credentials"
|
|
974
|
-
[useLocalUIMode]="useLocalUIMode"
|
|
975
|
-
[useSeed]="useSeed"
|
|
976
|
-
[seedData]="useSeed ? seedData : {}"
|
|
977
|
-
></app-mediasfu-conference>
|
|
978
|
-
-->
|
|
979
|
-
`
|
|
906
|
+
<app-mediasfu-webinar
|
|
907
|
+
[credentials]="credentials"
|
|
908
|
+
[localLink]="localLink"
|
|
909
|
+
[connectMediaSFU]="connectMediaSFU"
|
|
910
|
+
[PrejoinPage]="PreJoinPage"
|
|
911
|
+
[seedData]="seedData">
|
|
912
|
+
</app-mediasfu-webinar>
|
|
913
|
+
`,
|
|
914
|
+
providers: [
|
|
915
|
+
GenerateRandomParticipants,
|
|
916
|
+
GenerateRandomMessages,
|
|
917
|
+
GenerateRandomRequestList,
|
|
918
|
+
GenerateRandomWaitingRoomList
|
|
919
|
+
],
|
|
980
920
|
})
|
|
981
921
|
export class AppComponent implements OnInit {
|
|
982
|
-
//
|
|
983
|
-
|
|
922
|
+
// ========================
|
|
923
|
+
// ====== CONFIGURATION ======
|
|
924
|
+
// ========================
|
|
984
925
|
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
926
|
+
/**
|
|
927
|
+
* Mediasfu account credentials.
|
|
928
|
+
* Replace 'your_api_username' and 'your_api_key' with your actual credentials.
|
|
929
|
+
* Not needed if using a custom server without MediaSFU Cloud Egress features.
|
|
930
|
+
*/
|
|
988
931
|
credentials = {
|
|
989
932
|
apiUserName: 'your_api_username',
|
|
990
933
|
apiKey: 'your_api_key',
|
|
991
934
|
};
|
|
992
935
|
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
// Event type ('broadcast', 'chat', 'webinar', 'conference')
|
|
999
|
-
// Set this to match the component you are using
|
|
1000
|
-
eventType: string = 'broadcast';
|
|
936
|
+
/**
|
|
937
|
+
* Specify your Community Edition (CE) server link.
|
|
938
|
+
* Leave as an empty string if not using a custom server.
|
|
939
|
+
*/
|
|
940
|
+
localLink = 'http://localhost:3000'; // Set to '' if not using your own server
|
|
1001
941
|
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
942
|
+
/**
|
|
943
|
+
* Automatically set `connectMediaSFU` to `true` if `localLink` is provided,
|
|
944
|
+
* indicating the use of MediaSFU Cloud by default.
|
|
945
|
+
*
|
|
946
|
+
* - If `localLink` is not empty, MediaSFU Cloud will be used for additional features.
|
|
947
|
+
* - If `localLink` is empty, the application will connect to MediaSFU Cloud by default.
|
|
948
|
+
*/
|
|
949
|
+
connectMediaSFU = this.localLink.trim() !== ''; // set to false if not using MediaSFU Cloud for Main Server or Egress
|
|
950
|
+
|
|
951
|
+
// ========================
|
|
952
|
+
// ====== USE CASES ======
|
|
953
|
+
// ========================
|
|
954
|
+
|
|
955
|
+
// Deprecated Feature: useLocalUIMode
|
|
956
|
+
// This feature is deprecated due to updates for strong typing.
|
|
957
|
+
// It is no longer required and should not be used in new implementations.
|
|
1005
958
|
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
959
|
+
/**
|
|
960
|
+
* Uncomment and configure the following section if you intend to use seed data
|
|
961
|
+
* for generating random participants and messages.
|
|
962
|
+
*
|
|
963
|
+
* Note: This is deprecated and maintained only for legacy purposes.
|
|
964
|
+
*/
|
|
965
|
+
/*
|
|
966
|
+
useSeed = false;
|
|
967
|
+
seedData: any = {};
|
|
1013
968
|
|
|
1014
969
|
ngOnInit(): void {
|
|
1015
|
-
// If using seed data, generate random participants and messages
|
|
1016
970
|
if (this.useSeed) {
|
|
1017
|
-
const memberName = '
|
|
971
|
+
const memberName = 'Alice';
|
|
1018
972
|
const hostName = 'Fred';
|
|
1019
973
|
|
|
1020
974
|
// Generate random participants
|
|
1021
|
-
const participants_ =
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
1028
|
-
});
|
|
975
|
+
const participants_ = this.generateRandomParticipants.generateRandomParticipants({
|
|
976
|
+
member: memberName,
|
|
977
|
+
coHost: '',
|
|
978
|
+
host: hostName,
|
|
979
|
+
forChatBroadcast: this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
980
|
+
});
|
|
1029
981
|
|
|
1030
982
|
// Generate random messages
|
|
1031
983
|
const messages_ = this.generateRandomMessages.generateRandomMessages({
|
|
1032
984
|
participants: participants_,
|
|
1033
985
|
member: memberName,
|
|
1034
986
|
host: hostName,
|
|
1035
|
-
forChatBroadcast:
|
|
1036
|
-
this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
987
|
+
forChatBroadcast: this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
1037
988
|
});
|
|
1038
989
|
|
|
1039
990
|
// Generate random request list
|
|
1040
|
-
const requests_ =
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
});
|
|
991
|
+
const requests_ = this.generateRandomRequestList.generateRandomRequestList({
|
|
992
|
+
participants: participants_,
|
|
993
|
+
hostName: memberName,
|
|
994
|
+
coHostName: '',
|
|
995
|
+
numberOfRequests: 3,
|
|
996
|
+
});
|
|
1047
997
|
|
|
1048
998
|
// Generate random waiting room list
|
|
1049
|
-
const waitingList_ =
|
|
1050
|
-
this.generateRandomWaitingRoomList.generateRandomWaitingRoomList();
|
|
999
|
+
const waitingList_ = this.generateRandomWaitingRoomList.generateRandomWaitingRoomList();
|
|
1051
1000
|
|
|
1052
1001
|
// Assign generated data to seedData
|
|
1053
1002
|
this.seedData = {
|
|
@@ -1064,14 +1013,164 @@ export class AppComponent implements OnInit {
|
|
|
1064
1013
|
// Determine whether to use local UI mode
|
|
1065
1014
|
this.useLocalUIMode = this.useSeed;
|
|
1066
1015
|
}
|
|
1016
|
+
*/
|
|
1017
|
+
|
|
1018
|
+
// ========================
|
|
1019
|
+
// ====== COMPONENT SELECTION ======
|
|
1020
|
+
// ========================
|
|
1021
|
+
|
|
1022
|
+
/**
|
|
1023
|
+
* Choose the Mediasfu component based on the event type and use case.
|
|
1024
|
+
* Uncomment the component corresponding to your specific use case.
|
|
1025
|
+
*/
|
|
1026
|
+
|
|
1027
|
+
// ------------------------
|
|
1028
|
+
// ====== SIMPLE USE CASE ======
|
|
1029
|
+
// ------------------------
|
|
1030
|
+
|
|
1031
|
+
/**
|
|
1032
|
+
* **Simple Use Case (Welcome Page)**
|
|
1033
|
+
*
|
|
1034
|
+
* Renders the default welcome page.
|
|
1035
|
+
* No additional inputs required.
|
|
1036
|
+
*/
|
|
1037
|
+
// return <MediasfuWebinar />;
|
|
1038
|
+
|
|
1039
|
+
// ------------------------
|
|
1040
|
+
// ====== PRE-JOIN USE CASE ======
|
|
1041
|
+
// ------------------------
|
|
1042
|
+
|
|
1043
|
+
/**
|
|
1044
|
+
* **Use Case with Pre-Join Page (Credentials Required)**
|
|
1045
|
+
*
|
|
1046
|
+
* Uses a pre-join page that requires users to enter credentials.
|
|
1047
|
+
*/
|
|
1048
|
+
// return <MediasfuWebinar PrejoinPage={PreJoinPage} credentials={credentials} />;
|
|
1049
|
+
|
|
1050
|
+
// ------------------------
|
|
1051
|
+
// ====== SEED DATA USE CASE ======
|
|
1052
|
+
// ------------------------
|
|
1053
|
+
|
|
1054
|
+
/**
|
|
1055
|
+
* **Use Case with Seed Data (Deprecated)**
|
|
1056
|
+
*
|
|
1057
|
+
* Runs the application using seed data.
|
|
1058
|
+
*
|
|
1059
|
+
* @deprecated Due to updates for strong typing, this feature is deprecated.
|
|
1060
|
+
*/
|
|
1061
|
+
// return <MediasfuWebinar useSeed={useSeed} seedData={useSeed ? seedData : {}} />;
|
|
1062
|
+
|
|
1063
|
+
// ------------------------
|
|
1064
|
+
// ====== WEBINAR EVENT TYPE ======
|
|
1065
|
+
// ------------------------
|
|
1066
|
+
|
|
1067
|
+
/**
|
|
1068
|
+
* **MediasfuWebinar Component**
|
|
1069
|
+
*
|
|
1070
|
+
* Uncomment to use the webinar event type.
|
|
1071
|
+
*/
|
|
1072
|
+
/*
|
|
1073
|
+
return (
|
|
1074
|
+
<MediasfuWebinar
|
|
1075
|
+
credentials={credentials}
|
|
1076
|
+
localLink={localLink}
|
|
1077
|
+
connectMediaSFU={connectMediaSFU}
|
|
1078
|
+
// seedData={useSeed ? seedData : {}}
|
|
1079
|
+
/>
|
|
1080
|
+
);
|
|
1081
|
+
*/
|
|
1082
|
+
|
|
1083
|
+
// ========================
|
|
1084
|
+
// ====== DEFAULT COMPONENT ======
|
|
1085
|
+
// ========================
|
|
1086
|
+
|
|
1087
|
+
/**
|
|
1088
|
+
* **Default to MediasfuWebinar with Updated Configuration**
|
|
1089
|
+
*
|
|
1090
|
+
* Renders the MediasfuWebinar component with specified server and cloud connection settings.
|
|
1091
|
+
* This is the default use case if no specific event type is selected.
|
|
1092
|
+
*/
|
|
1093
|
+
seedData: any = {}; // Initialize seedData as empty object
|
|
1094
|
+
|
|
1095
|
+
// Reference to the PreJoinPage component
|
|
1096
|
+
PreJoinPage = PreJoinPage;
|
|
1097
|
+
|
|
1098
|
+
constructor(
|
|
1099
|
+
private generateRandomParticipants: GenerateRandomParticipants,
|
|
1100
|
+
private generateRandomMessages: GenerateRandomMessages,
|
|
1101
|
+
private generateRandomRequestList: GenerateRandomRequestList,
|
|
1102
|
+
private generateRandomWaitingRoomList: GenerateRandomWaitingRoomList
|
|
1103
|
+
) { }
|
|
1104
|
+
|
|
1105
|
+
// Deprecated Feature: useSeed and seedData for generating random participants and messages
|
|
1106
|
+
// Uncomment and configure the following section if you intend to use seed data
|
|
1107
|
+
|
|
1108
|
+
// useSeed = false;
|
|
1109
|
+
// eventType = 'webinar';
|
|
1110
|
+
// useLocalUIMode = false;
|
|
1111
|
+
|
|
1112
|
+
ngOnInit(): void {
|
|
1113
|
+
// If using seed data, generate random participants and messages - DEPRECATED FEATURE
|
|
1114
|
+
// Note: This feature is deprecated and maintained only for legacy purposes.
|
|
1115
|
+
// Uncomment and configure the following section if you intend to use seed data
|
|
1116
|
+
|
|
1117
|
+
// if (this.useSeed) {
|
|
1118
|
+
// const memberName = 'Alice';
|
|
1119
|
+
// const hostName = 'Fred';
|
|
1120
|
+
|
|
1121
|
+
// // Generate random participants
|
|
1122
|
+
// const participants_ = this.generateRandomParticipants.generateRandomParticipants({
|
|
1123
|
+
// member: memberName,
|
|
1124
|
+
// coHost: '',
|
|
1125
|
+
// host: hostName,
|
|
1126
|
+
// forChatBroadcast: this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
1127
|
+
// });
|
|
1128
|
+
|
|
1129
|
+
// // Generate random messages
|
|
1130
|
+
// const messages_ = this.generateRandomMessages.generateRandomMessages({
|
|
1131
|
+
// participants: participants_,
|
|
1132
|
+
// member: memberName,
|
|
1133
|
+
// host: hostName,
|
|
1134
|
+
// forChatBroadcast: this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
1135
|
+
// });
|
|
1136
|
+
|
|
1137
|
+
// // Generate random request list
|
|
1138
|
+
// const requests_ = this.generateRandomRequestList.generateRandomRequestList({
|
|
1139
|
+
// participants: participants_,
|
|
1140
|
+
// hostName: memberName,
|
|
1141
|
+
// coHostName: '',
|
|
1142
|
+
// numberOfRequests: 3,
|
|
1143
|
+
// });
|
|
1144
|
+
|
|
1145
|
+
// // Generate random waiting room list
|
|
1146
|
+
// const waitingList_ = this.generateRandomWaitingRoomList.generateRandomWaitingRoomList();
|
|
1147
|
+
|
|
1148
|
+
// // Assign generated data to seedData
|
|
1149
|
+
// this.seedData = {
|
|
1150
|
+
// participants: participants_,
|
|
1151
|
+
// messages: messages_,
|
|
1152
|
+
// requests: requests_,
|
|
1153
|
+
// waitingList: waitingList_,
|
|
1154
|
+
// member: memberName,
|
|
1155
|
+
// host: hostName,
|
|
1156
|
+
// eventType: this.eventType,
|
|
1157
|
+
// };
|
|
1158
|
+
// }
|
|
1159
|
+
|
|
1160
|
+
// Determine whether to use local UI mode, deprecated feature
|
|
1161
|
+
// this.useLocalUIMode = this.useSeed;
|
|
1162
|
+
}
|
|
1067
1163
|
}
|
|
1068
1164
|
|
|
1165
|
+
|
|
1069
1166
|
```
|
|
1070
1167
|
|
|
1071
1168
|
In the provided examples, users can set `useLocalUIMode` to `true` during UI development to prevent unwanted connections to MediaSFU servers. Additionally, they can generate seed data for rendering UI components locally by using random data generators provided by the module.
|
|
1072
1169
|
|
|
1073
1170
|
### Local UI Development in MediaSFU Angular Module
|
|
1074
1171
|
|
|
1172
|
+
|
|
1173
|
+
|
|
1075
1174
|
During local UI development, the MediaSFU view is designed to be responsive to changes in screen size and orientation, adapting its layout accordingly. However, since UI changes are typically linked to communication with servers, developing the UI locally might result in less responsiveness due to the lack of real-time data updates. To mitigate this, users can force trigger changes in the UI by rotating the device, resizing the window, or simulating server responses by clicking on buttons within the page.
|
|
1076
1175
|
|
|
1077
1176
|
While developing locally, users may encounter occasional error warnings as the UI attempts to communicate with the server. These warnings can be safely ignored, as they are simply indicative of unsuccessful server requests in the local development environment.
|