mediasfu-angular
Version:
mediasfu-angular - Angular 17/18/19 WebRTC SDK for video conferencing, webinars, broadcasts, live streaming, chat, recording, whiteboard, and AI agents. Prebuilt rooms and fully custom UIs.
1 lines • 5.44 MB
Source Map (JSON)
{"version":3,"file":"mediasfu-angular.mjs","sources":["../../src/lib/consumers/socket-receive-methods/join-consume-room.service.ts","../../src/lib/consumers/socket-receive-methods/producer-closed.service.ts","../../src/lib/consumers/socket-receive-methods/new-pipe-producer.service.ts","../../src/lib/components/display-components/mini-card/mini-card.component.ts","../../src/lib/components/display-components/card-video-display/card-video-display.component.ts","../../src/lib/components/display-components/card-video-display/card-video-display.component.html","../../src/lib/components/display-components/subtitle-overlay/subtitle-overlay.component.ts","../../src/lib/methods/utils/get-overlay-position.util.ts","../../src/lib/producers/socket-receive-methods/translation-receive-methods.service.ts","../../src/lib/consumers/control-media.service.ts","../../src/lib/services/live-subtitle.service.ts","../../src/lib/components/display-components/video-card/video-card.component.ts","../../src/lib/components/display-components/video-card/video-card.component.html","../../src/lib/modern/display-components/modern-mini-card.component.ts","../../src/lib/components/display-components/audio-card/audio-card.component.ts","../../src/lib/components/display-components/audio-card/audio-card.component.html","../../src/lib/consumers/add-videos-grid.service.ts","../../src/lib/consumers/auto-adjust.service.ts","../../src/lib/consumers/calculate-rows-and-columns.service.ts","../../src/lib/consumers/change-vids.service.ts","../../src/lib/consumers/check-grid.service.ts","../../src/lib/consumers/check-permission.service.ts","../../src/lib/consumers/check-screen-share.service.ts","../../src/lib/consumers/close-and-resize.service.ts","../../src/lib/consumers/compare-active-names.service.ts","../../src/lib/consumers/compare-screen-states.service.ts","../../src/lib/consumers/connect-ips.service.ts","../../src/lib/consumers/connect-local-ips.service.ts","../../src/lib/consumers/connect-recv-transport.service.ts","../../src/lib/consumers/connect-send-transport.service.ts","../../src/lib/consumers/connect-send-transport-audio.service.ts","../../src/lib/consumers/connect-send-transport-screen.service.ts","../../src/lib/consumers/connect-send-transport-video.service.ts","../../src/lib/components/display-components/mini-audio/mini-audio.component.ts","../../src/lib/methods/utils/mini-audio-player/mini-audio-player.component.ts","../../src/lib/methods/utils/mini-audio-player/mini-audio-player.component.html","../../src/lib/consumers/consumer-resume.service.ts","../../src/lib/consumers/create-send-transport.service.ts","../../src/lib/consumers/disconnect-send-transport-audio.service.ts","../../src/lib/consumers/disconnect-send-transport-video.service.ts","../../src/lib/consumers/disconnect-send-transport-screen.service.ts","../../src/lib/consumers/disp-streams.service.ts","../../src/lib/consumers/generate-page-content.service.ts","../../src/lib/consumers/get-estimate.service.ts","../../src/lib/consumers/get-piped-producers-alt.service.ts","../../src/lib/consumers/get-producers-piped.service.ts","../../src/lib/consumers/get-videos.service.ts","../../src/lib/consumers/mix-streams.service.ts","../../src/lib/consumers/on-screen-changes.service.ts","../../src/lib/consumers/prepopulate-user-media.service.ts","../../src/lib/consumers/process-consumer-transports.service.ts","../../src/lib/consumers/process-consumer-transports-audio.service.ts","../../src/lib/consumers/readjust.service.ts","../../src/lib/consumers/receive-all-piped-transports.service.ts","../../src/lib/consumers/reorder-streams.service.ts","../../src/lib/consumers/re-port.service.ts","../../src/lib/consumers/request-screen-share.service.ts","../../src/lib/consumers/resume-pause-audio-streams.service.ts","../../src/lib/consumers/resume-pause-streams.service.ts","../../src/lib/consumers/resume-send-transport-audio.service.ts","../../src/lib/consumers/re-update-inter.service.ts","../../src/lib/consumers/signal-new-consumer-transport.service.ts","../../src/lib/consumers/start-share-screen.service.ts","../../src/lib/consumers/stop-share-screen.service.ts","../../src/lib/consumers/stream-success-audio.service.ts","../../src/lib/consumers/stream-success-audio-switch.service.ts","../../src/lib/consumers/stream-success-screen.service.ts","../../src/lib/consumers/stream-success-video.service.ts","../../src/lib/consumers/switch-user-audio.service.ts","../../src/lib/methods/stream-methods/click-video.service.ts","../../src/lib/consumers/switch-user-video.service.ts","../../src/lib/consumers/switch-user-video-alt.service.ts","../../src/lib/consumers/trigger.service.ts","../../src/lib/consumers/update-mini-cards-grid.service.ts","../../src/lib/consumers/update-participant-audio-decibels.service.ts","../../src/lib/methods/utils/producer/a-params.service.ts","../../src/lib/methods/utils/producer/h-params.service.ts","../../src/lib/methods/utils/producer/screen-params.service.ts","../../src/lib/methods/utils/producer/v-params.service.ts","../../src/lib/methods/background-methods/launch-background.service.ts","../../src/lib/methods/breakout-room-methods/launch-breakout-rooms.service.ts","../../src/lib/methods/breakout-room-methods/breakout-room-updated.service.ts","../../src/lib/methods/co-host-methods/launch-co-host.service.ts","../../src/lib/methods/co-host-methods/modify-co-host-settings.service.ts","../../src/lib/methods/display-settings-methods/launch-display-settings.service.ts","../../src/lib/methods/display-settings-methods/modify-display-settings.service.ts","../../src/lib/methods/exit-methods/launch-confirm-exit.service.ts","../../src/lib/methods/exit-methods/confirm-exit.service.ts","../../src/lib/methods/media-settings-methods/launch-media-settings.service.ts","../../src/lib/methods/menu-methods/launch-menu-modal.service.ts","../../src/lib/methods/message-methods/launch-messages.service.ts","../../src/lib/methods/message-methods/send-message.service.ts","../../src/lib/methods/participants-methods/launch-participants.service.ts","../../src/lib/methods/participants-methods/message-participants.service.ts","../../src/lib/methods/participants-methods/mute-participants.service.ts","../../src/lib/methods/participants-methods/remove-participants.service.ts","../../src/lib/methods/polls-methods/handle-create-poll.service.ts","../../src/lib/methods/polls-methods/handle-end-poll.service.ts","../../src/lib/methods/polls-methods/handle-vote-poll.service.ts","../../src/lib/methods/polls-methods/launch-poll.service.ts","../../src/lib/methods/polls-methods/poll-updated.service.ts","../../src/lib/methods/recording-methods/check-pause-state.service.ts","../../src/lib/methods/recording-methods/check-resume-state.service.ts","../../src/lib/methods/recording-methods/confirm-recording.service.ts","../../src/lib/methods/recording-methods/launch-recording.service.ts","../../src/lib/methods/recording-methods/record-pause-timer.service.ts","../../src/lib/methods/recording-methods/record-resume-timer.service.ts","../../src/lib/methods/recording-methods/record-start-timer.service.ts","../../src/lib/methods/recording-methods/record-update-timer.service.ts","../../src/lib/methods/recording-methods/start-recording.service.ts","../../src/lib/methods/recording-methods/stop-recording.service.ts","../../src/lib/methods/recording-methods/update-recording.service.ts","../../src/lib/methods/requests-methods/launch-requests.service.ts","../../src/lib/methods/requests-methods/respond-to-requests.service.ts","../../src/lib/methods/settings-methods/launch-settings.service.ts","../../src/lib/methods/settings-methods/modify-settings.service.ts","../../src/lib/methods/stream-methods/click-audio.service.ts","../../src/lib/methods/stream-methods/click-chat.service.ts","../../src/lib/methods/stream-methods/click-screen-share.service.ts","../../src/lib/methods/stream-methods/switch-audio.service.ts","../../src/lib/methods/stream-methods/switch-video.service.ts","../../src/lib/methods/stream-methods/switch-video-alt.service.ts","../../src/lib/methods/utils/join-room-on-media-sfu.service.ts","../../src/lib/methods/utils/meeting-timer/start-meeting-progress-timer.service.ts","../../src/lib/methods/utils/format-number.service.ts","../../src/lib/methods/utils/generate-random-messages.service.ts","../../src/lib/methods/utils/generate-random-participants.service.ts","../../src/lib/methods/utils/generate-random-polls.service.ts","../../src/lib/methods/utils/generate-random-request-list.service.ts","../../src/lib/methods/utils/generate-random-waiting-room-list.service.ts","../../src/lib/methods/utils/get-modal-position.util.ts","../../src/lib/methods/utils/sleep.util.ts","../../src/lib/methods/utils/validate-alphanumeric.service.ts","../../src/lib/methods/waiting-methods/launch-waiting.service.ts","../../src/lib/methods/waiting-methods/respond-to-waiting.service.ts","../../src/lib/methods/whiteboard-methods/launch-configure-whiteboard.service.ts","../../src/lib/methods/whiteboard-methods/capture-canvas-stream.service.ts","../../src/lib/producer-client/producer-client-emits/create-device-client.service.ts","../../src/lib/producer-client/producer-client-emits/join-room-client.service.ts","../../src/lib/producer-client/producer-client-emits/update-room-parameters-client.service.ts","../../src/lib/producers/producer-emits/join-con-room.service.ts","../../src/lib/producers/producer-emits/join-room.service.ts","../../src/lib/producers/producer-emits/join-local-room.service.ts","../../src/lib/producers/socket-receive-methods/all-members.service.ts","../../src/lib/producers/socket-receive-methods/all-members-rest.service.ts","../../src/lib/producers/socket-receive-methods/all-waiting-room-members.service.ts","../../src/lib/producers/socket-receive-methods/ban-participant.service.ts","../../src/lib/producers/socket-receive-methods/control-media-host.service.ts","../../src/lib/producers/socket-receive-methods/disconnect.service.ts","../../src/lib/producers/socket-receive-methods/disconnect-user-self.service.ts","../../src/lib/producers/socket-receive-methods/get-domains.service.ts","../../src/lib/producers/socket-receive-methods/host-request-response.service.ts","../../src/lib/producers/socket-receive-methods/meeting-ended.service.ts","../../src/lib/producers/socket-receive-methods/meeting-still-there.service.ts","../../src/lib/producers/socket-receive-methods/meeting-time-remaining.service.ts","../../src/lib/producers/socket-receive-methods/participant-requested.service.ts","../../src/lib/producers/socket-receive-methods/person-joined.service.ts","../../src/lib/producers/socket-receive-methods/producer-media-closed.service.ts","../../src/lib/producers/socket-receive-methods/producer-media-paused.service.ts","../../src/lib/producers/socket-receive-methods/producer-media-resumed.service.ts","../../src/lib/producers/socket-receive-methods/re-initiate-recording.service.ts","../../src/lib/producers/socket-receive-methods/receive-message.service.ts","../../src/lib/producers/socket-receive-methods/recording-notice.service.ts","../../src/lib/producers/socket-receive-methods/room-record-params.service.ts","../../src/lib/producers/socket-receive-methods/screen-producer-id.service.ts","../../src/lib/producers/socket-receive-methods/start-records.service.ts","../../src/lib/producers/socket-receive-methods/stopped-recording.service.ts","../../src/lib/producers/socket-receive-methods/time-left-recording.service.ts","../../src/lib/producers/socket-receive-methods/update-consuming-domains.service.ts","../../src/lib/producers/socket-receive-methods/update-media-settings.service.ts","../../src/lib/producers/socket-receive-methods/updated-co-host.service.ts","../../src/lib/producers/socket-receive-methods/user-waiting.service.ts","../../src/lib/sockets/socket-manager.service.ts","../../src/lib/modern/utils/render-mode.utils.ts","../../src/lib/components/background-components/background-modal/background-modal.component.ts","../../src/lib/components/background-components/background-modal/background-modal.component.html","../../src/lib/components/breakout-components/room-list/room-list.component.ts","../../src/lib/components/breakout-components/room-list/room-list.component.html","../../src/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.ts","../../src/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.html","../../src/lib/components/breakout-components/breakout-rooms-modal.component.ts","../../src/lib/components/breakout-components/breakout-rooms-modal.component.html","../../src/lib/components/co-host-components/co-host-modal/co-host-modal.component.ts","../../src/lib/components/co-host-components/co-host-modal/co-host-modal.component.html","../../src/lib/components/display-components/alert-component/alert.component.component.ts","../../src/lib/components/display-components/alert-component/alert.component.component.html","../../src/lib/components/display-components/audio-grid/audio-grid.component.ts","../../src/lib/components/display-components/control-buttons-component/control-buttons-component.component.ts","../../src/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.ts","../../src/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.html","../../src/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.ts","../../src/lib/components/display-components/flexible-grid/flexible-grid.component.ts","../../src/lib/components/screenboard-components/screenboard/canvas-coordinates.util.ts","../../src/lib/components/display-components/flexible-video/flexible-video.component.ts","../../src/lib/components/display-components/loading-modal/loading-modal.component.ts","../../src/lib/components/display-components/main-aspect-component/main-aspect-component.component.ts","../../src/lib/components/display-components/main-container-component/main-container-component.component.ts","../../src/lib/modern/display-components/modern-meeting-progress-timer.component.ts","../../src/lib/components/display-components/main-grid-component/main-grid-component.component.ts","../../src/lib/components/display-components/main-screen-component/main-screen-component.component.ts","../../src/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.ts","../../src/lib/components/display-components/mini-card-audio/mini-card-audio.component.ts","../../src/lib/components/display-components/other-grid-component/other-grid-component.component.ts","../../src/lib/components/display-components/pagination/pagination.component.ts","../../src/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.ts","../../src/lib/components/display-settings-components/display-settings-modal.component.ts","../../src/lib/components/display-settings-components/display-settings-modal.component.html","../../src/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.ts","../../src/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.html","../../src/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.ts","../../src/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.html","../../src/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.ts","../../src/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.html","../../src/lib/components/menu-components/custom-buttons/custom-buttons.component.ts","../../src/lib/components/menu-components/custom-buttons/custom-buttons.component.html","../../src/lib/components/menu-components/meeting-id-component/meeting-id-component.component.ts","../../src/lib/components/menu-components/meeting-id-component/meeting-id-component.component.html","../../src/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.ts","../../src/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.html","../../src/lib/components/menu-components/share-buttons-component/share-buttons-component.component.ts","../../src/lib/components/menu-components/share-buttons-component/share-buttons-component.component.html","../../src/lib/components/menu-components/menu-modal/menu-modal.component.ts","../../src/lib/components/menu-components/menu-modal/menu-modal.component.html","../../src/lib/components/message-components/message-panel/message-panel.component.ts","../../src/lib/components/message-components/message-panel/message-panel.component.html","../../src/lib/components/message-components/messages-modal/messages-modal.component.ts","../../src/lib/components/message-components/messages-modal/messages-modal.component.html","../../src/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.ts","../../src/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.html","../../src/lib/modern/primitives/modern-button.component.ts","../../src/lib/modern/primitives/modern-field.component.ts","../../src/lib/modern/primitives/modern-surface.component.ts","../../src/lib/modern/primitives/modern-entry-shell.component.ts","../../src/lib/methods/utils/check-limits-and-make-request.service.ts","../../src/lib/methods/utils/create-room-on-media-sfu.service.ts","../../src/lib/components/misc-components/pre-join-page/pre-join-page.component.ts","../../src/lib/components/misc-components/pre-join-page/pre-join-page.component.html","../../src/lib/components/misc-components/share-event-modal/share-event-modal.component.ts","../../src/lib/components/misc-components/share-event-modal/share-event-modal.component.html","../../src/lib/components/misc-components/welcome-page/welcome-page.component.ts","../../src/lib/components/misc-components/welcome-page/welcome-page.component.html","../../src/lib/methods/utils/translation-languages.util.ts","../../src/lib/components/translation-components/translation-settings-modal/translation-settings-modal.component.ts","../../src/lib/components/translation-components/translation-settings-modal/translation-settings-modal.component.html","../../src/lib/components/participants-components/participant-list-item/participant-list-item.component.ts","../../src/lib/components/participants-components/participant-list-item/participant-list-item.component.html","../../src/lib/components/participants-components/participant-list/participant-list.component.ts","../../src/lib/components/participants-components/participant-list/participant-list.component.html","../../src/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.ts","../../src/lib/components/participants-components/participant-list-others-item/participant-list-others-item.component.html","../../src/lib/components/participants-components/participant-list-others/participant-list-others.component.ts","../../src/lib/components/participants-components/participant-list-others/participant-list-others.component.html","../../src/lib/components/participants-components/participants-modal/participants-modal.component.ts","../../src/lib/components/participants-components/participants-modal/participants-modal.component.html","../../src/lib/components/polls-components/poll-modal/poll-modal.component.ts","../../src/lib/components/polls-components/poll-modal/poll-modal.component.html","../../src/lib/components/recording-components/standard-panel-component/standard-panel-component.component.ts","../../src/lib/components/recording-components/standard-panel-component/standard-panel-component.component.html","../../src/lib/components/recording-components/advanced-panel-component/advanced-panel-components.component.ts","../../src/lib/components/recording-components/advanced-panel-component/advanced-panel-component.component.html","../../src/lib/components/recording-components/recording-modal/recording-modal.component.ts","../../src/lib/components/recording-components/recording-modal/recording-modal.component.html","../../src/lib/components/requests-components/render-request-component/render-request-component.component.ts","../../src/lib/components/requests-components/render-request-component/render-request-component.component.html","../../src/lib/components/requests-components/requests-modal/requests-modal.component.ts","../../src/lib/components/requests-components/requests-modal/requests-modal.component.html","../../src/lib/components/screenboard-components/screenboard/screenboard.component.ts","../../src/lib/components/screenboard-components/screenboard/screenboard.component.html","../../src/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.ts","../../src/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.html","../../src/lib/components/waiting-components/waiting-room-modal.component.ts","../../src/lib/components/waiting-components/waiting-room-modal.component.html","../../src/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.ts","../../src/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.html","../../src/lib/components/whiteboard-components/whiteboard/whiteboard.component.ts","../../src/lib/components/whiteboard-components/whiteboard/whiteboard.component.html","../../src/lib/@types/custom-component.types.ts","../../src/lib/methods/panelists-methods/add-panelist.service.ts","../../src/lib/methods/panelists-methods/remove-panelist.service.ts","../../src/lib/methods/panelists-methods/focus-panelists.service.ts","../../src/lib/methods/permissions-methods/update-participant-permission.service.ts","../../src/lib/methods/permissions-methods/bulk-update-participant-permissions.service.ts","../../src/lib/methods/permissions-methods/update-permission-config.service.ts","../../src/lib/consumers/translation-consumer-switch.service.ts","../../src/lib/producers/socket-receive-methods/panelists-updated.service.ts","../../src/lib/producers/socket-receive-methods/panelist-focus-changed.service.ts","../../src/lib/producers/socket-receive-methods/receive-control-media.service.ts","../../src/lib/producers/socket-receive-methods/added-as-panelist.service.ts","../../src/lib/producers/socket-receive-methods/removed-from-panelists.service.ts","../../src/lib/producers/socket-receive-methods/permission-updated.service.ts","../../src/lib/producers/socket-receive-methods/permission-config-updated.service.ts","../../src/lib/@types/types.ts","../../src/lib/@types/ui-overrides.types.ts","../../src/lib/services/ui-override-resolver.service.ts","../../src/lib/directives/with-override.directive.ts","../../src/lib/methods/utils/initial-values.util.ts","../../src/lib/modern/modal-components/modern-messages-modal.component.ts","../../src/lib/modern/modal-components/modern-poll-modal.component.ts","../../src/lib/modern/modal-components/modern-recording-modal.component.ts","../../src/lib/services/custom-component-injection.service.ts","../../src/lib/consumers/receive-room-messages.service.ts","../../src/lib/modern/modal-components/modern-co-host-modal.component.ts","../../src/lib/modern/modal-components/modern-confirm-exit-modal.component.ts","../../src/lib/modern/modal-components/modern-confirm-here-modal.component.ts","../../src/lib/modern/modal-components/modern-display-settings-modal.component.ts","../../src/lib/modern/modal-components/modern-event-settings-modal.component.ts","../../src/lib/modern/modal-components/modern-media-settings-modal.component.ts","../../src/lib/modern/modal-components/modern-menu-modal.component.ts","../../src/lib/modern/modal-components/modern-participants-modal.component.ts","../../src/lib/modern/modal-components/modern-requests-modal.component.ts","../../src/lib/modern/modal-components/modern-share-event-modal.component.ts","../../src/lib/modern/modal-components/modern-waiting-room-modal.component.ts","../../src/lib/modern/display-components/modern-alert.component.ts","../../src/lib/modern/display-components/modern-loading-modal.component.ts","../../src/lib/modern/primitives/modern-sidebar-panel.component.ts","../../src/lib/modern/display-components/modern-participants-counter-badge.component.ts","../../src/lib/modern/display-components/modern-pagination.component.ts","../../src/lib/components/display-components/control-widgets/control-icon-badge-widget.component.ts","../../src/lib/components/display-components/control-widgets/menu-widget.component.ts","../../src/lib/components/display-components/control-widgets/message-widget.component.ts","../../src/lib/components/display-components/control-widgets/menu-record-widget.component.ts","../../src/lib/components/display-components/control-widgets/record-timer-widget.component.ts","../../src/lib/components/display-components/control-widgets/menu-participants-widget.component.ts","../../src/lib/components/display-components/control-widgets/screenshare-widget.component.ts","../../src/lib/methods/utils/create-response-join-room.util.ts","../../src/lib/components/mediasfu-components/mediasfu-generic.component.ts","../../src/lib/components/mediasfu-components/mediasfu-broadcast.component.ts","../../src/lib/components/mediasfu-components/mediasfu-webinar.component.ts","../../src/lib/components/mediasfu-components/mediasfu-conference.component.ts","../../src/lib/components/mediasfu-components/mediasfu-chat.component.ts","../../src/lib/methods/utils/sound-player.service.ts","../../src/lib/components/panelists-components/panelists-modal/panelists-modal.component.ts","../../src/lib/components/panelists-components/panelists-modal/panelists-modal.component.html","../../src/lib/components/permissions-components/permissions-modal/permissions-modal.component.ts","../../src/lib/components/permissions-components/permissions-modal/permissions-modal.component.html","../../src/mediasfu-angular.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Socket } from 'socket.io-client';\r\nimport {\r\n ReceiveAllPipedTransportsType,\r\n ReceiveAllPipedTransportsParameters,\r\n CreateDeviceClientType,\r\n} from '../../@types/types';\r\nimport { types } from 'mediasoup-client';\r\nimport { joinConsumeRoom as sharedJoinConsumeRoom } from 'mediasfu-shared';\r\ntype Device = types.Device;\r\ntype RtpCapabilities = types.RtpCapabilities;\r\n\r\nexport interface JoinConsumeRoomParameters extends ReceiveAllPipedTransportsParameters {\r\n roomName: string;\r\n islevel: string;\r\n member: string;\r\n device: Device | null;\r\n updateDevice: (device: Device | null) => void;\r\n receiveAllPipedTransports: ReceiveAllPipedTransportsType;\r\n createDeviceClient: CreateDeviceClientType;\r\n\r\n // mediasfu functions\r\n getUpdatedAllParams: () => JoinConsumeRoomParameters;\r\n [key: string]: any;\r\n}\r\nexport interface JoinConsumeRoomOptions {\r\n remote_sock: Socket;\r\n apiToken: string;\r\n apiUserName: string;\r\n parameters: JoinConsumeRoomParameters;\r\n}\r\n\r\ninterface JoinConsumeRoomResponse {\r\n success: boolean;\r\n rtpCapabilities?: RtpCapabilities;\r\n}\r\n\r\n// Export the type definition for the function\r\nexport type JoinConsumeRoomType = (\r\n options: JoinConsumeRoomOptions,\r\n) => Promise<JoinConsumeRoomResponse>;\r\n\r\n\r\n/**\r\n * @service JoinConsumeRoom\r\n * @description Service to join a media consumption room, setup device, and manage piped transports.\r\n *\r\n * @method joinConsumeRoom\r\n * Joins a consumption room by sending a request to the server and performing necessary device and transport setup.\r\n *\r\n * @param {JoinConsumeRoomOptions} options - Options for joining the consumption room.\r\n * @param {Socket} options.remote_sock - The remote socket used for joining the room.\r\n * @param {string} options.apiToken - API token for authentication.\r\n * @param {string} options.apiUserName - API username for authentication.\r\n * @param {JoinConsumeRoomParameters} options.parameters - Parameters required for the function.\r\n *\r\n * @returns {Promise<JoinConsumeRoomResponse>} A promise that resolves with the result of the join request.\r\n *\r\n * @example\r\n * ```typescript\r\n * const joinConsumeRoomResponse = await joinConsumeRoomService.joinConsumeRoom({\r\n * remote_sock: mySocket,\r\n * apiToken: 'apiToken123',\r\n * apiUserName: 'myUser',\r\n * parameters: {\r\n * roomName: 'room1',\r\n * islevel: '2',\r\n * member: 'JohnDoe',\r\n * device: null,\r\n * updateDevice: updateDeviceFunction,\r\n * receiveAllPipedTransports: receiveAllPipedTransportsFunction,\r\n * createDeviceClient: createDeviceClientFunction,\r\n * }\r\n * });\r\n * ```\r\n */\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class JoinConsumeRoom {\r\n async joinConsumeRoom({\r\n remote_sock,\r\n apiToken,\r\n apiUserName,\r\n parameters,\r\n }: JoinConsumeRoomOptions): Promise<JoinConsumeRoomResponse> {\r\n return sharedJoinConsumeRoom({\r\n remote_sock,\r\n apiToken,\r\n apiUserName,\r\n parameters,\r\n } as unknown as Parameters<typeof sharedJoinConsumeRoom>[0]) as unknown as Promise<JoinConsumeRoomResponse>;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Transport, CloseAndResizeParameters, CloseAndResizeType } from '../../@types/types';\r\nimport { producerClosed as sharedProducerClosed } from 'mediasfu-shared';\r\n\r\nexport interface ProducerClosedParameters extends CloseAndResizeParameters {\r\n consumerTransports: Transport[];\r\n screenId?: string;\r\n updateConsumerTransports: (transports: Transport[]) => void;\r\n\r\n // mediasfu functions\r\n closeAndResize: CloseAndResizeType;\r\n getUpdatedAllParams: () => ProducerClosedParameters;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface ProducerClosedOptions {\r\n remoteProducerId: string;\r\n parameters: ProducerClosedParameters;\r\n}\r\n\r\n// Export the type definition for the function\r\nexport type ProducerClosedType = (options: ProducerClosedOptions) => Promise<void>;\r\n\r\n/**\r\n * @service ProducerClosed\r\n * @description Service to manage the closing of a producer, including resizing video elements and updating consumer transports.\r\n *\r\n * @method producerClosed\r\n * Closes a specific producer by its ID, adjusts any associated video elements, and updates the list of consumer transports.\r\n *\r\n * @param {ProducerClosedOptions} options - Options for closing the specified producer.\r\n * @param {string} options.remoteProducerId - Unique ID for the producer to close.\r\n * @param {ProducerClosedParameters} options.parameters - Parameters to configure the producer closure and related updates.\r\n *\r\n * @returns {Promise<void>} A promise that resolves when the producer has been closed and relevant updates have been made.\r\n *\r\n * @example\r\n * ```typescript\r\n * await producerClosedService.producerClosed({\r\n * remoteProducerId: 'producer123',\r\n * parameters: {\r\n * consumerTransports: currentTransports,\r\n * screenId: 'screen123',\r\n * updateConsumerTransports: updateTransportList,\r\n * closeAndResize: closeAndResizeFunction,\r\n * getUpdatedAllParams: getUpdatedParamsFunction,\r\n * }\r\n * });\r\n * ```\r\n */\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProducerClosed {\r\n async producerClosed({\r\n remoteProducerId,\r\n parameters,\r\n }: ProducerClosedOptions): Promise<void> {\r\n return sharedProducerClosed({\r\n remoteProducerId,\r\n parameters: parameters as unknown as Parameters<typeof sharedProducerClosed>[0]['parameters'],\r\n }) as Promise<void>;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Socket } from 'socket.io-client';\r\nimport {\r\n ReorderStreamsParameters,\r\n ReorderStreamsType,\r\n SignalNewConsumerTransportParameters,\r\n ConnectRecvTransportParameters,\r\n ConnectRecvTransportType,\r\n ShowAlert,\r\n} from '../../@types/types';\r\nimport { types } from 'mediasoup-client';\r\nimport { newPipeProducer as sharedNewPipeProducer } from 'mediasfu-shared';\r\ntype Device = types.Device;\r\n\r\nexport interface NewPipeProducerParameters\r\n extends ReorderStreamsParameters,\r\n SignalNewConsumerTransportParameters,\r\n ConnectRecvTransportParameters {\r\n first_round: boolean;\r\n shareScreenStarted: boolean;\r\n shared: boolean;\r\n landScaped: boolean;\r\n showAlert?: ShowAlert;\r\n isWideScreen: boolean;\r\n updateFirst_round: (firstRound: boolean) => void;\r\n updateLandScaped: (landScaped: boolean) => void;\r\n device: Device | null;\r\n consumingTransports: string[];\r\n lock_screen: boolean;\r\n updateConsumingTransports: (transports: string[]) => void;\r\n\r\n // mediasfu functions\r\n connectRecvTransport: ConnectRecvTransportType;\r\n reorderStreams: ReorderStreamsType;\r\n getUpdatedAllParams: () => NewPipeProducerParameters;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface NewPipeProducerOptions {\r\n producerId: string;\r\n islevel: string;\r\n nsock: Socket;\r\n parameters: NewPipeProducerParameters;\r\n}\r\n\r\n// Export the type definition for the function\r\nexport type NewPipeProducerType = (options: NewPipeProducerOptions) => Promise<void>;\r\n\r\n/**\r\n * @service NewPipeProducer\r\n * @description Service to manage new pipe producer events, update state, and handle screen orientation for optimal experience.\r\n *\r\n * @method newPipeProducer\r\n * Handles the setup of a new pipe producer and manages user notifications or orientation changes as needed.\r\n *\r\n * @param {NewPipeProducerOptions} options - Options for setting up a new pipe producer.\r\n * @param {string} options.producerId - Unique ID for the new producer.\r\n * @param {string} options.islevel - Level designation for the producer.\r\n * @param {Socket} options.nsock - The socket used for communication.\r\n * @param {NewPipeProducerParameters} options.parameters - Parameters to configure the new pipe producer.\r\n *\r\n * @returns {Promise<void>} A promise that completes when the new pipe producer is set up.\r\n *\r\n * @example\r\n * ```typescript\r\n * await newPipeProducerService.newPipeProducer({\r\n * producerId: 'producer123',\r\n * islevel: '2',\r\n * nsock: mySocket,\r\n * parameters: {\r\n * first_round: true,\r\n * shareScreenStarted: false,\r\n * shared: false,\r\n * landScaped: false,\r\n * showAlert: alertFunction,\r\n * isWideScreen: true,\r\n * updateFirst_round: updateFirstRoundFunction,\r\n * updateLandScaped: updateLandScapedFunction,\r\n * device: myDevice,\r\n * consumingTransports: [],\r\n * connectRecvTransport: connectRecvTransportFunction,\r\n * reorderStreams: reorderStreamsFunction,\r\n * getUpdatedAllParams: getUpdatedParamsFunction,\r\n * }\r\n * });\r\n * ```\r\n */\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NewPipeProducer {\r\n async newPipeProducer({\r\n producerId,\r\n islevel,\r\n nsock,\r\n parameters,\r\n }: NewPipeProducerOptions): Promise<void> {\r\n return sharedNewPipeProducer({\r\n producerId,\r\n islevel,\r\n nsock,\r\n parameters,\r\n } as unknown as Parameters<typeof sharedNewPipeProducer>[0]) as Promise<void>;\r\n }\r\n}\r\n","import { Component, Input, Inject, Optional, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nexport interface MiniCardOptions {\r\n initials?: string;\r\n fontSize?: number;\r\n customStyle?: Partial<CSSStyleDeclaration>;\r\n imageSource?: string;\r\n roundedImage?: boolean;\r\n imageStyle?: Partial<CSSStyleDeclaration>;\r\n}\r\n\r\nexport type MiniCardType = (options: MiniCardOptions) => HTMLElement;\r\n\r\n/**\r\n * MiniCard component displays a customizable card with an image or initials.\r\n *\r\n * @component\r\n * @selector app-mini-card\r\n * @standalone true\r\n * @imports CommonModule\r\n *\r\n * @template\r\n * ```html\r\n * <div class=\"mini-card\" [ngStyle]=\"getMergedCardStyles()\">\r\n * <div *ngIf=\"imageSource; else noImage\" class=\"image-container\">\r\n * <img [src]=\"imageSource\" alt=\"Profile\" [ngStyle]=\"getMergedImageStyles()\" />\r\n * </div>\r\n * <ng-template #noImage>\r\n * <div class=\"initials\" [ngStyle]=\"getInitialsStyle()\">{{ initials }}</div>\r\n * </ng-template>\r\n * </div>\r\n * ```\r\n *\r\n * @styleUrls ['./mini-card.component.css']\r\n *\r\n * @inputs\r\n * - `initials` (string): Initials to display if no image is provided.\r\n * - `fontSize` (number): Font size for initials text, default is 14.\r\n * - `customStyle` (CSSStyleDeclaration): Custom styles for the card.\r\n * - `imageSource` (string): Source URL for the image.\r\n * - `roundedImage` (boolean): Whether the image should be rounded, default is false.\r\n * - `imageStyle` (CSSStyleDeclaration): Custom styles for the image.\r\n *\r\n * @constructor\r\n * - Optionally accepts injected values for each input property.\r\n *\r\n * @methods\r\n * - `getMergedCardStyles()`: Returns merged styles for the card.\r\n * - `getMergedImageStyles()`: Returns merged styles for the image.\r\n * - `getInitialsStyle()`: Returns styles for the initials text.\r\n *\r\n * @example\r\n * ```html\r\n * <app-mini-card initials=\"AB\" fontSize=\"20\" [roundedImage]=\"true\" imageSource=\"/path/to/image.jpg\"></app-mini-card>\r\n * ```\r\n */\r\n\r\n@Component({\r\n selector: 'app-mini-card',\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"mini-card\" [ngStyle]=\"getMergedCardStyles()\">\r\n <div class=\"mini-card__avatar\" [ngStyle]=\"getAvatarStyle()\">\r\n <ng-container *ngIf=\"hasRenderableImage; else noImage\">\r\n <img\r\n [src]=\"imageSource\"\r\n alt=\"Profile\"\r\n class=\"mini-card__image\"\r\n [ngStyle]=\"getMergedImageStyles()\"\r\n (error)=\"handleImageError()\"\r\n />\r\n </ng-container>\r\n <ng-template #noImage>\r\n <div class=\"mini-card__initials\" [ngStyle]=\"getInitialsStyle()\">\r\n {{ resolvedInitials }}\r\n </div>\r\n </ng-template>\r\n <span class=\"mini-card__gloss\" aria-hidden=\"true\"></span>\r\n </div>\r\n </div>\r\n `,\r\n styleUrls: ['./mini-card.component.css']\r\n})\r\nexport class MiniCard implements OnChanges {\r\n @Input() initials!: string;\r\n @Input() fontSize = 14;\r\n @Input() customStyle: Partial<CSSStyleDeclaration> = {};\r\n @Input() imageSource!: string;\r\n @Input() roundedImage = true;\r\n @Input() imageStyle: Partial<CSSStyleDeclaration> = {};\r\n imageLoadFailed = false;\r\n\r\n constructor(\r\n @Optional() @Inject('initials') injectedInitials: string,\r\n @Optional() @Inject('fontSize') injectedFontSize: number,\r\n @Optional() @Inject('customStyle') injectedCustomStyle: Partial<CSSStyleDeclaration>,\r\n @Optional() @Inject('imageSource') injectedImageSource: string,\r\n @Optional() @Inject('roundedImage') injectedRoundedImage: boolean,\r\n @Optional() @Inject('imageStyle') injectedImageStyle: Partial<CSSStyleDeclaration>,\r\n ) {\r\n this.initials = injectedInitials ?? this.initials ?? '';\r\n this.fontSize = injectedFontSize ?? this.fontSize ?? 14;\r\n this.customStyle = injectedCustomStyle ?? this.customStyle ?? {};\r\n this.imageSource = injectedImageSource ?? this.imageSource ?? '';\r\n this.roundedImage = injectedRoundedImage ?? this.roundedImage ?? true;\r\n this.imageStyle = injectedImageStyle ?? this.imageStyle ?? {};\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['imageSource']) {\r\n this.imageLoadFailed = false;\r\n }\r\n }\r\n\r\n getMergedCardStyles() {\r\n return {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '100%',\r\n color: '#ffffff',\r\n fontFamily:\r\n \"var(--ms-modern-font-family, 'Segoe UI', 'Aptos', 'Trebuchet MS', sans-serif)\",\r\n overflow: 'hidden',\r\n background: 'transparent',\r\n ...this.customStyle,\r\n };\r\n }\r\n\r\n getAvatarStyle() {\r\n return {\r\n width: 'min(140px, 82%)',\r\n height: 'min(140px, 82%)',\r\n maxWidth: '82%',\r\n maxHeight: '82%',\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n position: 'relative',\r\n overflow: 'hidden',\r\n borderRadius: this.roundedImage ? '50%' : '24px',\r\n background: this.hasRenderableImage\r\n ? 'rgba(15, 23, 42, 0.18)'\r\n : 'linear-gradient(135deg, rgba(79, 70, 229, 0.92) 0%, rgba(20, 184, 166, 0.88) 55%, rgba(245, 158, 11, 0.82) 100%)',\r\n border: '1px solid rgba(255, 255, 255, 0.22)',\r\n boxShadow: '0 18px 34px rgba(15, 23, 42, 0.18)',\r\n };\r\n }\r\n\r\n getMergedImageStyles() {\r\n return {\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'cover',\r\n borderRadius: this.roundedImage ? '50%' : '24px',\r\n ...this.imageStyle,\r\n };\r\n }\r\n\r\n getInitialsStyle() {\r\n return {\r\n textAlign: 'center',\r\n 'font-size': this.getDisplayFontSize() + 'px',\r\n fontWeight: '800',\r\n letterSpacing: this.resolvedInitials.length > 4 ? '0.02em' : '0.08em',\r\n textTransform: 'none',\r\n lineHeight: '1',\r\n color: '#ffffff',\r\n textShadow: '0 2px 10px rgba(15, 23, 42, 0.22)',\r\n };\r\n }\r\n\r\n get resolvedInitials(): string {\r\n const trimmedLabel = (this.initials || '').trim();\r\n\r\n if (!trimmedLabel) {\r\n return '';\r\n }\r\n\r\n return trimmedLabel.length > 10 ? trimmedLabel.substring(0, 10) : trimmedLabel;\r\n }\r\n\r\n getDisplayFontSize(): number {\r\n if (this.resolvedInitials.length > 8) {\r\n return Math.min(this.fontSize, 12);\r\n }\r\n\r\n if (this.resolvedInitials.length > 5) {\r\n return Math.min(this.fontSize, 14);\r\n }\r\n\r\n return this.fontSize;\r\n }\r\n\r\n get hasRenderableImage(): boolean {\r\n return Boolean(this.imageSource) && !this.imageLoadFailed;\r\n }\r\n\r\n handleImageError() {\r\n this.imageLoadFailed = true;\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewChild,\r\n ElementRef,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EventType } from '../../../@types/types';\r\n\r\nexport interface CardVideoDisplayOptions {\r\n remoteProducerId: string;\r\n eventType: string;\r\n forceFullDisplay: boolean;\r\n videoStream: MediaStream | null;\r\n backgroundColor: string;\r\n doMirror?: boolean;\r\n}\r\n\r\nexport type CardVideoDisplayType = (options: CardVideoDisplayOptions) => HTMLElement;\r\n\r\n/**\r\n * CardVideoDisplay component displays a video stream with options for full display, mirroring, and background color customization.\r\n *\r\n * @selector app-card-video-display\r\n * @standalone true\r\n * @imports CommonModule\r\n *\r\n * @inputs\r\n * - `remoteProducerId` (string): Identifier for the remote producer.\r\n * - `eventType` (EventType): Type of event, such as 'webinar'. Default is 'webinar'.\r\n * - `forceFullDisplay` (boolean): Forces full video display if true. Default is false.\r\n * - `videoStream` (MediaStream | null): The media stream to display in the video element.\r\n * - `backgroundColor` (string): Background color for the video container. Default is 'transparent'.\r\n * - `doMirror` (boolean): Mirrors the video if true. Default is false.\r\n *\r\n * @methods\r\n * - `ngOnInit()`: Initializes the video stream and sets the container style on component load.\r\n * - `ngOnChanges(changes: SimpleChanges)`: Updates the video stream or container style when inputs change.\r\n * - `updateVideoStream()`: Assigns the video stream to the video element if it differs from the current stream.\r\n * - `setVideoContainerStyle()`: Sets the style of the video container based on the provided background color.\r\n * - `getBaseVideoContainerStyle()`: Returns base styles for the video container.\r\n * - `getVideoStyle()`: Returns styles for the video element, including optional mirroring and sizing.\r\n *\r\n * @example\r\n * ```html\r\n * <app-card-video-display\r\n * [remoteProducerId]=\"producerId\"\r\n * [eventType]=\"'conference'\"\r\n * [forceFullDisplay]=\"true\"\r\n * [videoStream]=\"stream\"\r\n * [backgroundColor]=\"'black'\"\r\n * [doMirror]=\"true\">\r\n * </app-card-video-display>\r\n * ```\r\n **/\r\n\r\n\r\n@Component({\r\n selector: 'app-card-video-display',\r\n imports: [CommonModule],\r\n templateUrl: './card-video-display.component.html',\r\n styleUrls: ['./card-video-display.component.css']\r\n})\r\nexport class CardVideoDisplay implements OnInit, OnChanges {\r\n @Input() remoteProducerId = '';\r\n @Input() eventType: EventType = 'webinar';\r\n @Input() forceFullDisplay = false;\r\n @Input() videoStream: MediaStream | null = null;\r\n @Input() backgroundColor = 'transparent';\r\n @Input() doMirror = false;\r\n\r\n @ViewChild('videoElement', { static: true }) videoElement!: ElementRef<HTMLVideoElement>;\r\n\r\n videoContainerStyle: any;\r\n\r\n ngOnInit() {\r\n this.updateVideoStream();\r\n this.setVideoContainerStyle();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['videoStream'] && this.videoStream) {\r\n const currentStream = changes['videoStream'].currentValue;\r\n const previousStream = changes['videoStream'].previousValue;\r\n\r\n if (\r\n !previousStream ||\r\n currentStream.id !== previousStream.id ||\r\n currentStream.active !== previousStream.active\r\n ) {\r\n this.updateVideoStream();\r\n }\r\n }\r\n\r\n if (\r\n changes['backgroundColor'] &&\r\n changes['backgroundColor'].currentValue !== changes['backgroundColor'].previousValue\r\n ) {\r\n this.setVideoContainerStyle();\r\n }\r\n }\r\n\r\n updateVideoStream() {\r\n if (this.videoElement && this.videoStream) {\r\n const videoElement = this.videoElement.nativeElement;\r\n\r\n // Update the video element's srcObject only if it has changed\r\n if (videoElement.srcObject !== this.videoStream) {\r\n videoElement.srcObject = this.videoStream;\r\n }\r\n }\r\n }\r\n\r\n setVideoContainerStyle() {\r\n this.videoContainerStyle = {\r\n ...this.getBaseVideoContainerStyle(),\r\n backgroundColor: this.backgroundColor,\r\n };\r\n }\r\n\r\n getBaseVideoContainerStyle() {\r\n return {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n width: '100%',\r\n height: '100%',\r\n backgroundColor: this.backgroundColor || 'rgba(8, 17, 32, 0.92)',\r\n borderRadius: 'inherit',\r\n overflow: 'hidden',\r\n position: 'relative',\r\n };\r\n }\r\n\r\n getVideoStyle() {\r\n const baseStyles: any = {\r\n width: '100%',\r\n height: '100%',\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n objectFit: this.forceFullDisplay ? 'cover' : 'contain',\r\n backgroundColor: this.backgroundColor || 'transparent',\r\n display: 'block',\r\n };\r\n\r\n if (this.doMirror) {\r\n baseStyles.transform = 'rotateY(180deg)';\r\n }\r\n\r\n return baseStyles;\r\n }\r\n}\r\n","<div class=\"videoContainer\" [ngStyle]=\"videoContainerStyle\">\r\n <video #videoElement autoplay muted playsinline [ngStyle]=\"getVideoStyle()\"></video>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-subtitle-overlay',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div *ngIf=\"subtitle\" class=\"subtitle-overlay\">\r\n <div class=\"subtitle-overlay__shell\">\r\n <span class=\"subtitle-overlay__text\">{{ subtitle }}</span>\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .subtitle-overlay {\r\n position: absolute;\r\n left: 10px;\r\n right: 10px;\r\n bottom: 12px;\r\n display: flex;\r\n justify-content: center;\r\n z-index: 3;\r\n pointer-events: none;\r\n }\r\n\r\n .subtitle-overlay__shell {\r\n max-width: 90%;\r\n padding: 8px 12px;\r\n background: rgba(0, 0, 0, 0.6);\r\n backdrop-filter: blur(10px);\r\n -webkit-backdrop-filter: blur(10px);\r\n border: 1px solid rgba(255, 255, 255, 0.15);\r\n border-radius: 12px;\r\n }\r\n\r\n .subtitle-overlay__text {\r\n color: #ffffff;\r\n font-size: 13px;\r\n font-weight: 500;\r\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);\r\n text-align: center;\r\n display: -webkit-box;\r\n overflow: hidden;\r\n -webkit-line-clamp: 3;\r\n -webkit-box-orient: vertical;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class SubtitleOverlayComponent {\r\n @Input() subtitle: string | null = null;\r\n}","import { getOverlayPosition as sharedGetOverlayPosition } from 'mediasfu-shared';\r\nimport { OverlayPositionStyle } from '../../@types/types';\r\n\r\nexport interface GetOverlayPositionOptions {\r\n position: string;\r\n}\r\n\r\n// Export the type definition for the function\r\nexport type GetOverlayPositionType = (options: GetOverlayPositionOptions) => OverlayPositionStyle;\r\n\r\n/**\r\n * Gets the style for positioning an overlay based on the