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/README.md
CHANGED
|
@@ -23,10 +23,24 @@
|
|
|
23
23
|
|
|
24
24
|
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.
|
|
25
25
|
|
|
26
|
+
<div style="text-align: center;">
|
|
27
|
+
|
|
28
|
+
<img src="https://mediasfu.com/images/header_1.jpg" alt="Preview Page" title="Preview Page" style="max-height: 600px;">
|
|
29
|
+
|
|
30
|
+
</div>
|
|
31
|
+
|
|
26
32
|
---
|
|
27
33
|
|
|
28
34
|
# MediaSFU Angular Module Documentation
|
|
29
35
|
|
|
36
|
+
## Unlock the Power of MediaSFU Community Edition
|
|
37
|
+
|
|
38
|
+
**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.
|
|
39
|
+
|
|
40
|
+
**[Get started now on GitHub!](https://github.com/MediaSFU/MediaSFUOpen)**
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
30
44
|
## Table of Contents
|
|
31
45
|
|
|
32
46
|
- [Features](#features)
|
|
@@ -66,13 +80,13 @@ For comprehensive documentation on the available methods, components, and functi
|
|
|
66
80
|
|
|
67
81
|
Instructions on how to install the module using npm.
|
|
68
82
|
|
|
69
|
-
1. **Add the package to your project**
|
|
83
|
+
### 1. **Add the package to your project**
|
|
70
84
|
|
|
71
85
|
```bash
|
|
72
86
|
npm install mediasfu-angular
|
|
73
87
|
```
|
|
74
88
|
|
|
75
|
-
2. **Bootstrap Integration**
|
|
89
|
+
### 2. **Bootstrap Integration**
|
|
76
90
|
|
|
77
91
|
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
92
|
|
|
@@ -103,7 +117,7 @@ Instructions on how to install the module using npm.
|
|
|
103
117
|
**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
118
|
|
|
105
119
|
|
|
106
|
-
3. **Configure MediaSFU's PreJoinPage Requirements**
|
|
120
|
+
### 3. **Configure MediaSFU's PreJoinPage Requirements**
|
|
107
121
|
|
|
108
122
|
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
123
|
|
|
@@ -129,14 +143,20 @@ Instructions on how to install the module using npm.
|
|
|
129
143
|
};
|
|
130
144
|
|
|
131
145
|
```
|
|
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
146
|
|
|
135
|
-
|
|
147
|
+
### 4. Obtain an API Key (If Required)
|
|
148
|
+
You can get your API key by signing up or logging into your account at [mediasfu.com](https://www.mediasfu.com/).
|
|
149
|
+
|
|
150
|
+
<div style="background-color:#f0f0f0; padding: 10px; border-radius: 5px;">
|
|
136
151
|
<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>
|
|
152
|
+
<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
153
|
</div>
|
|
139
154
|
|
|
155
|
+
## **Self-Hosting MediaSFU**
|
|
156
|
+
|
|
157
|
+
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).
|
|
158
|
+
|
|
159
|
+
This setup allows full flexibility and customization while bypassing the need for cloud-dependent credentials.
|
|
140
160
|
|
|
141
161
|
|
|
142
162
|
# Basic Usage Guide <a name="basic-usage-guide"></a>
|
|
@@ -269,450 +289,469 @@ updateValidated(true);
|
|
|
269
289
|
See the following code for the PreJoinPage page logic:
|
|
270
290
|
|
|
271
291
|
```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
|
-
}
|
|
292
|
+
import { Component, Inject, Input, OnInit, Optional } from '@angular/core';
|
|
293
|
+
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
294
|
+
import { CommonModule } from '@angular/common';
|
|
295
|
+
import { Socket } from 'socket.io-client';
|
|
296
|
+
import {
|
|
297
|
+
ConnectSocketType, ShowAlert,
|
|
298
|
+
ConnectLocalSocketType, ResponseLocalConnection,
|
|
299
|
+
ResponseLocalConnectionData, RecordingParams, MeetingRoomParams
|
|
300
|
+
} from '../../../@types/types';
|
|
301
|
+
import { CheckLimitsAndMakeRequest } from '../../../methods/utils/check-limits-and-make-request.service';
|
|
302
|
+
import { CreateRoomOnMediaSFU } from '../../../methods/utils/create-room-on-media-sfu.service';
|
|
303
|
+
import { JoinRoomOnMediaSFUService } from '../../../methods/utils/join-room-on-media-sfu.service';
|
|
304
|
+
|
|
305
|
+
export interface JoinLocalEventRoomParameters {
|
|
306
|
+
eventID: string;
|
|
307
|
+
userName: string;
|
|
308
|
+
secureCode?: string;
|
|
309
|
+
videoPreference?: string | null;
|
|
310
|
+
audioPreference?: string | null;
|
|
311
|
+
audioOutputPreference?: string | null;
|
|
312
|
+
}
|
|
294
313
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
314
|
+
export interface JoinLocalEventRoomOptions {
|
|
315
|
+
joinData: JoinLocalEventRoomParameters;
|
|
316
|
+
link?: string;
|
|
317
|
+
}
|
|
299
318
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
319
|
+
export interface CreateLocalRoomParameters {
|
|
320
|
+
eventID: string;
|
|
321
|
+
duration: number;
|
|
322
|
+
capacity: number;
|
|
323
|
+
userName: string;
|
|
324
|
+
scheduledDate: Date;
|
|
325
|
+
secureCode: string;
|
|
326
|
+
waitRoom?: boolean;
|
|
327
|
+
recordingParams?: RecordingParams;
|
|
328
|
+
eventRoomParams?: MeetingRoomParams;
|
|
329
|
+
videoPreference?: string | null;
|
|
330
|
+
audioPreference?: string | null;
|
|
331
|
+
audioOutputPreference?: string | null;
|
|
332
|
+
mediasfuURL?: string;
|
|
333
|
+
}
|
|
334
|
+
export interface CreateLocalRoomOptions {
|
|
335
|
+
createData: CreateLocalRoomParameters;
|
|
336
|
+
link?: string;
|
|
337
|
+
}
|
|
304
338
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
secret: string;
|
|
312
|
-
success: boolean;
|
|
313
|
-
}
|
|
339
|
+
export interface CreateJoinLocalRoomResponse {
|
|
340
|
+
success: boolean;
|
|
341
|
+
secret: string;
|
|
342
|
+
reason?: string;
|
|
343
|
+
url?: string;
|
|
344
|
+
}
|
|
314
345
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
346
|
+
// Type definitions for parameters and credentials
|
|
347
|
+
export interface PreJoinPageParameters {
|
|
348
|
+
imgSrc?: string;
|
|
349
|
+
showAlert?: ShowAlert;
|
|
350
|
+
updateIsLoadingModalVisible: (visible: boolean) => void;
|
|
351
|
+
connectSocket: ConnectSocketType;
|
|
352
|
+
connectLocalSocket?: ConnectLocalSocketType;
|
|
353
|
+
updateSocket: (socket: Socket) => void;
|
|
354
|
+
updateLocalSocket?: (socket: Socket) => void;
|
|
355
|
+
updateValidated: (validated: boolean) => void;
|
|
356
|
+
updateApiUserName: (userName: string) => void;
|
|
357
|
+
updateApiToken: (token: string) => void;
|
|
358
|
+
updateLink: (link: string) => void;
|
|
359
|
+
updateRoomName: (roomName: string) => void;
|
|
360
|
+
updateMember: (member: string) => void;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
export interface Credentials {
|
|
364
|
+
apiUserName: string;
|
|
365
|
+
apiKey: string;
|
|
366
|
+
}
|
|
319
367
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
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
|
|
368
|
+
export interface PreJoinPageOptions {
|
|
369
|
+
localLink?: string;
|
|
370
|
+
connectMediaSFU?: boolean;
|
|
371
|
+
parameters: PreJoinPageParameters;
|
|
372
|
+
credentials?: Credentials;
|
|
373
|
+
}
|
|
343
374
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
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
|
-
}
|
|
375
|
+
export type PreJoinPageType = (options: PreJoinPageOptions) => HTMLElement;
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* @fileoverview PreJoinPage component for handling room creation and joining on MediaSFU.
|
|
379
|
+
*
|
|
380
|
+
* @component
|
|
381
|
+
* @selector app-pre-join-page
|
|
382
|
+
* @standalone true
|
|
383
|
+
* @templateUrl ./pre-join-page.component.html
|
|
384
|
+
* @styleUrls ./pre-join-page.component.css
|
|
385
|
+
* @imports [CommonModule, ReactiveFormsModule]
|
|
386
|
+
*
|
|
387
|
+
* @description
|
|
388
|
+
* This component provides functionality for users to create or join a room on MediaSFU.
|
|
389
|
+
* It includes form validation, error handling, and API requests to the MediaSFU service.
|
|
390
|
+
*
|
|
391
|
+
* @property {any} parameters - Input parameters for the component.
|
|
392
|
+
* @property {Object} credentials - API credentials for MediaSFU.
|
|
393
|
+
* @property {string} credentials.apiUserName - API username.
|
|
394
|
+
* @property {string} credentials.apiKey - API key.
|
|
395
|
+
* @property {boolean} isCreateMode - Flag to toggle between create and join modes.
|
|
396
|
+
* @property {FormGroup} preJoinForm - Form group for pre-join form.
|
|
397
|
+
* @property {string} error - Error message to display.
|
|
398
|
+
*
|
|
399
|
+
* @constructor
|
|
400
|
+
* @param {FormBuilder} fb - FormBuilder service for creating form groups.
|
|
401
|
+
* @param {HttpClient} http - HttpClient service for making HTTP requests.
|
|
402
|
+
* @param {CookieService} cookieService - CookieService for managing cookies.
|
|
403
|
+
*
|
|
404
|
+
* @method ngOnInit
|
|
405
|
+
* @description Lifecycle hook that is called after data-bound properties are initialized.
|
|
406
|
+
*
|
|
407
|
+
* @method toggleMode
|
|
408
|
+
* @description Toggles between create and join modes and resets the error message.
|
|
409
|
+
*
|
|
410
|
+
* @method handleCreateRoom
|
|
411
|
+
* @description Handles the creation of a room on MediaSFU. Validates form inputs, sends a request to create a room, and handles the response.
|
|
412
|
+
*
|
|
413
|
+
* @method handleJoinRoom
|
|
414
|
+
* @description Handles joining a room on MediaSFU. Validates form inputs, sends a request to join a room, and handles the response.
|
|
415
|
+
*
|
|
416
|
+
* @method checkLimitsAndMakeRequest
|
|
417
|
+
* @description Checks rate limits and makes a request to connect to a room. Handles unsuccessful attempts and updates the state accordingly.
|
|
418
|
+
*
|
|
419
|
+
* @method createRoomOnMediaSFU
|
|
420
|
+
* @description Sends a request to create a room on MediaSFU.
|
|
421
|
+
* @param {Object} params - Parameters for the request.
|
|
422
|
+
* @param {any} params.payload - Payload for the request.
|
|
423
|
+
* @param {string} params.apiUserName - API username.
|
|
424
|
+
* @param {string} params.apiKey - API key.
|
|
425
|
+
* @returns {Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }>} Response from the API.
|
|
426
|
+
*
|
|
427
|
+
* @method joinRoomOnMediaSFU
|
|
428
|
+
* @description Sends a request to join a room on MediaSFU.
|
|
429
|
+
* @param {Object} params - Parameters for the request.
|
|
430
|
+
* @param {any} params.payload - Payload for the request.
|
|
431
|
+
* @param {string} params.apiUserName - API username.
|
|
432
|
+
* @param {string} params.apiKey - API key.
|
|
433
|
+
* @returns {Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }>} Response from the API.
|
|
434
|
+
*
|
|
435
|
+
* @example
|
|
436
|
+
* ```html
|
|
437
|
+
* <app-pre-join-page
|
|
438
|
+
* [parameters]="preJoinPageParameters"
|
|
439
|
+
* [credentials]="{ apiUserName: 'username', apiKey: 'apiKey' }"
|
|
440
|
+
* [localLink]="'http://localhost:3000'"
|
|
441
|
+
* [connectMediaSFU]="false"
|
|
442
|
+
* ></app-pre-join-page>
|
|
443
|
+
* ```
|
|
444
|
+
*/
|
|
435
445
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
446
|
+
@Component({
|
|
447
|
+
selector: 'app-pre-join-page',
|
|
448
|
+
templateUrl: './pre-join-page.component.html',
|
|
449
|
+
styleUrls: ['./pre-join-page.component.css'],
|
|
450
|
+
imports: [CommonModule, ReactiveFormsModule]
|
|
451
|
+
})
|
|
452
|
+
export class PreJoinPage implements OnInit {
|
|
453
|
+
@Input() parameters: PreJoinPageParameters = {} as PreJoinPageParameters;
|
|
454
|
+
@Input() credentials: Credentials = { apiUserName: 'yourAPIUSERNAME', apiKey: 'yourAPIKEY' };
|
|
455
|
+
@Input() localLink: string | undefined = "";
|
|
456
|
+
@Input() connectMediaSFU: boolean | undefined = true;
|
|
440
457
|
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
return;
|
|
445
|
-
}
|
|
458
|
+
isCreateMode = false;
|
|
459
|
+
preJoinForm: FormGroup;
|
|
460
|
+
error = '';
|
|
446
461
|
|
|
447
|
-
|
|
462
|
+
imgSrc: string = this.parameters.imgSrc || '';
|
|
448
463
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
}
|
|
464
|
+
localConnected = false;
|
|
465
|
+
localData: ResponseLocalConnectionData | undefined = undefined;
|
|
466
|
+
initSocket: Socket | undefined = undefined;
|
|
453
467
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
468
|
+
constructor(
|
|
469
|
+
private fb: FormBuilder,
|
|
470
|
+
@Optional() @Inject('parameters') injectedParameters: PreJoinPageParameters,
|
|
471
|
+
@Optional() @Inject('credentials') injectedCredentials: Credentials,
|
|
472
|
+
@Optional() @Inject('localLink') injectedLocalLink: string,
|
|
473
|
+
@Optional() @Inject('connectMediaSFU') injectedConnectMediaSFU: boolean,
|
|
474
|
+
private checkLimitsService: CheckLimitsAndMakeRequest,
|
|
475
|
+
private createRoomService: CreateRoomOnMediaSFU,
|
|
476
|
+
private joinRoomService: JoinRoomOnMediaSFUService
|
|
477
|
+
) {
|
|
478
|
+
this.preJoinForm = this.fb.group({
|
|
479
|
+
name: ['', Validators.required],
|
|
480
|
+
duration: [''],
|
|
481
|
+
eventType: [''],
|
|
482
|
+
capacity: [''],
|
|
483
|
+
eventID: [''],
|
|
484
|
+
});
|
|
485
|
+
this.parameters = injectedParameters || this.parameters;
|
|
486
|
+
this.credentials = injectedCredentials || this.credentials;
|
|
487
|
+
this.localLink = injectedLocalLink || this.localLink;
|
|
488
|
+
this.connectMediaSFU = injectedConnectMediaSFU !== undefined ? injectedConnectMediaSFU : this.connectMediaSFU;
|
|
461
489
|
|
|
462
|
-
|
|
490
|
+
}
|
|
463
491
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
});
|
|
492
|
+
ngOnInit(): void {
|
|
493
|
+
if (this.localLink && !this.localConnected && !this.initSocket) {
|
|
494
|
+
this.connectLocalSocket();
|
|
495
|
+
}
|
|
496
|
+
}
|
|
470
497
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
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}`;
|
|
498
|
+
private async connectLocalSocket(): Promise<void> {
|
|
499
|
+
try {
|
|
500
|
+
const response = await this.parameters.connectLocalSocket?.({ link: this.localLink! }) as ResponseLocalConnection;
|
|
501
|
+
if (response) {
|
|
502
|
+
this.localData = response.data;
|
|
503
|
+
this.initSocket = response.socket;
|
|
504
|
+
this.localConnected = true;
|
|
488
505
|
}
|
|
506
|
+
} catch (error: any) {
|
|
507
|
+
this.parameters.showAlert?.({
|
|
508
|
+
message: `Unable to connect to ${this.localLink}. ${error}`,
|
|
509
|
+
type: 'danger',
|
|
510
|
+
duration: 3000,
|
|
511
|
+
});
|
|
489
512
|
}
|
|
513
|
+
}
|
|
490
514
|
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
}
|
|
515
|
+
toggleMode(): void {
|
|
516
|
+
this.isCreateMode = !this.isCreateMode;
|
|
517
|
+
this.error = '';
|
|
518
|
+
}
|
|
496
519
|
|
|
497
|
-
|
|
520
|
+
async joinLocalRoom(options: JoinLocalEventRoomOptions): Promise<void> {
|
|
521
|
+
this.initSocket?.emit('joinEventRoom', options.joinData, (response: CreateJoinLocalRoomResponse) => {
|
|
522
|
+
if (response.success) {
|
|
523
|
+
this.parameters.updateSocket(this.initSocket!);
|
|
524
|
+
this.parameters.updateApiUserName(this.localData?.apiUserName || '');
|
|
525
|
+
this.parameters.updateApiToken(response.secret);
|
|
526
|
+
this.parameters.updateLink(options.link || '');
|
|
527
|
+
this.parameters.updateRoomName(options.joinData.eventID);
|
|
528
|
+
this.parameters.updateMember(options.joinData.userName);
|
|
529
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
530
|
+
this.parameters.updateValidated(true);
|
|
531
|
+
} else {
|
|
532
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
533
|
+
this.error = `Unable to join room. ${response.reason}`;
|
|
534
|
+
}
|
|
535
|
+
});
|
|
536
|
+
}
|
|
498
537
|
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
538
|
+
async createLocalRoom(options: CreateLocalRoomOptions): Promise<void> {
|
|
539
|
+
this.initSocket?.emit('createRoom', options.createData, (response: CreateJoinLocalRoomResponse) => {
|
|
540
|
+
if (response.success) {
|
|
541
|
+
this.parameters.updateSocket(this.initSocket!);
|
|
542
|
+
this.parameters.updateApiUserName(this.localData?.apiUserName || '');
|
|
543
|
+
this.parameters.updateApiToken(response.secret);
|
|
544
|
+
this.parameters.updateLink(options.link || '');
|
|
545
|
+
this.parameters.updateRoomName(options.createData.eventID);
|
|
546
|
+
// Update member as `userName` + "_2" to split in the room
|
|
547
|
+
this.parameters.updateMember(`${options.createData.userName}_2`);
|
|
548
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
549
|
+
this.parameters.updateValidated(true);
|
|
550
|
+
} else {
|
|
551
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
552
|
+
this.error = `Unable to create room. ${response.reason}`;
|
|
502
553
|
}
|
|
554
|
+
});
|
|
555
|
+
}
|
|
503
556
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
557
|
+
async roomCreator(options: { payload: any; apiUserName: string; apiKey: string; validate?: boolean }): Promise<any> {
|
|
558
|
+
const { payload, apiUserName, apiKey, validate = true } = options;
|
|
559
|
+
const response = await this.createRoomService.createRoomOnMediaSFU({
|
|
560
|
+
payload,
|
|
561
|
+
apiUserName,
|
|
562
|
+
apiKey,
|
|
563
|
+
});
|
|
509
564
|
|
|
510
|
-
|
|
565
|
+
if (response.success && response.data && 'roomName' in response.data) {
|
|
566
|
+
await this.checkLimitsService.checkLimitsAndMakeRequest({
|
|
567
|
+
apiUserName: response.data.roomName,
|
|
568
|
+
apiToken: response.data.secret,
|
|
569
|
+
link: response.data.link,
|
|
570
|
+
userName: payload.userName,
|
|
571
|
+
parameters: this.parameters,
|
|
572
|
+
validate: validate,
|
|
573
|
+
});
|
|
574
|
+
return response;
|
|
575
|
+
} else {
|
|
576
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
577
|
+
this.error = `Unable to create room. ${
|
|
578
|
+
response.data
|
|
579
|
+
? 'error' in response.data
|
|
580
|
+
? response.data.error
|
|
581
|
+
: ''
|
|
582
|
+
: ''
|
|
583
|
+
}`;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
511
586
|
|
|
512
|
-
|
|
513
|
-
const response = await this.joinRoomOnMediaSFU({
|
|
514
|
-
payload,
|
|
515
|
-
apiUserName: this.credentials.apiUserName,
|
|
516
|
-
apiKey: this.credentials.apiKey,
|
|
517
|
-
});
|
|
587
|
+
async handleCreateRoom(): Promise<void> {
|
|
518
588
|
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
userName: name,
|
|
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
|
-
}
|
|
589
|
+
const { name, duration, eventType, capacity } = this.preJoinForm.value;
|
|
590
|
+
|
|
591
|
+
if (!name || !duration || !eventType || !capacity) {
|
|
592
|
+
this.error = 'Please fill all the fields.';
|
|
593
|
+
return;
|
|
537
594
|
}
|
|
538
595
|
|
|
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
|
-
}
|
|
596
|
+
const payload = {
|
|
597
|
+
action: 'create',
|
|
598
|
+
duration: parseInt(duration),
|
|
599
|
+
capacity: parseInt(capacity),
|
|
600
|
+
eventType,
|
|
601
|
+
userName: name,
|
|
602
|
+
recordOnly: false,
|
|
603
|
+
};
|
|
570
604
|
|
|
571
|
-
|
|
572
|
-
|
|
605
|
+
this.parameters.updateIsLoadingModalVisible(true);
|
|
606
|
+
|
|
607
|
+
if (this.localLink) {
|
|
608
|
+
const secureCode =
|
|
609
|
+
Math.random().toString(30).substring(2, 14) +
|
|
610
|
+
Math.random().toString(30).substring(2, 14);
|
|
611
|
+
let eventID =
|
|
612
|
+
new Date().getTime().toString(30) +
|
|
613
|
+
new Date().getUTCMilliseconds() +
|
|
614
|
+
Math.floor(10 + Math.random() * 99).toString();
|
|
615
|
+
eventID = 'm' + eventID;
|
|
616
|
+
const eventRoomParams = this.localData?.meetingRoomParams_;
|
|
617
|
+
eventRoomParams!.type = eventType as 'chat' | 'broadcast' | 'webinar' | 'conference';
|
|
618
|
+
|
|
619
|
+
const createData: CreateLocalRoomParameters = {
|
|
620
|
+
eventID: eventID,
|
|
621
|
+
duration: parseInt(duration, 10),
|
|
622
|
+
capacity: parseInt(capacity, 10),
|
|
623
|
+
userName: name,
|
|
624
|
+
scheduledDate: new Date(),
|
|
625
|
+
secureCode: secureCode,
|
|
626
|
+
waitRoom: false,
|
|
627
|
+
recordingParams: this.localData?.recordingParams_,
|
|
628
|
+
eventRoomParams: eventRoomParams,
|
|
629
|
+
videoPreference: null,
|
|
630
|
+
audioPreference: null,
|
|
631
|
+
audioOutputPreference: null,
|
|
632
|
+
mediasfuURL: '',
|
|
633
|
+
};
|
|
573
634
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
635
|
+
if (
|
|
636
|
+
this.connectMediaSFU &&
|
|
637
|
+
this.initSocket &&
|
|
638
|
+
this.localData &&
|
|
639
|
+
this.localData.apiUserName &&
|
|
640
|
+
this.localData.apiKey
|
|
641
|
+
) {
|
|
642
|
+
payload.recordOnly = true; // allow production to MediaSFU only; no consumption
|
|
643
|
+
const response = await this.roomCreator({
|
|
644
|
+
payload,
|
|
645
|
+
apiUserName: this.localData.apiUserName,
|
|
646
|
+
apiKey: this.localData.apiKey,
|
|
647
|
+
validate: false,
|
|
579
648
|
});
|
|
580
649
|
|
|
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);
|
|
650
|
+
if (response && response.success && response.data && 'roomName' in response.data) {
|
|
651
|
+
createData.eventID = response.data.roomName;
|
|
652
|
+
createData.secureCode = response.data.secret;
|
|
653
|
+
createData.mediasfuURL = response.data.publicURL;
|
|
654
|
+
await this.createLocalRoom({ createData: createData, link: response.data.link });
|
|
598
655
|
} else {
|
|
599
|
-
unsuccessfulAttempts += 1;
|
|
600
|
-
this.cookieService.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
|
|
601
|
-
this.cookieService.set('lastRequestTimestamp', Date.now().toString());
|
|
602
656
|
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
|
-
});
|
|
657
|
+
this.error = 'Unable to create room on MediaSFU.';
|
|
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}`;
|
|
616
664
|
}
|
|
617
665
|
}
|
|
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);
|
|
666
|
+
} else {
|
|
667
|
+
try {
|
|
668
|
+
this.parameters.updateSocket(this.initSocket!);
|
|
669
|
+
await this.createLocalRoom({ createData: createData });
|
|
670
|
+
} catch (error: any) {
|
|
671
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
672
|
+
this.error = `Unable to create room. ${error}`;
|
|
673
|
+
}
|
|
629
674
|
}
|
|
675
|
+
} else {
|
|
676
|
+
await this.roomCreator({
|
|
677
|
+
payload,
|
|
678
|
+
apiUserName: this.credentials.apiUserName,
|
|
679
|
+
apiKey: this.credentials.apiKey,
|
|
680
|
+
validate: true,
|
|
681
|
+
});
|
|
630
682
|
}
|
|
683
|
+
}
|
|
631
684
|
|
|
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
|
-
}
|
|
685
|
+
async handleJoinRoom(): Promise<void> {
|
|
686
|
+
if (this.preJoinForm.invalid) {
|
|
687
|
+
this.error = 'Please fill all the fields.';
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
652
690
|
|
|
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
|
-
}
|
|
691
|
+
const { name, eventID } = this.preJoinForm.value;
|
|
692
|
+
|
|
693
|
+
if (!name || !eventID) {
|
|
694
|
+
this.error = 'Please fill all the fields.';
|
|
695
|
+
return;
|
|
670
696
|
}
|
|
671
697
|
|
|
672
|
-
|
|
698
|
+
const payload = {
|
|
699
|
+
action: 'join',
|
|
700
|
+
meetingID: eventID,
|
|
701
|
+
userName: name,
|
|
702
|
+
};
|
|
703
|
+
|
|
704
|
+
if (this.localLink && !this.localLink.includes('mediasfu.com')) {
|
|
705
|
+
const joinData = {
|
|
706
|
+
eventID: eventID,
|
|
707
|
+
userName: name,
|
|
708
|
+
secureCode: '',
|
|
709
|
+
videoPreference: null,
|
|
710
|
+
audioPreference: null,
|
|
711
|
+
audioOutputPreference: null,
|
|
712
|
+
};
|
|
713
|
+
|
|
714
|
+
await this.joinLocalRoom({ joinData: joinData });
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
this.parameters.updateIsLoadingModalVisible(true);
|
|
719
|
+
try {
|
|
720
|
+
const response = await this.joinRoomService.joinRoomOnMediaSFU({
|
|
673
721
|
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
|
-
}
|
|
722
|
+
apiUserName: this.credentials.apiUserName,
|
|
723
|
+
apiKey: this.credentials.apiKey,
|
|
724
|
+
});
|
|
692
725
|
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
};
|
|
709
|
-
}
|
|
726
|
+
if (response.success && response.data && 'roomName' in response.data) {
|
|
727
|
+
await this.checkLimitsService.checkLimitsAndMakeRequest({
|
|
728
|
+
apiUserName: response.data.roomName,
|
|
729
|
+
apiToken: response.data.secret,
|
|
730
|
+
link: response.data.link,
|
|
731
|
+
userName: name,
|
|
732
|
+
parameters: this.parameters,
|
|
733
|
+
validate: true,
|
|
734
|
+
});
|
|
735
|
+
this.error = '';
|
|
736
|
+
} else {
|
|
737
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
738
|
+
this.error = `Unable to connect to room. ${
|
|
739
|
+
response.data ? ('error' in response.data ? response.data.error : '') : ''
|
|
740
|
+
}`;
|
|
710
741
|
}
|
|
742
|
+
} catch (error) {
|
|
743
|
+
this.parameters.updateIsLoadingModalVisible(false);
|
|
744
|
+
this.error = `Unable to connect. ${(error as any).message}`;
|
|
711
745
|
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
712
749
|
```
|
|
713
750
|
|
|
714
751
|
### IP Blockage Warning And Local UI Development
|
|
715
752
|
|
|
753
|
+
**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.
|
|
754
|
+
|
|
716
755
|
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
756
|
|
|
718
757
|
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 +882,130 @@ import {
|
|
|
843
882
|
} from 'mediasfu-angular';
|
|
844
883
|
|
|
845
884
|
|
|
885
|
+
/**
|
|
886
|
+
* The main application component for MediaSFU.
|
|
887
|
+
*
|
|
888
|
+
* This component initializes the necessary configuration and credentials for the MediaSFU application.
|
|
889
|
+
* Users can specify their own Community Edition (CE) server, utilize MediaSFU Cloud by default, or enable MediaSFU Cloud for egress features.
|
|
890
|
+
*
|
|
891
|
+
* @remarks
|
|
892
|
+
* - **Using Your Own Community Edition (CE) Server**: Set the `localLink` to point to your CE server.
|
|
893
|
+
* - **Using MediaSFU Cloud by Default**: If not using a custom server (`localLink` is empty), the application connects to MediaSFU Cloud.
|
|
894
|
+
* - **MediaSFU Cloud Egress Features**: To enable cloud recording, capturing, and returning real-time images and audio buffers,
|
|
895
|
+
* set `connectMediaSFU` to `true` in addition to specifying your `localLink`.
|
|
896
|
+
* - **Credentials Requirement**: If not using your own server, provide `apiUserName` and `apiKey`. The same applies when using MediaSFU Cloud for egress.
|
|
897
|
+
* - **Deprecated Feature**: `useLocalUIMode` is deprecated due to updates for strong typing and improved configuration options.
|
|
898
|
+
*
|
|
899
|
+
* @component
|
|
900
|
+
* @example
|
|
901
|
+
* ```typescript
|
|
902
|
+
* // Example usage of the AppComponent
|
|
903
|
+
* @NgModule({
|
|
904
|
+
* declarations: [AppComponent],
|
|
905
|
+
* imports: [BrowserModule, MediasfuWebinar],
|
|
906
|
+
* bootstrap: [AppComponent]
|
|
907
|
+
* })
|
|
908
|
+
* export class AppModule { }
|
|
909
|
+
* ```
|
|
910
|
+
*/
|
|
846
911
|
@Component({
|
|
847
912
|
selector: 'app-root',
|
|
848
|
-
|
|
849
|
-
imports: [
|
|
850
|
-
MediasfuGeneric,
|
|
851
|
-
MediasfuBroadcast,
|
|
852
|
-
MediasfuChat,
|
|
853
|
-
MediasfuWebinar,
|
|
854
|
-
MediasfuConference,
|
|
855
|
-
PreJoinPage,
|
|
856
|
-
],
|
|
913
|
+
imports: [MediasfuWebinar],
|
|
857
914
|
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
|
-
`
|
|
915
|
+
<app-mediasfu-webinar
|
|
916
|
+
[credentials]="credentials"
|
|
917
|
+
[localLink]="localLink"
|
|
918
|
+
[connectMediaSFU]="connectMediaSFU"
|
|
919
|
+
[PrejoinPage]="PreJoinPage"
|
|
920
|
+
[seedData]="seedData">
|
|
921
|
+
</app-mediasfu-webinar>
|
|
922
|
+
`,
|
|
923
|
+
providers: [
|
|
924
|
+
GenerateRandomParticipants,
|
|
925
|
+
GenerateRandomMessages,
|
|
926
|
+
GenerateRandomRequestList,
|
|
927
|
+
GenerateRandomWaitingRoomList
|
|
928
|
+
],
|
|
980
929
|
})
|
|
981
930
|
export class AppComponent implements OnInit {
|
|
982
|
-
//
|
|
983
|
-
|
|
931
|
+
// ========================
|
|
932
|
+
// ====== CONFIGURATION ======
|
|
933
|
+
// ========================
|
|
984
934
|
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
935
|
+
/**
|
|
936
|
+
* Mediasfu account credentials.
|
|
937
|
+
* Replace 'your_api_username' and 'your_api_key' with your actual credentials.
|
|
938
|
+
* Not needed if using a custom server without MediaSFU Cloud Egress features.
|
|
939
|
+
*/
|
|
988
940
|
credentials = {
|
|
989
941
|
apiUserName: 'your_api_username',
|
|
990
942
|
apiKey: 'your_api_key',
|
|
991
943
|
};
|
|
992
944
|
|
|
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';
|
|
945
|
+
/**
|
|
946
|
+
* Specify your Community Edition (CE) server link.
|
|
947
|
+
* Leave as an empty string if not using a custom server.
|
|
948
|
+
*/
|
|
949
|
+
localLink = 'http://localhost:3000'; // Set to '' if not using your own server
|
|
1001
950
|
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
951
|
+
/**
|
|
952
|
+
* Automatically set `connectMediaSFU` to `true` if `localLink` is provided,
|
|
953
|
+
* indicating the use of MediaSFU Cloud by default.
|
|
954
|
+
*
|
|
955
|
+
* - If `localLink` is not empty, MediaSFU Cloud will be used for additional features.
|
|
956
|
+
* - If `localLink` is empty, the application will connect to MediaSFU Cloud by default.
|
|
957
|
+
*/
|
|
958
|
+
connectMediaSFU = this.localLink.trim() !== ''; // set to false if not using MediaSFU Cloud for Main Server or Egress
|
|
959
|
+
|
|
960
|
+
// ========================
|
|
961
|
+
// ====== USE CASES ======
|
|
962
|
+
// ========================
|
|
963
|
+
|
|
964
|
+
// Deprecated Feature: useLocalUIMode
|
|
965
|
+
// This feature is deprecated due to updates for strong typing.
|
|
966
|
+
// It is no longer required and should not be used in new implementations.
|
|
1005
967
|
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
968
|
+
/**
|
|
969
|
+
* Uncomment and configure the following section if you intend to use seed data
|
|
970
|
+
* for generating random participants and messages.
|
|
971
|
+
*
|
|
972
|
+
* Note: This is deprecated and maintained only for legacy purposes.
|
|
973
|
+
*/
|
|
974
|
+
/*
|
|
975
|
+
useSeed = false;
|
|
976
|
+
seedData: any = {};
|
|
1013
977
|
|
|
1014
978
|
ngOnInit(): void {
|
|
1015
|
-
// If using seed data, generate random participants and messages
|
|
1016
979
|
if (this.useSeed) {
|
|
1017
|
-
const memberName = '
|
|
980
|
+
const memberName = 'Alice';
|
|
1018
981
|
const hostName = 'Fred';
|
|
1019
982
|
|
|
1020
983
|
// Generate random participants
|
|
1021
|
-
const participants_ =
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
1028
|
-
});
|
|
984
|
+
const participants_ = this.generateRandomParticipants.generateRandomParticipants({
|
|
985
|
+
member: memberName,
|
|
986
|
+
coHost: '',
|
|
987
|
+
host: hostName,
|
|
988
|
+
forChatBroadcast: this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
989
|
+
});
|
|
1029
990
|
|
|
1030
991
|
// Generate random messages
|
|
1031
992
|
const messages_ = this.generateRandomMessages.generateRandomMessages({
|
|
1032
993
|
participants: participants_,
|
|
1033
994
|
member: memberName,
|
|
1034
995
|
host: hostName,
|
|
1035
|
-
forChatBroadcast:
|
|
1036
|
-
this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
996
|
+
forChatBroadcast: this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
1037
997
|
});
|
|
1038
998
|
|
|
1039
999
|
// Generate random request list
|
|
1040
|
-
const requests_ =
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
});
|
|
1000
|
+
const requests_ = this.generateRandomRequestList.generateRandomRequestList({
|
|
1001
|
+
participants: participants_,
|
|
1002
|
+
hostName: memberName,
|
|
1003
|
+
coHostName: '',
|
|
1004
|
+
numberOfRequests: 3,
|
|
1005
|
+
});
|
|
1047
1006
|
|
|
1048
1007
|
// Generate random waiting room list
|
|
1049
|
-
const waitingList_ =
|
|
1050
|
-
this.generateRandomWaitingRoomList.generateRandomWaitingRoomList();
|
|
1008
|
+
const waitingList_ = this.generateRandomWaitingRoomList.generateRandomWaitingRoomList();
|
|
1051
1009
|
|
|
1052
1010
|
// Assign generated data to seedData
|
|
1053
1011
|
this.seedData = {
|
|
@@ -1064,14 +1022,164 @@ export class AppComponent implements OnInit {
|
|
|
1064
1022
|
// Determine whether to use local UI mode
|
|
1065
1023
|
this.useLocalUIMode = this.useSeed;
|
|
1066
1024
|
}
|
|
1025
|
+
*/
|
|
1026
|
+
|
|
1027
|
+
// ========================
|
|
1028
|
+
// ====== COMPONENT SELECTION ======
|
|
1029
|
+
// ========================
|
|
1030
|
+
|
|
1031
|
+
/**
|
|
1032
|
+
* Choose the Mediasfu component based on the event type and use case.
|
|
1033
|
+
* Uncomment the component corresponding to your specific use case.
|
|
1034
|
+
*/
|
|
1035
|
+
|
|
1036
|
+
// ------------------------
|
|
1037
|
+
// ====== SIMPLE USE CASE ======
|
|
1038
|
+
// ------------------------
|
|
1039
|
+
|
|
1040
|
+
/**
|
|
1041
|
+
* **Simple Use Case (Welcome Page)**
|
|
1042
|
+
*
|
|
1043
|
+
* Renders the default welcome page.
|
|
1044
|
+
* No additional inputs required.
|
|
1045
|
+
*/
|
|
1046
|
+
// return <MediasfuWebinar />;
|
|
1047
|
+
|
|
1048
|
+
// ------------------------
|
|
1049
|
+
// ====== PRE-JOIN USE CASE ======
|
|
1050
|
+
// ------------------------
|
|
1051
|
+
|
|
1052
|
+
/**
|
|
1053
|
+
* **Use Case with Pre-Join Page (Credentials Required)**
|
|
1054
|
+
*
|
|
1055
|
+
* Uses a pre-join page that requires users to enter credentials.
|
|
1056
|
+
*/
|
|
1057
|
+
// return <MediasfuWebinar PrejoinPage={PreJoinPage} credentials={credentials} />;
|
|
1058
|
+
|
|
1059
|
+
// ------------------------
|
|
1060
|
+
// ====== SEED DATA USE CASE ======
|
|
1061
|
+
// ------------------------
|
|
1062
|
+
|
|
1063
|
+
/**
|
|
1064
|
+
* **Use Case with Seed Data (Deprecated)**
|
|
1065
|
+
*
|
|
1066
|
+
* Runs the application using seed data.
|
|
1067
|
+
*
|
|
1068
|
+
* @deprecated Due to updates for strong typing, this feature is deprecated.
|
|
1069
|
+
*/
|
|
1070
|
+
// return <MediasfuWebinar useSeed={useSeed} seedData={useSeed ? seedData : {}} />;
|
|
1071
|
+
|
|
1072
|
+
// ------------------------
|
|
1073
|
+
// ====== WEBINAR EVENT TYPE ======
|
|
1074
|
+
// ------------------------
|
|
1075
|
+
|
|
1076
|
+
/**
|
|
1077
|
+
* **MediasfuWebinar Component**
|
|
1078
|
+
*
|
|
1079
|
+
* Uncomment to use the webinar event type.
|
|
1080
|
+
*/
|
|
1081
|
+
/*
|
|
1082
|
+
return (
|
|
1083
|
+
<MediasfuWebinar
|
|
1084
|
+
credentials={credentials}
|
|
1085
|
+
localLink={localLink}
|
|
1086
|
+
connectMediaSFU={connectMediaSFU}
|
|
1087
|
+
// seedData={useSeed ? seedData : {}}
|
|
1088
|
+
/>
|
|
1089
|
+
);
|
|
1090
|
+
*/
|
|
1091
|
+
|
|
1092
|
+
// ========================
|
|
1093
|
+
// ====== DEFAULT COMPONENT ======
|
|
1094
|
+
// ========================
|
|
1095
|
+
|
|
1096
|
+
/**
|
|
1097
|
+
* **Default to MediasfuWebinar with Updated Configuration**
|
|
1098
|
+
*
|
|
1099
|
+
* Renders the MediasfuWebinar component with specified server and cloud connection settings.
|
|
1100
|
+
* This is the default use case if no specific event type is selected.
|
|
1101
|
+
*/
|
|
1102
|
+
seedData: any = {}; // Initialize seedData as empty object
|
|
1103
|
+
|
|
1104
|
+
// Reference to the PreJoinPage component
|
|
1105
|
+
PreJoinPage = PreJoinPage;
|
|
1106
|
+
|
|
1107
|
+
constructor(
|
|
1108
|
+
private generateRandomParticipants: GenerateRandomParticipants,
|
|
1109
|
+
private generateRandomMessages: GenerateRandomMessages,
|
|
1110
|
+
private generateRandomRequestList: GenerateRandomRequestList,
|
|
1111
|
+
private generateRandomWaitingRoomList: GenerateRandomWaitingRoomList
|
|
1112
|
+
) { }
|
|
1113
|
+
|
|
1114
|
+
// Deprecated Feature: useSeed and seedData for generating random participants and messages
|
|
1115
|
+
// Uncomment and configure the following section if you intend to use seed data
|
|
1116
|
+
|
|
1117
|
+
// useSeed = false;
|
|
1118
|
+
// eventType = 'webinar';
|
|
1119
|
+
// useLocalUIMode = false;
|
|
1120
|
+
|
|
1121
|
+
ngOnInit(): void {
|
|
1122
|
+
// If using seed data, generate random participants and messages - DEPRECATED FEATURE
|
|
1123
|
+
// Note: This feature is deprecated and maintained only for legacy purposes.
|
|
1124
|
+
// Uncomment and configure the following section if you intend to use seed data
|
|
1125
|
+
|
|
1126
|
+
// if (this.useSeed) {
|
|
1127
|
+
// const memberName = 'Alice';
|
|
1128
|
+
// const hostName = 'Fred';
|
|
1129
|
+
|
|
1130
|
+
// // Generate random participants
|
|
1131
|
+
// const participants_ = this.generateRandomParticipants.generateRandomParticipants({
|
|
1132
|
+
// member: memberName,
|
|
1133
|
+
// coHost: '',
|
|
1134
|
+
// host: hostName,
|
|
1135
|
+
// forChatBroadcast: this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
1136
|
+
// });
|
|
1137
|
+
|
|
1138
|
+
// // Generate random messages
|
|
1139
|
+
// const messages_ = this.generateRandomMessages.generateRandomMessages({
|
|
1140
|
+
// participants: participants_,
|
|
1141
|
+
// member: memberName,
|
|
1142
|
+
// host: hostName,
|
|
1143
|
+
// forChatBroadcast: this.eventType === 'broadcast' || this.eventType === 'chat',
|
|
1144
|
+
// });
|
|
1145
|
+
|
|
1146
|
+
// // Generate random request list
|
|
1147
|
+
// const requests_ = this.generateRandomRequestList.generateRandomRequestList({
|
|
1148
|
+
// participants: participants_,
|
|
1149
|
+
// hostName: memberName,
|
|
1150
|
+
// coHostName: '',
|
|
1151
|
+
// numberOfRequests: 3,
|
|
1152
|
+
// });
|
|
1153
|
+
|
|
1154
|
+
// // Generate random waiting room list
|
|
1155
|
+
// const waitingList_ = this.generateRandomWaitingRoomList.generateRandomWaitingRoomList();
|
|
1156
|
+
|
|
1157
|
+
// // Assign generated data to seedData
|
|
1158
|
+
// this.seedData = {
|
|
1159
|
+
// participants: participants_,
|
|
1160
|
+
// messages: messages_,
|
|
1161
|
+
// requests: requests_,
|
|
1162
|
+
// waitingList: waitingList_,
|
|
1163
|
+
// member: memberName,
|
|
1164
|
+
// host: hostName,
|
|
1165
|
+
// eventType: this.eventType,
|
|
1166
|
+
// };
|
|
1167
|
+
// }
|
|
1168
|
+
|
|
1169
|
+
// Determine whether to use local UI mode, deprecated feature
|
|
1170
|
+
// this.useLocalUIMode = this.useSeed;
|
|
1171
|
+
}
|
|
1067
1172
|
}
|
|
1068
1173
|
|
|
1174
|
+
|
|
1069
1175
|
```
|
|
1070
1176
|
|
|
1071
1177
|
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
1178
|
|
|
1073
1179
|
### Local UI Development in MediaSFU Angular Module
|
|
1074
1180
|
|
|
1181
|
+
|
|
1182
|
+
|
|
1075
1183
|
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
1184
|
|
|
1077
1185
|
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.
|