@3dsource/angular-unreal-module 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -0
- package/fesm2022/3dsource-angular-unreal-module.mjs +6226 -0
- package/fesm2022/3dsource-angular-unreal-module.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/clickable-overlay/clickable-overlay.component.d.ts +14 -0
- package/lib/components/freeze-frame/freeze-frame.component.d.ts +8 -0
- package/lib/components/index.d.ts +12 -0
- package/lib/components/low-bandwidth-indicator/DataFlowConstants.d.ts +66 -0
- package/lib/components/low-bandwidth-indicator/filter-settings/filter-settings.component.d.ts +37 -0
- package/lib/components/low-bandwidth-indicator/index.d.ts +2 -0
- package/lib/components/low-bandwidth-indicator/low-bandwidth-detector.component.d.ts +38 -0
- package/lib/components/low-bandwidth-modal/low-bandwidth-modal.component.d.ts +8 -0
- package/lib/components/pdf/components/generator/pdf-base-page.component.d.ts +20 -0
- package/lib/components/pdf/components/generator/pdf-generator.component.d.ts +26 -0
- package/lib/components/pdf/components/templates/general/header/header-pdf.component.d.ts +8 -0
- package/lib/components/pdf/components/templates/general/image-pdf/image-pdf.component.d.ts +7 -0
- package/lib/components/pdf/components/templates/general/intro-pdf/intro-pdf.component.d.ts +6 -0
- package/lib/components/pdf/components/templates/general/materials-page-pdf/materials-page-pdf.component.d.ts +6 -0
- package/lib/components/pdf/components/templates/general/materials-pdf/materials-pdf.component.d.ts +8 -0
- package/lib/components/pdf/components/templates/general/page-number/page-number.component.d.ts +8 -0
- package/lib/components/pdf/constants/pdf.d.ts +5 -0
- package/lib/components/pdf/container/pdf.component.d.ts +13 -0
- package/lib/components/pdf/directives/insertion.directive.d.ts +7 -0
- package/lib/components/pdf/helpers/generate-pdf-schema.d.ts +2 -0
- package/lib/components/pdf/helpers/get-pdf-url.d.ts +1 -0
- package/lib/components/pdf/index.d.ts +1 -0
- package/lib/components/pdf/interfaces/pdf.interface.d.ts +53 -0
- package/lib/components/pdf/store/pdf.component.store.d.ts +44 -0
- package/lib/components/screen-locker/afk-restart-screen-locker.component.d.ts +25 -0
- package/lib/components/show-case/components/source-slider/source-slider.component.d.ts +42 -0
- package/lib/components/show-case/components/source-slider/user-interact.directive.d.ts +33 -0
- package/lib/components/show-case/constants/icons/fullscreen-out.d.ts +2 -0
- package/lib/components/show-case/constants/icons/fullscreen.d.ts +2 -0
- package/lib/components/show-case/constants/icons/pause-circle.d.ts +2 -0
- package/lib/components/show-case/constants/icons/pause-icon.d.ts +2 -0
- package/lib/components/show-case/constants/icons/play-icon.d.ts +2 -0
- package/lib/components/show-case/constants/icons/player-boomerang.d.ts +2 -0
- package/lib/components/show-case/constants/icons/player-laps.d.ts +2 -0
- package/lib/components/show-case/constants/icons/player-next.d.ts +2 -0
- package/lib/components/show-case/constants/icons/player-prev.d.ts +2 -0
- package/lib/components/show-case/constants/index.d.ts +7 -0
- package/lib/components/show-case/constants/show-case.icons.d.ts +1 -0
- package/lib/components/show-case/container/show-case.component.d.ts +98 -0
- package/lib/components/show-case/helpers/mapOnInitSequenceData.d.ts +3 -0
- package/lib/components/show-case/index.d.ts +1 -0
- package/lib/components/show-case/interfaces/showcase-status.d.ts +20 -0
- package/lib/components/show-case/store/show-case.component.interface.d.ts +32 -0
- package/lib/components/show-case/store/show-case.component.store.d.ts +37 -0
- package/lib/components/stat-graph/stat-graph.component.d.ts +28 -0
- package/lib/components/unreal-scene/unreal-scene.component.d.ts +50 -0
- package/lib/components/unreal-status/unreal-status.component.d.ts +24 -0
- package/lib/components/video-locker/video-locker.component.d.ts +14 -0
- package/lib/components/video-stats/video-stats.component.d.ts +36 -0
- package/lib/components/webrtc-error-modal/webrtc-error-modal.component.d.ts +10 -0
- package/lib/constants/ButtonsAndCodes.d.ts +23 -0
- package/lib/constants/EControlSchemeType.d.ts +6 -0
- package/lib/constants/EMessageType.d.ts +25 -0
- package/lib/constants/EToClientMessageType.d.ts +12 -0
- package/lib/constants/InputOptions.d.ts +2 -0
- package/lib/constants/UnrealStatusMessage.d.ts +4 -0
- package/lib/constants/index.d.ts +11 -0
- package/lib/constants/initial-config.d.ts +3 -0
- package/lib/constants/mix-panel.constant.d.ts +11 -0
- package/lib/constants/struct.d.ts +5553 -0
- package/lib/constants/timeout.constant.d.ts +6 -0
- package/lib/constants/unreal.constant.d.ts +11 -0
- package/lib/constants/unreal.providers.d.ts +15 -0
- package/lib/helpers/CommandObserver.d.ts +8 -0
- package/lib/helpers/DataDecoder.d.ts +1 -0
- package/lib/helpers/DataFlowMonitor.d.ts +39 -0
- package/lib/helpers/EventWrapper.d.ts +18 -0
- package/lib/helpers/FromStreamerHandlers/AnswerHandler.d.ts +3 -0
- package/lib/helpers/FromStreamerHandlers/ConfigHandler.d.ts +3 -0
- package/lib/helpers/FromStreamerHandlers/IceCandidateHandler.d.ts +4 -0
- package/lib/helpers/FromStreamerHandlers/InstanceReadyHandler.d.ts +3 -0
- package/lib/helpers/FromStreamerHandlers/InstanceReservedHandler.d.ts +3 -0
- package/lib/helpers/FromStreamerHandlers/PingHandler.d.ts +2 -0
- package/lib/helpers/FromStreamerHandlers/PlayerCountHandler.d.ts +3 -0
- package/lib/helpers/FromStreamerHandlers/SSInfoHandler.d.ts +3 -0
- package/lib/helpers/FromStreamerHandlers/index.d.ts +8 -0
- package/lib/helpers/GetNextUrl.d.ts +1 -0
- package/lib/helpers/KalmanFilter1D.d.ts +20 -0
- package/lib/helpers/LatencyTimings.d.ts +13 -0
- package/lib/helpers/TouchEmulator.d.ts +24 -0
- package/lib/helpers/VideoRecorder.d.ts +8 -0
- package/lib/helpers/WsHandlers/OnCloseHandler.d.ts +2 -0
- package/lib/helpers/WsHandlers/OnErrorHandler.d.ts +2 -0
- package/lib/helpers/WsHandlers/OnMessageHandler.d.ts +2 -0
- package/lib/helpers/WsHandlers/OpenHandler.d.ts +2 -0
- package/lib/helpers/WsHandlers/index.d.ts +4 -0
- package/lib/helpers/clamp-and-keep-max-percents.d.ts +2 -0
- package/lib/helpers/deepEqual.d.ts +1 -0
- package/lib/helpers/dispatchResize.d.ts +2 -0
- package/lib/helpers/error-codes.d.ts +1 -0
- package/lib/helpers/float-to-smooth-percents.d.ts +2 -0
- package/lib/helpers/get-image-from-video-stream.d.ts +3 -0
- package/lib/helpers/index.d.ts +21 -0
- package/lib/helpers/mapQpToQuality.d.ts +2 -0
- package/lib/helpers/prepare-commands.d.ts +52 -0
- package/lib/helpers/remove-exile-commands.d.ts +10 -0
- package/lib/helpers/resetAfk.d.ts +1 -0
- package/lib/helpers/resize-observer.d.ts +2 -0
- package/lib/interfaces/CloseReason.d.ts +5 -0
- package/lib/interfaces/CustomCloseCodes.d.ts +6 -0
- package/lib/interfaces/LBMStats.d.ts +6 -0
- package/lib/interfaces/SignalingData.d.ts +8 -0
- package/lib/interfaces/SignalingMessage.d.ts +77 -0
- package/lib/interfaces/TelemetryEvent.d.ts +1 -0
- package/lib/interfaces/disconnect-reasons.d.ts +9 -0
- package/lib/interfaces/errors.interface.d.ts +5 -0
- package/lib/interfaces/freeze-frame-message.interface.d.ts +4 -0
- package/lib/interfaces/index.d.ts +16 -0
- package/lib/interfaces/initial-config.d.ts +8 -0
- package/lib/interfaces/input.interface.d.ts +19 -0
- package/lib/interfaces/mix-panel-events.d.ts +8 -0
- package/lib/interfaces/quality.interface.d.ts +1 -0
- package/lib/interfaces/stream-config.interface.d.ts +5 -0
- package/lib/interfaces/stream-resolution.interface.d.ts +4 -0
- package/lib/interfaces/unreal-internal-signal-events.interface.d.ts +83 -0
- package/lib/pipes/index.d.ts +1 -0
- package/lib/pipes/safe-html.pipe.d.ts +9 -0
- package/lib/services/afk.service.d.ts +38 -0
- package/lib/services/aggregator.service.d.ts +53 -0
- package/lib/services/command-telemetry.service.d.ts +71 -0
- package/lib/services/console-extensions.service.d.ts +10 -0
- package/lib/services/dev-mode.service.d.ts +7 -0
- package/lib/services/freeze-frame.service.d.ts +16 -0
- package/lib/services/image-capture.service.d.ts +30 -0
- package/lib/services/index.d.ts +17 -0
- package/lib/services/input.service.d.ts +53 -0
- package/lib/services/mix-panel.service.d.ts +11 -0
- package/lib/services/regions-ping.service.d.ts +34 -0
- package/lib/services/signalling.service.d.ts +41 -0
- package/lib/services/stream-status-telemetry.service.d.ts +11 -0
- package/lib/services/sub.service.d.ts +5 -0
- package/lib/services/unreal-communicator.service.d.ts +38 -0
- package/lib/services/video-stream-status.service.d.ts +24 -0
- package/lib/services/video.service.d.ts +17 -0
- package/lib/services/web-rtc-player.service.d.ts +44 -0
- package/lib/store/index.d.ts +5 -0
- package/lib/store/unreal.actions.d.ts +196 -0
- package/lib/store/unreal.effects.d.ts +79 -0
- package/lib/store/unreal.feature.d.ts +35 -0
- package/lib/store/unreal.reducer.d.ts +56 -0
- package/lib/store/unreal.selectors.d.ts +36 -0
- package/package.json +36 -0
- package/public-api.d.ts +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"3dsource-angular-unreal-module.mjs","sources":["../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/unreal-internal-signal-events.interface.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/EventWrapper.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.actions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/disconnect-reasons.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/timeout.constant.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/remove-exile-commands.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/interfaces/showcase-status.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.reducer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.feature.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.selectors.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataFlowMonitor.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/DataFlowConstants.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/filter-settings/filter-settings.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/filter-settings/filter-settings.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/pipes/safe-html.pipe.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-modal/low-bandwidth-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-modal/low-bandwidth-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/LatencyTimings.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/sub.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/initial-config.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/command-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/web-rtc-player.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/mapQpToQuality.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/KalmanFilter1D.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video-stream-status.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/dev-mode.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/low-bandwidth-detector.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/low-bandwidth-detector.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/constants/pdf.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/directives/insertion.directive.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/generator/pdf-generator.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/generator/pdf-generator.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/generator/pdf-base-page.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/header/header-pdf.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/header/header-pdf.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/materials-pdf/materials-pdf.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/materials-pdf/materials-pdf.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/page-number/page-number.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/page-number/page-number.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/image-pdf/image-pdf.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/image-pdf/image-pdf.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/intro-pdf/intro-pdf.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/intro-pdf/intro-pdf.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/materials-page-pdf/materials-page-pdf.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/components/templates/general/materials-page-pdf/materials-page-pdf.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/helpers/generate-pdf-schema.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/unreal.constant.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/dispatchResize.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/CommandObserver.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resetAfk.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/get-image-from-video-stream.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EControlSchemeType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/InputOptions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/afk.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/freeze-frame.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/console-extensions.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/unreal-communicator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/prepare-commands.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/image-capture.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/helpers/get-pdf-url.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/store/pdf.component.store.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/container/pdf.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/pdf/container/pdf.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/screen-locker/afk-restart-screen-locker.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/screen-locker/afk-restart-screen-locker.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/index.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/store/show-case.component.store.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/helpers/mapOnInitSequenceData.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/components/source-slider/user-interact.directive.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/components/source-slider/source-slider.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/components/source-slider/source-slider.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/pause-circle.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/pause-icon.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/play-icon.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/player-boomerang.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/player-laps.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/player-next.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/player-prev.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/fullscreen.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/icons/fullscreen-out.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/constants/show-case.icons.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/container/show-case.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/show-case/container/show-case.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/stat-graph/stat-graph.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/stat-graph/stat-graph.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EToClientMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/UnrealStatusMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/ConfigHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/AnswerHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/IceCandidateHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/SSInfoHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/InstanceReadyHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/InstanceReservedHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/PingHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/SignalingMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OpenHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnCloseHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnErrorHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/WsHandlers/OnMessageHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/PlayerCountHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/GetNextUrl.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/regions-ping.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/CustomCloseCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/signalling.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/webrtc-error-modal/webrtc-error-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/webrtc-error-modal/webrtc-error-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/error-codes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.effects.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/clamp-and-keep-max-percents.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataDecoder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/float-to-smooth-percents.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resize-observer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/ButtonsAndCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/TouchEmulator.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/VideoRecorder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/deepEqual.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/aggregator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/input.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/mix-panel.constant.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/mix-panel.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/stream-status-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-locker/video-locker.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-locker/video-locker.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/unreal.providers.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/mix-panel-events.ts","../../../../projects/3dsource/angular-unreal-module/src/3dsource-angular-unreal-module.ts"],"sourcesContent":["import type { MetaBoxCommandPacket } from '@struct';\nimport type { Quality } from './quality.interface';\nimport type { DataFlowCheckResult } from '../helpers/DataFlowMonitor';\n\nexport const UnrealInternalSignalEvents = {\n OnVideoInitialized: 'OnVideoInitialized',\n RestAfkTimer: 'RestAfkTimer',\n FreezeFrameStart: 'FreezeFrameStart',\n UnrealCallback: 'UnrealCallback',\n ClickableOverlay: 'ClickableOverlay',\n VideoPlayClick: 'VideoPlayClick',\n ShowPlayButton: 'ShowPlayButton',\n ForceResizeViewport: 'ForceResizeViewport',\n VideoAdaptedToContainer: 'VideoAdaptedToContainer',\n TelemetryStart: 'TelemetryStart',\n TelemetryStop: 'TelemetryStop',\n TelemetryReset: 'TelemetryReset',\n} as const;\n\nexport interface SignalDescriptor {\n [UnrealInternalSignalEvents.UnrealCallback]: {\n json: UnrealCallBackJson;\n };\n [UnrealInternalSignalEvents.ClickableOverlay]: {\n message: string;\n className: string;\n isActivityDetected: boolean;\n onOverlayClick: () => void;\n } | void;\n [UnrealInternalSignalEvents.VideoPlayClick]: {\n text: string;\n };\n [UnrealInternalSignalEvents.ForceResizeViewport]: void;\n [UnrealInternalSignalEvents.OnVideoInitialized]: HTMLVideoElement;\n [UnrealInternalSignalEvents.VideoAdaptedToContainer]: void;\n [UnrealInternalSignalEvents.ShowPlayButton]: {\n text: string;\n callback: () => boolean;\n };\n [UnrealInternalSignalEvents.RestAfkTimer]: void;\n [UnrealInternalSignalEvents.FreezeFrameStart]: void;\n [UnrealInternalSignalEvents.TelemetryReset]: void;\n [UnrealInternalSignalEvents.TelemetryStart]: { externalId: string };\n [UnrealInternalSignalEvents.TelemetryStop]: {\n externalId: string;\n payload?: { multi?: boolean };\n };\n [key: string]: any;\n}\n\nexport type UnrealCallBackJson =\n | MetaBoxCommandPacket\n | WrappedMetaBoxCommandPacket;\n\nexport interface WrappedMetaBoxCommandPacket {\n commandCallback: MetaBoxCommandPacket;\n}\n\nexport interface IAggregatedStat {\n quality: Quality;\n aggregatedStats: InboundVideoStats;\n}\n\nexport interface InboundVideoStats extends RTCInboundRtpStreamStats {\n VideoEncoderQP: number;\n runTime: number;\n pixelRatio: number;\n bytesReceivedStart: number;\n framesDecodedStart: number;\n timestampStart: number;\n videoCodec: string;\n avgBitrate: number;\n avgFrameRate: number;\n currentRoundTripTime: number;\n codecs: Record<string, string>;\n receiveToCompositeMs: number;\n bitrate: number;\n kalmanBitrate: number;\n bitrateDrop: number;\n dataFlowCheckResult: DataFlowCheckResult;\n dataFlowBitrate: DataFlowCheckResult;\n}\n\nexport interface AwsInstance {\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n}\n","import type { SignalDescriptor } from '../interfaces/unreal-internal-signal-events.interface';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport type { Observable } from 'rxjs';\nimport { Signal } from '@3dsource/utils';\nimport { filter, map } from 'rxjs/operators';\nimport type { MetaBoxCommandList } from '@struct';\n\ntype Descriptor = MetaBoxCommandList & SignalDescriptor;\n\n/**\n * UnrealInternalSignalEvents commands list wrapper listener\n * @param event\n */\nexport function fromSignal<K extends keyof Descriptor>(\n event: K,\n): Observable<Descriptor[K]> {\n return Signal.on(event).pipe(\n //tapLog('fromSignal', event), // <== for debugging, do not remove\n map((data: any) => data.detail),\n );\n}\n\ntype ArgumentType<K extends keyof Descriptor> = Descriptor[K] extends void\n ? never\n : Descriptor[K];\n\n/**\n * UnrealInternalSignalEvents commands list wrapper sender\n * @param event\n * @param args\n */\nexport function sendSignal<K extends keyof Descriptor>(\n event: K,\n ...args: ArgumentType<K> extends never ? [] : [ArgumentType<K>]\n) {\n Signal.broadcast(event, { detail: args?.[0] || null });\n}\n\nexport function fromUnrealCallBackSignal<K extends keyof Descriptor>(\n command: K,\n): Observable<Descriptor[K]> {\n return fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map((data) => data?.json),\n map((json) => {\n if ('commandCallback' in json) {\n return json?.commandCallback;\n }\n\n return json;\n }),\n filter((json) => json.command === command),\n map((data) => data),\n map((data) => {\n if ('payload' in data) {\n return {\n command: data.command,\n payload: data?.payload,\n } as Descriptor[K];\n }\n\n return {\n command: data.command,\n } as Descriptor[K];\n }),\n );\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal } from '../../helpers/EventWrapper';\nimport { NgClass } from '@angular/common';\nimport {\n SourceButtonColorScheme,\n SourceButtonComponent,\n SourceButtonSize,\n} from '@source/ui-sdk/source-button';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'app-clickable-overlay',\n templateUrl: './clickable-overlay.component.html',\n styleUrls: ['./clickable-overlay.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, SourceButtonComponent],\n})\nexport class ClickableOverlayComponent {\n protected SourceButtonSize = SourceButtonSize;\n protected SourceButtonColorScheme = SourceButtonColorScheme;\n\n state = toSignal(\n fromSignal(UnrealInternalSignalEvents.ClickableOverlay).pipe(\n map((data) => (typeof data === 'object' ? data : null)),\n ),\n );\n}\n","@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [colorScheme]=\"SourceButtonColorScheme.PRIMARY\"\n [isFullWidth]=\"true\"\n [size]=\"SourceButtonSize.LARGE\"\n [data-testid]=\"'continue-session'\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n","import { createAction, props } from '@ngrx/store';\nimport type { UnrealErrorType } from '../interfaces/errors.interface';\nimport type { LBMStats } from '../interfaces/LBMStats';\nimport type { SignalingData } from '../interfaces/SignalingData';\nimport type { StreamConfig } from '../interfaces/stream-config.interface';\nimport type { DisconnectType } from '../interfaces/disconnect-reasons';\nimport type { MetaBoxCommand } from '@struct';\nimport type { ShowCaseStatusValues } from '../components/show-case/interfaces/showcase-status';\nimport type { PdfContent } from '../components/pdf/interfaces/pdf.interface';\n\nconst scoped = (templateString: TemplateStringsArray) =>\n `[UNREAL] ${templateString[0]}`;\nexport const changeLowBandwidth = createAction(\n scoped`change low bandwidth`,\n props<{\n lowBandwidth: boolean;\n stats?: LBMStats;\n }>(),\n);\nexport const setMaxFps = createAction(\n scoped`change fps`,\n props<{ maxFps: number }>(),\n);\nexport const destroyRemoteConnections = createAction(\n scoped`destroyRemoteConnections`,\n props<{ disconnectReason: DisconnectType }>(),\n);\nexport const destroyConnectionsAndResetState = createAction(\n scoped`destroyConnections and reset`,\n);\nexport const setCirrusConnected = createAction(scoped`cirrusConnected`);\nexport const setCirrusDisconnected = createAction(scoped`cirrusDisconnected`);\nexport const changeStatusMainVideoOnScene = createAction(\n scoped`change status main video on scene`,\n props<{ isVideoPlaying: boolean }>(),\n);\nexport const setAwsInstance = createAction(\n scoped`set aws instance`,\n props<{\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n }>(),\n);\nexport const setStatusMessage = createAction(\n scoped`set status message`,\n props<{ message: string | null }>(),\n);\nexport const setStatusPercentSignallingServer = createAction(\n scoped`change status percent signalling server`,\n props<{ percent: number | null }>(),\n);\nexport const setFreezeFrame = createAction(\n scoped`set freeze frame`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setUnrealVersion = createAction(\n scoped`set unreal version`,\n props<{ version: string }>(),\n);\nexport const setStreamClientCompanyId = createAction(\n scoped`set stream client company id`,\n props<{ id: string }>(),\n);\nexport const setStreamViewId = createAction(\n scoped`set stream view id`,\n props<{ id: string }>(),\n);\nexport const setIntroImageSrc = createAction(\n scoped`set intro image src`,\n props<{ src: string }>(),\n);\nexport const setLoadingImageSrc = createAction(\n scoped`set loading image src`,\n props<{ src: string }>(),\n);\nexport const setIntroVideoSrc = createAction(\n scoped`set intro video src`,\n props<{ src: string }>(),\n);\nexport const resetIntroSrc = createAction(scoped`reset intro src`);\nexport const setFreezeFrameFromVideo = createAction(\n scoped`set freeze frame from video`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setEstablishingConnection = createAction(\n scoped`set establishing connection`,\n props<{ value: boolean }>(),\n);\nexport const setDataChannelConnected = createAction(\n scoped`set data channel connected`,\n props<{ value: boolean }>(),\n);\nexport const setConfig = createAction(\n scoped`set config`,\n props<{ config: Partial<StreamConfig> }>(),\n);\nexport const setErrorMessage = createAction(\n scoped`set error message`,\n props<{\n errorType: UnrealErrorType;\n message: string;\n }>(),\n);\nexport const setViewportReady = createAction(\n scoped`set viewport ready`,\n props<{ value: boolean }>(),\n);\nexport const changeStreamResolutionAction = createAction(\n scoped`change stream resolution`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const changeStreamResolutionSuccessAction = createAction(\n scoped`change stream resolution success action`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const setSignalingName = createAction(\n scoped`set aws instanceName`,\n props<{ instanceName: string }>(),\n);\nexport const updateCirrusInfo = createAction(\n scoped`set unrealInfo`,\n props<{\n ssInfo: string;\n ssData: SignalingData;\n }>(),\n);\nexport const commandStarted = createAction(\n scoped`command started`,\n props<{ id: string; command: MetaBoxCommand }>(),\n);\nexport const commandCompleted = createAction(\n scoped`command completed`,\n props<{ id: string }>(),\n);\nexport const setLoopBackCommandIsCompleted = createAction(\n scoped`set loopBack command is completed`,\n);\nexport const initShowcase = createAction(\n scoped`init showcase`,\n props<{ sceneId: string }>(),\n);\nexport const stopShowcase = createAction(\n scoped`stop showcase`,\n props<{ isResetSceneId: boolean }>(),\n);\nexport const playPauseShowcase = createAction(\n scoped`play pause showcase`,\n props<{ showcase: ShowCaseStatusValues }>(),\n);\nexport const showUnrealErrorMessage = createAction(\n scoped`show unreal error message`,\n props<{ code: number | null }>(),\n);\nexport const getPdfAction = createAction(scoped`get pdf action`);\nexport const getPdfActionSuccess = createAction(\n scoped`get pdf success action`,\n props<{ content: PdfContent }>(),\n);\nexport const getPdfActionFinalize = createAction(\n scoped`get pdf finalize action`,\n);\nexport const initSignalling = createAction(scoped`init signalling`);\nexport const resetConfig = createAction(scoped`reset config`);\nexport const resetAfkAction = createAction(scoped`reset afk action`);\nexport const resetWarnTimeout = createAction(scoped`reset config warn timeout`);\nexport const resetUnrealStateAction = createAction(scoped`reset state`);\nexport const resetUnrealState = createAction(scoped`reset unreal state`);\n","export const DisconnectReason = {\n afk: 'afk',\n none: 'none',\n reset: 'reset',\n wsOnError: 'wsOnError',\n dataChannelClosed: 'dataChannelClosed',\n dataChannelTimeout: 'dataChannelTimeout',\n} as const;\n\nexport type DisconnectType =\n (typeof DisconnectReason)[keyof typeof DisconnectReason];\n","export const DEFAULT_TIMEOUT_PERIOD = 15;\nexport const DEFAULT_WARN_TIMEOUT = 120;\nexport const DEFAULT_SHOWCASE_TIMEOUT = 120;\nexport const DEFAULT_PDF_TIMEOUT = 300;\nexport const DEFAULT_RENDER_SPINNER_TIMEOUT = 20 * 60;\nexport const DATA_CHANNEL_CONNECTION_TIMEOUT = 5000; // 5 seconds;\n","import { whereNot } from '@3dsource/utils';\nimport type { CommandsLoaderState } from '../store/unreal.reducer';\n\nexport const removeExileCommands = (\n state: CommandsLoaderState,\n idToRemove: string,\n) => {\n const exileTimout = 10000;\n const out = { ...state };\n out.commandsInProgress = out.commandsInProgress.filter(\n whereNot({ id: idToRemove }),\n );\n out.totalCommandsCompleted++;\n const time = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries(out.commandsInProgress).forEach(([, { id, timeStamp }]) => {\n if (time - timeStamp > exileTimout) {\n markForDelete.push(id);\n }\n });\n out.totalCommandsCompleted += markForDelete.length;\n out.commandsInProgress = out.commandsInProgress.filter(\n (command) => !markForDelete.includes(command.id),\n );\n return out;\n};\n","export const ShowCaseStatus = {\n INIT: 'init',\n PLAY: 'play',\n PAUSE: 'pause',\n STOP: 'stop',\n} as const;\n\nexport type ShowCaseStatusValues =\n (typeof ShowCaseStatus)[keyof typeof ShowCaseStatus];\n\n\nexport interface ProductShowcase {\n hasShowcase: boolean\n id: string;\n previewUrl?: string;\n showcase?: {\n duration?: number\n lowBandwidth: {\n duration: number;\n time: number;\n }[];\n }\n title: string\n}\n","import {\n changeLowBandwidth,\n changeStatusMainVideoOnScene,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n commandStarted,\n getPdfActionFinalize,\n getPdfActionSuccess,\n initShowcase,\n initSignalling,\n playPauseShowcase,\n resetConfig,\n resetIntroSrc,\n resetUnrealState,\n resetUnrealStateAction,\n resetWarnTimeout,\n setAwsInstance,\n setCirrusConnected,\n setCirrusDisconnected,\n setConfig,\n setDataChannelConnected,\n setErrorMessage,\n setEstablishingConnection,\n setFreezeFrame,\n setFreezeFrameFromVideo,\n setIntroImageSrc,\n setIntroVideoSrc,\n setLoadingImageSrc,\n setLoopBackCommandIsCompleted,\n setSignalingName,\n setStatusMessage,\n setStatusPercentSignallingServer,\n setStreamClientCompanyId,\n setStreamViewId,\n setUnrealVersion,\n setViewportReady,\n stopShowcase,\n updateCirrusInfo,\n} from './unreal.actions';\nimport { on } from '@ngrx/store';\nimport { createImmerReducer } from 'ngrx-immer/store';\nimport type { LBMStats } from '../interfaces/LBMStats';\nimport type { AwsInstance } from '../interfaces/unreal-internal-signal-events.interface';\nimport type { FreezeFrameMessage } from '../interfaces/freeze-frame-message.interface';\nimport type { SignalingData } from '../interfaces/SignalingData';\nimport type { UnrealError } from '../interfaces/errors.interface';\nimport type { StreamConfig } from '../interfaces/stream-config.interface';\nimport type { StreamResolutionProps } from '../interfaces/stream-resolution.interface';\nimport type { DisconnectType } from '../interfaces/disconnect-reasons';\nimport { DisconnectReason } from '../interfaces/disconnect-reasons';\nimport { DEFAULT_WARN_TIMEOUT } from '../constants/timeout.constant';\nimport { removeExileCommands } from '../helpers/remove-exile-commands';\nimport type { MetaBoxCommand } from '@struct';\nimport type { ShowCaseStatusValues } from '../components/show-case/interfaces/showcase-status';\nimport { ShowCaseStatus } from '../components/show-case/interfaces/showcase-status';\n\nexport interface CommandsLoaderState {\n commandsInProgress: {\n timeStamp: number;\n command: MetaBoxCommand;\n id: string;\n }[];\n totalCommandsStarted: number;\n totalCommandsCompleted: number;\n}\n\nexport interface UnrealState {\n lowBandwidthStats: LBMStats | undefined;\n streamConfig: StreamConfig;\n awsInstance: AwsInstance;\n lowBandwidth: boolean;\n wasInitialized: boolean;\n isFirstSuccessLoad: boolean;\n cirrusConnected: boolean;\n viewportReady: boolean;\n freezeFrameFromVideo: FreezeFrameMessage;\n freezeFrame: FreezeFrameMessage;\n statusMessage: string | null;\n /**\n * @deprecated, use ssData in future\n */\n ssInfo: string | null;\n ssData: SignalingData | null;\n statusPercentSignallingServer: number | null;\n errorMessage: UnrealError | null;\n dataChannelConnected: boolean;\n streamResolution: StreamResolutionProps;\n isVideoPlaying: boolean;\n isPdfGenerating: boolean;\n showCaseStatus: ShowCaseStatusValues;\n showCaseSceneId: string | null;\n establishingConnection: boolean;\n disconnectReason: DisconnectType;\n loaderCommands: CommandsLoaderState;\n unrealVersion: string | null;\n streamClientCompanyId: string | null;\n streamViewId: string | null;\n videoIntroSrc: string | null;\n imageIntroSrc: string | null;\n imageLoadingSrc: string;\n}\n\nexport const initialState: UnrealState = {\n lowBandwidthStats: undefined,\n wasInitialized: false,\n isFirstSuccessLoad: false,\n lowBandwidth: false,\n cirrusConnected: false,\n establishingConnection: false,\n viewportReady: false,\n dataChannelConnected: false,\n isVideoPlaying: false,\n isPdfGenerating: false,\n showCaseStatus: ShowCaseStatus.STOP,\n showCaseSceneId: null,\n statusPercentSignallingServer: null,\n statusMessage: null,\n errorMessage: null,\n ssInfo: null,\n ssData: null,\n streamResolution: { width: null, height: null },\n freezeFrameFromVideo: { dataUrl: null, progress: null },\n freezeFrame: { dataUrl: null, progress: null },\n disconnectReason: DisconnectReason.none,\n awsInstance: {\n wsUrl: null,\n instanceName: null,\n pollingUrl: null,\n },\n streamConfig: {\n autoStart: true,\n warnTimeout: DEFAULT_WARN_TIMEOUT,\n matchMakerUrls: [],\n },\n loaderCommands: {\n commandsInProgress: [],\n totalCommandsStarted: 0,\n totalCommandsCompleted: 0,\n },\n unrealVersion: '',\n streamClientCompanyId: '',\n streamViewId: 'default',\n videoIntroSrc: null,\n imageIntroSrc: null,\n imageLoadingSrc: 'assets/images/avif/configurator_bg.avif',\n};\nexport const unrealReducer = createImmerReducer(\n initialState,\n on(changeLowBandwidth, (state: UnrealState, { lowBandwidth, stats }) => {\n state.lowBandwidth = lowBandwidth;\n if (!lowBandwidth) {\n state.lowBandwidthStats = undefined;\n return state;\n }\n state.lowBandwidthStats = stats;\n return state;\n }),\n on(changeStatusMainVideoOnScene, (state: UnrealState, { isVideoPlaying }) => {\n state.isVideoPlaying = isVideoPlaying;\n return state;\n }),\n on(setAwsInstance, (state: UnrealState, awsInstance) => {\n state.awsInstance = awsInstance;\n return state;\n }),\n on(setViewportReady, (state: UnrealState, { value }) => {\n state.viewportReady = value;\n if (value) {\n state.statusMessage = null;\n state.errorMessage = null;\n }\n return state;\n }),\n on(updateCirrusInfo, (state: UnrealState, { ssInfo, ssData }) => {\n state.ssInfo = ssInfo; // For back compatibility\n state.ssData = ssData; //Contains all the data from the ssInfo as object\n return state;\n }),\n on(\n changeStreamResolutionSuccessAction,\n (state: UnrealState, { width, height }) => {\n state.streamResolution.width = width;\n state.streamResolution.height = height;\n return state;\n },\n ),\n on(setFreezeFrame, (state: UnrealState, freezeFrame) => {\n if (\n freezeFrame.progress === 0 ||\n freezeFrame.progress === 1 ||\n freezeFrame.progress === null\n ) {\n state.freezeFrame.dataUrl = freezeFrame.dataUrl;\n }\n state.freezeFrame.progress = freezeFrame.progress || null;\n return state;\n }),\n on(setErrorMessage, (state: UnrealState, errorMessage) => {\n if (state.dataChannelConnected) {\n return state;\n }\n state.errorMessage = errorMessage;\n state.statusMessage = null;\n return state;\n }),\n on(setFreezeFrameFromVideo, (state: UnrealState, freezeFrameFromVideo) => {\n state.freezeFrameFromVideo.dataUrl = freezeFrameFromVideo.dataUrl;\n state.freezeFrameFromVideo.progress = freezeFrameFromVideo.progress || null;\n return state;\n }),\n on(getPdfActionSuccess, (state) => {\n state.isPdfGenerating = true;\n return state;\n }),\n on(getPdfActionFinalize, (state) => {\n state.isPdfGenerating = false;\n return state;\n }),\n on(initShowcase, (state, { sceneId }) => {\n state.showCaseStatus = ShowCaseStatus.INIT;\n state.showCaseSceneId = sceneId;\n return state;\n }),\n on(stopShowcase, (state, { isResetSceneId }) => {\n state.showCaseStatus = ShowCaseStatus.STOP;\n state.showCaseSceneId = isResetSceneId ? null : state.showCaseSceneId;\n return state;\n }),\n on(playPauseShowcase, (state, { showcase }) => {\n state.showCaseStatus = showcase;\n return state;\n }),\n on(setStatusMessage, (state: UnrealState, { message }) => {\n state.statusMessage = message;\n return state;\n }),\n on(setEstablishingConnection, (state: UnrealState, { value }) => {\n state.establishingConnection = value;\n return state;\n }),\n on(setStatusPercentSignallingServer, (state: UnrealState, { percent }) => {\n state.statusPercentSignallingServer = percent;\n return state;\n }),\n on(setDataChannelConnected, (state: UnrealState, { value }) => {\n state.dataChannelConnected = value;\n if (value) {\n state.wasInitialized = true;\n }\n return state;\n }),\n on(setConfig, (state: UnrealState, { config }) => {\n state.streamConfig = { ...state.streamConfig, ...config };\n return state;\n }),\n on(resetConfig, (state: UnrealState) => {\n state.streamConfig = initialState.streamConfig;\n return state;\n }),\n on(resetWarnTimeout, (state: UnrealState) => {\n state.streamConfig.warnTimeout = DEFAULT_WARN_TIMEOUT;\n return state;\n }),\n on(setCirrusConnected, (state: UnrealState) => {\n state.cirrusConnected = true;\n return state;\n }),\n on(setCirrusDisconnected, (state: UnrealState) => {\n state.cirrusConnected = false;\n return state;\n }),\n on(initSignalling, (state: UnrealState) => {\n state.disconnectReason = DisconnectReason.none;\n return state;\n }),\n on(setSignalingName, (state: UnrealState, { instanceName }) => {\n state.awsInstance = { ...state.awsInstance, instanceName };\n return state;\n }),\n on(setLoopBackCommandIsCompleted, (state) => {\n state.isFirstSuccessLoad = true;\n return state;\n }),\n on(setUnrealVersion, (state: UnrealState, { version }) => {\n state.unrealVersion = version;\n return state;\n }),\n on(setStreamClientCompanyId, (state: UnrealState, { id }) => {\n state.streamClientCompanyId = id;\n return state;\n }),\n on(setStreamViewId, (state: UnrealState, { id }) => {\n state.streamViewId = id;\n return state;\n }),\n on(setIntroImageSrc, (state: UnrealState, { src }) => {\n state.imageIntroSrc = src;\n return state;\n }),\n on(setLoadingImageSrc, (state: UnrealState, { src }) => {\n state.imageLoadingSrc = src;\n return state;\n }),\n on(setIntroVideoSrc, (state: UnrealState, { src }) => {\n state.videoIntroSrc = src;\n return state;\n }),\n on(resetIntroSrc, (state: UnrealState) => {\n state.imageIntroSrc = '';\n state.videoIntroSrc = '';\n return state;\n }),\n on(commandStarted, (state, { id, command }) => {\n state.loaderCommands.totalCommandsStarted =\n state.loaderCommands.totalCommandsStarted + 1;\n state.loaderCommands.commandsInProgress = [\n ...state.loaderCommands.commandsInProgress,\n { id, command, timeStamp: new Date().getTime() },\n ];\n return state;\n }),\n on(commandCompleted, (state, { id }) => {\n state.loaderCommands = removeExileCommands(state.loaderCommands, id);\n return state;\n }),\n on(resetUnrealState, (state: UnrealState) => {\n return {\n ...initialState,\n wasInitialized: state.wasInitialized,\n isFirstSuccessLoad: state.isFirstSuccessLoad,\n unrealVersion: state.unrealVersion,\n streamClientCompanyId: state.streamClientCompanyId,\n streamViewId: state.streamViewId,\n imageLoadingSrc: state.imageLoadingSrc,\n };\n }),\n on(resetUnrealStateAction, () => {\n return initialState;\n }),\n);\n","import { createFeature } from '@ngrx/store';\nimport { unrealReducer } from './unreal.reducer';\n\nexport const unrealFeature = createFeature({\n name: 'unrealFeature',\n reducer: unrealReducer,\n});\n","import { createSelector } from '@ngrx/store';\nimport { unrealFeature } from './unreal.feature';\nimport { DEFAULT_WARN_TIMEOUT } from '../constants/timeout.constant';\nimport { ShowCaseStatus } from '../components/show-case/interfaces/showcase-status';\nimport { clampf, lerp, Truthy } from '@3dsource/utils';\n\nexport const selectFreezeFrameDataUrlFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.dataUrl || null,\n);\nexport const selectFreezeFrameProgressMessageFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.progress || null,\n);\nexport const selectFreezeFrameDataUrl = createSelector(\n unrealFeature.selectFreezeFrame,\n unrealFeature.selectLowBandwidth,\n (freezeFrame, isLow) =>\n freezeFrame?.dataUrl && isLow ? freezeFrame?.dataUrl : null,\n);\nexport const selectIsFreezeFrameLoading = createSelector(\n unrealFeature.selectFreezeFrame,\n (freezeFrame) =>\n freezeFrame?.progress\n ? freezeFrame.progress > 0 && freezeFrame.progress < 1\n : false,\n);\nexport const selectFreezeFrameCombinedDataUrl = createSelector(\n selectFreezeFrameDataUrlFromVideo,\n selectFreezeFrameDataUrl,\n (dataUrlFromVideo, remoteDataUrl) =>\n dataUrlFromVideo || remoteDataUrl || null,\n);\nexport const selectStreamConfig = createSelector(\n unrealFeature.selectStreamConfig,\n (config) => config,\n);\nexport const selectWarnTimeout = createSelector(\n selectStreamConfig,\n (config) => config?.warnTimeout || DEFAULT_WARN_TIMEOUT,\n);\nexport const selectMatchUrls = createSelector(selectStreamConfig, (config) =>\n (config?.matchMakerUrls || []).filter(Truthy),\n);\nexport const selectIsAutostart = createSelector(\n selectStreamConfig,\n (config) => config?.autoStart,\n);\nexport const selectWsUrl = createSelector(\n unrealFeature.selectAwsInstance,\n (instance) => instance?.wsUrl,\n);\nexport const selectShowReconnectPopup = createSelector(\n unrealFeature.selectWasInitialized,\n unrealFeature.selectCirrusConnected,\n unrealFeature.selectEstablishingConnection,\n unrealFeature.selectImageIntroSrc,\n unrealFeature.selectVideoIntroSrc,\n (wasInitialized, connected, establishing, imageSrc, videoSrc) =>\n wasInitialized && !connected && !establishing && !imageSrc && !videoSrc,\n);\nexport const selectShowLoader = createSelector(\n unrealFeature.selectWasInitialized,\n unrealFeature.selectViewportReady,\n selectStreamConfig,\n selectShowReconnectPopup,\n (wasInitialized, viewportReady, config, showPopup) =>\n ((config.autoStart && !wasInitialized) || !showPopup) && !viewportReady,\n);\nexport const selectIsShowShowcase = createSelector(\n unrealFeature.selectShowCaseStatus,\n unrealFeature.selectVideoIntroSrc,\n (status, isModularVideoIntro) =>\n status !== ShowCaseStatus.STOP || isModularVideoIntro,\n);\nexport const selectShowcaseIsInit = createSelector(\n unrealFeature.selectShowCaseStatus,\n (status) => status !== ShowCaseStatus.STOP,\n);\nexport const selectShowcaseIsStopped = createSelector(\n unrealFeature.selectShowCaseStatus,\n (status) => status === ShowCaseStatus.STOP,\n);\nexport const selectShowcaseIsPlayStatus = createSelector(\n unrealFeature.selectShowCaseStatus,\n (status) => status === ShowCaseStatus.PLAY,\n);\nexport const selectShowcaseIsPauseStatus = createSelector(\n unrealFeature.selectShowCaseStatus,\n (status) => status === ShowCaseStatus.PAUSE,\n);\nexport const selectShowcaseIsPlaying = createSelector(\n selectShowcaseIsPlayStatus,\n selectShowcaseIsPauseStatus,\n (isPlay, isPause) => isPlay || isPause,\n);\nexport const selectIsVideoPlayingAndDataChannelConnected = createSelector(\n unrealFeature.selectIsVideoPlaying,\n unrealFeature.selectDataChannelConnected,\n (isVideoPlaying, isDataChannelConnected) =>\n isVideoPlaying && isDataChannelConnected,\n);\nexport const selectSignalingParameters = createSelector(\n unrealFeature.selectSsData,\n unrealFeature.selectAwsInstance,\n unrealFeature.selectSsInfo,\n (data, instance, ssInfo) => {\n const info = [];\n if (data) {\n info.push(`${data.cirrusVersion}, ${data.branchInfo}`);\n info.push(`Unreal App Version: ${data.streamerVersion}`);\n info.push(`APP: ${data.streamPath}${data.streamApp}`);\n } else {\n info.push(ssInfo);\n }\n info.push(`Polling: ${instance.pollingUrl}`);\n info.push(`WS: ${instance.wsUrl}`);\n return info.join('<br>');\n },\n);\nexport const selectLoaderCommands = createSelector(\n unrealFeature.selectLoaderCommands,\n (loaderCommands) => loaderCommands,\n);\nexport const selectCommandsInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => loaderCommands.commandsInProgress.length,\n);\nexport const selectCommandProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => {\n if (loaderCommands.totalCommandsStarted > 0) {\n return (\n loaderCommands.totalCommandsCompleted /\n loaderCommands.totalCommandsStarted\n );\n }\n return 0;\n },\n);\nexport const selectLastCommandInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) =>\n loaderCommands.commandsInProgress?.length\n ? loaderCommands.commandsInProgress[\n loaderCommands.commandsInProgress.length - 1\n ]\n : null,\n);\n/**\n * Returns Scene load progress as a float value in between 0-1\n */\nexport const selectTotalProgress = createSelector(\n unrealFeature.selectStatusPercentSignallingServer,\n selectCommandProgress,\n unrealFeature.selectAwsInstance,\n (statusPercentSignallingServer, commandProgress, signalingServer) => {\n /**\n * Set 20% immediately when signalingServer?.signalingUrl is available\n * Up to 19% of the progress is reserved for signaling server polling\n */\n const splitPoint = signalingServer?.wsUrl ? 0.2 : 0.19;\n const percentSignaling = lerp(\n 0.001,\n splitPoint,\n (statusPercentSignallingServer || 0) / 100,\n );\n const percentRest = lerp(0, 1 - splitPoint, commandProgress);\n return clampf(0, 1, percentSignaling + percentRest);\n },\n);\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport {\n selectFreezeFrameCombinedDataUrl,\n selectFreezeFrameProgressMessageFromVideo,\n} from '../../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'app-freeze-frame',\n templateUrl: './freeze-frame.component.html',\n styleUrls: ['./freeze-frame.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FreezeFrameComponent {\n #store = inject(Store);\n\n freezeFrameProgressMessageFromVideo = toSignal(\n this.#store.select(selectFreezeFrameProgressMessageFromVideo),\n );\n combinedFreeze = toSignal(\n this.#store.select(selectFreezeFrameCombinedDataUrl),\n );\n}\n","<div class=\"freeze-images\">\n @if (combinedFreeze()) {\n <img\n [src]=\"combinedFreeze()\"\n class=\"videoStillImage\"\n alt=\"freezeFrameImage\"\n />\n }\n\n @if (freezeFrameProgressMessageFromVideo()) {\n <div class=\"progress-status\">\n {{ freezeFrameProgressMessageFromVideo() }}\n </div>\n }\n</div>\n","import type { Quality } from '../interfaces/quality.interface';\nimport { calculateMedian, clampf } from '@3dsource/utils';\nimport type { FilterSettings } from '../components/low-bandwidth-indicator/DataFlowConstants';\n\nexport interface DataFlowCheckResult {\n isDropDetected: boolean;\n dropPercentage: number;\n activeMedian: number;\n quality: Quality;\n message: string;\n dataHistory: number[];\n config: {\n yellowFlagThresholdPercentage: number;\n redFlagThresholdPercentage: number;\n historyBufferLength: number;\n splitPoint: number;\n };\n}\n\nexport class DataFlowMonitor {\n protected dataHistory: number[] = [];\n\n /**\n * Initializes the DataFlowMonitor monitor.\n * @param yellowFlagThresholdPercentage - The percentage drop to trigger a YELLOW warning (default: 15%).\n * @param redFlagThresholdPercentage - The percentage drop to trigger a RED warning (default: 30%).\n * @param historyBufferLength - buffer length (default: 100).\n * @param splitPoint - The point at which to split the history buffer into two halves (default: 0.5).\n */\n constructor(\n protected yellowFlagThresholdPercentage = 15,\n protected redFlagThresholdPercentage = 30,\n protected historyBufferLength = 100,\n protected splitPoint = 0.5,\n ) {}\n\n reset() {\n this.dataHistory.length = 0;\n }\n\n config(data: FilterSettings) {\n this.reset();\n this.yellowFlagThresholdPercentage = data.yellowFlag;\n this.redFlagThresholdPercentage = data.redFlag;\n }\n\n /**\n * Adds a new bitrate measurement and checks for significant drops.\n * @param currentValue - The current bitrate in kbps.\n * @returns BitrateCheckResult indicating if a drop was detected.\n */\n addValue(currentValue: number): DataFlowCheckResult {\n if (isNaN(currentValue) || currentValue < 1) {\n return {} as DataFlowCheckResult;\n }\n const historyLength = this.dataHistory.length;\n\n if (historyLength > this.historyBufferLength) {\n this.dataHistory.shift();\n }\n this.dataHistory.push(currentValue);\n\n if (historyLength < this.historyBufferLength) {\n this.dataHistory.length = this.historyBufferLength;\n this.dataHistory.fill(currentValue, 0, this.historyBufferLength);\n }\n\n const splitIndex = Math.floor(historyLength * this.splitPoint);\n const firstHalf = this.dataHistory.slice(0, splitIndex);\n const secondHalf = this.dataHistory.slice(splitIndex);\n const firstHalfMedian = calculateMedian(firstHalf);\n const secondHalfMedian = calculateMedian(secondHalf);\n\n const dropPercentage = clampf(\n 0,\n 100,\n ((firstHalfMedian - secondHalfMedian) / firstHalfMedian) * 100,\n );\n\n const isRedFlag = dropPercentage >= this.redFlagThresholdPercentage;\n if (dropPercentage >= this.yellowFlagThresholdPercentage) {\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: true,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: isRedFlag ? 'red' : 'orange',\n message: `Significant flow drop detected: ${dropPercentage.toFixed(2)}% (from ${firstHalfMedian} to ${secondHalfMedian})`,\n };\n }\n\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: false,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: 'lime',\n message: 'Stable flow',\n };\n }\n}\n","import { DataFlowMonitor } from '../../helpers/DataFlowMonitor';\n\nexport interface FilterSettings {\n /**\n * Minimum number of kilobits per second to trigger low bandwidth\n */\n minimumBitrate: number;\n /**\n * Amount of a percentage drop to trigger a yellow warning\n */\n\n yellowFlag: number;\n\n /**\n * Amount of a percentage drop to trigger a red warning\n */\n redFlag: number;\n\n /**\n * Minimum number of frames per second to trigger low bandwidth\n */\n minimumFps: number;\n\n /**\n * Time to wait before checking if we can switch to low bandwidth\n */\n monitoringDelayTime: number;\n\n // initial guess in kbps\n initialBitrateEstimate: number;\n\n // initial error covariance\n initialErrorCovariance: number;\n\n // Q: how much we expect the bitrate to change between measurements\n processNoise: number;\n\n // R: variance of measurement noise\n measurementNoise: number;\n\n panelOpen: boolean;\n}\n\n/**\n * Default LBM Filter Parameters\n */\nexport const DefaultFilterModel: FilterSettings = {\n minimumBitrate: 1600,\n yellowFlag: 30,\n redFlag: 50,\n minimumFps: 5,\n monitoringDelayTime: 5000,\n initialBitrateEstimate: 1600,\n initialErrorCovariance: 1,\n processNoise: 3,\n measurementNoise: 500,\n panelOpen: false,\n} as const;\n\n/**\n * Global LBM Filter Parameters\n */\nexport const FilterModel = { ...DefaultFilterModel };\n\n/**\n * Bitrate Monitor Static Class\n */\nexport const BITRATE_MONITOR = new DataFlowMonitor(\n FilterModel.yellowFlag,\n FilterModel.redFlag,\n 20,\n);\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgIf } from '@angular/common';\nimport { SourceIconComponent } from '@source/ui-sdk/source-icon';\nimport { Logger, Signal, Truthy } from '@3dsource/utils';\nimport { DefaultFilterModel, FilterModel } from '../DataFlowConstants';\n\n@Component({\n selector: 'app-filter-settings',\n templateUrl: './filter-settings.component.html',\n styleUrls: ['./filter-settings.component.scss'],\n imports: [FormsModule, NgIf, SourceIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterSettingsComponent implements OnInit {\n private readonly storageKey = 'LBMFilterSettings';\n readonly defaultFilterModel = { ...DefaultFilterModel };\n settings = { ...DefaultFilterModel };\n\n ngOnInit(): void {\n const savedSettings = localStorage.getItem(this.storageKey);\n if (savedSettings) {\n this.dispatch(JSON.parse(savedSettings));\n }\n }\n\n togglePanel() {\n this.settings.panelOpen = !this.settings.panelOpen;\n this.saveSettings();\n }\n\n saveSettings() {\n const valid = Object.entries(this.settings).reduce((acc, [key, value]) => {\n return Truthy(value) ? { ...acc, [key]: value } : acc;\n }, {});\n this.dispatch({ ...DefaultFilterModel, ...valid });\n }\n\n dispatch(model: typeof DefaultFilterModel) {\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(model));\n } catch (e) {\n Logger.error('Storage not available, Error saving filter settings:', e);\n }\n Object.assign(this.settings, model);\n Object.assign(FilterModel, model);\n Signal.broadcast('setKalmanParams', model);\n }\n\n reset() {\n this.dispatch({\n ...DefaultFilterModel,\n panelOpen: this.settings.panelOpen,\n });\n }\n}\n","<!-- filter-settings.component.html -->\n<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">\n <src-icon [name]=\"'settings'\" />\n </button>\n\n <div *ngIf=\"settings.panelOpen\" class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n</div>\n","import type { PipeTransform } from '@angular/core';\nimport { inject, Pipe } from '@angular/core';\nimport type {\n SafeHtml,\n SafeResourceUrl,\n SafeScript,\n SafeStyle,\n SafeUrl,\n} from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safe',\n})\nexport class SafePipe implements PipeTransform {\n private sanitizer = inject(DomSanitizer);\n\n transform(\n value: any,\n type: string,\n ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {\n if (!value) {\n return value;\n }\n\n switch (type) {\n case 'html':\n return this.sanitizer.bypassSecurityTrustHtml(value);\n case 'style':\n return this.sanitizer.bypassSecurityTrustStyle(value);\n case 'script':\n return this.sanitizer.bypassSecurityTrustScript(value);\n case 'url':\n return this.sanitizer.bypassSecurityTrustUrl(value);\n case 'resourceUrl':\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\n default:\n throw new Error(`Invalid safe type specified: ${type}`);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { SafePipe } from '../../pipes/safe-html.pipe';\nimport { SourceButtonComponent } from '@source/ui-sdk/source-button';\nimport { DialogRef } from '@angular/cdk/dialog';\nimport { SourceRoundButtonComponent } from '@source/ui-sdk/source-round-button';\n\n@Component({\n selector: 'app-low-bandwidth-modal',\n templateUrl: './low-bandwidth-modal.component.html',\n styleUrls: ['./low-bandwidth-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SafePipe, SourceButtonComponent, SourceRoundButtonComponent],\n})\nexport class LowBandwidthModalComponent {\n dialogRef = inject(DialogRef);\n close(value?: boolean) {\n this.dialogRef.close(value || false);\n }\n}\n","<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n <src-round-button\n (onClick)=\"close()\"\n [icon]=\"'close_small'\"\n [data-testid]=\"'close'\"\n class=\"src-modal__close\"\n />\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n colorScheme=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n","export class LatencyTimings {\n TestStartTimeMs!: number | null;\n UEReceiptTimeMs!: number | null;\n UEEncodeMs!: number | null;\n UECaptureToSendMs!: number | null;\n UETransmissionTimeMs!: number | null;\n BrowserReceiptTimeMs!: number | null;\n FrameDisplayDeltaTimeMs!: number | null;\n\n Reset() {\n this.TestStartTimeMs = null;\n this.UEReceiptTimeMs = null;\n this.UEEncodeMs = null;\n this.UECaptureToSendMs = null;\n this.UETransmissionTimeMs = null;\n this.BrowserReceiptTimeMs = null;\n this.FrameDisplayDeltaTimeMs = null;\n }\n\n SetUETimings(UETimings: any) {\n this.UEReceiptTimeMs = UETimings.ReceiptTimeMs;\n this.UEEncodeMs = UETimings.EncodeMs;\n this.UECaptureToSendMs = UETimings.CaptureToSendMs;\n this.UETransmissionTimeMs = UETimings.TransmissionTimeMs;\n this.BrowserReceiptTimeMs = Date.now();\n this.OnAllLatencyTimingsReady(this);\n }\n\n SetFrameDisplayDeltaTime(DeltaTimeMs: number) {\n if (this.FrameDisplayDeltaTimeMs == null) {\n this.FrameDisplayDeltaTimeMs = Math.round(DeltaTimeMs);\n this.OnAllLatencyTimingsReady(this);\n }\n }\n\n OnAllLatencyTimingsReady(Timings: any) {}\n}\n","import { share, skip } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { inject } from '@angular/core';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { filter } from 'rxjs/operators';\nimport { Falsy } from '@3dsource/utils';\n\nexport class SubService {\n store = inject(Store);\n\n disconnect$ = this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), share());\n}\n","import { InjectionToken } from '@angular/core';\nimport type { UnrealInitialConfig } from '../interfaces/initial-config';\n\nexport const UNREAL_CONFIG = new InjectionToken<UnrealInitialConfig>(\n 'Unreal Initial Configuration',\n);\n","import { inject, Injectable } from '@angular/core';\nimport { filter } from 'rxjs/operators';\nimport type { TelemetryType } from '../interfaces/TelemetryEvent';\nimport { timer } from 'rxjs';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { generateUuid, Truthy } from '@3dsource/utils';\nimport { HttpClient } from '@angular/common/http';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\n\n@Injectable()\nexport class CommandTelemetryService {\n private readonly appId: string = 'metabox-telemetry';\n private commandsSent: Record<string, CommandToSend> = {};\n private exileTimout = 60000;\n private pollingTime = 5000;\n private commandSequenceNumber = 0;\n\n /**\n * The time the telemetry service was started.\n * Initialized at a moment when connectToSignaling() was called.\n * @private\n */\n private startTime!: number;\n private lastTime!: number;\n private uuid!: string;\n private viewId!: string;\n private readonly sessionId: string;\n private readonly userId: string;\n private payloads: Payload[] = [];\n\n private readonly httpClient = inject(HttpClient);\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG);\n\n constructor() {\n this.reset();\n this.sessionId = sessionStorage.getItem(this.appId) || this.uuid;\n this.userId = localStorage.getItem(this.appId) || this.uuid;\n sessionStorage.setItem(this.appId, this.sessionId);\n localStorage.setItem(this.appId, this.userId);\n this.start();\n }\n\n private get timeNow() {\n return Date.now();\n }\n\n private get sessionTime() {\n return this.timeNow - this.startTime;\n }\n\n private get canSkipSending() {\n return !(this.timeNow - this.lastTime > this.pollingTime * 2);\n }\n\n decorate(funcToDecorate: IToBeDecorated) {\n this.listenCallbacks();\n return this.wrapper.bind(this, funcToDecorate);\n }\n\n private start() {\n fromSignal(UnrealInternalSignalEvents.TelemetryStart).subscribe(\n ({ externalId }) => {\n this.trackStartCommand(`EXT-${externalId}`);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryStop).subscribe(\n ({ externalId, payload }) => {\n const trackingId = `EXT-${externalId}`;\n this.trackStopCommand(trackingId, undefined, payload?.multi, payload);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryReset).subscribe(() => {\n this.reset();\n });\n\n timer(0, this.pollingTime).subscribe(() => {\n this.send(this.payloads);\n });\n }\n\n private reset() {\n this.uuid = generateUuid();\n this.commandSequenceNumber = 0;\n this.viewId = this.uuid;\n this.startTime = this.timeNow;\n this.payloads.length = 0;\n this.commandsSent = {};\n }\n\n private trackStartCommand(trackingId: string) {\n const out = {\n command: trackingId,\n trackingId,\n };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer('commandSent', out, timers);\n this.trackTime(out);\n }\n\n private trackStopCommand(\n trackingId: string,\n timeStampsRaw?: TimeStampsRaw,\n multi = false,\n response: any = {},\n ) {\n const commandResponse = this.commandsSent[trackingId];\n if (!commandResponse) {\n return;\n }\n const totalRoundTripTime = this.timeNow - commandResponse.timeStampJs;\n\n /**\n * Time between telemetry was reset and command was sent.\n */\n const commandSentJsTime = commandResponse.timeStampJs - this.startTime;\n let unrealTimers = {};\n\n const t = timeStampsRaw?.timeStampCommand;\n if (t) {\n unrealTimers = {\n unrealRoundTripTime:\n t.onCompleteCommand.timestamp - t.onRequestCommand.timestamp,\n\n unrealExecutionDuration:\n t.onCompleteCommand.timestamp - t.onStartCommand.timestamp,\n\n timeDiffRequest:\n t.onRequestCommand.timestamp - commandResponse.timeStampJs,\n\n timeDiffCallBack: this.timeNow - t.onCompleteCommand.timestamp,\n };\n }\n\n const timers = {\n sessionElapsedTime: this.sessionTime,\n commandSentJsTime,\n totalRoundTripTime,\n ...unrealTimers,\n } as ComputedTimers;\n\n this.pushStatToBuffer(\n 'commandStop',\n { ...commandResponse.command, response },\n timers,\n timeStampsRaw,\n );\n if (!multi) {\n delete this.commandsSent[trackingId];\n }\n }\n\n private pushStatToBuffer(\n type: TelemetryType,\n commandContent: any,\n computedTimers: ComputedTimers,\n timeStampsRaw?: TimeStampsRaw,\n ) {\n this.pushData({\n type,\n commandSequenceNumber: this.commandSequenceNumber++,\n commandContent,\n timeStampsRaw,\n computedTimers,\n });\n }\n\n private trackTime(command: any) {\n this.commandsSent[command.trackingId] = {\n timeStampJs: this.timeNow,\n command,\n };\n }\n\n private send(payload: Payload[]) {\n if (payload.length === 0 || (this.canSkipSending && payload.length < 10)) {\n return;\n }\n this.lastTime = this.timeNow;\n const out: TelemetryBatch = {\n appId: this.appId,\n sessionId: this.sessionId,\n viewId: this.viewId,\n userId: this.userId,\n ua: navigator.userAgent,\n timeStamp: new Date(this.timeNow).toString(),\n href: location.href,\n resolution: {\n width: window.screen.width,\n height: window.screen.height,\n pixelRatio: window.devicePixelRatio,\n },\n payload,\n };\n const lastIndex = payload[payload.length - 1].commandSequenceNumber;\n this.httpClient\n .post(this.unrealInitialConfig.commandTelemetryReceiver, out)\n .subscribe(() => {\n this.payloads = this.payloads.filter(\n (p) => p.commandSequenceNumber > lastIndex,\n );\n });\n }\n\n /**\n * Listens for Unreal Engine callbacks.\n * Subscribes to the Unreal Engine event loop back and filters out events that do not have a tracking ID.\n * When a callback with a tracking ID is received,\n * it stops tracking the time for that command and filters out commands\n * that have exceeded the timeout limit.\n */\n private listenCallbacks() {\n fromSignal(UnrealInternalSignalEvents.UnrealCallback)\n .pipe(\n filter(({ json }) => {\n const callback =\n 'commandCallback' in json ? json.commandCallback : json;\n\n return Truthy(callback?.trackingId);\n }),\n )\n .subscribe(({ json }: any) => {\n const callback = json.commandCallback;\n const timeStampsRaw = json.timeStamp;\n const trackingId = callback?.trackingId || '';\n\n this.trackStopCommand(trackingId, timeStampsRaw);\n this.removeExileCommands();\n });\n }\n\n private pushData(payload: Payload) {\n this.payloads.push(payload);\n }\n\n /**\n * Removes commands that have exceeded the timeout limit.\n * Iterates over all the commands sent and checks if the difference between the current time\n * and the time the command was sent is greater than the timeout limit.\n * If it is, the command is marked for deletion.\n * After checking all commands, those marked for deletion are removed from the commands sent.\n * This method is used to ensure that commands that are not responded to within a certain time frame\n * do not remain in the commandsSent object indefinitely, which could lead to memory leaks over time.\n */\n private removeExileCommands() {\n const time: number = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries<CommandToSend>(this.commandsSent).forEach(\n ([trackingId, { timeStampJs }]) => {\n if (time - timeStampJs > this.exileTimout) {\n markForDelete.push(trackingId);\n }\n },\n );\n\n markForDelete.forEach((trackingId) => {\n delete this.commandsSent[trackingId];\n });\n }\n\n /**\n * Wraps the provided function with telemetry tracking.\n * Generates a unique tracking ID and adds it to the data object.\n * Pushes the command sent to the payloads with the tracking ID.\n * Starts tracking the time for the command.\n * Finally, calls the provided function with the modified data object.\n *\n * @param {IToBeDecorated} funcToDecorate - The function to be decorated with telemetry tracking.\n * @param {any} data - The data object to be passed to the function. It will be augmented with a unique tracking ID.\n */\n private wrapper(funcToDecorate: IToBeDecorated, data: any) {\n const out = { ...data, trackingId: generateUuid() };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer(\n 'commandSent',\n {\n ...out,\n trackingId: `${out.trackingId}`,\n },\n timers,\n );\n this.trackTime(out);\n funcToDecorate(out);\n }\n}\n\ntype IToBeDecorated = (data: any) => unknown;\n\ninterface TelemetryBatch {\n appId: string;\n sessionId: string;\n viewId: string;\n userId: string;\n ua: string;\n timeStamp: string;\n href: string;\n payload: Payload[];\n resolution: {\n width: number;\n height: number;\n pixelRatio: number;\n };\n}\n\ninterface Payload {\n type: TelemetryType;\n commandSequenceNumber: number;\n commandContent: any;\n timeStampsRaw?: TimeStampsRaw;\n computedTimers: ComputedTimers;\n}\n\ninterface TimeStampsRaw {\n timeStampPak: TimeStampPakCollection;\n timeStampCommand: TimeStampCommandCollection;\n}\n\ninterface TimeStampPakCollection {\n onLoadPak: TimeStampMemory;\n onRenderPak: TimeStampMemory;\n onSequencePak: TimeStampMemory;\n onSpawnPak: TimeStampMemory;\n}\n\ninterface TimeStampMemory {\n timestamp: number;\n ram: number;\n vRam: number;\n}\n\ninterface TimeStampCommandCollection {\n onRequestCommand: TimeStampMemory;\n onStartCommand: TimeStampMemory;\n onCompleteCommand: TimeStampMemory;\n}\n\ninterface ComputedTimers {\n unrealRoundTripTime: number;\n totalRoundTripTime: number;\n unrealExecutionDuration: number;\n sessionElapsedTime: number;\n timeDiffRequest: number;\n timeDiffCallBack: number;\n commandSentJsTime: number;\n}\n\nexport function TelemetryStart(externalId: string) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStart, { externalId });\n}\n\nexport function TelemetryStop(externalId: string, payload?: any) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStop, { externalId, payload });\n}\n\nexport function ResetTelemetry() {\n sendSignal(UnrealInternalSignalEvents.TelemetryReset);\n}\n\ninterface CommandToSend {\n timeStampJs: number;\n command: { trackingId: string };\n}\n","import { Injectable } from '@angular/core';\nimport { fromEvent, share, Subject, tap } from 'rxjs';\nimport { filter, first, map, takeUntil } from 'rxjs/operators';\nimport {\n destroyRemoteConnections,\n setDataChannelConnected,\n setErrorMessage,\n setStatusMessage,\n} from '../store/unreal.actions';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { TelemetryStart, TelemetryStop } from './command-telemetry.service';\nimport type { ConfigMessage } from '../interfaces/SignalingMessage';\nimport { DisconnectReason } from '../interfaces/disconnect-reasons';\n\n@Injectable()\nexport class WebRtcPlayerService extends SubService {\n pcClient!: RTCPeerConnection | null;\n onAudioTrack$ = new Subject<MediaStream>();\n onVideoTrack$ = new Subject<MediaStream>();\n onDataChannelMessage$ = new Subject<number[]>();\n onWebRtcCandidate$ = new Subject<RTCIceCandidate>();\n onWebRtcOffer$ = new Subject<RTCSessionDescriptionInit>();\n\n private cfg: RTCConfiguration = {};\n private useMic = false;\n private forceTURN = false;\n private preferSFU = false;\n private autoPlayAudio = true;\n private startVideoMuted = true;\n private forceMonoAudio = false;\n private forceMaxBundle = false;\n private dcClient!: RTCDataChannel | null;\n private sdpConstraints!: RTCOfferOptions;\n private dataChannelOptions!: { ordered: boolean };\n private webRtcErrorTimeout!: ReturnType<typeof setTimeout>;\n\n async createWebRtcOffer(): Promise<void> {\n Logger.info('Creating offer');\n let offer: void;\n try {\n clearTimeout(this.webRtcErrorTimeout);\n offer = await this.createOffer(this.cfg);\n this.webRtcErrorTimeout = setTimeout(() => {\n if (this.pcClient?.connectionState?.match(/connecting|failed/gi)) {\n this.dispatchWebRtcError('WebRTCError: Timeout');\n }\n }, 10000);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n this.dispatchWebRtcError('WebRTCError: Offer Error');\n }\n\n return offer;\n }\n\n private dispatchWebRtcError(message: string) {\n Logger.error(message);\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebRTCError',\n message,\n }),\n );\n }\n\n private async createOffer(config: RTCConfiguration): Promise<void> {\n this.closePC();\n this.pcClient = new RTCPeerConnection(config);\n\n TelemetryStart('Browser ICE gathering');\n TelemetryStart('Browser ICE connection');\n TelemetryStart('Signaling state change');\n\n fromEvent(this.pcClient, 'signalingstatechange')\n .pipe(\n map(() => this.pcClient?.signalingState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Signaling state change] |', state, '|');\n TelemetryStop('Signaling state change', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'iceconnectionstatechange')\n .pipe(\n map(() => this.pcClient?.iceConnectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE connection] |', state, '|');\n TelemetryStop('Browser ICE connection', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'icegatheringstatechange')\n .pipe(\n map(() => this.pcClient?.iceGatheringState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE gathering] |', state, '|');\n TelemetryStop('Browser ICE gathering', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'connectionstatechange')\n .pipe(\n map(() => this.pcClient?.connectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[RTCPeerConnection state] |', state, '|');\n });\n\n fromEvent<RTCPeerConnectionIceEvent>(this.pcClient, 'icecandidate')\n .pipe(\n map((e: RTCPeerConnectionIceEvent) => e.candidate),\n filter(Truthy),\n tap((candidate: RTCIceCandidate) =>\n Logger.info(\n '[Browser ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n ),\n ),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onWebRtcCandidate$.next(data));\n\n fromEvent<RTCDataChannelEvent>(this.pcClient, 'datachannel')\n .pipe(\n tap(() =>\n Logger.info(\n 'Data channel created for us by browser as we are a receiving peer.',\n ),\n ),\n map((e: RTCDataChannelEvent) => e.channel),\n takeUntil(this.disconnect$),\n )\n .subscribe((datachannel) => {\n this.dcClient = this.setupDataChannelCallbacks(datachannel);\n });\n\n const onTrack$ = fromEvent<RTCTrackEvent>(this.pcClient, 'track').pipe(\n filter((e) => !!e.track),\n tap((e) =>\n Logger.info(\n 'Got track - ' +\n e.track.kind +\n ' id=' +\n e.track.id +\n ' readyState=' +\n e.track.readyState,\n ),\n ),\n share(),\n );\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'audio'),\n map((e) => e.streams[0]),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onAudioTrack$.next(data));\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'video'),\n map((e) => e.streams[0]),\n tap(() => Logger.info('Set video source from video track ontrack.')),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onVideoTrack$.next(data));\n\n await this.setupTransceiversAsync(this.pcClient);\n this.dcClient = this.createDataChannel(\n this.pcClient,\n 'cirrus',\n this.dataChannelOptions,\n );\n\n this.disconnect$.pipe(first()).subscribe(() => {\n this.closePC();\n });\n\n await this.handleCreateOffer();\n }\n\n createDataChannel(\n pc: RTCPeerConnection,\n label: string,\n options: RTCDataChannelInit,\n ) {\n // This is the primary data channel code path when we are \"offering\"\n Logger.info(`[DATACHANNEL] Creating datachannel primary (${label})...`);\n const datachannel = pc.createDataChannel(label, options);\n return this.setupDataChannelCallbacks(datachannel);\n }\n\n private async setupTransceiversAsync(pc: RTCPeerConnection): Promise<void> {\n const hasTransceivers = pc.getTransceivers().length > 0;\n\n // Setup a transceiver for getting UE video\n pc.addTransceiver('video', { direction: 'recvonly' });\n\n // Setup a transceiver for sending mic audio to UE and receiving audio from UE\n if (!this.useMic) {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n } else {\n const audioSendOptions = this.useMic\n ? {\n autoGainControl: false,\n channelCount: 1,\n echoCancellation: false,\n latency: 0,\n noiseSuppression: false,\n sampleRate: 48000,\n sampleSize: 16,\n volume: 1.0,\n }\n : false;\n\n // Note using mic on android chrome requires SSL or chrome://flags/ \"unsafely-treat-insecure-origin-as-secure\"\n const stream = await navigator.mediaDevices.getUserMedia({\n video: false,\n audio: audioSendOptions,\n });\n if (stream) {\n if (hasTransceivers) {\n for (const transceiver of pc.getTransceivers()) {\n if (\n transceiver &&\n transceiver.receiver &&\n transceiver.receiver.track &&\n transceiver.receiver.track.kind === 'audio'\n ) {\n for (const track of stream.getTracks()) {\n // eslint-disable-next-line eqeqeq\n if (track.kind && track.kind == 'audio') {\n transceiver.sender.replaceTrack(track);\n transceiver.direction = 'sendrecv';\n }\n }\n }\n }\n } else {\n for (const track of stream.getTracks()) {\n // eslint-disable-next-line eqeqeq\n if (track.kind && track.kind == 'audio') {\n pc.addTransceiver(track, { direction: 'sendrecv' });\n }\n }\n }\n } else {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n }\n }\n }\n\n private setupDataChannelCallbacks(\n datachannel: RTCDataChannel,\n ): RTCDataChannel | null {\n try {\n TelemetryStart('DataChannel Connection');\n // Inform browser we would like binary data as an ArrayBuffer (FF chooses Blob by default!)\n datachannel.binaryType = 'arraybuffer';\n\n fromEvent(datachannel, 'close')\n .pipe(first())\n .subscribe((e) => {\n Logger.warn(\n `[DATACHANNEL] Data channel disconnected: ${datachannel.label}(${datachannel.id})`,\n e,\n );\n\n this.store.dispatch(\n destroyRemoteConnections({\n disconnectReason: DisconnectReason.dataChannelClosed,\n }),\n );\n });\n\n fromEvent(datachannel, 'error')\n .pipe(takeUntil(this.disconnect$))\n .subscribe((e) => {\n const message = `[DATACHANNEL] Data channel error: ${datachannel.label}(${datachannel.id})`;\n Logger.error(message, e);\n });\n\n fromEvent(datachannel, 'open')\n .pipe(\n tap(() => {\n Logger.info(\n `[DATACHANNEL] Data channel connected: ${datachannel.label}(${datachannel.id})`,\n );\n }),\n takeUntil(this.disconnect$),\n )\n .subscribe(() => {\n TelemetryStop('DataChannel Connection');\n this.onDataChannelConnected();\n });\n\n fromEvent<MessageEvent>(datachannel, 'message')\n .pipe(\n map((e: MessageEvent) => e.data),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onDataChannelMessage$.next(data));\n\n return datachannel;\n } catch (e) {\n Logger.warn('[DATACHANNEL] Datachannel setup caused an exception: ', e);\n return null;\n }\n }\n\n private onDataChannelConnected() {\n let text = 'Session connected, video stream starting.';\n if (navigator.userAgent.includes('Firefox')) {\n text +=\n '\\n If you are experiencing connection problems please try Google Chrome';\n }\n this.store.dispatch(setStatusMessage({ message: text }));\n this.store.dispatch(setDataChannelConnected({ value: true }));\n }\n\n private async handleCreateOffer(): Promise<void> {\n try {\n const offer = await this.pcClient!.createOffer(this.sdpConstraints);\n this.mungeSDP(offer);\n this.pcClient?.setLocalDescription(offer);\n this.onWebRtcOffer$.next(offer);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n Logger.error(\"Couldn't create offer\");\n }\n }\n\n receiveAnswer(answer: RTCSessionDescriptionInit) {\n this.pcClient?.setRemoteDescription(answer);\n }\n\n handleCandidateFromServer(iceCandidate: RTCIceCandidate) {\n try {\n const candidate = new RTCIceCandidate(iceCandidate);\n Logger.info(\n '[Unreal ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n\n // if forcing TURN, reject any candidates not relay\n if (this.forceTURN) {\n // check if no relay address is found, if so, we are assuming it means no TURN server\n if (candidate.candidate.indexOf('relay') < 0) {\n Logger.warn(\n 'Dropping candidate because it was not TURN relay.',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n return;\n }\n }\n this.pcClient?.addIceCandidate(candidate).catch(function () {\n // Logger.error('Failed to add ICE candidate', e);\n });\n } catch (e) {\n Logger.error('Error handleCandidateFromServer', e);\n }\n }\n\n mungeSDP(offer: RTCSessionDescriptionInit): void {\n let audioSDP = '';\n\n // set max bitrate to highest bitrate Opus supports\n audioSDP += 'maxaveragebitrate=510000;';\n\n if (this.useMic) {\n // set the max capture rate to 48khz (so we can send high quality audio from mic)\n audioSDP += 'sprop-maxcapturerate=48000;';\n }\n\n // Force mono or stereo based on whether ?forceMono was passed or not\n audioSDP += this.forceMonoAudio\n ? 'sprop-stereo=0;stereo=0;'\n : 'sprop-stereo=1;stereo=1;';\n\n // enable in-band forward error correction for opus audio\n audioSDP += 'useinbandfec=1';\n\n // We use the line 'useinbandfec=1' (which Opus uses) to set our Opus specific audio parameters.\n offer.sdp = offer.sdp?.replace('useinbandfec=1', audioSDP);\n }\n\n /**\n * Closes existing PeerConnection\n */\n closePC(): void {\n if (this.pcClient) Logger.warn('Closing existing PeerConnection');\n this.pcClient?.close();\n this.pcClient = null;\n }\n\n canSend() {\n return this.dcClient && this.dcClient.readyState === 'open';\n }\n\n send(data: ArrayBuffer): void {\n if (this.canSend()) {\n this.dcClient!.send(data);\n } else {\n throw new Error('data channel is not prepared!');\n }\n }\n\n setConfig(parOptions: ConfigMessage = {} as ConfigMessage): void {\n const urlParams = new URLSearchParams(window.location.search);\n\n //**********************\n //Config setup\n //**********************\n this.cfg =\n typeof parOptions.peerConnectionOptions !== 'undefined'\n ? parOptions.peerConnectionOptions\n : {};\n //this.cfg.sdpSemantics = 'unified-plan';\n\n // If this is true in Chrome 89+ SDP is sent that is incompatible with UE Pixel Streaming 4.26 and below.\n // However 4.27 Pixel Streaming does not need this set to false as it supports `offerExtmapAllowMixed`.\n // tdlr; uncomment this line for older versions of Pixel Streaming that need Chrome 89+.\n //this.cfg.offerExtmapAllowMixed = false;\n\n this.forceTURN = urlParams.has('ForceTURN');\n if (this.forceTURN) {\n Logger.info(\n 'Forcing TURN usage by setting ICE Transport Policy in peer connection config.',\n );\n this.cfg.iceTransportPolicy = 'relay';\n }\n\n this.cfg.bundlePolicy = 'balanced';\n this.forceMaxBundle = urlParams.has('ForceMaxBundle');\n if (this.forceMaxBundle) {\n this.cfg.bundlePolicy = 'max-bundle';\n }\n\n //**********************\n //Variables\n //**********************\n this.pcClient = null;\n this.dcClient = null;\n\n this.sdpConstraints = {\n offerToReceiveAudio: false, //Note: if you don't need audio you can get improved latency by turning this off.\n offerToReceiveVideo: true,\n };\n\n // See https://www.w3.org/TR/webrtc/#dom-rtcdatachannelinit for values (this is needed for Firefox to be consistent with Chrome.)\n this.dataChannelOptions = { ordered: true };\n\n // This is useful if the video/audio needs to autoplay (without user input) as browsers do not allow autoplay non-muted of sound sources without user interaction.\n this.startVideoMuted =\n typeof parOptions?.['startVideoMuted'] !== 'undefined'\n ? !!parOptions?.['startVideoMuted']\n : false;\n this.autoPlayAudio =\n typeof parOptions?.['autoPlayAudio'] !== 'undefined'\n ? !!parOptions?.['autoPlayAudio']\n : true;\n\n // To force mono playback of WebRTC audio\n this.forceMonoAudio = urlParams.has('ForceMonoAudio');\n if (this.forceMonoAudio) {\n Logger.info(\n 'Will attempt to force mono audio by munging the sdp in the browser.',\n );\n }\n\n // To enable mic in browser use SSL/localhost and have ?useMic in the query string.\n this.useMic = urlParams.has('useMic');\n if (!this.useMic) {\n Logger.info(\n 'Microphone access is not enabled. Pass ?useMic in the url to enable it.',\n );\n }\n // When ?useMic check for SSL or localhost\n const isLocalhostConnection =\n location.hostname === 'localhost' || location.hostname === '127.0.0.1';\n const isHttpsConnection = location.protocol === 'https:';\n if (this.useMic && !isLocalhostConnection && !isHttpsConnection) {\n this.useMic = false;\n Logger.error(\n 'Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access.',\n );\n Logger.error(\n \"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'\",\n );\n }\n\n // Prefer SFU or P2P connection\n this.preferSFU = urlParams.has('preferSFU');\n Logger.info(\n this.preferSFU\n ? 'The browser will signal it would prefer an SFU connection. Remove ?preferSFU from the url to signal for P2P usage.'\n : 'The browser will signal for a P2P connection. Pass ?preferSFU in the url to signal for SFU usage.',\n );\n }\n}\n","import type { Quality } from '../interfaces/quality.interface';\n\nexport function mapQpToQuality(VideoEncoderQP: number): Quality {\n const orangeQP = 26;\n const redQP = 35;\n\n let quality: Quality = 'lime';\n if (VideoEncoderQP > redQP) {\n quality = 'red';\n } else if (VideoEncoderQP > orangeQP) {\n quality = 'orange';\n }\n return quality;\n}\n","import type { FilterSettings } from '../components/low-bandwidth-indicator/DataFlowConstants';\n\nexport class KalmanFilter1D {\n private estimate: number;\n private uncertainty: number;\n private processNoise: number;\n private measurementNoise: number;\n\n /**\n * @param initialEstimate Initial guess of the state.\n * @param initialUncertainty Initial uncertainty in the guess.\n * @param processNoise Process variance (Q) representing model uncertainty.\n * @param measurementNoise Measurement variance (R) representing noise in measurements.\n */\n constructor(\n initialEstimate: number,\n initialUncertainty: number,\n processNoise: number,\n measurementNoise: number,\n ) {\n this.estimate = initialEstimate;\n this.uncertainty = initialUncertainty;\n this.processNoise = processNoise;\n this.measurementNoise = measurementNoise;\n }\n\n /**\n * Incorporates a new measurement and returns the updated estimate.\n * @param measurement The new measurement value.\n */\n update(measurement: number): number {\n // === Prediction Step ===\n // For a constant model, the predicted state is the previous estimate.\n const predictedEstimate = this.estimate;\n // Increase the uncertainty by the process noise.\n const predictedUncertainty = this.uncertainty + this.processNoise;\n\n // === Update Step ===\n // Compute the innovation or measurement residual.\n const innovation = measurement - predictedEstimate;\n // Compute the innovation covariance.\n const innovationCovariance = predictedUncertainty + this.measurementNoise;\n // Compute the Kalman Gain.\n const kalmanGain = predictedUncertainty / innovationCovariance;\n\n // Update the estimate with the measurement, weighted by the Kalman Gain.\n this.estimate = predictedEstimate + kalmanGain * innovation;\n // Update the uncertainty.\n this.uncertainty = (1 - kalmanGain) * predictedUncertainty;\n\n return this.estimate;\n }\n\n config(data: FilterSettings) {\n const {\n initialBitrateEstimate,\n initialErrorCovariance,\n processNoise,\n measurementNoise,\n } = data;\n this.estimate = initialBitrateEstimate;\n this.uncertainty = initialErrorCovariance;\n this.processNoise = processNoise;\n this.measurementNoise = measurementNoise;\n }\n}\n","import type {\n IAggregatedStat,\n InboundVideoStats,\n} from '../interfaces/unreal-internal-signal-events.interface';\nimport { inject, Injectable } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { from, interval, share } from 'rxjs';\nimport { filter, switchMap } from 'rxjs/operators';\nimport { LatencyTimings } from '../helpers/LatencyTimings';\nimport { SubService } from './sub.service';\nimport { Signal, Truthy } from '@3dsource/utils';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { mapQpToQuality } from '../helpers/mapQpToQuality';\nimport { KalmanFilter1D } from '../helpers/KalmanFilter1D';\nimport {\n BITRATE_MONITOR,\n FilterModel,\n} from '../components/low-bandwidth-indicator/DataFlowConstants';\n\n@Injectable()\nexport class VideoStreamStatusService extends SubService {\n readonly latencyTestTimings = new LatencyTimings();\n private readonly webrtcPlayer = inject(WebRtcPlayerService);\n private aggregatedStats: InboundVideoStats = {} as InboundVideoStats;\n private VideoEncoderQP = 0;\n private kalmanFilter1D = new KalmanFilter1D(\n FilterModel.initialBitrateEstimate,\n FilterModel.initialErrorCovariance,\n FilterModel.processNoise,\n FilterModel.measurementNoise,\n );\n readonly videoStats$: Observable<IAggregatedStat> = this.aggregateStats();\n\n constructor() {\n super();\n Signal.on('setKalmanParams').subscribe((data) => {\n this.kalmanFilter1D.config(data);\n BITRATE_MONITOR.config(data);\n });\n }\n\n /**\n * Aggregate video stats and emit it as videoStats$\n */\n private aggregateStats() {\n return this.webrtcPlayer.onVideoTrack$.pipe(\n // IMPORTANT! DO NOT CHANGE THOSE NUMBERS, LBM Stats are based on those values\n switchMap(() => interval(250)),\n switchMap(() => from(this.getStats(this.webrtcPlayer.pcClient))),\n filter(Truthy),\n share(),\n );\n }\n\n setEncoder(data: any) {\n this.VideoEncoderQP = Number(new TextDecoder('utf-16').decode(data));\n }\n\n private async getStats(\n pcClient: RTCPeerConnection | null,\n ): Promise<IAggregatedStat | null> {\n if (!pcClient) {\n return null;\n }\n\n const stats = await pcClient.getStats(null);\n\n return this.generateAggregatedStatsFunction(stats);\n }\n\n private generateAggregatedStatsFunction(\n stats: RTCStatsReport,\n ): IAggregatedStat {\n const newStat: InboundVideoStats = {} as InboundVideoStats;\n\n // store each type of codec we can get stats on\n newStat.codecs = {};\n newStat.currentRoundTripTime = -1;\n\n stats.forEach((stat) => {\n // Get the inbound-rtp for video\n if (stat.type === 'inbound-rtp' && stat.kind === 'video') {\n Object.assign(newStat, stat);\n\n newStat.bytesReceivedStart =\n this.aggregatedStats && this.aggregatedStats.bytesReceivedStart\n ? this.aggregatedStats.bytesReceivedStart\n : stat.bytesReceived;\n\n newStat.framesDecodedStart =\n this.aggregatedStats && this.aggregatedStats.framesDecodedStart\n ? this.aggregatedStats.framesDecodedStart\n : stat.framesDecoded;\n\n newStat.timestampStart =\n this.aggregatedStats && this.aggregatedStats.timestampStart\n ? this.aggregatedStats.timestampStart\n : stat.timestamp;\n\n if (this.aggregatedStats && this.aggregatedStats.timestamp) {\n // Get the mimetype of the video codec being used\n if (\n stat.codecId &&\n this.aggregatedStats.codecs &&\n Object.hasOwn(this.aggregatedStats.codecs, stat.codecId)\n ) {\n newStat.videoCodec = this.aggregatedStats.codecs[stat.codecId];\n }\n\n if (this.aggregatedStats.bytesReceived) {\n // bitrate = bits received since last time / number of ms since last time\n // This is automatically in kbits (where k=1000) since time is in ms and stat we want is in seconds (so a '* 1000' then a '/ 1000' would negate each other)\n newStat.bitrate = Math.floor(\n (8 *\n (newStat.bytesReceived! - this.aggregatedStats.bytesReceived)) /\n (newStat.timestamp - this.aggregatedStats.timestamp),\n );\n }\n\n if (this.aggregatedStats.bytesReceivedStart) {\n newStat.avgBitrate = Math.floor(\n (8 *\n (newStat?.bytesReceived! -\n this.aggregatedStats.bytesReceivedStart)) /\n (newStat.timestamp - this.aggregatedStats.timestampStart),\n );\n }\n\n if (this.aggregatedStats.framesDecodedStart) {\n newStat.avgFrameRate = Math.floor(\n (newStat.framesDecoded! -\n this.aggregatedStats.framesDecodedStart) /\n ((newStat.timestamp - this.aggregatedStats.timestampStart) /\n 1000),\n );\n }\n }\n }\n\n if (\n stat.type === 'candidate-pair' &&\n Object.hasOwn(stat, 'currentRoundTripTime')\n ) {\n newStat.currentRoundTripTime = stat.currentRoundTripTime ?? 0;\n }\n\n // Store mimetype of each codec\n if (\n Object.hasOwn(newStat, 'codecs') &&\n stat.type === 'codec' &&\n stat.mimeType &&\n stat.id\n ) {\n const codecId = stat.id;\n newStat.codecs[codecId] = stat.mimeType\n .replace('video/', '')\n .replace('audio/', '');\n }\n });\n\n newStat.pixelRatio = +window.devicePixelRatio.toFixed(2);\n if (this.aggregatedStats.receiveToCompositeMs) {\n newStat.receiveToCompositeMs = this.aggregatedStats.receiveToCompositeMs;\n this.latencyTestTimings.SetFrameDisplayDeltaTime(\n this.aggregatedStats.receiveToCompositeMs,\n );\n }\n\n // Calculate duration of run\n newStat.runTime = Math.floor(\n (newStat.timestamp - newStat.timestampStart) / 1000,\n );\n newStat.kalmanBitrate = Math.floor(\n this.kalmanFilter1D.update(\n newStat.bitrate || FilterModel.initialBitrateEstimate,\n ),\n );\n\n newStat.dataFlowCheckResult = BITRATE_MONITOR.addValue(\n newStat.kalmanBitrate,\n );\n\n newStat.bitrateDrop = Math.floor(\n newStat.dataFlowCheckResult.dropPercentage,\n );\n this.aggregatedStats = newStat;\n return this.onAggregatedStats(newStat);\n }\n\n private onAggregatedStats(aggregatedStats: InboundVideoStats) {\n return {\n quality: mapQpToQuality(this.VideoEncoderQP),\n\n aggregatedStats: {\n ...aggregatedStats,\n VideoEncoderQP: this.VideoEncoderQP,\n },\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Truthy } from '@3dsource/utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DevModeService {\n get isDevMode() {\n return Truthy(localStorage.getItem('devMode'));\n }\n setDevMode(value: boolean) {\n return localStorage.setItem('devMode', value.toString());\n }\n}\n","import type { OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { filter, tap } from 'rxjs/operators';\nimport { LowBandwidthModalComponent } from '../low-bandwidth-modal/low-bandwidth-modal.component';\nimport { Store } from '@ngrx/store';\nimport { Falsy, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { changeLowBandwidth } from '../../store/unreal.actions';\nimport {\n combineLatestWith,\n concat,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n of,\n share,\n skip,\n switchMap,\n take,\n takeUntil,\n timer,\n} from 'rxjs';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport type { Quality } from '../../interfaces/quality.interface';\nimport type { DataFlowCheckResult } from '../../helpers/DataFlowMonitor';\nimport {\n BITRATE_MONITOR,\n FilterModel,\n} from '../../components/low-bandwidth-indicator/DataFlowConstants';\nimport { DevModeService } from '../..//services/dev-mode.service';\nimport { FilterSettingsComponent } from '../../components/low-bandwidth-indicator/filter-settings/filter-settings.component';\n\n@Component({\n selector: 'app-low-bandwidth-detector',\n templateUrl: './low-bandwidth-detector.component.html',\n styleUrls: ['./low-bandwidth-detector.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FilterSettingsComponent],\n})\nexport class LowBandwidthDetectorComponent implements OnInit {\n private readonly store = inject(Store);\n private readonly dialog = inject(Dialog);\n private readonly destroyRef = inject(DestroyRef);\n private readonly videoStatGenerator = inject(VideoStreamStatusService);\n readonly devModeService = inject(DevModeService);\n\n private readonly viewportReady$ = this.store.select(\n unrealFeature.selectViewportReady,\n );\n private readonly isLowBandwidth$ = this.store.select(\n unrealFeature.selectLowBandwidth,\n );\n private readonly lowBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Truthy),\n );\n private readonly highBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly viewPortDestroyedTrigger$ = this.viewportReady$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly aggregatedStats$ = this.videoStatGenerator.videoStats$.pipe(\n map((data) => data.aggregatedStats),\n share(),\n );\n private readonly nativeQuality$ = this.videoStatGenerator.videoStats$.pipe(\n map((data) => data.quality),\n );\n\n private readonly monitoringTrigger$ = this.viewportReady$\n .pipe(\n combineLatestWith(this.isLowBandwidth$),\n map(\n ([viewPortReady, isLowBandwidth]) => viewPortReady && !isLowBandwidth,\n ),\n )\n .pipe(share());\n\n private readonly reTrigger$ = this.monitoringTrigger$.pipe(\n map(() => ({ quality: 'lime' as Quality })),\n );\n\n private readonly canSwitchToLowBand$ = this.monitoringTrigger$.pipe(\n debounceTime(100),\n switchMap((canSwitch) =>\n concat(\n of(false),\n timer(FilterModel.monitoringDelayTime).pipe(map(() => canSwitch)),\n ).pipe(take(2), takeUntil(this.monitoringTrigger$)),\n ),\n distinctUntilChanged(),\n tapLog('DROP: [LOWBANDWIDTH] Monitoring Active =>'),\n share(),\n );\n\n private readonly videoQuality$ = merge(\n this.nativeQuality$,\n this.reTrigger$,\n ).pipe(share(), takeUntil(this.viewPortDestroyedTrigger$));\n\n private readonly fps$ = this.aggregatedStats$.pipe(\n map((data) => data.framesPerSecond || 0),\n );\n\n private readonly bitrateDrop$ = this.aggregatedStats$.pipe(\n map((data) => data.dataFlowCheckResult),\n filter((br) => br.isDropDetected),\n takeUntil(merge(this.viewPortDestroyedTrigger$, this.reTrigger$)),\n );\n\n readonly fps = toSignal(this.fps$);\n readonly nativeQuality = toSignal(this.nativeQuality$);\n readonly isLowBandwidth = toSignal(this.isLowBandwidth$);\n readonly aggregatedStats = toSignal(this.aggregatedStats$);\n readonly isReducedQuality = signal(false);\n readonly isIndicatorExpanded = signal(false);\n\n readonly isIndicatorExpandedTrigger$ = toObservable(\n this.isIndicatorExpanded,\n ).pipe(skip(1), distinctUntilChanged(), filter(Falsy));\n\n ngOnInit() {\n this.lowBandwidthTrigger$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.toggleIndicator(true));\n\n merge(this.viewPortDestroyedTrigger$, this.highBandwidthTrigger$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.isReducedQuality.set(false));\n\n this.canSwitchToLowBand$\n .pipe(\n filter(Truthy),\n tap(() => {\n BITRATE_MONITOR.reset();\n this.isReducedQuality.set(false);\n }),\n switchMap(() => this.bitrateDrop$),\n tap(this.trySetLowBandwidth.bind(this)),\n map((dataFlowResult) => dataFlowResult?.isDropDetected),\n distinctUntilChanged(),\n tap(() => {\n this.isReducedQuality.set(true);\n }),\n switchMap(() => this.videoQuality$),\n filter((quality) => quality === 'lime'),\n tap(() => this.isReducedQuality.set(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private trySetLowBandwidth(dataFlowResult: DataFlowCheckResult) {\n // Evaluate FPS and native quality\n const isFpsLow = this.fps()! < FilterModel.minimumFps;\n const isNativeQualityRed = this.nativeQuality() === 'red';\n const shouldSwitch = isNativeQualityRed || isFpsLow;\n\n // Exit if conditions are not met or already in low bandwidth\n if (!shouldSwitch || this.isLowBandwidth()) return;\n\n const { quality, activeMedian } = dataFlowResult;\n const isQualityRed = quality === 'red';\n const isLowBitrate = activeMedian < FilterModel.minimumBitrate;\n\n // Final check for red drop or low bitrate, or low FPS\n if (isQualityRed || isLowBitrate || isFpsLow) {\n let reason: string;\n\n if (isFpsLow) {\n reason = `FPS < ${FilterModel.minimumFps}`;\n } else if (quality === 'red') {\n reason = `Drop > ${FilterModel.redFlag}%`;\n } else {\n reason = `Speed < ${FilterModel.minimumBitrate}`;\n }\n\n Logger.info(\n `LBM DETECTED: ${reason}, switching to low bandwidth; `,\n dataFlowResult.message,\n );\n\n this.store.dispatch(\n changeLowBandwidth({\n lowBandwidth: true,\n stats: {\n dataFlowResult,\n reason,\n triggerTime: this.aggregatedStats()?.runTime ?? 0,\n },\n }),\n );\n }\n }\n\n toggleIndicator(value: boolean) {\n this.isIndicatorExpanded.set(value);\n\n if (value) {\n this.hideIndicatorAfterDelay();\n }\n }\n\n hideIndicatorAfterDelay() {\n timer(3000)\n .pipe(take(1), takeUntil(this.isIndicatorExpandedTrigger$))\n .subscribe(() => this.toggleIndicator(false));\n }\n\n openLBMDialog() {\n this.dialog\n .open(LowBandwidthModalComponent)\n .closed.pipe(filter(Truthy))\n .subscribe(() => {\n this.toggleIndicator(false);\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));\n });\n }\n}\n","@if (isReducedQuality() || isLowBandwidth()) {\n <div\n [class.expanded]=\"isIndicatorExpanded() && isLowBandwidth()\"\n class=\"lbm-indicator freeze-loader\"\n >\n <div (click)=\"toggleIndicator(true)\" class=\"lbm-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"#85888E\"\n d=\"M7.189 3.605c-.73.145-1.438.35-2.126.614A14.412 14.412 0 0 0 .896 6.666a1.08 1.08 0 0 0-.375.844c0 .34.118.629.354.865s.524.36.865.375c.34.014.65-.09.927-.313a11.89 11.89 0 0 1 3.385-1.916 10.94 10.94 0 0 1 1.235-.375l-.098-2.541ZM7.385 8.708a9.107 9.107 0 0 0-2.906 1.48c-.264.194-.402.464-.416.812-.014.347.104.646.354.896.236.236.524.364.864.385.34.02.664-.073.97-.281.422-.29.878-.53 1.368-.721a2.545 2.545 0 0 1-.166-.814l-.068-1.757ZM12.386 11.267c.094-.25.15-.52.161-.802l.068-1.755a9.019 9.019 0 0 1 2.927 1.52c.264.193.4.46.406.801.007.34-.114.635-.364.885a1.213 1.213 0 0 1-.865.365A1.614 1.614 0 0 1 13.77 12a6.574 6.574 0 0 0-1.385-.733ZM12.713 6.146l.098-2.542c.73.146 1.438.351 2.127.615 1.541.59 2.93 1.406 4.166 2.447.25.223.379.5.386.834.007.333-.115.625-.365.875a1.253 1.253 0 0 1-.864.375c-.34.014-.65-.09-.927-.313a11.892 11.892 0 0 0-3.386-1.916 10.94 10.94 0 0 0-1.235-.375ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n />\n <path\n fill=\"#fff\"\n fill-rule=\"evenodd\"\n d=\"M10 .833c-.91 0-1.637.756-1.602 1.665l.304 7.92a1.299 1.299 0 0 0 2.596 0l.305-7.92A1.604 1.604 0 0 0 10 .833ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div\n [class.lbm-message--open]=\"isLowBandwidth() && isIndicatorExpanded()\"\n class=\"lbm-message\"\n >\n <p class=\"lbm-description\">\n Fluid Interactivity Modes were disabled due to an unstable connection.\n\n <button\n (click)=\"openLBMDialog()\"\n [attr.data-testid]=\"'learn-more-lbm'\"\n type=\"button\"\n class=\"lbm-learn-more\"\n >\n Learn more\n </button>\n </p>\n <button\n (click)=\"toggleIndicator(false)\"\n [attr.data-testid]=\"'close-lbm-indicator'\"\n type=\"button\"\n class=\"lbm-close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 11.2289L6.68618 14.5428C6.51951 14.7095 6.31818 14.7895 6.08218 14.7828C5.84618 14.7755 5.64485 14.6885 5.47818 14.5218C5.31151 14.3552 5.22818 14.1505 5.22818 13.9078C5.22818 13.6645 5.31151 13.4595 5.47818 13.2928L8.77107 9.99992L5.45718 6.68603C5.29051 6.51936 5.21051 6.3147 5.21718 6.07203C5.22451 5.8287 5.31151 5.6237 5.47818 5.45703C5.64485 5.29036 5.84951 5.20703 6.09218 5.20703C6.33551 5.20703 6.54051 5.29036 6.70718 5.45703L10.0001 8.77092L13.314 5.45703C13.4806 5.29036 13.6853 5.20703 13.928 5.20703C14.1713 5.20703 14.3763 5.29036 14.543 5.45703C14.7096 5.6237 14.793 5.8287 14.793 6.07203C14.793 6.3147 14.7096 6.51936 14.543 6.68603L11.2291 9.99992L14.543 13.3138C14.7096 13.4805 14.793 13.6818 14.793 13.9178C14.793 14.1538 14.7096 14.3552 14.543 14.5218C14.3763 14.6885 14.1713 14.7718 13.928 14.7718C13.6853 14.7718 13.4806 14.6885 13.314 14.5218L10.0001 11.2289Z\"\n fill=\"white\"\n />\n </svg>\n </button>\n </div>\n </div>\n}\n\n@if (devModeService.isDevMode) {\n <app-filter-settings />\n}\n","export const PDF_SCALE = 3;\nexport const PAGE_SIZE = { w: 210, h: 297 } as const;\n","import { Directive, inject, ViewContainerRef } from '@angular/core';\n\n@Directive({\n selector: '[appInsertion]',\n})\nexport class InsertionDirective {\n viewContainerRef = inject(ViewContainerRef);\n}\n","import type { ElementRef, OnInit, Type } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n input,\n output,\n viewChild,\n ViewChild,\n} from '@angular/core';\nimport { jsPDF } from 'jspdf';\nimport { concatMap } from 'rxjs/operators';\nimport { from } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport type {\n ComposedPage,\n PagesPdf,\n PdfContent,\n PdfFactoryItem,\n PdfGenerationProgressInfo,\n PdfRectLink,\n PdfSchemaProps,\n} from '../../interfaces/pdf.interface';\nimport type { PdfBasePageComponent } from './pdf-base-page.component';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport type { Area } from '@3dsource/utils';\nimport { fitIntoRectangle, ImageOutput } from '@3dsource/utils';\nimport { PAGE_SIZE, PDF_SCALE } from '../../constants/pdf';\nimport { InsertionDirective } from '../../directives/insertion.directive';\n\n@Component({\n selector: 'app-pdf-generator',\n templateUrl: './pdf-generator.component.html',\n styleUrls: ['./pdf-generator.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [InsertionDirective],\n})\nexport class PdfGeneratorComponent implements OnInit {\n store = inject(Store);\n pagesReady: PagesPdf = [];\n schema = input.required<PdfSchemaProps>();\n debugMode = input.required<boolean>();\n pdfContent = input.required<PdfContent>();\n progressChanged = output<PdfGenerationProgressInfo>();\n generator = viewChild<ElementRef<HTMLDivElement>>('generator');\n\n @ViewChild(InsertionDirective, { static: true }) adHost!: InsertionDirective;\n\n private doc!: jsPDF;\n private pagesComplete = 0;\n private componentInstance!: PdfBasePageComponent;\n destroyRef = inject(DestroyRef);\n\n ngOnInit() {\n this.doc = new jsPDF('portrait', 'mm', [210, 297], true);\n\n from(this.schema().pages)\n .pipe(\n concatMap((page, index) => this.generateComponent(page, index)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(({ index, capturedPage, links }: ComposedPage) => {\n this.pagesReady[index] = { capturedPage, links };\n\n this.pagesComplete += 1;\n const progress = this.pagesComplete / this.schema().pages.length;\n\n this.progressChanged.emit({\n progress,\n total: 0,\n loaded: 0,\n doc: progress === 1 ? this.generateAllPdfPages() : null,\n });\n });\n }\n\n private generateComponent(factoryItem: PdfFactoryItem, index: number) {\n this.adHost.viewContainerRef.clear();\n this.componentInstance = this.adHost.viewContainerRef.createComponent(\n factoryItem.factory as Type<PdfBasePageComponent>,\n ).instance;\n this.componentInstance.index = index;\n this.componentInstance.countPages = this.schema().pages.length;\n this.componentInstance.contentKey = factoryItem.contentKey || '';\n this.componentInstance.pdfContent = this.pdfContent();\n this.componentInstance.selectedItems = factoryItem.data || [];\n\n return this.componentInstance.pagesGenerated$;\n }\n\n private generateAllPdfPages() {\n this.pagesReady.forEach(\n ({ capturedPage, links }, index: number, collection: PagesPdf) => {\n if (!capturedPage) {\n return;\n }\n\n const props = fitIntoRectangle(\n {\n w: capturedPage.width,\n h: capturedPage.height,\n x: 0,\n y: 0,\n },\n {\n w: PAGE_SIZE.w,\n h: PAGE_SIZE.h,\n x: 0,\n y: 0,\n },\n );\n\n const image = capturedPage.toDataURL(ImageOutput.JPG, 0.9);\n this.doc.addImage(image, 'JPEG', 0, 0, props.w, props.h, '', 'FAST');\n\n links.forEach((link: PdfRectLink) =>\n this.addLink(link, this.doc, index, props),\n );\n\n if (index < collection.length - 1) {\n this.doc.addPage();\n }\n },\n );\n\n return this.doc;\n }\n\n private addLink(\n { rect, href }: PdfRectLink,\n doc: jsPDF,\n index: number,\n props: Area,\n ) {\n const { x, y } = this.generator()!.nativeElement.getBoundingClientRect();\n const scale = props.scale * PDF_SCALE;\n\n doc.link(\n (rect.x - x) * scale + props.x,\n (rect.y - y) * scale + props.y,\n rect.width * scale,\n rect.height * scale,\n {\n target: '_blank',\n url: href,\n pageNumber: index,\n },\n );\n }\n}\n","<div #generator [class.dev]=\"debugMode()\" [class.prod]=\"!debugMode()\">\n <div class=\"pdf-room-generator\">\n <ng-template appInsertion />\n </div>\n</div>\n","import type { ElementRef, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n Output,\n ViewChild,\n} from '@angular/core';\nimport type {\n ComposedPage,\n PdfContent,\n PdfRectLinks,\n PdfSelectedItem,\n} from '../../interfaces/pdf.interface';\nimport { of, Subject } from 'rxjs';\nimport { catchError, delay, switchMap } from 'rxjs/operators';\nimport { PDF_SCALE } from '../../constants/pdf';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport html2canvas from 'html2canvas';\n\n@Component({\n template: '',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport abstract class PdfBasePageComponent implements OnInit {\n @ViewChild('content', { static: true }) content!: ElementRef<HTMLDivElement>;\n @Output() pagesGenerated$ = new Subject<ComposedPage>();\n\n destroyRef = inject(DestroyRef);\n\n index!: number;\n countPages!: number;\n contentKey!: string | undefined;\n pdfContent!: PdfContent | null;\n selectedItems: PdfSelectedItem[] = [];\n\n ngOnInit() {\n if (!this?.content?.nativeElement) {\n return;\n }\n\n this.pageToCanvas(this.content.nativeElement)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((capturedPage) => {\n this.pagesGenerated$.next({\n index: this.index,\n capturedPage,\n links: this.getLinks(),\n });\n\n this.pagesGenerated$.complete();\n });\n }\n\n private getLinks() {\n const links: PdfRectLinks = [];\n\n this.content.nativeElement.querySelectorAll('a').forEach((element) => {\n links.push({\n rect: element.getBoundingClientRect(),\n href: element.getAttribute('href'),\n });\n });\n\n return links;\n }\n\n pageToCanvas(htmlElement: HTMLElement) {\n return of(htmlElement).pipe(\n delay(100),\n switchMap((element) => {\n window.scrollTo(0, 0);\n\n return html2canvas(element, {\n allowTaint: true,\n useCORS: true,\n scale: PDF_SCALE,\n width: element.scrollWidth,\n height: element.scrollHeight,\n backgroundColor: '#ffffff',\n // IMPORTANT - fix for safari on iphone 13 - os 15 https://github.com/niklasvh/html2canvas/issues/3053\n ignoreElements: (el) => el.getAttribute('loading') === 'lazy',\n });\n }),\n catchError(() => of(null)),\n );\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { PdfBasePageComponent } from '../../../generator/pdf-base-page.component';\nimport { SourceIconComponent } from '@source/ui-sdk/source-icon';\n\n@Component({\n selector: 'app-header-pdf',\n templateUrl: './header-pdf.component.html',\n styleUrls: ['./header-pdf.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceIconComponent],\n})\nexport class HeaderPdfComponent extends PdfBasePageComponent {\n name = input<string>();\n link = input<string>();\n}\n","<div class=\"print-header\">\n <div class=\"print-header__title\">\n <div class=\"title_text\">\n {{ name() }}\n </div>\n <a href=\"{{ link() }}\" class=\"header-link\">\n <src-icon [name]=\"'view_in_ar'\" class=\"icon-header\" />\n <span class=\"link-text\">Show in 3D configurator</span>\n </a>\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport type { PdfSelectedItem } from '../../../../interfaces/pdf.interface';\nimport { PdfBasePageComponent } from '../../../generator/pdf-base-page.component';\nimport { TitleCasePipe } from '@angular/common';\n\n@Component({\n selector: 'app-materials-pdf',\n templateUrl: './materials-pdf.component.html',\n styleUrls: ['./materials-pdf.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TitleCasePipe],\n})\nexport class MaterialsPdfComponent extends PdfBasePageComponent {\n items = input<PdfSelectedItem[] | null>(null);\n}\n","<div class=\"materials-wrapper\">\n <div class=\"materials-title\">Selected Configuration</div>\n <div class=\"materials-table\">\n <div class=\"header-table grid-row\">\n <div class=\"title\">Label</div>\n <div class=\"title\">Type</div>\n <div class=\"title\">Name</div>\n </div>\n @for (item of items(); track item.id) {\n <div class=\"configuration-row grid-row text\">\n <div class=\"text\">{{ item.label }}</div>\n <div class=\"text\">{{ item.type | titlecase }}</div>\n <div class=\"text\">\n {{ item.name }}\n </div>\n </div>\n @for (\n selectedMaterial of item.selectedMaterials;\n track selectedMaterial.slotName\n ) {\n <div class=\"main-row grid-row\">\n <div class=\"text\">{{ selectedMaterial?.slotLabel }}</div>\n <div class=\"text\">Material</div>\n <div class=\"section-cell\">\n <div class=\"icon-material\">\n <img\n [src]=\"selectedMaterial?.imageBase64!\"\n alt=\"texture_image\"\n loading=\"eager\"\n height=\"40\"\n width=\"40\"\n />\n </div>\n <span>{{ selectedMaterial.label }}</span>\n </div>\n </div>\n }\n }\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\n\n@Component({\n selector: 'app-page-number',\n templateUrl: './page-number.component.html',\n styleUrls: ['./page-number.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PageNumberComponent {\n logo = input<boolean>(false);\n totalPages = input.required<number>();\n pageNumber = input.required<number>();\n}\n","<div class=\"page-number-wrapper\">\n <div class=\"logo\">\n @if (logo()) {\n <a class=\"link_logo\" href=\"https://www.3dsource.com/\" target=\"_blank\">\n <img\n [src]=\"'assets/images/svg/logo/metabox-logo-icon.svg'\"\n height=\"34\"\n width=\"162\"\n alt=\"logo-icon\"\n />\n </a>\n }\n </div>\n <div class=\"page-number-text\">\n {{ pageNumber()! + 1 }} / {{ totalPages() }}\n </div>\n</div>\n","import { ChangeDetectionStrategy, Component, input } from '@angular/core';\nimport { PdfBasePageComponent } from '../../../generator/pdf-base-page.component';\n\n@Component({\n selector: 'app-image-pdf',\n templateUrl: './image-pdf.component.html',\n styleUrls: ['./image-pdf.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ImagePdfComponent extends PdfBasePageComponent {\n image = input<string>();\n}\n","<div class=\"image-wrapper\">\n @if (image()) {\n <div class=\"view\">\n <img [src]=\"image()\" alt=\"camera-freeze-image\" class=\"container\" />\n </div>\n }\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { PdfBasePageComponent } from '../../../generator/pdf-base-page.component';\nimport { HeaderPdfComponent } from '../header/header-pdf.component';\nimport { MaterialsPdfComponent } from '../materials-pdf/materials-pdf.component';\nimport { PageNumberComponent } from '../page-number/page-number.component';\nimport { ImagePdfComponent } from '../image-pdf/image-pdf.component';\n\n@Component({\n selector: 'app-intro-pdf',\n templateUrl: './intro-pdf.component.html',\n styleUrls: ['./intro-pdf.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n HeaderPdfComponent,\n MaterialsPdfComponent,\n PageNumberComponent,\n ImagePdfComponent,\n ],\n})\nexport class IntroPdfComponent extends PdfBasePageComponent {}\n","<div #content class=\"page print\">\n <app-header-pdf\n [name]=\"selectedItems[0].label || ''\"\n [link]=\"pdfContent?.link || ''\"\n />\n <div>\n <app-image-pdf [image]=\"pdfContent?.mainImage || ''\" />\n <app-materials-pdf [items]=\"selectedItems\" />\n </div>\n <app-page-number [pageNumber]=\"index\" [totalPages]=\"countPages\" />\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { PdfBasePageComponent } from '../../../generator/pdf-base-page.component';\nimport { MaterialsPdfComponent } from '../materials-pdf/materials-pdf.component';\nimport { PageNumberComponent } from '../page-number/page-number.component';\n\n@Component({\n selector: 'app-materials-page-pdf',\n templateUrl: './materials-page-pdf.component.html',\n styleUrls: ['./materials-page-pdf.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MaterialsPdfComponent, PageNumberComponent],\n})\nexport class MaterialsPagePdfComponent extends PdfBasePageComponent {}\n","<div #content class=\"page print\">\n <app-materials-pdf [items]=\"selectedItems\" />\n <app-page-number [pageNumber]=\"index\" [totalPages]=\"countPages\" />\n</div>\n","import type { PdfContent, PdfSchemaProps } from '../interfaces/pdf.interface';\nimport { IntroPdfComponent } from '../components/templates/general/intro-pdf/intro-pdf.component';\nimport { MaterialsPagePdfComponent } from '../components/templates/general/materials-page-pdf/materials-page-pdf.component';\n\nexport const generatePdfSchema = (content: PdfContent): PdfSchemaProps => {\n switch (content.template) {\n case 'basic-configurator':\n return configuratorSchema(content);\n case 'modular-configurator':\n return configuratorSchema(content);\n default:\n return configuratorSchema(content);\n }\n};\n\nconst configuratorSchema = (content: PdfContent) => {\n let schema: PdfSchemaProps = {\n pages: [\n {\n factory: IntroPdfComponent,\n data: content.selectedItems!,\n },\n ],\n };\n\n const copyItems = [...content.selectedItems];\n const itemsInPage = 3;\n\n if (copyItems && copyItems?.length > itemsInPage) {\n schema = {\n pages: [\n {\n factory: IntroPdfComponent,\n data: copyItems.slice(0, itemsInPage),\n },\n {\n factory: MaterialsPagePdfComponent,\n data: copyItems.slice(itemsInPage),\n },\n ],\n };\n }\n\n return schema;\n};\n","export const DEBOUNCE_TO_MANY_RESIZE_CALLS = 100;\nexport const SAME_SIZE_THRESHOLD = 1.01;\nexport const MINIMAL_FPS = 6;\nexport const STREAMING_VIDEO_ID = 'streamingVideo';\nexport const CONSOLE_COMMAND_ENABLE_MESSAGES = 'EnableAllScreenMessages';\nexport const CONSOLE_COMMAND_DISABLE_MESSAGES = 'DisableAllScreenMessages';\nexport const CONSOLE_COMMAND_PIXEL_QUALITY =\n 'PixelStreaming.FreezeFrameQuality 95';\nexport const FULL_HD_WIDTH = 1920;\nexport const FULL_HD_HEIGHT = 1080;\nexport const WS_TIMEOUT = 2000;\nexport const WS_OPEN_STATE = 1;\n","import { sendSignal } from './EventWrapper';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\n\nexport const dispatchResize = () => {\n window.dispatchEvent(new Event('resize'));\n};\n\nexport const forceResizeUnrealVideo = () => {\n sendSignal(UnrealInternalSignalEvents.ForceResizeViewport);\n};\n","import { from, fromEvent, take } from 'rxjs';\nimport { SubService } from './sub.service';\nimport { Injectable } from '@angular/core';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { catchError, filter, first } from 'rxjs/operators';\nimport { sendSignal } from '../helpers/EventWrapper';\nimport { changeStatusMainVideoOnScene } from '../store/unreal.actions';\nimport { STREAMING_VIDEO_ID } from '../constants/unreal.constant';\nimport { dispatchResize } from '../helpers/dispatchResize';\nimport { tapLog } from '@3dsource/utils';\n\n@Injectable()\nexport class VideoService extends SubService {\n video!: HTMLVideoElement | null;\n audio!: HTMLAudioElement | null;\n container!: HTMLDivElement | null;\n\n create() {\n this.disconnect$.pipe(take(1)).subscribe(() => this.destroy());\n this.destroy();\n this.createWebRtcVideo();\n this.createWebRtcAudio();\n }\n\n private destroy() {\n this.video = null;\n this.audio = null;\n\n while (this.container?.firstChild) {\n this.container.removeChild(this.container.firstChild);\n }\n\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: false }),\n );\n }\n\n private createWebRtcVideo() {\n dispatchResize();\n const video = document.createElement('video');\n video.id = STREAMING_VIDEO_ID;\n video.playsInline = true;\n video.muted = true;\n video.autoplay = true;\n video.preload = 'auto';\n video.disablePictureInPicture = true;\n\n this.video = video;\n this.container?.appendChild(this.video);\n\n this.video.addEventListener('play', () => {\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: true }),\n );\n });\n\n fromEvent(this.video, 'loadedmetadata')\n .pipe(\n first(),\n filter((data) => this.video === data.target),\n tapLog('VideoService loadedmetadata:'),\n )\n .subscribe(() =>\n sendSignal(UnrealInternalSignalEvents.OnVideoInitialized, this.video!),\n );\n }\n\n attachVideoStream(stream: MediaStream) {\n if (this.video) {\n this.video.srcObject = stream;\n } else {\n console.error('Video element is not defined.');\n }\n }\n\n attachAudioStream(stream: MediaStream) {\n // do nothing the video has the same media stream as the audio track we have here (they are linked)\n if (this.video?.srcObject === stream) {\n return;\n }\n // video element has some other media stream that is not associated with this audio track\n else if (\n this.audio &&\n this.video?.srcObject &&\n this.video?.srcObject !== stream\n ) {\n this.audio.srcObject = stream;\n this.playAudio(this.audio);\n }\n }\n\n private createWebRtcAudio() {\n const audio = new Audio();\n audio.id = 'streamingAudio';\n this.audio = audio;\n }\n\n private playAudio(audio: HTMLAudioElement) {\n from(audio.play())\n .pipe(\n catchError(() => fromEvent(document, 'click')),\n take(1),\n )\n .subscribe({\n next: () => audio.play(),\n error: () => ({}),\n });\n }\n\n play() {\n void this.video?.play();\n }\n}\n","import type { MetaBoxCommandList, MetaBoxCommandPacket } from '@struct';\nimport type { Observable } from 'rxjs';\nimport { of, timeout } from 'rxjs';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { catchError, filter, first, map } from 'rxjs/operators';\nimport { fromSignal } from '../helpers/EventWrapper';\nimport { generateUuid, tapLog, Truthy } from '@3dsource/utils';\n\nexport function observeCommandResponse<\n K extends keyof MetaBoxCommandList,\n T extends MetaBoxCommandList[K] = MetaBoxCommandList[K],\n>(\n data: T,\n sender: (data: T) => void,\n timeOut = 60000,\n dispatchOnTimeout = true,\n): Observable<ObservedCallbackResponse<T> | never> {\n const correlationId = generateUuid();\n const out = { ...data, correlationId };\n\n const observable = fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(({ json }) => {\n // Some callbacks do not have commandCallback wrapper,\n // so first we check if it exists,\n // then fallback to JSON itself\n return 'commandCallback' in json\n ? { json }\n : { json: { commandCallback: json } };\n }),\n filter(({ json }) => {\n return json.commandCallback.correlationId === correlationId;\n }),\n timeout(timeOut),\n catchError(() =>\n dispatchOnTimeout\n ? of({ json: { commandCallback: { correlationId: 'timeout' } } })\n : of(null),\n ),\n first(),\n tapLog('Command Response Observer'),\n filter(Truthy),\n );\n\n setTimeout(() => sender(out), 0);\n\n return observable as never;\n}\n\n// Suppose MetaBoxCommandPacket is your base command shape.\n// This type ensures that after filtering, json.commandCallback\n// has the same type as you passed in to observeCommandResponse.\nexport interface ObservedCallbackResponse<T extends MetaBoxCommandPacket> {\n json: {\n commandCallback: T;\n };\n}\n","import { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { sendSignal } from './EventWrapper';\n\nexport const resetAfk = () => {\n sendSignal(UnrealInternalSignalEvents.RestAfkTimer);\n};\n","import {\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n STREAMING_VIDEO_ID,\n} from '../constants/unreal.constant';\nimport type { ImageOutputValues } from '@3dsource/utils';\nimport { getCanvasCached, getSnapshot } from '@3dsource/utils';\nimport type { StreamResolutionProps } from '../interfaces/stream-resolution.interface';\n\nexport const getImageFromVideoStream = (\n takeSizeFrom: 'video' | 'constant' = 'video',\n imageOutput?: ImageOutputValues,\n sizes?: StreamResolutionProps,\n) => {\n try {\n const video = document.getElementById(\n STREAMING_VIDEO_ID,\n ) as HTMLVideoElement;\n const { canvas, ctx } = getCanvasCached('video');\n\n canvas.width =\n takeSizeFrom === 'video'\n ? sizes?.width || video?.clientWidth || FULL_HD_WIDTH\n : FULL_HD_WIDTH;\n canvas.height =\n takeSizeFrom === 'video'\n ? sizes?.height || video?.clientHeight || FULL_HD_HEIGHT\n : FULL_HD_HEIGHT;\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n return getSnapshot(canvas, canvas.width, imageOutput) as string;\n } catch {\n return null;\n }\n};\n","export const EControlSchemeType = {\n // A mouse can lock inside the WebRTC player so the user can simply move the\n // mouse to control the orientation of the camera. The user presses the\n // Escape key to unlock the mouse.\n LockedMouse: 0,\n\n // A mouse can hover over the WebRTC player so the user needs to click and\n // drag to control the orientation of the camera.\n HoveringMouse: 1,\n Default: 2,\n} as const;\n\nexport type EControlSchemeTypeValues =\n (typeof EControlSchemeType)[keyof typeof EControlSchemeType];\n","import { EControlSchemeType } from './EControlSchemeType';\nimport type { InputProps } from '../interfaces/input.interface';\n\nexport const InputOptions: InputProps = {\n controlScheme: EControlSchemeType.Default,\n suppressBrowserKeys: true,\n fakeMouseWithTouches: false,\n};\n","import { Injectable } from '@angular/core';\nimport { distinctUntilChanged, filter, withLatestFrom } from 'rxjs/operators';\nimport { EControlSchemeType } from '../constants/EControlSchemeType';\nimport { Truthy } from '@3dsource/utils';\nimport { InputOptions } from '../constants/InputOptions';\nimport { SubService } from './sub.service';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { selectWarnTimeout } from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\nimport { destroyConnectionsAndResetState } from '../store/unreal.actions';\nimport { DEFAULT_TIMEOUT_PERIOD } from '../constants/timeout.constant';\n\n@Injectable()\nexport class AFKService extends SubService {\n // Optionally detect if the user is not interacting (AFK) and disconnect them.\n private enabled = true; // Set to true to enable the AFK system.\n private closeTimeout = DEFAULT_TIMEOUT_PERIOD; // The time after the warning when we disconnect the user.\n private active = false; // Whether the AFK system is currently looking for inactivity.\n private warnTimer!: ReturnType<typeof setTimeout>; // The timer which waits to show the inactivity warning overlay.\n private countdown = 0; // The inactivity warning overlay has a countdown to show time until disconnect.\n private countdownTimer!: ReturnType<typeof setTimeout>; // The timer used to tick the seconds shown on the inactivity warning overlay.\n private selectWarnTimeout = toSignal(this.store.select(selectWarnTimeout));\n\n constructor() {\n super();\n this.initAfk();\n }\n\n initAfk() {\n merge(\n this.store.select(selectWarnTimeout),\n fromSignal(UnrealInternalSignalEvents.RestAfkTimer),\n )\n .pipe(\n withLatestFrom(this.store.select(unrealFeature.selectViewportReady)),\n filter(([, viewportReady]) => viewportReady),\n )\n .subscribe(() => this.resetAfkWarningTimer());\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(distinctUntilChanged(), filter(Truthy))\n .subscribe(() => this.startAfkWarningTimer());\n this.disconnect$.subscribe(() => this.stop());\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\n\n private hideOverlay() {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay);\n }\n\n /**\n * Start a timer which when elapsed will warn the user they are inactive.\n */\n private startAfkWarningTimer() {\n this.active = this.enabled;\n this.resetAfkWarningTimer();\n }\n\n /**\n * If the user interacts, then reset the warning timer.\n */\n private resetAfkWarningTimer() {\n if (this.active) {\n this.stop();\n this.warnTimer = setTimeout(() => {\n this.showAfkOverlay();\n }, this.selectWarnTimeout()! * 1000);\n }\n }\n\n /**\n * Update the count-down spans number for the overlay\n * @param countdown the count down number to be inserted into the span for updating\n */\n private updateCountDown(countdown: number) {\n this.dispatchMessage(String(countdown));\n }\n\n /**\n * Update the text overlays inner text\n * @param message the update text to be inserted into the overlay\n */\n private dispatchMessage(message: string) {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay, {\n message,\n isActivityDetected: true,\n className: 'clickableState',\n onOverlayClick: () => this.reset(),\n });\n }\n\n private stop() {\n clearInterval(this.countdownTimer);\n clearTimeout(this.warnTimer);\n this.hideOverlay();\n }\n\n private reset() {\n this.hideOverlay();\n clearInterval(this.countdownTimer);\n this.startAfkWarningTimer();\n }\n\n private showAfkOverlay() {\n // Pause the timer while the user is looking at the inactivity warning overlay.\n this.active = false;\n this.countdown = this.closeTimeout;\n this.updateCountDown(this.countdown);\n\n // eslint-disable-next-line eqeqeq\n if (InputOptions.controlScheme == EControlSchemeType.LockedMouse) {\n document.exitPointerLock();\n }\n\n this.countdownTimer = setInterval(() => {\n this.countdown--;\n if (this.countdown === 0) {\n // The user failed to click so disconnect them\n this.hideOverlay();\n // TODO possible way (Blinking), because postponed close event: destroyRemoteConnections({ disconnectReason: DisconnectReason.afk }),\n this.store.dispatch(destroyConnectionsAndResetState());\n clearInterval(this.countdownTimer);\n } else {\n this.updateCountDown(this.countdown);\n }\n }, 1000);\n }\n}\n","// Must be kept in sync with PixelStreamingProtocol::EToUE4Msg C++ descriptors.\n\nexport const EMessageType = {\n /*\n * Control Messages. Range = 0..49.\n */\n IFrameRequest: 0,\n RequestQualityControl: 1,\n MaxFpsRequest: 2,\n AverageBitrateRequest: 3,\n StartStreaming: 4,\n StopStreaming: 5,\n LatencyTest: 6,\n RequestInitialSettings: 7,\n\n /*\n * Input Messages. Range = 50..89.\n */\n\n // Generic Input Messages. Range = 50..59.\n UIInteraction: 50,\n Command: 51,\n\n // Keyboard Input Message. Range = 60..69.\n KeyDown: 60,\n KeyUp: 61,\n KeyPress: 62,\n\n // Mouse Input Messages. Range = 70..79.\n MouseEnter: 70,\n MouseLeave: 71,\n MouseDown: 72,\n MouseUp: 73,\n MouseMove: 74,\n MouseWheel: 75,\n\n // Touch Input Messages. Range = 80..89.\n TouchStart: 80,\n TouchEnd: 81,\n TouchMove: 82,\n} as const;\n\nexport type EMessageTypeValues =\n (typeof EMessageType)[keyof typeof EMessageType];\n","import { filter } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { setFreezeFrame } from '../store/unreal.actions';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { sendSignal } from '../helpers/EventWrapper';\nimport { unrealFeature } from '../store/unreal.feature';\n\n@Injectable()\nexport class FreezeFrameService extends SubService {\n receiving = false;\n\n private size = 0;\n private jpeg!: Uint8Array | undefined;\n private freezeFrameOverlay = new Image();\n\n init() {\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy))\n .subscribe(() => this.invalidate());\n }\n\n setData(view: Uint8Array) {\n view = view.slice(1 + 4);\n\n const jpeg = new Uint8Array(this.jpeg!.length + view.length);\n jpeg.set(this.jpeg!, 0);\n jpeg.set(view, this.jpeg!.length);\n this.jpeg = jpeg;\n if (this.jpeg.length === this.size) {\n this.receiving = false;\n Logger.info(`FRAME: Received complete freeze frame ${this.size}`);\n this.showFreezeFrame();\n } else if (this.jpeg.length > this.size) {\n Logger.error(\n `FRAME: Received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`,\n );\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: 0 }));\n\n this.jpeg = undefined;\n this.receiving = false;\n } else {\n this.dispatchInProgress();\n /* Logger.warn(\n `received next chunk (${view.length} bytes) of freeze frame: ${this.jpeg.length}/${this.size}`,\n );*/\n }\n }\n\n private dispatchInProgress() {\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: null,\n progress: (this.jpeg?.length || 0) / this.size,\n }),\n );\n }\n\n start(view: Uint8Array) {\n this.size = new DataView(view.slice(1, 5).buffer).getInt32(0, true);\n this.jpeg = view.slice(1 + 4);\n if (this.jpeg.length < this.size) {\n this.dispatchInProgress();\n sendSignal(UnrealInternalSignalEvents.FreezeFrameStart);\n Logger.info(\n `FRAME: Received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = true;\n } else {\n Logger.info(\n `FRAME: Received complete freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = false;\n this.showFreezeFrame();\n }\n }\n\n invalidate() {\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: null }));\n this.jpeg = undefined;\n this.receiving = false;\n }\n\n private showFreezeFrame() {\n if (!this.jpeg) {\n return;\n }\n\n const base64 = btoa(\n this.jpeg?.reduce((data, byte) => data + String.fromCharCode(byte), ''),\n );\n this.freezeFrameOverlay.src = 'data:image/jpeg;base64,' + base64;\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: this.freezeFrameOverlay.src,\n progress: 1,\n }),\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n changeLowBandwidth,\n destroyConnectionsAndResetState,\n setConfig,\n setMaxFps,\n} from '../store/unreal.actions';\nimport { of, switchMap } from 'rxjs';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { HttpClient } from '@angular/common/http';\nimport { Logger, tapLog } from '@3dsource/utils';\nimport { catchError, filter, first } from 'rxjs/operators';\nimport { SubService } from '../services/sub.service';\nimport { DevModeService } from '../services/dev-mode.service';\n\ninterface CustomWindow extends Window {\n emitUIInteraction: (data: unknown) => void;\n emitCommand: (data: unknown) => void;\n dropConnection: (data: unknown) => void;\n toggleBandwidth: (data: unknown) => void;\n setMaxFps: (data: number) => void;\n rebootInstance: (data: unknown) => void;\n startShowcase: (data: unknown) => void;\n restartApp: (data: unknown) => void;\n unrealHelp: (data: unknown) => void;\n setWarnTime: (data: number) => void;\n}\n\ndeclare let window: CustomWindow;\n\n@Injectable()\nexport class ConsoleExtensionsService extends SubService {\n private httpClient = inject(HttpClient);\n private isDevMode = inject(DevModeService).isDevMode;\n\n init() {\n if (!this.isDevMode) {\n return;\n }\n\n window.dropConnection = () => {\n this.store.dispatch(destroyConnectionsAndResetState());\n\n return true;\n };\n\n window.toggleBandwidth = () => {\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(first())\n .subscribe((isLow) => {\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: !isLow }));\n });\n\n return 'LowBandwidth => toggled';\n };\n\n window.setMaxFps = (maxFps: number) => {\n this.store.dispatch(setMaxFps({ maxFps }));\n return `Max Fps Set to ${maxFps}`;\n };\n\n window.restartApp = () => {\n this.store\n .select(unrealFeature.selectAwsInstance)\n .pipe(\n first(),\n filter((data) => !!data.instanceName),\n tapLog('Instance', `Restart initiated`),\n switchMap((data) =>\n this.httpClient.get(`//${data.instanceName}/restartapp`),\n ),\n\n catchError(() => of(null)),\n )\n .subscribe();\n };\n\n window.unrealHelp = () => {\n this.unrealHelp();\n };\n\n window.setWarnTime = (time: number) => {\n this.store.dispatch(setConfig({ config: { warnTimeout: time } }));\n };\n }\n\n private unrealHelp() {\n Logger.info(\n 'dropConnection() => Closes Web Socket and abort communication.',\n );\n Logger.info('toggleBandwidth() => toggles speed.');\n Logger.info('restartApp() => force restart Unreal app.');\n Logger.info('rebootInstance() => force reboot instance.');\n Logger.info('startShowcase(time) => start Showcase.');\n Logger.info('setWarnTime() => set time to appear the AFK window.');\n Logger.info('emitCommand(command) => send command to Unreal Engine.');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { MetaBoxCommandPacket } from '@struct';\nimport { Subject } from 'rxjs';\nimport { AFKService } from './afk.service';\nimport { CommandTelemetryService } from './command-telemetry.service';\nimport type { EMessageTypeValues } from '../constants/EMessageType';\nimport { EMessageType } from '../constants/EMessageType';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { Store } from '@ngrx/store';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoService } from './video.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { COLOR_CODES, generateUuid, Logger, Truthy } from '@3dsource/utils';\nimport { ConsoleExtensionsService } from '../services/console-extensions.service';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { filter } from 'rxjs/operators';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { resetAfk } from '../helpers/resetAfk';\nimport { commandStarted } from '../store/unreal.actions';\n\n@Injectable()\nexport class UnrealCommunicatorService {\n private telemetry = inject(CommandTelemetryService);\n private afkService = inject(AFKService);\n private freezeFrame = inject(FreezeFrameService);\n private webrtcPlayer = inject(WebRtcPlayerService);\n private videoService = inject(VideoService);\n private consoleExtensions = inject(ConsoleExtensionsService);\n private store = inject(Store);\n private destroy$ = new Subject<void>();\n\n private cirrusConnected = toSignal(\n this.store.select(unrealFeature.selectCirrusConnected),\n );\n\n constructor() {\n this.emitUIInteraction = this.telemetry.decorate(\n this.emitUIInteraction.bind(this),\n );\n this.consoleExtensions.init();\n this.afkService.init();\n this.freezeFrame.init();\n\n this.listenVideo();\n\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy))\n .subscribe(() => {\n this.requestInitialSettings();\n this.requestQualityControl();\n });\n }\n\n destroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n sendCommandToUnreal(data: MetaBoxCommandPacket) {\n if (this.webrtcPlayer.canSend()) {\n const uniqId = data?.correlationId ?? generateUuid();\n const sendData: MetaBoxCommandPacket = { ...data, correlationId: uniqId };\n Logger.colored(...COLOR_CODES.TO_UNREAL, sendData);\n this.emitUIInteraction(sendData);\n\n this.store.dispatch(\n commandStarted({ id: uniqId, command: data.command }),\n );\n }\n }\n\n emitUIInteraction(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.UIInteraction, descriptor);\n }\n\n /**\n A build-in command can be sent to the UE4 client. The commands are defined by a\n JSON descriptor and will be executed automatically.\n The currently supported commands are:\n\n 1. A command to run any console command:\n \"{ ConsoleCommand: <string> }\"\n\n 2. A command to change the resolution to the given width and height.\n \"{ Resolution.Width: <value>, Resolution.Height: <value> } }\"\n */\n emitCommand(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.Command, descriptor);\n }\n\n sendInputData(data: ArrayBuffer) {\n try {\n resetAfk();\n this.webrtcPlayer.send(data);\n } catch (error) {\n if (this.cirrusConnected()) {\n Logger.error(\n `DataChannel connection not established, can't send data=>${error}`,\n );\n }\n }\n }\n\n private emitDescriptor(\n messageType: EMessageTypeValues,\n descriptor: MetaBoxCommandPacket,\n ) {\n // Convert the descriptor object into a JSON string.\n const descriptorAsString = JSON.stringify(descriptor);\n\n // Add the UTF-16 JSON string to the array byte buffer, going two bytes at\n // a time.\n const data = new DataView(\n new ArrayBuffer(1 + 2 + 2 * descriptorAsString.length),\n );\n let byteIdx = 0;\n data.setUint8(byteIdx, messageType);\n byteIdx++;\n data.setUint16(byteIdx, descriptorAsString.length, true);\n byteIdx += 2;\n\n for (let i = 0; i < descriptorAsString.length; i++) {\n data.setUint16(byteIdx, descriptorAsString.charCodeAt(i), true);\n byteIdx += 2;\n }\n\n this.sendInputData(data.buffer);\n }\n\n private requestInitialSettings() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestInitialSettings]).buffer,\n );\n }\n\n private requestQualityControl() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestQualityControl]).buffer,\n );\n }\n\n private listenVideo() {\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized).subscribe(() =>\n this.prepareScreen(),\n );\n }\n\n private prepareScreen() {\n this.showPlayOverlay();\n this.freezeFrame.invalidate();\n }\n\n private showPlayOverlay() {\n const callback = () => {\n this.videoService.play();\n resetAfk();\n sendSignal(UnrealInternalSignalEvents.VideoPlayClick, {\n text: 'Play Clicked',\n });\n\n return true;\n };\n\n sendSignal(UnrealInternalSignalEvents.ShowPlayButton, {\n text: 'Play',\n callback,\n });\n }\n}\n","import type {\n FAlignProductsToPlaneCommand,\n FAlignProductsToPlanePayload,\n FApplyCameraPresetCommand,\n FApplyZoomCommand,\n FApplyZoomPayload,\n FBoolPayload,\n FCameraBoxCommand,\n FCameraClampsPayload,\n FCameraPresetPayload,\n FCameraRecenterCommand,\n FCameraSettingsCommand,\n FCameraSettingsPayload,\n FChangeGizmoTypeCommand,\n FChangeResolutionCommand,\n FClampPanToProductsCommand,\n FClickSnapCommand,\n FComposurePayload,\n FControlCameraModePayload,\n FControlSensitivityCommand,\n FControlSensitivityPayload,\n FDebugModeCommand,\n FDragCommand,\n FDragSequenceCommand,\n FDragSequencePayload,\n FDropCommand,\n FDropPayload,\n FEnableComposureCommand,\n FEnableControlsCommand,\n FEnableSpinnerModeCommand,\n FEnableTeleportCommand,\n FExecuteConsoleCommandCommand,\n FFitToObjectsCommand,\n FFitToObjectsPayload,\n FFreezeFrameCommand,\n FFStringPayload,\n FFStringsPayload,\n FFVectorPayload,\n FGizmoTypePayload,\n FInitSequenceByObjectNameCommand,\n FInitSequenceByObjectNamePayload,\n FJumpToSequenceCommand,\n FJumpToSequencePayload,\n FLevelPayload,\n FLoadLevelCommand,\n FLoadProductCommand,\n FLoadSceneStateCommand,\n FLoadSceneStatePayload,\n FLoopBackCommand,\n FMoveSelectedCommand,\n FMoveSelectedPayload,\n FPauseSequenceCommand,\n FPlaySequenceCommand,\n FPlaySequencePayload,\n FProductPayload,\n FRenderPayload,\n FRequestCameraPresetCommand,\n FResetControlClampsCommand,\n FResolutionPayload,\n FRotatePayload,\n FRotateSelectedCommand,\n FSelectProductByObjectNameCommand,\n FSelectProductByObjectNamePayload,\n FSetCameraControlClampsCommand,\n FSetControlCameraModeCommand,\n FSetMaterialCommand,\n FSetMaterialPayload,\n FSetPawnMovementModeCommand,\n FSetPawnMovementModePayload,\n FSetProductsLocationCommand,\n FSetProductsLocationPayload,\n FSetSettingsSequenceCommand,\n FSettingsSequencePayload,\n FStopSequenceCommand,\n FTakeRenderCommand,\n FTakeSpinnerRenderCommand,\n FTakeSpinnerRenderPreviewCommand,\n FUnLoadAllLevelsCommand,\n FUnLoadAllProductsCommand,\n FUnLoadProductByObjectNameCommand,\n FUnselectAllProductsCommand,\n FWeatherCommand,\n FWeatherPayload,\n} from '@struct';\nimport { MetaBoxCommand } from '@struct';\n\nexport const getResetControlClampsCommand = (): FResetControlClampsCommand => ({\n command: MetaBoxCommand.FResetControlClampsCommand,\n});\nexport const getCameraRecenterCommand = (): FCameraRecenterCommand => ({\n command: MetaBoxCommand.FCameraRecenterCommand,\n});\nexport const unLoadAllLevelsCommand = (): FUnLoadAllLevelsCommand => ({\n command: MetaBoxCommand.FUnLoadAllLevelsCommand,\n});\nexport const getDragCommand = (): FDragCommand => ({\n command: MetaBoxCommand.FDragCommand,\n});\nexport const getUnselectAllProductsCommand =\n (): FUnselectAllProductsCommand => ({\n command: MetaBoxCommand.FUnselectAllProductsCommand,\n });\nexport const getPauseSequenceCommand = (): FPauseSequenceCommand => ({\n command: MetaBoxCommand.FPauseSequenceCommand,\n});\nexport const getStopSequenceCommand = (): FStopSequenceCommand => ({\n command: MetaBoxCommand.FStopSequenceCommand,\n});\nexport const getUnLoadAllProductsCommand = (): FUnLoadAllProductsCommand => ({\n command: MetaBoxCommand.FUnLoadAllProductsCommand,\n});\nexport const getRequestCameraPresetCommand =\n (): FRequestCameraPresetCommand => ({\n command: MetaBoxCommand.FRequestCameraPresetCommand,\n });\nexport const getLoopBackCommand = (): FLoopBackCommand => ({\n command: MetaBoxCommand.FLoopBackCommand,\n});\nexport const getSetFpsCommand = (\n fpsRequired: number,\n): FExecuteConsoleCommandCommand => ({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload: { value: `t.MaxFPS ${fpsRequired}` },\n});\nexport const getFreezeFrameCommand = (\n payload: FBoolPayload,\n source: string,\n): FFreezeFrameCommand =>\n ({\n command: MetaBoxCommand.FFreezeFrameCommand,\n payload,\n source,\n }) as FFreezeFrameCommand;\nexport const getDragSequenceCommand = (\n payload: FDragSequencePayload,\n): FDragSequenceCommand => ({\n command: MetaBoxCommand.FDragSequenceCommand,\n payload,\n});\nexport const alignProductsToPlaneCommand = (\n payload: FAlignProductsToPlanePayload,\n): FAlignProductsToPlaneCommand => ({\n command: MetaBoxCommand.FAlignProductsToPlaneCommand,\n payload,\n});\nexport const getApplyCameraPresetCommand = (\n payload: FCameraPresetPayload,\n): FApplyCameraPresetCommand => ({\n command: MetaBoxCommand.FApplyCameraPresetCommand,\n payload,\n});\nexport const getLoadSceneStateCommand = (\n payload: FLoadSceneStatePayload,\n): FLoadSceneStateCommand => ({\n command: MetaBoxCommand.FLoadSceneStateCommand,\n payload,\n});\nexport const getClickSnapCommand = (\n payload: FBoolPayload,\n): FClickSnapCommand => ({\n command: MetaBoxCommand.FClickSnapCommand,\n payload,\n});\nexport const getSetControlCameraModeCommand = (\n payload: FControlCameraModePayload,\n): FSetControlCameraModeCommand => ({\n command: MetaBoxCommand.FSetControlCameraModeCommand,\n payload,\n});\nexport const getSetCameraControlClampsCommand = (\n payload: FCameraClampsPayload,\n): FSetCameraControlClampsCommand => ({\n command: MetaBoxCommand.FSetCameraControlClampsCommand,\n payload,\n});\nexport const getSetPawnMovementModeCommand = (\n payload: FSetPawnMovementModePayload,\n): FSetPawnMovementModeCommand => ({\n command: MetaBoxCommand.FSetPawnMovementModeCommand,\n payload,\n});\nexport const getEnableTeleportCommand = (\n payload: FBoolPayload,\n): FEnableTeleportCommand => ({\n command: MetaBoxCommand.FEnableTeleportCommand,\n payload,\n});\nexport const getApplyZoomCommand = (\n payload: FApplyZoomPayload,\n): FApplyZoomCommand => ({\n command: MetaBoxCommand.FApplyZoomCommand,\n payload,\n});\nexport const getCameraBoxCommand = (\n payload: FFVectorPayload,\n): FCameraBoxCommand => ({\n command: MetaBoxCommand.FCameraBoxCommand,\n payload,\n});\nexport const getDropCommand = (payload?: FDropPayload): FDropCommand => ({\n command: MetaBoxCommand.FDropCommand,\n payload,\n});\nexport const getSelectProductByObjectNameCommand = (\n payload: FSelectProductByObjectNamePayload,\n): FSelectProductByObjectNameCommand => ({\n command: MetaBoxCommand.FSelectProductByObjectNameCommand,\n payload,\n});\nexport const getChangeGizmoTypeCommand = (\n payload: FGizmoTypePayload,\n): FChangeGizmoTypeCommand => ({\n command: MetaBoxCommand.FChangeGizmoTypeCommand,\n payload,\n});\nexport const getWeatherCommand = (\n payload: FWeatherPayload,\n): FWeatherCommand => ({\n command: MetaBoxCommand.FWeatherCommand,\n payload,\n});\nexport const getFitToObjectsCommand = (\n payload?: FFitToObjectsPayload,\n): FFitToObjectsCommand => ({\n command: MetaBoxCommand.FFitToObjectsCommand,\n payload,\n});\nexport const setProductsLocationCommand = (\n payload: FSetProductsLocationPayload,\n): FSetProductsLocationCommand => ({\n command: MetaBoxCommand.FSetProductsLocationCommand,\n payload,\n});\nexport const getChangeResolutionCommand = (\n payload: FResolutionPayload,\n): FChangeResolutionCommand => ({\n command: MetaBoxCommand.FChangeResolutionCommand,\n payload,\n});\nexport const getEnableSpinnerModeCommand = (\n payload: FBoolPayload,\n): FEnableSpinnerModeCommand => ({\n command: MetaBoxCommand.FEnableSpinnerModeCommand,\n payload,\n});\nexport const getControlSensitivityCommand = (\n payload: FControlSensitivityPayload,\n): FControlSensitivityCommand => ({\n command: MetaBoxCommand.FControlSensitivityCommand,\n payload,\n});\nexport const getCameraSettingsCommand = (\n payload: FCameraSettingsPayload,\n): FCameraSettingsCommand => ({\n command: MetaBoxCommand.FCameraSettingsCommand,\n payload,\n});\nexport const getDebugModeCommand = (\n payload: FBoolPayload,\n): FDebugModeCommand => ({\n command: MetaBoxCommand.FDebugModeCommand,\n payload,\n});\nexport const getEnableControlsCommand = (\n payload: FBoolPayload,\n): FEnableControlsCommand => ({\n command: MetaBoxCommand.FEnableControlsCommand,\n payload,\n});\nexport const getExecuteConsoleCommand = (\n payload: FFStringPayload,\n): FExecuteConsoleCommandCommand => ({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload,\n});\nexport const getInitSequenceByObjectNameCommand = (\n payload: FInitSequenceByObjectNamePayload,\n): FInitSequenceByObjectNameCommand => ({\n command: MetaBoxCommand.FInitSequenceByObjectNameCommand,\n payload,\n});\nexport const getPlaySequenceCommand = (\n payload: FPlaySequencePayload,\n): FPlaySequenceCommand => ({\n command: MetaBoxCommand.FPlaySequenceCommand,\n payload,\n});\nexport const getJumpToSequenceCommand = (\n payload: FJumpToSequencePayload,\n): FJumpToSequenceCommand => ({\n command: MetaBoxCommand.FJumpToSequenceCommand,\n payload,\n});\nexport const getMoveSelectedCommand = (\n payload: FMoveSelectedPayload,\n): FMoveSelectedCommand => ({\n command: MetaBoxCommand.FMoveSelectedCommand,\n payload,\n});\nexport const getRotateSelectedCommand = (\n payload: FRotatePayload,\n): FRotateSelectedCommand => ({\n command: MetaBoxCommand.FRotateSelectedCommand,\n payload,\n});\nexport const getTakeRenderCommand = (\n payload: FRenderPayload,\n): FTakeRenderCommand => ({\n command: MetaBoxCommand.FTakeRenderCommand,\n payload,\n});\nexport const getTakeSpinnerRenderPreviewCommand = (\n payload: FRenderPayload,\n): FTakeSpinnerRenderPreviewCommand => ({\n command: MetaBoxCommand.FTakeSpinnerRenderPreviewCommand,\n payload,\n});\nexport const getTakeSpinnerRenderCommand = (\n payload: FRenderPayload,\n): FTakeSpinnerRenderCommand => ({\n command: MetaBoxCommand.FTakeSpinnerRenderCommand,\n payload,\n});\nexport const getSetMaterialCommand = (\n payload: FSetMaterialPayload,\n): FSetMaterialCommand => ({\n command: MetaBoxCommand.FSetMaterialCommand,\n payload,\n});\nexport const getLoadProductCommand = (\n payload: FProductPayload,\n): FLoadProductCommand => ({\n command: MetaBoxCommand.FLoadProductCommand,\n payload,\n});\nexport const getUnLoadProductByObjectNameCommand = (\n payload: FFStringPayload,\n): FUnLoadProductByObjectNameCommand => ({\n command: MetaBoxCommand.FUnLoadProductByObjectNameCommand,\n payload,\n});\nexport const getLoadLevelCommand = (\n payload: FLevelPayload,\n): FLoadLevelCommand => ({\n command: MetaBoxCommand.FLoadLevelCommand,\n payload,\n});\nexport const getEnableComposureCommand = (\n payload: FComposurePayload,\n): FEnableComposureCommand => ({\n command: MetaBoxCommand.FEnableComposureCommand,\n payload,\n});\nexport const clampPanToProductsCommand = (\n payload?: FFStringsPayload,\n): FClampPanToProductsCommand => ({\n command: MetaBoxCommand.FClampPanToProductsCommand,\n payload,\n});\nexport const getSetSettingsSequenceCommand = (\n payload: FSettingsSequencePayload,\n): FSetSettingsSequenceCommand => ({\n command: MetaBoxCommand.FSetSettingsSequenceCommand,\n payload,\n});\n","import type { FVector2DJson, MetaBoxCommand } from '@struct';\nimport { inject, Injectable } from '@angular/core';\nimport type { Observable, TimeInterval } from 'rxjs';\nimport { concatMap, from, of, Subject, throwError, timer } from 'rxjs';\nimport {\n catchError,\n delay,\n filter,\n first,\n map,\n switchMap,\n takeUntil,\n tap,\n timeInterval,\n timeout,\n toArray,\n} from 'rxjs/operators';\nimport { VideoService } from '../services/video.service';\nimport { setFreezeFrameFromVideo } from '../store/unreal.actions';\nimport type { FreezeFrameMessage } from '../interfaces/freeze-frame-message.interface';\nimport { Store } from '@ngrx/store';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { observeCommandResponse } from '../helpers/CommandObserver';\nimport { resetAfk } from '../helpers/resetAfk';\nimport type { ImageOutputValues } from '@3dsource/utils';\nimport {\n clampf,\n generateUuid,\n ImageOutput,\n lerp,\n Logger,\n tapLog,\n} from '@3dsource/utils';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { fromSignal } from '../helpers/EventWrapper';\nimport { concatLatestFrom } from '@ngrx/operators';\nimport { getImageFromVideoStream } from '../helpers/get-image-from-video-stream';\nimport type { StreamResolutionProps } from '../interfaces/stream-resolution.interface';\nimport { UnrealCommunicatorService } from '../services/unreal-communicator.service';\nimport {\n getChangeResolutionCommand,\n getFitToObjectsCommand,\n getFreezeFrameCommand,\n} from '../helpers/prepare-commands';\nimport { FULL_HD_HEIGHT, FULL_HD_WIDTH } from '../constants/unreal.constant';\nimport { forceResizeUnrealVideo } from '../helpers/dispatchResize';\n\ninterface CameraEntity {\n id: string;\n label: string;\n order: number;\n}\n\n@Injectable()\nexport class ImageCaptureService {\n #store = inject(Store);\n #videoService = inject(VideoService);\n #commandsSender = inject(UnrealCommunicatorService);\n #reset$ = new Subject<void>();\n\n getCurrentCamera(\n imageOutput: ImageOutputValues,\n lockViewPortWithVideoFreeze = true,\n resolution?: FVector2DJson,\n ): Observable<string | null> {\n if (resolution) {\n this.#commandsSender.sendCommandToUnreal(\n getChangeResolutionCommand({ resolution }),\n );\n }\n\n const video = this.#videoService.video;\n\n if (lockViewPortWithVideoFreeze && video) {\n this.#showLoader(this.getVideoSnapshot(), 0, 1);\n }\n\n return of(null).pipe(\n switchMap(() => {\n if (resolution) {\n this.#commandsSender.sendCommandToUnreal(getFitToObjectsCommand());\n return timer(500);\n }\n return of(null);\n }),\n switchMap(() => this.#getFreezeFrameOrVideoImage(imageOutput, 0, 1)),\n first(),\n tap(() => this.#finalize()),\n );\n }\n\n captureCameras(\n imageOutput: ImageOutputValues,\n cameraList: CameraEntity[],\n ): Observable<string[]> {\n const video = this.#videoService.video;\n\n if (!video || video.paused) {\n queueMicrotask(() => this.#finalize());\n return of([]);\n }\n\n this.#reset$.next();\n\n return of(cameraList).pipe(\n concatLatestFrom(() => [\n this.#store.select(unrealFeature.selectStreamResolution),\n ]),\n switchMap(([list, resolution]) =>\n this.#mapListToImages({\n list,\n resolution,\n imageOutput,\n }),\n ),\n first(),\n tap(() => this.#finalize()),\n );\n }\n\n #mapListToImages({ list, resolution, imageOutput }: CameraListProcessing) {\n const videoStillImage = this.getVideoSnapshot(ImageOutput.PNG, resolution);\n\n return from(list).pipe(\n concatMap((item, index) =>\n of(item).pipe(\n tap(() => this.#showLoader(videoStillImage, index, list.length)),\n tap(() =>\n this.#commandsSender.sendCommandToUnreal(\n getChangeResolutionCommand({\n resolution: {\n x: FULL_HD_WIDTH,\n y: FULL_HD_HEIGHT,\n },\n }),\n ),\n ),\n delay(2000), // Camera Stabilization time\n switchMap(\n () =>\n this.#getFreezeFrameOrVideoImage(\n imageOutput,\n index,\n list.length,\n ) as Observable<string>,\n ),\n first(),\n ),\n ),\n takeUntil(this.#reset$),\n toArray(),\n );\n }\n\n #getFreezeFrameOrVideoImage(\n imageOutput: ImageOutputValues,\n index: number,\n totalCameras: number,\n ) {\n return this.getFreezeImage(index, totalCameras).pipe(\n switchMap((image) =>\n image ? of(image) : this.#getVideoImage(imageOutput),\n ),\n );\n }\n\n /**\n * Get freeze-frame image from Unreal\n * @param totalImages - total images in queue will be shown in progress bar\n * @param index\n */\n getFreezeImage(index: number, totalImages: number): Observable<string | null>;\n\n /**\n * Get freeze-frame image from Unreal;\n * No progress bar will be shown\n */\n getFreezeImage(): Observable<string | null>;\n\n getFreezeImage(index?: number, totalImages?: number) {\n return this.#getFreezeImageTask(index, totalImages);\n }\n\n #getFreezeImageTask(index?: number, totalImages?: number) {\n const uuid = generateUuid();\n const totalTimeout = 20000;\n const chunkTimout = 7000;\n let videoStillImage: string | null;\n\n return this.#store\n .select(unrealFeature.selectFreezeFrameFromVideo)\n .pipe(\n tap((image) => {\n videoStillImage =\n image.dataUrl || this.getVideoSnapshot(ImageOutput.PNG);\n }),\n tapLog('FRAME: Requesting freeze frame =>', uuid),\n switchMap(() =>\n observeCommandResponse<MetaBoxCommand.FFreezeFrameCommand>(\n getFreezeFrameCommand({ value: true }, 'ics'),\n (data) => this.#commandsSender.sendCommandToUnreal(data),\n ),\n ),\n switchMap(() =>\n fromSignal(UnrealInternalSignalEvents.FreezeFrameStart).pipe(first()),\n ),\n timeout(totalTimeout),\n catchError(() =>\n this.#handleErrorWithMessage(`FRAME: Freeze frame ${uuid} timeout!`),\n ),\n tap(() => Logger.time(`FRAME: Freeze frame time ${uuid}`)),\n )\n .pipe(\n switchMap(() => this.#store.select(unrealFeature.selectFreezeFrame)),\n timeInterval(),\n concatMap((i: TimeInterval<FreezeFrameMessage>) => {\n if (i.interval > chunkTimout) {\n return throwError(() => new Error('Timeout'));\n }\n\n return of(i.value);\n }),\n tap(() => resetAfk()),\n tap((event) => {\n if (totalImages !== undefined && index !== undefined) {\n this.#showLoader(\n videoStillImage,\n index,\n totalImages,\n event.progress || 0,\n );\n }\n }),\n filter((event) => event.progress === 1),\n )\n .pipe(\n tap(() => Logger.timeEnd(`FRAME: Freeze frame time ${uuid}`)),\n map((event) => event.dataUrl),\n catchError((error: unknown) =>\n this.#handleErrorWithMessage(\n 'No freeze image, try catch video=>' + error,\n of(null),\n ),\n ),\n takeUntil(this.#reset$),\n )\n .pipe(\n tap((img) =>\n Logger.log(\n 'FRAME: Captured image from freeze =>',\n img ? 'ok' : 'failed',\n uuid,\n ),\n ),\n );\n }\n\n #handleErrorWithMessage<T>(\n msg: string,\n returnOperator?: Observable<T>,\n ): Observable<T | never> {\n Logger.error(msg);\n\n return returnOperator || throwError(() => new Error(msg));\n }\n\n #getVideoImage(imageOutput?: ImageOutputValues): Observable<string | null> {\n this.#freezeFrame(false);\n\n return of(null).pipe(\n delay(1000),\n map(() => getImageFromVideoStream('constant', imageOutput)),\n tap((img) =>\n Logger.log('Captured image from video =>', img ? 'ok' : 'failed'),\n ),\n takeUntil(this.#reset$),\n );\n }\n\n #freezeFrame(freeze: boolean) {\n this.#commandsSender.sendCommandToUnreal(\n getFreezeFrameCommand({ value: freeze }, 'isc2'),\n );\n }\n\n #finalize() {\n this.#reset$.next();\n this.#store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(\n first(),\n tap(() => forceResizeUnrealVideo()),\n delay(1500),\n tap((isLow) => {\n this.#store.dispatch(\n setFreezeFrameFromVideo({ dataUrl: null, progress: null }),\n );\n this.#freezeFrame(isLow);\n }),\n )\n .subscribe();\n }\n\n #showLoader(\n videoStillImage: string | null,\n index: number,\n totalImages: number,\n currentImageProgress = 0,\n ) {\n this.#store.dispatch(\n setFreezeFrameFromVideo({\n dataUrl: videoStillImage,\n progress: null,\n }),\n );\n\n // Ensure that the position and ofImages are valid\n if (totalImages <= 0) {\n console.warn('ofImages should be greater than 0.');\n return;\n }\n\n // Each image contributes equally to the total progress\n const progressPerImage = 94 / totalImages;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const totalProgress = clampf(\n 1,\n 100,\n lerp(\n progressPerImage * index,\n progressPerImage * (index + 1),\n currentImageProgress,\n ),\n );\n }\n\n getVideoSnapshot(\n imageOutput?: ImageOutputValues,\n resolution?: StreamResolutionProps,\n ) {\n return getImageFromVideoStream('video', imageOutput, resolution);\n }\n}\n\ninterface CameraListProcessing {\n list: CameraEntity[];\n resolution: StreamResolutionProps;\n imageOutput: ImageOutputValues;\n}\n","export const getPdfUrl = (blob: Blob, pdfName: string) => {\n // IMPORTANT: this needed for safari download in mobile in new tab\n const file = new Blob([blob], { type: 'application/octet-stream' });\n const url = URL.createObjectURL(file);\n const linkElement = document.createElement('a');\n document.body.appendChild(linkElement);\n linkElement.style.display = 'none';\n linkElement.href = url;\n linkElement.target = '_blank';\n linkElement.download = pdfName;\n linkElement.click();\n URL.revokeObjectURL(url);\n};\n","import { inject, Injectable } from '@angular/core';\nimport { ComponentStore } from '@ngrx/component-store';\nimport { Store } from '@ngrx/store';\nimport { delay, map, switchMap, tap } from 'rxjs/operators';\nimport type {\n PdfContent,\n PdfGenerationProgressInfo,\n} from '../interfaces/pdf.interface';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { generatePdfSchema } from '../helpers/generate-pdf-schema';\nimport { ImageCaptureService } from '../../../services/image-capture.service';\nimport type { Observable } from 'rxjs';\nimport { concatLatestFrom } from '@ngrx/operators';\nimport { ImageOutput } from '@3dsource/utils';\nimport { unrealFeature } from '../../../store/unreal.feature';\nimport {\n getPdfActionFinalize,\n getPdfActionSuccess,\n setFreezeFrame,\n} from '../../../store/unreal.actions';\nimport { getPdfUrl } from '../helpers/get-pdf-url';\nimport dayjs from 'dayjs';\n\ninterface PdfBlobData {\n blob: Blob | null;\n}\n\ninterface PdfComponentState extends PdfBlobData {\n content: PdfContent | null;\n saveForLater: boolean;\n debugMode: boolean;\n pdfProgressData: PdfGenerationProgressInfo;\n}\n\nconst pdfInitialData: PdfGenerationProgressInfo = {\n progress: 0,\n loaded: 0,\n total: 0,\n doc: null,\n} as const;\n\nconst initialState: PdfComponentState = {\n content: null,\n blob: null,\n saveForLater: false,\n debugMode: false,\n pdfProgressData: pdfInitialData,\n};\n\n@Injectable()\nexport class PdfComponentStore extends ComponentStore<PdfComponentState> {\n actions$ = inject(Actions);\n store = inject(Store);\n imageCaptureService = inject(ImageCaptureService);\n\n constructor() {\n super(initialState);\n }\n\n createPdf = this.updater(\n (state, content: PdfContent): PdfComponentState => ({\n ...state,\n content,\n blob: null,\n }),\n );\n saveBlobForDownloadLater = this.updater(\n (state, data: PdfBlobData): PdfComponentState => ({\n ...state,\n blob: data.blob,\n }),\n );\n updateProgressData = this.updater(\n (state, pdfProgressData: PdfGenerationProgressInfo): PdfComponentState => ({\n ...state,\n pdfProgressData,\n }),\n );\n resetPdf = this.updater((): PdfComponentState => initialState);\n resetProgressData = this.updater(\n (state): PdfComponentState => ({\n ...state,\n pdfProgressData: pdfInitialData,\n }),\n );\n\n selectPdfProgressData$ = this.select(\n ({ pdfProgressData }) => pdfProgressData,\n );\n selectIsReadyContent$ = this.select(({ content }) => !!content);\n selectContent$ = this.select(({ content }) => content);\n selectDebugMode$ = this.select(({ debugMode }) => debugMode || false);\n selectIsSaveForLater$ = this.select(({ saveForLater }) => saveForLater);\n selectPdfName$ = this.select(({ content }) => {\n if (content === null) {\n return null;\n }\n return `${dayjs().format('MMM-DD-YYYY')}-${content?.clientName}-${content.selectedItems[0]?.name}.pdf`;\n });\n selectPdfSchema$ = this.select(({ content }) =>\n content !== null ? generatePdfSchema(content || []) : null,\n );\n\n getPdfActionSuccess$ = this.effect(() =>\n this.actions$.pipe(\n ofType(getPdfActionSuccess),\n delay(1500),\n switchMap(({ content }) =>\n this.imageCaptureService\n .captureCameras(ImageOutput.JPG, [\n { id: '1', label: 'Camera', order: 0 },\n ])\n .pipe(\n map((camerasImages) => ({\n camerasImages,\n content,\n })),\n ),\n ),\n concatLatestFrom(() => [\n this.store.select(unrealFeature.selectLowBandwidth),\n ]),\n tap(([{ content, camerasImages }, lowBandwidth]) => {\n if (!lowBandwidth) {\n this.store.dispatch(\n setFreezeFrame({ dataUrl: null, progress: null }),\n );\n }\n this.createPdf({\n ...content,\n mainImage: camerasImages[0],\n });\n }),\n ),\n );\n savePdf$ = this.effect<void>((trigger$) =>\n trigger$.pipe(\n concatLatestFrom(() => [\n this.selectIsSaveForLater$,\n this.selectDebugMode$,\n this.selectPdfProgressData$,\n ]),\n tap(([, isSaveForLater, isDebugMode, pdfProgressData]) => {\n const blob = pdfProgressData?.doc?.output('blob');\n if (blob) {\n if (isSaveForLater) {\n this.saveBlobForDownloadLater({ blob });\n this.resetProgressData();\n } else {\n this.downloadPdf$({ blob });\n if (!isDebugMode) {\n this.resetPdf();\n }\n }\n }\n this.store.dispatch(getPdfActionFinalize());\n }),\n ),\n );\n downloadPdf$ = this.effect((data$: Observable<{ blob: Blob }>) =>\n data$.pipe(\n concatLatestFrom(() => this.selectPdfName$),\n tap(([{ blob }, pdfName]) =>\n getPdfUrl(\n blob,\n pdfName || `${dayjs().format('MMM-DD-YYYY')}_generated.pdf`,\n ),\n ),\n ),\n );\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport type { PdfGenerationProgressInfo } from '../interfaces/pdf.interface';\nimport { PdfGeneratorComponent } from '../components/generator/pdf-generator.component';\nimport { PdfComponentStore } from '../store/pdf.component.store';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'app-pdf',\n templateUrl: './pdf.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [PdfComponentStore],\n imports: [PdfGeneratorComponent],\n})\nexport class PdfComponent {\n pdfComponentStore = inject(PdfComponentStore);\n isReadyContent = toSignal(this.pdfComponentStore.selectIsReadyContent$);\n debugMode = toSignal(this.pdfComponentStore.selectDebugMode$);\n pdfContent = toSignal(this.pdfComponentStore.selectContent$);\n schema = toSignal(this.pdfComponentStore.selectPdfSchema$);\n\n progressChanged($event: PdfGenerationProgressInfo) {\n this.pdfComponentStore.updateProgressData($event);\n\n if ($event.progress === 1) {\n this.pdfComponentStore.savePdf$();\n }\n }\n}\n","@if (isReadyContent()) {\n <app-pdf-generator\n (progressChanged)=\"progressChanged($event)\"\n [debugMode]=\"debugMode()!\"\n [pdfContent]=\"pdfContent()!\"\n [schema]=\"schema()!\"\n />\n}\n","import type { AfterViewInit, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { VideoService } from '../../services/video.service';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { filter, skip } from 'rxjs/operators';\nimport type { SignalDescriptor } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { Falsy, Logger } from '@3dsource/utils';\nimport {\n selectShowReconnectPopup,\n selectStreamConfig,\n} from '../../store/unreal.selectors';\nimport { fromSignal } from '../../helpers/EventWrapper';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\nimport {\n SourceButtonColorScheme,\n SourceButtonComponent,\n SourceButtonSize,\n} from '@source/ui-sdk/source-button';\nimport { initSignalling } from '../../store/unreal.actions';\n\n@Component({\n selector: 'app-afk-restart-screen-locker',\n templateUrl: './afk-restart-screen-locker.component.html',\n styleUrls: ['./afk-restart-screen-locker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgOptimizedImage, SourceButtonComponent],\n})\nexport class AfkRestartScreenLockerComponent implements AfterViewInit, OnInit {\n store = inject(Store);\n videoService = inject(VideoService);\n destroyRef = inject(DestroyRef);\n\n showReconnectPopup = toSignal(this.store.select(selectShowReconnectPopup));\n isViewportReady = toSignal(\n this.store.select(unrealFeature.selectViewportReady),\n );\n imageLoadingSrc = toSignal(\n this.store.select(unrealFeature.selectImageLoadingSrc),\n );\n streamConfig = toSignal(this.store.select(selectStreamConfig));\n isSecondStart = signal(\n !!(this.streamConfig()?.autoStart && location.href.match(/^https/gi)),\n );\n\n SourceButtonSize = SourceButtonSize;\n SourceButtonColorScheme = SourceButtonColorScheme;\n playCallBack: null | (() => void) = null;\n\n ngOnInit() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.onDisconnect());\n }\n\n ngAfterViewInit() {\n fromSignal(UnrealInternalSignalEvents.ShowPlayButton)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: SignalDescriptor['ShowPlayButton']) => {\n this.playCallBack = event.callback;\n\n if (this.videoService.video?.paused) {\n Logger.info('Simulate Press Play');\n this.playCallBack();\n }\n });\n }\n\n connect() {\n this.store.dispatch(initSignalling());\n }\n\n onDisconnect() {\n this.isSecondStart.set(true);\n this.playCallBack = null;\n }\n}\n","@if (!isViewportReady()) {\n <div class=\"preload\">\n <div class=\"back\">\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n </div>\n\n @if (showReconnectPopup()) {\n <div class=\"stream-message-wrapper\">\n <div class=\"resume-box\">\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [size]=\"SourceButtonSize.LARGE\"\n [colorScheme]=\"SourceButtonColorScheme.PRIMARY\"\n [label]=\"isSecondStart() ? 'Resume' : 'Start'\"\n [data-testid]=\"'connect-button'\"\n class=\"connect-button\"\n >\n </src-button>\n </div>\n </div>\n }\n </div>\n}\n","import { KeyboardStringCode } from '@3dsource/utils';\nimport { ESequenceLoopBehavior } from '@struct';\n\nexport const KEY_DOWN_VALUES: string[] = [\n KeyboardStringCode.ArrowLeft,\n KeyboardStringCode.ArrowRight,\n KeyboardStringCode.Space,\n];\n\nexport const INIT_SHOWCASE_PARAMS = {\n playRate: 1,\n timeResponseChangeCallBack: 0.05,\n loopBehavior: ESequenceLoopBehavior.loop,\n};\n","import type {\n OnChangeSequenceData,\n SectionEntities,\n SectionEntity,\n SectionsPayloadInit,\n SequenceData,\n SettingSequence,\n} from './show-case.component.interface';\nimport { inject, Injectable } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { filter, tap } from 'rxjs/operators';\nimport { UnrealCommunicatorService } from '../../../services/unreal-communicator.service';\nimport {\n getPauseSequenceCommand,\n getPlaySequenceCommand,\n} from '../../../helpers/prepare-commands';\nimport { ShowCaseStatus } from '../interfaces/showcase-status';\nimport { ESequenceLoopBehavior } from '@struct';\nimport { ImmerComponentStore } from 'ngrx-immer/component-store';\nimport { Actions } from '@ngrx/effects';\nimport { Observable } from 'rxjs';\nimport { concatLatestFrom } from '@ngrx/operators';\nimport { unrealFeature } from '../../../store/unreal.feature';\nimport { playPauseShowcase } from '../../../store/unreal.actions';\n\ninterface ShowcaseComponentStoreProps extends SettingSequence {\n sectionEntity: SectionEntity | null;\n sectionEntities: SectionEntities | null;\n totalCountSection: number;\n currentSectionId: number;\n currentSectionTime: number;\n currentGlobalTime: number;\n totalDuration: number;\n direction: number;\n timeResponseChangeCallBack: number;\n sequenceName: string;\n}\n\nconst initialState: ShowcaseComponentStoreProps = {\n playRate: 0.5,\n timeResponseChangeCallBack: 0.05, // IMPORTANT: min - 0.05 !!!\n direction: 1,\n loopBehavior: ESequenceLoopBehavior.loop,\n sectionEntity: null,\n sectionEntities: null,\n totalCountSection: 0,\n currentGlobalTime: 0,\n currentSectionId: 0,\n currentSectionTime: 0,\n totalDuration: 0,\n sequenceName: '',\n reverse: false,\n};\n\n@Injectable()\nexport class ShowCaseComponentStore extends ImmerComponentStore<ShowcaseComponentStoreProps> {\n actions$ = inject(Actions);\n #commandsSender = inject(UnrealCommunicatorService);\n #store = inject(Store);\n\n constructor() {\n super(initialState);\n }\n\n initSequence = this.updater(\n (state, data: SectionsPayloadInit): ShowcaseComponentStoreProps => ({\n ...state,\n playRate: data.playRate,\n sectionEntities: data.sections,\n totalCountSection: data.sections.length,\n totalDuration:\n data.sections[Math.max(0, data.sections.length - 1)]?.endTime || 0,\n sectionEntity: data.sections?.[0],\n currentSectionId: data.sections?.[0].id,\n currentGlobalTime: 0,\n }),\n );\n changeSequence = this.updater(\n (\n state: ShowcaseComponentStoreProps,\n data: OnChangeSequenceData,\n ): ShowcaseComponentStoreProps => {\n if (state.sectionEntities === null) {\n return state;\n }\n\n if (\n state.loopBehavior === ESequenceLoopBehavior.pingPongSection &&\n state.currentSectionId !== data.id\n ) {\n const endTimeDifference =\n data.time - (state.sectionEntity?.endTime || 0);\n const startTimeDifference =\n data.time - (state.sectionEntity?.startTime || 0);\n\n if (\n data.direction === 1 &&\n endTimeDifference < 0.1 &&\n endTimeDifference > 0\n ) {\n return state;\n }\n\n if (\n data.direction === -1 &&\n startTimeDifference < 0.2 &&\n startTimeDifference > 0\n ) {\n return state;\n }\n }\n state.sectionEntity = state.sectionEntities[data.id];\n state.currentSectionId = data.id;\n state.currentGlobalTime = data.time / state.playRate;\n state.direction = data.direction;\n return state;\n },\n );\n changeLoopBehavior = this.updater(\n (state, value: ESequenceLoopBehavior): void => {\n state.loopBehavior = value;\n },\n );\n finishedSequenceSuccess = this.updater((state, data: SequenceData): void => {\n state.sectionEntity = state.sectionEntities?.[data.id] || null;\n state.currentSectionId = data.id;\n state.currentGlobalTime = data.time / state.playRate;\n });\n\n selectIsPingPongSection$ = this.select(\n ({ loopBehavior }) =>\n loopBehavior === ESequenceLoopBehavior.pingPongSection,\n );\n selectIsLoopSection$ = this.select(\n ({ loopBehavior }) => loopBehavior === ESequenceLoopBehavior.loopSection,\n );\n selectLoopBehavior$ = this.select(({ loopBehavior }) => loopBehavior);\n currentSection$ = this.select(({ sectionEntity }) => sectionEntity);\n\n finishedSequence$ = this.effect(($data: Observable<SequenceData>) =>\n $data.pipe(\n concatLatestFrom(() => [this.selectLoopBehavior$]),\n tap(([data, loopBehavior]) => {\n if (loopBehavior === ESequenceLoopBehavior.none) {\n this.pauseShowCaseEffect$();\n }\n this.finishedSequenceSuccess(data);\n }),\n ),\n );\n playShowCaseEffect$ = this.effect(($) =>\n $.pipe(\n concatLatestFrom(() => [\n this.#store.select(unrealFeature.selectLowBandwidth),\n ]),\n tap(() =>\n this.#store.dispatch(\n playPauseShowcase({ showcase: ShowCaseStatus.PLAY }),\n ),\n ),\n filter(([, isLow]) => !isLow),\n tap(() =>\n this.#commandsSender.sendCommandToUnreal(\n getPlaySequenceCommand({ playRate: 1, reverse: false }),\n ),\n ),\n ),\n );\n pauseShowCaseEffect$ = this.effect(($) =>\n $.pipe(\n concatLatestFrom(() => [\n this.#store.select(unrealFeature.selectLowBandwidth),\n this.#store.select(unrealFeature.selectShowCaseStatus),\n ]),\n tap(() =>\n this.#store.dispatch(\n playPauseShowcase({ showcase: ShowCaseStatus.PAUSE }),\n ),\n ),\n filter(\n ([, isLow, showcase]) =>\n !isLow || (isLow && showcase !== ShowCaseStatus.STOP),\n ),\n tap(() =>\n this.#commandsSender.sendCommandToUnreal(getPauseSequenceCommand()),\n ),\n ),\n );\n}\n","import type {\n SectionPayloadOnInit,\n SectionsPayloadInit,\n} from '../store/show-case.component.interface';\nimport { clampf } from '@3dsource/utils';\nimport type { ProductShowcase } from '../interfaces/showcase-status';\n\nexport const mapOnInitSequenceData = (\n data: SectionPayloadOnInit,\n lbm: boolean,\n product: ProductShowcase,\n): SectionsPayloadInit => {\n const playRate = 1;\n\n const totalShowcaseTime =\n product.showcase?.duration ||\n // Fallback to the old approach\n data.sections[Math.max(0, data?.sections?.length - 1)]?.endTime ||\n 0;\n\n const totalDuration = totalShowcaseTime / data?.playRate;\n\n if (lbm) {\n const segmentDuration = 3;\n let timecodes = data.sections\n .map((entity) => entity.startTime)\n .map((time) => ({ time, duration: segmentDuration }));\n\n if (product.showcase?.lowBandwidth.length) {\n timecodes = product.showcase?.lowBandwidth;\n }\n\n const sections = timecodes.map(({ time, duration }, index) => {\n const segmentWidth = (1 / timecodes.length) * 100;\n const startTime = index * duration;\n const endTime = startTime + duration;\n const lbmTime = clampf(0, totalShowcaseTime, time);\n\n return {\n id: index,\n startTime,\n endTime,\n sectionName: `Section #${index + 1}`,\n segmentWidth,\n segmentDuration: duration,\n lbmTime,\n };\n });\n\n return {\n sections,\n playRate: 1,\n };\n } else {\n const sections = data.sections.map((entity, index) => {\n const segmentDuration = (entity.endTime - entity.startTime) / playRate;\n const segmentWidth = (segmentDuration / totalDuration) * 100;\n\n return {\n ...entity,\n startTime: entity.startTime / playRate,\n endTime: entity.endTime / playRate,\n sectionName: `Section #${index + 1}`,\n segmentWidth,\n segmentDuration,\n };\n });\n\n return {\n sections,\n playRate: data.playRate,\n };\n }\n};\n","import {\n AfterViewInit,\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n Output,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { debounceTime, fromEvent, merge, Subject } from 'rxjs';\nimport { distinctUntilChanged, throttleTime } from 'rxjs/operators';\nimport type { Coords } from '@3dsource/utils';\nimport { clampf } from '@3dsource/utils';\n\n@Directive({\n selector: '[appUserInteract]',\n})\nexport class UserInteractDirective implements AfterViewInit {\n isFullscreen = input.required<boolean>();\n isFullscreenActive = toObservable(\n computed(() => this.isFullscreen() || false),\n ).pipe(distinctUntilChanged());\n @Output() userInteract = new Subject<\n Coords & { activate: boolean; pressed: boolean; hovering: boolean }\n >();\n private element!: HTMLElement;\n private floatY!: number;\n private floatX!: number;\n private pressed!: boolean;\n private bounds!: DOMRect;\n private hovering!: boolean;\n private ref = inject(ElementRef);\n private destroyRef = inject(DestroyRef);\n\n ngAfterViewInit() {\n this.element = this.ref.nativeElement;\n this.onResize();\n\n merge(\n fromEvent(window, 'resize'),\n fromEvent(window, 'orientationchange'),\n this.isFullscreenActive,\n )\n .pipe(debounceTime(300), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.onResize());\n\n fromEvent(this.element, 'mousedown')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((e: Event) => {\n this.onMouseDown(e as MouseEvent);\n });\n\n fromEvent(document, 'mousemove')\n .pipe(throttleTime(30), takeUntilDestroyed(this.destroyRef))\n .subscribe((e: Event) => {\n this.onDocumentMouseMove(e as MouseEvent);\n });\n\n fromEvent(this.element, 'touchstart')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((e: Event) => {\n this.onTouchStart(e as TouchEvent);\n });\n\n fromEvent(document, 'touchmove')\n .pipe(throttleTime(30), takeUntilDestroyed(this.destroyRef))\n .subscribe((e) => {\n if (e instanceof TouchEvent) {\n this.onDocumentTouchMove(e);\n }\n });\n\n fromEvent(this.element, 'mouseout')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.onMouseOut();\n });\n\n fromEvent(document, 'touchend')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.onDocumentMouseUp();\n });\n\n fromEvent(document, 'mouseup')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.onDocumentMouseUp();\n });\n }\n\n private onMouseDown($event: MouseEvent) {\n if ($event.which === 1) {\n $event.preventDefault();\n this.pressed = true;\n this.onDocumentMouseMove($event);\n }\n }\n\n private onTouchStart($event: TouchEvent) {\n // Prevents the window from scrolling\n $event.preventDefault();\n\n this.pressed = true;\n this.onDocumentTouchMove($event);\n }\n\n private onMouseOut() {\n if (!this.pressed) {\n this.pressed = false;\n this.hovering = false;\n this.dispatch();\n }\n }\n\n private onDocumentTouchMove($event: TouchEvent) {\n const touch = $event.touches[0] || $event.changedTouches[0];\n this.setFloats(\n (touch.pageX - this.bounds.left) / this.bounds.width,\n (touch.pageY - this.bounds.top) / this.bounds.height,\n );\n }\n\n private onDocumentMouseMove($event: MouseEvent) {\n this.setFloats(\n ($event.clientX - this.bounds.left) / this.bounds.width,\n ($event.clientY - this.bounds.top) / this.bounds.height,\n );\n }\n\n private setFloats(x: number, y: number) {\n this.floatX = clampf(0, 1, x);\n this.floatY = clampf(0, 1, y);\n this.hovering = x >= 0 && x <= 1 && y >= 0 && y <= 1;\n this.dispatch(true);\n }\n\n private dispatch(activate = false) {\n this.userInteract.next({\n x: this.floatX,\n y: this.floatY,\n pressed: this.pressed,\n activate: this.pressed && activate,\n hovering: this.hovering,\n });\n }\n\n private onDocumentMouseUp() {\n this.pressed = false;\n this.dispatch();\n }\n\n private onResize() {\n this.bounds = this.element.getBoundingClientRect();\n }\n}\n","import type { OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n input,\n Output,\n output,\n} from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { combineLatestWith, fromEvent, startWith, Subject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport type {\n SectionEntities,\n SectionEntity,\n} from '../../store/show-case.component.interface';\nimport type { Coords } from '@3dsource/utils';\nimport { inverseLerp } from '@3dsource/utils';\nimport { AsyncPipe } from '@angular/common';\nimport { UserInteractDirective } from './user-interact.directive';\n\n@Component({\n selector: 'app-show-case-slider',\n templateUrl: './source-slider.component.html',\n styleUrls: ['./source-slider.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe, UserInteractDirective],\n})\nexport class SourceSliderComponent implements OnInit {\n readonly showThumb = input(true);\n readonly isFullscreen = input.required<boolean>();\n readonly sections = input<SectionEntities>([]);\n readonly section = input({} as SectionEntity);\n readonly duration = input.required<number>();\n readonly isMobile = input.required<boolean>();\n readonly lbm = input.required<boolean>();\n\n @Output() percentsFloat$ = new EventEmitter<number>(); // In 0-1 range\n dragValue = output<number>();\n dragSlider = output<boolean>();\n\n @Output() mouseSection = new Subject<SectionEntity | null>();\n\n floatPosition$!: Observable<number>;\n activeSection$!: Observable<boolean>;\n hovering!: boolean;\n isDrag = false;\n\n private _globalTime!: number;\n\n get globalTime() {\n return this._globalTime;\n }\n\n @Input() set globalTime(value: number) {\n if (this.isDrag) {\n return;\n }\n\n this._globalTime = value;\n this.updateSlider();\n }\n\n ngOnInit() {\n this.floatPosition$ = this.percentsFloat$.pipe(\n combineLatestWith(fromEvent(window, 'resize').pipe(startWith(null))),\n map(([floatNumber]) => 100 * floatNumber),\n );\n\n this.activeSection$ = this.mouseSection.pipe(\n map((section) => this.section()?.id === section?.id && !this.isMobile()),\n );\n }\n\n getSectionPosition(index: number) {\n const section = this.sections()[index];\n return (\n inverseLerp(section.startTime, section.endTime, this.globalTime, true) *\n 100\n );\n }\n\n getSectionPositionMouse(\n mouseSection: SectionEntity,\n playedSection: SectionEntity,\n index: number,\n ) {\n if (this.isMobile()) {\n return 0;\n }\n\n if (\n !mouseSection?.segmentMouseMoveTime ||\n playedSection?.id > index ||\n mouseSection?.id < index\n ) {\n return 0;\n }\n\n if (mouseSection?.id >= playedSection?.id && mouseSection?.id === index) {\n return (\n inverseLerp(\n this.sections()[index].startTime,\n this.sections()[index].endTime,\n mouseSection?.segmentMouseMoveTime,\n true,\n ) * 100\n );\n }\n\n return 100;\n }\n\n setFloatX(floatX: number) {\n const time = floatX * this.duration();\n const section =\n this.sections().find(\n ({ startTime, endTime }) => time >= startTime && time <= endTime,\n ) || ({} as SectionEntity);\n\n this.mouseSection.next({\n ...section,\n segmentMouseMoveTime: time,\n });\n }\n\n mouseout() {\n this.mouseSection.next(null);\n }\n\n private updateSlider() {\n this.percentsFloat$.emit(this.valueToPercent(this.globalTime));\n }\n\n private dispatch() {\n this.dragValue.emit(this.globalTime);\n }\n\n private valueToPercent(value: number) {\n return inverseLerp(0, this.duration(), value, true);\n }\n\n interact(\n $event: Coords & { activate: boolean; pressed: boolean; hovering: boolean },\n ) {\n const { x, pressed, activate, hovering } = $event;\n\n this.dragSlider.emit(pressed);\n this.isDrag = pressed;\n this.hovering = hovering;\n this.setFloatX(x);\n\n if (activate) {\n this._globalTime = x * this.duration();\n this.updateSlider();\n this.dispatch();\n }\n\n if (!hovering) {\n this.mouseout();\n }\n }\n}\n","@if (\n {\n floatPosition: floatPosition$ | async,\n percentsFloat: percentsFloat$ | async,\n mouseSection: mouseSection | async,\n activeSection: activeSection$ | async,\n };\n as data\n) {\n <div class=\"source-slider\">\n <div [style.left.%]=\"data.floatPosition\" class=\"thumb__wrapper\">\n @if (showThumb()) {\n <div\n [class.visible]=\"hovering || isDrag\"\n [class.activeHover]=\"data.activeSection\"\n class=\"source-slider__thumb\"\n ></div>\n }\n </div>\n\n <div class=\"track-box active\">\n @for (track of sections(); track track.id) {\n <div\n [class.active]=\"false\"\n [class.activeHover]=\"data?.mouseSection?.id === $index && !isMobile()\"\n [style.width.%]=\"track.segmentWidth\"\n class=\"track-box__item\"\n >\n <span\n [style.width.%]=\"getSectionPosition($index)\"\n class=\"track-box__position\"\n ></span>\n <span\n [style.width.%]=\"\n getSectionPositionMouse(data.mouseSection!, section(), $index)\n \"\n class=\"track-box__position_mouse\"\n ></span>\n </div>\n }\n </div>\n\n <div\n (userInteract)=\"interact($event)\"\n [isFullscreen]=\"isFullscreen()\"\n appUserInteract\n class=\"source-slider__input\"\n ></div>\n </div>\n}\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcasePauseCircle: SourceIcon = {\n name: 'si_showcase_pause_circle',\n data: ` <svg\n width='40'\n height='40'\n viewBox='0 0 40 40'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n>\n <g id='pause_circle'>\n <mask\n id='mask0_48771_3460'\n style='mask-type:alpha'\n maskUnits='userSpaceOnUse'\n x='0'\n y='0'\n width='40'\n height='40'\n >\n <rect\n id='Bounding box'\n width='40'\n height='40'\n fill='#D9D9D9'\n />\n </mask>\n <g mask='url(#mask0_48771_3460)'>\n <path\n id='pause_circle_2'\n d='M16.666 26.666C17.1393 26.666 17.5493 26.4927 17.896 26.146C18.2427 25.798 18.416 25.388 18.416 24.916V15C18.416 14.528 18.2493 14.1253 17.916 13.792C17.5827 13.4587 17.166 13.292 16.666 13.292C16.194 13.292 15.7847 13.4653 15.438 13.812C15.09 14.16 14.916 14.57 14.916 15.042V24.958C14.916 25.43 15.0827 25.8327 15.416 26.166C15.7493 26.4993 16.166 26.666 16.666 26.666ZM23.376 26.666C23.848 26.666 24.2573 26.4927 24.604 26.146C24.9507 25.798 25.124 25.388 25.124 24.916V15C25.124 14.528 24.9573 14.1253 24.624 13.792C24.2907 13.4587 23.8747 13.292 23.376 13.292C22.9027 13.292 22.4927 13.4653 22.146 13.812C21.798 14.16 21.624 14.57 21.624 15.042V24.958C21.624 25.43 21.7907 25.8327 22.124 26.166C22.4573 26.4993 22.8747 26.666 23.376 26.666ZM20 36.666C17.6947 36.666 15.528 36.2287 13.5 35.354C11.472 34.4793 9.70798 33.292 8.20798 31.792C6.70798 30.292 5.52065 28.528 4.64598 26.5C3.77132 24.472 3.33398 22.3053 3.33398 20C3.33398 17.6947 3.77132 15.528 4.64598 13.5C5.52065 11.472 6.70798 9.70798 8.20798 8.20798C9.70798 6.70798 11.472 5.52065 13.5 4.64598C15.528 3.77132 17.6947 3.33398 20 3.33398C22.3053 3.33398 24.472 3.77132 26.5 4.64598C28.528 5.52065 30.292 6.70798 31.792 8.20798C33.292 9.70798 34.4793 11.472 35.354 13.5C36.2287 15.528 36.666 17.6947 36.666 20C36.666 22.3053 36.2287 24.472 35.354 26.5C34.4793 28.528 33.292 30.292 31.792 31.792C30.292 33.292 28.528 34.4793 26.5 35.354C24.472 36.2287 22.3053 36.666 20 36.666Z'\n fill='white'\n />\n </g>\n </g>\n</svg>\n`,\n};\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcasePause: SourceIcon = {\n name: 'si_showcase_pause',\n data: `<svg\n width='32'\n height='32'\n viewBox='0 0 32 32'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n>\n <path\n d='M12.0572 24C12.6136 24 13.0956 23.7926 13.5031 23.3779C13.9107 22.9616 14.1144 22.4711 14.1144 21.9064V10.0434C14.1144 9.47869 13.9185 8.99697 13.5266 8.59817C13.1348 8.19941 12.645 8 12.0572 8C11.5023 8 11.0212 8.20738 10.6136 8.6221C10.2045 9.03843 10 9.52893 10 10.0936V21.9566C10 22.5213 10.1959 23.003 10.5878 23.4018C10.9796 23.8007 11.4694 24 12.0572 24ZM19.9451 24C20.5 24 20.9813 23.7926 21.3887 23.3779C21.7962 22.9616 22 22.4711 22 21.9064V10.0434C22 9.47869 21.8042 8.99697 21.4122 8.59817C21.0203 8.19941 20.5313 8 19.9451 8C19.3886 8 18.9067 8.20738 18.4992 8.6221C18.0901 9.03843 17.8856 9.52893 17.8856 10.0936V21.9566C17.8856 22.5213 18.0815 23.003 18.4734 23.4018C18.8653 23.8007 19.3557 24 19.9451 24Z'\n fill='white'\n />\n</svg>\n`,\n};\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcasePlay: SourceIcon = {\n name: 'si_showcase_play',\n data: `<svg\n width='32'\n height='32'\n viewBox='0 0 32 32'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n>\n <g id='play_arrow'>\n <mask\n id='mask0_49418_3162'\n style='mask-type:alpha'\n maskUnits='userSpaceOnUse'\n x='0'\n y='0'\n width='32'\n height='32'\n >\n <rect\n id='Bounding box'\n width='32'\n height='32'\n fill='#D9D9D9'\n />\n </mask>\n <g mask='url(#mask0_49418_3162)'>\n <path\n id='play_arrow_2'\n d='M10.666 22.8999V9.09993C10.666 8.72216 10.7993 8.40549 11.066 8.14993C11.3327 7.89438 11.6438 7.7666 11.9993 7.7666C12.1105 7.7666 12.2271 7.78327 12.3493 7.8166C12.4716 7.84993 12.5882 7.89993 12.6993 7.9666L23.566 14.8666C23.766 14.9999 23.916 15.1666 24.016 15.3666C24.116 15.5666 24.166 15.7777 24.166 15.9999C24.166 16.2222 24.116 16.4333 24.016 16.6333C23.916 16.8333 23.766 16.9999 23.566 17.1333L12.6993 24.0333C12.5882 24.0999 12.4716 24.1499 12.3493 24.1833C12.2271 24.2166 12.1105 24.2333 11.9993 24.2333C11.6438 24.2333 11.3327 24.1055 11.066 23.8499C10.7993 23.5944 10.666 23.2777 10.666 22.8999Z'\n fill='currentColor'\n />\n </g>\n </g>\n</svg>\n`,\n};\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcaseBoomerang: SourceIcon = {\n name: 'si_showcase_boomerang',\n data: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M4.51248 14.5C3.25416 14.5 2.1875 14.0641 1.3125 13.1923C0.4375 12.3205 0 11.258 0 10.0048C0 8.7516 0.437528 7.6875 1.31258 6.8125C2.18764 5.9375 3.25411 5.5 4.512 5.5C5.01789 5.5 5.50347 5.58681 5.96875 5.76042C6.43403 5.93403 6.85417 6.1875 7.22917 6.52083L8.875 8L7.75 9L6.25 7.64583C6.01389 7.4375 5.75076 7.27778 5.4606 7.16667C5.17045 7.05556 4.86579 7 4.54663 7C3.70517 7 2.98703 7.29228 2.39223 7.87683C1.79741 8.46139 1.5 9.16972 1.5 10.0018C1.5 10.8339 1.79741 11.5451 2.39223 12.1354C2.98703 12.7257 3.70517 13.0208 4.54663 13.0208C4.86579 13.0208 5.17045 12.9653 5.4606 12.8542C5.75076 12.7431 6.01389 12.5833 6.25 12.375L12.7708 6.52083C13.1458 6.20139 13.5658 5.95139 14.0308 5.77083C14.4957 5.59028 14.9812 5.5 15.4872 5.5C16.7453 5.5 17.812 5.93714 18.6872 6.81142C19.5624 7.68571 20 8.74857 20 10C20 11.2639 19.5596 12.3299 18.6788 13.1979C17.798 14.066 16.7245 14.5 15.4583 14.5C14.9542 14.5 14.4706 14.4132 14.0073 14.2396C13.5441 14.066 13.125 13.8125 12.75 13.4792L11.0833 11.9792L12.25 11L13.75 12.3542C13.9861 12.5625 14.2492 12.7222 14.5394 12.8333C14.8295 12.9444 15.1342 13 15.4534 13C16.2948 13 17.013 12.7077 17.6078 12.1232C18.2026 11.5386 18.5 10.8303 18.5 9.99817C18.5 9.16606 18.2026 8.45486 17.6078 7.86458C17.013 7.27431 16.2948 6.97917 15.4534 6.97917C15.1342 6.97917 14.8295 7.03472 14.5394 7.14583C14.2492 7.25694 13.9861 7.41667 13.75 7.625L7.23417 13.4775C6.85583 13.812 6.43415 14.066 5.96913 14.2396C5.5041 14.4132 5.01855 14.5 4.51248 14.5Z\"\n fill=\"currentColor\" />\n</svg>`,\n};\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcaseLaps: SourceIcon = {\n name: 'si_showcase_laps',\n data: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M2 9.50462C2 7.97376 2.53363 6.67361 3.6009 5.60417C4.66816 4.53472 5.96786 4 7.5 4H12.5C14.0321 4 15.3318 4.53347 16.3991 5.6004C17.4664 6.66731 18 7.9666 18 9.49825C18 10.8466 17.5694 12.0347 16.7083 13.0625C15.8472 14.0903 14.7437 14.7163 13.3979 14.9406C13.1604 14.9802 12.9514 14.9291 12.7708 14.7872C12.5903 14.6453 12.5 14.4648 12.5 14.2455C12.5 14.0263 12.5833 13.8472 12.75 13.7083C12.9167 13.5694 13.1111 13.4722 13.3333 13.4167C14.2639 13.2222 15.0243 12.7604 15.6146 12.0312C16.2049 11.3021 16.5 10.4583 16.5 9.5C16.5 8.39333 16.11 7.45 15.33 6.67C14.55 5.89 13.6067 5.5 12.5 5.5H7.5C6.39333 5.5 5.45 5.89046 4.67 6.67138C3.89 7.45229 3.5 8.39674 3.5 9.50471C3.5 10.6127 3.89 11.5556 4.67 12.3333C5.45 13.1111 6.39333 13.5 7.5 13.5H8.125L7.45833 12.8333C7.30556 12.6806 7.23264 12.5035 7.23958 12.3021C7.24653 12.1007 7.32639 11.9236 7.47917 11.7708C7.63194 11.6181 7.80903 11.5417 8.01042 11.5417C8.21181 11.5417 8.38889 11.6181 8.54167 11.7708L10.4842 13.732C10.6336 13.8829 10.7083 14.0568 10.7083 14.2538C10.7083 14.4508 10.6319 14.6231 10.4792 14.7708L8.52083 16.7292C8.36806 16.8819 8.19444 16.9549 8 16.9479C7.80556 16.941 7.63194 16.8644 7.47917 16.7183C7.32639 16.5589 7.25 16.3775 7.25 16.1741C7.25 15.9707 7.32447 15.7951 7.4734 15.6471L8.125 15H7.5C5.96786 15 4.66816 14.4668 3.6009 13.4005C2.53363 12.3341 2 11.0355 2 9.50462Z\"\n fill=\"currentColor\" />\n</svg>`,\n};\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcaseNext: SourceIcon = {\n name: 'si_showcase_next',\n data: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M14.5423 15.0002C14.3062 15.0002 14.1013 14.9134 13.9277 14.7397C13.7541 14.5661 13.6673 14.3613 13.6673 14.1252V5.896C13.6673 5.65988 13.7541 5.45502 13.9277 5.28141C14.1013 5.1078 14.3062 5.021 14.5423 5.021C14.7784 5.021 14.9833 5.1078 15.1569 5.28141C15.3305 5.45502 15.4173 5.65988 15.4173 5.896V14.1252C15.4173 14.3613 15.3305 14.5661 15.1569 14.7397C14.9833 14.9134 14.7784 15.0002 14.5423 15.0002ZM5.93815 14.1043C5.64648 14.2988 5.34787 14.3127 5.04232 14.146C4.73676 13.9793 4.58398 13.7224 4.58398 13.3752V6.646C4.58398 6.29877 4.73676 6.04183 5.04232 5.87516C5.34787 5.7085 5.64648 5.72239 5.93815 5.91683L11.0215 9.271C11.2854 9.45155 11.4173 9.69461 11.4173 10.0002C11.4173 10.3057 11.2854 10.5488 11.0215 10.7293L5.93815 14.1043Z\"\n fill=\"currentColor\" />\n</svg>\n`,\n};\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcasePrev: SourceIcon = {\n name: 'si_showcase_prev',\n data: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M5.45898 15.0002C5.22287 15.0002 5.01801 14.9134 4.8444 14.7397C4.67079 14.5661 4.58398 14.3626 4.58398 14.1292V5.89191C4.58398 5.65852 4.67079 5.45502 4.8444 5.28141C5.01801 5.1078 5.22287 5.021 5.45898 5.021C5.6951 5.021 5.89996 5.1078 6.07357 5.28141C6.24718 5.45502 6.33398 5.65852 6.33398 5.89191V14.1292C6.33398 14.3626 6.24718 14.5661 6.07357 14.7397C5.89996 14.9134 5.6951 15.0002 5.45898 15.0002ZM14.0632 14.1043L8.97982 10.7293C8.71593 10.5534 8.58398 10.3115 8.58398 10.0036C8.58398 9.69577 8.71593 9.45155 8.97982 9.271L14.0632 5.91683C14.3548 5.72239 14.6534 5.70842 14.959 5.87493C15.2645 6.04146 15.4173 6.29848 15.4173 6.646V13.3752C15.4173 13.7183 15.2644 13.9742 14.9587 14.1429C14.6529 14.3116 14.3544 14.2988 14.0632 14.1043Z\"\n fill=\"currentColor\" />\n</svg>`,\n};\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcaseFullscreen: SourceIcon = {\n name: 'si_fullscreen',\n data: `<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\"><path fill=\"currentColor\" d=\"M5 15.833a.806.806 0 0 1-.594-.24.806.806 0 0 1-.24-.593v-2.5c0-.236.08-.434.24-.594.16-.16.358-.24.594-.24s.434.08.594.24c.16.16.24.358.24.594v1.666H7.5c.236 0 .434.08.594.24.16.16.24.358.24.594s-.08.434-.24.594a.806.806 0 0 1-.594.24H5Zm0-7.5a.806.806 0 0 1-.594-.24.806.806 0 0 1-.24-.593V5c0-.236.08-.434.24-.594.16-.16.358-.24.594-.24h2.5c.236 0 .434.08.594.24.16.16.24.358.24.594s-.08.434-.24.594a.806.806 0 0 1-.594.24H5.833V7.5c0 .236-.08.434-.24.594a.806.806 0 0 1-.593.24Zm7.5 7.5a.807.807 0 0 1-.594-.24.807.807 0 0 1-.24-.593c0-.236.08-.434.24-.594.16-.16.358-.24.594-.24h1.667V12.5c0-.236.08-.434.24-.594.16-.16.357-.24.593-.24s.434.08.594.24c.16.16.24.358.24.594V15c0 .236-.08.434-.24.594a.806.806 0 0 1-.594.24h-2.5Zm2.5-7.5a.807.807 0 0 1-.594-.24.806.806 0 0 1-.24-.593V5.833H12.5a.807.807 0 0 1-.594-.24.806.806 0 0 1-.24-.593c0-.236.08-.434.24-.594.16-.16.358-.24.594-.24H15c.236 0 .434.08.594.24.16.16.24.358.24.594v2.5c0 .236-.08.434-.24.594a.806.806 0 0 1-.594.24Z\" /></svg>`,\n};\n","import type { SourceIcon } from '@source/ui-sdk/source-icon';\n\nexport const siShowcaseFullscreenOut: SourceIcon = {\n name: 'si_fullscreen_out',\n data: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M9 19C8.71667 19 8.47917 18.9042 8.2875 18.7125C8.09583 18.5208 8 18.2833 8 18V16H6C5.71667 16 5.47917 15.9042 5.2875 15.7125C5.09583 15.5208 5 15.2833 5 15C5 14.7167 5.09583 14.4792 5.2875 14.2875C5.47917 14.0958 5.71667 14 6 14H9C9.28333 14 9.52083 14.0958 9.7125 14.2875C9.90417 14.4792 10 14.7167 10 15V18C10 18.2833 9.90417 18.5208 9.7125 18.7125C9.52083 18.9042 9.28333 19 9 19ZM6 10C5.71667 10 5.47917 9.90417 5.2875 9.7125C5.09583 9.52083 5 9.28333 5 9C5 8.71667 5.09583 8.47917 5.2875 8.2875C5.47917 8.09583 5.71667 8 6 8H8V6C8 5.71667 8.09583 5.47917 8.2875 5.2875C8.47917 5.09583 8.71667 5 9 5C9.28333 5 9.52083 5.09583 9.7125 5.2875C9.90417 5.47917 10 5.71667 10 6V9C10 9.28333 9.90417 9.52083 9.7125 9.7125C9.52083 9.90417 9.28333 10 9 10H6ZM15 19C14.7167 19 14.4792 18.9042 14.2875 18.7125C14.0958 18.5208 14 18.2833 14 18V15C14 14.7167 14.0958 14.4792 14.2875 14.2875C14.4792 14.0958 14.7167 14 15 14H18C18.2833 14 18.5208 14.0958 18.7125 14.2875C18.9042 14.4792 19 14.7167 19 15C19 15.2833 18.9042 15.5208 18.7125 15.7125C18.5208 15.9042 18.2833 16 18 16H16V18C16 18.2833 15.9042 18.5208 15.7125 18.7125C15.5208 18.9042 15.2833 19 15 19ZM15 10C14.7167 10 14.4792 9.90417 14.2875 9.7125C14.0958 9.52083 14 9.28333 14 9V6C14 5.71667 14.0958 5.47917 14.2875 5.2875C14.4792 5.09583 14.7167 5 15 5C15.2833 5 15.5208 5.09583 15.7125 5.2875C15.9042 5.47917 16 5.71667 16 6V8H18C18.2833 8 18.5208 8.09583 18.7125 8.2875C18.9042 8.47917 19 8.71667 19 9C19 9.28333 18.9042 9.52083 18.7125 9.7125C18.5208 9.90417 18.2833 10 18 10H15Z\" fill=\"currentColor\" /></svg>`,\n};\n","import { siShowcasePauseCircle } from './icons/pause-circle';\nimport { siShowcasePause } from './icons/pause-icon';\nimport { siShowcasePlay } from './icons/play-icon';\nimport { siShowcaseBoomerang } from './icons/player-boomerang';\nimport { siShowcaseLaps } from './icons/player-laps';\nimport { siShowcaseNext } from './icons/player-next';\nimport { siShowcasePrev } from './icons/player-prev';\nimport { siShowcaseFullscreen } from './icons/fullscreen';\nimport { siShowcaseFullscreenOut } from './icons/fullscreen-out';\n\nexport const showCaseIcons = [\n siShowcasePauseCircle,\n siShowcasePause,\n siShowcasePlay,\n siShowcaseBoomerang,\n siShowcaseLaps,\n siShowcaseNext,\n siShowcasePrev,\n siShowcaseFullscreen,\n siShowcaseFullscreenOut,\n];\n","import type { Observable } from 'rxjs';\nimport {\n BehaviorSubject,\n buffer,\n combineLatestWith,\n debounceTime,\n endWith,\n fromEvent,\n ignoreElements,\n interval,\n map,\n merge,\n of,\n shareReplay,\n startWith,\n Subject,\n switchMap,\n} from 'rxjs';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n inject,\n input,\n OnInit,\n output,\n signal,\n ViewChild,\n} from '@angular/core';\nimport {\n circularIndex,\n clampf,\n Falsy,\n KeyboardStringCode,\n shortHash,\n tapLog,\n TaskRunner,\n Truthy,\n} from '@3dsource/utils';\nimport {\n delay,\n distinctUntilChanged,\n filter,\n first,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators';\nimport { AsyncPipe, DatePipe, NgClass } from '@angular/common';\nimport { KEY_DOWN_VALUES } from '../constants';\nimport { ShowCaseComponentStore } from '../store/show-case.component.store';\nimport {\n SourceIconComponent,\n SourceIconsRegistryService,\n} from '@source/ui-sdk/source-icon';\nimport { Store } from '@ngrx/store';\nimport { concatLatestFrom } from '@ngrx/operators';\nimport { mapOnInitSequenceData } from '../helpers/mapOnInitSequenceData';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport { SourceSliderComponent } from '../components/source-slider/source-slider.component';\nimport { showCaseIcons } from '../constants/show-case.icons';\nimport { fromUnrealCallBackSignal } from '../../../helpers/EventWrapper';\nimport { ESequenceLoopBehavior, MetaBoxCommand } from '@struct';\nimport {\n SourceTooltipDirective,\n SourceTooltipPosition,\n} from '@source/ui-sdk/source-tooltip';\nimport { UnrealCommunicatorService } from '../../../services/unreal-communicator.service';\nimport type {\n OnChangeSequenceData,\n SectionEntity,\n SectionEntityOnInit,\n} from '../store/show-case.component.interface';\nimport { observeCommandResponse } from '../../../helpers/CommandObserver';\nimport { ImageCaptureService } from '../../../services/image-capture.service';\nimport {\n selectShowcaseIsInit,\n selectShowcaseIsPauseStatus,\n selectShowcaseIsPlaying,\n selectShowcaseIsPlayStatus,\n selectShowcaseIsStopped,\n} from '../../../store/unreal.selectors';\nimport { unrealFeature } from '../../../store/unreal.feature';\nimport {\n getDragSequenceCommand,\n getJumpToSequenceCommand,\n getSetSettingsSequenceCommand,\n} from '../../../helpers/prepare-commands';\nimport { ProductShowcase } from '../interfaces/showcase-status';\n\n@Component({\n selector: 'app-show-case',\n templateUrl: './show-case.component.html',\n styleUrls: ['./show-case.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [ShowCaseComponentStore],\n imports: [\n AsyncPipe,\n DatePipe,\n NgClass,\n SourceSliderComponent,\n SourceIconComponent,\n SourceTooltipDirective,\n ],\n})\nexport class ShowCaseComponent implements OnInit {\n deviceType = input<\n 'deviceTypeAuto' | 'deviceTypeMobile' | 'deviceTypeDesktop'\n >('deviceTypeAuto');\n isLandscapeOrientation = input(false);\n isNarrowScreen = input(false);\n activeProduct = input<ProductShowcase | null>(null);\n activeProductWithSlotIds = input<{\n activeProduct: ProductShowcase | null;\n slotsIds: Record<string, string>;\n } | null>(null);\n isFullscreen = input(false);\n fullscreenChanged = output<boolean>();\n\n activeProduct$ = toObservable(\n computed(() => this.activeProduct() ?? null),\n ).pipe(\n distinctUntilChanged(),\n filter(Truthy),\n filter((product) => !!product?.showcase),\n );\n activeProductWithSlotIds$ = toObservable(\n computed(() => this.activeProductWithSlotIds() ?? null),\n ).pipe(\n distinctUntilChanged(),\n filter(Truthy),\n filter((value) => !!value?.activeProduct && !!value?.slotsIds),\n );\n\n private readonly maxAmountImagesInCache = 100; // 100 images\n private readonly maxTimeToKeepInCache = 5 * 60 * 1000; // 5 minutes\n static imageRequestsMap = new Map<\n string,\n { time: number; request$: Observable<string | null> }\n >();\n\n private showcaseRef!: ElementRef<HTMLDivElement>;\n private controlsHideDelayTime = 4000;\n private debounceTime = 300;\n private timeChangeInSeconds = 5;\n\n @ViewChild('leftZone') leftZone!: ElementRef<HTMLDivElement>;\n @ViewChild('rightZone') rightZone!: ElementRef<HTMLDivElement>;\n\n @ViewChild('showcase') set showcase(content: ElementRef<HTMLInputElement>) {\n if (content) {\n this.showcaseRef = content;\n this.initDesktopEvents();\n this.initZoneTouchEvent();\n }\n }\n\n private taskRunner = new TaskRunner();\n private store = inject(Store);\n private destroyRef = inject(DestroyRef);\n private imageCapture = inject(ImageCaptureService);\n private componentStore = inject(ShowCaseComponentStore);\n private commandsSender = inject(UnrealCommunicatorService);\n private sourceIconsRegistryService = inject(SourceIconsRegistryService);\n\n SourceTooltipPosition = SourceTooltipPosition;\n isVisibleControls$ = new BehaviorSubject(true);\n touchZoneEvent$ = new Subject<number>();\n touchHideShowEvent$ = new Subject<void>();\n isMobileTypeControls = computed(\n () => this.deviceType() !== 'deviceTypeDesktop' && this.isNarrowScreen(),\n );\n\n sections$ = this.componentStore\n .select(({ sectionEntities }) => sectionEntities)\n .pipe(filter(Truthy));\n sections = toSignal(this.sections$);\n hideMobileControlsWhenDrag = signal(false);\n mouseCurrentSection = signal<SectionEntity | null>(null);\n\n showcaseIsPlaying = toSignal(this.store.select(selectShowcaseIsPlaying));\n showcaseIsInit = toSignal(this.store.select(selectShowcaseIsInit));\n showcaseIsPauseStatus = toSignal(\n this.store.select(selectShowcaseIsPauseStatus),\n );\n isPingPong = toSignal(this.componentStore.selectIsPingPongSection$);\n isLoop = toSignal(this.componentStore.selectIsLoopSection$);\n currentSectionId = toSignal(\n this.componentStore.select(({ currentSectionId }) => currentSectionId),\n );\n currentSection = toSignal(\n // Debounce time is required to prevent title blinking in boomerang mode\n this.componentStore.currentSection$.pipe(debounceTime(400)),\n );\n playRate = toSignal(this.componentStore.select(({ playRate }) => playRate));\n loopBehavior = toSignal(\n this.componentStore.select(({ loopBehavior }) => loopBehavior),\n );\n totalDuration = toSignal(\n this.componentStore.select(({ totalDuration }) => totalDuration),\n );\n currentGlobalTime = toSignal(\n this.componentStore.select(({ currentGlobalTime }) => currentGlobalTime),\n );\n\n isLowBandwidth$ = this.store.select(unrealFeature.selectLowBandwidth);\n highBandwidthTrigger$ = this.isLowBandwidth$.pipe(filter(Falsy));\n\n isLowBandwidth = toSignal(this.isLowBandwidth$);\n lbmImage = signal<string | null>(null);\n\n private onChangeSequenceInLbm$ = new Subject<{\n payload: OnChangeSequenceData;\n }>();\n private forceStopLbmSequence$ = new Subject<void>();\n\n private pauseTrigger$ = this.store\n .select(selectShowcaseIsPauseStatus)\n .pipe(filter(Truthy));\n\n private playTrigger$ = this.store\n .select(selectShowcaseIsPlayStatus)\n .pipe(filter(Truthy));\n\n private stopTrigger$ = this.store\n .select(selectShowcaseIsStopped)\n .pipe(filter(Truthy));\n\n private stopLbmSequence$ = merge(\n this.forceStopLbmSequence$,\n this.highBandwidthTrigger$,\n this.stopTrigger$,\n );\n\n ngOnInit() {\n fromUnrealCallBackSignal(MetaBoxCommand.FInitSequenceByObjectNameCommand)\n .pipe(\n combineLatestWith(this.isLowBandwidth$, this.activeProduct$),\n filter(([, lbm, product]) => lbm && !!product),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(([data, lbm, product]) => {\n const sections = {\n sections: data?.payload?.sections || [],\n playRate: data?.payload?.playRate || 0,\n } as { sections: SectionEntityOnInit[]; playRate: number };\n this.componentStore.initSequence(\n mapOnInitSequenceData(sections, lbm, product),\n );\n this.pauseSequence();\n this.jumpToLbmSection(this.convertTimeToSectionId(0));\n this.isVisibleControls$.next(true);\n });\n\n fromUnrealCallBackSignal(MetaBoxCommand.FInitSequenceByObjectNameCommand)\n .pipe(\n concatLatestFrom(() => [this.isLowBandwidth$, this.activeProduct$]),\n filter(([, lbm, product]) => !lbm && !!product),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(([data, lbm, product]) => {\n const sections = {\n sections: data?.payload?.sections || [],\n playRate: data?.payload?.playRate || 0,\n } as { sections: SectionEntityOnInit[]; playRate: number };\n this.componentStore.initSequence(\n mapOnInitSequenceData(sections, lbm, product),\n );\n this.lbmImage.set(null);\n this.playSequence();\n });\n\n const onChangeSequence$ = this.isLowBandwidth$.pipe(\n switchMap((lbm) =>\n lbm\n ? this.onChangeSequenceInLbm$\n : fromUnrealCallBackSignal('onChangeSequence'),\n ),\n );\n\n const onFinishedSequence$ = fromUnrealCallBackSignal(\n 'onFinishedSequence',\n ).pipe(filter(() => !this.isLowBandwidth()));\n onChangeSequence$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((data) => this.componentStore.changeSequence(data.payload));\n onFinishedSequence$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((data) => this.componentStore.finishedSequence$(data.payload));\n this.isVisibleControls$\n .pipe(\n filter(Truthy),\n switchMap(() =>\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy), take(1)),\n ),\n debounceTime(this.controlsHideDelayTime),\n tap(() => this.isVisibleControls$.next(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n this.sourceIconsRegistryService.registerIcons(showCaseIcons);\n }\n\n jumpToLbmSection(startSectionIndex: number) {\n this.forceStopLbmSequence$.next();\n this.sections$\n .pipe(\n debounceTime(100),\n switchMap((sections) => {\n const section = sections?.[startSectionIndex || 0];\n\n // We need to immediately set the section so,\n // while the image is loading, the user can see the section is\n // already selected\n this.onChangeSequenceInLbm$.next({\n payload: {\n id: section?.id,\n time: section?.startTime,\n sectionName: section?.sectionName,\n direction: 1,\n },\n });\n\n const nextSectionIndex = circularIndex(\n startSectionIndex + 1,\n sections?.length || 0,\n );\n\n return this.getSectionImage(section).pipe(\n takeUntil(this.stopLbmSequence$),\n tap((image) => this.lbmImage.set(image)),\n tap(() => this.preCacheSection(sections?.[nextSectionIndex]!)),\n switchMap(() => this.createSectionInterval(section)),\n map(() => nextSectionIndex),\n );\n }),\n takeUntil(this.stopLbmSequence$),\n )\n .subscribe((nextSectionIndex) => {\n this.jumpToLbmSection(nextSectionIndex);\n });\n }\n\n private preCacheSection(section: SectionEntity) {\n this.getSectionImage(section).pipe(first()).subscribe();\n }\n\n private createSectionInterval(section: SectionEntity) {\n // Setup\n const intervalDuration = 50;\n const segmentDuration = section.segmentDuration * 1000;\n\n // Track elapsed time\n let elapsed = 0;\n const intervalComplete$ = new Subject<void>();\n\n // Function to create an interval with elapsed time offset\n const createInterval = () => {\n return interval(intervalDuration).pipe(\n tap(() => {\n elapsed += intervalDuration;\n\n if (elapsed >= segmentDuration) {\n intervalComplete$.next();\n intervalComplete$.complete();\n }\n }),\n // Dispatch the change sequence event (time progress)\n tap(() =>\n this.onChangeSequenceInLbm$.next({\n payload: {\n id: section.id,\n time: elapsed / 1000 + section.startTime,\n sectionName: section.sectionName,\n direction: 1,\n },\n }),\n ),\n );\n };\n\n // Observable that handles the interval sequence with pausing and resuming\n const pauseHandler$ = this.playTrigger$.pipe(\n switchMap(() =>\n createInterval().pipe(\n takeUntil(merge(this.pauseTrigger$, this.stopLbmSequence$)),\n ),\n ),\n takeUntil(merge(intervalComplete$, this.stopLbmSequence$)), // Complete when the sequence is done\n startWith('play'),\n );\n\n // Return an observable that emits `section` when the sequence completes\n return pauseHandler$.pipe(\n ignoreElements(), // Ignore the interval emissions\n endWith(section), // Emit `section` when the sequence completes\n );\n }\n\n private getSectionImage(section: SectionEntity) {\n const getRemoteImage = (hash: string) => {\n const name = String(`Showcase Task ${section.id}`);\n return this.taskRunner.runTask(name, () => {\n return observeCommandResponse(\n getDragSequenceCommand({\n id: section.id ?? 0,\n time: section.lbmTime!,\n sectionTime: 0,\n dragBySectionTime: false,\n }),\n (data) => this.commandsSender.sendCommandToUnreal(data),\n ).pipe(\n tapLog('DRAG CALLBACK', section.id),\n delay(1000), // Camera Stabilization time, Removes camera shaking. Experimental Value\n switchMap(() => this.imageCapture.getFreezeImage().pipe(first())),\n filter(Truthy),\n tap((image) =>\n //Overwrite cache with final image without procedural requests\n ShowCaseComponent.imageRequestsMap.set(hash, {\n request$: of(image!).pipe(\n shareReplay({ bufferSize: 1, refCount: true }),\n ),\n time: Date.now(),\n }),\n ),\n );\n });\n };\n\n return this.activeProductWithSlotIds$.pipe(\n // Compute a unique hash for the section\n map(({ activeProduct, slotsIds }) =>\n shortHash({\n section: section.id,\n product: activeProduct?.id || '',\n slotsIds,\n }),\n ),\n switchMap((hash: string) => {\n // Step 1: Check if there's an ongoing request for this hash\n const cachedRequest = ShowCaseComponent.imageRequestsMap.get(hash);\n if (cachedRequest) {\n // Update the timestamp of the cached request\n cachedRequest.time = Date.now();\n // Return the existing Observable\n return cachedRequest.request$;\n }\n\n // Step 2: Create a new Observable for the remote image request\n const request$ = getRemoteImage(hash).pipe(\n // Ensure the Observable is shared among subscribers\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n // Step 3: Cache the new Observable\n ShowCaseComponent.imageRequestsMap.set(hash, {\n request$,\n time: Date.now(),\n });\n\n this.cleanupImageCache();\n\n // Return the new Observable\n return request$;\n }),\n );\n }\n\n private cleanupImageCache() {\n if (ShowCaseComponent.imageRequestsMap.size > this.maxAmountImagesInCache) {\n const now = Date.now();\n ShowCaseComponent.imageRequestsMap.forEach((value, key) => {\n if (now - value.time > this.maxTimeToKeepInCache) {\n ShowCaseComponent.imageRequestsMap.delete(key);\n }\n });\n }\n }\n\n initZoneTouchEvent() {\n this.touchHideShowEvent$\n .pipe(\n filter(\n () =>\n !!this.showcaseRef.nativeElement && !!this.isMobileTypeControls(),\n ),\n buffer(this.touchHideShowEvent$.pipe(debounceTime(this.debounceTime))),\n filter((list) => list.length === 1),\n concatLatestFrom(() => [this.isVisibleControls$]),\n tap(([, isShowControls]) =>\n this.isVisibleControls$.next(!isShowControls),\n ),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n\n this.touchZoneEvent$\n .pipe(\n filter(() => !!this.showcaseRef.nativeElement),\n buffer(this.touchZoneEvent$.pipe(debounceTime(this.debounceTime))),\n filter((list) => list.length >= 2),\n tap((list) => {\n this.isVisibleControls$.next(true);\n\n this.dragToSequence(\n this.mapTimeUsingPlayRate(\n this.currentGlobalTime()! + list[0] * list.length,\n this.playRate()!,\n this.totalDuration()!,\n ),\n );\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n touchStartAction(event: TouchEvent, offset: number) {\n event.preventDefault();\n this.touchZoneEvent$.next(offset);\n }\n\n touchHideShowAction(event: TouchEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.touchHideShowEvent$.next();\n }\n\n mapTimeUsingPlayRate(time: number, playRate: number, totalDuration: number) {\n const mapTime = time * playRate;\n const mapTotalDuration = totalDuration * playRate;\n return clampf(0, mapTotalDuration, mapTime);\n }\n\n onChangeValue(time: number) {\n this.dragToSequence(\n this.mapTimeUsingPlayRate(time, this.playRate()!, this.totalDuration()!),\n );\n }\n\n changePingPong(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.isVisibleControls$.next(true);\n\n const value =\n this.loopBehavior() === ESequenceLoopBehavior.loop\n ? ESequenceLoopBehavior.pingPongSection\n : ESequenceLoopBehavior.loop;\n\n this.componentStore.changeLoopBehavior(value);\n\n this.commandsSender.sendCommandToUnreal(\n getSetSettingsSequenceCommand({\n loopBehavior: value,\n playRate: this.playRate(),\n }),\n );\n }\n\n changeLoop(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.isVisibleControls$.next(true);\n\n const value =\n this.loopBehavior() === ESequenceLoopBehavior.none ||\n this.loopBehavior() === ESequenceLoopBehavior.pingPongSection\n ? ESequenceLoopBehavior.loopSection\n : ESequenceLoopBehavior.none;\n\n this.componentStore.changeLoopBehavior(value);\n\n if (this.isLowBandwidth()) {\n return;\n }\n this.commandsSender.sendCommandToUnreal(\n getSetSettingsSequenceCommand({\n loopBehavior: value,\n playRate: this.playRate(),\n }),\n );\n }\n\n changeFullscreenMode(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.isVisibleControls$.next(true);\n this.fullscreenChanged.emit(!this.isFullscreen());\n }\n\n toggleShowCase(event: MouseEvent | KeyboardEvent | TouchEvent) {\n event.stopPropagation();\n event.preventDefault();\n\n this.isVisibleControls$.next(true);\n\n if (this.showcaseIsPauseStatus()) {\n this.playSequence();\n } else {\n this.pauseSequence();\n }\n }\n\n pauseSequence() {\n this.componentStore.pauseShowCaseEffect$();\n }\n\n playSequence() {\n this.componentStore.playShowCaseEffect$();\n }\n\n jumpToSection(event: Event, offset: number) {\n event.preventDefault();\n event.stopPropagation();\n\n const totalSections = this.sections()!.length;\n const id = circularIndex(this.currentSectionId()! + offset, totalSections);\n this.isVisibleControls$.next(true);\n\n if (this.isLowBandwidth()) {\n this.jumpToLbmSection(id);\n\n return;\n }\n\n this.commandsSender.sendCommandToUnreal(getJumpToSequenceCommand({ id }));\n }\n\n dragToSequence(time: number) {\n this.isVisibleControls$.next(true);\n if (this.isLowBandwidth()) {\n this.playSequence();\n this.jumpToLbmSection(this.convertTimeToSectionId(time));\n return;\n }\n\n this.commandsSender.sendCommandToUnreal(\n getDragSequenceCommand({\n id: 0,\n time,\n sectionTime: 0,\n dragBySectionTime: false,\n }),\n );\n }\n\n private convertTimeToSectionId(time: number) {\n return (\n this.sections()?.find(\n (section) => section.startTime <= time && section.endTime >= time,\n )?.id || 0\n );\n }\n\n private initDesktopEvents() {\n fromEvent<MouseEvent>(this.showcaseRef?.nativeElement, 'mousemove')\n .pipe(\n filter(() => !!this.showcaseRef?.nativeElement),\n tap(() => this.isVisibleControls$.next(true)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n\n fromEvent<KeyboardEvent>(document, 'keydown')\n .pipe(\n filter(\n (event: KeyboardEvent) =>\n !!this.showcaseRef?.nativeElement &&\n !(\n event.target instanceof HTMLInputElement &&\n event.target.localName === 'input'\n ),\n ),\n filter(\n (event: KeyboardEvent) =>\n KEY_DOWN_VALUES.includes(event.code) &&\n this.showcaseIsPlaying()! &&\n !this.isMobileTypeControls(),\n ),\n tap((event) => {\n if (event.code === KeyboardStringCode.Space) {\n this.toggleShowCase(event);\n } else {\n this.dragToSequence(\n this.mapTimeUsingPlayRate(\n this.currentGlobalTime()! +\n (event.code === KeyboardStringCode.ArrowLeft\n ? -this.timeChangeInSeconds\n : this.timeChangeInSeconds),\n this.playRate()!,\n this.totalDuration()!,\n ),\n );\n }\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n}\n","@if (showcaseIsInit() && sections()?.length) {\n @if (lbmImage()) {\n <div class=\"lbmImage\">\n <img [src]=\"lbmImage()\" alt=\"\" />\n </div>\n }\n\n <div\n #showcase\n [class.visible-controls]=\"isVisibleControls$ | async\"\n [ngClass]=\"deviceType()\"\n class=\"showcase\"\n >\n <div class=\"main-controls\">\n @if (isMobileTypeControls()) {\n <div\n (touchstart)=\"touchHideShowAction($event)\"\n class=\"mobile-touch-controls\"\n >\n <div (touchstart)=\"jumpToSection($event, -1)\" class=\"left-zone\"></div>\n <div (touchstart)=\"toggleShowCase($event)\" class=\"center-zone\"></div>\n <div\n (touchstart)=\"jumpToSection($event, +1)\"\n class=\"right-zone\"\n ></div>\n </div>\n <section\n [class.hide-mobile-controls]=\"hideMobileControlsWhenDrag()\"\n class=\"mobile-controls\"\n >\n <button\n (click)=\"jumpToSection($event, -1)\"\n [attr.data-testid]=\"'jump-to-prev-section'\"\n class=\"control control--prev\"\n type=\"button\"\n >\n <src-icon [name]=\"'si_showcase_prev'\" class=\"icon\" />\n </button>\n <button\n (click)=\"toggleShowCase($event)\"\n [attr.data-testid]=\"'play-pause-showcase'\"\n class=\"control control--play-pause\"\n type=\"button\"\n >\n <src-icon\n [name]=\"\n showcaseIsPauseStatus()\n ? 'si_showcase_play'\n : 'si_showcase_pause'\n \"\n class=\"icon\"\n />\n </button>\n <button\n (click)=\"jumpToSection($event, +1)\"\n [attr.data-testid]=\"'jump-to-next-section'\"\n class=\"control control--next\"\n type=\"button\"\n >\n <src-icon class=\"icon\" name=\"si_showcase_next\" />\n </button>\n </section>\n } @else {\n <div\n (click)=\"toggleShowCase($event)\"\n class=\"desktop-zone-controls\"\n ></div>\n }\n </div>\n <div class=\"showcase-controls\">\n @if (isMobileTypeControls() && (isVisibleControls$ | async) === false) {\n <div\n (touchstart)=\"touchHideShowAction($event)\"\n class=\"empty-wrapper\"\n ></div>\n }\n <div class=\"showcase-controls__buttons\">\n <div class=\"segment-info\">\n <div class=\"segment-info__time\">\n {{ currentGlobalTime()! * 1000 | date: 'mm:ss' }} / \n {{ totalDuration()! * 1000 | date: 'mm:ss' }}\n </div>\n </div>\n @if (!isMobileTypeControls()) {\n <div class=\"desktop-controls\">\n <button\n (click)=\"jumpToSection($event, -1)\"\n [attr.data-testid]=\"'jump-to-prev-section-on-desktop'\"\n class=\"control control--prev\"\n type=\"button\"\n >\n <src-icon class=\"icon\" name=\"si_showcase_prev\" />\n </button>\n <button\n (click)=\"toggleShowCase($event)\"\n [attr.data-testid]=\"'play-pause-showcase-on-desktop'\"\n class=\"control control--play-pause\"\n type=\"button\"\n >\n <src-icon\n [name]=\"\n showcaseIsPauseStatus()\n ? 'play_circle'\n : 'si_showcase_pause_circle'\n \"\n class=\"icon\"\n />\n </button>\n <button\n (click)=\"jumpToSection($event, +1)\"\n [attr.data-testid]=\"'jump-to-next-section-on-desktop'\"\n class=\"control control--next\"\n type=\"button\"\n >\n <src-icon class=\"icon\" name=\"si_showcase_next\" />\n </button>\n </div>\n }\n <div class=\"settings-wrapper\">\n @if (!isLowBandwidth()) {\n <button\n (click)=\"changePingPong($event)\"\n [class.active]=\"isPingPong()\"\n [srcTooltip]=\"\n isMobileTypeControls()\n ? ''\n : 'Boomerang a Section: Highlight a moment by looping it forward and backward.'\n \"\n [srcTooltipPosition]=\"SourceTooltipPosition.LEFT\"\n [attr.data-testid]=\"'boomerang-section'\"\n class=\"control control--boomerang\"\n type=\"button\"\n >\n <src-icon class=\"icon\" name=\"si_showcase_boomerang\" />\n </button>\n }\n\n @if (false) {\n <button\n (click)=\"changeLoop($event)\"\n [class.active]=\"isLoop()\"\n [attr.data-testid]=\"'loop-section'\"\n class=\"control control--laps\"\n type=\"button\"\n >\n <src-icon class=\"icon\" name=\"si_showcase_laps\" />\n </button>\n }\n\n @if (!isLandscapeOrientation()) {\n <button\n (click)=\"changeFullscreenMode($event)\"\n [attr.data-testid]=\"'fullscreen-showcase'\"\n class=\"control\"\n >\n <src-icon\n [name]=\"isFullscreen() ? 'si_fullscreen_out' : 'si_fullscreen'\"\n class=\"icon\"\n />\n </button>\n }\n </div>\n </div>\n <div class=\"showcase-controls__bar\">\n <div class=\"showcase-bar\">\n <app-show-case-slider\n (dragValue)=\"onChangeValue($event)\"\n (dragSlider)=\"hideMobileControlsWhenDrag.set($event)\"\n (mouseSection)=\"mouseCurrentSection.set($event)\"\n [showThumb]=\"!isLowBandwidth()\"\n [duration]=\"totalDuration()!\"\n [globalTime]=\"currentGlobalTime()!\"\n [isFullscreen]=\"isFullscreen()!\"\n [lbm]=\"isLowBandwidth()!\"\n [isMobile]=\"isMobileTypeControls()!\"\n [section]=\"currentSection()!\"\n [sections]=\"sections()!\"\n >\n </app-show-case-slider>\n </div>\n </div>\n </div>\n </div>\n}\n","import type { AfterViewInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n inject,\n Input,\n input,\n ViewChild,\n} from '@angular/core';\nimport {\n HEXtoRGB,\n HSVtoRGB,\n inverseLerp,\n RGBtoHEX,\n RGBtoHSV,\n} from '@3dsource/utils';\n\n@Component({\n selector: 'app-stat-graph',\n templateUrl: './stat-graph.component.html',\n styleUrls: ['./stat-graph.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StatGraphComponent implements AfterViewInit {\n private el = inject(ElementRef);\n @ViewChild('graph') graph!: ElementRef;\n private canvas!: HTMLCanvasElement;\n private ctx!: CanvasRenderingContext2D;\n\n readonly color = input('#417bc9');\n readonly tickStep = input(3);\n readonly label = input.required<string>();\n private scaleY!: number;\n\n @Input() set dataTick(data: { value: number; hash: number } | null) {\n this.pushData(data?.value ?? null);\n }\n\n private data: (number | null)[] = [];\n\n max = 0;\n min = 0;\n current = 0;\n\n ngAfterViewInit() {\n this.canvas = this.graph.nativeElement;\n this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n }\n\n @HostListener('window:resize', ['$event'])\n resize() {\n this.draw();\n }\n\n private draw() {\n if (!this.canvas) {\n return;\n }\n\n const all = this.data.filter((r) => r !== null && !isNaN(r)) as number[];\n this.max = Math.max(...all);\n this.min = Math.min(...all);\n this.scaleY = this.canvas.height / (this.max || 1);\n this.current = all[all.length - 1] || 0;\n this.ctx.save();\n const bounds = this.el.nativeElement.getBoundingClientRect();\n this.canvas.width = bounds.width;\n this.canvas.height = bounds.height - 30; // -p height\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n [...this.data].reverse().forEach((val, index) => {\n const h = (val || 0) * this.scaleY;\n\n this.ctx.fillStyle = this.getColor(this.color(), h as number);\n this.ctx.fillRect(\n index * this.tickStep(),\n this.canvas.height - h,\n this.tickStep(),\n h,\n );\n });\n this.ctx.restore();\n }\n\n private getColor(fillStyle: string, value = 0): string {\n const { r, g, b } = HEXtoRGB(fillStyle);\n /* eslint-disable-next-line prefer-const */\n let [h, s, v] = RGBtoHSV(r, g, b);\n v = inverseLerp(0, this.canvas.height, value);\n {\n const [r, g, b] = HSVtoRGB(h, s, v);\n const hex = '#' + RGBtoHEX(r, g, b);\n return hex;\n }\n }\n\n private pushData(value: number | null) {\n this.data.push(value);\n\n if (!this.canvas) {\n return;\n }\n\n if (this.data.length > this.canvas.width / this.tickStep()) {\n this.data.shift();\n }\n\n this.draw();\n }\n}\n","<div class=\"content\">\n <p>{{ label() }}: {{ current }} | Min:{{ min }} | Max:{{ max }}</p>\n <canvas #graph class=\"graph\"></canvas>\n</div>\n","export const EToClientMessageType = {\n QualityControlOwnership: 0,\n Response: 1,\n Command: 2,\n FreezeFrame: 3,\n UnfreezeFrame: 4,\n VideoEncoderAvgQP: 5,\n LatencyTest: 6,\n InitialSettings: 7,\n InputControlOwnership: 12,\n Protocol: 255,\n} as const;\n","export const UnrealStatusMessage = {\n CONNECTING_TO_SESSION: 'Connecting to session.',\n STARTING_YOUR_SESSION: 'Starting your session',\n} as const;\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { ConfigMessage } from '../../interfaces/SignalingMessage';\n\nexport function ConfigHandler(this: SignallingService, msg: ConfigMessage) {\n this.onConfig$.next(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { AnswerMessage } from '../../interfaces/SignalingMessage';\n\nexport function AnswerHandler(this: SignallingService, msg: AnswerMessage) {\n this.onWebRtcAnswer$.next(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function IceCandidateHandler(\n this: SignallingService,\n msg: { candidate: RTCIceCandidate },\n) {\n this.onWebRtcIce$.next(msg.candidate);\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { SSInfo } from '../../interfaces/SignalingMessage';\nimport { updateCirrusInfo } from '../../store/unreal.actions';\n\nexport function SSInfoHandler(this: SignallingService, msg: SSInfo) {\n this.store.dispatch(\n updateCirrusInfo({ ssInfo: msg.message, ssData: msg.data }),\n );\n return null;\n}\n","import type { InstanceReady } from '../../interfaces/SignalingMessage';\nimport type { SignallingService } from '../../services/signalling.service';\n\nexport function InstanceReadyHandler(\n this: SignallingService,\n msg: InstanceReady,\n) {}\n","import type { InstanceReserved } from '../../interfaces/SignalingMessage';\nimport type { SignallingService } from '../../services/signalling.service';\nimport { setSignalingName } from '../..//store/unreal.actions';\n\nexport function InstanceReservedHandler(\n this: SignallingService,\n msg: InstanceReserved,\n) {\n this.store.dispatch(\n setSignalingName({\n instanceName: msg.payload.instanceId,\n }),\n );\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function PingHandler(this: SignallingService) {\n this.send(\n JSON.stringify({\n type: 'pong',\n source: 'front',\n }),\n );\n}\n","/*\nexport interface RequestReservation extends InstanceMessageBase {\n type: 'requestReservation';\n}\n*/\n\nimport type { SignalingData } from '../interfaces/SignalingData';\n\nexport interface InstanceReady extends InstanceMessageBase {\n type: 'instanceReady';\n}\n\nexport interface InstanceReserved extends InstanceMessageBase {\n type: 'instanceReserved';\n}\n\ninterface InstanceMessageBase extends MessageBase {\n correlationId: string;\n payload: {\n instanceId: string;\n };\n}\n\nexport interface MessageBase {\n type: OrchestrationMessageType;\n}\n\nexport interface SSInfo extends MessageBase {\n type: 'ssInfo';\n message: string;\n data: SignalingData;\n}\n\nexport interface PlayerCountMessage extends MessageBase {\n type: 'playerCount';\n playerCount: number;\n}\n\nexport interface AnswerMessage extends RTCSessionDescriptionInit {\n type: RTCSdpType;\n}\n\nexport interface ConfigMessage extends MessageBase, UnknownFields {\n type: 'config';\n peerConnectionOptions: RTCConfiguration;\n}\n\nexport interface CandidateMessage extends MessageBase {\n type: 'iceCandidate';\n candidate: RTCIceCandidate;\n}\n\nexport interface PingMessage extends MessageBase {\n type: 'ping';\n playerId: string;\n appConnectionCounter: number;\n}\n\nexport type UnknownFields = Record<string, unknown>;\n\nexport const OrchestrationMessageTypes = {\n requestReservation: 'requestReservation',\n instanceReady: 'instanceReady',\n instanceReserved: 'instanceReserved',\n ssInfo: 'ssInfo',\n playerCount: 'playerCount',\n answer: 'answer',\n iceCandidate: 'iceCandidate',\n ping: 'ping',\n config: 'config',\n} as const;\n\nexport interface SignalingMessageMap {\n [OrchestrationMessageTypes.ssInfo]: SSInfo;\n [OrchestrationMessageTypes.playerCount]: PlayerCountMessage;\n [OrchestrationMessageTypes.answer]: AnswerMessage;\n [OrchestrationMessageTypes.config]: ConfigMessage;\n [OrchestrationMessageTypes.iceCandidate]: CandidateMessage;\n [OrchestrationMessageTypes.instanceReady]: InstanceReady;\n [OrchestrationMessageTypes.instanceReserved]: InstanceReserved;\n [OrchestrationMessageTypes.ping]: PingMessage;\n}\n\nexport type OrchestrationMessageType = keyof SignalingMessageMap;\n\nexport type SignalingMessageHandler<T extends keyof SignalingMessageMap> = (\n msg: SignalingMessageMap[T],\n) => void;\n\nexport interface PollingOrchestrationMessage {\n mm_message?: string;\n signallingServer?: string;\n error?: string;\n info?: {\n age: number | null;\n left: number | null;\n percent: number | null;\n total: number | null;\n };\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { setCirrusConnected } from '../../store/unreal.actions';\nimport { OrchestrationMessageTypes } from '../../interfaces/SignalingMessage';\n\nexport function OnOpenHandler(this: SignallingService) {\n this.stopRetryTimer();\n this.store.dispatch(setCirrusConnected());\n\n this.send({\n type: OrchestrationMessageTypes.requestReservation,\n correlationId: this.correlationId,\n payload: {\n environmentId: this.environmentId,\n },\n });\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { Logger } from '@3dsource/utils';\nimport { setCirrusDisconnected } from '../../store/unreal.actions';\n\nexport function OnCloseHandler(this: SignallingService, e: CloseEvent): void {\n this.stopRetryTimer();\n Logger.warn(`WS closed: ${JSON.stringify(e.code)} - ${e.reason}`);\n this.store.dispatch(setCirrusDisconnected());\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { Logger } from '@3dsource/utils';\nimport {\n destroyRemoteConnections,\n setErrorMessage,\n} from '../../store/unreal.actions';\nimport { DisconnectReason } from '../../interfaces/disconnect-reasons';\n\nexport function OnErrorHandler(this: SignallingService, e: Event): void {\n clearTimeout(this.wsTimeoutHandler);\n Logger.warn(`WS error: ${JSON.stringify(e)}`);\n\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebSocketError',\n message: 'WebSocket Error',\n }),\n );\n this.store.dispatch(\n destroyRemoteConnections({ disconnectReason: DisconnectReason.wsOnError }),\n );\n this.initEstablishingConnection();\n this.watchTimeoutOrErrorAndReconnectLater();\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function OnMessageHandler(\n this: SignallingService,\n e: MessageEvent<string>,\n): void {\n clearTimeout(this.wsTimeoutHandler);\n //Logger.colored(...COLOR_CODES.FROM_SIGNALING, e.data);\n const msg = JSON.parse(e.data);\n this.handleMessage(msg);\n}\n","import type { SignallingService } from '../..//services/signalling.service';\nimport type { PlayerCountMessage } from '../..//interfaces/SignalingMessage';\nimport { Logger } from '@3dsource/utils';\n\nexport function PlayerCountHandler(\n this: SignallingService,\n msg: PlayerCountMessage,\n) {\n Logger.log(msg);\n}\n","/**\n * Generator for loop through urls\n * Each time it will return the next url, based on an index which MUST NOT be re-initialized inside function\n * @param urls\n */\nlet index = 0;\nexport function* getActiveUrl(urls: string[]) {\n while (true) {\n yield urls[index++ % urls.length];\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Observable } from 'rxjs';\nimport { from, of, switchMap } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { Semaphore } from '@3dsource/utils';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\n\n@Injectable()\nexport class RegionsPingService {\n private httpClient = inject(HttpClient);\n private unrealInitialConfig = inject(UNREAL_CONFIG);\n public config = {\n ping_count: 2,\n ping_timeout: 2000,\n max_parallel_requests: 10,\n bust_cache: true,\n };\n\n public getFastest(\n regionListUrl = this.unrealInitialConfig.regionsPingUrl,\n ): Observable<string | undefined> {\n return this.getProviders(regionListUrl).pipe(\n switchMap((providers: ProvidersData) => this.getPingResult(providers)),\n catchError(() => of(null)),\n map((data) => data?.region_code),\n );\n }\n\n public getPingResult(\n providers: ProvidersData,\n ): Observable<PingResult | null> {\n const regions = providers.regions;\n this.config.ping_timeout = providers.timeout || this.config.ping_timeout;\n\n return from(this.startPinging(regions));\n }\n\n public getProviders(regionList = this.unrealInitialConfig.regionsPingUrl) {\n return this.httpClient.get<ProvidersData>(regionList);\n }\n\n private startPinging(endpoints: Region[]): Promise<PingResult | null> {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve) => {\n const pingResults: PingResult[] = [];\n const semaphore = new Semaphore(10);\n const tasks = endpoints.map(async ({ region_code, url, timeout }) => {\n await semaphore.acquire();\n try {\n const result = await this.checkLatency(url, timeout);\n const data = { region_code, result };\n pingResults.push({ region_code, result });\n resolve(data);\n } catch {\n pingResults.push({ region_code: undefined, result: [] });\n } finally {\n semaphore.release();\n }\n const okValues = pingResults.filter(\n (pingResult) => pingResult.result.length > 1,\n );\n if (okValues.length) {\n return okValues[0];\n }\n return okValues;\n });\n await Promise.all(tasks);\n resolve(null);\n });\n }\n\n private async checkLatency(\n endpoint: string,\n timeout: number = this.config.ping_timeout,\n ) {\n const pingResults = [];\n\n for (let i = 0; i < this.config.ping_count; i++) {\n const startTime = performance.now();\n try {\n await this.fetchWithTimeout(\n this.config.bust_cache\n ? `${endpoint}?&cache_buster=${performance.now()}`\n : endpoint,\n {\n method: 'GET',\n mode: 'no-cors',\n headers: {\n 'Cache-Control': 'no-cache, no-store, must-revalidate',\n Pragma: 'no-cache',\n Expires: '0',\n },\n credentials: 'omit', // Optional: prevents sending or receiving cookies, which can affect caching.\n },\n timeout,\n );\n } finally {\n const latency = Math.round(performance.now() - startTime);\n pingResults.push(latency);\n }\n }\n return pingResults;\n }\n\n private async fetchWithTimeout(\n url: string,\n options: any = {},\n timeout: number,\n ) {\n const controller = new AbortController();\n options.signal = controller.signal;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\ninterface ProvidersData {\n timeout?: number;\n regions: Region[];\n}\n\ninterface Region {\n region_code: string;\n url: string;\n timeout?: number;\n}\n\ninterface PingResult {\n region_code: string | undefined;\n result: number[];\n}\n","export const WSCloseCode_NORMAL_CLOSURE = 3000;\nexport const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;\nexport const WSCloseCode_NORMAL_MANUAL_DISCONNECT = 3002;\nexport const WSCloseCode_NORMAL_CIRRUS_CLOSED = 3003;\n\nexport const WSCloseCodes = [\n WSCloseCode_NORMAL_CLOSURE,\n WSCloseCode_NORMAL_AFK_TIMEOUT,\n WSCloseCode_NORMAL_MANUAL_DISCONNECT,\n WSCloseCode_NORMAL_CIRRUS_CLOSED,\n] as const;\n\nexport type WSCloseCodesValues = (typeof WSCloseCodes)[number];\n","import { inject, Injectable } from '@angular/core';\nimport {\n ResetTelemetry,\n TelemetryStart,\n TelemetryStop,\n} from './command-telemetry.service';\nimport {\n combineLatest,\n merge,\n retryWhen,\n share,\n skip,\n Subject,\n switchMap,\n timeout,\n} from 'rxjs';\nimport { delay, filter, first, map, takeUntil, tap } from 'rxjs/operators';\nimport {\n initSignalling,\n setAwsInstance,\n setErrorMessage,\n setEstablishingConnection,\n setStatusMessage,\n setStatusPercentSignallingServer,\n} from '../store/unreal.actions';\nimport { HttpClient } from '@angular/common/http';\nimport { SubService } from './sub.service';\nimport { UnrealStatusMessage } from '../constants/UnrealStatusMessage';\nimport { unrealFeature } from '../store/unreal.feature';\nimport type { CloseReason } from '../interfaces/CloseReason';\nimport {\n COLOR_CODES,\n Falsy,\n generateUuid,\n Logger,\n tapLog,\n Truthy,\n} from '@3dsource/utils';\nimport {\n selectIsAutostart,\n selectMatchUrls,\n selectWsUrl,\n} from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport type {\n ConfigMessage,\n MessageBase,\n PollingOrchestrationMessage,\n SignalingMessageHandler,\n SignalingMessageMap,\n} from '../interfaces/SignalingMessage';\nimport { ConfigHandler } from '../helpers/FromStreamerHandlers/ConfigHandler';\nimport { AnswerHandler } from '../helpers/FromStreamerHandlers/AnswerHandler';\nimport { IceCandidateHandler } from '../helpers/FromStreamerHandlers/IceCandidateHandler';\nimport { SSInfoHandler } from '../helpers/FromStreamerHandlers/SSInfoHandler';\nimport { InstanceReadyHandler } from '../helpers/FromStreamerHandlers/InstanceReadyHandler';\nimport { InstanceReservedHandler } from '../helpers/FromStreamerHandlers/InstanceReservedHandler';\nimport { PingHandler } from '../helpers/FromStreamerHandlers/PingHandler';\nimport { OnOpenHandler } from '../helpers/WsHandlers/OpenHandler';\nimport { OnCloseHandler } from '../helpers/WsHandlers/OnCloseHandler';\nimport { OnErrorHandler } from '../helpers/WsHandlers/OnErrorHandler';\nimport { OnMessageHandler } from '../helpers/WsHandlers/OnMessageHandler';\nimport { PlayerCountHandler } from '../helpers/FromStreamerHandlers/PlayerCountHandler';\nimport { getActiveUrl } from '../helpers/GetNextUrl';\nimport { RegionsPingService } from '../services/regions-ping.service';\nimport { WSCloseCode_NORMAL_CLOSURE } from '../interfaces/CustomCloseCodes';\nimport { WS_OPEN_STATE, WS_TIMEOUT } from '../constants/unreal.constant';\n\n@Injectable()\nexport class SignallingService extends SubService {\n private readonly httpClient = inject(HttpClient);\n private readonly regionsPingService = inject(RegionsPingService);\n onConfig$ = new Subject<ConfigMessage>();\n onWebRtcIce$ = new Subject<RTCIceCandidate>();\n onWebRtcAnswer$ = new Subject<RTCSessionDescriptionInit | null>();\n\n private ws!: WebSocket;\n protected wsTimeoutHandler!: ReturnType<typeof setTimeout>;\n\n private wsMsgHandlers: Partial<{\n [K in keyof SignalingMessageMap]: SignalingMessageHandler<K>;\n }> = {};\n\n protected correlationId!: string;\n protected environmentId!: string;\n\n private establishingConnection = toSignal(\n this.store.select(unrealFeature.selectEstablishingConnection),\n );\n private isCirrusConnected = toSignal(\n this.store.select(unrealFeature.selectCirrusConnected),\n );\n private establishingConnectionDrop$ = this.store\n .select(unrealFeature.selectEstablishingConnection)\n .pipe(\n skip(1),\n filter(Falsy),\n tapLog('selectEstablishingConnection'),\n share(),\n );\n\n constructor() {\n super();\n this.setHandlersFromStream();\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy))\n .subscribe(() => {\n this.send(\n JSON.stringify({\n type: 'p2pEstablished',\n source: 'front',\n sessionId: generateUuid(),\n }),\n );\n });\n\n combineLatest([\n this.store\n .select(selectMatchUrls)\n .pipe(tapLog('MatchMakerUrls changed:')),\n this.store.select(selectIsAutostart).pipe(tapLog('Autostart is:')),\n ])\n .pipe(\n filter(([, autoStart]) => autoStart),\n map(([matchMakerUrls]) => [...matchMakerUrls].filter(Truthy)),\n filter((urls) => urls.length > 0),\n )\n .subscribe((urls) => this.connectToSignaling(urls));\n\n this.store\n .select(selectWsUrl)\n .pipe(filter(Truthy))\n .subscribe((url) => {\n this.initWebSocket(url);\n });\n }\n\n protected initEstablishingConnection() {\n this.showStatusMessage(UnrealStatusMessage.STARTING_YOUR_SESSION);\n this.store.dispatch(setEstablishingConnection({ value: true }));\n }\n\n private stopEstablishingConnection() {\n this.store.dispatch(setEstablishingConnection({ value: false }));\n }\n\n private connectToSignaling(urlList: string[]) {\n // Preparation for WebSocket Orchestration\n this.correlationId = generateUuid();\n this.environmentId = '7e356e8d-8fa5-4cf7-83d0-394903e7b0d6';\n\n ResetTelemetry();\n if (this.establishingConnection() || this.isCirrusConnected()) {\n Logger.warn(\n `SIGNALING REQUEST can't be called again!. Waiting for connection or error.`,\n );\n return;\n }\n\n this.initEstablishingConnection();\n this.regionsPingService\n .getFastest()\n .pipe(first())\n .subscribe((region) => {\n const out = urlList.map((url) => {\n if (region && !url.includes(':region')) {\n return url.replace(\n /signallingserver/gi,\n `signallingserver/region:${region}`,\n );\n }\n return url;\n });\n this.connectToSignalingAfterPing(out);\n });\n }\n\n private connectToSignalingAfterPing(urls: string[]): void {\n const urlGen = getActiveUrl(urls);\n\n TelemetryStart('getSignaling');\n\n const createSubscription = () => {\n const signalingUrl = `${urlGen.next().value}`;\n\n if (signalingUrl.match(/^ws(s?):\\/\\//i)) {\n this.store.dispatch(\n setAwsInstance({\n wsUrl: signalingUrl,\n pollingUrl: null,\n instanceName: null,\n }),\n );\n\n return;\n }\n\n const subscription = combineLatest([\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ])\n .pipe(\n filter(([clientId, viewId]) => !!clientId && !!viewId),\n tapLog('Stream Id =>'),\n switchMap(([clientId, viewId]) =>\n this.httpClient.get(`${signalingUrl}${clientId}/${viewId}`),\n ),\n timeout(4000),\n filter((data: PollingOrchestrationMessage) => {\n TelemetryStop('getSignaling', { ...data, multi: true });\n\n if (data.signallingServer === '' || data.error) {\n this.showStatusMessage(data?.mm_message || 'Server not found');\n\n if (data?.info) {\n this.store.dispatch(\n setStatusPercentSignallingServer({\n percent: data.info.percent,\n }),\n );\n }\n\n throw new Error('Invalid Value');\n }\n\n this.store.dispatch(\n setStatusPercentSignallingServer({ percent: 100 }),\n );\n\n return true;\n }),\n retryWhen((error) =>\n error.pipe(\n tap(() =>\n this.showStatusMessage(\n UnrealStatusMessage.CONNECTING_TO_SESSION,\n ),\n ),\n tap(() => Logger.log('Retrying with new URL')),\n delay(4000),\n tap(() => {\n // Unsubscribe the previous subscription and create a new one\n subscription.unsubscribe();\n createSubscription();\n }),\n ),\n ),\n takeUntil(merge(this.disconnect$, this.establishingConnectionDrop$)),\n )\n .subscribe((data: PollingOrchestrationMessage) => {\n subscription.unsubscribe();\n const wsProtocol = location.protocol.match(/https/i) ? 'wss' : 'ws';\n const wsUrl = `${wsProtocol}://${data.signallingServer}`;\n this.store.dispatch(\n setAwsInstance({\n wsUrl,\n pollingUrl: signalingUrl,\n instanceName: data.signallingServer!,\n }),\n );\n });\n };\n createSubscription();\n }\n\n showStatusMessage(message: string | null) {\n this.store.dispatch(setStatusMessage({ message }));\n }\n\n /**\n * Close the connection with the signaling server\n * @param data\n */\n close(data: CloseReason | void) {\n const { code, reason } = data || {\n code: WSCloseCode_NORMAL_CLOSURE,\n reason: 'NoReason',\n };\n if (this.ws) Logger.warn('Closing existing WebSocket connection');\n this.ws?.close(code, reason);\n this.ws = null as never;\n }\n\n send(data: string | object) {\n let dataString = data;\n if (typeof dataString !== 'string') {\n dataString = JSON.stringify(data);\n }\n if (this.ws && this.ws.readyState === WS_OPEN_STATE) {\n try {\n Logger.colored(...COLOR_CODES.TO_CIRRUS, JSON.parse(data as string));\n } catch {\n Logger.colored(...COLOR_CODES.TO_CIRRUS, data);\n }\n try {\n this.ws.send(dataString);\n } catch {\n Logger.error('No Websocket');\n }\n }\n }\n\n protected watchTimeoutOrErrorAndReconnectLater() {\n this.stopRetryTimer();\n this.wsTimeoutHandler = setTimeout(() => {\n Logger.warn('No WS Response, retrying new signaling');\n this.showStatusMessage(UnrealStatusMessage.CONNECTING_TO_SESSION);\n this.stopEstablishingConnection();\n this.store.dispatch(initSignalling());\n }, WS_TIMEOUT);\n }\n\n protected stopRetryTimer() {\n clearTimeout(this.wsTimeoutHandler);\n }\n\n private initWebSocket(url: string) {\n if (!window?.['WebSocket']) {\n alert(\"Your browser doesn't support WebSocket\");\n return;\n }\n\n this.clearWs();\n const wsUrl = this.httpUrlToWs(url);\n\n Logger.info('Creating socket', wsUrl);\n try {\n this.ws = new WebSocket(wsUrl);\n } catch (error) {\n this.ws = {} as WebSocket;\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebSocketError',\n message: 'WebSocket Error',\n }),\n );\n Logger.error('Error creating WebSocket', error);\n }\n\n this.ws.onmessage = OnMessageHandler.bind(this);\n this.ws.onerror = OnErrorHandler.bind(this);\n this.ws.onclose = OnCloseHandler.bind(this);\n this.ws.onopen = OnOpenHandler.bind(this);\n this.watchTimeoutOrErrorAndReconnectLater();\n TelemetryStart('iceCandidate');\n }\n\n private httpUrlToWs(url: string) {\n return url.replace('http://', 'ws://').replace('https://', 'wss://');\n }\n\n private clearWs() {\n this.onWebRtcAnswer$.next(null);\n if (this.ws) {\n this.ws.onmessage = () => null;\n this.ws.onerror = () => null;\n this.ws.onclose = () => null;\n this.ws.onopen = () => null;\n this.ws = null as never;\n }\n }\n\n protected handleMessage(msg: MessageBase) {\n try {\n Logger.colored(...COLOR_CODES.FROM_CIRRUS, msg);\n this.wsMsgHandlers[msg.type]!(msg as never);\n } catch {\n Logger.colored(\n ...COLOR_CODES.FROM_CIRRUS_ERROR,\n `Invalid CIRRUS message type: ${msg.type}`,\n );\n }\n }\n\n private setHandlersFromStream() {\n this.wsMsgHandlers.ping = PingHandler.bind(this);\n this.wsMsgHandlers.config = ConfigHandler.bind(this);\n this.wsMsgHandlers.answer = AnswerHandler.bind(this);\n this.wsMsgHandlers.ssInfo = SSInfoHandler.bind(this);\n this.wsMsgHandlers.playerCount = PlayerCountHandler.bind(this);\n this.wsMsgHandlers.iceCandidate = IceCandidateHandler.bind(this);\n this.wsMsgHandlers.instanceReady = InstanceReadyHandler.bind(this);\n this.wsMsgHandlers.instanceReserved = InstanceReservedHandler.bind(this);\n }\n}\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { first } from 'rxjs/operators';\nimport { SourceRoundButtonComponent } from '@source/ui-sdk/source-round-button';\nimport { SourceButtonComponent } from '@source/ui-sdk/source-button';\nimport { destroyConnectionsAndResetState } from '../../store/unreal.actions';\n\n@Component({\n selector: 'app-webrtc-error-modal',\n templateUrl: './webrtc-error-modal.component.html',\n styleUrl: './webrtc-error-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceRoundButtonComponent, SourceButtonComponent],\n})\nexport class WebrtcErrorModalComponent {\n dialogRef = inject(DialogRef);\n #store = inject(Store);\n\n close() {\n this.dialogRef.close();\n }\n\n closeModalWithCirrusDisconnect() {\n this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(first())\n .subscribe((isConnected) => {\n if (!isConnected) {\n this.#store.dispatch(destroyConnectionsAndResetState());\n }\n this.close();\n });\n }\n}\n","<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n <src-round-button\n (onClick)=\"close()\"\n [icon]=\"'close'\"\n [data-testid]=\"'close'\"\n class=\"src-modal__close\"\n >\n </src-round-button>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n colorScheme=\"primary\"\n >Ok</src-button\n >\n </footer>\n</div>\n","const errorCodes: Record<`code${number}`, string | undefined> = {\n code404:\n 'Your asset is being synced on Metabox servers and is not yet available in Metabox Studio or Metabox Configurator. Please check again later after syncing is complete. ',\n};\n\nexport function getRtcErrorMessage(code: number | null): string | undefined {\n if (code === null) return undefined;\n\n return errorCodes[`code${code}`];\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport {\n combineLatestWith,\n concatMap,\n debounceTime,\n EMPTY,\n fromEvent,\n map,\n of,\n range,\n switchMap,\n} from 'rxjs';\nimport { concatLatestFrom } from '@ngrx/operators';\nimport { Store } from '@ngrx/store';\nimport {\n changeLowBandwidth,\n changeStreamResolutionAction,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n destroyConnectionsAndResetState,\n destroyRemoteConnections,\n getPdfAction,\n getPdfActionFinalize,\n initShowcase,\n initSignalling,\n playPauseShowcase,\n resetAfkAction,\n resetConfig,\n resetUnrealState,\n resetWarnTimeout,\n setAwsInstance,\n setCirrusDisconnected,\n setConfig,\n setDataChannelConnected,\n setErrorMessage,\n setFreezeFrame,\n setLoopBackCommandIsCompleted,\n setMaxFps,\n setViewportReady,\n showUnrealErrorMessage,\n stopShowcase,\n} from './unreal.actions';\nimport { unrealFeature } from '../store/unreal.feature';\nimport {\n catchError,\n delay,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport {\n Falsy,\n isEmpty,\n leadingTrailingDebounceTime,\n Logger,\n tapLog,\n Truthy,\n} from '@3dsource/utils';\nimport { resetAfk } from '../helpers/resetAfk';\nimport { UnrealCommunicatorService } from '../services/unreal-communicator.service';\nimport { MetaBoxCommand } from '@struct';\nimport { observeCommandResponse } from '../helpers/CommandObserver';\nimport {\n CONSOLE_COMMAND_PIXEL_QUALITY,\n MINIMAL_FPS,\n} from '../constants/unreal.constant';\nimport {\n TelemetryStart,\n TelemetryStop,\n} from '../services/command-telemetry.service';\nimport {\n UnrealInternalSignalEvents,\n type WrappedMetaBoxCommandPacket,\n} from '../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal } from '../helpers/EventWrapper';\nimport { WebrtcErrorModalComponent } from '../components/webrtc-error-modal/webrtc-error-modal.component';\nimport { SourceModalComponent } from '@source/ui-sdk/source-modal';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport { ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport { getRtcErrorMessage } from '../helpers/error-codes';\nimport { SignallingService } from '../services/signalling.service';\nimport { WebRtcPlayerService } from '../services/web-rtc-player.service';\nimport { VideoStreamStatusService } from '../services/video-stream-status.service';\nimport { DisconnectReason } from '../interfaces/disconnect-reasons';\nimport {\n getDebugModeCommand,\n getExecuteConsoleCommand,\n getFreezeFrameCommand,\n getInitSequenceByObjectNameCommand,\n getLoopBackCommand,\n getSetFpsCommand,\n getStopSequenceCommand,\n} from '../helpers/prepare-commands';\nimport { WSCloseCode_NORMAL_CIRRUS_CLOSED } from '../interfaces/CustomCloseCodes';\nimport {\n DATA_CHANNEL_CONNECTION_TIMEOUT,\n DEFAULT_PDF_TIMEOUT,\n DEFAULT_SHOWCASE_TIMEOUT,\n} from '../constants/timeout.constant';\nimport {\n selectCommandsInProgress,\n selectLastCommandInProgress,\n selectShowcaseIsPlaying,\n selectShowcaseIsStopped,\n} from '../store/unreal.selectors';\nimport { ShowCaseStatus } from '../components/show-case/interfaces/showcase-status';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\nimport { DevModeService } from '../services/dev-mode.service';\nimport { INIT_SHOWCASE_PARAMS } from '../components/show-case/constants';\n\n@Injectable()\nexport class UnrealEffects {\n private dialog = inject(Dialog);\n private http = inject(HttpClient);\n private store = inject(Store);\n private isDevMode = inject(DevModeService).isDevMode;\n private unrealInitialConfig = inject(UNREAL_CONFIG);\n private actions$ = inject(Actions);\n private player = inject(WebRtcPlayerService);\n private signallingService = inject(SignallingService);\n private scrollStrategy = inject(ScrollStrategyOptions).block();\n private commandsSender = inject(UnrealCommunicatorService);\n private videoStatGenerator = inject(VideoStreamStatusService);\n\n cirrusDisconnectEffect$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setCirrusDisconnected),\n map(() => resetUnrealState()),\n );\n });\n destroyConnections$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyConnectionsAndResetState),\n map(() =>\n destroyRemoteConnections({ disconnectReason: DisconnectReason.reset }),\n ),\n );\n });\n resetState$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyConnectionsAndResetState),\n map(() => resetUnrealState()),\n );\n });\n destroyRemoteConnections$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n tap(({ disconnectReason }) => {\n this.signallingService.close({\n code: WSCloseCode_NORMAL_CIRRUS_CLOSED,\n reason: disconnectReason,\n });\n this.player.closePC();\n }),\n );\n },\n { dispatch: false },\n );\n changeStreamResolution$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeStreamResolutionAction),\n filter((size) => !!(size?.width && size?.height)),\n concatLatestFrom(() => [\n this.store.select(unrealFeature.selectStreamResolution),\n ]),\n filter(\n ([newSizes, savedSizes]) =>\n !(\n newSizes.width === savedSizes.width &&\n newSizes.height === savedSizes.height\n ),\n ),\n map(([sizes]) =>\n changeStreamResolutionSuccessAction({\n width: sizes.width,\n height: sizes.height,\n }),\n ),\n );\n });\n forceLBMOff$ = createEffect(() => {\n return fromEvent(document, 'visibilitychange').pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n tapLog('forceLBMOff$'),\n map(() => changeLowBandwidth({ lowBandwidth: false })),\n );\n });\n resetFreezeFrameOnLowBandwidthTriggered$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeLowBandwidth),\n map((state) => state.lowBandwidth),\n distinctUntilChanged(),\n map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n );\n });\n sendLbmStat$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n distinctUntilChanged(),\n filter(Truthy),\n exhaustMap(() =>\n this.actions$.pipe(\n ofType(changeLowBandwidth),\n filter(({ lowBandwidth }) => lowBandwidth),\n withLatestFrom(\n this.store.select(unrealFeature.selectAwsInstance),\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ),\n first(),\n exhaustMap(([, instance, companyId, viewId]) =>\n this.http\n .post(this.unrealInitialConfig.customErrorsEndpoint, {\n message: {\n type: 'front',\n error: 'low_bandwidth_mode',\n signalling: instance.pollingUrl,\n },\n client: instance.pollingUrl,\n session_uuid: companyId,\n session_uuid2: viewId,\n })\n .pipe(catchError(() => EMPTY)),\n ),\n ),\n ),\n )\n .subscribe();\n resetAfk$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setConfig, resetWarnTimeout, resetConfig),\n map(() => resetAfkAction()),\n );\n });\n resetFreezeFrameOnViewportDestroy$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setViewportReady),\n filter(Falsy),\n map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n );\n });\n setMaxFps$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(setMaxFps),\n tap(({ maxFps }) => {\n this.commandsSender.sendCommandToUnreal(getSetFpsCommand(maxFps));\n }),\n );\n },\n { dispatch: false },\n );\n webrtcErrorModalComponent$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(setErrorMessage),\n debounceTime(400),\n combineLatestWith(\n this.store.select(unrealFeature.selectDataChannelConnected),\n ),\n filter(([error, isConnected]) => {\n return !isConnected && error?.errorType === 'WebRTCError';\n }),\n tap(() => this.dialog.open(WebrtcErrorModalComponent)),\n );\n },\n { dispatch: false },\n );\n resetAfkAction$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(resetAfkAction),\n tap(() => resetAfk()),\n );\n },\n { dispatch: false },\n );\n lowBandSlideshow$ = createEffect(\n () => {\n const makeFreezeRequest = () => {\n return range(0, 2).pipe(\n concatMap((idx) => {\n Logger.log(`LBM FreezeFrame Request #${idx}`);\n return observeCommandResponse(\n getFreezeFrameCommand({ value: true }, 'lbm'),\n (data) => {\n this.commandsSender.sendCommandToUnreal(data);\n },\n ).pipe(delay(1000));\n }),\n );\n };\n\n return this.actions$.pipe(\n ofType(changeLowBandwidth),\n map(({ lowBandwidth }) => lowBandwidth),\n distinctUntilChanged(),\n delay(100),\n combineLatestWith(\n this.store.select(selectLastCommandInProgress),\n this.store.select(unrealFeature.selectViewportReady),\n this.store.select(selectShowcaseIsStopped),\n ),\n filter(\n ([isLow, lastCommand, viewportReady, showCaseIsStopped]) =>\n isLow &&\n viewportReady &&\n showCaseIsStopped &&\n !!lastCommand?.command &&\n lastCommand?.command !== MetaBoxCommand.FFreezeFrameCommand,\n ),\n leadingTrailingDebounceTime(1000),\n switchMap(() => makeFreezeRequest()),\n );\n },\n { dispatch: false },\n );\n setDataChannelTimeoutCheck$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setAwsInstance),\n filter(({ wsUrl }) => !!wsUrl),\n debounceTime(DATA_CHANNEL_CONNECTION_TIMEOUT), // Timeout, if not connected, send error report, then reconnect\n concatLatestFrom(() => [\n this.store.select(unrealFeature.selectSsData),\n this.store.select(unrealFeature.selectCirrusConnected),\n this.store.select(unrealFeature.selectDataChannelConnected),\n ]),\n filter(([, , isCirrusConnected, isDataChannelConnected]) => {\n return isCirrusConnected && !isDataChannelConnected;\n }),\n switchMap(([awsInstance, ssData]) => {\n const error = `DataChannel connection timeout ${DATA_CHANNEL_CONNECTION_TIMEOUT}ms, requesting new signaling.`;\n Logger.error(error);\n\n return this.http\n .post(awsInstance.pollingUrl || '', {\n awsInstance,\n connectionId: ssData?.connectionId,\n href: location.href,\n userAgent: navigator.userAgent,\n error,\n })\n .pipe(\n catchError((error: unknown) => {\n Logger.error('Error sending timeout info:', error);\n return of(null);\n }),\n );\n }),\n map(() =>\n destroyRemoteConnections({\n disconnectReason: DisconnectReason.dataChannelTimeout,\n }),\n ),\n );\n });\n destroyConnectionAndRestart$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n filter(\n ({ disconnectReason }) =>\n disconnectReason === DisconnectReason.dataChannelTimeout,\n ),\n switchMap(() => this.actions$.pipe(ofType(resetUnrealState), first())),\n map(() => initSignalling()),\n );\n });\n showUnrealError$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(showUnrealErrorMessage),\n map(({ code }) => getRtcErrorMessage(code)),\n distinctUntilChanged(),\n filter(Truthy),\n switchMap(\n (content: string) =>\n this.dialog.open(SourceModalComponent, {\n scrollStrategy: this.scrollStrategy,\n data: {\n size: 'small',\n backButton: false,\n closeButton: true,\n headerTitle: 'Warning',\n content,\n testID: 'unreal-error',\n footerButtons: [\n {\n srcButtonConfig: {\n colorScheme: 'secondary',\n },\n label: 'Ok',\n action: () => false,\n },\n ],\n },\n }).closed,\n ),\n map(() => showUnrealErrorMessage({ code: null })),\n );\n });\n initAppBySetDataChannelConnected$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setDataChannelConnected),\n tap(() => {\n this.commandsSender.sendCommandToUnreal(\n getExecuteConsoleCommand({\n value: CONSOLE_COMMAND_PIXEL_QUALITY,\n }),\n );\n\n this.commandsSender.sendCommandToUnreal(\n getDebugModeCommand({ value: this.isDevMode }),\n );\n\n TelemetryStart('SetViewportReady');\n }),\n switchMap(() =>\n this.store.select(selectCommandsInProgress).pipe(\n debounceTime(500),\n first(),\n switchMap(() =>\n observeCommandResponse<MetaBoxCommand.FLoopBackCommand>(\n getLoopBackCommand(),\n (data) => this.commandsSender.sendCommandToUnreal(data),\n ),\n ),\n switchMap(() => this.videoStatGenerator.videoStats$),\n filter(\n (videoStats) =>\n !!videoStats.aggregatedStats.framesPerSecond &&\n videoStats.aggregatedStats.framesPerSecond > MINIMAL_FPS &&\n (videoStats.aggregatedStats.framesDecoded || 0) > 15,\n ),\n first(),\n map(() => setLoopBackCommandIsCompleted()),\n ),\n ),\n );\n });\n setViewportReadyBySetLoopBackCommandIsCompleted$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setLoopBackCommandIsCompleted),\n tap(() => TelemetryStop('SetViewportReady', { ready: true })),\n map(() => setViewportReady({ value: true })),\n );\n });\n listenUnrealCallbackByInitSignalling$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(initSignalling),\n switchMap(() =>\n fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(\n ({ json }) =>\n (json as WrappedMetaBoxCommandPacket)?.commandCallback\n ?.correlationId,\n ),\n filter(Truthy),\n map((id) => commandCompleted({ id })),\n ),\n ),\n );\n });\n setConfigByInitSignalling$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(initSignalling),\n switchMap(() =>\n this.store.select(unrealFeature.selectUnrealVersion).pipe(\n filter(Truthy),\n map((unrealVersion) =>\n [\n unrealVersion && this.unrealInitialConfig?.signalling\n ? this.unrealInitialConfig.signalling[unrealVersion]\n : '',\n ]\n .flat()\n .filter(Truthy),\n ),\n ),\n ),\n map((urls) => {\n if (isEmpty(urls)) {\n throw Error('Signalling URL(s) is empty');\n }\n return setConfig({ config: { matchMakerUrls: urls } });\n }),\n );\n });\n setConfigByGetPdfAction$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(getPdfAction),\n map(() => setConfig({ config: { warnTimeout: DEFAULT_PDF_TIMEOUT } })),\n );\n });\n stopShowcaseByGetPdfAction$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(getPdfAction),\n concatLatestFrom(() => this.store.select(selectShowcaseIsPlaying)),\n filter(([, isPlaying]) => isPlaying),\n map(() => {\n this.commandsSender.sendCommandToUnreal(getStopSequenceCommand());\n return stopShowcase({ isResetSceneId: false });\n }),\n );\n });\n resetWarnTimeoutByGetPdfActionFinalize$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(getPdfActionFinalize),\n map(() => resetWarnTimeout()),\n );\n });\n initShowcaseByGetPdfActionFinalize$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(getPdfActionFinalize),\n concatLatestFrom(() =>\n this.store.select(unrealFeature.selectShowCaseSceneId),\n ),\n filter(([, sceneId]) => !!sceneId),\n map(([, sceneId]) => {\n this.commandsSender.sendCommandToUnreal(\n getInitSequenceByObjectNameCommand({\n ...INIT_SHOWCASE_PARAMS,\n objectName: sceneId || '',\n }),\n );\n return initShowcase({ sceneId: sceneId || '' });\n }),\n );\n });\n changeShowcaseStatus$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(playPauseShowcase),\n filter(\n ({ showcase }) =>\n showcase === ShowCaseStatus.INIT || showcase === ShowCaseStatus.STOP,\n ),\n map(({ showcase }) =>\n showcase === ShowCaseStatus.INIT\n ? setConfig({ config: { warnTimeout: DEFAULT_SHOWCASE_TIMEOUT } })\n : resetWarnTimeout(),\n ),\n );\n });\n}\n","import type { Observable } from 'rxjs';\nimport { scan } from 'rxjs';\nimport { clampf } from '@3dsource/utils';\n\nexport const clampAndKeepMaxPercents = (): ((\n source: Observable<number>,\n) => Observable<number>) => {\n return (source: Observable<number>) =>\n source.pipe(\n scan(\n (acc, value) =>\n value === 0 ? value : clampf(0, 100, Math.max(acc, value)),\n 0,\n ),\n );\n};\n","export function decodeData(anyData: any) {\n try {\n return new TextDecoder('utf-16').decode(anyData);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n return '';\n }\n}\n","import type { Observable } from 'rxjs';\nimport { of, scan, switchMap } from 'rxjs';\nimport { smoothTransition } from '@3dsource/utils';\nimport { map } from 'rxjs/operators';\n\nexport const floatToSmoothPercents = (): ((\n source: Observable<number>,\n) => Observable<number>) => {\n return (source: Observable<number>) =>\n source.pipe(\n scan(\n (acc, value) => ({\n previous: acc.current,\n current: value,\n }),\n {\n previous: 0,\n current: 0,\n },\n ),\n\n switchMap(({ previous, current }) => {\n if (Math.abs(current - previous) > 0.95) {\n // Assume that big difference seems like switch between 0 and 1 immediately after resetLoaderState(),\n // so it should go to 'current' without transitions\n return of(current);\n }\n return smoothTransition(previous, current, 300);\n }), // 300ms duration for smooth transition\n\n map((value) => Math.floor(value * 100)),\n );\n};\n","import { Observable } from 'rxjs';\n\nexport function fromResizeObserver(\n elem: HTMLElement,\n): Observable<ResizeObserverEntry[]> {\n return new Observable((subscriber) => {\n const observer = new window.ResizeObserver((entries) =>\n subscriber.next(entries),\n );\n observer.observe(elem);\n\n return () => observer.unobserve(elem);\n });\n}\n","export const SpecialKeyCodes = {\n BackSpace: 8,\n Shift: 16,\n Control: 17,\n Alt: 18,\n RightShift: 253,\n RightControl: 254,\n RightAlt: 255,\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\nexport const MouseButton = {\n MainButton: 0, // Left button.\n AuxiliaryButton: 1, // Wheel button.\n SecondaryButton: 2, // Right button.\n FourthButton: 3, // Browser Back button.\n FifthButton: 4, // Browser Forward button.\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\nexport const MouseButtonsMask = {\n PrimaryButton: 1, // Left button.\n SecondaryButton: 2, // Right button.\n AuxiliaryButton: 4, // Wheel button.\n FourthButton: 8, // Browser Back button.\n FifthButton: 16, // Browser Forward button.\n};\n","import type { InputService } from '../services/input.service';\nimport { MouseButton } from '../constants/ButtonsAndCodes';\nimport { fromEvent } from 'rxjs';\n\nexport default class TouchEmulator {\n private lastDistance = 0;\n private prevDistance = 0;\n private touchReset = true;\n private delta = 0;\n private moveSensitivityScale = 3;\n private prevX = 0;\n private prevY = 0;\n\n constructor(private host: InputService) {\n this.registerTouchEvents(host.video);\n }\n\n private getPosition({ clientX, clientY }: Position) {\n return {\n x: clientX - this.host.videoBoundingRect.left,\n y: clientY - this.host.videoBoundingRect.top,\n };\n }\n\n private getCenter(v1: Vector, v2: Vector) {\n return {\n x: (v2.x - v1.x) / 2 + v1.x,\n y: (v2.y - v1.y) / 2 + v1.y,\n };\n }\n\n private getDistance(v1: Vector, v2: Vector) {\n const quad = {\n x: Math.abs(v2.x - v1.x) ^ 2,\n y: Math.abs(v2.y - v1.y) ^ 2,\n };\n\n return Math.sqrt(quad.x + quad.y);\n }\n\n updateDistance(touches: TouchList) {\n const center = this.getCenter(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n this.lastDistance = this.getDistance(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n if (this.touchReset) {\n this.prevDistance = this.lastDistance;\n this.touchReset = false;\n }\n\n return center;\n }\n\n private touchToVector2({ clientX, clientY }: Position) {\n return {\n x: clientX,\n y: clientY,\n };\n }\n\n private twoFingersAction(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n\n this.lastDistance = 0;\n this.prevDistance = 0;\n this.prevX = center.x;\n this.prevY = center.y;\n this.host.emitMouseUp(MouseButton.MainButton, center.x, center.y);\n this.host.emitMouseDown(MouseButton.SecondaryButton, center.x, center.y);\n }\n\n private threeFingersActionMove(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n this.delta = this.lastDistance - this.prevDistance;\n\n const xx = center.x - this.prevX;\n const yy = center.y - this.prevY;\n\n this.host.emitMouseMove(\n center.x,\n center.y,\n this.moveSensitivityScale * xx,\n this.moveSensitivityScale * yy,\n );\n this.prevX = center.x;\n this.prevY = center.y;\n }\n\n private twoFingersActionZoom(touches: TouchList) {\n const center = this.updateDistance(touches);\n this.delta = this.lastDistance - this.prevDistance;\n\n if (Math.abs(this.delta) < 0.3) {\n return;\n }\n\n this.delta = (this.delta / Math.abs(this.delta)) * 2000;\n\n if (isNaN(this.delta)) {\n return;\n }\n\n this.prevDistance = this.lastDistance;\n this.host.emitMouseWheel(this.delta, center.x, center.y);\n }\n\n private registerTouchEvents(playerElement: HTMLVideoElement) {\n let finger: Finger | undefined;\n\n fromEvent<TouchEvent>(playerElement, 'touchstart', {\n passive: false,\n }).subscribe((e: TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const touches: TouchList = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersAction(touches);\n\n return;\n }\n\n /**\n * One finger actions below\n */\n\n this.prevDistance = 0;\n this.touchReset = true;\n\n if (finger === undefined) {\n const firstTouch = e.changedTouches[0];\n const { x, y } = this.getPosition(firstTouch);\n finger = {\n id: firstTouch.identifier,\n x,\n y,\n };\n // Hack: Mouse events require an enter and leave so we just\n // enter and leave manually with each touch as this event\n // is not fired with a touch device.\n playerElement.dispatchEvent(new MouseEvent('mouseenter', e));\n this.host.emitMouseDown(MouseButton.MainButton, finger.x, finger.y);\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchend', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < e.changedTouches.length; t++) {\n const touch = e.changedTouches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n this.host.emitMouseUp(MouseButton.MainButton, x, y);\n this.host.emitMouseUp(MouseButton.SecondaryButton, x, y);\n // Hack: Manual mouse leave event.\n playerElement.dispatchEvent(new MouseEvent('mouseleave', e));\n finger = undefined;\n\n break;\n }\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchmove', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n const touches = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n this.threeFingersActionMove(touches);\n\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersActionZoom(touches);\n\n return;\n }\n\n for (let t = 0; t < touches.length; t++) {\n const touch = e.touches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n\n this.host.emitMouseMove(\n x,\n y,\n this.moveSensitivityScale * (x - finger.x),\n this.moveSensitivityScale * (y - finger.y),\n );\n finger.x = x;\n finger.y = y;\n\n break;\n }\n }\n });\n }\n}\n\ninterface Vector {\n x: number;\n y: number;\n}\n\ninterface Finger extends Vector {\n id: number;\n}\n\ninterface Position {\n clientX: number;\n clientY: number;\n}\n","export class VideoRecorder {\n private recordedChunks!: any[];\n private mediaRecorder!: MediaRecorder;\n\n capture(canvas: any) {\n // Optional frames per second argument can be set in captureStream().\n const stream = (canvas as HTMLCanvasElement).captureStream();\n\n this.recordedChunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n this.mediaRecorder = new MediaRecorder(stream, options);\n this.mediaRecorder.ondataavailable = this.handleDataAvailable.bind(this);\n this.mediaRecorder.start();\n\n // demo: to download after 9sec\n /*\n setTimeout((event) => {\n mediaRecorder.stop();\n }, 9000);\n */\n }\n\n stop() {\n this.mediaRecorder?.stop();\n }\n\n handleDataAvailable(event: any) {\n if (event.data.size > 0) {\n this.recordedChunks.push(event.data);\n this.download();\n }\n }\n\n download() {\n const blob = new Blob(this.recordedChunks, {\n type: 'video/webm',\n });\n\n const url = URL.createObjectURL(blob);\n const a: any = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.download = 'test.webm';\n a.click();\n URL.revokeObjectURL(url);\n }\n}\n","export const deepEqual = (a: any, b: any): boolean => {\n // same reference or primitive\n if (a === b) return true;\n\n // must both be objects (and not null)?\n if (\n typeof a === 'object' && a !== null &&\n typeof b === 'object' && b !== null\n ) {\n // arrays?\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n // plain objects\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n // `b` must have key, and values must match\n if (!Object.prototype.hasOwnProperty.call(b, key)) {\n return false;\n }\n if (!deepEqual(a[key], b[key])) {\n return false;\n }\n }\n return true;\n }\n\n // everything else (including mismatched types)\n return false;\n}\n","import { COLOR_CODES, Falsy, Logger, Truthy, where } from '@3dsource/utils';\nimport { inject, Injectable } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { Subject } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n takeUntil,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { EControlSchemeType } from '../constants/EControlSchemeType';\nimport { EToClientMessageType } from '../constants/EToClientMessageType';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { InputOptions } from '../constants/InputOptions';\nimport { SignallingService } from './signalling.service';\nimport { Store } from '@ngrx/store';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoService } from './video.service';\nimport { VideoStreamStatusService } from './video-stream-status.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { unrealFeature } from '../store';\nimport { sendSignal } from '../helpers';\nimport { decodeData } from '../helpers/DataDecoder';\nimport { selectStreamConfig } from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TelemetryStop } from '../services/command-telemetry.service';\nimport type { ConfigMessage } from '../interfaces/SignalingMessage';\nimport type { UnrealCommands } from '@struct';\nimport { showUnrealErrorMessage } from '../store/unreal.actions';\nimport { deepEqual } from '../helpers/deepEqual';\n\n@Injectable()\nexport class AggregatorService {\n readonly store = inject(Store);\n readonly selectStreamConfig = toSignal(this.store.select(selectStreamConfig));\n readonly videoService = inject(VideoService);\n readonly webrtcPlayer = inject(WebRtcPlayerService);\n readonly freezeFrame = inject(FreezeFrameService);\n readonly signallingSrv = inject(SignallingService);\n readonly stats = inject(VideoStreamStatusService);\n /**\n * /Never called for now\n * @\n */\n destroy$ = new Subject<void>();\n responseEventListeners!: Map<string, (data: unknown) => void>;\n disconnect$!: Observable<boolean>;\n unlockViewport$!: Observable<boolean>;\n\n constructor() {\n this.listenWebRTC();\n this.listenSignaling();\n this.initialize();\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\n\n private initialize() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(distinctUntilChanged())\n .subscribe((connected) => {\n this.resetResponseList();\n\n if (connected) {\n this.startListenCallbacks();\n }\n });\n\n this.disconnect$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Falsy));\n\n this.unlockViewport$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy));\n\n this.unlockViewport$.subscribe(() => {\n this.removeLoadScreen();\n });\n\n this.disconnect$.subscribe(() => {\n this.removeLoadScreen();\n });\n\n if (\n !this.selectStreamConfig()?.autoStart ||\n location.href.match(/^http:/gi)\n ) {\n this.removeLoadScreen();\n }\n\n InputOptions.controlScheme = EControlSchemeType.HoveringMouse;\n\n this.addExternalResponses();\n }\n\n /**\n * @deprecated\n * Hack for 3DS platform;\n * TODO remove ASAP, use {@link BasicConfiguratorApiService.toMetaBoxHandlers.watchCallbacks}\n * Add external responses to the list of responses\n */\n private addExternalResponses() {\n /*Signal.on('ADDRESPONSE')\n .pipe(takeUntil(this.destroy$))\n .subscribe((data: any) => {\n this.addResponseEventListener(data.name!, (event) => {\n this.externalApi.sendMessage({\n action: FromMetaBoxApiAction.UnrealResponse,\n name: data.name,\n responseEvent: event,\n });\n });\n });*/\n }\n\n addResponseEventListener(name: string, listener: (data: unknown) => void) {\n this.responseEventListeners.set(name, listener);\n }\n\n showOnScreenKeyboard<T extends { showOnScreenKeyboard: boolean }>(\n command: T,\n ) {\n if (command.showOnScreenKeyboard) {\n // Show the 'edit text' button.\n //editTextButton.classList.remove('hiddenState');\n // Place the 'edit text' button near the UE4 input widget.\n //let pos = unquantizeAndDenormalizeUnsigned(command.x, command.y);\n //editTextButton.style.top = pos.y.toString() + 'px';\n //editTextButton.style.left = (pos.x - 40).toString() + 'px';\n } else {\n // Hide the 'edit text' button.\n //editTextButton.classList.add('hiddenState');\n // Hide the on-screen keyboard.\n // hiddenInput.blur();\n }\n }\n\n exposeApi() {\n // const globals: Window = window;\n // if ('apiReady' in globals) {\n // try {\n // const api = {\n // setStreamData: (streamData: StreamData) => {\n // this.streamConfig.setConfig(streamData.params);\n // },\n // };\n // globals.apiReady(api);\n // } catch (e) {\n // /!* empty *!/\n // }\n // }\n }\n\n removeLoadScreen() {\n document.getElementById('3dsource_start_screen')?.remove();\n }\n\n startListenCallbacks() {\n Logger.info('Start Listen Callbacks');\n\n let previousJson: unknown = null;\n\n this.addResponseEventListener('unrealEvents', (data) => {\n try {\n if (typeof data !== 'string') {\n return;\n }\n const json = JSON.parse(data);\n\n if (!deepEqual(json, previousJson)) {\n if (json?.error) {\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL_ERROR,\n `${json.error}`,\n data,\n );\n this.store.dispatch(showUnrealErrorMessage({ code: json.code }));\n } else {\n this.showMessageFromUnreal(json);\n\n previousJson = json;\n sendSignal(UnrealInternalSignalEvents.UnrealCallback, { json });\n }\n } else {\n //Logger.warn('Duplicate message received');\n }\n } catch (e) {\n Logger.error(e);\n Logger.error('ERROR=>', data);\n }\n });\n }\n\n private showMessageFromUnreal<T extends UnrealCommands>(json: T) {\n if (filteredLogs.some(where({ command: json?.command }))) {\n return;\n }\n Logger.colored(...COLOR_CODES.FROM_UNREAL, json);\n }\n\n resetResponseList() {\n this.responseEventListeners = new Map();\n }\n\n listenSignaling() {\n const iceCandidateBuffer: RTCIceCandidate[] = [];\n\n const processBuffer = () => {\n iceCandidateBuffer.forEach((cnd) => {\n this.webrtcPlayer.handleCandidateFromServer(cnd);\n });\n iceCandidateBuffer.length = 0;\n };\n\n this.signallingSrv.onConfig$\n .pipe(takeUntil(this.destroy$))\n .subscribe((config: ConfigMessage) => {\n this.videoService.create();\n this.webrtcPlayer.setConfig(config);\n void this.webrtcPlayer.createWebRtcOffer();\n });\n\n this.signallingSrv.onWebRtcAnswer$\n .pipe(filter(Truthy), takeUntil(this.destroy$))\n .subscribe((answer) => {\n this.webrtcPlayer.receiveAnswer(answer);\n processBuffer();\n });\n\n this.signallingSrv.onWebRtcIce$\n .pipe(\n withLatestFrom(this.signallingSrv.onWebRtcAnswer$),\n takeUntil(this.destroy$),\n )\n .subscribe(([candidate, answerEstablished]) => {\n TelemetryStop('iceCandidate', {\n multi: true,\n });\n\n iceCandidateBuffer.push(candidate);\n if (answerEstablished) {\n processBuffer();\n }\n });\n }\n\n listenWebRTC() {\n this.webrtcPlayer.onWebRtcOffer$\n .pipe(takeUntil(this.destroy$))\n .subscribe((offer: RTCSessionDescriptionInit) =>\n this.signallingSrv.send(offer),\n );\n\n this.webrtcPlayer.onWebRtcCandidate$\n .pipe(takeUntil(this.destroy$))\n .subscribe((candidate: RTCIceCandidate) =>\n this.signallingSrv.send(\n JSON.stringify({\n type: 'iceCandidate',\n candidate: candidate,\n }),\n ),\n );\n\n this.webrtcPlayer.onDataChannelMessage$\n .pipe(takeUntil(this.destroy$))\n .subscribe((data: number[]) => this.dataChannelMessageHandler(data));\n\n this.webrtcPlayer.onAudioTrack$\n .pipe(takeUntil(this.destroy$))\n .subscribe((stream: MediaStream) =>\n this.videoService.attachAudioStream(stream),\n );\n\n this.webrtcPlayer.onVideoTrack$\n .pipe(takeUntil(this.destroy$))\n .subscribe((stream: MediaStream) => {\n this.videoService.attachVideoStream(stream);\n });\n }\n\n dataChannelMessageHandler(data: number[]) {\n const view = new Uint8Array(data);\n const anyData = data.slice(1);\n\n if (this.freezeFrame.receiving) {\n this.freezeFrame.setData(view);\n\n return;\n }\n\n switch (view[0]) {\n case EToClientMessageType.QualityControlOwnership: {\n const ownership = view[1] !== 0;\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Received quality controller message, will control quality: ' +\n ownership,\n );\n break;\n }\n\n case EToClientMessageType.Response: {\n const response = decodeData(anyData);\n\n for (const listener of this.responseEventListeners.values()) {\n listener(response as never);\n }\n\n break;\n }\n\n case EToClientMessageType.Command: {\n const commandAsString = decodeData(anyData);\n Logger.colored(...COLOR_CODES.FROM_UNREAL, commandAsString);\n const command = JSON.parse(commandAsString);\n\n if (command.command === 'onScreenKeyboard') {\n this.showOnScreenKeyboard(command);\n }\n break;\n }\n\n case EToClientMessageType.FreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Freeze frame');\n this.freezeFrame.start(view);\n break;\n\n case EToClientMessageType.UnfreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Un-Freeze frame');\n this.freezeFrame.invalidate();\n break;\n\n case EToClientMessageType.VideoEncoderAvgQP:\n this.stats.setEncoder(anyData);\n break;\n\n case EToClientMessageType.LatencyTest: {\n const latencyTimings = decodeData(anyData);\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Got latency timings :',\n latencyTimings,\n );\n Logger.colored(...COLOR_CODES.FROM_UNREAL, latencyTimings);\n this.stats.latencyTestTimings.SetUETimings(latencyTimings);\n break;\n }\n\n case EToClientMessageType.InitialSettings:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InitialSettings message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.Protocol:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Protocol message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.InputControlOwnership:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InputControlOwnership message :',\n anyData,\n );\n break;\n\n default:\n Logger.warn(`unrecognized data received, packet ID ${view[0]}`);\n }\n }\n}\n\nexport const filteredLogs = [\n {\n command: 'onChangeSequence',\n },\n];\n","import type { IKeyCode, IKeyName } from '@3dsource/utils';\nimport {\n InvertedKeyMap,\n KeyboardNumericCode,\n Logger,\n Truthy,\n} from '@3dsource/utils';\nimport type {\n InputProps,\n NormalizeAndQuantizeSignedValue,\n NormalizeAndQuantizeUnsignedValue,\n UnquantizeAndDenormalizeUnsignedValue,\n} from '../interfaces/input.interface';\nimport {\n MouseButton,\n MouseButtonsMask,\n SpecialKeyCodes,\n} from '../constants/ButtonsAndCodes';\nimport type { Observable } from 'rxjs';\nimport {\n combineLatestWith,\n fromEvent,\n merge,\n startWith,\n Subject,\n takeUntil,\n} from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n} from 'rxjs/operators';\nimport type { EMessageTypeValues } from '../constants/EMessageType';\nimport { EMessageType } from '../constants/EMessageType';\nimport { inject } from '@angular/core';\nimport { InputOptions } from '../constants/InputOptions';\nimport TouchEmulator from '../helpers/TouchEmulator';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal } from '../helpers/EventWrapper';\nimport { fromResizeObserver } from '../helpers/resize-observer';\nimport { UnrealCommunicatorService } from '../services/unreal-communicator.service';\nimport { DevModeService } from '../services/dev-mode.service';\nimport { SubService } from '../services/sub.service';\nimport { unrealFeature } from '../store/unreal.feature';\n\nexport class InputService extends SubService {\n private commandsSender = inject(UnrealCommunicatorService);\n private isDevMode = inject(DevModeService).isDevMode;\n\n readonly defaultKeys = [\n KeyboardNumericCode.KeyW,\n KeyboardNumericCode.KeyS,\n KeyboardNumericCode.KeyA,\n KeyboardNumericCode.KeyD,\n KeyboardNumericCode.ArrowUp,\n KeyboardNumericCode.ArrowDown,\n KeyboardNumericCode.ArrowLeft,\n KeyboardNumericCode.ArrowRight,\n KeyboardNumericCode.NumpadAdd,\n KeyboardNumericCode.NumpadSubtract,\n KeyboardNumericCode.ControlRight,\n KeyboardNumericCode.Equal,\n KeyboardNumericCode.Minus,\n KeyboardNumericCode.NumpadDecimal,\n ];\n private availableKeys: IKeyCode[] = this.defaultKeys;\n private options!: InputProps;\n private reInit$ = new Subject<void>();\n private deactivatedVideoTrigger$!: Observable<unknown>;\n\n private normalizeAndQuantizeUnsigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeUnsignedValue;\n private unQuantizeAndDenormalizeUnsigned!: (\n x: number,\n y: number,\n ) => UnquantizeAndDenormalizeUnsignedValue;\n private normalizeAndQuantizeSigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeSignedValue;\n\n video!: HTMLVideoElement;\n videoBoundingRect: DOMRect = new DOMRect(0, 0, 1, 1);\n fingerIds = new Map();\n maxByteValue = 255;\n fingers = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];\n\n private offsetParams: OffsetParams = {\n scaleX: 1,\n scaleY: 1,\n scaledHeight: 0,\n scaledWidth: 0,\n offsetByY: 0,\n offsetByX: 0,\n };\n\n constructor() {\n super();\n const visibilityHiddenTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'hidden'),\n filter(Truthy),\n );\n\n const visibilityVisibleTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n startWith(true),\n );\n\n this.deactivatedVideoTrigger$ = merge(\n this.disconnect$,\n this.reInit$,\n visibilityHiddenTrigger$,\n );\n\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized)\n .pipe(\n combineLatestWith(\n visibilityVisibleTrigger$,\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy), startWith(true)),\n ),\n filter(([video]) => !!video),\n )\n .subscribe(([video]) => this.setup(video));\n }\n\n useKeyboardKeys(keys: IKeyCode[]) {\n this.availableKeys = keys || [];\n }\n\n private setup(video: HTMLVideoElement) {\n this.options = InputOptions;\n this.video = video;\n this.reInit$.next();\n\n merge(\n fromResizeObserver(video),\n fromSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer),\n )\n .pipe(debounceTime(300), takeUntil(this.deactivatedVideoTrigger$))\n .subscribe(() => {\n this.setupNormalizeAndQuantize(video);\n });\n\n this.setupNormalizeAndQuantize(video);\n this.registerInputs();\n }\n\n /**\n * We use `object-fit: cover` on the video element. Since the video can have\n * a different aspect ratio from its container (and potentially be larger),\n * we need to calculate offsets and scale factors to map container (e.g., mouse)\n * coordinates back to the actual video coordinates.\n *\n * @param videoElement The video element whose scaling and positioning we need\n * @returns Object containing offset and scale info for coordinate normalization\n * @private\n */\n private getObjectFitOffset(videoElement: HTMLVideoElement) {\n const { width, height } = this.videoBoundingRect;\n const { videoWidth, videoHeight } = videoElement;\n\n Logger.log('Video Quantizing with => ', this.videoBoundingRect, {\n videoWidth,\n videoHeight,\n });\n\n // Compute aspect ratios\n const containerRatio = width / height;\n const videoRatio = videoWidth / videoHeight;\n\n // Determine how much to scale the video to fit the container (cover mode)\n const scale =\n videoRatio > containerRatio ? height / videoHeight : width / videoWidth;\n\n // Calculate the displayed (scaled) dimensions of the video\n const scaledWidth = videoWidth * scale;\n const scaledHeight = videoHeight * scale;\n\n // Offsets in x/y directions (like \"padding\") once the video is scaled\n const offsetByX = (width - scaledWidth) / 2;\n const offsetByY = (height - scaledHeight) / 2;\n\n // Scale factors for coordinate transformation from container space to video space\n const scaleX = width / scaledWidth;\n const scaleY = height / scaledHeight;\n\n return {\n offsetByX,\n offsetByY,\n scaleX,\n scaleY,\n scaledWidth,\n scaledHeight,\n };\n }\n\n private setupNormalizeAndQuantize(videoElement: HTMLVideoElement) {\n if (videoElement) {\n this.videoBoundingRect = videoElement.getBoundingClientRect();\n this.offsetParams = this.getObjectFitOffset(videoElement);\n\n // Unsigned XY positions are the ratio (0.0..1.0) along a viewport axis,\n // quantized into an uint16 (0..65536).\n // Signed XY deltas are the ratio (-1.0..1.0) along a viewport axis,\n // quantized into an int16 (-32767..32767).\n // This allows the browser viewport and client viewport to have a different\n // size.\n // Hack: Currently we set an out-of-range position to an extreme (65535)\n // as we can't yet accurately detect mouse enter and leave events\n // precisely inside a video with an aspect ratio which causes mattes.\n\n this.normalizeAndQuantizeUnsigned = (x, y) => {\n const normalizedX = x / videoElement.clientWidth;\n const normalizedY = y / videoElement.clientHeight;\n\n if (\n normalizedX < 0.0 ||\n normalizedX > 1.0 ||\n normalizedY < 0.0 ||\n normalizedY > 1.0\n ) {\n return {\n inRange: false,\n x: 65535,\n y: 65535,\n };\n } else {\n return {\n inRange: true,\n x: normalizedX * 65536,\n y: normalizedY * 65536,\n };\n }\n };\n\n this.unQuantizeAndDenormalizeUnsigned = (x, y) => {\n const normalizedX = x / 65536;\n const normalizedY = y / 65536;\n return {\n x: normalizedX * videoElement.clientWidth,\n y: normalizedY * videoElement.clientHeight,\n };\n };\n\n // Signed.\n this.normalizeAndQuantizeSigned = (x, y) => {\n const normalizedX = x / (0.5 * videoElement.clientWidth);\n const normalizedY = y / (0.5 * videoElement.clientHeight);\n return {\n x: normalizedX * 32767,\n y: normalizedY * 32767,\n };\n };\n }\n }\n\n private sendInputData(data: ArrayBuffer) {\n this.commandsSender.sendInputData(data);\n }\n\n private registerInputs() {\n merge(\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(distinctUntilChanged(), filter(Truthy)),\n fromEvent(window, 'blur'),\n )\n .pipe(\n filter(() => !!this.video),\n takeUntil(this.deactivatedVideoTrigger$),\n )\n .subscribe(() => this.releaseMouseButtons(255, 0, 0));\n\n this.registerMouseEnterAndLeaveEvents(this.video);\n this.registerHoveringMouseEvents(this.video);\n this.registerKeyboardEvents(this.availableKeys);\n\n if (InputOptions.fakeMouseWithTouches) {\n new TouchEmulator(this);\n } else {\n this.registerTouchEvents(this.video);\n }\n }\n\n private getTouchPositionWithOffset({ clientX, clientY }: Touch) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (clientX - offsetByX - this.videoBoundingRect.left) * scaleX,\n y: (clientY - offsetByY - this.videoBoundingRect.top) * scaleY,\n };\n }\n\n private getMousePositionWithOffset({ offsetX, offsetY }: MouseEvent) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (offsetX - offsetByX) * scaleX,\n y: (offsetY - offsetByY) * scaleY,\n };\n }\n\n private registerTouchEvents(htmlVideoElement: HTMLVideoElement) {\n // We need to assign a unique identifier to each finger.\n // We do this by mapping each Touch object to the identifier.\n\n const rememberTouch = (touch: Touch) => {\n const finger = this.fingers.pop();\n if (finger === undefined) {\n Logger.info('exhausted touch indentifiers');\n return;\n }\n this.fingerIds.set(touch.identifier, finger);\n };\n\n const forgetTouch = (touch: Touch) => {\n this.fingers.push(this.fingerIds.get(touch.identifier));\n // Sort array back into descending order. This means if finger '1' were to lift after finger '0', we would ensure that 0 will be the first index to pop\n this.fingers.sort(function (a, b) {\n return b - a;\n });\n this.fingerIds.delete(touch.identifier);\n };\n\n const emitTouchData = (type: EMessageTypeValues, touches: TouchList) => {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n let byte = 2;\n const numTouches = 1; // the number of touches to be sent this message\n const touch = touches[t];\n const { x, y } = this.getTouchPositionWithOffset(touch);\n Logger.info(`F${this.fingerIds.get(touch.identifier)}=(${x}, ${y})`);\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const data = new DataView(new ArrayBuffer(9));\n\n data.setUint8(0, type);\n data.setUint8(1, numTouches);\n data.setUint16(byte, coord.x, true);\n byte += 2;\n data.setUint16(byte, coord.y, true);\n byte += 2;\n data.setUint8(byte, this.fingerIds.get(touch.identifier));\n byte += 1;\n // force is between 0.0 and 1.0 so quantize into byte.\n // iOs bug: Forced to be always 0.5 on all devices as we do not use forced touch any way;/\n data.setUint8(byte, this.maxByteValue * 0.5);\n byte += 1;\n data.setUint8(byte, coord.inRange ? 1 : 0);\n byte += 1;\n this.sendInputData(data.buffer);\n }\n };\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchstart')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n this.focusWindow();\n const touches: TouchList = e.changedTouches;\n // Assign a unique identifier to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n rememberTouch(touches[t]);\n }\n Logger.info('touch start');\n emitTouchData(EMessageType.TouchStart, touches);\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchend')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n const touches: TouchList = e.changedTouches;\n Logger.info('touch end');\n\n emitTouchData(EMessageType.TouchEnd, touches);\n\n // Re-cycle unique identifiers previously assigned to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n forgetTouch(touches[t]);\n }\n\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchmove')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n const touches: TouchList = e.touches;\n Logger.info('touch move');\n\n emitTouchData(EMessageType.TouchMove, touches);\n e.preventDefault();\n });\n }\n\n focusWindow() {\n window.focus();\n }\n\n emitMouseMove(x: number, y: number, deltaX: number, deltaY: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const delta = this.normalizeAndQuantizeSigned(deltaX, deltaY);\n const Data = new DataView(new ArrayBuffer(9));\n\n Data.setUint8(0, EMessageType.MouseMove);\n Data.setUint16(1, coord.x, true);\n Data.setUint16(3, coord.y, true);\n Data.setInt16(5, delta.x, true);\n Data.setInt16(7, delta.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseDown(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseDown);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseUp(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseUp);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseWheel(delta: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(7));\n Data.setUint8(0, EMessageType.MouseWheel);\n Data.setInt16(1, delta, true);\n Data.setUint16(3, coord.x, true);\n Data.setUint16(5, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n private releaseMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseUp(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseUp(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseUp(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseUp(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseUp(MouseButton.FifthButton, x, y);\n }\n }\n\n // If the user has any mouse buttons pressed then press them again.\n private pressMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseDown(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseDown(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseDown(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseDown(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseDown(MouseButton.FifthButton, x, y);\n }\n }\n\n private registerHoveringMouseEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmousemove = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseMove(x, y, e.movementX, e.movementY);\n e.preventDefault();\n };\n\n htmlVideoElement.onmousedown = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.focusWindow();\n this.emitMouseDown(e.button, x, y);\n e.preventDefault();\n };\n\n htmlVideoElement.onmouseup = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseUp(e.button, x, y);\n e.preventDefault();\n };\n\n // When the context menu is shown then it is safest to release the button\n // which was pressed when the event happened. This will guarantee we will\n // get at least one mouse up corresponding to a mouse down event. Otherwise\n // the mouse can get stuck.\n // https://github.com/facebook/react/issues/5531\n // playerElement.oncontextmenu = (e) => {\n // e.preventDefault();\n // this.emitMouseUp(e.button, e.offsetX, e.offsetY);\n // };\n\n fromEvent<WheelEvent>(htmlVideoElement, 'wheel')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e: WheelEvent) => {\n this.emitMouseWheel(e.deltaY * -120, e.offsetX, e.offsetY);\n e.preventDefault();\n });\n\n (htmlVideoElement as Clickable).pressMouseButtons = (e: MouseEvent) => {\n this.pressMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n\n (htmlVideoElement as Clickable).releaseMouseButtons = (e: MouseEvent) => {\n this.releaseMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n }\n\n private registerMouseEnterAndLeaveEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmouseenter = (e) => {\n this.focusWindow();\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseEnter);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).pressMouseButtons(e);\n };\n\n htmlVideoElement.onmouseleave = (e) => {\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseLeave);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).releaseMouseButtons(e);\n };\n }\n\n // Browser keys do not have a charCode so we only need to test keyCode.\n private isKeyCodeBrowserKey(keyCode: number): boolean {\n // Function keys or tab key.\n return (keyCode >= 112 && keyCode <= 123) || keyCode === 9;\n }\n\n private getKeyCode(e: KeyboardEvent): number {\n if (e.keyCode === SpecialKeyCodes.Shift && e.code === 'ShiftRight')\n return SpecialKeyCodes.RightShift;\n else if (e.keyCode === SpecialKeyCodes.Control && e.code === 'ControlRight')\n return SpecialKeyCodes.RightControl;\n else if (e.keyCode === SpecialKeyCodes.Alt && e.code === 'AltRight')\n return SpecialKeyCodes.RightAlt;\n else return e.keyCode;\n }\n\n private registerKeyboardEvents(availableKeys: IKeyCode[]) {\n const availableKeyNames = Object.entries(availableKeys).map(([, value]) => {\n return InvertedKeyMap[value];\n });\n\n const keyBlock = (event: KeyboardEvent) => {\n const code: IKeyName = event.code as IKeyName;\n const isInputFieldFocused =\n (event.target as HTMLElement)?.localName === 'input';\n const keyMatch = availableKeyNames.includes(code);\n\n if (this.isDevMode && !keyMatch) {\n Logger.warn(\n 'Code=>',\n code,\n 'Keyboard event is not filtered in DEV Mode. App may behave inappropriately!',\n );\n return isInputFieldFocused;\n }\n\n return isInputFieldFocused || !keyMatch;\n };\n this.startListenKeys(keyBlock);\n }\n\n private startListenKeys(_filter?: (event: KeyboardEvent) => boolean) {\n const filter = _filter ?? (() => false);\n\n document.onkeydown = (e) => {\n if (filter(e)) {\n return;\n }\n\n const isCtrlOrCommand = e.ctrlKey || e.metaKey;\n\n const isPlusOrMinus =\n e.keyCode === KeyboardNumericCode.Equal ||\n e.keyCode === KeyboardNumericCode.Minus;\n if (isCtrlOrCommand && isPlusOrMinus) {\n return;\n }\n\n this.sendInputData(\n new Uint8Array([\n EMessageType.KeyDown,\n this.getKeyCode(e),\n Number(e.repeat),\n ]).buffer,\n );\n // Backspace is not considered a keypress in JavaScript but we need it\n // to be so characters may be deleted in a UE4 text entry field.\n if (e.keyCode === SpecialKeyCodes.BackSpace) {\n (document as DocumentClickable).onkeypress({\n charCode: SpecialKeyCodes.BackSpace,\n });\n //document.dispatchEvent(new KeyboardEvent('keydown',{key: name, keyCode: SpecialKeyCodes.BackSpace, code: SpecialKeyCodes.BackSpace, repeat: false} ));\n }\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeyup = (e) => {\n if (filter(e)) {\n return;\n }\n this.sendInputData(\n new Uint8Array([EMessageType.KeyUp, this.getKeyCode(e)]).buffer,\n );\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeypress = (e) => {\n if (filter(e)) {\n return;\n }\n const data = new DataView(new ArrayBuffer(3));\n data.setUint8(0, EMessageType.KeyPress);\n data.setUint16(1, e.charCode, true);\n this.sendInputData(data.buffer);\n };\n }\n}\n\ninterface OffsetParams {\n scaleX: number;\n scaleY: number;\n scaledHeight: number;\n scaledWidth: number;\n offsetByY: number;\n offsetByX: number;\n}\ntype Clickable = HTMLVideoElement & {\n releaseMouseButtons: (e: MouseEvent) => void;\n pressMouseButtons: (e: MouseEvent) => void;\n};\n\ntype DocumentClickable = Document & {\n onkeypress: (data: unknown) => void;\n};\n","import type { Mixpanel } from 'mixpanel-browser';\n\nexport const MIX_PANEL: {\n /**\n * Mixpanel instance for tracking meta-box events\n */\n metaBoxTrack: Mixpanel;\n\n /**\n * Mixpanel instance for tracking stream events\n */\n streamTrack: Mixpanel;\n} = {\n metaBoxTrack: undefined,\n streamTrack: undefined,\n} as any;\n","import { inject, Injectable } from '@angular/core';\nimport type { MixPanelEventsValues } from '../interfaces/mix-panel-events';\nimport { MIX_PANEL } from '../constants/mix-panel.constant';\nimport type { Dict } from 'mixpanel-browser';\nimport mixpanel from 'mixpanel-browser';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MixPanelService {\n #unrealConfig = inject(UNREAL_CONFIG);\n\n init() {\n MIX_PANEL.metaBoxTrack = mixpanel.init(\n this.#unrealConfig.mixpanelToken,\n {\n ignore_dnt: true,\n },\n 'metaBoxTrack',\n );\n MIX_PANEL.streamTrack = mixpanel.init(\n this.#unrealConfig.mixpanelStreamToken,\n {\n ignore_dnt: true,\n },\n 'streamTrack',\n );\n this.trackMetabox('Metabox started');\n this.trackStream('Metabox started');\n }\n\n trackMetabox(event: MixPanelEventsValues | string, data?: Dict) {\n MIX_PANEL.metaBoxTrack.track(event, data);\n }\n\n trackStream(event: MixPanelEventsValues | string, data?: Dict) {\n MIX_PANEL.streamTrack.track(event, data);\n }\n}\n","import { Store } from '@ngrx/store';\nimport { inject, Injectable } from '@angular/core';\nimport { auditTime } from 'rxjs';\nimport { map, withLatestFrom } from 'rxjs/operators';\nimport { unrealFeature } from '../store/unreal.feature';\nimport type {\n AwsInstance,\n IAggregatedStat,\n InboundVideoStats,\n} from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoStreamStatusService } from './video-stream-status.service';\nimport type { LBMStats } from '../interfaces/LBMStats';\nimport { MixPanelService } from '../services/mix-panel.service';\n\n@Injectable()\nexport class StreamStatusTelemetryService {\n #store = inject(Store);\n #videoStatGenerator = inject(VideoStreamStatusService);\n #mixPanelService = inject(MixPanelService);\n\n constructor() {\n this.initTelemetry();\n }\n\n private mapEventData(\n data: IAggregatedStat,\n signalingServer: AwsInstance,\n isLowBandwidth: boolean,\n lbmStats: LBMStats | undefined,\n ) {\n const {\n bitrate,\n VideoEncoderQP,\n framesPerSecond,\n frameWidth,\n frameHeight,\n jitter,\n packetsLost,\n currentRoundTripTime,\n } = data.aggregatedStats;\n\n return {\n runTime: data.aggregatedStats.runTime,\n frameWidth,\n frameHeight,\n isLowBandwidth,\n client: signalingServer.wsUrl,\n pixelRatio: window.devicePixelRatio,\n framesPerSecond,\n jitter,\n packetsLost,\n instanceName: signalingServer.instanceName,\n bitrate,\n lbmStats,\n rtt: currentRoundTripTime,\n VideoEncoderQP,\n };\n }\n\n private initTelemetry() {\n this.#videoStatGenerator.videoStats$\n .pipe(\n withLatestFrom(\n this.#store.select(unrealFeature.selectAwsInstance),\n this.#store.select(unrealFeature.selectLowBandwidth),\n this.#store.select(unrealFeature.selectLowBandwidthStats),\n ),\n auditTime(5000),\n map(([data, signalingServer, isLowBandwidth, lbmStats]) =>\n this.mapEventData(data, signalingServer, isLowBandwidth, lbmStats),\n ),\n )\n .subscribe((data) => this.trackEventToMixPanel(data));\n }\n\n private trackEventToMixPanel(data: Partial<InboundVideoStats>) {\n this.#mixPanelService.trackStream('streamStatus', data);\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n OnInit,\n} from '@angular/core';\nimport { BehaviorSubject, combineLatestWith, Observable, of } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport type { InboundVideoStats } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { StatGraphComponent } from '../../components/stat-graph/stat-graph.component';\nimport { AsyncPipe, JsonPipe } from '@angular/common';\nimport { Store } from '@ngrx/store';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport { DevModeService } from '../../services/dev-mode.service';\nimport { SourceIconComponent } from '@source/ui-sdk/source-icon';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { selectSignalingParameters } from '../../store/unreal.selectors';\nimport { SafePipe } from '../../pipes/safe-html.pipe';\n\n@Component({\n selector: 'app-video-stats',\n templateUrl: './video-stats.component.html',\n styleUrls: ['./video-stats.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n StatGraphComponent,\n AsyncPipe,\n JsonPipe,\n SourceIconComponent,\n SafePipe,\n ],\n})\nexport class VideoStatsComponent implements OnInit {\n collapsed = false;\n private store = inject(Store);\n private videoStatGenerator = inject(VideoStreamStatusService);\n private isDevMode = inject(DevModeService).isDevMode;\n private obs$ = this.videoStatGenerator.videoStats$;\n\n viewportReady = toSignal(\n this.store.select(unrealFeature.selectViewportReady),\n );\n ssInfo = toSignal(this.store.select(selectSignalingParameters));\n fpsTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.framesPerSecond, hash: index }) as any,\n ),\n ),\n );\n fpsAvgTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.avgFrameRate, hash: index }) as any,\n ),\n ),\n );\n bitrateTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.bitrate, hash: index }) as any,\n ),\n ),\n );\n videoQP = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.VideoEncoderQP, hash: index }) as any,\n ),\n ),\n );\n bitrateAverageTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.avgBitrate, hash: index }) as any,\n ),\n ),\n );\n videoStatus = toSignal(\n this.obs$.pipe(\n map(\n (event) =>\n this.isDevMode &&\n ({\n ...event.aggregatedStats,\n quality: event.quality,\n } as InboundVideoStats),\n ),\n filter(Boolean),\n map((data: any) => {\n return this.fields\n .map((key) => {\n return {\n key,\n value: data[key],\n };\n })\n .filter((r) => !this.elementsToShow.includes(r.key));\n }),\n ),\n );\n fields!: string[];\n graphList: any[] = [];\n graphList$!: Observable<any>;\n private idKey = 'com.source3d.unreal.stat';\n private elementsToShow: string[] = [];\n\n private trigger$ = new BehaviorSubject<void>(undefined);\n\n constructor() {\n this.getFields();\n }\n\n ngOnInit() {\n this.fields = [\n 'kalmanBitrate',\n 'bitrateDrop',\n 'runTime',\n 'pixelRatio',\n 'frameHeight',\n 'frameWidth',\n ':-------------',\n 'jitter',\n 'MBytesReceived',\n 'framesDecoded',\n 'framesDropped',\n 'framesReceived',\n 'keyFramesDecoded',\n 'currentRoundTripTime',\n 'packetsLost',\n ':-------------',\n 'quality',\n 'videoCodec',\n 'kind',\n 'type',\n 'codecs',\n //'pliCount',\n //'sliCount',\n //'transportId',\n //'id',\n ];\n\n this.updateGraph();\n }\n\n updateGraph() {\n this.graphList = this.fields.map((key: any) => {\n const stat = this.obs$.pipe(\n map((val, index) => {\n const value = (val.aggregatedStats as any)[key];\n return { value, hash: index } as any;\n }),\n );\n\n return {\n key,\n color: Math.floor(Math.random() * 16777216),\n stat,\n };\n });\n\n this.graphList$ = of(this.graphList).pipe(\n combineLatestWith(this.trigger$),\n map(([graphList]) =>\n graphList.filter((r) => this.elementsToShow.includes(r.key)),\n ),\n );\n }\n\n toggle() {\n this.collapsed = !this.collapsed;\n this.writeFields();\n }\n\n toggleGraph($event: MouseEvent, el: string, value?: any) {\n $event.stopPropagation();\n if ((value && typeof value !== 'number') || isNaN(value)) {\n return;\n }\n if (this.elementsToShow.includes(el)) {\n this.elementsToShow = this.elementsToShow.filter((item) => item !== el);\n } else {\n this.elementsToShow.push(el);\n }\n this.writeFields();\n this.trigger$.next();\n }\n\n private getFields() {\n try {\n const { elements, collapsed } =\n JSON.parse(localStorage.getItem(this.idKey) as string) || [];\n this.elementsToShow = elements || [];\n this.collapsed = collapsed;\n } catch {\n this.elementsToShow = [];\n }\n }\n\n private writeFields() {\n localStorage.setItem(\n this.idKey,\n JSON.stringify({\n collapsed: this.collapsed,\n elements: this.elementsToShow,\n }),\n );\n }\n}\n","@if (videoStatus()) {\n @if (viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">\n <src-icon [name]=\"'settings'\" />\n </button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [dataTick]=\"fpsTick()\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgFPS (higher is better)\"\n [dataTick]=\"fpsAvgTick()\"\n color=\"#00aa00\"\n />\n </li>-->\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgBitrate\"\n [dataTick]=\"bitrateAverageTick()\"\n color=\"#D50007\"\n />\n </li>-->\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n }\n}\n","import type { OnInit } from '@angular/core';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { Falsy, tapLog, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { combineLatestWith, merge, of, skip, Subject, switchMap } from 'rxjs';\nimport { debounceTime, delay, filter, map, tap } from 'rxjs/operators';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { VideoStatsComponent } from '../../components/video-stats/video-stats.component';\nimport { floatToSmoothPercents } from '../../helpers/float-to-smooth-percents';\nimport { clampAndKeepMaxPercents } from '../../helpers/clamp-and-keep-max-percents';\nimport { SourceLoadingComponent } from '@source/ui-sdk/source-loading';\nimport {\n selectShowLoader,\n selectTotalProgress,\n} from '../../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DevModeService } from '../../services/dev-mode.service';\n\n@Component({\n selector: 'app-unreal-status',\n templateUrl: './unreal-status.component.html',\n styleUrls: ['./unreal-status.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [VideoStatsComponent, SourceLoadingComponent],\n})\nexport class UnrealStatusComponent implements OnInit {\n message$!: Observable<string | null>;\n #store = inject(Store);\n #onDisconnect$ = this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(filter(Falsy));\n\n readonly isDevMode = inject(DevModeService).isDevMode;\n\n /**\n * An observable that emits smoothed percentage values from 0 to 100.\n */\n readonly messagePercents$ = toSignal(\n this.#onDisconnect$.pipe(\n switchMap(() =>\n this.#store.select(selectTotalProgress).pipe(\n floatToSmoothPercents(),\n clampAndKeepMaxPercents(),\n combineLatestWith(this.#store.select(selectShowLoader)),\n map(([progress, showLoader]) => (showLoader ? progress || 0 : null)),\n ),\n ),\n ),\n );\n\n ngOnInit() {\n /**\n * A subject that emits null values to trigger nullification.\n */\n const nullify$ = new Subject<null>();\n\n /**\n * An observable that emits null values with a delay of 2000 milliseconds.\n */\n const nullifyObs$: Observable<null> = nullify$\n .asObservable()\n .pipe(delay(2000));\n\n /**\n * An observable that emits the status message from the Unreal feature store.\n */\n const signalingStatus$ = this.#store.select(\n unrealFeature.selectStatusMessage,\n );\n\n /**\n * An observable that emits connection status messages based on the Cirrus connection state.\n * Then call side effect to nullify the message.\n */\n const cirrusConnected$ = this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(\n skip(1),\n switchMap((connected) =>\n connected\n ? of('Creating Socket...')\n : of('Connection closed.').pipe(tap(() => nullify$.next(null))),\n ),\n );\n\n /**\n * An observable that emits the viewport visibility state.\n */\n const viewportTrigger$ = this.#store.select(\n unrealFeature.selectViewportReady,\n );\n\n /**\n * An observable that will nullify any message displayed after 500 mSec, when viewport changes its state.\n */\n const streamToggle$ = merge(\n viewportTrigger$.pipe(filter(Falsy), skip(1)),\n viewportTrigger$.pipe(filter(Truthy)),\n ).pipe(\n delay(500),\n map(() => null),\n );\n\n /**\n * An observable that merges various status observables and emits debounced status messages.\n */\n this.message$ = merge(\n nullifyObs$,\n cirrusConnected$,\n signalingStatus$,\n streamToggle$,\n ).pipe(\n debounceTime(0),\n tap((status) => this.sendMessageToIndex(status as string)),\n tapLog('STATUS'),\n );\n }\n\n /**\n * Sends a message to the embedded iframe identified by the '3dsource_start_screen' ID.\n * This function tries to post a message to the iframe's content window. If the content\n * window is not accessible (e.g., due to cross-origin policies), the function fails silently.\n *\n * @param {string} text The message to be sent to the iframe. This could be a status update\n * or any other relevant information that the iframe needs to process.\n */\n private sendMessageToIndex(text: string) {\n const objectElement = document.getElementById(\n '3dsource_start_screen',\n ) as HTMLIFrameElement;\n\n try {\n const objectDocument = objectElement.contentWindow;\n objectDocument?.postMessage(text, '*');\n } catch {\n // Fails silently if the iframe's content window cannot be accessed\n }\n }\n}\n","@if (messagePercents$() !== null) {\n <div class=\"status-box\">\n <div class=\"status-box__message\">\n <src-loading\n [size]=\"30\"\n [backgroundStrokeColor]=\"'#E5E7EB'\"\n [progressStrokeColor]=\"'#1F2937'\"\n />\n {{ messagePercents$() }}%\n </div>\n </div>\n}\n\n@if (isDevMode) {\n <app-video-stats />\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n HostListener,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewChild,\n} from '@angular/core';\nimport { distinctUntilChanged, filter, map, tap } from 'rxjs/operators';\nimport {\n combineLatestWith,\n debounceTime,\n fromEvent,\n merge,\n switchMap,\n take,\n timer,\n} from 'rxjs';\nimport { VideoService } from '../../services/video.service';\nimport { AggregatorService } from '../../services/aggregator.service';\nimport { InputService } from '../../services/input.service';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport type { Area, Size } from '@3dsource/utils';\nimport { fitIntoRectangle, fpIsASameAsB, Truthy } from '@3dsource/utils';\nimport { Store } from '@ngrx/store';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport {\n changeStreamResolutionAction,\n destroyConnectionsAndResetState,\n initSignalling,\n resetUnrealStateAction,\n} from '../../store/unreal.actions';\nimport {\n DEBOUNCE_TO_MANY_RESIZE_CALLS,\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n SAME_SIZE_THRESHOLD,\n} from '../../constants/unreal.constant';\nimport { StreamStatusTelemetryService } from '../../services/stream-status-telemetry.service';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport { fromSignal, sendSignal } from '../../helpers/EventWrapper';\nimport { AfkRestartScreenLockerComponent } from '../../components/screen-locker/afk-restart-screen-locker.component';\nimport { ClickableOverlayComponent } from '../../components/clickable-overlay/clickable-overlay.component';\nimport { UnrealCommunicatorService } from '../../services/unreal-communicator.service';\nimport { UnrealStatusComponent } from '../../components/unreal-status/unreal-status.component';\nimport { getChangeResolutionCommand } from '../../helpers/prepare-commands';\nimport { FreezeFrameComponent } from '../../components/freeze-frame/freeze-frame.component';\nimport { selectIsFreezeFrameLoading } from '../../store/unreal.selectors';\n\n@Component({\n selector: 'app-unreal-scene',\n templateUrl: './unreal-scene.component.html',\n styleUrls: ['./unreal-scene.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AfkRestartScreenLockerComponent,\n ClickableOverlayComponent,\n UnrealStatusComponent,\n FreezeFrameComponent,\n ],\n})\nexport class UnrealSceneComponent implements AfterViewInit, OnInit, OnDestroy {\n isStudio = input(false);\n useContainerAsSizeProvider = input(true);\n studioResolutionSize = input<{ width: number; height: number }>({\n width: FULL_HD_WIDTH,\n height: FULL_HD_HEIGHT,\n });\n studioResolutionValues = toObservable(\n computed(() => {\n const values = this.studioResolutionSize();\n return { width: values.width, height: values.height };\n }),\n );\n private width = FULL_HD_WIDTH;\n private height = FULL_HD_HEIGHT;\n private store = inject(Store);\n private aggregatorService = inject(AggregatorService);\n private commandsSender = inject(UnrealCommunicatorService);\n private inputService = inject(InputService);\n private videoService = inject(VideoService);\n private stats = inject(VideoStreamStatusService);\n private streamTelemetryService = inject(StreamStatusTelemetryService);\n private element = inject(ElementRef);\n private destroyRef = inject(DestroyRef);\n\n lightMode = toSignal(this.store.select(unrealFeature.selectLowBandwidth));\n isFreezeFrameLoading = toSignal(\n this.store.select(selectIsFreezeFrameLoading),\n );\n\n @ViewChild('container') container!: ElementRef;\n changeMouseOverScene = output<boolean>();\n\n @HostListener('mouseover')\n onMouseOver() {\n this.changeMouseOverScene.emit(true);\n }\n\n @HostListener('mouseout')\n onMouseOut() {\n this.changeMouseOverScene.emit(false);\n }\n\n ngOnInit() {\n this.streamTelemetryService.init();\n this.aggregatorService.init();\n this.inputService.useKeyboardKeys(this.inputService.defaultKeys);\n this.store.dispatch(initSignalling());\n }\n\n ngAfterViewInit() {\n fromEvent<Event>(this.element.nativeElement, 'contextmenu')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: Event) => event.preventDefault());\n\n this.videoService.container = this.container.nativeElement;\n\n const customSizeInputChanged$ = this.studioResolutionValues.pipe(\n filter(Truthy),\n distinctUntilChanged(),\n filter(\n ({ width, height }) => this.width !== width || this.height !== height,\n ),\n map(({ width, height }) => ({ width, height })),\n tap(({ width, height }) => {\n this.width = width;\n this.height = height;\n }),\n );\n\n const resizeRequired$ = merge(\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized),\n fromEvent(window, 'resize'),\n );\n\n const videoStreamSizeChanged$ = this.stats?.videoStats$.pipe(\n filter(() => !this.isFreezeFrameLoading()),\n map((stats) => ({\n w: stats.aggregatedStats.frameWidth || 0,\n h: stats.aggregatedStats.frameHeight || 0,\n })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n );\n\n merge(customSizeInputChanged$, resizeRequired$, videoStreamSizeChanged$)\n .pipe(\n debounceTime(DEBOUNCE_TO_MANY_RESIZE_CALLS),\n switchMap(() => {\n const key = Math.random();\n\n // Monitoring the size of the video stream\n return timer(0, 300).pipe(\n take(3),\n map(() => key),\n );\n }),\n map((key) => ({ key, ...this.resizeValues })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD) &&\n previous.key === current.key,\n ),\n tap((size) => this.adaptVideo(size)),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n combineLatestWith(\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy)),\n ),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(([size]) => {\n this.store.dispatch(\n changeStreamResolutionAction({ width: size.w, height: size.h }),\n );\n this.sendResize(size);\n });\n\n fromSignal(UnrealInternalSignalEvents.ForceResizeViewport)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.sendResize(this.resizeValues);\n });\n }\n\n ngOnDestroy() {\n this.commandsSender.destroy();\n // eslint-disable-next-line @ngrx/avoid-dispatching-multiple-actions-sequentially\n this.store.dispatch(destroyConnectionsAndResetState());\n // eslint-disable-next-line @ngrx/avoid-dispatching-multiple-actions-sequentially\n this.store.dispatch(resetUnrealStateAction());\n }\n\n private adaptVideo(size: Size) {\n const video = this.videoService.video;\n const areaSize = this.resizeValues;\n\n if (video?.style) {\n const pR = this.pixelRatio;\n video.width = size.w / pR / areaSize.scale;\n video.height = size.h / pR / areaSize.scale;\n\n if (!this.isStudio()) {\n video.style.objectFit = 'cover';\n video.style.width = '100%';\n video.style.height = '100%';\n }\n }\n\n sendSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer);\n }\n\n private get resizeValues(): Area {\n if (!this.isStudio()) {\n return this.getResizeValuesUniversal();\n }\n\n return this.getResizeValues();\n }\n\n /**\n * This method calculates the dimensions for resizing a layout in a configurator stream.\n * It takes into account the pixel ratio of the device's screen and the orientation of the layout.\n * The method uses the `fitIntoRectangle` function to calculate the dimensions that would allow the layout to fit into the maximum space while maintaining its aspect ratio.\n * It also sets the maximum limits for the width and height based on the layout's orientation.\n * If the scale of the fitted dimensions is less than 1, it assigns the fitted dimensions to the output. Otherwise, it sets the scale of the output to 1.\n * @returns {Area} An object of type `Area` that contains the calculated dimensions for resizing the layout.\n */\n private getResizeValuesUniversal(): Area {\n const pR = this.pixelRatio;\n let containerW = window.innerWidth || 1;\n let containerH = window.innerHeight || 1;\n\n if (this.useContainerAsSizeProvider()) {\n containerW = this.container?.nativeElement.offsetWidth || 1;\n containerH = this.container?.nativeElement.offsetHeight || 1;\n }\n\n const maxSpace = { w: containerW * pR, h: containerH * pR };\n\n const isVertical = containerW < containerH;\n let maxH = FULL_HD_HEIGHT;\n let maxW = FULL_HD_WIDTH;\n\n const params = new URLSearchParams(location.search);\n const maxRes = params.get('maxresolution');\n\n if (Truthy(maxRes)) {\n maxH = FULL_HD_HEIGHT * 2;\n maxW = FULL_HD_WIDTH * 2;\n }\n\n const maxLimits = isVertical\n ? { w: maxH, h: maxW, x: 0, y: 0 }\n : { w: maxW, h: maxH, x: 0, y: 0 };\n\n const props = fitIntoRectangle(\n { x: 0, y: 0, w: containerW, h: containerH },\n { x: 0, y: 0, ...maxSpace },\n );\n\n let out = { ...props };\n\n const fitIntoMax = fitIntoRectangle(props, maxLimits);\n if (fitIntoMax.scale < 1) {\n // If reducing size to 1920x1080 is required, do it\n out = fitIntoMax;\n } else {\n // Otherwise, use the lowest resolution, because layout size is smaller than 1920x1080\n out.scale = 1;\n }\n\n return { ...out };\n }\n\n private getResizeValues(): Area {\n const pR = this.pixelRatio;\n const containerW = pR * (this.container?.nativeElement.offsetWidth || 1);\n const containerH = pR * (this.container?.nativeElement.offsetHeight || 1);\n const maxSpace = { w: containerW, h: containerH };\n\n const videoSizePixelPerfect = fitIntoRectangle(\n { x: 0, y: 0, w: this.width, h: this.height },\n { x: 0, y: 0, ...maxSpace },\n );\n\n return fitIntoRectangle(videoSizePixelPerfect, {\n x: 0,\n y: 0,\n w: Math.min(containerW, FULL_HD_WIDTH),\n h: Math.min(containerH, FULL_HD_HEIGHT),\n });\n }\n\n private sendResize(size: Size) {\n this.commandsSender.sendCommandToUnreal(\n getChangeResolutionCommand({\n resolution: {\n x: size.w,\n y: size.h,\n },\n }),\n );\n }\n\n private get pixelRatio() {\n return window.devicePixelRatio;\n }\n}\n","<div class=\"frame unreal-container\">\n <div #container [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\n\n <app-unreal-status />\n <app-freeze-frame />\n <app-clickable-overlay />\n <app-afk-restart-screen-locker />\n\n <ng-content select=\"app-video-locker\"></ng-content>\n <ng-content select=\"app-pdf\"></ng-content>\n <ng-content select=\"app-show-case\"></ng-content>\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\n</div>\n","import type { AfterViewInit, ElementRef, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n ViewChild,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AsyncPipe, NgOptimizedImage } from '@angular/common';\nimport { Truthy } from '@3dsource/utils';\nimport { filter } from 'rxjs/operators';\nimport { combineLatest, first, map } from 'rxjs';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { resetIntroSrc } from '../../store/unreal.actions';\n\n@Component({\n selector: 'app-video-locker',\n templateUrl: './video-locker.component.html',\n styleUrl: './video-locker.component.scss',\n imports: [AsyncPipe, NgOptimizedImage],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VideoLockerComponent implements AfterViewInit, OnInit {\n @ViewChild('videoPlayerCover', { static: false })\n videoElement!: ElementRef<HTMLDivElement>;\n private store = inject(Store);\n private destroyRef = inject(DestroyRef);\n protected videoIntroSrc$ = this.store.select(\n unrealFeature.selectVideoIntroSrc,\n );\n protected imageIntroSrc$ = this.store\n .select(unrealFeature.selectImageIntroSrc)\n .pipe(\n // eslint-disable-next-line @ngrx/avoid-mapping-selectors\n map((src) => {\n // TODO need for demos site and need to delete this and move to demos\n if (!src) {\n return null;\n }\n const matchAbsolutePath = !!src.match(\n /.*\\.(png|avif|jpg|webp|svg)(\\?.*)?$/i,\n );\n if (matchAbsolutePath) {\n return src;\n }\n return src;\n }),\n );\n\n ngOnInit() {\n combineLatest([\n this.store.select(unrealFeature.selectViewportReady),\n this.videoIntroSrc$,\n this.imageIntroSrc$,\n ])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(\n ([viewportReady, videoSrc, imageSrc]) =>\n viewportReady && (!!videoSrc || !!imageSrc),\n ),\n first(),\n )\n .subscribe(() => this.store.dispatch(resetIntroSrc()));\n }\n\n ngAfterViewInit() {\n this.videoIntroSrc$\n .pipe(filter(Truthy), takeUntilDestroyed(this.destroyRef))\n .subscribe((src) => this.createVideo(src));\n }\n\n private createVideo(src: string) {\n // Select the parent layout where the video will be inserted\n const videoContainer = this.videoElement.nativeElement;\n videoContainer.innerHTML = ''; // This will remove all existing content within the layout\n // Create the video element\n const videoElement = document.createElement('video');\n videoElement.autoplay = true;\n videoElement.muted = true;\n videoElement.loop = true;\n videoElement.poster = `${src}/cover.webp`;\n\n videoElement.style.position = 'absolute';\n videoElement.style.width = '100%';\n videoElement.style.height = '100%';\n videoElement.style.objectFit = 'cover';\n\n const sourceElement = document.createElement('source');\n sourceElement.src = `${src}/video.mp4`;\n sourceElement.type = 'video/mp4';\n\n // Append the source element to the video element\n videoElement.appendChild(sourceElement);\n\n // Handle browser fallback text\n videoElement.innerHTML += 'Browser not supported';\n\n // Append the video element to the layout\n videoContainer.appendChild(videoElement);\n }\n}\n","@if (imageIntroSrc$ | async; as url) {\n <div class=\"backImage\">\n <img [ngSrc]=\"url\" fill alt=\"Loading...\" />\n </div>\n} @else if (videoIntroSrc$ | async) {\n <div #videoPlayerCover class=\"backVideo\"></div>\n}\n","import { provideState } from '@ngrx/store';\nimport { provideEffects } from '@ngrx/effects';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { UnrealEffects } from '../store/unreal.effects';\nimport { AFKService } from '../services/afk.service';\nimport { AggregatorService } from '../services/aggregator.service';\nimport { CommandTelemetryService } from '../services/command-telemetry.service';\nimport { ConsoleExtensionsService } from '../services/console-extensions.service';\nimport { FreezeFrameService } from '../services/freeze-frame.service';\nimport { InputService } from '../services/input.service';\nimport { SignallingService } from '../services/signalling.service';\nimport { StreamStatusTelemetryService } from '../services/stream-status-telemetry.service';\nimport { UnrealCommunicatorService } from '../services/unreal-communicator.service';\nimport { VideoService } from '../services/video.service';\nimport { VideoStreamStatusService } from '../services/video-stream-status.service';\nimport { WebRtcPlayerService } from '../services/web-rtc-player.service';\nimport { ImageCaptureService } from '../services/image-capture.service';\nimport { RegionsPingService } from '../services/regions-ping.service';\n\nconst UNREAL_SERVICES = [\n AFKService,\n AggregatorService,\n CommandTelemetryService,\n ConsoleExtensionsService,\n FreezeFrameService,\n InputService,\n SignallingService,\n StreamStatusTelemetryService,\n UnrealCommunicatorService,\n VideoService,\n VideoStreamStatusService,\n WebRtcPlayerService,\n ImageCaptureService,\n RegionsPingService,\n];\n\nexport const UNREAL_PROVIDERS = [\n provideState(unrealFeature),\n provideEffects([UnrealEffects]),\n UNREAL_SERVICES,\n];\n","export const MixPanelEvents = {\n pixelstreaming_end: 'pixelstreaming_end',\n pixelstreaming_start: 'pixelstreaming_start',\n render_request: 'render_request',\n custom_click: 'custom_click',\n route_change: 'route_change',\n} as const;\n\nexport type MixPanelEventsValues =\n (typeof MixPanelEvents)[keyof typeof MixPanelEvents];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["initialState","map","switchMap","takeUntil","tap","distinctUntilChanged","concatMap","timeout","skip","take","debounceTime","first"],"mappings":"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"}
|