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.
Files changed (281) hide show
  1. package/README.md +686 -578
  2. package/dist/README.md +677 -578
  3. package/dist/fesm2022/mediasfu-angular.mjs +5551 -2944
  4. package/dist/fesm2022/mediasfu-angular.mjs.map +1 -1
  5. package/dist/lib/@types/types.d.ts +22 -1
  6. package/dist/lib/components/breakout-components/breakout-rooms-modal.component.d.ts +1 -0
  7. package/dist/lib/components/mediasfu-components/mediasfu-broadcast.component.d.ts +153 -61
  8. package/dist/lib/components/mediasfu-components/mediasfu-chat.component.d.ts +154 -66
  9. package/dist/lib/components/mediasfu-components/mediasfu-conference.component.d.ts +190 -76
  10. package/dist/lib/components/mediasfu-components/mediasfu-generic.component.d.ts +184 -70
  11. package/dist/lib/components/mediasfu-components/mediasfu-webinar.component.d.ts +192 -78
  12. package/dist/lib/components/menu-components/menu-modal/menu-modal.component.d.ts +6 -1
  13. package/dist/lib/components/menu-components/share-buttons-component/share-buttons-component.component.d.ts +5 -2
  14. package/dist/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.d.ts +4 -2
  15. package/dist/lib/components/misc-components/pre-join-page/pre-join-page.component.d.ts +71 -66
  16. package/dist/lib/components/misc-components/share-event-modal/share-event-modal.component.d.ts +5 -1
  17. package/dist/lib/consumers/connect-local-ips.service.d.ts +81 -0
  18. package/dist/lib/consumers/connect-send-transport-audio.service.d.ts +43 -11
  19. package/dist/lib/consumers/connect-send-transport-screen.service.d.ts +87 -46
  20. package/dist/lib/consumers/connect-send-transport-video.service.d.ts +89 -43
  21. package/dist/lib/consumers/connect-send-transport.service.d.ts +5 -1
  22. package/dist/lib/consumers/create-send-transport.service.d.ts +130 -40
  23. package/dist/lib/consumers/disconnect-send-transport-audio.service.d.ts +77 -40
  24. package/dist/lib/consumers/disconnect-send-transport-screen.service.d.ts +48 -14
  25. package/dist/lib/consumers/disconnect-send-transport-video.service.d.ts +81 -44
  26. package/dist/lib/consumers/get-piped-producers-alt.service.d.ts +5 -1
  27. package/dist/lib/consumers/receive-all-piped-transports.service.d.ts +5 -1
  28. package/dist/lib/consumers/resume-send-transport-audio.service.d.ts +54 -21
  29. package/dist/lib/consumers/stream-success-audio-switch.service.d.ts +124 -40
  30. package/dist/lib/consumers/trigger.service.d.ts +3 -0
  31. package/dist/lib/methods/exit-methods/confirm-exit.service.d.ts +5 -1
  32. package/dist/lib/methods/recording-methods/start-recording.service.d.ts +3 -0
  33. package/dist/lib/methods/recording-methods/stop-recording.service.d.ts +4 -1
  34. package/dist/lib/methods/recording-methods/update-recording.service.d.ts +3 -0
  35. package/dist/lib/methods/stream-methods/click-audio.service.d.ts +3 -0
  36. package/dist/lib/methods/utils/check-limits-and-make-request.service.d.ts +23 -0
  37. package/dist/lib/methods/utils/create-response-join-room.util.d.ts +33 -0
  38. package/dist/lib/methods/utils/create-room-on-media-sfu.service.d.ts +25 -0
  39. package/dist/lib/methods/utils/initial-values.util.d.ts +6 -0
  40. package/dist/lib/methods/utils/join-room-on-media-sfu.service.d.ts +52 -0
  41. package/dist/lib/methods/whiteboard-methods/capture-canvas-stream.service.d.ts +37 -20
  42. package/dist/lib/producers/producer-emits/join-local-room.service.d.ts +125 -0
  43. package/dist/lib/producers/socket-receive-methods/all-members-rest.service.d.ts +7 -2
  44. package/dist/lib/producers/socket-receive-methods/all-members.service.d.ts +7 -2
  45. package/dist/lib/producers/socket-receive-methods/disconnect-user-self.service.d.ts +5 -1
  46. package/dist/lib/sockets/socket-manager.service.d.ts +90 -0
  47. package/dist/public-api.d.ts +11 -1
  48. package/package.json +17 -20
  49. package/dist/esm2022/lib/@types/types.mjs +0 -2
  50. package/dist/esm2022/lib/components/background-components/background-modal/background-modal.component.mjs +0 -799
  51. package/dist/esm2022/lib/components/breakout-components/breakout-rooms-modal.component.mjs +0 -366
  52. package/dist/esm2022/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.mjs +0 -143
  53. package/dist/esm2022/lib/components/breakout-components/room-list/room-list.component.mjs +0 -40
  54. package/dist/esm2022/lib/components/co-host-components/co-host-modal/co-host-modal.component.mjs +0 -245
  55. package/dist/esm2022/lib/components/display-components/alert-component/alert.component.component.mjs +0 -79
  56. package/dist/esm2022/lib/components/display-components/audio-card/audio-card.component.mjs +0 -356
  57. package/dist/esm2022/lib/components/display-components/audio-grid/audio-grid.component.mjs +0 -80
  58. package/dist/esm2022/lib/components/display-components/card-video-display/card-video-display.component.mjs +0 -129
  59. package/dist/esm2022/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.mjs +0 -138
  60. package/dist/esm2022/lib/components/display-components/control-buttons-component/control-buttons-component.component.mjs +0 -231
  61. package/dist/esm2022/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.mjs +0 -282
  62. package/dist/esm2022/lib/components/display-components/control-widgets/menu-participants-widget.component.mjs +0 -82
  63. package/dist/esm2022/lib/components/display-components/control-widgets/menu-record-widget.component.mjs +0 -65
  64. package/dist/esm2022/lib/components/display-components/control-widgets/menu-widget.component.mjs +0 -137
  65. package/dist/esm2022/lib/components/display-components/control-widgets/message-widget.component.mjs +0 -137
  66. package/dist/esm2022/lib/components/display-components/control-widgets/record-timer-widget.component.mjs +0 -51
  67. package/dist/esm2022/lib/components/display-components/control-widgets/screenshare-widget.component.mjs +0 -101
  68. package/dist/esm2022/lib/components/display-components/flexible-grid/flexible-grid.component.mjs +0 -151
  69. package/dist/esm2022/lib/components/display-components/flexible-video/flexible-video.component.mjs +0 -250
  70. package/dist/esm2022/lib/components/display-components/loading-modal/loading-modal.component.mjs +0 -102
  71. package/dist/esm2022/lib/components/display-components/main-aspect-component/main-aspect-component.component.mjs +0 -140
  72. package/dist/esm2022/lib/components/display-components/main-container-component/main-container-component.component.mjs +0 -131
  73. package/dist/esm2022/lib/components/display-components/main-grid-component/main-grid-component.component.mjs +0 -120
  74. package/dist/esm2022/lib/components/display-components/main-screen-component/main-screen-component.component.mjs +0 -201
  75. package/dist/esm2022/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.mjs +0 -115
  76. package/dist/esm2022/lib/components/display-components/mini-audio/mini-audio.component.mjs +0 -319
  77. package/dist/esm2022/lib/components/display-components/mini-card/mini-card.component.mjs +0 -161
  78. package/dist/esm2022/lib/components/display-components/mini-card-audio/mini-card-audio.component.mjs +0 -230
  79. package/dist/esm2022/lib/components/display-components/other-grid-component/other-grid-component.component.mjs +0 -126
  80. package/dist/esm2022/lib/components/display-components/pagination/pagination.component.mjs +0 -334
  81. package/dist/esm2022/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.mjs +0 -112
  82. package/dist/esm2022/lib/components/display-components/video-card/video-card.component.mjs +0 -392
  83. package/dist/esm2022/lib/components/display-settings-components/display-settings-modal.component.mjs +0 -106
  84. package/dist/esm2022/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.mjs +0 -199
  85. package/dist/esm2022/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.mjs +0 -132
  86. package/dist/esm2022/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.mjs +0 -220
  87. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-broadcast.component.mjs +0 -4238
  88. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-chat.component.mjs +0 -3754
  89. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-conference.component.mjs +0 -5071
  90. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-generic.component.mjs +0 -5380
  91. package/dist/esm2022/lib/components/mediasfu-components/mediasfu-webinar.component.mjs +0 -5068
  92. package/dist/esm2022/lib/components/menu-components/custom-buttons/custom-buttons.component.mjs +0 -83
  93. package/dist/esm2022/lib/components/menu-components/meeting-id-component/meeting-id-component.component.mjs +0 -27
  94. package/dist/esm2022/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.mjs +0 -27
  95. package/dist/esm2022/lib/components/menu-components/menu-modal/menu-modal.component.mjs +0 -125
  96. package/dist/esm2022/lib/components/menu-components/share-buttons-component/share-buttons-component.component.mjs +0 -106
  97. package/dist/esm2022/lib/components/message-components/message-panel/message-panel.component.mjs +0 -228
  98. package/dist/esm2022/lib/components/message-components/messages-modal/messages-modal.component.mjs +0 -277
  99. package/dist/esm2022/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.mjs +0 -130
  100. package/dist/esm2022/lib/components/misc-components/pre-join-page/pre-join-page.component.mjs +0 -343
  101. package/dist/esm2022/lib/components/misc-components/share-event-modal/share-event-modal.component.mjs +0 -127
  102. package/dist/esm2022/lib/components/misc-components/welcome-page/welcome-page.component.mjs +0 -241
  103. package/dist/esm2022/lib/components/participants-components/participant-list/participant-list.component.mjs +0 -82
  104. package/dist/esm2022/lib/components/participants-components/participant-list-item/participant-list-item.component.mjs +0 -139
  105. package/dist/esm2022/lib/components/participants-components/participant-list-others/participant-list-others.component.mjs +0 -40
  106. package/dist/esm2022/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.mjs +0 -60
  107. package/dist/esm2022/lib/components/participants-components/participants-modal/participants-modal.component.mjs +0 -124
  108. package/dist/esm2022/lib/components/polls-components/poll-modal/poll-modal.component.mjs +0 -201
  109. package/dist/esm2022/lib/components/recording-components/advanced-panel-component/advanced-panel-components.component.mjs +0 -92
  110. package/dist/esm2022/lib/components/recording-components/recording-modal/recording-modal.component.mjs +0 -133
  111. package/dist/esm2022/lib/components/recording-components/standard-panel-component/standard-panel-component.component.mjs +0 -90
  112. package/dist/esm2022/lib/components/requests-components/render-request-component/render-request-component.component.mjs +0 -81
  113. package/dist/esm2022/lib/components/requests-components/requests-modal/requests-modal.component.mjs +0 -147
  114. package/dist/esm2022/lib/components/screenboard-components/screenboard/screenboard.component.mjs +0 -627
  115. package/dist/esm2022/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.mjs +0 -391
  116. package/dist/esm2022/lib/components/waiting-components/waiting-room-modal.component.mjs +0 -201
  117. package/dist/esm2022/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.mjs +0 -286
  118. package/dist/esm2022/lib/components/whiteboard-components/whiteboard/whiteboard.component.mjs +0 -1833
  119. package/dist/esm2022/lib/consumers/add-videos-grid.service.mjs +0 -345
  120. package/dist/esm2022/lib/consumers/auto-adjust.service.mjs +0 -109
  121. package/dist/esm2022/lib/consumers/calculate-rows-and-columns.service.mjs +0 -60
  122. package/dist/esm2022/lib/consumers/change-vids.service.mjs +0 -551
  123. package/dist/esm2022/lib/consumers/check-grid.service.mjs +0 -93
  124. package/dist/esm2022/lib/consumers/check-permission.service.mjs +0 -105
  125. package/dist/esm2022/lib/consumers/check-screen-share.service.mjs +0 -106
  126. package/dist/esm2022/lib/consumers/close-and-resize.service.mjs +0 -331
  127. package/dist/esm2022/lib/consumers/compare-active-names.service.mjs +0 -106
  128. package/dist/esm2022/lib/consumers/compare-screen-states.service.mjs +0 -98
  129. package/dist/esm2022/lib/consumers/connect-ips.service.mjs +0 -154
  130. package/dist/esm2022/lib/consumers/connect-recv-transport.service.mjs +0 -146
  131. package/dist/esm2022/lib/consumers/connect-send-transport-audio.service.mjs +0 -84
  132. package/dist/esm2022/lib/consumers/connect-send-transport-screen.service.mjs +0 -102
  133. package/dist/esm2022/lib/consumers/connect-send-transport-video.service.mjs +0 -99
  134. package/dist/esm2022/lib/consumers/connect-send-transport.service.mjs +0 -140
  135. package/dist/esm2022/lib/consumers/consumer-resume.service.mjs +0 -368
  136. package/dist/esm2022/lib/consumers/control-media.service.mjs +0 -113
  137. package/dist/esm2022/lib/consumers/create-send-transport.service.mjs +0 -172
  138. package/dist/esm2022/lib/consumers/disconnect-send-transport-audio.service.mjs +0 -108
  139. package/dist/esm2022/lib/consumers/disconnect-send-transport-screen.service.mjs +0 -84
  140. package/dist/esm2022/lib/consumers/disconnect-send-transport-video.service.mjs +0 -101
  141. package/dist/esm2022/lib/consumers/disp-streams.service.mjs +0 -513
  142. package/dist/esm2022/lib/consumers/generate-page-content.service.mjs +0 -106
  143. package/dist/esm2022/lib/consumers/get-estimate.service.mjs +0 -120
  144. package/dist/esm2022/lib/consumers/get-piped-producers-alt.service.mjs +0 -82
  145. package/dist/esm2022/lib/consumers/get-producers-piped.service.mjs +0 -79
  146. package/dist/esm2022/lib/consumers/get-videos.service.mjs +0 -91
  147. package/dist/esm2022/lib/consumers/mix-streams.service.mjs +0 -95
  148. package/dist/esm2022/lib/consumers/on-screen-changes.service.mjs +0 -103
  149. package/dist/esm2022/lib/consumers/prepopulate-user-media.service.mjs +0 -541
  150. package/dist/esm2022/lib/consumers/process-consumer-transports-audio.service.mjs +0 -101
  151. package/dist/esm2022/lib/consumers/process-consumer-transports.service.mjs +0 -128
  152. package/dist/esm2022/lib/consumers/re-port.service.mjs +0 -114
  153. package/dist/esm2022/lib/consumers/re-update-inter.service.mjs +0 -239
  154. package/dist/esm2022/lib/consumers/readjust.service.mjs +0 -173
  155. package/dist/esm2022/lib/consumers/receive-all-piped-transports.service.mjs +0 -87
  156. package/dist/esm2022/lib/consumers/receive-room-messages.service.mjs +0 -69
  157. package/dist/esm2022/lib/consumers/reorder-streams.service.mjs +0 -239
  158. package/dist/esm2022/lib/consumers/request-screen-share.service.mjs +0 -101
  159. package/dist/esm2022/lib/consumers/resume-pause-audio-streams.service.mjs +0 -150
  160. package/dist/esm2022/lib/consumers/resume-pause-streams.service.mjs +0 -103
  161. package/dist/esm2022/lib/consumers/resume-send-transport-audio.service.mjs +0 -91
  162. package/dist/esm2022/lib/consumers/signal-new-consumer-transport.service.mjs +0 -136
  163. package/dist/esm2022/lib/consumers/socket-receive-methods/join-consume-room.service.mjs +0 -96
  164. package/dist/esm2022/lib/consumers/socket-receive-methods/new-pipe-producer.service.mjs +0 -100
  165. package/dist/esm2022/lib/consumers/socket-receive-methods/producer-closed.service.mjs +0 -78
  166. package/dist/esm2022/lib/consumers/start-share-screen.service.mjs +0 -120
  167. package/dist/esm2022/lib/consumers/stop-share-screen.service.mjs +0 -175
  168. package/dist/esm2022/lib/consumers/stream-success-audio-switch.service.mjs +0 -185
  169. package/dist/esm2022/lib/consumers/stream-success-audio.service.mjs +0 -210
  170. package/dist/esm2022/lib/consumers/stream-success-screen.service.mjs +0 -193
  171. package/dist/esm2022/lib/consumers/stream-success-video.service.mjs +0 -260
  172. package/dist/esm2022/lib/consumers/switch-user-audio.service.mjs +0 -120
  173. package/dist/esm2022/lib/consumers/switch-user-video-alt.service.mjs +0 -260
  174. package/dist/esm2022/lib/consumers/switch-user-video.service.mjs +0 -172
  175. package/dist/esm2022/lib/consumers/trigger.service.mjs +0 -210
  176. package/dist/esm2022/lib/consumers/update-mini-cards-grid.service.mjs +0 -135
  177. package/dist/esm2022/lib/consumers/update-participant-audio-decibels.service.mjs +0 -84
  178. package/dist/esm2022/lib/methods/background-methods/launch-background.service.mjs +0 -48
  179. package/dist/esm2022/lib/methods/breakout-room-methods/breakout-room-updated.service.mjs +0 -183
  180. package/dist/esm2022/lib/methods/breakout-room-methods/launch-breakout-rooms.service.mjs +0 -46
  181. package/dist/esm2022/lib/methods/co-host-methods/launch-co-host.service.mjs +0 -46
  182. package/dist/esm2022/lib/methods/co-host-methods/modify-co-host-settings.service.mjs +0 -104
  183. package/dist/esm2022/lib/methods/display-settings-methods/launch-display-settings.service.mjs +0 -46
  184. package/dist/esm2022/lib/methods/display-settings-methods/modify-display-settings.service.mjs +0 -194
  185. package/dist/esm2022/lib/methods/exit-methods/confirm-exit.service.mjs +0 -52
  186. package/dist/esm2022/lib/methods/exit-methods/launch-confirm-exit.service.mjs +0 -42
  187. package/dist/esm2022/lib/methods/media-settings-methods/launch-media-settings.service.mjs +0 -85
  188. package/dist/esm2022/lib/methods/menu-methods/launch-menu-modal.service.mjs +0 -44
  189. package/dist/esm2022/lib/methods/message-methods/launch-messages.service.mjs +0 -45
  190. package/dist/esm2022/lib/methods/message-methods/send-message.service.mjs +0 -143
  191. package/dist/esm2022/lib/methods/participants-methods/launch-participants.service.mjs +0 -47
  192. package/dist/esm2022/lib/methods/participants-methods/message-participants.service.mjs +0 -98
  193. package/dist/esm2022/lib/methods/participants-methods/mute-participants.service.mjs +0 -96
  194. package/dist/esm2022/lib/methods/participants-methods/remove-participants.service.mjs +0 -107
  195. package/dist/esm2022/lib/methods/polls-methods/handle-create-poll.service.mjs +0 -75
  196. package/dist/esm2022/lib/methods/polls-methods/handle-end-poll.service.mjs +0 -72
  197. package/dist/esm2022/lib/methods/polls-methods/handle-vote-poll.service.mjs +0 -83
  198. package/dist/esm2022/lib/methods/polls-methods/launch-poll.service.mjs +0 -43
  199. package/dist/esm2022/lib/methods/polls-methods/poll-updated.service.mjs +0 -95
  200. package/dist/esm2022/lib/methods/recording-methods/check-pause-state.service.mjs +0 -69
  201. package/dist/esm2022/lib/methods/recording-methods/check-resume-state.service.mjs +0 -56
  202. package/dist/esm2022/lib/methods/recording-methods/confirm-recording.service.mjs +0 -278
  203. package/dist/esm2022/lib/methods/recording-methods/launch-recording.service.mjs +0 -125
  204. package/dist/esm2022/lib/methods/recording-methods/record-pause-timer.service.mjs +0 -67
  205. package/dist/esm2022/lib/methods/recording-methods/record-resume-timer.service.mjs +0 -130
  206. package/dist/esm2022/lib/methods/recording-methods/record-start-timer.service.mjs +0 -134
  207. package/dist/esm2022/lib/methods/recording-methods/record-update-timer.service.mjs +0 -80
  208. package/dist/esm2022/lib/methods/recording-methods/start-recording.service.mjs +0 -197
  209. package/dist/esm2022/lib/methods/recording-methods/stop-recording.service.mjs +0 -112
  210. package/dist/esm2022/lib/methods/recording-methods/update-recording.service.mjs +0 -272
  211. package/dist/esm2022/lib/methods/requests-methods/launch-requests.service.mjs +0 -51
  212. package/dist/esm2022/lib/methods/requests-methods/respond-to-requests.service.mjs +0 -84
  213. package/dist/esm2022/lib/methods/settings-methods/launch-settings.service.mjs +0 -51
  214. package/dist/esm2022/lib/methods/settings-methods/modify-settings.service.mjs +0 -109
  215. package/dist/esm2022/lib/methods/stream-methods/click-audio.service.mjs +0 -275
  216. package/dist/esm2022/lib/methods/stream-methods/click-chat.service.mjs +0 -75
  217. package/dist/esm2022/lib/methods/stream-methods/click-screen-share.service.mjs +0 -178
  218. package/dist/esm2022/lib/methods/stream-methods/click-video.service.mjs +0 -271
  219. package/dist/esm2022/lib/methods/stream-methods/switch-audio.service.mjs +0 -80
  220. package/dist/esm2022/lib/methods/stream-methods/switch-video-alt.service.mjs +0 -116
  221. package/dist/esm2022/lib/methods/stream-methods/switch-video.service.mjs +0 -132
  222. package/dist/esm2022/lib/methods/utils/format-number.service.mjs +0 -57
  223. package/dist/esm2022/lib/methods/utils/generate-random-messages.service.mjs +0 -120
  224. package/dist/esm2022/lib/methods/utils/generate-random-participants.service.mjs +0 -126
  225. package/dist/esm2022/lib/methods/utils/generate-random-polls.service.mjs +0 -78
  226. package/dist/esm2022/lib/methods/utils/generate-random-request-list.service.mjs +0 -90
  227. package/dist/esm2022/lib/methods/utils/generate-random-waiting-room-list.service.mjs +0 -59
  228. package/dist/esm2022/lib/methods/utils/get-modal-position.util.mjs +0 -32
  229. package/dist/esm2022/lib/methods/utils/get-overlay-position.util.mjs +0 -31
  230. package/dist/esm2022/lib/methods/utils/initial-values.util.mjs +0 -379
  231. package/dist/esm2022/lib/methods/utils/meeting-timer/start-meeting-progress-timer.service.mjs +0 -96
  232. package/dist/esm2022/lib/methods/utils/mini-audio-player/mini-audio-player.component.mjs +0 -315
  233. package/dist/esm2022/lib/methods/utils/producer/a-params.service.mjs +0 -58
  234. package/dist/esm2022/lib/methods/utils/producer/h-params.service.mjs +0 -87
  235. package/dist/esm2022/lib/methods/utils/producer/screen-params.service.mjs +0 -61
  236. package/dist/esm2022/lib/methods/utils/producer/v-params.service.mjs +0 -87
  237. package/dist/esm2022/lib/methods/utils/producer/video-capture-constraints.service.mjs +0 -84
  238. package/dist/esm2022/lib/methods/utils/sleep.util.mjs +0 -17
  239. package/dist/esm2022/lib/methods/utils/sound-player.service.mjs +0 -63
  240. package/dist/esm2022/lib/methods/utils/validate-alphanumeric.service.mjs +0 -49
  241. package/dist/esm2022/lib/methods/waiting-methods/launch-waiting.service.mjs +0 -41
  242. package/dist/esm2022/lib/methods/waiting-methods/respond-to-waiting.service.mjs +0 -69
  243. package/dist/esm2022/lib/methods/whiteboard-methods/capture-canvas-stream.service.mjs +0 -98
  244. package/dist/esm2022/lib/methods/whiteboard-methods/launch-configure-whiteboard.service.mjs +0 -44
  245. package/dist/esm2022/lib/producer-client/producer-client-emits/create-device-client.service.mjs +0 -74
  246. package/dist/esm2022/lib/producer-client/producer-client-emits/join-room-client.service.mjs +0 -96
  247. package/dist/esm2022/lib/producer-client/producer-client-emits/update-room-parameters-client.service.mjs +0 -276
  248. package/dist/esm2022/lib/producers/producer-emits/join-con-room.service.mjs +0 -152
  249. package/dist/esm2022/lib/producers/producer-emits/join-room.service.mjs +0 -152
  250. package/dist/esm2022/lib/producers/socket-receive-methods/all-members-rest.service.mjs +0 -228
  251. package/dist/esm2022/lib/producers/socket-receive-methods/all-members.service.mjs +0 -218
  252. package/dist/esm2022/lib/producers/socket-receive-methods/all-waiting-room-members.service.mjs +0 -57
  253. package/dist/esm2022/lib/producers/socket-receive-methods/ban-participant.service.mjs +0 -76
  254. package/dist/esm2022/lib/producers/socket-receive-methods/control-media-host.service.mjs +0 -183
  255. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect-user-self.service.mjs +0 -50
  256. package/dist/esm2022/lib/producers/socket-receive-methods/disconnect.service.mjs +0 -64
  257. package/dist/esm2022/lib/producers/socket-receive-methods/get-domains.service.mjs +0 -78
  258. package/dist/esm2022/lib/producers/socket-receive-methods/host-request-response.service.mjs +0 -150
  259. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-ended.service.mjs +0 -73
  260. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-still-there.service.mjs +0 -47
  261. package/dist/esm2022/lib/producers/socket-receive-methods/meeting-time-remaining.service.mjs +0 -63
  262. package/dist/esm2022/lib/producers/socket-receive-methods/participant-requested.service.mjs +0 -63
  263. package/dist/esm2022/lib/producers/socket-receive-methods/person-joined.service.mjs +0 -54
  264. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-closed.service.mjs +0 -129
  265. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-paused.service.mjs +0 -152
  266. package/dist/esm2022/lib/producers/socket-receive-methods/producer-media-resumed.service.mjs +0 -99
  267. package/dist/esm2022/lib/producers/socket-receive-methods/re-initiate-recording.service.mjs +0 -67
  268. package/dist/esm2022/lib/producers/socket-receive-methods/receive-message.service.mjs +0 -134
  269. package/dist/esm2022/lib/producers/socket-receive-methods/recording-notice.service.mjs +0 -233
  270. package/dist/esm2022/lib/producers/socket-receive-methods/room-record-params.service.mjs +0 -121
  271. package/dist/esm2022/lib/producers/socket-receive-methods/screen-producer-id.service.mjs +0 -86
  272. package/dist/esm2022/lib/producers/socket-receive-methods/start-records.service.mjs +0 -60
  273. package/dist/esm2022/lib/producers/socket-receive-methods/stopped-recording.service.mjs +0 -62
  274. package/dist/esm2022/lib/producers/socket-receive-methods/time-left-recording.service.mjs +0 -57
  275. package/dist/esm2022/lib/producers/socket-receive-methods/update-consuming-domains.service.mjs +0 -105
  276. package/dist/esm2022/lib/producers/socket-receive-methods/update-media-settings.service.mjs +0 -66
  277. package/dist/esm2022/lib/producers/socket-receive-methods/updated-co-host.service.mjs +0 -96
  278. package/dist/esm2022/lib/producers/socket-receive-methods/user-waiting.service.mjs +0 -52
  279. package/dist/esm2022/lib/sockets/socket-manager.service.mjs +0 -113
  280. package/dist/esm2022/mediasfu-angular.mjs +0 -5
  281. 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
- <div style="background-color:#f0f0f0; padding: 10px; border-radius: 5px;">
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
- import { HttpClient, HttpHeaders } from '@angular/common/http';
274
- import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
275
- import { CookieService } from 'ngx-cookie-service';
276
- import { CommonModule } from '@angular/common';
277
- import { Socket } from 'socket.io-client';
278
- import { ConnectSocketType } from '../../../sockets/socket-manager.service';
279
- import { ShowAlert } from '../../../@types/types';
280
-
281
- export interface PreJoinPageParameters {
282
- imgSrc?: string;
283
- showAlert?: ShowAlert;
284
- updateIsLoadingModalVisible: (visible: boolean) => void;
285
- connectSocket: ConnectSocketType;
286
- updateSocket: (socket: Socket) => void;
287
- updateValidated: (validated: boolean) => void;
288
- updateApiUserName: (userName: string) => void;
289
- updateApiToken: (token: string) => void;
290
- updateLink: (link: string) => void;
291
- updateRoomName: (roomName: string) => void;
292
- updateMember: (member: string) => void;
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
- export interface Credentials {
296
- apiUserName: string;
297
- apiKey: string;
298
- }
314
+ export interface JoinLocalEventRoomOptions {
315
+ joinData: JoinLocalEventRoomParameters;
316
+ link?: string;
317
+ }
299
318
 
300
- export interface PreJoinPageOptions {
301
- parameters: PreJoinPageParameters;
302
- credentials?: Credentials;
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
- export interface CreateJoinRoomResponse {
306
- message: string;
307
- roomName: string;
308
- secureCode?: string;
309
- publicURL: string;
310
- link: string;
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
- export interface CreateJoinRoomError {
316
- error: string;
317
- success?: boolean;
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
- export type CreateJoinRoomType = (options: {
321
- payload: any;
322
- apiUserName: string;
323
- apiKey: string;
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
368
+ export interface PreJoinPageOptions {
369
+ localLink?: string;
370
+ connectMediaSFU?: boolean;
371
+ parameters: PreJoinPageParameters;
372
+ credentials?: Credentials;
373
+ }
343
374
 
344
- /**
345
- * @fileoverview PreJoinPage component for handling room creation and joining on MediaSFU.
346
- *
347
- * @component
348
- * @selector app-pre-join-page
349
- * @standalone true
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
- }
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
- toggleMode() {
437
- this.isCreateMode = !this.isCreateMode;
438
- this.error = '';
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
- async handleCreateRoom() {
442
- if (this.preJoinForm.invalid) {
443
- this.error = 'Please fill all the fields.';
444
- return;
445
- }
458
+ isCreateMode = false;
459
+ preJoinForm: FormGroup;
460
+ error = '';
446
461
 
447
- const { name, duration, eventType, capacity } = this.preJoinForm.value;
462
+ imgSrc: string = this.parameters.imgSrc || '';
448
463
 
449
- if (!name || !duration || !eventType || !capacity) {
450
- this.error = 'Please fill all the fields.';
451
- return;
452
- }
464
+ localConnected = false;
465
+ localData: ResponseLocalConnectionData | undefined = undefined;
466
+ initSocket: Socket | undefined = undefined;
453
467
 
454
- const payload = {
455
- action: 'create',
456
- duration: parseInt(duration),
457
- capacity: parseInt(capacity),
458
- eventType,
459
- userName: name,
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
- this.parameters.updateIsLoadingModalVisible(true);
490
+ }
463
491
 
464
- try {
465
- const response = await this.createRoomOnMediaSFU({
466
- payload,
467
- apiUserName: this.credentials.apiUserName,
468
- apiKey: this.credentials.apiKey,
469
- });
492
+ ngOnInit(): void {
493
+ if (this.localLink && !this.localConnected && !this.initSocket) {
494
+ this.connectLocalSocket();
495
+ }
496
+ }
470
497
 
471
- if (response.success && response.data && 'roomName' in response.data) {
472
- await this.checkLimitsAndMakeRequest({
473
- apiUserName: response.data.roomName,
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}`;
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
- async handleJoinRoom() {
492
- if (this.preJoinForm.invalid) {
493
- this.error = 'Please fill all the fields.';
494
- return;
495
- }
515
+ toggleMode(): void {
516
+ this.isCreateMode = !this.isCreateMode;
517
+ this.error = '';
518
+ }
496
519
 
497
- const { name, eventID } = this.preJoinForm.value;
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
- if (!name || !eventID) {
500
- this.error = 'Please fill all the fields.';
501
- return;
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
- const payload = {
505
- action: 'join',
506
- meetingID: eventID,
507
- userName: name,
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
- this.parameters.updateIsLoadingModalVisible(true);
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
- try {
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
- if (response.success && response.data && 'roomName' in response.data) {
520
- await this.checkLimitsAndMakeRequest({
521
- apiUserName: response.data.roomName,
522
- apiToken: response.data.secret,
523
- link: response.data.link,
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
- async checkLimitsAndMakeRequest({
540
- apiUserName,
541
- apiToken,
542
- link,
543
- apiKey = '',
544
- userName,
545
- }: {
546
- apiUserName: string;
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
- try {
572
- this.parameters.updateIsLoadingModalVisible(true);
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
- const socketPromise = await this.parameters.connectSocket({
575
- apiUserName,
576
- apiKey,
577
- apiToken,
578
- link,
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
- const timeoutPromise = new Promise((_, reject) =>
582
- setTimeout(() => reject(new Error('Request timed out')), TIMEOUT_DURATION),
583
- );
584
-
585
- const socket = await Promise.race([socketPromise, timeoutPromise]);
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
- if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
605
- this.parameters.showAlert?.({
606
- message: 'Too many unsuccessful attempts. Please try again later.',
607
- type: 'danger',
608
- duration: 3000,
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
- } catch (error) {
619
- this.parameters.showAlert?.({
620
- message: 'Unable to connect. Check your credentials and try again.',
621
- type: 'danger',
622
- duration: 3000,
623
- });
624
-
625
- unsuccessfulAttempts += 1;
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
- async createRoomOnMediaSFU({
633
- payload,
634
- apiUserName,
635
- apiKey,
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
- const response = await this.http
654
- .post<any>('https://mediasfu.com/v1/rooms/', payload, {
655
- headers: new HttpHeaders({
656
- 'Content-Type': 'application/json',
657
- Authorization: `Bearer ${apiUserName}:${apiKey}`,
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
- async joinRoomOnMediaSFU({
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
- const response = await this.http
694
- .post<any>('https://mediasfu.com/v1/rooms/', payload, {
695
- headers: new HttpHeaders({
696
- 'Content-Type': 'application/json',
697
- Authorization: `Bearer ${apiUserName}:${apiKey}`,
698
- }),
699
- })
700
- .toPromise();
701
-
702
- return { data: response, success: true };
703
- } catch (error) {
704
- const errorMessage = (error as any).reason ? (error as any).reason : 'unknown error';
705
- return {
706
- data: { error: `Unable to join room; something went wrong ${errorMessage}` },
707
- success: false,
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
- standalone: true,
849
- imports: [
850
- MediasfuGeneric,
851
- MediasfuBroadcast,
852
- MediasfuChat,
853
- MediasfuWebinar,
854
- MediasfuConference,
855
- PreJoinPage,
856
- ],
913
+ imports: [MediasfuWebinar],
857
914
  template: `
858
- <app-mediasfu-generic [PrejoinPage]="PreJoinPage" [credentials]="credentials"></app-mediasfu-generic>
859
-
860
- <!--
861
- Welcome to the Mediasfu Angular Application!
862
-
863
- Below are different use cases you can run. Uncomment the one you want to try.
864
-
865
- 1. Simple Use Case (Welcome Page)
866
- - Renders the default welcome page.
867
- - No additional inputs required.
868
-
869
- <app-mediasfu-generic></app-mediasfu-generic>
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
- // Reference to the PreJoinPage component
983
- PreJoinPage = PreJoinPage;
931
+ // ========================
932
+ // ====== CONFIGURATION ======
933
+ // ========================
984
934
 
985
- // Mediasfu account credentials
986
- // Replace 'your_api_username' and 'your_api_key' with your actual credentials
987
- // Only if you are using the PreJoinPage component
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
- // Whether to use seed data for generating random participants and messages
994
- // Set to true if you want to run the application in local UI mode with seed data
995
- useSeed = false;
996
- seedData: any = {};
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
- // Whether to use local UI mode (prevents requests to Mediasfu servers)
1003
- // Automatically set to true if 'useSeed' is true
1004
- useLocalUIMode: boolean = false;
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
- // Inject the services in the constructor
1007
- constructor(
1008
- private generateRandomParticipants: GenerateRandomParticipants,
1009
- private generateRandomMessages: GenerateRandomMessages,
1010
- private generateRandomRequestList: GenerateRandomRequestList,
1011
- private generateRandomWaitingRoomList: GenerateRandomWaitingRoomList
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 = 'Prince';
980
+ const memberName = 'Alice';
1018
981
  const hostName = 'Fred';
1019
982
 
1020
983
  // Generate random participants
1021
- const participants_ =
1022
- this.generateRandomParticipants.generateRandomParticipants({
1023
- member: memberName,
1024
- coHost: '',
1025
- host: hostName,
1026
- forChatBroadcast:
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
- this.generateRandomRequestList.generateRandomRequestList({
1042
- participants: participants_,
1043
- hostName: memberName,
1044
- coHostName: '',
1045
- numberOfRequests: 3,
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.