{"version":3,"file":"3dsource-angular-unreal-module.mjs","sources":["../../../../projects/3dsource/angular-unreal-module/src/lib/constants/buttons-codes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/control-scheme.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/message-type.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/to-client-message-types.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/initial-config.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/input-options.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/unreal.constant.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/commands/commands.actions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal/unreal.actions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/CustomCloseCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/disconnect-reasons.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/SignalingMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal/unreal.reducer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal/unreal.feature.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/AnswerHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/ConfigHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/IceCandidateHandler.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/helpers/FromStreamerHandlers/PlayerCountHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/SSInfoHandler.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/WsHandlers/OpenHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/keep-max-until-reset.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/data-decoder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/data-flow-monitor.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/dispatch-resize.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/error-codes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/float-to-smooth-percents.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/get-image-from-video-stream.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/get-next-url.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/KalmanFilter1D.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/latency-timings.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/qp-to-quality.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resize-observer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/make-even.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/get-resize-values.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/get-resize-values-OLD.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/commands/commands.reducer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/commands/commands.feature.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/commands/commands.selectors.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal/unreal.selectors.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-error-modal/unreal-error-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-error-modal/unreal-error-modal.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/low-bandwidth-indicator/DataFlowConstants.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal/unreal.effects.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/commands/commands.effects.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/sub.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/afk.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/freeze-frame.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/command-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/StreamerListHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/OfferHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/http-to-ws-url.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/create-websocket.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/ForceDisconnect.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/FromStreamerHandlers/OrchestrationErrorHandler.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/signalling.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/web-rtc-player.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/deepEqual.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/file-receiver.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/aggregator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/console-extensions.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/dev-mode.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/unreal-communicator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/input.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/regions-ping.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/stream-status-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/stream-status-telemetry2.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/ReceivedMimeTypes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/file-handler.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/analytics.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/fps-monitor.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/unreal-callback.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/afk-timeout-modal/afk-timeout-modal.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/afk-timeout-modal/afk-timeout-modal.component.html","../../../../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/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/components/image-loading-src/image-loading-src.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/image-loading-src/image-loading-src.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/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/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/resume-stream-button/resume-stream-button.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/resume-stream-button/resume-stream-button.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/intro-src/intro-src.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/intro-src/intro-src.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/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/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/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/providers/index.ts","../../../../projects/3dsource/angular-unreal-module/src/3dsource-angular-unreal-module.ts"],"sourcesContent":["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","export const ControlScheme = {\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  // 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 ControlSchemeValues =\n  (typeof ControlScheme)[keyof typeof ControlScheme];\n","// Must be kept in sync with PixelStreamingProtocol::EToUE4Msg C++ descriptors.\nexport const MessageType = {\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 MessageTypeValues = (typeof MessageType)[keyof typeof MessageType];\n","export const ToClientMessage = {\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  FileExtension: 8,\n  FileMimeType: 9,\n  FileContents: 10,\n  TestEcho: 11,\n  InputControlOwnership: 12,\n  GamepadResponse: 13,\n  Protocol: 255,\n} as const;\n","import { InjectionToken } from '@angular/core';\nimport type { UnrealInitialConfig } from '../interfaces';\n\nexport const UNREAL_CONFIG = new InjectionToken<UnrealInitialConfig>(\n  'Unreal Initial Configuration',\n);\n","import { ControlScheme } from './control-scheme';\nimport type { InputProps } from '../interfaces';\n\nexport const InputOptions: InputProps = {\n  controlScheme: ControlScheme.Default,\n  suppressBrowserKeys: true,\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 POLLING_TIME = 4000;\nexport const WS_OPEN_STATE = 1;\nexport const DEFAULT_AFK_TIMEOUT_PERIOD = 15;\nexport const DEFAULT_AFK_TIMEOUT = 120;\nexport const DATA_CHANNEL_CONNECTION_TIMEOUT = 8000; //ms;\nexport const SIGNALLING_PERCENT_VALUE = 56;\nexport const SCREEN_LOCKER_CONTAINER_ID = '3dsource_start_screen';\n\n// Reconnection defaults\nexport const DEFAULT_RECONNECT_ENABLED = true;\nexport const DEFAULT_RECONNECT_MAX_ATTEMPTS = 3;\nexport const DEFAULT_RECONNECT_DELAY_MS = 1000;\nexport const DEFAULT_RECONNECT_ON_ICE_FAILURE = true;\nexport const DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE = true;\n\nexport const UnrealStatusMessage = {\n  CONNECTING_TO_SESSION: 'Connecting to session.',\n  STARTING_YOUR_SESSION: 'Starting your session',\n} as const;\n","import { createAction, props } from '@ngrx/store';\nimport type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\n\nconst scoped = (templateString: TemplateStringsArray) =>\n  `[UNREAL COMMANDS] ${templateString[0]}`;\n\n/**\n * Raw JSON from Unreal can either be wrapped in `commandCallback`\n * (e.g. `{ commandCallback: { command: '...', correlationId: '...' } }`)\n * or be a direct command/event object (e.g. `{ command: 'cameraChanged', payload: {...} }`).\n */\nexport interface UnrealCallbackJsonWrapped {\n  commandCallback: MetaBoxCommandPacket;\n  timeStamp?: unknown;\n}\n\nexport type UnrealCallbackJson =\n  | UnrealCallbackJsonWrapped\n  | MetaBoxCommandPacket;\n\nexport const unrealCommandCallback = createAction(\n  scoped`unreal command callback`,\n  props<{ json: UnrealCallbackJson }>(),\n);\nexport const commandStarted = createAction(\n  scoped`command started`,\n  props<{ id: string; command: string }>(),\n);\nexport const commandCompleted = createAction(\n  scoped`command completed`,\n  props<{ id: string }>(),\n);\n","import { createAction, props } from '@ngrx/store';\nimport type {\n  DisconnectReasonType,\n  LBMStats,\n  SignalingData,\n  StreamConfig,\n  StreamRequestContext,\n} from '../../interfaces';\nimport type { FilterSettings } from '../../components/low-bandwidth-indicator/DataFlowConstants';\n\nconst scoped = (templateString: TemplateStringsArray) =>\n  `[UNREAL] ${templateString[0]}`;\nexport const trackMixpanelEvent = createAction(\n  scoped`track mixpanel event`,\n  props<{ event: string; data?: unknown }>(),\n);\nexport const trackTelemetryData = createAction(\n  scoped`track telemetry data`,\n  props<{ event: string; data?: unknown }>(),\n);\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<{ reason: DisconnectReasonType }>(),\n);\nexport const destroyUnrealScene = createAction(scoped`destroyUnrealScene`);\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<{ statusMessage: 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 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);\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);\n/**\n * @deprecated Use `dataChannelReady` instead. Currently, this action is not working.\n */\nexport const setDataChannelConnected = createAction(\n  scoped`set data channel connected`,\n  props<{ statusMessage: string }>(),\n);\nexport const dataChannelConnected = createAction(\n  scoped`data channel connected`,\n  props<{ statusMessage: string }>(),\n);\nexport const dataChannelReady = createAction(scoped`dataChannelReady`);\nexport const setConfig = createAction(\n  scoped`set config`,\n  props<{ config: Partial<StreamConfig> }>(),\n);\nexport const disconnectStream = createAction(\n  scoped`disconnectStream`,\n  props<{\n    reason: DisconnectReasonType;\n    message: string;\n  }>(),\n);\nexport const dropConnection = createAction(scoped`dropConnection`);\nexport const setViewportReady = createAction(scoped`set viewport ready`);\nexport const setViewportNotReady = createAction(scoped`set viewport not ready`);\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 setOrchestrationParameters = createAction(\n  scoped`set orchestration parameters`,\n  props<{ instanceName: string; streamRequestId: string; eta: number }>(),\n);\n/**\n * Dispatched when the orchestration server signals that the reserved\n * instance is ready to serve the stream (`instanceReady` WS message).\n * Emitted for observability only — no reducer state change.\n */\nexport const instanceReady = createAction(scoped`instance ready`);\n/**\n * Dispatched when `RegionsPingService.getFastest()` begins — right\n * before the region-list HTTP request goes out. Bookends the entire\n * region-discovery flow together with {@link regionResolved}.\n * Observability-only — no state change.\n */\nexport const regionPingFetchStart = createAction(\n  scoped`region ping fetch start`,\n);\n/**\n * Dispatched once `RegionsPingService.getProviders()` returns the region\n * list — i.e. the fetch step is done and the actual per-region ping\n * sweep is about to start. Splits the region-discovery waterfall into\n * two legs: config fetch vs ping sweep. Observability-only.\n */\nexport const regionPingFetchEnd = createAction(scoped`region ping fetch end`);\n/**\n * Dispatched once the closest region has been resolved by the\n * regions-ping service. Carries every sampled ping RTT to the winning\n * region (one entry per probe — `checkLatency` issues `ping_count`\n * sequential pings per region) so consumers can inspect variance /\n * jitter, not just the mean. Observability-only — no state change.\n */\nexport const regionResolved = createAction(\n  scoped`region resolved`,\n  props<{\n    region: string;\n    pingsMs: number[];\n  }>(),\n);\n/**\n * Dispatched around the HTTP polling roundtrip inside `getAwsInstance`\n * (old orchestration flow). Only fires when polling is actually used\n * (i.e. signaling URL is not a direct `ws://` / `wss://` endpoint).\n * Observability-only — no state change.\n */\nexport const pollingStarted = createAction(scoped`polling started`);\nexport const pollingEnded = createAction(scoped`polling ended`);\n/**\n * Dispatched when the client has just sent an SDP answer back to Cirrus\n * after receiving the server-initiated offer. Observability-only.\n */\nexport const answerSent = createAction(scoped`answer sent`);\nexport const setOrchestrationMessage = createAction(\n  scoped`set orchestration message`,\n  props<{ message: string }>(),\n);\nexport const setOrchestrationProgress = createAction(\n  scoped`set orchestration progress`,\n  props<{ progressComplete: number }>(),\n);\nexport const setOrchestrationContext = createAction(\n  scoped`set orchestration params`,\n  props<{\n    urls: string[];\n    environmentId: string;\n    streamRequestContext: StreamRequestContext;\n  }>(),\n);\nexport const updateCirrusInfo = createAction(\n  scoped`set unrealInfo`,\n  props<{\n    ssInfo: string;\n    ssData: SignalingData;\n  }>(),\n);\nexport const setLoopBackCommandIsCompleted = createAction(\n  scoped`set loopBack command is completed`,\n);\nexport const setAfkTimerVisible = createAction(scoped`set afk timer visible`);\nexport const setAfkTimerHide = createAction(scoped`set afk timer hide`);\nexport const setAfkTimerCountdown = createAction(\n  scoped`set afk timer count down`,\n  props<{ countdown: number }>(),\n);\nexport const showUnrealErrorMessage = createAction(\n  scoped`show unreal error message`,\n  props<{ code: number | null; error?: string }>(),\n);\nexport const initSignalling = createAction(\n  scoped`init signalling`,\n  (\n    data: { resetDisconnectionReason: boolean } = {\n      resetDisconnectionReason: true,\n    },\n  ) => ({\n    resetDisconnectionReason: data.resetDisconnectionReason,\n  }),\n);\nexport const startStream = createAction(\n  scoped`startStream`,\n  props<{ config: Partial<StreamConfig> }>(),\n);\nexport const resetConfig = createAction(scoped`reset config`);\nexport const resetAfk = createAction(scoped`reset afk action`);\nexport const resetWarnTimeout = createAction(scoped`reset config warn timeout`);\nexport const abortEstablishingConnection = createAction(\n  scoped`abortEstablishingConnection`,\n);\nexport const setUnrealPlaywrightConfig = createAction(\n  scoped`set unreal playwright config`,\n);\nexport const saveAnalyticsEvent = createAction(\n  scoped`save analytics event`,\n  props<{ event: { name: string; params: Record<string, unknown> } }>(),\n);\n/** Action to trigger WebRTC peer reconnection (keeps signaling connection) */\nexport const reconnectPeer = createAction(\n  scoped`reconnect peer`,\n  props<{ attempt: number; maxAttempts: number; delay?: number }>(),\n);\n/** Action to reset the data channel state before reconnection */\nexport const resetDataChannelForReconnect = createAction(\n  scoped`reset data channel for reconnect`,\n);\n/** Action dispatched when peer reconnection succeeds */\nexport const reconnectPeerSuccess = createAction(\n  scoped`reconnect peer success`,\n);\n/** Action dispatched when all peer reconnection attempts are exhausted */\nexport const reconnectPeerFailed = createAction(\n  scoped`reconnect peer failed`,\n  props<{ reason: string }>(),\n);\n/** Action dispatched when ICE connection state changes to failed/disconnected */\nexport const iceConnectionFailed = createAction(\n  scoped`ice connection failed`,\n  props<{ state: RTCIceConnectionState }>(),\n);\nexport const forceResizeViewport = createAction(scoped`force resize viewport`);\nexport const videoAdaptedToContainer = createAction(\n  scoped`video adapted to container`,\n);\nexport const videoStreamInitialized = createAction(\n  scoped`video stream initialized`,\n);\nexport const setKalmanSettings = createAction(\n  scoped`set kalman settings`,\n  props<{ settings: FilterSettings }>(),\n);\nexport const dropDC = createAction(scoped`drop data channel`);\nexport const dropPC = createAction(scoped`drop peer connection`);\n","export const WSCloseCode_NORMAL_CLOSURE = 3000;\nexport const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;\nexport const WSCloseCode_NORMAL_MANUAL_DISCONNECT = 3002;\nexport const WSCloseCode_FORCE_CIRRUS_CLOSE = 3003;\n\nexport const WSCloseCode_UNKNOWN = 1000;\n\nexport const WSCloseCode_CIRRUS_PLAYER_DISCONNECTED = 1001;\nexport const WSCloseCode_CIRRUS_ABNORMAL_CLOSURE = 1006;\nexport const WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR = 1013;\nexport const WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER = 1011;\n\nexport const WSCloseCodes = [\n  WSCloseCode_NORMAL_CLOSURE,\n  WSCloseCode_NORMAL_AFK_TIMEOUT,\n  WSCloseCode_NORMAL_MANUAL_DISCONNECT,\n  WSCloseCode_FORCE_CIRRUS_CLOSE,\n  WSCloseCode_UNKNOWN,\n  WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n  WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n  WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n  WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n] as const;\n\nexport type WSCloseCodesValues = (typeof WSCloseCodes)[number];\n","export const DisconnectReason = {\n  Afk: 'Afk',\n  None: 'None',\n  Destroy: 'Destroy',\n  DataChannelClosed: 'DataChannelClosed',\n  DataChannelTimeout: 'DataChannelTimeout',\n  WebRTCError: 'WebRTCError',\n  WebSocketError: 'WebSocketError',\n  WebSocketClose: 'WebSocketClose',\n  DropConnection: 'DropConnection',\n  OrchestrationPlayerDisconnected: 'OrchestrationPlayerDisconnected',\n  OrchestrationStreamerDisconnected: 'OrchestrationStreamerDisconnected',\n  IceConnectionFailed: 'IceConnectionFailed',\n  ReconnectFailed: 'ReconnectFailed',\n  NewConnectionAttempt: 'NewConnectionAttempt',\n  AbortEstablishingConnection: 'AbortEstablishingConnection',\n} as const;\n\nexport type DisconnectReasonType =\n  (typeof DisconnectReason)[keyof typeof DisconnectReason];\n\nexport interface ConnectionError {\n  reason: DisconnectReasonType;\n  message: string;\n}\n","/*\nexport interface RequestReservation extends InstanceMessageBase {\n  type: 'requestReservation';\n}\n*/\n\nimport type { SignalingData } from './SignalingData';\n\nexport const OrchestrationMessageTypes = {\n  ping: 'ping',\n  error: 'error',\n  offer: 'offer',\n  answer: 'answer',\n  ssInfo: 'ssInfo',\n  config: 'config',\n  playerCount: 'playerCount',\n  iceCandidate: 'iceCandidate',\n  streamerList: 'streamerList',\n  requestStream: 'requestStream',\n  listStreamers: 'listStreamers',\n  instanceReady: 'instanceReady',\n  p2pEstablished: 'p2pEstablished',\n  instanceReserved: 'instanceReserved',\n  playerDisconnected: 'playerDisconnected',\n  streamPreparedForUserInteraction: 'streamPreparedForUserInteraction',\n  streamerDisconnected: 'streamerDisconnected',\n  interruptClientStream: 'interruptClientStream',\n} as const;\n\nexport interface InstanceReady extends InstanceMessageBase {\n  type: 'instanceReady';\n}\n\nexport interface InstanceReserved extends InstanceMessageBase {\n  type: 'instanceReserved';\n}\n\nexport interface OrchestrationErrorMessage {\n  type: 'error';\n  payload: { code: number; message: string };\n}\n\ninterface InstanceMessageBase extends MessageBase {\n  correlationId: string;\n  payload: {\n    instanceId: string;\n    streamRequestId: string;\n    eta: number;\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}\nexport interface StreamerListMessage extends MessageBase {\n  type: 'streamerList';\n  ids: string[];\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 interface InterruptClientStream extends MessageBase {\n  type: 'interruptClientStream';\n  correlationId: string;\n  payload: {\n    environmentId: string;\n  };\n}\n\nexport interface ForceClientDisconnect extends MessageBase {\n  type: 'streamerDisconnected' | 'playerDisconnected';\n  connectionId: string;\n}\n\nexport interface ListStreamersMessage extends MessageBase {\n  type: 'listStreamers';\n  correlationId: string;\n}\n\nexport interface P2PEstablishedMessage extends MessageBase {\n  type: 'p2pEstablished';\n  source: string;\n  sessionId: string;\n}\n\nexport interface streamPreparedForUserInteractionMessage extends MessageBase {\n  type: 'streamPreparedForUserInteraction';\n  correlationId: string;\n}\n\nexport interface RequestStream extends MessageBase {\n  type: 'requestStream';\n  correlationId: string;\n  payload: {\n    environmentId: string;\n    region?: string;\n    /**\n     * The context field is used for plugins of the external\n     * applications for collecting additional statistics, etc.\n     */\n    context: StreamRequestContext;\n  };\n}\n\ninterface MetaboxBasicConfiguratorContext {\n  id: 'metaboxBasicConfigurator';\n  data: {\n    configuratorId: string; //uuid here;\n  };\n}\n\ninterface MetaboxModularConfiguratorContext {\n  id: 'metaboxModularConfigurator';\n  data: {\n    configuratorId: string; //uuid here;\n  };\n}\n\ninterface MetaboxProductContext {\n  id: 'metaboxProduct';\n  data: {\n    productId: string; //uuid here;\n  };\n}\n\ninterface MetaboxEnvironmentContext {\n  id: 'metaboxEnvironment';\n  data: {\n    environmentId: string; //uuid here;\n  };\n}\ninterface MetaboxStudioContext {\n  id: 'metaboxStudio';\n  data: {\n    userId: string; //uuid here;\n    workspaceId: string; //uuid here;\n  };\n}\ninterface CustomApplicationContext {\n  id: 'customApplication';\n  data: {\n    clientId: string;\n    applicationId: string;\n  };\n}\n\nexport type StreamRequestContext =\n  | MetaboxStudioContext\n  | MetaboxProductContext\n  | CustomApplicationContext\n  | MetaboxEnvironmentContext\n  | MetaboxBasicConfiguratorContext\n  | MetaboxModularConfiguratorContext;\n\nexport interface SignalingMessageMap {\n  [OrchestrationMessageTypes.ping]: PingMessage;\n  [OrchestrationMessageTypes.offer]: RTCSessionDescriptionInit;\n  [OrchestrationMessageTypes.error]: OrchestrationErrorMessage;\n  [OrchestrationMessageTypes.ssInfo]: SSInfo;\n  [OrchestrationMessageTypes.config]: ConfigMessage;\n  [OrchestrationMessageTypes.answer]: RTCSessionDescriptionInit;\n  [OrchestrationMessageTypes.playerCount]: PlayerCountMessage;\n  [OrchestrationMessageTypes.iceCandidate]: CandidateMessage;\n  [OrchestrationMessageTypes.streamerList]: StreamerListMessage;\n  [OrchestrationMessageTypes.instanceReady]: InstanceReady;\n  [OrchestrationMessageTypes.requestStream]: RequestStream;\n  [OrchestrationMessageTypes.listStreamers]: ListStreamersMessage;\n  [OrchestrationMessageTypes.p2pEstablished]: P2PEstablishedMessage;\n  [OrchestrationMessageTypes.instanceReserved]: InstanceReserved;\n  [OrchestrationMessageTypes.playerDisconnected]: ForceClientDisconnect;\n  [OrchestrationMessageTypes.streamPreparedForUserInteraction]: streamPreparedForUserInteractionMessage;\n  [OrchestrationMessageTypes.streamerDisconnected]: ForceClientDisconnect;\n  [OrchestrationMessageTypes.interruptClientStream]: InterruptClientStream;\n}\n\nexport type OrchestrationMessageType = keyof SignalingMessageMap;\n\n// New strict outbound union type (only valid signaling messages allowed)\nexport type AnySignalingMessage =\n  | SignalingMessageMap[OrchestrationMessageType]\n  | string;\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 {\n  changeLowBandwidth,\n  changeStatusMainVideoOnScene,\n  changeStreamResolutionSuccessAction,\n  dataChannelConnected,\n  destroyRemoteConnections,\n  destroyUnrealScene,\n  disconnectStream,\n  dropConnection,\n  initSignalling,\n  reconnectPeerSuccess,\n  resetConfig,\n  resetDataChannelForReconnect,\n  resetIntroSrc,\n  resetWarnTimeout,\n  saveAnalyticsEvent,\n  setAfkTimerCountdown,\n  setAfkTimerHide,\n  setAfkTimerVisible,\n  setAwsInstance,\n  setCirrusConnected,\n  setCirrusDisconnected,\n  setConfig,\n  setEstablishingConnection,\n  setFreezeFrame,\n  setFreezeFrameFromVideo,\n  setIntroImageSrc,\n  setIntroVideoSrc,\n  setLoadingImageSrc,\n  setLoopBackCommandIsCompleted,\n  setOrchestrationContext,\n  setOrchestrationMessage,\n  setOrchestrationParameters,\n  setOrchestrationProgress,\n  setSignalingName,\n  setStatusMessage,\n  setStatusPercentSignallingServer,\n  setStreamClientCompanyId,\n  setStreamViewId,\n  setUnrealPlaywrightConfig,\n  setViewportNotReady,\n  setViewportReady,\n  startStream,\n  updateCirrusInfo,\n} from './unreal.actions';\nimport { createReducer, on } from '@ngrx/store';\nimport type {\n  AwsInstance,\n  ConnectionError,\n  DisconnectReasonType,\n  FreezeFrameMessage,\n  LBMStats,\n  SignalingData,\n  StreamConfig,\n  StreamRequestContext,\n  StreamResolutionProps,\n} from '../../interfaces';\nimport { DisconnectReason } from '../../interfaces';\nimport { DEFAULT_AFK_TIMEOUT } from '../../constants';\n\nexport interface UnrealState {\n  lowBandwidthStats: LBMStats | undefined;\n  streamConfig: StreamConfig;\n  awsInstance: AwsInstance;\n  lowBandwidth: boolean;\n  isFirstSuccessLoad: boolean;\n  isAfkTimerVisible: boolean;\n  afkCountdown: number;\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: ConnectionError | null;\n  isReconnecting: boolean;\n  dataChannelConnected: boolean;\n  streamResolution: StreamResolutionProps;\n  isVideoPlaying: boolean;\n  establishingConnection: boolean;\n  disconnectReason: DisconnectReasonType;\n  matchUrls: string[];\n  environmentId: string | null;\n  streamClientCompanyId: string | null;\n  streamViewId: string | null;\n  videoIntroSrc: string | null;\n  imageIntroSrc: string | null;\n  imageLoadingSrc: string;\n  streamRequestContext: StreamRequestContext | null;\n  analyticsEvent: { name: string; params: Record<string, unknown> } | null;\n}\n\nconst initialState: UnrealState = {\n  streamRequestContext: null,\n  environmentId: null,\n  lowBandwidthStats: undefined,\n  isFirstSuccessLoad: false,\n  isAfkTimerVisible: false,\n  afkCountdown: 0,\n  lowBandwidth: false,\n  cirrusConnected: false,\n  establishingConnection: false,\n  isReconnecting: false,\n  viewportReady: false,\n  dataChannelConnected: false,\n  isVideoPlaying: false,\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    progressComplete: 0,\n  },\n  streamConfig: {\n    autoStart: true,\n    warnTimeout: DEFAULT_AFK_TIMEOUT,\n  },\n  matchUrls: [],\n  streamClientCompanyId: '',\n  streamViewId: 'default',\n  videoIntroSrc: null,\n  imageIntroSrc: null,\n  imageLoadingSrc: '',\n  analyticsEvent: null,\n};\nexport const unrealReducer = createReducer(\n  initialState,\n  on(\n    changeLowBandwidth,\n    (state, { lowBandwidth, stats }): UnrealState => ({\n      ...state,\n      lowBandwidth: lowBandwidth,\n      lowBandwidthStats: lowBandwidth ? stats : undefined,\n    }),\n  ),\n  on(changeStatusMainVideoOnScene, (state, { isVideoPlaying }): UnrealState => {\n    return { ...state, isVideoPlaying: isVideoPlaying };\n  }),\n  on(\n    setAwsInstance,\n    (state, { instanceName, wsUrl, pollingUrl }): UnrealState => {\n      return { ...state, awsInstance: { instanceName, wsUrl, pollingUrl } };\n    },\n  ),\n  on(setViewportReady, (state): UnrealState => {\n    return {\n      ...state,\n      viewportReady: true,\n      statusMessage: null,\n      errorMessage: null,\n    };\n  }),\n  on(setViewportNotReady, (state): UnrealState => {\n    return { ...state, viewportReady: false };\n  }),\n  on(updateCirrusInfo, (state, { ssInfo, ssData }): UnrealState => {\n    return {\n      ...state,\n      ssInfo: ssInfo, // For back compatibility\n      ssData: ssData, // Contains all the data from the ssInfo as an object\n    };\n  }),\n  on(\n    changeStreamResolutionSuccessAction,\n    (state, { width, height }): UnrealState => {\n      return { ...state, streamResolution: { width: width, height: height } };\n    },\n  ),\n  on(setFreezeFrame, (state, freezeFrame): UnrealState => {\n    return {\n      ...state,\n      freezeFrame: {\n        dataUrl:\n          freezeFrame.progress === 0 ||\n          freezeFrame.progress === 1 ||\n          freezeFrame.progress === null\n            ? freezeFrame.dataUrl\n            : state.freezeFrame.dataUrl,\n        progress: freezeFrame.progress || null,\n      },\n    };\n  }),\n  on(disconnectStream, (state, errorMessage): UnrealState => {\n    if (\n      state.dataChannelConnected ||\n      state.disconnectReason === DisconnectReason.Destroy\n    ) {\n      return state;\n    }\n    return {\n      ...state,\n      errorMessage,\n      statusMessage: null,\n    };\n  }),\n  on(setFreezeFrameFromVideo, (state, freezeFrameFromVideo): UnrealState => {\n    return {\n      ...state,\n      freezeFrameFromVideo: {\n        dataUrl: freezeFrameFromVideo.dataUrl,\n        progress: freezeFrameFromVideo.progress || null,\n      },\n    };\n  }),\n  on(setStatusMessage, (state, { statusMessage }): UnrealState => {\n    return { ...state, statusMessage };\n  }),\n  on(setEstablishingConnection, (state, { value }): UnrealState => {\n    return { ...state, establishingConnection: value };\n  }),\n  on(setStatusPercentSignallingServer, (state, { percent }): UnrealState => {\n    return { ...state, statusPercentSignallingServer: percent };\n  }),\n  on(dataChannelConnected, (state, { statusMessage }): UnrealState => {\n    return {\n      ...state,\n      statusMessage,\n      dataChannelConnected: true,\n      establishingConnection: false,\n    };\n  }),\n  on(setConfig, startStream, (state, { config }): UnrealState => {\n    return { ...state, streamConfig: { ...state.streamConfig, ...config } };\n  }),\n  on(resetConfig, (state): UnrealState => {\n    return { ...state, streamConfig: initialState.streamConfig };\n  }),\n  on(resetWarnTimeout, (state): UnrealState => {\n    return {\n      ...state,\n      streamConfig: { ...state.streamConfig, warnTimeout: DEFAULT_AFK_TIMEOUT },\n    };\n  }),\n  on(\n    initSignalling,\n    (state, { resetDisconnectionReason = true }): UnrealState => {\n      return {\n        ...state,\n        disconnectReason: resetDisconnectionReason\n          ? DisconnectReason.None\n          : state.disconnectReason,\n      };\n    },\n  ),\n  on(destroyRemoteConnections, (state, { reason }): UnrealState => {\n    if (state.disconnectReason === DisconnectReason.Destroy) {\n      return state;\n    }\n    return { ...state, disconnectReason: reason };\n  }),\n  on(reconnectPeerSuccess, (state): UnrealState => {\n    return { ...state, isReconnecting: false };\n  }),\n  on(setSignalingName, (state, { instanceName }): UnrealState => {\n    return { ...state, awsInstance: { ...state.awsInstance, instanceName } };\n  }),\n  on(\n    setOrchestrationParameters,\n    (state, { instanceName, streamRequestId, eta }): UnrealState => {\n      return {\n        ...state,\n        awsInstance: {\n          ...state.awsInstance,\n          message: undefined,\n          instanceName,\n          streamRequestId,\n          eta,\n        },\n      };\n    },\n  ),\n  on(setOrchestrationProgress, (state, { progressComplete }): UnrealState => {\n    return {\n      ...state,\n      awsInstance: {\n        ...state.awsInstance,\n        progressComplete,\n      },\n    };\n  }),\n  on(setOrchestrationMessage, (state, { message }): UnrealState => {\n    return {\n      ...state,\n      awsInstance: {\n        ...state.awsInstance,\n        message,\n      },\n    };\n  }),\n  on(setLoopBackCommandIsCompleted, (state): UnrealState => {\n    return { ...state, isFirstSuccessLoad: true };\n  }),\n  on(setAfkTimerCountdown, (state, { countdown }): UnrealState => {\n    return { ...state, afkCountdown: countdown };\n  }),\n  on(setAfkTimerVisible, (state): UnrealState => {\n    return { ...state, isAfkTimerVisible: true };\n  }),\n  on(setAfkTimerHide, (state): UnrealState => {\n    return { ...state, isAfkTimerVisible: false, afkCountdown: 0 };\n  }),\n  on(\n    setOrchestrationContext,\n    (state, { urls, environmentId, streamRequestContext }): UnrealState => {\n      return {\n        ...state,\n        matchUrls: urls,\n        environmentId,\n        streamRequestContext,\n      };\n    },\n  ),\n  on(setStreamClientCompanyId, (state, { id }): UnrealState => {\n    return { ...state, streamClientCompanyId: id };\n  }),\n  on(setStreamViewId, (state, { id }): UnrealState => {\n    return { ...state, streamViewId: id };\n  }),\n  on(setIntroImageSrc, (state, { src }): UnrealState => {\n    return { ...state, imageIntroSrc: src };\n  }),\n  on(setLoadingImageSrc, (state, { src }): UnrealState => {\n    return { ...state, imageLoadingSrc: src };\n  }),\n  on(setIntroVideoSrc, (state, { src }): UnrealState => {\n    return { ...state, videoIntroSrc: src };\n  }),\n  on(resetIntroSrc, (state): UnrealState => {\n    return { ...state, imageIntroSrc: '', videoIntroSrc: '' };\n  }),\n  on(saveAnalyticsEvent, (state, { event }): UnrealState => {\n    return { ...state, analyticsEvent: event };\n  }),\n  on(setCirrusConnected, (state): UnrealState => {\n    return { ...state, cirrusConnected: true };\n  }),\n  on(setCirrusDisconnected, (state): UnrealState => {\n    return {\n      ...initialState,\n      establishingConnection: state.establishingConnection,\n      disconnectReason: state.disconnectReason,\n      isFirstSuccessLoad: state.isFirstSuccessLoad,\n      matchUrls: state.matchUrls,\n      streamClientCompanyId: state.streamClientCompanyId,\n      streamViewId: state.streamViewId,\n      imageIntroSrc: state.imageIntroSrc,\n      videoIntroSrc: state.videoIntroSrc,\n      imageLoadingSrc: state.imageLoadingSrc,\n      environmentId: state.environmentId,\n      streamRequestContext: state.streamRequestContext,\n      streamConfig: state.streamConfig,\n    };\n  }),\n  on(dropConnection, (state): UnrealState => {\n    return { ...state, establishingConnection: false };\n  }),\n  on(resetDataChannelForReconnect, (state): UnrealState => {\n    return {\n      ...state,\n      isReconnecting: true,\n      dataChannelConnected: false,\n      viewportReady: false,\n      statusMessage: 'Reconnecting...',\n    };\n  }),\n  on(setUnrealPlaywrightConfig, (state): UnrealState => {\n    return {\n      ...state,\n      cirrusConnected: true,\n      viewportReady: true,\n      dataChannelConnected: true,\n      isVideoPlaying: true,\n    };\n  }),\n  on(destroyUnrealScene, (): UnrealState => {\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 type { SignallingService } from '../../services';\n\nexport function AnswerHandler(\n  this: SignallingService,\n  msg: RTCSessionDescriptionInit,\n) {\n  this.onWebRtcAnswer$.next(msg);\n}\n","import type { SignallingService } from '../../services';\nimport type { ConfigMessage } from '../../interfaces';\n\nexport function ConfigHandler(this: SignallingService, msg: ConfigMessage) {\n  this.onConfig$.next(msg);\n\n  //DO NOT REMOVE. Possible required in future for SFU\n  /*this.send({\n    type: OrchestrationMessageTypes.listStreamers,\n    correlationId: this.correlationId,\n  });*/\n}\n","import type { SignallingService } from '../../services';\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';\nimport { instanceReady } from '../../store';\n\nexport function InstanceReadyHandler(this: SignallingService) {\n  // No state change — emit the action purely so services that want to\n  // observe orchestration progress (e.g. telemetry) have a hook.\n  this.store.dispatch(instanceReady());\n}\n","import type { InstanceReserved } from '../../interfaces';\nimport type { SignallingService } from '../../services';\nimport { setOrchestrationParameters } from '../../store';\n\nexport function InstanceReservedHandler(\n  this: SignallingService,\n  msg: InstanceReserved,\n) {\n  this.store.dispatch(\n    setOrchestrationParameters({\n      instanceName: msg.payload.instanceId,\n      streamRequestId: msg.payload.streamRequestId,\n      eta: msg.payload.eta ?? 150,\n    }),\n  );\n}\n","import type { SignallingService } from '../../services';\n\nexport function PingHandler(this: SignallingService) {\n  this.send(\n    JSON.stringify({\n      type: 'pong',\n      source: 'front',\n    }),\n  );\n}\n","import type { SignallingService } from '../..//services';\nimport type { PlayerCountMessage } from '../..//interfaces';\nimport { Logger } from '@3dsource/utils';\n\nexport function PlayerCountHandler(\n  this: SignallingService,\n  msg: PlayerCountMessage,\n) {\n  Logger.log(msg);\n}\n","import type { SignallingService } from '../../services';\nimport type { SSInfo } from '../../interfaces';\nimport { updateCirrusInfo } from '../../store';\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 { SignallingService } from '../../services';\nimport { dropConnection, setCirrusDisconnected } from '../../store';\nimport { Logger } from '@3dsource/utils';\nimport {\n  WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n  WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n  WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n  WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n  WSCloseCode_UNKNOWN,\n} from '../../interfaces';\n\nconst dropCodes = [\n  WSCloseCode_UNKNOWN,\n  WSCloseCode_CIRRUS_PLAYER_DISCONNECTED,\n  WSCloseCode_CIRRUS_ABNORMAL_CLOSURE,\n  WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER,\n  WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR,\n];\n\nexport function OnCloseHandler(this: SignallingService, e: CloseEvent) {\n  const message = `WebSocket closed: ${JSON.stringify(e.code)} - ${e.reason}`;\n  Logger.warn(message);\n  this.store.dispatch(setCirrusDisconnected());\n\n  if (dropCodes.includes(e.code)) {\n    this.store.dispatch(dropConnection());\n  }\n}\n","import type { SignallingService } from '../../services';\nimport { Logger } from '@3dsource/utils';\nimport { disconnectStream } from '../../store';\nimport { DisconnectReason } from '../../interfaces';\n\nexport function OnErrorHandler(this: SignallingService, e: Event) {\n  Logger.warn(`WS error: ${JSON.stringify(e)}`);\n\n  this.store.dispatch(\n    disconnectStream({\n      reason: DisconnectReason.WebSocketError,\n      message: 'WebSocket Error',\n    }),\n  );\n}\n","import type { SignallingService } from '../../services';\n\nexport function OnMessageHandler(\n  this: SignallingService,\n  e: MessageEvent<string | Blob>,\n) {\n  const handleData = (data: string) => {\n    //Logger.colored(...COLOR_CODES.FROM_SIGNALING, data);\n    const msg = JSON.parse(data);\n    this.handleMessage(msg);\n  };\n\n  if (typeof e.data === 'string') {\n    handleData(e.data);\n  } else if (e.data instanceof Blob) {\n    e.data.text().then(handleData);\n  }\n}\n","import type { SignallingService } from '../../services';\nimport { setCirrusConnected } from '../../store';\n\nexport function OnOpenHandler(this: SignallingService) {\n  this.store.dispatch(setCirrusConnected());\n  this.sendRequestStream();\n}\n","import type { Observable } from 'rxjs';\nimport { map, merge, scan } from 'rxjs';\n\ninterface ResetEvent {\n  readonly type: 'reset';\n}\ninterface ValueEvent {\n  readonly type: 'value';\n  readonly value: number;\n}\ntype Event = ResetEvent | ValueEvent;\n\n/**\n * Keeps the max of numbers seen so far; resets to 0 whenever `reset$` emits.\n * Emits `0` immediately on reset.\n */\nexport const keepMaxUntilReset = (\n  reset$: Observable<unknown>,\n): ((source: Observable<number>) => Observable<number>) => {\n  return (source$: Observable<number>) =>\n    merge(\n      source$.pipe(map((value): Event => ({ type: 'value', value }) as const)),\n      reset$.pipe(map((): Event => ({ type: 'reset' }) as const)),\n    ).pipe(\n      scan(\n        (max, evt) => (evt.type === 'reset' ? 0 : Math.max(max, evt.value)),\n        0,\n      ),\n    );\n};\n","export function decodeData(anyData: ArrayBuffer) {\n  try {\n    return new TextDecoder('utf-16').decode(anyData);\n  } catch {\n    return '';\n  }\n}\n","import type { Quality } from '../interfaces';\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","export const dispatchResize = () => {\n  window.dispatchEvent(new Event('resize'));\n};\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) {\n  if (code === null) {\n    return undefined;\n  }\n\n  return errorCodes[`code${code}`];\n}\n","import type { Observable } from 'rxjs';\nimport { animationFrameScheduler, concatMap, interval, of, scan } from 'rxjs';\nimport { distinctUntilChanged, map, takeWhile } from 'rxjs/operators';\nimport { clampf, lerp } from '@3dsource/utils';\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          previousTs: acc.currentTs,\n          currentTs:\n            typeof performance !== 'undefined' ? performance.now() : Date.now(),\n        }),\n        {\n          previous: 0,\n          current: 0,\n          previousTs: 0,\n          currentTs: 0,\n        } as {\n          previous: number;\n          current: number;\n          previousTs: number;\n          currentTs: number;\n        },\n      ),\n\n      concatMap(({ previous, current, previousTs, currentTs }) => {\n        // time delta in milliseconds\n        const dt = previousTs ? currentTs - previousTs : 0;\n        if (Math.abs(current - previous) > 0.95) {\n          // Assume that a 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\n        // Max 300ms duration for smooth transition\n        return smoothTransition(previous, current, Math.min(dt, 300));\n      }),\n\n      map((value) => clampf(0, 100, Math.round(value * 100))),\n    );\n};\n\n/**\n * Creates an observable that emits values transitioning smoothly from the start value to the end value over a specified duration.\n * The transition is performed using linear interpolation (lerp) and clamped to the range [0, 1].\n *\n * @param {number} start - The starting value of the transition.\n * @param {number} end - The ending value of the transition.\n * @param {number} duration - The duration of the transition in milliseconds.\n * @returns {Observable<number>} An observable that emits the interpolated values from start to end over the specified duration.\n */\nexport const smoothTransition = (\n  start: number,\n  end: number,\n  duration: number,\n): Observable<number> => {\n  const startTime = animationFrameScheduler.now();\n  return interval(0, animationFrameScheduler).pipe(\n    map(() => {\n      const elapsed = (animationFrameScheduler.now() - startTime) / duration;\n      return clampf(0, 1, elapsed);\n    }),\n    distinctUntilChanged(),\n    takeWhile((fraction) => fraction < 1, true),\n    map((fraction) => lerp(start, end, fraction)),\n  );\n};\n","import {\n  FULL_HD_HEIGHT,\n  FULL_HD_WIDTH,\n  STREAMING_VIDEO_ID,\n} from '../constants';\nimport type { ImageOutputValues } from '@3dsource/utils';\nimport { getCanvasCached, getSnapshot } from '@3dsource/utils';\nimport type { StreamResolutionProps } from '../interfaces';\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","/**\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 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","export class LatencyTimings {\n  TestStartTimeMs: number | null = null;\n  UEReceiptTimeMs: number | null = null;\n  UEEncodeMs: number | null = null;\n  UECaptureToSendMs: number | null = null;\n  UETransmissionTimeMs: number | null = null;\n  BrowserReceiptTimeMs: number | null = null;\n  FrameDisplayDeltaTimeMs: number | null = 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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\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  }\n\n  SetFrameDisplayDeltaTime(DeltaTimeMs: number) {\n    if (this.FrameDisplayDeltaTimeMs == null) {\n      this.FrameDisplayDeltaTimeMs = Math.round(DeltaTimeMs);\n    }\n  }\n}\n","import type { Quality } from '../interfaces';\n\nexport function qpToQuality(VideoEncoderQP: number) {\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 { 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","/*\n * Copyright (c) 2026.\n * 3DSource.com. Sergii Karanda steve@3dsource.com. All Rights Reserved.\n */\n\n/**\n * Rounds a number to the nearest even integer (rounding up for odd values).\n *\n * Video encoders (H.264/H.265) require even dimensions because chroma subsampling\n * operates on 2×2 pixel blocks. Odd dimensions cause encoding artifacts or failures.\n *\n * @param value - The number to round to the nearest even integer.\n * @returns The nearest even integer greater than or equal to the input.\n *\n * @example\n * makeEven(1079) // 1080\n * makeEven(1080) // 1080\n * makeEven(1081) // 1082\n */\nexport function makeEven(value: number): number {\n  return Math.floor((value + 1) / 2) * 2;\n}\n","import type { Area } from '@3dsource/utils';\nimport { fitIntoRectangle } from '@3dsource/utils';\nimport { FULL_HD_HEIGHT, FULL_HD_WIDTH } from '../constants';\nimport { makeEven } from './make-even';\n\nconst FULL_HD_PIXELS = FULL_HD_WIDTH * FULL_HD_HEIGHT;\nconst UHD_PIXELS = FULL_HD_WIDTH * 2 * (FULL_HD_HEIGHT * 2);\n\n/**\n * Calculates the optimal stream resolution for studio mode.\n *\n * Fits the studio aspect ratio into the container (scaled by pixelRatio), then\n * caps the total pixel count to a budget (Full HD or 4K) to avoid overloading\n * the GPU/encoder while maximizing visual quality.\n *\n * The pixel budget approach (instead of per-dimension caps) ensures that\n * non-standard aspect ratios (portrait, ultra-wide, square) utilize available\n * pixels efficiently — e.g. a tall 1080×1920 stream uses the same pixel budget\n * as a wide 1920×1080 stream.\n *\n * Resolution is always capped at the studio dimensions — never upscaled beyond\n * what the Unreal scene was designed for.\n *\n * @param params.pixelRatio - Device pixel ratio (`window.devicePixelRatio`).\n * @param params.containerWidth - CSS width of the video container in pixels.\n * @param params.containerHeight - CSS height of the video container in pixels.\n * @param params.studioWidth - Target width of the MetaBox Studio scene.\n * @param params.studioHeight - Target height of the MetaBox Studio scene.\n * @param params.maxResolution - When `true`, uses 4K pixel budget (3840×2160);\n *   otherwise Full HD (1920×1080). Controlled by `?maxresolution` query param.\n * @returns An {@link Area} with the calculated `w`, `h`, position (`x`, `y`),\n *   and `scale` factor relative to the container's device-pixel size.\n */\nexport function getResizeStudioValues(params: {\n  pixelRatio: number;\n  containerWidth: number;\n  containerHeight: number;\n  studioWidth: number;\n  studioHeight: number;\n  maxResolution: boolean;\n}): Area {\n  const {\n    pixelRatio,\n    containerWidth,\n    containerHeight,\n    studioWidth,\n    studioHeight,\n    maxResolution,\n  } = params;\n\n  const maxSpace = {\n    w: containerWidth * pixelRatio,\n    h: containerHeight * pixelRatio,\n  };\n  const maxPixels = maxResolution ? UHD_PIXELS : FULL_HD_PIXELS;\n\n  const videoSizePixelPerfect = fitIntoRectangle(\n    { x: 0, y: 0, w: studioWidth, h: studioHeight },\n    { x: 0, y: 0, ...maxSpace },\n  );\n\n  let w = videoSizePixelPerfect.w;\n  let h = videoSizePixelPerfect.h;\n\n  if (w * h > maxPixels) {\n    // Derive uniform scale factor `s` from: (w*s) * (h*s) = maxPixels\n    // → w * h * s² = maxPixels → s = √(maxPixels / (w * h)).\n    // Applying the same `s` to both dimensions preserves the aspect ratio.\n    const scaleFactor = Math.sqrt(maxPixels / (w * h));\n    w = w * scaleFactor;\n    h = h * scaleFactor;\n  }\n\n  const out = fitIntoRectangle(videoSizePixelPerfect, {\n    x: videoSizePixelPerfect.x,\n    y: videoSizePixelPerfect.y,\n    w,\n    h,\n  });\n\n  out.w = makeEven(out.w);\n  out.h = makeEven(out.h);\n  return out;\n}\n\n/**\n * Calculates the optimal stream resolution for configurator (non-studio) mode.\n *\n * Uses the full container area (scaled by pixelRatio) as the stream resolution,\n * then caps total pixel count to a budget (Full HD or 4K) to prevent excessive\n * GPU/encoder load while preserving the container's aspect ratio.\n *\n * Unlike {@link getResizeStudioValues}, there is no fixed studio resolution to\n * fit into — the container itself defines the aspect ratio, and the stream fills\n * it entirely (no letterboxing).\n *\n * @param params.pixelRatio - Device pixel ratio (`window.devicePixelRatio`).\n * @param params.containerWidth - CSS width of the video container in pixels.\n * @param params.containerHeight - CSS height of the video container in pixels.\n * @param params.maxResolution - When `true`, uses 4K pixel budget (3840×2160);\n *   otherwise Full HD (1920×1080). Controlled by `?maxresolution` query param.\n * @returns An {@link Area} with the calculated `w`, `h`, position (`x`, `y`),\n *   and `scale` factor (1 when no downscale needed, <1 when capped).\n */\nexport function getResizeValuesUniversal(params: {\n  pixelRatio: number;\n  containerWidth: number;\n  containerHeight: number;\n  maxResolution: boolean;\n}): Area {\n  const { pixelRatio, containerWidth, containerHeight, maxResolution } = params;\n\n  const maxSpace = {\n    w: containerWidth * pixelRatio,\n    h: containerHeight * pixelRatio,\n  };\n  const maxPixels = maxResolution ? UHD_PIXELS : FULL_HD_PIXELS;\n\n  let w = maxSpace.w;\n  let h = maxSpace.h;\n\n  if (w * h > maxPixels) {\n    // Derive uniform scale factor `s` from: (w*s) * (h*s) = maxPixels\n    // → w * h * s² = maxPixels → s = √(maxPixels / (w * h)).\n    // Applying the same `s` to both dimensions preserves the aspect ratio.\n    const scaleFactor = Math.sqrt(maxPixels / (w * h));\n    w = w * scaleFactor;\n    h = h * scaleFactor;\n  }\n\n  return { w: makeEven(w), h: makeEven(h), x: 0, y: 0, scale: w / maxSpace.w };\n}\n","import type { Area } from '@3dsource/utils';\nimport { fitIntoRectangle } from '@3dsource/utils';\nimport { FULL_HD_HEIGHT, FULL_HD_WIDTH } from '../constants';\nimport { makeEven } from './make-even';\n\n//TODO: Remove this legacy method after confirming that `getResizeValuesUniversal`\n// works well in all scenarios and updating any dependent code to use it instead.\nexport function getResizeValuesUniversalOld(params: {\n  pixelRatio: number;\n  containerWidth: number;\n  containerHeight: number;\n  maxResolution: boolean;\n}): Area {\n  const { pixelRatio, containerWidth, containerHeight, maxResolution } = params;\n\n  const maxSpace = {\n    w: containerWidth * pixelRatio,\n    h: containerHeight * pixelRatio,\n  };\n\n  const isVertical = containerWidth < containerHeight;\n  let maxH = FULL_HD_HEIGHT;\n  let maxW = FULL_HD_WIDTH;\n\n  if (maxResolution) {\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: containerWidth, h: containerHeight },\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 the layout size is smaller than 1920x1080\n    out.scale = 1;\n  }\n\n  /**\n   * Ensure that the size is always even.\n   */\n  out.w = makeEven(out.w);\n  out.h = makeEven(out.h);\n\n  return { ...out };\n}\n\nexport function getResizeStudioValuesOld(params: {\n  pixelRatio: number;\n  containerWidth: number;\n  containerHeight: number;\n  studioWidth: number;\n  studioHeight: number;\n  maxResolution: boolean;\n}): Area {\n  const {\n    pixelRatio,\n    containerWidth,\n    containerHeight,\n    studioWidth,\n    studioHeight,\n  } = params;\n\n  const maxSpace = {\n    w: containerWidth * pixelRatio,\n    h: containerHeight * pixelRatio,\n  };\n\n  const videoSizePixelPerfect = fitIntoRectangle(\n    { x: 0, y: 0, w: studioWidth, h: studioHeight },\n    { x: 0, y: 0, ...maxSpace },\n  );\n\n  const out = fitIntoRectangle(videoSizePixelPerfect, {\n    x: 0,\n    y: 0,\n    w: Math.min(maxSpace.w, FULL_HD_WIDTH),\n    h: Math.min(maxSpace.h, FULL_HD_HEIGHT),\n  });\n\n  /**\n   * Ensure that the size is always even.\n   */\n  out.w = makeEven(out.w);\n  out.h = makeEven(out.h);\n  return out;\n}\n","import { commandCompleted, commandStarted } from './commands.actions';\nimport { createReducer, on } from '@ngrx/store';\nimport { whereNot } from '@3dsource/utils';\nimport { destroyUnrealScene, setCirrusDisconnected } from '../unreal';\n\nconst removeExileCommands = (\n  state: UnrealCommandsState,\n  idToRemove: string,\n) => {\n  const exileTimeout = 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 > exileTimeout) {\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\nexport interface UnrealCommandsState {\n  commandsInProgress: {\n    timeStamp: number;\n    command: string;\n    id: string;\n  }[];\n  totalCommandsStarted: number;\n  totalCommandsCompleted: number;\n}\n\nconst initialState: UnrealCommandsState = {\n  commandsInProgress: [],\n  totalCommandsStarted: 0,\n  totalCommandsCompleted: 0,\n};\nexport const commandsReducer = createReducer(\n  initialState,\n  on(commandStarted, (state, { id, command }): UnrealCommandsState => {\n    return {\n      ...state,\n      totalCommandsStarted: state.totalCommandsStarted + 1,\n      commandsInProgress: [\n        ...state.commandsInProgress,\n        { id, command, timeStamp: new Date().getTime() },\n      ],\n    };\n  }),\n  on(commandCompleted, (state, { id }): UnrealCommandsState => {\n    return {\n      ...state,\n      ...removeExileCommands(state, id),\n    };\n  }),\n  on(destroyUnrealScene, setCirrusDisconnected, (): UnrealCommandsState => {\n    return initialState;\n  }),\n);\n","import { createFeature } from '@ngrx/store';\nimport { commandsReducer } from './commands.reducer';\n\nexport const commandsFeature = createFeature({\n  name: 'commandsFeature',\n  reducer: commandsReducer,\n});\n","import { createSelector } from '@ngrx/store';\nimport { commandsFeature } from './commands.feature';\n\nexport const selectCommandsInProgress = createSelector(\n  commandsFeature.selectCommandsInProgress,\n  (commandsInProgress) => commandsInProgress?.length ?? 0,\n);\nexport const selectCommandProgress = createSelector(\n  commandsFeature.selectTotalCommandsStarted,\n  commandsFeature.selectTotalCommandsCompleted,\n  (totalCommandsStarted, totalCommandsCompleted) =>\n    totalCommandsStarted ? totalCommandsCompleted / totalCommandsStarted : 0,\n);\n","import { createSelector } from '@ngrx/store';\nimport { unrealFeature } from './unreal.feature';\nimport { DEFAULT_AFK_TIMEOUT, SIGNALLING_PERCENT_VALUE } from '../../constants';\nimport { clampf, lerp } from '@3dsource/utils';\nimport { selectCommandProgress } from '../commands/commands.selectors';\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_AFK_TIMEOUT,\n);\nexport const selectIsExistMatchUrls = createSelector(\n  unrealFeature.selectMatchUrls,\n  (urls) => urls?.length > 0,\n);\nexport const selectIsAutostart = createSelector(\n  selectStreamConfig,\n  (config) => config?.autoStart,\n);\nexport const selectShowReconnectPopup = createSelector(\n  unrealFeature.selectCirrusConnected,\n  unrealFeature.selectEstablishingConnection,\n  (connected, establishing) => !connected && !establishing,\n);\nexport const selectShowLoader = createSelector(\n  selectShowReconnectPopup,\n  unrealFeature.selectViewportReady,\n  (showPopup, viewportReady) => !showPopup && !viewportReady,\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(\n        `${data.cirrusVersion}, ${data.branchInfo}, ${data.instanceType}`,\n      );\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);\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  unrealFeature.selectDataChannelConnected,\n  (\n    statusPercentSignallingServer,\n    commandProgress,\n    awsInstance,\n    dataChannelConnected,\n  ) => {\n    // TODO make better mechanism to detect is new orchestration\n    const isNewOrchestration = String(awsInstance?.wsUrl).match(\n      /^wss:\\/\\/orchestration-websocket/i,\n    );\n\n    const newOrchestrationProgressComplete = dataChannelConnected\n      ? 100\n      : (awsInstance?.progressComplete || 0) * 100;\n    /**\n     * Set 57% {@link SIGNALLING_PERCENT_VALUE} immediately when signalingServer?.signalingUrl is available\n     * Up to 56% {@link SIGNALLING_PERCENT_VALUE} - 1 of the progress is reserved for signaling server polling\n     */\n\n    const signalingPercentValue = isNewOrchestration\n      ? newOrchestrationProgressComplete\n      : statusPercentSignallingServer;\n\n    const SIGNALLING_MAX = SIGNALLING_PERCENT_VALUE / 100;\n    const splitPoint = awsInstance?.wsUrl\n      ? SIGNALLING_MAX + 0.01\n      : SIGNALLING_MAX;\n\n    const progressSignaling = lerp(\n      0.001,\n      splitPoint,\n      (signalingPercentValue ?? 0) / 100,\n    );\n    const progressRest = lerp(0, 1 - splitPoint, commandProgress);\n    return clampf(0, 1, progressSignaling + progressRest);\n  },\n);\nexport const selectClientAndViewIds = createSelector(\n  unrealFeature.selectStreamClientCompanyId,\n  unrealFeature.selectStreamViewId,\n  (clientId, viewId) => ({ clientId, viewId }),\n);\nexport const selectIsLoaderScreenVisible = createSelector(\n  unrealFeature.selectViewportReady,\n  unrealFeature.selectDataChannelConnected,\n  unrealFeature.selectCirrusConnected,\n  (viewReady, cirrusConnected, dataChannelConnected) =>\n    !viewReady || !cirrusConnected || !dataChannelConnected,\n);\n\nexport const selectCirrusConnectionId = createSelector(\n  unrealFeature.selectSsData,\n  (data) => data?.connectionId,\n);\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n  selector: 'app-unreal-error-modal',\n  templateUrl: './unreal-error-modal.component.html',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  styleUrl: './unreal-error-modal.component.scss',\n  imports: [SourceButtonComponent],\n})\nexport class UnrealErrorModalComponent {\n  #dialogRef = inject(DialogRef);\n  readonly dialogData = inject<{ content: string }>(DIALOG_DATA);\n\n  close() {\n    this.#dialogRef.close();\n  }\n}\n","<div class=\"src-modal src-modal--small\">\n  <header class=\"src-modal__header\">\n    <div\n      [attr.data-testid]=\"'unreal-error-header-title'\"\n      class=\"src-modal__title\"\n    >\n      Warning\n    </div>\n  </header>\n  <div class=\"src-modal__body\">\n    <div>{{ dialogData.content }}</div>\n  </div>\n  <div class=\"src-modal__footer\">\n    <src-button (onClick)=\"close()\">Ok</src-button>\n  </div>\n</div>\n","import { DataFlowMonitor } from '../../helpers/data-flow-monitor';\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  yellowFlag: number;\n  /**\n   * Amount of a percentage drop to trigger a red warning\n   */\n  redFlag: number;\n  /**\n   * Minimum number of frames per second to trigger low bandwidth\n   */\n  minimumFps: number;\n  /**\n   * Time to wait before checking if we can switch to low bandwidth\n   */\n  monitoringDelayTime: number;\n  // initial guess in kbps\n  initialBitrateEstimate: number;\n  // initial error covariance\n  initialErrorCovariance: number;\n  // Q: how much we expect the bitrate to change between measurements\n  processNoise: number;\n  // R: variance of measurement noise\n  measurementNoise: number;\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 { concatLatestFrom } from '@ngrx/operators';\nimport { inject, Injectable } from '@angular/core';\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport {\n  debounceTime,\n  EMPTY,\n  fromEvent,\n  map,\n  merge,\n  mergeMap,\n  of,\n  switchMap,\n  take,\n  timeout,\n  timer,\n} from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport {\n  abortEstablishingConnection,\n  changeLowBandwidth,\n  changeStreamResolutionAction,\n  changeStreamResolutionSuccessAction,\n  dataChannelConnected,\n  dataChannelReady,\n  destroyRemoteConnections,\n  destroyUnrealScene,\n  disconnectStream,\n  dropConnection,\n  initSignalling,\n  reconnectPeer,\n  reconnectPeerFailed,\n  reconnectPeerSuccess,\n  resetAfk,\n  resetConfig,\n  resetDataChannelForReconnect,\n  resetWarnTimeout,\n  setAwsInstance,\n  setCirrusDisconnected,\n  setConfig,\n  setFreezeFrame,\n  setKalmanSettings,\n  setLoopBackCommandIsCompleted,\n  setMaxFps,\n  setOrchestrationParameters,\n  setOrchestrationProgress,\n  setStatusPercentSignallingServer,\n  setViewportNotReady,\n  setViewportReady,\n  showUnrealErrorMessage,\n  startStream,\n  updateCirrusInfo,\n} from './unreal.actions';\nimport { unrealFeature } from './unreal.feature';\nimport {\n  catchError,\n  distinctUntilChanged,\n  exhaustMap,\n  filter,\n  takeUntil,\n  tap,\n  withLatestFrom,\n} from 'rxjs/operators';\nimport { Falsy, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport { getRtcErrorMessage } from '../../helpers';\nimport {\n  CONSOLE_COMMAND_PIXEL_QUALITY,\n  DATA_CHANNEL_CONNECTION_TIMEOUT,\n  DEFAULT_RECONNECT_DELAY_MS,\n  DEFAULT_RECONNECT_ENABLED,\n  DEFAULT_RECONNECT_MAX_ATTEMPTS,\n  DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE,\n  DEFAULT_RECONNECT_ON_ICE_FAILURE,\n  MINIMAL_FPS,\n  UNREAL_CONFIG,\n} from '../../constants';\nimport { selectCommandsInProgress } from '../commands';\nimport { selectIsAutostart } from './unreal.selectors';\nimport { WebrtcErrorModalComponent } from '../../components';\nimport {\n  CommandTelemetryService,\n  DevModeService,\n  SignallingService,\n  UnrealCallbackService,\n  UnrealCommunicatorService,\n  VideoService,\n  WebRtcPlayerService,\n} from '../../services';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport { ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport type { AwsInstance } from '../../interfaces';\nimport {\n  DisconnectReason,\n  WSCloseCode_FORCE_CIRRUS_CLOSE,\n} from '../../interfaces';\nimport { MetaBoxCommand } from '@3dsource/types-unreal';\nimport { UnrealErrorModalComponent } from '../../components/unreal-error-modal/unreal-error-modal.component';\nimport { BITRATE_MONITOR } from '../../components/low-bandwidth-indicator/DataFlowConstants';\n\n@Injectable()\nexport class UnrealEffects {\n  private actions$ = inject(Actions);\n  private dialog = inject(Dialog);\n  private http = inject(HttpClient);\n  private store = inject(Store);\n  private isDevMode = inject(DevModeService).isDevMode;\n  private scrollStrategy = inject(ScrollStrategyOptions).block();\n  private unrealInitialConfig = inject(UNREAL_CONFIG);\n  private webRtcPlayerService = inject(WebRtcPlayerService);\n  private commandsSender = inject(UnrealCommunicatorService);\n  private readonly commandTelemetryService = inject(CommandTelemetryService);\n  private signallingService = inject(SignallingService);\n  private videoService = inject(VideoService);\n  private unrealCallbackService = inject(UnrealCallbackService);\n  private dataChannelConnectionTimeout =\n    this.unrealInitialConfig?.dataChannelConnectionTimeout ??\n    DATA_CHANNEL_CONNECTION_TIMEOUT;\n  private connectionCompleted$ = this.store\n    .select(unrealFeature.selectDataChannelConnected)\n    .pipe(filter(Truthy));\n\n  // ==================== PEER RECONNECTION EFFECTS ====================\n\n  private reconnectConfig = {\n    enabled:\n      this.unrealInitialConfig?.reconnect?.enabled ?? DEFAULT_RECONNECT_ENABLED,\n    maxAttempts:\n      this.unrealInitialConfig?.reconnect?.maxAttempts ??\n      DEFAULT_RECONNECT_MAX_ATTEMPTS,\n    delayMs:\n      this.unrealInitialConfig?.reconnect?.delayMs ??\n      DEFAULT_RECONNECT_DELAY_MS,\n    onIceFailure:\n      this.unrealInitialConfig?.reconnect?.onIceFailure ??\n      DEFAULT_RECONNECT_ON_ICE_FAILURE,\n    onDataChannelClose:\n      this.unrealInitialConfig?.reconnect?.onDataChannelClose ??\n      DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE,\n  };\n\n  disconnectReasonHandling$ = createEffect(() => {\n    const destroyReasons = [\n      DisconnectReason.Afk,\n      DisconnectReason.DataChannelClosed,\n      DisconnectReason.DataChannelTimeout,\n      DisconnectReason.WebSocketError,\n      DisconnectReason.WebSocketClose,\n      DisconnectReason.WebRTCError,\n      DisconnectReason.DropConnection,\n      DisconnectReason.ReconnectFailed,\n      DisconnectReason.OrchestrationPlayerDisconnected,\n      DisconnectReason.OrchestrationStreamerDisconnected,\n    ];\n    return this.actions$.pipe(\n      ofType(disconnectStream),\n      filter(({ reason }) => {\n        // Skip DataChannelClosed if peer reconnection is enabled and signaling is connected\n        // The peer reconnection effect will handle this case\n        if (\n          reason === DisconnectReason.DataChannelClosed &&\n          this.reconnectConfig.enabled &&\n          this.reconnectConfig.onDataChannelClose &&\n          this.signallingService.isConnected()\n        ) {\n          Logger.info(\n            '[Reconnect] Skipping destroy for DataChannelClosed - peer reconnection will handle',\n          );\n          return false;\n        }\n        return destroyReasons.some((r) => r === reason);\n      }),\n      tap(({ reason, message }) => {\n        Logger.log(\n          `Disconnect Call=> reason:'${reason}', message:'${message}'`,\n        );\n      }),\n      map(({ reason }) => destroyRemoteConnections({ reason })),\n    );\n  });\n  destroyConnections$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(destroyUnrealScene),\n      tap(() => {\n        this.commandsSender.destroy();\n        this.videoService.setContainer(null);\n      }),\n      map(() => destroyRemoteConnections({ reason: DisconnectReason.Destroy })),\n    );\n  });\n  destroyRemoteConnections$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(destroyRemoteConnections),\n      tap(({ reason }) => {\n        this.signallingService.close({\n          code: WSCloseCode_FORCE_CIRRUS_CLOSE,\n          reason,\n        });\n        this.webRtcPlayerService.closePC();\n      }),\n      filter(({ reason }) => reason === DisconnectReason.DropConnection),\n      map(() => dropConnection()),\n    );\n  });\n  webrtcErrorModalComponent$ = createEffect(\n    () => {\n      return this.actions$.pipe(\n        ofType(disconnectStream),\n        filter(({ reason }) => reason === DisconnectReason.WebRTCError),\n        debounceTime(400),\n        switchMap(() =>\n          this.store\n            .select(unrealFeature.selectDataChannelConnected)\n            .pipe(take(1), filter(Falsy)),\n        ),\n        tap(() => this.dialog.open(WebrtcErrorModalComponent)),\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      withLatestFrom(this.store.select(unrealFeature.selectLowBandwidth)),\n      filter(([, isLowBandwidth]) => isLowBandwidth),\n      map(() => changeLowBandwidth({ lowBandwidth: false })),\n    );\n  });\n  resetFreezeFrameOnLowBandwidthTriggered$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(changeLowBandwidth),\n      map(({ lowBandwidth }) => lowBandwidth),\n      distinctUntilChanged(),\n      map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n    );\n  });\n  sendLbmStatistics$ = createEffect(\n    () => {\n      return 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        take(1),\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    { dispatch: false },\n  );\n  resetAfk$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(setConfig, resetWarnTimeout, resetConfig),\n      map(() => resetAfk()),\n    );\n  });\n  abortEstablishingConnection$ = createEffect(() => {\n    const viewportReady$ = this.store\n      .select(unrealFeature.selectViewportReady)\n      .pipe(\n        filter(Truthy),\n        map(() => abortEstablishingConnection()),\n      );\n\n    const disconnectEvents$ = this.actions$.pipe(\n      ofType(setCirrusDisconnected, destroyUnrealScene, dropConnection),\n      map(() => abortEstablishingConnection()),\n    );\n\n    return merge(viewportReady$, disconnectEvents$).pipe(tapLog('ABORT'));\n  });\n  setMaxFps$ = createEffect(\n    () => {\n      return this.actions$.pipe(\n        ofType(setMaxFps),\n        tap(({ maxFps }) => {\n          this.commandsSender.sendCommandToUnreal({\n            command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n            payload: { value: `t.MaxFPS ${maxFps}` },\n          });\n        }),\n      );\n    },\n    { dispatch: false },\n  );\n  setKalmanSettings$ = createEffect(\n    () => {\n      return this.actions$.pipe(\n        ofType(setKalmanSettings),\n        tap(({ settings }) => {\n          this.videoService.kalmanFilter1D.config(settings);\n          BITRATE_MONITOR.config(settings);\n        }),\n      );\n    },\n    { dispatch: false },\n  );\n  setSignalingTo100$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(setAwsInstance),\n      map(() => setStatusPercentSignallingServer({ percent: 100 })),\n    );\n  });\n  setOrchestrationParameters$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(setOrchestrationParameters),\n      map(({ eta }) => eta),\n      filter((value) => value > 0),\n      switchMap((total) => {\n        // Emit every second: 0,1,2,...,total (inclusive)\n        return timer(0, 1000).pipe(\n          takeUntil(this.connectionCompleted$),\n          take(total + 1),\n          map((sec) => sec / total),\n          distinctUntilChanged(),\n          map((progressComplete) =>\n            setOrchestrationProgress({ progressComplete }),\n          ),\n        );\n      }),\n    );\n  });\n  setDataChannelTimeoutCheck$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(setAwsInstance),\n      // require wsUrl present on the action payload\n      filter((action) => !!action.wsUrl),\n      // for each awsInstance action capture one ssData snapshot, then wait for dataChannelConnected\n      switchMap((awsInstance: AwsInstance) => {\n        return this.actions$.pipe(\n          ofType(updateCirrusInfo),\n          take(1),\n          tap(() =>\n            Logger.log(\n              `DataChannel timeout check started with next timeout: ${this.dataChannelConnectionTimeout}ms`,\n            ),\n          ),\n          switchMap(({ ssData }) => {\n            const abort$ = this.actions$.pipe(\n              ofType(\n                setCirrusDisconnected, // ← \"Cirrus closed\" action\n                abortEstablishingConnection, // ← \"Manual abort\" action\n              ),\n              take(1),\n            );\n\n            return this.actions$.pipe(\n              ofType(dataChannelConnected),\n              take(1),\n\n              // 🚫 If Cirrus (or anything else) disconnects first, abort BEFORE timeout fires.\n              takeUntil(abort$),\n\n              // if it becomes true within timeout -> complete without dispatching any action\n              timeout(this.dataChannelConnectionTimeout),\n\n              // successfully connect → no action\n              mergeMap(() => EMPTY),\n\n              // ⏱️ Only actual timeout (or real upstream error) ends up here.\n              catchError(() => {\n                const error = `⏱️ DataChannel connection timeout ${this.dataChannelConnectionTimeout}ms, requesting new signaling.`;\n                Logger.error(error);\n\n                const body = {\n                  awsInstance,\n                  connectionId: ssData?.connectionId,\n                  href: location.href,\n                  userAgent: navigator.userAgent,\n                  error,\n                };\n\n                return this.http.post(awsInstance.pollingUrl || '', body).pipe(\n                  catchError((postError: unknown) => {\n                    Logger.error('Error sending timeout info:', postError);\n                    return of(null);\n                  }),\n                  // map response to the destroy action that ngrx will dispatch\n                  map(() =>\n                    disconnectStream({\n                      reason: DisconnectReason.DataChannelTimeout,\n                      message: 'Data Channel Timeout',\n                    }),\n                  ),\n                );\n              }),\n            );\n          }),\n        );\n      }),\n    );\n  });\n\n  resetCirrusOnDestroy$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(destroyRemoteConnections),\n      map(() => setCirrusDisconnected()),\n    );\n  });\n\n  destroyConnectionAndRestart$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(setCirrusDisconnected),\n      concatLatestFrom(() =>\n        this.store.select(unrealFeature.selectDisconnectReason),\n      ),\n      filter(([, reason]) => reason === DisconnectReason.DataChannelTimeout),\n      map(() => initSignalling()),\n    );\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(UnrealErrorModalComponent, {\n            scrollStrategy: this.scrollStrategy,\n            data: { content },\n          }).closed,\n      ),\n      map(() => showUnrealErrorMessage({ code: null })),\n    );\n  });\n  sendStatisticsToUnreal$ = createEffect(\n    () => {\n      return this.actions$.pipe(\n        ofType(showUnrealErrorMessage),\n        filter(({ code }) => code === 404),\n        withLatestFrom(\n          this.store.select(unrealFeature.selectAwsInstance),\n          this.store.select(unrealFeature.selectStreamClientCompanyId),\n          this.store.select(unrealFeature.selectStreamViewId),\n        ),\n        switchMap(([action, instance, companyId, viewId]) =>\n          this.http\n            .post(this.unrealInitialConfig?.customErrorsEndpoint || '', {\n              client: instance.pollingUrl,\n              session_uuid: companyId,\n              session_uuid2: viewId,\n              message: {\n                type: 'front',\n                error: 'pak_not_found',\n                info: action?.error ?? '',\n              },\n            })\n            .pipe(\n              tap(() =>\n                Logger.log(\n                  `successfully send to ${this.unrealInitialConfig?.customErrorsEndpoint}`,\n                ),\n              ),\n              catchError(() => {\n                Logger.error(\n                  `get error from ${this.unrealInitialConfig?.customErrorsEndpoint}`,\n                );\n                return EMPTY;\n              }),\n            ),\n        ),\n      );\n    },\n    { dispatch: false },\n  );\n  unrealReceiverReady$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(dataChannelConnected),\n      concatLatestFrom(() =>\n        this.store.select(unrealFeature.selectIsReconnecting),\n      ),\n      filter(([, isReconnecting]) => !isReconnecting),\n      map(() => dataChannelReady()),\n    );\n  });\n  initAppBySetDataChannelConnected$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(dataChannelReady),\n      tap(() => {\n        this.commandsSender.sendCommandToUnreal({\n          command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n          payload: { value: CONSOLE_COMMAND_PIXEL_QUALITY },\n        });\n        this.commandsSender.sendCommandToUnreal({\n          command: MetaBoxCommand.FDebugModeCommand,\n          payload: { value: this.isDevMode },\n        });\n        this.commandTelemetryService.trackStartCommand('EXT-SetViewportReady');\n      }),\n      switchMap(() =>\n        this.store.select(selectCommandsInProgress).pipe(\n          debounceTime(100), // !IMPORTANT last command detection time\n          take(1),\n          switchMap(() =>\n            this.unrealCallbackService.observeCommandResponse<MetaBoxCommand.FLoopBackCommand>(\n              { command: MetaBoxCommand.FLoopBackCommand },\n              (data) => this.commandsSender.sendCommandToUnreal(data),\n            ),\n          ),\n          switchMap(() => this.videoService.videoStats$),\n          filter(\n            (videoStats) =>\n              !!videoStats.aggregatedStats.framesPerSecond &&\n              videoStats.aggregatedStats.framesPerSecond > MINIMAL_FPS &&\n              (videoStats.aggregatedStats.framesDecoded || 0) > 15,\n          ),\n          take(1),\n          map(() => setLoopBackCommandIsCompleted()),\n        ),\n      ),\n    );\n  });\n  setViewportReadyBySetLoopBackCommandIsCompleted$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(setLoopBackCommandIsCompleted, reconnectPeerSuccess),\n      tap(() =>\n        this.commandTelemetryService.trackStopCommand(\n          'EXT-SetViewportReady',\n          false,\n          { ready: true },\n        ),\n      ),\n      map(() => setViewportReady()),\n    );\n  });\n  startStream$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(startStream),\n      map(() => initSignalling()),\n    );\n  });\n  connectToSignaling$ = createEffect(\n    () => {\n      return this.actions$.pipe(\n        ofType(initSignalling),\n        withLatestFrom(\n          this.store.select(unrealFeature.selectMatchUrls),\n          this.store.select(selectIsAutostart),\n          this.store.select(unrealFeature.selectCirrusConnected),\n        ),\n        filter(([, , autoStart, cirrusConnected]) => {\n          if (cirrusConnected) {\n            Logger.warn(\n              `SIGNALING REQUEST can't be called when cirrus connection is already established.`,\n            );\n          }\n          return autoStart && !cirrusConnected;\n        }),\n        map(([, matchMakerUrls]) => [...matchMakerUrls].filter(Truthy)),\n        filter((urls) => urls.length > 0),\n        // Ensure a single in-flight request per attempt.\n        exhaustMap((urls) => this.signallingService.connectToSignaling(urls)),\n      );\n    },\n    { dispatch: false },\n  );\n  /**\n   * Effect: `forceViewportNotReady$`\n   *\n   * Ensures the viewport is explicitly marked as *not ready* to prevent\n   * a temporary black screen flash when disconnecting.\n   *\n   * ### Why\n   * - The video stream is disconnected immediately.\n   * - The DataChannel closes slightly later.\n   * - Closing the DataChannel resets the Unreal scene,\n   *   which also sets `viewPortReady` to `false`.\n   *\n   * Without this effect, the order of these events may cause\n   * a visible flicker (video flashing to black).\n   */\n  forceViewportNotReady$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(destroyRemoteConnections),\n      map(() => setViewportNotReady()),\n    );\n  });\n  /**\n   * Effect: `handleDataChannelClosed$`\n   *\n   * Triggers peer reconnection when DataChannel closes unexpectedly.\n   * Only triggers if reconnection is enabled, onDataChannelClose is true,\n   * and the signaling WebSocket is still connected.\n   */\n  handleDataChannelClosed$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(disconnectStream),\n      filter(\n        ({ reason }) =>\n          reason === DisconnectReason.DataChannelClosed &&\n          this.reconnectConfig.enabled &&\n          this.reconnectConfig.onDataChannelClose &&\n          this.signallingService.isConnected(),\n      ),\n      tap(() => {\n        Logger.warn(\n          '[Reconnect] DataChannel closed, initiating peer reconnection',\n        );\n      }),\n      map(() =>\n        reconnectPeer({\n          attempt: 1,\n          maxAttempts: this.reconnectConfig.maxAttempts,\n          delay: 0,\n        }),\n      ),\n    );\n  });\n  /**\n   * Effect: `resetStateForPeerReconnect$`\n   *\n   * Resets the data channel state when peer reconnection starts.\n   */\n  resetStateForPeerReconnect$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(reconnectPeer),\n      filter(() => this.reconnectConfig.enabled),\n      filter(({ attempt }) => attempt === 1), // Only reset on the first attempt\n      map(() => resetDataChannelForReconnect()),\n    );\n  });\n  /**\n   * Effect: `executePeerReconnect$`\n   *\n   * Executes the actual peer reconnection attempt.\n   * This only re-establishes the WebRTC connection, not the signaling.\n   */\n  executePeerReconnect$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(reconnectPeer),\n      filter(() => this.reconnectConfig.enabled),\n      tap(({ attempt, maxAttempts }) => {\n        Logger.info(\n          `[Reconnect] Peer reconnection attempt ${attempt}/${maxAttempts} in ${this.reconnectConfig.delayMs}ms`,\n        );\n      }),\n      switchMap(({ attempt, maxAttempts, delay }) =>\n        timer(delay ?? this.reconnectConfig.delayMs).pipe(\n          switchMap(() => {\n            Logger.info(\n              `[Reconnect] Starting peer reconnection attempt ${attempt}`,\n            );\n            // Initiate peer reconnection through WebRtcPlayerService\n            const success = this.webRtcPlayerService.reconnectPeer();\n            if (!success) {\n              Logger.error('[Reconnect] Failed to initiate peer reconnection');\n              if (attempt < maxAttempts) {\n                return of(reconnectPeer({ attempt: attempt + 1, maxAttempts }));\n              }\n              return of(\n                reconnectPeerFailed({\n                  reason: 'Signaling connection lost during peer reconnection',\n                }),\n              );\n            }\n            // Monitor for successful data channel connection\n            return this.actions$.pipe(\n              ofType(dataChannelConnected),\n              take(1),\n              timeout(this.dataChannelConnectionTimeout),\n              tap(() =>\n                Logger.info('[Reconnect] Peer reconnection successful!'),\n              ),\n              map(() => reconnectPeerSuccess()),\n              catchError(() => {\n                if (attempt < maxAttempts) {\n                  Logger.warn(\n                    `[Reconnect] Peer reconnection attempt ${attempt} timed out, scheduling retry`,\n                  );\n                  return of(\n                    reconnectPeer({\n                      attempt: attempt + 1,\n                      maxAttempts,\n                    }),\n                  );\n                } else {\n                  Logger.error(\n                    `[Reconnect] All ${maxAttempts} peer reconnection attempts exhausted`,\n                  );\n                  return of(\n                    reconnectPeerFailed({\n                      reason: `Peer reconnection failed after ${maxAttempts} attempts`,\n                    }),\n                  );\n                }\n              }),\n            );\n          }),\n          // Cancel if a scene is destroyed\n          takeUntil(this.actions$.pipe(ofType(destroyUnrealScene), take(1))),\n        ),\n      ),\n    );\n  });\n  /**\n   * Effect: `handlePeerReconnectFailed$`\n   *\n   * Handles the case when all peer reconnection attempts have failed.\n   * Falls back to full disconnection which may trigger full reconnection.\n   */\n  handlePeerReconnectFailed$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(reconnectPeerFailed),\n      tap(({ reason }) => {\n        Logger.error(`[Reconnect] Peer reconnection failed: ${reason}`);\n      }),\n      map(({ reason }) =>\n        disconnectStream({\n          reason: DisconnectReason.ReconnectFailed,\n          message: reason,\n        }),\n      ),\n    );\n  });\n  /**\n   * Effect: `logPeerReconnectSuccess$`\n   *\n   * Logs successful peer reconnection for telemetry.\n   */\n  logPeerReconnectSuccess$ = createEffect(\n    () => {\n      return this.actions$.pipe(\n        ofType(reconnectPeerSuccess),\n        tap(() => {\n          Logger.info('[Reconnect] Peer connection restored successfully');\n        }),\n      );\n    },\n    { dispatch: false },\n  );\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport { map, switchMap } from 'rxjs';\nimport { commandCompleted, unrealCommandCallback } from './commands.actions';\nimport { filter } from 'rxjs/operators';\nimport { Truthy } from '@3dsource/utils';\nimport { initSignalling } from '../unreal';\nimport { UNREAL_CONFIG } from '../../constants';\n\n@Injectable()\nexport class CommandsEffects {\n  private actions$ = inject(Actions);\n  private unrealInitialConfig = inject(UNREAL_CONFIG);\n\n  listenUnrealCallbackByInitSignalling$ = createEffect(() => {\n    return this.actions$.pipe(\n      ofType(initSignalling),\n      filter(() => !this.unrealInitialConfig?.playwright),\n      switchMap(() =>\n        this.actions$.pipe(\n          ofType(unrealCommandCallback),\n          map(({ json }) =>\n            'commandCallback' in json\n              ? json.commandCallback?.correlationId\n              : json?.correlationId,\n          ),\n          filter(Truthy),\n          map((id) => commandCompleted({ id })),\n        ),\n      ),\n    );\n  });\n}\n","import { share, skip, Subject } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { DestroyRef, inject } from '@angular/core';\nimport { unrealFeature } from '../store';\nimport { filter } from 'rxjs/operators';\nimport { Falsy } from '@3dsource/utils';\nimport { Actions } from '@ngrx/effects';\n\nexport class SubService {\n  protected readonly destroyRef = inject(DestroyRef);\n  protected readonly destroy$ = new Subject<void>();\n\n  actions$ = inject(Actions);\n  store = inject(Store);\n\n  disconnect$ = this.store\n    .select(unrealFeature.selectCirrusConnected)\n    .pipe(skip(1), filter(Falsy), share());\n\n  _destroy = this.destroyRef.onDestroy(() => {\n    this.destroy$.next();\n    this.destroy$.complete();\n  });\n}\n","import { effect, inject, Injectable, untracked } from '@angular/core';\nimport {\n  ControlScheme,\n  DEFAULT_AFK_TIMEOUT,\n  DEFAULT_AFK_TIMEOUT_PERIOD,\n  InputOptions,\n  UNREAL_CONFIG,\n} from '../constants';\nimport { SubService } from './sub.service';\nimport { DisconnectReason } from '../interfaces';\nimport {\n  disconnectStream,\n  resetAfk,\n  selectWarnTimeout,\n  setAfkTimerCountdown,\n  setAfkTimerHide,\n  setAfkTimerVisible,\n  unrealFeature,\n} from '../store';\nimport { ofType } from '@ngrx/effects';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\n\n@Injectable()\nexport class AFKService extends SubService {\n  private active = false; // Whether the AFK system is currently looking for inactivity.\n  private warnTimer!: ReturnType<typeof setTimeout>; // The timer that 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 readonly warnTimeout = this.store.selectSignal(selectWarnTimeout);\n  private readonly isViewportReady = this.store.selectSignal(\n    unrealFeature.selectViewportReady,\n  );\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n\n  /** Ticks every time warnTimeout changes or resetAfk action fires */\n  private readonly afkResetTrigger = toSignal(\n    merge(\n      this.store.select(selectWarnTimeout),\n      this.actions$.pipe(ofType(resetAfk)),\n    ),\n  );\n\n  /** Ticks when cirrus disconnects */\n  private readonly disconnected = toSignal(this.disconnect$);\n\n  constructor() {\n    super();\n    this.destroyRef.onDestroy(() => this.clearTimers());\n\n    if (this.unrealConfig?.playwright) {\n      return;\n    }\n\n    // Reset AFK warning timer when warnTimeout changes or resetAfk action fires\n    effect(() => {\n      this.afkResetTrigger();\n      untracked(() => {\n        if (this.isViewportReady()) {\n          this.resetAfkWarningTimer();\n        }\n      });\n    });\n\n    // Start AFK warning timer when viewport becomes ready\n    effect(() => {\n      const ready = this.isViewportReady();\n      if (ready) {\n        untracked(() => this.startAfkWarningTimer());\n      }\n    });\n\n    // Stop on disconnect\n    effect(() => {\n      const disconnected = this.disconnected();\n      if (disconnected !== undefined) {\n        untracked(() => this.stop());\n      }\n    });\n  }\n\n  private hideOverlay() {\n    this.store.dispatch(setAfkTimerHide());\n  }\n\n  /**\n   * Start a timer which when elapsed will warn the user they are inactive.\n   */\n  private startAfkWarningTimer() {\n    this.active = true;\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.clearTimers();\n      this.warnTimer = setTimeout(\n        () => {\n          this.showAfkOverlay();\n        },\n        (this.warnTimeout() || DEFAULT_AFK_TIMEOUT) * 1000,\n      );\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.store.dispatch(setAfkTimerCountdown({ countdown }));\n  }\n\n  private clearTimers() {\n    clearInterval(this.countdownTimer);\n    clearTimeout(this.warnTimer);\n  }\n\n  private stop() {\n    this.clearTimers();\n    this.hideOverlay();\n  }\n\n  reset() {\n    this.hideOverlay();\n    clearInterval(this.countdownTimer);\n    this.startAfkWarningTimer();\n  }\n\n  private showAfkOverlay() {\n    if (!this.isViewportReady()) {\n      return;\n    }\n    // Pause the timer while the user is looking at the inactivity warning overlay.\n    this.active = false;\n    this.countdown = DEFAULT_AFK_TIMEOUT_PERIOD;\n    this.store.dispatch(setAfkTimerVisible());\n    this.updateCountDown(this.countdown);\n\n    if (InputOptions.controlScheme === ControlScheme.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        this.store.dispatch(\n          disconnectStream({\n            reason: DisconnectReason.Afk,\n            message: `AFK timeout:${this.warnTimeout()} seconds, popup timeout:${DEFAULT_AFK_TIMEOUT_PERIOD} seconds`,\n          }),\n        );\n        clearInterval(this.countdownTimer);\n      } else {\n        this.updateCountDown(this.countdown);\n      }\n    }, 1000);\n  }\n}\n","import { filter, takeUntil } from 'rxjs/operators';\nimport { inject, Injectable } from '@angular/core';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport {\n  setFreezeFrame,\n  unrealFeature,\n  videoStreamInitialized,\n} from '../store';\nimport { ofType } from '@ngrx/effects';\nimport { UNREAL_CONFIG } from '../constants';\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  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n\n  constructor() {\n    super();\n    this.init();\n  }\n\n  protected init() {\n    if (this.unrealConfig?.playwright) {\n      return;\n    }\n    this.store\n      .select(unrealFeature.selectViewportReady)\n      .pipe(filter(Truthy), takeUntil(this.destroy$))\n      .subscribe(() => this.invalidate());\n    this.actions$\n      .pipe(ofType(videoStreamInitialized), takeUntil(this.destroy$))\n      .subscribe(() => this.invalidate());\n  }\n\n  setData(view: Uint8Array) {\n    view = view.slice(1 + 4);\n\n    if (!this.jpeg) {\n      return;\n    }\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      this.jpeg = undefined;\n      this.receiving = false;\n    } else {\n      this.dispatchInProgress();\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      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    if (!this.jpeg) {\n      return;\n    }\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    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 { from, fromEvent, interval, map, of, share, Subject, take } from 'rxjs';\nimport { SubService } from './sub.service';\nimport { Injectable } from '@angular/core';\nimport { type AggregatedStat, type InboundVideoStats } from '../interfaces';\nimport { catchError, filter, switchMap } from 'rxjs/operators';\nimport {\n  dispatchResize,\n  KalmanFilter1D,\n  LatencyTimings,\n  qpToQuality,\n} from '../helpers';\nimport { changeStatusMainVideoOnScene, videoStreamInitialized } from '../store';\nimport { STREAMING_VIDEO_ID } from '../constants';\nimport { tapLog, Truthy } from '@3dsource/utils';\nimport {\n  BITRATE_MONITOR,\n  FilterModel,\n} from '../components/low-bandwidth-indicator/DataFlowConstants';\n\n@Injectable()\nexport class VideoService extends SubService {\n  video: HTMLVideoElement | null = null;\n  audio: HTMLAudioElement | null = null;\n\n  private container: HTMLDivElement | null = null;\n  private latencyTestTimings = new LatencyTimings();\n\n  private videoTrack$ = new Subject<{\n    stream: MediaStream;\n    pcClient: RTCPeerConnection;\n  } | null>();\n\n  private VideoEncoderQP = 0;\n  private aggregatedStats = {} as InboundVideoStats;\n  kalmanFilter1D = new KalmanFilter1D(\n    FilterModel.initialBitrateEstimate,\n    FilterModel.initialErrorCovariance,\n    FilterModel.processNoise,\n    FilterModel.measurementNoise,\n  );\n\n  /**\n   * Aggregate video stats and emit it as videoStats$\n   */\n  videoStats$ = this.videoTrack$.pipe(\n    // If videoTrack$ emits null, switch to EMPTY → the current interval is canceled.\n    switchMap((track) =>\n      track\n        ? // IMPORTANT! DO NOT CHANGE THOSE NUMBERS, LBM Stats are based on those values\n          interval(250).pipe(\n            map(() => track.pcClient),\n            switchMap((pcClient) => from(this.getStats(pcClient))),\n            filter(Truthy),\n          )\n        : of(null),\n    ),\n    filter(Truthy),\n    share(),\n  );\n\n  setContainer(container: HTMLDivElement | null = null) {\n    this.container = container;\n  }\n\n  setLatencyTimings(latencyTimings: string) {\n    this.latencyTestTimings.SetUETimings(latencyTimings);\n  }\n\n  setEncoder(data: ArrayBuffer) {\n    this.VideoEncoderQP = Number(new TextDecoder('utf-16').decode(data));\n  }\n\n  create() {\n    this.disconnect$.pipe(take(1)).subscribe(() => this.destroy());\n    this.destroy();\n    this.createWebRtcVideo();\n    this.createWebRtcAudio();\n  }\n\n  attachVideoStream(stream: MediaStream, pcClient: RTCPeerConnection) {\n    if (this.video) {\n      this.video.srcObject = stream;\n      this.videoTrack$.next({ stream, pcClient });\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    // the video element has some other media stream 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  play() {\n    void this.safePlay(this.video);\n  }\n\n  async safePlay(video: HTMLVideoElement | null) {\n    if (!video) {\n      return;\n    }\n\n    try {\n      await video.play();\n      return;\n    } catch (error: unknown) {\n      if (\n        error &&\n        typeof error === 'object' &&\n        'name' in error &&\n        error?.name !== 'NotAllowedError'\n      ) {\n        throw error;\n      }\n\n      // Try silent inline autoplay\n      video.muted = true;\n      video.setAttribute('playsinline', '');\n      try {\n        await video.play();\n        return;\n      } catch {\n        /* fall through */\n      }\n\n      // Last resort: wait for the next real user gesture and play with/without sound\n      const resume = async () => {\n        try {\n          // choose whether to unmute here\n          // video.muted = false;\n          await video.play();\n        } catch {\n          /* ignore, maybe another gesture needed */\n        } finally {\n          window.removeEventListener('pointerdown', resume, true);\n          window.removeEventListener('keydown', resume, true);\n        }\n      };\n\n      window.addEventListener('pointerdown', resume, {\n        once: true,\n        capture: true,\n      });\n      window.addEventListener('keydown', resume, { once: true, capture: true });\n    }\n  }\n\n  private async getStats(\n    pcClient: RTCPeerConnection | null,\n  ): Promise<AggregatedStat | null> {\n    if (!pcClient || pcClient.connectionState === 'closed') {\n      return null;\n    }\n\n    try {\n      const stats = await pcClient.getStats(null);\n      return this.generateAggregatedStatsFunction(stats);\n    } catch (err) {\n      // Handle InvalidStateError or any transient WebRTC errors gracefully\n      if (err instanceof DOMException && err.name === 'InvalidStateError') {\n        console.warn('Peer connection is closed or unusable, skipping stats.');\n        return null;\n      }\n      throw err;\n    }\n  }\n\n  private generateAggregatedStatsFunction(\n    stats: RTCStatsReport,\n  ): AggregatedStat {\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((report) => {\n      // Get the inbound-rtp for video\n      if (report.type === 'inbound-rtp' && report.kind === 'video') {\n        Object.assign(newStat, report);\n\n        newStat.bytesReceivedStart =\n          this.aggregatedStats && this.aggregatedStats.bytesReceivedStart\n            ? this.aggregatedStats.bytesReceivedStart\n            : report.bytesReceived;\n\n        newStat.framesDecodedStart =\n          this.aggregatedStats && this.aggregatedStats.framesDecodedStart\n            ? this.aggregatedStats.framesDecodedStart\n            : report.framesDecoded;\n\n        newStat.timestampStart =\n          this.aggregatedStats && this.aggregatedStats.timestampStart\n            ? this.aggregatedStats.timestampStart\n            : report.timestamp;\n\n        if (this.aggregatedStats && this.aggregatedStats.timestamp) {\n          // Get the mimetype of the video codec being used\n          if (\n            report.codecId &&\n            this.aggregatedStats.codecs &&\n            Object.hasOwn(this.aggregatedStats.codecs, report.codecId)\n          ) {\n            newStat.videoCodec = this.aggregatedStats.codecs[report.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 || 0) -\n                  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 || 0) -\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 || 0) -\n                this.aggregatedStats.framesDecodedStart) /\n                ((newStat.timestamp - this.aggregatedStats.timestampStart) /\n                  1000),\n            );\n          }\n        }\n      }\n\n      if (\n        report.type === 'candidate-pair' &&\n        Object.hasOwn(report, 'currentRoundTripTime')\n      ) {\n        newStat.currentRoundTripTime = report.currentRoundTripTime ?? 0;\n      }\n\n      if (\n        report.type === 'transport' &&\n        Object.hasOwn(report, 'selectedCandidatePairId')\n      ) {\n        const selectedPair = stats.get(report.selectedCandidatePairId);\n        const local = stats.get(selectedPair.localCandidateId);\n        const remote = stats.get(selectedPair.remoteCandidateId);\n        newStat.selectedPair = {\n          local: { type: local?.candidateType, url: local?.url },\n          remote: { type: remote?.candidateType, url: remote?.url },\n        };\n      }\n\n      // Store mimetype of each codec\n      if (\n        Object.hasOwn(newStat, 'codecs') &&\n        report.type === 'codec' &&\n        report.mimeType &&\n        report.id\n      ) {\n        const codecId = report.id;\n        newStat.codecs[codecId] = report.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: qpToQuality(this.VideoEncoderQP),\n      aggregatedStats: {\n        ...aggregatedStats,\n        VideoEncoderQP: this.VideoEncoderQP,\n      },\n    };\n  }\n\n  private destroy() {\n    if (!this.video) {\n      return;\n    }\n    this.video = null;\n    this.audio = null;\n    this.videoTrack$.next(null);\n\n    // Reset stat state to prevent stale deltas on next session\n    this.aggregatedStats = {} as InboundVideoStats;\n    this.VideoEncoderQP = 0;\n    this.kalmanFilter1D = new KalmanFilter1D(\n      FilterModel.initialBitrateEstimate,\n      FilterModel.initialErrorCovariance,\n      FilterModel.processNoise,\n      FilterModel.measurementNoise,\n    );\n    BITRATE_MONITOR.reset();\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        take(1),\n        filter((data) => this.video === data.target),\n        tapLog('VideoService loadedmetadata:'),\n      )\n      .subscribe(() => {\n        if (this.video) {\n          this.store.dispatch(videoStreamInitialized());\n        }\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","import { inject, Injectable } from '@angular/core';\nimport { catchError, filter } from 'rxjs/operators';\nimport type { TelemetryType } from '../interfaces';\nimport { of, take, timer } from 'rxjs';\nimport { generateUuid, Truthy } from '@3dsource/utils';\nimport { HttpClient } from '@angular/common/http';\nimport { UNREAL_CONFIG } from '../constants';\nimport type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { unrealCommandCallback } from '../store';\n\n@Injectable()\nexport class CommandTelemetryService {\n  private actions$ = inject(Actions);\n  private readonly appId: string = 'metabox-telemetry';\n  private commandsSent: Record<string, CommandToSend> = {};\n  private exileTimeout = 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 sessionId!: string;\n  private userId!: string;\n  private payloads: Payload[] = [];\n\n  private readonly httpClient = inject(HttpClient);\n  private readonly unrealConfig = inject(UNREAL_CONFIG, {\n    optional: true,\n  });\n\n  constructor() {\n    this.init();\n  }\n\n  protected init() {\n    if (\n      !this.unrealConfig?.commandTelemetryReceiver ||\n      this.unrealConfig?.playwright\n    ) {\n      return;\n    }\n\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    timer(0, this.pollingTime).subscribe(() => {\n      this.send(this.payloads);\n    });\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  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  trackStopCommand(\n    trackingId: string,\n    multi = false,\n    response: { multi?: boolean } & Record<string, unknown> = {},\n    timeStampsRaw?: TimeStampsRaw,\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 a 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  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 pushStatToBuffer(\n    type: TelemetryType,\n    commandContent: Record<string, unknown>,\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: { trackingId: string }) {\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.unrealConfig?.commandTelemetryReceiver || '', out)\n      .pipe(\n        catchError(() => of(null)),\n        take(1),\n      )\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  protected listenCallbacks() {\n    this.actions$\n      .pipe(\n        ofType(unrealCommandCallback),\n        filter(({ json }) => {\n          const callback =\n            'commandCallback' in json ? json.commandCallback : json;\n          return Truthy(callback?.trackingId);\n        }),\n      )\n      .subscribe(({ json }) => {\n        const callback =\n          'commandCallback' in json ? json.commandCallback : json;\n        const timeStampsRaw =\n          'timeStamp' in json ? (json?.timeStamp as TimeStampsRaw) : undefined;\n        const trackingId = callback?.trackingId || '';\n\n        this.trackStopCommand(trackingId, false, {}, 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.exileTimeout) {\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 {MetaBoxCommandPacket} 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: MetaBoxCommandPacket) {\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: MetaBoxCommandPacket) => void;\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: Record<string, unknown>;\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\ninterface CommandToSend {\n  timeStampJs: number;\n  command: { trackingId: string };\n}\n","import type { SignallingService } from '../../services';\nimport type { StreamerListMessage } from '../../interfaces';\n\nexport function StreamerListHandler(\n  this: SignallingService,\n  msg: StreamerListMessage,\n) {\n  this.send(\n    JSON.stringify({\n      type: 'subscribe',\n      streamerId: msg.ids[0],\n    }),\n  );\n}\n","import type { SignallingService } from '../../services';\n\nexport function OfferHandler(\n  this: SignallingService,\n  msg: RTCSessionDescriptionInit,\n) {\n  this.onOffer$.next(msg);\n}\n","export function httpUrlToWs(url: string) {\n  return url.replace('http://', 'ws://').replace('https://', 'wss://');\n}\n","import { defer, Observable, throwError } from 'rxjs';\nimport { timeout } from 'rxjs/operators';\nimport { Logger } from '@3dsource/utils';\nimport { WS_TIMEOUT } from '../constants';\n\n/**\n * Factory that creates a WebSocket connection and wraps it in an RxJS Observable.\n *\n * Returns a **single-value Observable**: it emits the open `WebSocket` instance\n * once the connection is established, then completes. This design allows\n * downstream operators (e.g. `tap` in `connectToCirrus`) to attach their own\n * event handlers before any messages arrive.\n *\n * ## Ownership model\n *\n * The factory **transfers ownership** of the WebSocket to the consumer upon\n * emission. Once `observer.next(ws)` fires, the consumer is responsible for\n * the socket's lifecycle (attaching handlers, closing when done). The teardown\n * logic will **never** close a socket that has been successfully delivered.\n *\n * ## Timeout\n *\n * The observable is piped through `timeout({ first: WS_TIMEOUT })`. If the\n * WebSocket `open` event does not fire within `WS_TIMEOUT` milliseconds, the\n * stream errors with a timeout message and the teardown disposes the socket.\n *\n * ## Teardown & leak prevention\n *\n * When the observable is unsubscribed (timeout, manual unsubscribe, or error),\n * the teardown function runs and handles two cases:\n *\n * 1. **Socket was emitted (`emitted === true`):** The consumer owns the socket.\n *    Teardown only removes the internal event listeners — it does NOT close\n *    the socket. Closing it here would break downstream consumers like\n *    `connectToCirrus` that rely on the connection staying alive.\n *\n * 2. **Socket was NOT emitted (`emitted === false`):** The socket is orphaned\n *    (nobody has a reference to it). Teardown must close it to prevent a leak.\n *    However, calling `ws.close()` on a `CONNECTING` socket does not reliably\n *    abort the underlying HTTP upgrade request in all browsers — the TCP\n *    handshake may still complete asynchronously. To handle this edge case,\n *    teardown replaces the `open` listener with a one-shot handler that calls\n *    `ws.close()` if the connection succeeds after teardown has already run.\n *    This ensures the orphaned socket is closed regardless of timing:\n *\n *    - If `close()` aborts the connection immediately — done.\n *    - If the browser lets the handshake complete anyway — the `open` handler\n *      fires and closes the now-connected socket, so it doesn't linger in\n *      the browser's network tab as a \"Pending\" request.\n *\n * ## Why `defer`?\n *\n * The outer `defer()` ensures a **new WebSocket** is created on each\n * subscription. Without it, retry operators would reuse the same (possibly\n * closed) socket instance. With `defer`, each retry gets a fresh connection.\n *\n * ## SSR guard\n *\n * If `window` or `WebSocket` is not available (server-side rendering),\n * the function returns an error observable immediately without attempting\n * a connection.\n *\n * ## Lifecycle flags\n *\n * - `opened` — set to `true` when the `open` event fires. Guards the `close`\n *   handler so it only errors the observable if the socket was closed *before*\n *   the connection was established (e.g. server rejected the upgrade).\n *\n * - `emitted` — set to `true` right before `observer.next(ws)`. Tells the\n *   teardown function whether the socket was delivered to the consumer.\n *   This is the flag that controls whether teardown closes the socket or\n *   leaves it for the consumer.\n *\n * ## Abort\n *\n * The factory does **not** accept an abort signal — cancellation is handled\n * by the caller via standard RxJS unsubscription. When the caller's\n * `takeUntil` (or manual `unsubscribe`) fires, the observable tears down\n * and the orphaned socket is closed. For retry loops, place `takeUntil`\n * at two levels:\n *\n * 1. **Inside the per-attempt chain** (e.g. in `connectToCirrus`) — cancels\n *    the current in-flight WebSocket attempt and triggers teardown.\n * 2. **Outside `retry`** (e.g. in `connectToSignaling`) — kills the entire\n *    retry loop so no further re-subscriptions occur.\n *\n * ## Usage\n *\n * ```typescript\n * // In connectToCirrus — takeUntil cancels the current attempt:\n * createWebSocket(wsUrl).pipe(\n *   takeUntil(abort$),\n *   tap(ws => addWsHandlers(ws)),\n * );\n *\n * // In connectToSignaling — takeUntil outside retry kills the loop:\n * defer(() => innerChain$).pipe(\n *   retry({ delay: ... }),\n *   takeUntil(abort$),\n * );\n * ```\n *\n * @param wsUrl - The `ws://` or `wss://` URL to connect to.\n * @returns Observable that emits a single open WebSocket, then completes.\n *          Errors if the connection fails, times out, or the environment\n *          does not support WebSocket.\n */\nexport function createWebSocket(wsUrl: string): Observable<WebSocket> {\n  // --- SSR guard: bail immediately if WebSocket API is unavailable ---\n  if (typeof window === 'undefined' || !('WebSocket' in window)) {\n    return throwError(\n      () => new Error(\"Your browser doesn't support WebSocket\"),\n    );\n  }\n\n  Logger.info('Creating socket', wsUrl);\n\n  return defer(\n    () =>\n      new Observable<WebSocket>((observer) => {\n        const ws = new WebSocket(wsUrl);\n\n        // Lifecycle flags — see JSDoc above for detailed explanation.\n        let opened = false;\n        let emitted = false;\n\n        // --- Event handlers (attached during connection, removed in teardown) ---\n\n        const onOpen = () => {\n          opened = true;\n          emitted = true;\n          observer.next(ws);\n          observer.complete();\n        };\n\n        const onError = (ev: Event) => {\n          const err =\n            ev && 'error' in ev && ev?.error instanceof Error\n              ? ev.error\n              : new Error('WebSocket failed to connect');\n          observer.error(err);\n        };\n\n        const onClose = (ev: CloseEvent) => {\n          if (!opened) {\n            observer.error(\n              new Error(`WebSocket closed before open (code ${ev.code})`),\n            );\n          }\n        };\n\n        ws.addEventListener('open', onOpen);\n        ws.addEventListener('error', onError);\n        ws.addEventListener('close', onClose);\n\n        // --- Teardown: runs on unsubscribe, timeout, error, or complete ---\n        return () => {\n          ws.removeEventListener('error', onError);\n          ws.removeEventListener('close', onClose);\n\n          if (\n            !emitted &&\n            (ws.readyState === WebSocket.CONNECTING ||\n              ws.readyState === WebSocket.OPEN)\n          ) {\n            // Socket was never delivered — it's orphaned. Must close it.\n            // Replace the open listener with a cleanup handler: if the\n            // browser completes the handshake after this teardown, the\n            // handler will close the orphaned socket immediately.\n            ws.removeEventListener('open', onOpen);\n            ws.addEventListener('open', () => ws.close());\n            ws.close();\n          } else {\n            // Socket was delivered to consumer — they own it now.\n            // Just remove our internal listener; don't touch the socket.\n            ws.removeEventListener('open', onOpen);\n          }\n        };\n      }),\n  ).pipe(\n    timeout({\n      first: WS_TIMEOUT,\n      with: () =>\n        throwError(\n          () =>\n            new Error(`WebSocket connection timed out after ${WS_TIMEOUT}ms`),\n        ),\n    }),\n  );\n}\n","import { disconnectStream } from '../../store';\nimport type { SignallingService } from '../../services';\nimport { DisconnectReason } from '../../interfaces';\n\nexport function PlayerDisconnectHandler(this: SignallingService) {\n  this.store.dispatch(\n    disconnectStream({\n      reason: DisconnectReason.OrchestrationPlayerDisconnected,\n      message: 'Orchestration: PlayerDisconnectHandler',\n    }),\n  );\n}\nexport function StreamerDisconnectHandler(this: SignallingService) {\n  this.store.dispatch(\n    disconnectStream({\n      reason: DisconnectReason.OrchestrationStreamerDisconnected,\n      message: 'Orchestration: StreamerDisconnectHandler',\n    }),\n  );\n}\n","import type { SignallingService } from '../../services';\nimport type { OrchestrationErrorMessage } from '../../interfaces';\nimport { POLLING_TIME } from '../../constants';\nimport { setOrchestrationMessage } from '../../store';\nimport { timer } from 'rxjs';\n\n// Structured constants holding code + description\nexport const ORCHESTRATION_ERROR_CODES = {\n  NO_AVAILABLE_INSTANCES: {\n    code: 4001,\n    description: 'There are no instances to run for the requested environment.',\n  },\n  LIMIT_REACHED: {\n    code: 4002,\n    description:\n      'The limit of instances for the requested environment is reached.',\n  },\n  DIFFERENT_ORIGIN: {\n    code: 4003,\n    description:\n      'Origin instance and client are on different connection servers on instance.',\n  },\n} as const;\n\n// Set for codes that should trigger a retry\nconst RETRY_CODES = new Set<number>([\n  ORCHESTRATION_ERROR_CODES.NO_AVAILABLE_INSTANCES.code,\n  ORCHESTRATION_ERROR_CODES.LIMIT_REACHED.code,\n]);\n\nexport function OrchestrationErrorHandler(\n  this: SignallingService,\n  msg: OrchestrationErrorMessage,\n) {\n  if (RETRY_CODES.has(msg.payload.code)) {\n    const errorInfo = Object.values(ORCHESTRATION_ERROR_CODES).find(\n      ({ code }) => code === msg.payload.code,\n    );\n    this.store.dispatch(\n      setOrchestrationMessage({ message: errorInfo?.description as string }),\n    );\n    this.orchestrationRetrySub?.unsubscribe();\n    this.orchestrationRetrySub = timer(POLLING_TIME).subscribe(() =>\n      this.sendRequestStream(),\n    );\n  }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { CommandTelemetryService } from './command-telemetry.service';\nimport type { Observable, Subscription } from 'rxjs';\nimport {\n  defer,\n  EMPTY,\n  retry,\n  Subject,\n  switchMap,\n  take,\n  timeout,\n  timer,\n} from 'rxjs';\nimport { exhaustMap, filter, map, takeUntil, tap } from 'rxjs/operators';\nimport {\n  abortEstablishingConnection,\n  dataChannelConnected,\n  dataChannelReady,\n  pollingEnded,\n  pollingStarted,\n  selectClientAndViewIds,\n  setAwsInstance,\n  setEstablishingConnection,\n  setStatusMessage,\n  setStatusPercentSignallingServer,\n  setUnrealPlaywrightConfig,\n  unrealFeature,\n} from '../store';\nimport { HttpClient } from '@angular/common/http';\nimport { SubService } from './sub.service';\nimport {\n  POLLING_TIME,\n  UNREAL_CONFIG,\n  UnrealStatusMessage,\n  WS_OPEN_STATE,\n} from '../constants';\nimport type {\n  AnySignalingMessage,\n  AwsInstance,\n  CloseReason,\n  ConfigMessage,\n  MessageBase,\n  PollingOrchestrationMessage,\n  SignalingMessageHandler,\n  SignalingMessageMap,\n} from '../interfaces';\nimport { DisconnectReason, OrchestrationMessageTypes } from '../interfaces';\nimport {\n  COLOR_CODES,\n  generateUuid,\n  Logger,\n  tapLog,\n  Truthy,\n} from '@3dsource/utils';\nimport {\n  AnswerHandler,\n  ConfigHandler,\n  getActiveUrl,\n  IceCandidateHandler,\n  InstanceReadyHandler,\n  InstanceReservedHandler,\n  OnCloseHandler,\n  OnErrorHandler,\n  OnMessageHandler,\n  OnOpenHandler,\n  PingHandler,\n  PlayerCountHandler,\n  SSInfoHandler,\n} from '../helpers';\nimport { RegionsPingService } from '../services';\nimport { StreamerListHandler } from '../helpers/FromStreamerHandlers/StreamerListHandler';\nimport { OfferHandler } from '../helpers/FromStreamerHandlers/OfferHandler';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { httpUrlToWs } from '../helpers/http-to-ws-url';\nimport { createWebSocket } from '../helpers/create-websocket';\nimport {\n  PlayerDisconnectHandler,\n  StreamerDisconnectHandler,\n} from '../helpers/FromStreamerHandlers/ForceDisconnect';\nimport { OrchestrationErrorHandler } from '../helpers/FromStreamerHandlers/OrchestrationErrorHandler';\n\n@Injectable()\nexport class SignallingService extends SubService {\n  private readonly action$ = inject(Actions);\n  private readonly httpClient = inject(HttpClient);\n  private readonly regionsPingService = inject(RegionsPingService);\n  private readonly commandTelemetryService = inject(CommandTelemetryService);\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n\n  readonly region = signal('');\n\n  readonly selectClientAndViewIds = this.store.selectSignal(\n    selectClientAndViewIds,\n  );\n  readonly environmentId = this.store.selectSignal(\n    unrealFeature.selectEnvironmentId,\n  );\n  readonly streamRequestContext = this.store.selectSignal(\n    unrealFeature.selectStreamRequestContext,\n  );\n\n  onOffer$ = new Subject<RTCSessionDescriptionInit>();\n  onConfig$ = new Subject<ConfigMessage>();\n  onWebRtcIce$ = new Subject<RTCIceCandidate>();\n  onWebRtcAnswer$ = new Subject<RTCSessionDescriptionInit | null>();\n  abort$ = this.action$.pipe(\n    ofType(abortEstablishingConnection),\n    tap(() =>\n      this.close({\n        code: 1000,\n        reason: DisconnectReason.AbortEstablishingConnection,\n      }),\n    ),\n  );\n\n  private ws!: WebSocket;\n  orchestrationRetrySub?: Subscription;\n\n  private wsMsgHandlers: Partial<{\n    [K in keyof SignalingMessageMap]: SignalingMessageHandler<K>;\n  }> = {};\n\n  protected correlationId!: string;\n\n  constructor() {\n    super();\n    this.init();\n  }\n\n  protected init() {\n    if (this.unrealConfig?.playwright) {\n      return;\n    }\n    this.setHandlersFromStream();\n    this.action$.pipe(ofType(dataChannelReady)).subscribe(() => {\n      this.send({\n        type: 'p2pEstablished',\n        source: 'front',\n        sessionId: generateUuid(),\n      });\n    });\n\n    this.action$\n      .pipe(\n        ofType(dataChannelReady),\n        switchMap(() =>\n          this.store\n            .select(unrealFeature.selectViewportReady)\n            .pipe(filter(Truthy), take(1)),\n        ),\n      )\n      .subscribe(() => {\n        this.send({\n          type: 'streamPreparedForUserInteraction',\n          correlationId: generateUuid(),\n        });\n      });\n  }\n\n  connectToSignaling(urlList: string[]) {\n    if (this.unrealConfig?.playwright) {\n      this.store.dispatch(setUnrealPlaywrightConfig());\n      this.store.dispatch(\n        dataChannelConnected({\n          statusMessage: 'Playwright set data channel connected',\n        }),\n      );\n      return EMPTY;\n    }\n\n    Logger.log('CONNECT TO SIGNALLING');\n    // Preparation for WebSocket Orchestration\n    this.correlationId = generateUuid();\n    this.commandTelemetryService.reset();\n    this.startEstablishingConnection();\n\n    return defer(() => {\n      return this.getRegion().pipe(\n        tap((region) => this.region.set(region ?? '')),\n        map((region) => this.adaptUrlsToRegion(urlList, region)),\n        switchMap((urls) => this.getAwsInstance(urls).pipe(take(1))),\n        tap((awsInstance) => this.store.dispatch(setAwsInstance(awsInstance))),\n        switchMap(({ wsUrl }) =>\n          this.connectToCirrus(wsUrl ?? '').pipe(filter(Truthy), take(1)),\n        ),\n        takeUntil(this.abort$),\n      );\n    }).pipe(\n      // Retry the whole attempt on error, advancing to the next URL each time.\n      retry({\n        delay: (err, attempt) => {\n          Logger.info(\n            `Retrying Signalling Connection in ${POLLING_TIME}ms. Attempt# ${attempt}.`,\n            err?.message,\n          );\n          return timer(POLLING_TIME);\n        },\n        // count: 10, // Optional: cap the number of attempts.\n      }),\n      // abort$ sits OUTSIDE retry so it kills the entire retry loop,\n      // not just the current attempt. Each inner createWebSocket also\n      // receives abort$ independently, so mid-connection attempts are\n      // cancelled too.\n      takeUntil(this.abort$),\n    );\n  }\n\n  protected startEstablishingConnection() {\n    this.showStatusMessage(UnrealStatusMessage.STARTING_YOUR_SESSION);\n    this.store.dispatch(setEstablishingConnection({ value: true }));\n  }\n\n  private adaptUrlsToRegion(urlList: string[], region?: string) {\n    return 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  }\n\n  /**\n   * Resolves an active AWS *signaling* instance and returns a WebSocket endpoint.\n   *\n   * The observable produced by this method is **cold** and executes inside a `defer`,\n   * so each subscription (including those triggered by `retry`) pulls the **next**\n   * URL candidate from a generator created by `getActiveUrl(urlsPool)`.\n   *\n   * ### Execution flow\n   *\n   * 1. **Telemetry** — Starts a `getSignaling` span for end-to-end timing.\n   * 2. **Candidate URL selection** — A stateful generator (`urlGen`) is created\n   *    from `urlsPool`. Each resubscription (e.g. via `retry`) advances to the next URL.\n   * 3. **Short-circuit for WS URLs** — If the picked candidate already matches\n   *    `ws://` or `wss://`, emit `{ wsUrl, pollingUrl: null, instanceName: null }`\n   *    immediately and complete (no HTTP request).\n   * 4. **Await client/view identifiers** — `this.store.select(selectClientAndViewIds)`\n   *    is tapped for logging (missing IDs) and then filtered to require both `clientId`\n   *    and `viewId` to be truthy.\n   * 5. **Single in-flight HTTP orchestration call** — Uses `exhaustMap` to issue\n   *    `GET {signalingUrl}{clientId}/{viewId}`. New `{clientId, viewId}` emissions\n   *    while the request is in flight are **ignored** until completion, preventing overlap.\n   * 6. **Per-attempt timeout** — `timeout(WS_TIMEOUT)` caps how long we wait for a response.\n   *    On timeout, the attempt errors and the outer `retry` schedules the next URL.\n   * 7. **Response validation & progress reporting** — A `filter`:\n   *    - Calls `TelemetryStop('getSignaling', { ...data, multi: true })` on receipt.\n   *    - If `data.signallingServer === ''` or `data.error`:\n   *      shows a status message, optionally dispatches `setStatusPercentSignallingServer`\n   *      with `data.info.percent`, and **throws** to fail the attempt (triggers `retry`).\n   * 8. **Mapping to `AwsInstance`** — Converts the validated orchestration payload into:\n   *    - `wsUrl`: via `httpUrlToWs(\\`\\${location.protocol}//\\${data.signallingServer}\\`)`\n   *    - `pollingUrl`: the base `signalingUrl` that succeeded\n   *    - `instanceName`: the (validated) `data.signallingServer`\n   * 9. **Retry policy** — On *any* upstream error (timeout, HTTP error, invalid payload),\n   *    `retry({ delay })`:\n   *    - Shows a “connecting” status,\n   *    - Logs the attempt number,\n   *    - Waits `WS_TIMEOUT` ms (via `timer`) and **resubscribes**, advancing `urlGen`.\n   *\n   * ### Concurrency semantics\n   *\n   * - `exhaustMap` guarantees a **single** HTTP request per attempt; subsequent\n   *   `{clientId, viewId}` emissions are ignored until the current request completes.\n   *\n   * ### Telemetry semantics\n   *\n   * - `trackStartCommand('EXT-getSignaling')` begins before work.\n   * - `trackStopCommand('getSignaling', {...})` runs on receipt of an orchestration response.\n   *   If an attempt fails (e.g., timeout), stopping the span is the responsibility of\n   *   your telemetry layer or a `finalize` elsewhere if desired.\n   *\n   * ### Error & retry semantics\n   *\n   * - Missing/never-emitted IDs → timeout → retry with next URL.\n   * - HTTP/network error → retry with next URL.\n   * - Invalid orchestration payload (`error` set or empty `signallingServer`) → throw in\n   *   validation filter → retry with next URL.\n   * - Short-circuit WS path **does not** retry (emits once, completes).\n   *\n   * @param urlsPool - Ordered list of base URLs to probe. Retries advance through this list\n   * until a working signaling server is found. A candidate may also be a direct `ws://`/`wss://`\n   * URL to short-circuit HTTP orchestration.\n   *\n   * @returns Observable that emits exactly one {@link AwsInstance} on success and then completes.\n   * On failure, the stream errors; the built-in `retry` operator re-subscribes after `WS_TIMEOUT`\n   * and advances to the next URL candidate.\n   *\n   * @throws Emits an error within the observable chain (not a thrown synchronous exception) when:\n   * - The HTTP request fails or times out.\n   * - The orchestration response indicates an error or an empty `signallingServer`.\n   * - Any other operator in the chain surfaces an error.\n   *\n   * @remarks\n   * - The URL generator (`urlGen`) is created **outside** `defer`, so resubscriptions\n   *   advance the pool. Creating it inside `defer` would restart from the first URL each retry.\n   * - `location.protocol` is used to derive `ws` vs `wss`. If this may run in non-browser\n   *   contexts (e.g., SSR), guard or abstract this logic.\n   * - Consider capping retries with `count` in `retry({ count, delay })` when appropriate.\n   *\n   * @example\n   * ```ts\n   * getAwsInstance(['https://signaling.example.com/', 'wss://direct.example.com'])\n   *   .subscribe({\n   *     next: ({ wsUrl }) => connect(wsUrl),\n   *     error: (e) => console.error('Unable to establish signaling:', e),\n   *   });\n   * ```\n   *\n   * @see httpUrlToWs\n   * @see selectClientAndViewIds\n   * @see setStatusPercentSignallingServer\n   */\n  private getAwsInstance(urlsPool: string[]): Observable<AwsInstance> {\n    this.commandTelemetryService.trackStartCommand('EXT-getSignaling');\n\n    // Stateful iterator over candidate URLs; retries advance this sequence.\n    const urlGen = getActiveUrl(urlsPool);\n\n    return defer(() => {\n      const signalingUrl = `${urlGen.next().value}`;\n\n      // Short-circuit if the candidate is already a WS endpoint.\n      if (signalingUrl.match(/^ws(s?):\\/\\//i)) {\n        return this.store.select(selectClientAndViewIds).pipe(\n          filter(({ clientId, viewId }) => !!clientId && !!viewId),\n          map(() => {\n            return {\n              wsUrl: signalingUrl,\n              pollingUrl: null,\n              instanceName: 'Direct Connection',\n            };\n          }),\n        );\n      }\n\n      // Old (HTTP-polling) orchestration flow — mark the roundtrip so\n      // the signaling-phase timeline can show it as a distinct segment.\n      this.store.dispatch(pollingStarted());\n\n      return this.store.select(selectClientAndViewIds).pipe(\n        // Log missing IDs without altering the stream.\n        tap(({ clientId, viewId }) => {\n          if (!clientId || !viewId) {\n            console.error('Client ID or View ID is not set');\n          }\n        }),\n\n        // Only proceed when both identifiers are available.\n        filter(({ clientId, viewId }) => !!clientId && !!viewId),\n\n        // Take first value\n        take(1),\n\n        // Ensure a single in-flight HTTP request per attempt.\n        exhaustMap(({ clientId, viewId }) =>\n          this.httpClient.get<PollingOrchestrationMessage>(\n            `${signalingUrl}${clientId}/${viewId}`,\n          ),\n        ),\n\n        // Bound the time spent waiting for the orchestration response.\n        timeout(POLLING_TIME),\n\n        // Validate response; report progress; fail fast on invalid payloads.\n        filter((data: PollingOrchestrationMessage) => {\n          this.commandTelemetryService.trackStopCommand(\n            'EXT-getSignaling',\n            true,\n            { ...data, multi: true },\n          );\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            // Throwing here fails the attempt and activates the retry strategy.\n            throw new Error(\n              `Orchestration message => ${data?.mm_message || 'Polling retry'}`,\n            );\n          }\n\n          return true;\n        }),\n\n        // Map a valid orchestration payload into the final AwsInstance.\n        map((data: PollingOrchestrationMessage): AwsInstance => {\n          this.store.dispatch(pollingEnded());\n          const wsUrl = httpUrlToWs(\n            `${location.protocol}//${data.signallingServer}`,\n          );\n\n          return {\n            wsUrl,\n            pollingUrl: signalingUrl,\n            instanceName: data.signallingServer ?? '',\n          };\n        }),\n      );\n    }).pipe(\n      // Retry the whole attempt on error, advancing to the next URL each time.\n      retry({\n        delay: (err, attempt) => {\n          this.showStatusMessage(UnrealStatusMessage.CONNECTING_TO_SESSION);\n          Logger.log(\n            `Retrying with new URL in ${POLLING_TIME}ms. Attempt# ${attempt}`,\n            err?.message,\n          );\n          return timer(POLLING_TIME);\n        },\n        // count: 10, // Optional: cap the number of attempts.\n      }),\n    );\n  }\n\n  private connectToCirrus(wsUrl: string) {\n    this.close({ code: 1000, reason: DisconnectReason.NewConnectionAttempt });\n    return createWebSocket(wsUrl).pipe(\n      takeUntil(this.abort$),\n      tapLog('WS CREATED'),\n      tap((ws) => {\n        this.commandTelemetryService.trackStartCommand('EXT-iceCandidate');\n        this.addWsHandlers(ws);\n      }),\n    );\n  }\n\n  addWsHandlers(ws: WebSocket) {\n    ws.onmessage = OnMessageHandler.bind(this);\n    ws.onclose = OnCloseHandler.bind(this);\n    ws.onerror = OnErrorHandler.bind(this);\n    this.ws = ws;\n    Logger.log('WS HANDLERS ADDED');\n    OnOpenHandler.call(this);\n  }\n\n  showStatusMessage(statusMessage: string | null) {\n    this.store.dispatch(setStatusMessage({ statusMessage }));\n  }\n\n  /**\n   * Close the connection with the signaling server\n   * @param data\n   */\n  close(data: CloseReason) {\n    const { code, reason } = data;\n    this.onWebRtcAnswer$.next(null);\n    this.orchestrationRetrySub?.unsubscribe();\n    if (this.ws) {\n      Logger.warn('Closing existing WebSocket connection');\n      const ws = this.ws;\n      ws.onmessage = () => null;\n      ws.onerror = () => null;\n      ws.onclose = () => null;\n      ws.onopen = () => null;\n      this.ws = null as never;\n\n      if (\n        ws.readyState === WebSocket.CONNECTING ||\n        ws.readyState === WebSocket.OPEN\n      ) {\n        ws.addEventListener('open', () => ws.close(code, reason), {\n          once: true,\n        });\n        ws.close(code, reason);\n      }\n    }\n  }\n\n  send(data: AnySignalingMessage) {\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      Logger.colored(...COLOR_CODES.TO_CIRRUS, JSON.parse(dataString));\n      try {\n        this.ws.send(dataString);\n      } catch {\n        Logger.error('No Websocket');\n      }\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.error = OrchestrationErrorHandler.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.streamerList = StreamerListHandler.bind(this);\n    this.wsMsgHandlers.iceCandidate = IceCandidateHandler.bind(this);\n    this.wsMsgHandlers.instanceReady = InstanceReadyHandler.bind(this);\n    this.wsMsgHandlers.instanceReserved = InstanceReservedHandler.bind(this);\n    this.wsMsgHandlers.playerDisconnected = PlayerDisconnectHandler.bind(this);\n    this.wsMsgHandlers.streamerDisconnected =\n      StreamerDisconnectHandler.bind(this);\n    this.wsMsgHandlers.offer = OfferHandler.bind(this);\n  }\n\n  protected sendRequestStream() {\n    const context = this.streamRequestContext();\n    const environmentId = this.environmentId();\n    if (!context || !environmentId) {\n      return;\n    }\n\n    this.send({\n      type: OrchestrationMessageTypes.requestStream,\n      correlationId: this.correlationId,\n      payload: {\n        region: this.region(),\n        environmentId,\n        context,\n      },\n    });\n  }\n\n  /**\n   * Check if the WebSocket connection is open and ready.\n   */\n  isConnected() {\n    return this.ws && this.ws.readyState === WS_OPEN_STATE;\n  }\n\n  private getRegion() {\n    Logger.log('Start Getting Region');\n    return this.regionsPingService.getFastest().pipe(take(1));\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { fromEvent, share, Subject, take, tap } from 'rxjs';\nimport { filter, map, takeUntil } from 'rxjs/operators';\nimport {\n  answerSent,\n  dataChannelConnected,\n  disconnectStream,\n  dropDC,\n  dropPC,\n  reconnectPeer,\n  unrealFeature,\n} from '../store';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport type { ConfigMessage } from '../interfaces';\nimport { DisconnectReason } from '../interfaces';\nimport { SignallingService } from './signalling.service';\nimport { VideoService } from './video.service';\nimport { CommandTelemetryService } from './command-telemetry.service';\nimport { ofType } from '@ngrx/effects';\n\n@Injectable()\nexport class WebRtcPlayerService extends SubService {\n  onDataChannelMessage$ = new Subject<ArrayBuffer>();\n\n  private pcClient!: RTCPeerConnection | null;\n  private dcClient!: RTCDataChannel | null;\n  private signallingSrv = inject(SignallingService);\n  private videoService = inject(VideoService);\n  private commandTelemetryService = inject(CommandTelemetryService);\n  private cfg: RTCConfiguration = {};\n  private useMic = false;\n  private forceTURN = false;\n  private forceMonoAudio = false;\n\n  /** Whether the remote SDP has been applied to the current peer connection */\n  private remoteDescriptionSet = false;\n  /** ICE candidates received before the remote description was set */\n  private iceCandidateBuffer: RTCIceCandidate[] = [];\n\n  private isReconnecting = this.store.selectSignal(\n    unrealFeature.selectIsReconnecting,\n  );\n\n  constructor() {\n    super();\n    this.init();\n    this.actions$.pipe(ofType(dropDC)).subscribe(() => this.dcClient?.close());\n    this.actions$.pipe(ofType(dropPC)).subscribe(() => this.pcClient?.close());\n  }\n\n  protected init() {\n    this.signallingSrv.onConfig$.subscribe((config: ConfigMessage) => {\n      this.videoService.create();\n      this.setConfig(config);\n    });\n\n    // Server-initiated offer: set remote description and respond with answer\n    this.signallingSrv.onOffer$.pipe(filter(Truthy)).subscribe((offer) => {\n      void this.handleServerOffer(offer);\n    });\n\n    // Answer to a client-initiated offer\n    this.signallingSrv.onWebRtcAnswer$\n      .pipe(filter(Truthy))\n      .subscribe((answer) => {\n        void this.handleServerAnswer(answer);\n      });\n\n    // ICE candidates — buffered until remote description is set\n    this.signallingSrv.onWebRtcIce$.subscribe((candidate) => {\n      this.commandTelemetryService.trackStopCommand('EXT-iceCandidate', true, {\n        multi: true,\n      });\n\n      if (this.remoteDescriptionSet) {\n        this.handleCandidateFromServer(candidate);\n      } else {\n        this.iceCandidateBuffer.push(candidate);\n      }\n    });\n  }\n\n  /**\n   * Handles an SDP offer received from the server.\n   * Creates a new peer connection, applies the remote offer,\n   * then responds with an SDP answer.\n   *\n   * The DataChannel is NOT created here — the server creates it,\n   * and we receive it via the `datachannel` event on the peer connection.\n   */\n  private async handleServerOffer(\n    offer: RTCSessionDescriptionInit,\n  ): Promise<void> {\n    Logger.info('Received offer from server, creating answer');\n    try {\n      this.remoteDescriptionSet = false;\n      this.iceCandidateBuffer.length = 0;\n\n      if (!this.pcClient) {\n        this.setupPeerConnection(this.cfg);\n      }\n\n      // Offer already defines media transceivers — don't add extras\n      await this.pcClient?.setRemoteDescription(offer);\n      this.remoteDescriptionSet = true;\n      this.flushIceCandidateBuffer();\n\n      await this.createAnswer(this.pcClient!);\n    } catch (e) {\n      Logger.error('Failed to handle server offer', e);\n      this.store.dispatch(\n        disconnectStream({\n          reason: DisconnectReason.WebRTCError,\n          message: 'WebRTCError: Failed to handle server offer',\n        }),\n      );\n    }\n  }\n\n  /**\n   * Handles an SDP answer received from the server in response to our offer.\n   * Applies the remote description and flushes any buffered ICE candidates.\n   */\n  private async handleServerAnswer(\n    answer: RTCSessionDescriptionInit,\n  ): Promise<void> {\n    Logger.info('Received answer from server');\n    try {\n      await this.pcClient?.setRemoteDescription(answer);\n      this.remoteDescriptionSet = true;\n      this.flushIceCandidateBuffer();\n    } catch (e) {\n      Logger.error('Failed to set remote description from answer', e);\n    }\n  }\n\n  /** Drains buffered ICE candidates after the remote description has been set */\n  private flushIceCandidateBuffer() {\n    for (const candidate of this.iceCandidateBuffer) {\n      this.handleCandidateFromServer(candidate);\n    }\n    this.iceCandidateBuffer.length = 0;\n  }\n\n  /**\n   * Creates a client-initiated WebRTC offer and sends it to the server.\n   * When the client offers, it also creates the DataChannel.\n   * Used for peer reconnection through the existing signaling connection.\n   */\n  private async createWebRtcOffer(): Promise<void> {\n    Logger.info('Creating client-initiated offer');\n    try {\n      this.remoteDescriptionSet = false;\n      this.iceCandidateBuffer.length = 0;\n\n      if (!this.pcClient) {\n        this.setupPeerConnection(this.cfg);\n      }\n\n      // Client offers: transceivers first, then DC, then offer\n      await this.setupTransceiversAsync(this.pcClient!);\n\n      this.dcClient = this.createDataChannel(\n        this.pcClient!,\n        'UnrealDcConnection',\n        { ordered: true },\n      );\n\n      await this.createOffer(this.pcClient!);\n    } catch (e) {\n      Logger.error('Failed to create WebRTC offer', e);\n      this.store.dispatch(\n        disconnectStream({\n          reason: DisconnectReason.WebRTCError,\n          message: 'WebRTCError: Offer Error',\n        }),\n      );\n    }\n  }\n\n  /**\n   * Initializes a new RTCPeerConnection with event handlers.\n   * Transceivers are NOT added here — the caller is responsible for adding\n   * them at the correct point depending on the negotiation flow.\n   */\n  private setupPeerConnection(config: RTCConfiguration) {\n    this.closePC();\n    Logger.log('Creating new RTCPeerConnection with config');\n    this.pcClient = new RTCPeerConnection(config);\n\n    this.commandTelemetryService.trackStartCommand('EXT-Browser ICE gathering');\n    this.commandTelemetryService.trackStartCommand(\n      'EXT-Browser ICE connection',\n    );\n    this.commandTelemetryService.trackStartCommand(\n      'EXT-Signaling state change',\n    );\n\n    this.handlePeerConnectionEvents(this.pcClient);\n\n    this.disconnect$.pipe(take(1)).subscribe(() => {\n      this.closePC();\n    });\n  }\n\n  private createDataChannel(\n    pc: RTCPeerConnection,\n    label: string,\n    options: RTCDataChannelInit,\n  ) {\n    const datachannel = pc.createDataChannel(label, options);\n    return this.setupDataChannelCallbacks(datachannel);\n  }\n\n  private 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        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((e) => {\n        Logger.warn('Failed to add ICE candidate', e);\n      });\n    } catch (e) {\n      Logger.error('Error handleCandidateFromServer', e);\n    }\n  }\n\n  /**\n   * Reorders the `m=video` line in the SDP so that payload types matching\n   * the given H.264 `profile-level-id` appear first, making the browser\n   * prefer that profile during codec negotiation.\n   *\n   * A `profile-level-id` is a 3-byte hex string (`XXYYZZ`) defined in\n   * RFC 6184 that encodes three H.264 parameters:\n   * - **Profile IDC** (`XX`) — the H.264 profile.\n   * - **Profile IOP** (`YY`) — constraint flags that further narrow the profile.\n   * - **Level IDC** (`ZZ`) — the level, which caps resolution/framerate/bitrate.\n   *\n   * ### H.264 profiles relevant to Unreal Engine Pixel Streaming\n   *\n   * | profile-level-id | Profile                    | Level | Notes                                        |\n   * |------------------|----------------------------|-------|----------------------------------------------|\n   * | `42001f`         | Baseline                   | 3.1   | No B-frames, low latency; legacy devices     |\n   * | `42e01f`         | Constrained Baseline       | 3.1   | Widest HW decode support; **recommended**    |\n   * | `4d001f`         | Main                       | 3.1   | B-frames + CABAC; better compression          |\n   * | `4d4028`         | Main                       | 4.0   | Up to 1080p60; common desktop target          |\n   * | `640028`         | High                       | 4.0   | Best quality/compression; most GPUs support   |\n   * | `64002a`         | High                       | 4.2   | Up to 1080p120 or 4K30                        |\n   * | `640033`         | High                       | 5.1   | Up to 4K60; requires modern HW                |\n   * | `640034`         | High                       | 5.2   | Up to 4K120; high-end HW only                 |\n   * | `6e001f`         | High 10                    | 3.1   | 10-bit color; limited browser support          |\n   * | `f4001f`         | High 4:4:4 Predictive      | 3.1   | Lossless capable; rare in browsers             |\n   *\n   * UE Pixel Streaming defaults to Constrained Baseline (`42e01f`) or High (`6400xx`)\n   * depending on engine version and `WebRTC.H264Profile` CVar.\n   *\n   * We prioritize `42e01f` because it guarantees hardware decoding on\n   * virtually all client devices (desktop, mobile, embedded), avoiding\n   * fallback to software decoding or negotiation of a higher profile\n   * that the client GPU may not accelerate.\n   */\n  private prioritizeH264Profile(sdp: string, profileLevelId: string): string {\n    const lines = sdp.split('\\r\\n');\n    const targetPts: string[] = [];\n\n    for (const line of lines) {\n      if (\n        line.startsWith('a=fmtp:') &&\n        line.toLowerCase().includes(`profile-level-id=${profileLevelId}`)\n      ) {\n        const pt = line.split(':')[1]?.split(' ')[0];\n        if (pt) targetPts.push(pt);\n      }\n    }\n\n    if (targetPts.length === 0) return sdp;\n\n    return lines\n      .map((line) => {\n        if (!line.startsWith('m=video')) return line;\n        const parts = line.split(' ');\n        // parts: m=video <port> <proto> <pt1> <pt2> ...\n        const header = parts.slice(0, 3);\n        const pts = parts.slice(3);\n        const prioritized = [\n          ...targetPts.filter((pt) => pts.includes(pt)),\n          ...pts.filter((pt) => !targetPts.includes(pt)),\n        ];\n        return [...header, ...prioritized].join(' ');\n      })\n      .join('\\r\\n');\n  }\n\n  private mungeSDP(sdp: string) {\n    let mungedSDP = this.prioritizeH264Profile(sdp, '42e01f');\n\n    mungedSDP = mungedSDP.replace(\n      /(a=fmtp:\\d+ .*level-asymmetry-allowed=.*)\\r\\n/gm,\n      '$1;x-google-start-bitrate=10000;x-google-max-bitrate=100000\\r\\n',\n    );\n\n    // Set max bitrate to highest bitrate Opus supports\n    let 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 ? 'stereo=0;' : '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    mungedSDP = mungedSDP?.replace('useinbandfec=1', audioSDP);\n\n    return mungedSDP;\n  }\n\n  /**\n   * Closes existing PeerConnection and DataChannel, resets negotiation state.\n   */\n  closePC() {\n    if (this.pcClient) {\n      Logger.warn('Closing existing PeerConnection');\n    }\n    this.pcClient?.close();\n    this.pcClient = null;\n\n    if (this.dcClient) {\n      Logger.warn('Closing existing DataChannel');\n    }\n    this.dcClient?.close();\n    this.dcClient = null;\n\n    this.remoteDescriptionSet = false;\n    this.iceCandidateBuffer.length = 0;\n  }\n\n  canSend() {\n    return this.dcClient && this.dcClient.readyState === 'open';\n  }\n\n  send(data: ArrayBuffer) {\n    if (this.canSend()) {\n      this.dcClient?.send(data);\n    } else {\n      Logger.colored(\n        'black',\n        'yellow',\n        `DataChannel connection not prepared or in state: ${this.dcClient?.readyState}`,\n      );\n\n      // Trigger peer reconnection if DC is not open and we're not yet reconnecting\n      this.tryReconnectOnSendFailure();\n    }\n  }\n\n  /**\n   * Attempts to reconnect the peer when send fails due to DataChannel not being open.\n   * This handles cases where the DC connection is broken, but no error events are fired.\n   */\n  private tryReconnectOnSendFailure() {\n    // Skip if already reconnecting or signaling is not connected\n    if (this.isReconnecting()) {\n      Logger.info(\n        '[Reconnect] Already reconnecting, skipping duplicate attempt',\n      );\n      return;\n    }\n\n    if (!this.signallingSrv.isConnected()) {\n      Logger.warn('[Reconnect] Cannot reconnect: Signaling not connected');\n      return;\n    }\n\n    // Check if DC exists but is in a non-open state (closing, closed, or connecting stuck)\n    const dcState = this.dcClient?.readyState;\n    if (dcState && dcState !== 'open') {\n      Logger.warn(\n        `[Reconnect] DataChannel in \"${dcState}\" state during send, initiating peer reconnection`,\n      );\n      this.store.dispatch(\n        reconnectPeer({ attempt: 1, maxAttempts: 3, delay: 0 }),\n      );\n    }\n  }\n\n  /**\n   * Reconnects only the WebRTC peer connection without re-establishing signaling.\n   * Closes the current PeerConnection and creates a new client-initiated offer\n   * through the existing WebSocket connection.\n   * @returns true if reconnection was initiated, false if signaling is not connected\n   */\n  reconnectPeer(): boolean {\n    if (!this.signallingSrv.isConnected()) {\n      Logger.error(\n        '[Reconnect] Cannot reconnect peer: Signaling not connected',\n      );\n      return false;\n    }\n\n    if (!this.cfg || Object.keys(this.cfg).length === 0) {\n      Logger.error('[Reconnect] Cannot reconnect peer: No config available');\n      return false;\n    }\n\n    Logger.info('[Reconnect] Initiating peer reconnection');\n\n    // Close only the PeerConnection, keep WebSocket alive\n    this.closePC();\n\n    // Create a new WebRTC offer using the stored config\n    void this.createWebRtcOffer();\n\n    return true;\n  }\n\n  private setConfig(parOptions = {} as ConfigMessage) {\n    const urlParams = new URLSearchParams(window.location.search);\n\n    //**********************\n    //Config setup\n    //**********************\n    this.cfg = { ...parOptions.peerConnectionOptions };\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 = urlParams.has('ForceMaxBundle')\n      ? 'max-bundle'\n      : 'balanced';\n\n    this.cfg.iceCandidatePoolSize = 1;\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    this.setupPeerConnection(this.cfg);\n  }\n\n  private handlePeerConnectionEvents(pcClient: RTCPeerConnection) {\n    fromEvent(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        this.commandTelemetryService.trackStopCommand(\n          'EXT-Signaling state change',\n          true,\n          { state, multi: true },\n        );\n      });\n\n    fromEvent(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        this.commandTelemetryService.trackStopCommand(\n          'EXT-Browser ICE connection',\n          true,\n          { state, multi: true },\n        );\n      });\n\n    fromEvent(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        this.commandTelemetryService.trackStopCommand(\n          'EXT-Browser ICE gathering',\n          true,\n          { state, multi: true },\n        );\n      });\n\n    fromEvent(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>(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((candidate) =>\n        this.signallingSrv.send({ type: 'iceCandidate', candidate }),\n      );\n\n    // When the server creates the DataChannel (server-offer flow),\n    // we receive it here via the 'datachannel' event\n    fromEvent<RTCDataChannelEvent>(pcClient, 'datachannel')\n      .pipe(\n        tap((e) =>\n          Logger.info(\n            `[DATACHANNEL] Received remote DC: label=\"${e.channel.label}\" id=${e.channel.id} protocol=\"${e.channel.protocol}\" ordered=${e.channel.ordered}`,\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>(pcClient, 'track').pipe(\n      takeUntil(this.disconnect$),\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      )\n      .subscribe((stream) => this.videoService.attachAudioStream(stream));\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      )\n      .subscribe((stream) => {\n        if (this.pcClient) {\n          this.videoService.attachVideoStream(stream, this.pcClient);\n        }\n      });\n  }\n\n  private async setupTransceiversAsync(pc: RTCPeerConnection): Promise<void> {\n    const hasTransceivers = pc.getTransceivers().length > 0;\n\n    // Set up a transceiver for getting UE video\n    pc.addTransceiver('video', { direction: 'recvonly' });\n\n    // Set up 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                if (track.kind && track.kind === 'audio') {\n                  await transceiver.sender.replaceTrack(track);\n                  transceiver.direction = 'sendrecv';\n                }\n              }\n            }\n          }\n        } else {\n          for (const track of stream.getTracks()) {\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      Logger.log(\n        `[DATACHANNEL] Setting up datachannel \"${datachannel.label}\" callbacks...`,\n      );\n      this.commandTelemetryService.trackStartCommand(\n        'EXT-DataChannel Connection',\n      );\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(\n          // Only dispatch disconnect if not already reconnecting to avoid infinite loops\n          filter(() => !this.isReconnecting()),\n          take(1),\n        )\n        .subscribe((e) => {\n          Logger.warn(\n            `[DATACHANNEL] Data channel disconnected: ${datachannel.label}(${datachannel.id})`,\n            e,\n          );\n          this.store.dispatch(\n            disconnectStream({\n              reason: DisconnectReason.DataChannelClosed,\n              message: 'DataChannelClosed',\n            }),\n          );\n        });\n\n      fromEvent(datachannel, 'error')\n        .pipe(takeUntil(this.disconnect$))\n        .subscribe((e) => {\n          const message = `[DATACHANNEL] Data channel \"${datachannel.label}\" error. id:${datachannel.id}`;\n          Logger.error(message, e);\n        });\n\n      fromEvent(datachannel, 'open')\n        .pipe(\n          tap(() => {\n            Logger.info(\n              `[DATACHANNEL] Data channel \"${datachannel.label}\" connected. id:${datachannel.id}`,\n            );\n          }),\n          takeUntil(this.disconnect$),\n        )\n        .subscribe(() => {\n          this.commandTelemetryService.trackStopCommand(\n            'EXT-DataChannel Connection',\n          );\n          this.onDataChannelConnected();\n        });\n\n      fromEvent<MessageEvent>(datachannel, 'message')\n        .pipe(\n          /* tap((e: MessageEvent) => {\n            const view = new Uint8Array(e.data);\n            Logger.info(\n              `[DATACHANNEL] Message received on \"${datachannel.label}\" id=${datachannel.id}, byteCode=${view[0]}, size=${view.byteLength}`,\n            );\n          }),*/\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 statusMessage = 'Session connected, video stream starting.';\n    if (navigator.userAgent.includes('Firefox')) {\n      statusMessage +=\n        '\\n If you are experiencing connection problems please try Google Chrome';\n    }\n    this.store.dispatch(dataChannelConnected({ statusMessage }));\n  }\n\n  /**\n   * Creates an SDP offer, applies SDP munging, sets it as a local description,\n   * and sends it to the server via signaling.\n   * Transceivers already configure media directions, so deprecated\n   * offerToReceive* options are not used.\n   */\n  private async createOffer(pcClient: RTCPeerConnection): Promise<void> {\n    try {\n      const offer = await pcClient.createOffer();\n      offer.sdp = this.mungeSDP(offer.sdp ?? '');\n      await pcClient.setLocalDescription(offer);\n      this.signallingSrv.send(offer);\n    } catch {\n      Logger.error(\"Couldn't create offer\");\n    }\n  }\n\n  /**\n   * Creates an SDP answer, applies SDP munging, sets it as a local description,\n   * and sends it to the server via signaling.\n   */\n  private async createAnswer(pcClient: RTCPeerConnection): Promise<void> {\n    try {\n      const answer = await pcClient.createAnswer();\n      answer.sdp = this.mungeSDP(answer.sdp ?? '');\n      await pcClient.setLocalDescription(answer);\n      this.signallingSrv.send(answer);\n      // Observability signal for the signaling waterfall — the handshake\n      // went \"answer sent\" between `offer received` and `datachannel_ready`.\n      this.store.dispatch(answerSent());\n    } catch (e) {\n      Logger.error(\"Couldn't create answer\", e);\n    }\n  }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const deepEqual = (a: any, b: any) => {\n  if (a === b) return true;\n\n  // must both be objects (and not null)?\n  if (\n    typeof a === 'object' &&\n    a !== null &&\n    typeof b === 'object' &&\n    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 { filter } from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { unrealFeature } from '../store';\nimport { Subject } from 'rxjs';\nimport type { ReceivedMimeType } from '../interfaces/ReceivedMimeTypes';\nimport { UNREAL_CONFIG } from '../constants';\n\nexport class FileReceiverService extends SubService {\n  public fileComplete$ = new Subject<ReceivedFile>();\n\n  private valid = false;\n  private chunks = 0;\n  private mimetype = '' as ReceivedMimeType;\n  private receiving = false;\n  private extension = '';\n  private data: Uint8Array<ArrayBuffer>[] = [];\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n\n  constructor() {\n    super();\n    this.init();\n  }\n\n  protected init() {\n    if (this.unrealConfig?.playwright) {\n      return;\n    }\n    this.store\n      .select(unrealFeature.selectViewportReady)\n      .pipe(filter(Truthy))\n      .subscribe(() => this.reset());\n  }\n\n  public reset() {\n    this.mimetype = '' as ReceivedMimeType;\n    this.extension = '';\n    this.receiving = false;\n    this.valid = false;\n    this.chunks = 0;\n    this.data = [];\n  }\n\n  private resetOnStart() {\n    this.reset();\n    this.receiving = true;\n  }\n\n  /**\n   * Processes a file extension when received over data channel\n   * @param view - the file extension data\n   */\n  setExtensionFromBytes(view: Uint8Array) {\n    // Reset this if we got a file message and we are not \"receiving\" it yet\n    if (!this.receiving) {\n      this.resetOnStart();\n    }\n\n    //Logger.info(extensionAsString);\n    this.extension = new TextDecoder('utf-16').decode(view.slice(1));\n  }\n\n  /**\n   * Processes a file mime type when received over data channel\n   * @param view - the file mime type data\n   */\n  setMimeTypeFromBytes(view: Uint8Array) {\n    // Reset this if we got a file message and we are not \"receiving\" it yet\n    if (!this.receiving) {\n      this.resetOnStart();\n    }\n\n    const mimeAsString = new TextDecoder('utf-16').decode(view.slice(1));\n    // Logger.info(mimeAsString);\n    this.mimetype = mimeAsString as ReceivedMimeType;\n  }\n\n  /*-------------------------------------------------------------------------------------------*/\n\n  public setContentsFromBytes(view: Uint8Array) {\n    // If we haven't received the initial setup instructions, return\n    if (!this.receiving) return;\n\n    const typeSize = 1;\n    const intSize = 4;\n    const maxMessageSize = 16 * 1024;\n    const headerSize = typeSize + intSize;\n    const maxPayloadSize = maxMessageSize - headerSize;\n\n    // Calculate the total number of chunks from the total this size\n    this.chunks = Math.ceil(\n      new DataView(view.slice(typeSize, headerSize).buffer).getInt32(0, true) /\n        maxPayloadSize,\n    );\n\n    // Get the file part of the payload\n    const thisBytes = view.slice(headerSize);\n\n    // Append to existing data that holds this\n    this.data.push(thisBytes);\n\n    // Uncomment for debug\n    // Logger.info(`Received this chunk: ${this.data.length}/${this.chunks}`);\n\n    if (this.data.length === this.chunks) {\n      this.receiving = false;\n      this.valid = true;\n      /*Logger.info('Received complete file');\n      const transferDuration = new Date().getTime() - this.timestampStart;\n      const transferBitrate = Math.round(\n        (this.chunks * maxMessageSize) / transferDuration,\n      );\n      Logger.info(\n        `Average transfer bitrate: ${transferBitrate}kb/s over ${transferDuration / 1000} seconds`,\n      );*/\n\n      /**\n       * Reconstruct the file\n       * This code reconstructs the received data into the original this based on the mime type and extension provided\n       */\n      const blob = new Blob([...this.data], { type: this.mimetype });\n      this.fileComplete$.next({\n        blob,\n        mimetype: this.mimetype,\n        extension: this.extension,\n        valid: this.valid,\n      });\n      this.reset();\n    } else if (this.data.length > this.chunks) {\n      Logger.error(\n        `Received bigger this than advertised: ${this.data.length}/${this.chunks}`,\n      );\n      this.reset();\n    }\n  }\n}\nexport interface ReceivedFile {\n  blob: Blob;\n  mimetype: ReceivedMimeType;\n  extension: string;\n  valid: boolean;\n}\n","import { COLOR_CODES, Logger, Truthy, where } from '@3dsource/utils';\nimport { inject, Injectable } from '@angular/core';\nimport { merge } from 'rxjs';\nimport { distinctUntilChanged, filter, takeUntil } from 'rxjs/operators';\nimport {\n  ControlScheme,\n  InputOptions,\n  SCREEN_LOCKER_CONTAINER_ID,\n  ToClientMessage,\n  UNREAL_CONFIG,\n} from '../constants';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { VideoService } from './video.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport {\n  selectStreamConfig,\n  showUnrealErrorMessage,\n  unrealCommandCallback,\n  unrealFeature,\n} from '../store';\nimport { decodeData } from '../helpers';\nimport type { UnrealCommands } from '@3dsource/types-unreal';\nimport { deepEqual } from '../helpers/deepEqual';\nimport { SubService } from './sub.service';\nimport { FileReceiverService } from './file-receiver.service';\n\nconst filteredLogs = [\n  {\n    command: 'onChangeSequence',\n  },\n];\n\n@Injectable()\nexport class AggregatorService extends SubService {\n  private readonly selectStreamConfig =\n    this.store.selectSignal(selectStreamConfig);\n  private readonly videoService = inject(VideoService);\n  private readonly webrtcPlayer = inject(WebRtcPlayerService);\n  private readonly freezeFrame = inject(FreezeFrameService);\n  private readonly fileReceiver = inject(FileReceiverService);\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n  private readonly responseEventListeners = new Map<\n    string,\n    (data: unknown) => void\n  >();\n\n  /**\n   * Never called for now\n   */\n  constructor() {\n    super();\n    this.init();\n  }\n\n  protected init() {\n    if (this.unrealConfig?.playwright) {\n      return;\n    }\n    this.listenWebRTC();\n    this.initialize();\n  }\n\n  protected listenWebRTC() {\n    this.webrtcPlayer.onDataChannelMessage$\n      .pipe(takeUntil(this.destroy$))\n      .subscribe((data) => this.dataChannelMessageHandler(data));\n  }\n\n  protected initialize() {\n    this.store\n      .select(unrealFeature.selectCirrusConnected)\n      .pipe(distinctUntilChanged())\n      .subscribe((connected) => {\n        this.resetResponseList();\n        if (connected) {\n          this.startListenCallbacks();\n        }\n      });\n\n    const unlockViewport$ = this.store\n      .select(unrealFeature.selectViewportReady)\n      .pipe(filter(Truthy));\n\n    merge(unlockViewport$, 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 = ControlScheme.HoveringMouse;\n  }\n\n  private addResponseEventListener(\n    name: string,\n    listener: (data: unknown) => void,\n  ) {\n    this.responseEventListeners.set(name, listener);\n  }\n\n  private 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  private removeLoadScreen() {\n    document\n      .getElementById(\n        this.unrealConfig?.screenLockerContainerId ||\n          SCREEN_LOCKER_CONTAINER_ID,\n      )\n      ?.remove();\n  }\n\n  private startListenCallbacks() {\n    Logger.info('Start Listen Unreal Callbacks');\n    let previousJson: unknown = null;\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(\n              showUnrealErrorMessage({ code: json.code, error: json?.error }),\n            );\n          } else {\n            this.showMessageFromUnreal(json);\n            previousJson = json;\n\n            this.store.dispatch(unrealCommandCallback({ 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  private resetResponseList() {\n    this.responseEventListeners.clear();\n  }\n\n  private dataChannelMessageHandler(data: ArrayBuffer) {\n    const view = new Uint8Array(data);\n    const anyData = data.slice(1);\n\n    if (this.freezeFrame.receiving) {\n      this.freezeFrame.setData(view);\n      return;\n    }\n\n    switch (view[0]) {\n      case ToClientMessage.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 ToClientMessage.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 ToClientMessage.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      case ToClientMessage.FileExtension:\n        Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileExtension');\n        this.fileReceiver.setExtensionFromBytes(view);\n        break;\n\n      case ToClientMessage.FileMimeType:\n        Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileMimeType');\n        this.fileReceiver.setMimeTypeFromBytes(view);\n        break;\n\n      case ToClientMessage.FileContents:\n        Logger.colored(...COLOR_CODES.FROM_UNREAL, 'FileContents');\n        this.fileReceiver.setContentsFromBytes(view);\n        break;\n\n      case ToClientMessage.FreezeFrame:\n        Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Freeze frame');\n        this.freezeFrame.start(view);\n        break;\n\n      case ToClientMessage.UnfreezeFrame:\n        Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Un-Freeze frame');\n        this.freezeFrame.invalidate();\n        break;\n\n      case ToClientMessage.VideoEncoderAvgQP:\n        this.videoService.setEncoder(anyData);\n        break;\n\n      case ToClientMessage.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.videoService.setLatencyTimings(latencyTimings);\n        break;\n      }\n\n      case ToClientMessage.InitialSettings:\n        Logger.colored(\n          ...COLOR_CODES.FROM_UNREAL,\n          'InitialSettings message :',\n          JSON.parse(decodeData(anyData)),\n        );\n        break;\n\n      case ToClientMessage.Protocol:\n        Logger.colored(\n          ...COLOR_CODES.FROM_UNREAL,\n          'Protocol message :',\n          JSON.parse(decodeData(anyData)),\n        );\n        break;\n\n      case ToClientMessage.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","import { inject, Injectable } from '@angular/core';\nimport {\n  changeLowBandwidth,\n  disconnectStream,\n  dropDC,\n  dropPC,\n  setConfig,\n  setMaxFps,\n  unrealFeature,\n} from '../store';\nimport { of, switchMap, take } from 'rxjs';\nimport { HttpClient } from '@angular/common/http';\nimport { Logger } from '@3dsource/utils';\nimport { catchError, filter } from 'rxjs/operators';\nimport {\n  DevModeService,\n  SubService,\n  UnrealCommunicatorService,\n} from '../services';\nimport { DisconnectReason } from '../interfaces';\nimport { MetaBoxCommand } from '@3dsource/types-unreal';\nimport { UNREAL_CONFIG } from '../constants';\n\ninterface CustomWindow extends Window {\n  emitUIInteraction?: (data: unknown) => void;\n  emitCommand?: (data: unknown) => void;\n  dropConnection?: (data: unknown) => void;\n  dropDC?: (data: unknown) => void;\n  dropPC?: (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  setResolution?: (data: { w: number; h: number }) => void;\n}\n\ndeclare let window: CustomWindow;\n\n@Injectable()\nexport class ConsoleExtensionsService extends SubService {\n  #httpClient = inject(HttpClient);\n  #commandsSender = inject(UnrealCommunicatorService);\n  #isDevMode = inject(DevModeService).isDevMode;\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n\n  constructor() {\n    super();\n    this.init();\n\n    // Clean up window properties on destroyRef\n    this.destroyRef.onDestroy(() => {\n      if (!this.#isDevMode) {\n        return;\n      }\n      window.dropConnection = undefined;\n      window.dropDC = undefined;\n      window.dropPC = undefined;\n      window.setResolution = undefined;\n      window.toggleBandwidth = undefined;\n      window.setMaxFps = undefined;\n      window.restartApp = undefined;\n      window.unrealHelp = undefined;\n      window.setWarnTime = undefined;\n    });\n  }\n\n  protected init() {\n    if (!this.#isDevMode || this.unrealConfig?.playwright) {\n      return;\n    }\n    window.dropConnection = () => {\n      this.store.dispatch(\n        disconnectStream({\n          reason: DisconnectReason.DropConnection,\n          message: 'Manual Console Drop',\n        }),\n      );\n      return true;\n    };\n\n    window.dropDC = () => {\n      this.store.dispatch(dropDC());\n      return true;\n    };\n\n    window.dropPC = () => {\n      this.store.dispatch(dropPC());\n      return true;\n    };\n\n    window.setResolution = ({ w, h }) => {\n      this.#commandsSender.sendCommandToUnreal({\n        command: MetaBoxCommand.FChangeResolutionCommand,\n        payload: { resolution: { x: w, y: h } },\n      });\n      return 'LowBandwidth => toggled';\n    };\n\n    window.toggleBandwidth = () => {\n      this.store\n        .select(unrealFeature.selectLowBandwidth)\n        .pipe(take(1))\n        .subscribe((isLow) =>\n          this.store.dispatch(changeLowBandwidth({ lowBandwidth: !isLow })),\n        );\n      return 'LowBandwidth => toggled';\n    };\n    window.setMaxFps = (maxFps: number) => {\n      this.store.dispatch(setMaxFps({ maxFps }));\n      return `Max Fps Set to ${maxFps}`;\n    };\n    window.restartApp = () => {\n      this.store\n        .select(unrealFeature.selectAwsInstance)\n        .pipe(\n          take(1),\n          filter((data) => !!data.instanceName),\n          switchMap((data) =>\n            this.#httpClient.get(`//${data.instanceName}/restartapp`),\n          ),\n          catchError(() => of(null)),\n        )\n        .subscribe();\n    };\n    window.unrealHelp = () => this.unrealHelp();\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 { 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    if (value) {\n      localStorage.setItem('devMode', value.toString());\n    } else {\n      localStorage.removeItem('devMode');\n    }\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\nimport { Subject } from 'rxjs';\nimport { CommandTelemetryService } from './command-telemetry.service';\nimport type { MessageTypeValues } from '../constants';\nimport { MessageType, UNREAL_CONFIG } from '../constants';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { COLOR_CODES, generateUuid, Logger } from '@3dsource/utils';\nimport {\n  commandStarted,\n  dataChannelConnected,\n  resetAfk,\n  unrealFeature,\n} from '../store';\nimport { Store } from '@ngrx/store';\nimport { Actions, ofType } from '@ngrx/effects';\n\n@Injectable()\nexport class UnrealCommunicatorService {\n  private store = inject(Store);\n  private actions$ = inject(Actions);\n  private commandTelemetryService = inject(CommandTelemetryService);\n  private webRtcPlayerService = inject(WebRtcPlayerService);\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n  private destroy$ = new Subject<void>();\n  private cirrusConnected = this.store.selectSignal(\n    unrealFeature.selectCirrusConnected,\n  );\n  private readonly afkIgnoredCommands = new Set(['executeConsoleCommand']);\n  private skipAfkReset = false;\n\n  constructor() {\n    this.init();\n  }\n\n  protected init() {\n    this.isPlaywrightMode();\n    this.emitUIInteraction = this.commandTelemetryService.decorate(\n      this.emitUIInteraction.bind(this),\n    );\n    // Listen to the dataChannelConnected ACTION (point-in-time event) instead\n    // of the store selector. The selector reads the current state and can fire on\n    // stale `true` from a previous session when switching components (Angular\n    // creates the new component before destroying the old one).\n    this.actions$.pipe(ofType(dataChannelConnected)).subscribe(() => {\n      this.requestInitialSettings();\n      this.requestQualityControl();\n    });\n  }\n\n  destroy() {\n    this.destroy$.next();\n    // Recreate the Subject so it remains usable for the next session.\n    // A completed Subject silently ignores all future next/complete calls.\n    this.destroy$ = new Subject<void>();\n  }\n\n  sendCommandToUnreal(data: MetaBoxCommandPacket) {\n    this.isPlaywrightMode();\n    if (this.webRtcPlayerService.canSend()) {\n      const uniqId = data?.correlationId ?? generateUuid();\n      const sendData: MetaBoxCommandPacket = { ...data, correlationId: uniqId };\n      Logger.colored(...COLOR_CODES.TO_UNREAL, sendData);\n\n      if (this.afkIgnoredCommands.has(data.command as string)) {\n        this.skipAfkReset = true;\n      }\n\n      this.emitUIInteraction(sendData);\n      this.skipAfkReset = false;\n\n      this.store.dispatch(\n        commandStarted({ id: uniqId, command: data.command as string }),\n      );\n    }\n  }\n\n  emitUIInteraction(descriptor: MetaBoxCommandPacket) {\n    this.emitDescriptor(MessageType.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(MessageType.Command, descriptor);\n  }\n\n  sendInputData(data: ArrayBuffer) {\n    this.isPlaywrightMode();\n    try {\n      if (!this.skipAfkReset) {\n        this.store.dispatch(resetAfk());\n      }\n      this.webRtcPlayerService.send(data);\n    } catch (error) {\n      if (this.cirrusConnected()) {\n        Logger.error(error);\n      }\n    }\n  }\n\n  isPlaywrightMode() {\n    if (this.unrealConfig?.playwright) {\n      return;\n    }\n  }\n\n  private emitDescriptor(\n    messageType: MessageTypeValues,\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([MessageType.RequestInitialSettings]).buffer,\n    );\n  }\n\n  private requestQualityControl() {\n    this.sendInputData(\n      new Uint8Array([MessageType.RequestQualityControl]).buffer,\n    );\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} from '../interfaces';\nimport type { MessageTypeValues } from '../constants';\nimport {\n  InputOptions,\n  MessageType,\n  MouseButton,\n  MouseButtonsMask,\n  SpecialKeyCodes,\n  UNREAL_CONFIG,\n} from '../constants';\nimport type { Observable } from 'rxjs';\nimport { fromEvent, merge, startWith, Subject, takeUntil } from 'rxjs';\nimport {\n  debounceTime,\n  distinctUntilChanged,\n  filter,\n  map,\n} from 'rxjs/operators';\nimport { inject } from '@angular/core';\nimport { fromResizeObserver } from '../helpers';\nimport { UnrealCommunicatorService } from './unreal-communicator.service';\nimport { DevModeService, SubService, VideoService } from '../services';\nimport { unrealFeature, videoAdaptedToContainer } from '../store';\nimport { ofType } from '@ngrx/effects';\n\nconst INITIAL_FINGER_IDS = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] as const;\n\nexport class InputService extends SubService {\n  private commandsSender = inject(UnrealCommunicatorService);\n  private isDevMode = inject(DevModeService).isDevMode;\n  private videoService = inject(VideoService);\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\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\n  private normalizeAndQuantizeSigned!: (\n    x: number,\n    y: number,\n  ) => NormalizeAndQuantizeSignedValue;\n\n  videoBoundingRect: DOMRect = new DOMRect(0, 0, 1, 1);\n  fingerIds = new Map();\n  maxByteValue = 255;\n  fingers = [...INITIAL_FINGER_IDS];\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    this.init();\n  }\n\n  protected init() {\n    if (this.unrealConfig?.playwright) {\n      return;\n    }\n    const visibilityHiddenTrigger$ = fromEvent(\n      document,\n      'visibilitychange',\n    ).pipe(\n      map(() => document.visibilityState === 'hidden'),\n      filter(Truthy),\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    merge(\n      visibilityVisibleTrigger$,\n      this.store.select(unrealFeature.selectViewportReady).pipe(filter(Truthy)),\n    )\n      .pipe(filter(() => !!this.video))\n      .subscribe(() => this.setup());\n  }\n\n  useKeyboardKeys(keys: IKeyCode[]) {\n    this.availableKeys = keys || [];\n  }\n\n  get video() {\n    return this.videoService.video;\n  }\n\n  private setup() {\n    const video = this.video;\n    if (!video) {\n      return;\n    }\n    this.options = InputOptions;\n    this.reInit$.next();\n\n    // Reset touch state to prevent stale identifiers across sessions\n    this.fingerIds.clear();\n    this.fingers = [...INITIAL_FINGER_IDS];\n\n    merge(\n      fromResizeObserver(video),\n      this.actions$.pipe(ofType(videoAdaptedToContainer)),\n    )\n      .pipe(debounceTime(300), takeUntil(this.deactivatedVideoTrigger$))\n      .subscribe(() => this.setupNormalizeAndQuantize(video));\n\n    this.setupNormalizeAndQuantize(video);\n    this.registerInputs(video);\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      // 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(video: HTMLVideoElement) {\n    merge(\n      this.store\n        .select(unrealFeature.selectLowBandwidth)\n        .pipe(distinctUntilChanged(), filter(Truthy)),\n      fromEvent(window, 'blur'),\n    )\n      .pipe(\n        filter(() => !!video),\n        takeUntil(this.deactivatedVideoTrigger$),\n      )\n      .subscribe(() => this.releaseMouseButtons(255, 0, 0));\n\n    this.registerMouseEnterAndLeaveEvents(video);\n    this.registerHoveringMouseEvents(video);\n    this.registerKeyboardEvents(this.availableKeys);\n    this.registerTouchEvents(video);\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 identifiers');\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: MessageTypeValues, 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(MessageType.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(MessageType.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        emitTouchData(MessageType.TouchMove, e.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, MessageType.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, MessageType.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, MessageType.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, MessageType.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    // 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, MessageType.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, MessageType.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    // Use RxJS fromEvent with takeUntil to properly clean up subscriptions\n    fromEvent<KeyboardEvent>(document, 'keydown')\n      .pipe(takeUntil(this.deactivatedVideoTrigger$))\n      .subscribe((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            MessageType.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          const data = new DataView(new ArrayBuffer(3));\n          data.setUint8(0, MessageType.KeyPress);\n          data.setUint16(1, SpecialKeyCodes.BackSpace, true);\n          this.sendInputData(data.buffer);\n        }\n        if (\n          this.options.suppressBrowserKeys &&\n          this.isKeyCodeBrowserKey(e.keyCode)\n        ) {\n          e.preventDefault();\n        }\n      });\n\n    fromEvent<KeyboardEvent>(document, 'keyup')\n      .pipe(takeUntil(this.deactivatedVideoTrigger$))\n      .subscribe((e) => {\n        if (filter(e)) {\n          return;\n        }\n        this.sendInputData(\n          new Uint8Array([MessageType.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    fromEvent<KeyboardEvent>(document, 'keypress')\n      .pipe(takeUntil(this.deactivatedVideoTrigger$))\n      .subscribe((e) => {\n        if (filter(e)) {\n          return;\n        }\n        const data = new DataView(new ArrayBuffer(3));\n        data.setUint8(0, MessageType.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}\n\ntype Clickable = HTMLVideoElement & {\n  releaseMouseButtons: (e: MouseEvent) => void;\n  pressMouseButtons: (e: MouseEvent) => void;\n};\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Store } from '@ngrx/store';\nimport { from, of, switchMap } from 'rxjs';\nimport { catchError, map, tap } from 'rxjs/operators';\nimport { Semaphore, tapLog } from '@3dsource/utils';\nimport { UNREAL_CONFIG } from '../constants';\nimport {\n  regionPingFetchEnd,\n  regionPingFetchStart,\n  regionResolved,\n} from '../store';\n\n@Injectable()\nexport class RegionsPingService {\n  private httpClient = inject(HttpClient);\n  private store = inject(Store);\n  private unrealInitialConfig = inject(UNREAL_CONFIG, { optional: true });\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  ) {\n    // Self-announce every lifecycle waypoint of the region-discovery\n    // flow (start / providers-fetched / resolved). The final\n    // `regionResolved` forwards the winner's full ping-sample array\n    // straight from `PingResult.result` — no aggregation.\n    this.store.dispatch(regionPingFetchStart());\n    return this.getProviders(regionListUrl).pipe(\n      tap(() => this.store.dispatch(regionPingFetchEnd())),\n      switchMap((providers: ProvidersData) => this.getPingResult(providers)),\n      catchError(() => of(null)),\n      tapLog('PingResult'),\n      tap((data) =>\n        this.store.dispatch(\n          regionResolved({\n            region: data?.region_code ?? '',\n            pingsMs: data?.result ?? [],\n          }),\n        ),\n      ),\n      map((data) => data?.region_code),\n    );\n  }\n\n  public getPingResult(providers: ProvidersData) {\n    const regions = providers.regions;\n    this.config.ping_timeout = providers.timeout || this.config.ping_timeout;\n    return from(this.startPinging(regions));\n  }\n\n  public getProviders(\n    regionList = this.unrealInitialConfig?.regionsPingUrl || '',\n  ) {\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      } catch {\n        //Do not remove this block, else finally will not work!\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: RequestInit = {},\n    timeout: number,\n  ) {\n    const controller = new AbortController();\n    options.signal = controller.signal;\n    const timeoutId = setTimeout(\n      () =>\n        controller.abort(new DOMException('Request timed out', 'TimeoutError')),\n      timeout,\n    );\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","import { Store } from '@ngrx/store';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { inject, Injectable } from '@angular/core';\nimport { asyncScheduler, type Observable, throttleTime } from 'rxjs';\nimport {\n  filter,\n  map,\n  startWith,\n  switchMap,\n  take,\n  withLatestFrom,\n} from 'rxjs/operators';\nimport { initSignalling, trackMixpanelEvent, unrealFeature } from '../store';\nimport type {\n  AggregatedStat,\n  AwsInstance,\n  InboundVideoStats,\n  LBMStats,\n} from '../interfaces';\nimport { VideoService } from './video.service';\nimport { UNREAL_CONFIG } from '../constants';\n\ninterface MapEventDataParams {\n  data: AggregatedStat;\n  signalingServer: AwsInstance;\n  isLowBandwidth: boolean;\n  lbmStats: LBMStats | undefined;\n  startTimeUtc: string;\n  signalingReadyTime: number | undefined;\n  viewPortReadyTime: number | undefined;\n}\n\n@Injectable()\nexport class StreamStatusTelemetryService {\n  private readonly store = inject(Store);\n  private readonly actions$ = inject(Actions);\n  private readonly videoService = inject(VideoService);\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n\n  constructor() {\n    this.init();\n  }\n\n  protected init() {\n    if (this.unrealConfig?.playwright) {\n      return;\n    }\n    // Start a telemetry session on every `initSignalling` dispatch.\n    // switchMap cancels the previous session's inner pipeline on re-init.\n    // throttleTime leading+trailing emits the first event immediately and\n    // at most one event every 5s afterward.\n    this.actions$\n      .pipe(\n        ofType(initSignalling),\n        switchMap(() => {\n          // Captured once per session — marks the UTC moment signaling started.\n          const startedAt = Date.now();\n          const startTimeUtc = new Date(startedAt).toISOString();\n          const signalingReadyTime$ = this.readyTimeSince(\n            this.store.select(unrealFeature.selectCirrusConnected),\n            startedAt,\n          );\n          const viewPortReadyTime$ = this.readyTimeSince(\n            this.store.select(unrealFeature.selectViewportReady),\n            startedAt,\n          );\n          return this.videoService.videoStats$.pipe(\n            throttleTime(5000, asyncScheduler, {\n              leading: true,\n              trailing: true,\n            }),\n            withLatestFrom(\n              this.store.select(unrealFeature.selectAwsInstance),\n              this.store.select(unrealFeature.selectLowBandwidth),\n              this.store.select(unrealFeature.selectLowBandwidthStats),\n              signalingReadyTime$,\n              viewPortReadyTime$,\n            ),\n            map(\n              ([\n                data,\n                signalingServer,\n                isLowBandwidth,\n                lbmStats,\n                signalingReadyTime,\n                viewPortReadyTime,\n              ]) =>\n                this.mapEventData({\n                  data,\n                  signalingServer,\n                  isLowBandwidth,\n                  lbmStats,\n                  startTimeUtc,\n                  signalingReadyTime,\n                  viewPortReadyTime,\n                }),\n            ),\n          );\n        }),\n      )\n      .subscribe((data) => this.trackEventToMixPanel(data));\n  }\n\n  /**\n   * Emits `undefined` until `readyState$` first emits a truthy value,\n   * then emits the ms elapsed since `startedAt` and completes.\n   * Used with `withLatestFrom` so events carry a stable duration for the whole session.\n   */\n  private readyTimeSince(\n    readyState$: Observable<boolean>,\n    startedAt: number,\n  ): Observable<number | undefined> {\n    return readyState$.pipe(\n      filter(Boolean),\n      take(1),\n      map(() => Date.now() - startedAt),\n      startWith<number | undefined>(undefined),\n    );\n  }\n\n  private mapEventData(params: MapEventDataParams) {\n    const {\n      data,\n      signalingServer,\n      isLowBandwidth,\n      lbmStats,\n      startTimeUtc,\n      signalingReadyTime,\n      viewPortReadyTime,\n    } = params;\n\n    const {\n      bitrate,\n      VideoEncoderQP,\n      framesPerSecond,\n      frameWidth,\n      frameHeight,\n      jitter,\n      packetsLost,\n      currentRoundTripTime,\n      runTime,\n    } = data.aggregatedStats;\n\n    return {\n      startTimeUtc,\n      signalingReadyTime,\n      viewPortReadyTime,\n      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 trackEventToMixPanel(data: Partial<InboundVideoStats>) {\n    this.store.dispatch(trackMixpanelEvent({ event: 'streamStatus', data }));\n  }\n}\n","import { Store } from '@ngrx/store';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { inject, Injectable } from '@angular/core';\nimport {\n  bufferTime,\n  filter,\n  fromEvent,\n  map,\n  type Observable,\n  pairwise,\n  scan,\n  startWith,\n  Subscription,\n  switchMap,\n  take,\n  withLatestFrom,\n} from 'rxjs';\nimport {\n  answerSent,\n  commandCompleted,\n  commandStarted,\n  initSignalling,\n  instanceReady,\n  pollingEnded,\n  pollingStarted,\n  regionPingFetchEnd,\n  regionPingFetchStart,\n  regionResolved,\n  setAwsInstance,\n  setMaxFps,\n  setOrchestrationParameters,\n  trackTelemetryData,\n  unrealFeature,\n} from '../store';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { AggregatedStat } from '../interfaces';\nimport { VideoService } from './video.service';\nimport { SignallingService } from './signalling.service';\nimport { UNREAL_CONFIG } from '../constants';\n\n/**\n * Pro-grade telemetry for the WebRTC stream lifecycle.\n *\n * Wire-level event taxonomy (intentionally small — all phase-specific\n * detail rides inside `stream.phase_ended`'s payload):\n *  - `stream.session_started`   — once per session, on `initSignalling`\n *  - `stream.phase_ended`       — once per closer in {@link phaseCatalog};\n *                                 carries phaseNo / label / color /\n *                                 milestones / params / overlays\n *  - `stream.sample`            — every 5s, window-aggregated (p50/p95/min/max)\n *  - `stream.quality_degraded`  — on QP entering `red` (>35)\n *  - `stream.quality_recovered` — on QP leaving `red`\n *  - `stream.fps_low`           — when window FPS p50 < 70% of target\n *  - `stream.session_ended`     — once per session, on disconnect/pagehide/restart\n *\n * Every event carries `sessionId` + `userId`. Samples carry a monotonic\n * `seq` for server-side ordering & dedup. Durations use `performance.now()`\n * — immune to wall-clock jumps.\n *\n * NOTE: For `stream.session_ended` on tab close to survive teardown,\n * the Mixpanel client must be configured with `api_transport: 'sendBeacon'`.\n */\ntype EndReason = 'disconnected' | 'pagehide' | 'restart';\n\n/**\n * Statistical summary of a time-series metric (bitrate, fps, qp, jitter, rtt)\n * over a single aggregation window (default: 5 seconds, ~20 samples at 250ms).\n *\n * Each field answers a different question about the distribution within the\n * window. Together they describe the *shape* of the data, not just one number.\n *\n * ## Why aggregates instead of a single value\n *\n * The raw stream emits ~20 samples per 5s window. Reporting only the last\n * value (e.g. `throttleTime(5000)`) is fragile: one unlucky tick at the\n * window boundary can flip the signal. A single `mean` is also misleading,\n * because one big outlier can drag it far from the typical value.\n * Percentiles + extremes give a stable, outlier-resistant view.\n *\n * ## Example\n *\n * Suppose the bitrate (bits/s) sampled over 5s is:\n * ```\n * [8M, 9M, 10M, 10M, 11M, 11M, 11M, 12M, 12M, 12M,\n *  12M, 12M, 13M, 13M, 13M, 13M, 13M, 14M, 14M, 20M]\n * ```\n * The resulting {@link WindowAggregate} is:\n * ```\n * { p50: 12_000_000, p95: 14_000_000, min: 8_000_000, max: 20_000_000 }\n * ```\n *\n * ## How to read each field\n *\n * | Field | Question it answers                                    |\n * |-------|--------------------------------------------------------|\n * | p50   | \"What does the typical tick look like?\"                |\n * | p95   | \"How bad is the bad tail that users notice?\"           |\n * | min   | \"Was there any catastrophic dip in this window?\"       |\n * | max   | \"Was there any peak / did we reach the target at all?\" |\n *\n * ## Why p50 instead of mean\n *\n * Mean is sensitive to outliers. Example FPS series `[60,60,60,60,60,60,60,60,60,5]`:\n * - mean ≈ 54.5 (looks fine)\n * - p50  = 60   (truth: 9 of 10 ticks are perfect)\n * - min  = 5    (but one tick collapsed)\n *\n * Mean smears the bad tick across the whole window. p50 reports the typical\n * case, `min` surfaces the worst, so together they describe reality.\n *\n * ## Why p95 instead of max\n *\n * `max` is a single tick — can be random noise (a 250ms glitch). `p95` is\n * \"the bad tail you consistently see\" and is what users actually perceive\n * as lag / freezes. For SLOs and alerting, use p95/p99 — not max.\n *\n * ## Dashboard / alerting hints\n *\n * - `bitrate.p50` → typical throughput over time\n * - `fps.p95 < 40` → 5% of the time the frame rate is poor (user-visible)\n * - `qp.max > 35` in a sliding window → quality spikes to investigate\n * - `fps.min` → worst single tick, useful for freeze detection\n */\ninterface WindowAggregate {\n  /**\n   * 50th percentile (median): value below which 50% of samples fall.\n   * The \"typical\" value in the window — robust to outliers.\n   * Use this as the primary signal on dashboards.\n   */\n  p50: number;\n\n  /**\n   * 95th percentile: value below which 95% of samples fall.\n   * Describes the \"bad tail\" — the worst 5% of ticks. This is what\n   * users perceive as lag / freezes. Preferred metric for SLOs and alerts.\n   */\n  p95: number;\n\n  /**\n   * Minimum sample in the window — the single worst tick observed.\n   * Surfaces catastrophic dips (e.g. a single-frame freeze) that p50/p95\n   * would smooth out. Noisy on its own; useful alongside p95.\n   */\n  min: number;\n\n  /**\n   * Maximum sample in the window — the single best tick observed.\n   * Shows whether the system ever reached the target (e.g. \"did FPS ever\n   * touch 60?\"). Like `min`, one-tick noisy; use for ceiling / headroom checks.\n   */\n  max: number;\n}\n\n// ──────────────────────────────────────────────────────────────────\n// Milestone catalog\n//\n// The single declarative source for everything this service tracks\n// beyond the four lifecycle boundaries (session_started / signaling /\n// datachannel / viewport). Each entry binds a *name* + *label* + *phase*\n// to an Observable that fires when the milestone happens — pass an\n// NgRx action stream, a `SignallingService` Subject, or any custom\n// Observable you construct.\n//\n// Adding a new milestone = one entry in this array. The viewer receives\n// the label inside each event payload, so it needs no parallel map.\n// ──────────────────────────────────────────────────────────────────\n\n/** Wire-format milestone — minimal by design. The viewer never inspects\n *  milestone names as identifiers. */\nexport interface EmittedMilestone {\n  readonly label: string;\n  readonly time: number;\n}\n\n/**\n * Selected WebRTC ICE candidate pair, pulled off {@link AggregatedStat}.\n * The closer for the viewport phase flattens this to two `PhaseParam`\n * rows (`localCandidate`, `remoteCandidate`) before emission.\n */\nexport interface SelectedIceCandidatePair {\n  local: { type: string; url: string };\n  remote: { type: string; url: string };\n}\n\n/**\n * Wire-format display key/value pair — rendered verbatim in the viewer's\n * phase tooltip. Nested or structured values should be pre-formatted by\n * the catalog closer's `map(...)` (string/number/boolean only).\n */\nexport interface PhaseParam {\n  readonly key: string;\n  readonly value: string;\n}\n\n/** Resolved overlay region sent on the wire. */\nexport interface PhaseOverlay {\n  readonly fromMs: number;\n  readonly toMs: number;\n  readonly title: string;\n}\n\n/**\n * A single milestone entry — the object identity serves as its key in\n * the in-session `times` map, so no separate `name` field is needed.\n */\ninterface CatalogEntry {\n  /** Display label emitted on the wire alongside the firing time. */\n  readonly label: string;\n  /**\n   * Source of the milestone. Subscribed once per session; unsubscribed on\n   * teardown. For closers, the emission value (when it's a plain object)\n   * is spread into the lifecycle event's payload — use inline `map(...)`\n   * to shape the extras.\n   */\n  readonly event: Observable<unknown>;\n  /**\n   * `'first'` (default) — record only the first emission per session.\n   * `'last'` — keep overwriting, so the recorded time is the latest\n   * emission. Ignored for closers (they take(1) anyway).\n   */\n  readonly mode?: 'first' | 'last';\n}\n\n/**\n * Declarative overlay recipe — resolved to `{fromMs, toMs, title}` at\n * emission time by looking up entries by object identity. Either\n * endpoint can be omitted to fall back to the phase bounds.\n */\ninterface OverlayRecipe {\n  readonly from?: CatalogEntry;\n  readonly to?: CatalogEntry;\n  readonly title: string;\n}\n\n/**\n * Unified phase catalog entry. The *last* item in `milestones` is the\n * phase closer: when its observable fires, the service emits a single\n * generic `stream.phase_ended` wire event carrying every display field\n * the viewer needs — `phaseNo`, `label`, `color`, `startPhase` (chained\n * from the previous closer), `endPhase`, `duration`, `milestones[]`,\n * `params[]`, `overlays[]`.\n *\n * The viewer never inspects milestone names or phase kinds; adding a\n * new phase here requires zero viewer changes.\n */\ninterface CatalogPhase {\n  /** Human-readable bar label. Shown in the phase bar; the viewer\n   *  derives boundary labels from neighbouring phases (no separate\n   *  wire-format `startPhase` / `endPhase` fields required). */\n  readonly label: string;\n  /** Viewer bar color (hex). */\n  readonly color: string;\n  readonly milestones: readonly CatalogEntry[];\n  /** Optional diagonal-stripe recipes; resolved to ms at closer time. */\n  readonly overlays?: readonly OverlayRecipe[];\n}\n\ninterface SessionState {\n  id: string;\n  startedAt: number; // Date.now() — wall-clock for startTimeUtc\n  startedAtPerf: number; // performance.now() at session start — kept for info\n  /**\n   * Anchor for all reported milestone timestamps.\n   *  - First session on this page: `0` (= `performance` navigation start).\n   *    Bootstrap measurements (`session_started.duration`, resource timings)\n   *    naturally fall out of `performance.now()` being \"ms since nav start\".\n   *  - Subsequent (Resume) sessions: `startedAtPerf`. The document is\n   *    already loaded so \"bootstrap\" has no meaning — we suppress it by\n   *    anchoring at the session itself.\n   * Milestone `*Ms` values emitted inside lifecycle events are relative\n   * to this anchor — the viewer's scale starts at 0 at the same anchor.\n   */\n  anchorPerf: number;\n  /**\n   * Monotonic time (performance.now()) of the last fired lifecycle event.\n   * Used to compute each next event's `duration` as the width of its own\n   * phase (`now - lastMilestonePerf`) rather than an anchor-relative value.\n   */\n  lastMilestonePerf: number;\n  seq: number;\n  sub: Subscription;\n  qpBad: boolean;\n  fpsLow: boolean;\n  maxFpsTarget: number; // 0 = unlimited → compare against UNLIMITED_REFERENCE_FPS\n  /** Total number of ICE candidates the server sent during negotiation.\n   *  Shipped as a phase param on `datachannel_connected` — useful for\n   *  diagnosing restrictive networks (tiny candidate count = no relay). */\n  iceCandidateCount: number;\n  /** Which handshake flow was used (server-offer is our default today,\n   *  but the detector stays in place in case the flow ever switches).\n   *  `null` until one of the two answer-events fires. */\n  handshakeFlow: 'server-offer' | 'client-offer' | null;\n  /** Running count of commands sent to Unreal during the session.\n   *  Snapshotted into the `viewport_ready` closer payload — helps\n   *  spot verbose scene-start flows where Unreal took a while to\n   *  settle because the client fired a lot of initial commands. */\n  commandCount: number;\n  /**\n   * Recorded firing times for each catalog entry this session. Keyed by\n   * the CatalogEntry object itself (stable identity across the service\n   * lifetime) — no string names needed. `milestonesOfBucket` / overlay\n   * resolution walk the catalog and read from this map directly.\n   */\n  times: Map<CatalogEntry, number>;\n}\n\nconst QP_RED_THRESHOLD = 35;\nconst FPS_LOW_RATIO = 0.7; // p50 fps below 70% of target\nconst UNLIMITED_REFERENCE_FPS = 60;\nconst SAMPLE_WINDOW_MS = 5000;\n// Persistent per-browser identifier — survives page reloads. Used to group\n// multiple sessions of the same anonymous user for funnel / retention analysis.\nconst USER_ID_STORAGE_KEY = 'sourceui.streamTelemetry.userId';\n\n@Injectable()\nexport class StreamStatusTelemetryService2 {\n  private readonly store = inject(Store);\n  private readonly actions$ = inject(Actions);\n  private readonly videoService = inject(VideoService);\n  private readonly signallingService = inject(SignallingService);\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n\n  /**\n   * Per-browser anonymous user id. Read from `localStorage` on first access;\n   * if missing, a new UUID is generated and persisted. Included as\n   * `data.userId` on every emitted event — the server uses it to bucket\n   * per-session files under `data/<userId>/<sessionId>.jsonl`.\n   */\n  private readonly userId = this.getOrCreateUserId();\n\n  private session: SessionState | null = null;\n\n  /**\n   * Whether a session has already started during the current page lifetime.\n   * Used to distinguish a fresh page load (bootstrap measurement is\n   * meaningful) from a Resume/restart (the document is already loaded,\n   * so \"bootstrap\" is a no-op). Only the first session gets the bootstrap\n   * phase anchored at navigation start (perf.now() === 0).\n   */\n  private hasStartedBefore = false;\n\n  /**\n   * Rolling snapshot of the currently selected WebRTC ICE candidate pair\n   * (local/remote type + url). Scanned over `videoStats$` so the stream\n   * *keeps* the first non-null pair even if later stats emit null — WebRTC\n   * doesn't un-select a pair mid-session, but the source is nullable. The\n   * `startWith(null)` seed makes `withLatestFrom` on this stream safe even\n   * before the first video stat arrives (common at data-channel-open).\n   */\n  private readonly selectedPair$: Observable<SelectedIceCandidatePair | null> =\n    this.videoService.videoStats$.pipe(\n      map((s) => s.aggregatedStats.selectedPair ?? null),\n      scan<SelectedIceCandidatePair | null, SelectedIceCandidatePair | null>(\n        (acc, curr) => curr ?? acc,\n        null,\n      ),\n      startWith<SelectedIceCandidatePair | null>(null),\n    );\n\n  /**\n   * Correlation-matched Observable: emits once when the first `loopBack`\n   * command's corresponding `command completed` action fires. Built from\n   * the two related actions — the command-started captures the correlation\n   * id, the command-completed with that id emits.\n   */\n  private readonly loopbackReceived$: Observable<unknown> = this.actions$.pipe(\n    ofType(commandStarted),\n    filter(({ command }) => command === 'loopBack'),\n    take(1),\n    switchMap(({ id }) =>\n      this.actions$.pipe(\n        ofType(commandCompleted),\n        filter((b) => b.id === id),\n        take(1),\n      ),\n    ),\n  );\n\n  // Overlay-referenced milestones — hoisted as fields so both\n  // `milestones: [...]` and `overlays: [...]` share the same object\n  // identity (the in-session Map keys milestones by that identity).\n  private readonly pollingStartedEntry: CatalogEntry = {\n    label: 'Polling started (HTTP orchestration)',\n    event: this.actions$.pipe(ofType(pollingStarted)),\n  };\n  private readonly awsInstanceResolvedEntry: CatalogEntry = {\n    label: 'Instance WS URL resolved',\n    event: this.actions$.pipe(ofType(setAwsInstance)),\n  };\n  private readonly loopbackReceivedEntry: CatalogEntry = {\n    label: 'LoopBack received',\n    event: this.loopbackReceived$,\n  };\n  private readonly signalingServerConnectedEntry: CatalogEntry = {\n    label: 'Websocket connected',\n    event: this.store\n      .select(unrealFeature.selectCirrusConnected)\n      .pipe(filter(Boolean), take(1)),\n  };\n  private readonly configReceivedEntry: CatalogEntry = {\n    label: 'Config received',\n    event: this.signallingService.onConfig$.pipe(filter(Boolean), take(1)),\n  };\n\n  /**\n   * Unified phase catalog — the single source of truth for everything\n   * this service tracks after `session_started`. Each entry is a phase;\n   * its `milestones` array is ordered chronologically and the *last*\n   * entry is the phase closer. When that closer's observable fires, the\n   * service emits one generic `stream.phase_ended` wire event with every\n   * display field the viewer needs.\n   *\n   * `phaseNo` is the array index; `startPhase` chains from the previous\n   * phase's `endPhase` — neither needs to be specified here.\n   */\n  private readonly phaseCatalog: readonly CatalogPhase[] = [\n    {\n      label: 'Region resolving',\n      color: '#61afef',\n      milestones: [\n        {\n          label: 'Region ping fetch start',\n          event: this.actions$.pipe(ofType(regionPingFetchStart)),\n        },\n        {\n          label: 'Region ping fetch end',\n          event: this.actions$.pipe(ofType(regionPingFetchEnd)),\n        },\n        // CLOSER — the `regionResolved` action carries the raw ping\n        // samples (one per probe) from `RegionsPingService`; the\n        // catalog flattens them to a comma-separated string since\n        // `toPhaseParams` only accepts primitives.\n        {\n          label: 'Region resolved',\n          event: this.actions$.pipe(\n            ofType(regionResolved),\n            take(1),\n            map(({ region, pingsMs }) => ({\n              region,\n              pingsMs: pingsMs.length ? `${pingsMs.join(', ')} ms` : null,\n            })),\n          ),\n        },\n      ],\n    },\n    {\n      label: 'Signaling connection',\n      color: '#c678dd',\n      overlays: [\n        {\n          from: this.pollingStartedEntry,\n          to: this.awsInstanceResolvedEntry,\n          title:\n            'Polling → instance resolved (HTTP polling + AWS instance handle)',\n        },\n        {\n          from: this.signalingServerConnectedEntry,\n          to: this.configReceivedEntry,\n          title: 'Signaling handshake (WS open → Cirrus config received)',\n        },\n      ],\n      milestones: [\n        this.pollingStartedEntry,\n        {\n          label: 'Polling ended (HTTP orchestration)',\n          event: this.actions$.pipe(ofType(pollingEnded)),\n        },\n        this.awsInstanceResolvedEntry,\n        this.signalingServerConnectedEntry,\n        {\n          label: 'Instance reserved (WS orchestration)',\n          event: this.actions$.pipe(ofType(setOrchestrationParameters)),\n        },\n        {\n          label: 'Instance ready (WS orchestration)',\n          event: this.actions$.pipe(ofType(instanceReady)),\n        },\n        this.configReceivedEntry,\n        {\n          label: 'SSInfo received',\n          event: this.store.select(unrealFeature.selectSsData).pipe(\n            filter(Boolean),\n            take(1),\n            withLatestFrom(this.store.select(unrealFeature.selectAwsInstance)),\n            map(([ssData, aws]) => ({\n              client: aws.wsUrl,\n              instanceName: aws.instanceName,\n              ...ssData,\n            })),\n          ),\n        },\n      ],\n    },\n    {\n      label: 'WebRTC negotiation',\n      color: '#e5c07b',\n      milestones: [\n        {\n          label: 'Offer received',\n          event: this.signallingService.onOffer$.pipe(filter(Boolean)),\n        },\n        {\n          label: 'Answer sent (server-offer flow)',\n          event: this.actions$.pipe(ofType(answerSent)),\n        },\n        {\n          label: 'Answer received (client-offer flow)',\n          event: this.signallingService.onWebRtcAnswer$.pipe(filter(Boolean)),\n        },\n        {\n          label: 'First ICE candidate from server',\n          event: this.signallingService.onWebRtcIce$.pipe(filter(Boolean)),\n        },\n        {\n          label: 'Last ICE candidate from server',\n          event: this.signallingService.onWebRtcIce$.pipe(filter(Boolean)),\n          mode: 'last',\n        },\n        // CLOSER — snaps negotiation diagnostics and the Cirrus\n        // streamer identity (`ssData`, reliably populated by DC-open\n        // time) into phase-3 params:\n        //  - `iceCandidateCount` (total ICE candidates from server — too\n        //    few hints at a restrictive network)\n        //  - `handshakeFlow` (server-offer vs client-offer; we only use\n        //    server-offer today, but the detector stays in place)\n        //  - `instanceType` / `branchInfo` / version / path / app /\n        //    `connectionId` (streamer identity, from `ssInfo` message)\n        {\n          label: 'Data channel connected',\n          event: this.store\n            .select(unrealFeature.selectDataChannelConnected)\n            .pipe(\n              filter(Boolean),\n              take(1),\n              map(() => ({\n                iceCandidateCount: this.session?.iceCandidateCount ?? 0,\n                handshakeFlow: this.session?.handshakeFlow ?? null,\n              })),\n            ),\n        },\n      ],\n    },\n    {\n      label: 'Unreal communication',\n      color: '#98c379',\n      overlays: [\n        {\n          from: this.loopbackReceivedEntry,\n          title: 'Stabilization (warm up)',\n        },\n      ],\n      milestones: [\n        {\n          label: 'First command started',\n          event: this.actions$.pipe(ofType(commandStarted)),\n        },\n        {\n          label: 'LoopBack sent',\n          event: this.actions$.pipe(\n            ofType(commandStarted),\n            filter(({ command }) => command === 'loopBack'),\n          ),\n        },\n        this.loopbackReceivedEntry,\n        // CLOSER — flattens the selected ICE candidate pair into two\n        // string params (local / remote), and snapshots the running\n        // command counter so phase 5 shows how many commands the client\n        // fired at Unreal before the viewport was ready.\n        {\n          label: 'Viewport ready',\n          event: this.store.select(unrealFeature.selectViewportReady).pipe(\n            filter(Boolean),\n            take(1),\n            withLatestFrom(this.selectedPair$),\n            map(([, selectedPair]) => ({\n              localCandidate: fmtCandidate(selectedPair?.local),\n              remoteCandidate: fmtCandidate(selectedPair?.remote),\n              commandCount: this.session?.commandCount ?? 0,\n            })),\n          ),\n        },\n      ],\n    },\n  ];\n\n  constructor() {\n    if (this.unrealConfig?.playwright) return;\n    if (!this.unrealConfig?.streamTelemetryV2) return;\n    this.init();\n  }\n\n  private getOrCreateUserId(): string {\n    try {\n      const existing = localStorage.getItem(USER_ID_STORAGE_KEY);\n      if (existing && existing.length > 0) return existing;\n      const fresh = uuidv4();\n      localStorage.setItem(USER_ID_STORAGE_KEY, fresh);\n      return fresh;\n    } catch {\n      // localStorage disabled (private-mode restrictions, quota, etc.)\n      // Fall back to a per-tab ephemeral id so telemetry keeps working.\n      return uuidv4();\n    }\n  }\n\n  private init() {\n    // Start a new session on every initSignalling dispatch.\n    this.actions$\n      .pipe(ofType(initSignalling))\n      .subscribe(() => this.startSession());\n\n    // End the current session when Cirrus drops (true → false transition).\n    this.store\n      .select(unrealFeature.selectCirrusConnected)\n      .pipe(\n        pairwise(),\n        filter(([prev, curr]) => prev && !curr),\n      )\n      .subscribe(() => this.endSession('disconnected'));\n\n    // Close the session when the tab is hidden / being evicted from bfcache.\n    // `pagehide` fires in more cases than `beforeunload` (covers iOS Safari, bfcache).\n    fromEvent(window, 'pagehide').subscribe(() => this.endSession('pagehide'));\n  }\n\n  private startSession() {\n    // If a previous session is still active, close it first.\n    this.endSession('restart');\n\n    const id = uuidv4();\n    const startedAt = Date.now();\n    const startedAtPerf = performance.now();\n    const sub = new Subscription();\n\n    // Anchor selection:\n    //  - First session on this page → anchor at navigation start (0).\n    //    `performance.now()` is already \"ms since navigation start\", so\n    //    `session_started.duration` becomes the full page-load + idle-time\n    //    leading up to the first stream start (i.e. the real bootstrap).\n    //  - Resume/restart sessions → anchor at the session's own start.\n    //    The document is already loaded — a \"bootstrap\" phase would either\n    //    balloon (to include all prior idle time) or be misleading, so we\n    //    suppress it by making the anchor == session_started.\n    const isFirstSession = !this.hasStartedBefore;\n    this.hasStartedBefore = true;\n    const anchorPerf = isFirstSession ? 0 : startedAtPerf;\n\n    const times = new Map<CatalogEntry, number>();\n\n    this.session = {\n      id,\n      startedAt,\n      startedAtPerf,\n      anchorPerf,\n      // Initial milestone anchor = anchorPerf. For the first session this is\n      // navigation start (0), so `session_started.duration` becomes the full\n      // page-load elapsed. For Resume sessions anchor == startedAtPerf, so\n      // `session_started.duration` is 0 (no bootstrap phase).\n      lastMilestonePerf: anchorPerf,\n      seq: 0,\n      sub,\n      qpBad: false,\n      fpsLow: false,\n      maxFpsTarget: UNLIMITED_REFERENCE_FPS,\n      iceCandidateCount: 0,\n      handshakeFlow: null,\n      commandCount: 0,\n      times,\n    };\n\n    // Side-channel counters for WebRTC negotiation diagnostics — shown\n    // as phase-3 params on the `datachannel_connected` closer. Kept\n    // imperative (session-scoped) so no RxJS hot-stream plumbing is\n    // needed to survive the subscribe-on-close timing.\n    sub.add(\n      this.signallingService.onWebRtcIce$\n        .pipe(filter(Boolean))\n        .subscribe(() => {\n          if (this.session) this.session.iceCandidateCount++;\n        }),\n    );\n    sub.add(\n      this.actions$.pipe(ofType(answerSent), take(1)).subscribe(() => {\n        if (this.session) this.session.handshakeFlow = 'server-offer';\n      }),\n    );\n    sub.add(\n      this.signallingService.onWebRtcAnswer$\n        .pipe(filter(Boolean), take(1))\n        .subscribe(() => {\n          if (this.session) this.session.handshakeFlow = 'client-offer';\n        }),\n    );\n    // Unreal-command counter — increments on every `commandStarted`\n    // action. Snapshotted into the `viewport_ready` closer payload as\n    // phase-5's `commandCount`.\n    sub.add(\n      this.actions$.pipe(ofType(commandStarted)).subscribe(() => {\n        if (this.session) this.session.commandCount++;\n      }),\n    );\n\n    // Unified catalog loop — one subscription per entry. Non-closers\n    // record their emission time into the session map. The *last* entry\n    // of each phase is the closer: its emission fires a single generic\n    // `stream.phase_ended` event carrying every display field the viewer\n    // needs. The viewer never inspects milestone names or phase kinds;\n    // adding a new phase to `phaseCatalog` is enough — zero viewer work.\n    this.phaseCatalog.forEach((bucket, bucketIdx) => {\n      bucket.milestones.forEach((entry, idx) => {\n        const isCloser = idx === bucket.milestones.length - 1;\n        sub.add(\n          entry.event.subscribe((value) => {\n            if (!this.session) return;\n            if (isCloser) {\n              this.emitPhaseEnded(bucket, bucketIdx, value);\n              return;\n            }\n            const time = Math.round(\n              performance.now() - this.session.anchorPerf,\n            );\n            if (entry.mode !== 'last' && this.session.times.has(entry)) return;\n            this.session.times.set(entry, time);\n          }),\n        );\n      });\n    });\n\n    const bootstrapInfo = this.collectBootstrapInfo();\n\n    this.emitLifecycle(\n      'stream.session_started',\n      {\n        sessionId: id,\n        startTimeUtc: new Date(startedAt).toISOString(),\n        pixelRatio: window.devicePixelRatio,\n        // Browser viewport size at session start (`window.innerWidth` /\n        // `innerHeight`). Named `browserInnerSize` to distinguish from\n        // the physical screen — what gates the rendered video resolution\n        // is the container we started from, not the device hardware.\n        browserInnerSize: {\n          width: window.innerWidth,\n          height: window.innerHeight,\n        },\n        userAgent: navigator.userAgent,\n        sampleWindowMs: SAMPLE_WINDOW_MS,\n        // Full page URL — `location.href` is the only reliable way to get this.\n        // The server-observed `Referer` header is truncated to origin for\n        // cross-origin requests by default Referrer-Policy.\n        pageUrl: window.location.href,\n        // Navigation / page-load context for the \"app bootstrap → session_started\"\n        // waterfall phase. Only useful for the first session (`bootstrap` phase\n        // is suppressed on Resume), but `bootstrapInfo` describes the document,\n        // not the session — harmless and cheap to send either way.\n        ...(bootstrapInfo && { bootstrapInfo }),\n      },\n      // Pin the milestone to the captured `performance.now()` so `duration`\n      // equals \"ms since navigation start\" precisely (for first sessions),\n      // rather than being inflated by any synchronous setup done in between.\n      startedAtPerf,\n    );\n\n    // Track current maxFps target to evaluate FPS-ratio anomalies.\n    sub.add(\n      this.actions$\n        .pipe(ofType(setMaxFps))\n        .subscribe(({ maxFps }) => this.updateMaxFpsTarget(maxFps)),\n    );\n\n    // Periodic aggregated sample — every 5s window.\n    sub.add(\n      this.videoService.videoStats$\n        .pipe(\n          bufferTime(SAMPLE_WINDOW_MS),\n          filter((samples) => samples.length > 0),\n        )\n        .subscribe((samples) => this.handleWindow(samples)),\n    );\n  }\n\n  private endSession(reason: EndReason) {\n    if (!this.session) return;\n    const { id, sub } = this.session;\n\n    this.emitLifecycle('stream.session_ended', {\n      sessionId: id,\n      reason,\n      timestamp: new Date().toISOString(),\n    });\n\n    sub.unsubscribe();\n    this.session = null;\n  }\n\n  /**\n   * Emit a lifecycle event with a `duration` field — ms between the\n   * previous lifecycle event and now (phase-local, NOT anchor-relative).\n   * For `session_started` this equals the full page-load elapsed on the\n   * first session, or 0 on Resume. Advances `lastMilestonePerf` so the\n   * next event's duration is correctly rooted.\n   */\n  private emitLifecycle(\n    event: string,\n    extra: Record<string, unknown>,\n    atPerf?: number,\n  ) {\n    if (!this.session) return;\n    // `atPerf` lets callers pin the milestone to a specific `performance.now()`\n    // value — useful for `session_started` where the wall-clock and perf-clock\n    // anchors were already captured at the top of `startSession()`.\n    const now = atPerf ?? performance.now();\n    const duration = Math.round(now - this.session.lastMilestonePerf);\n    this.track(event, { duration, ...extra });\n    this.session.lastMilestonePerf = now;\n  }\n\n  /**\n   * Emit the unified `stream.phase_ended` wire event for a closer. Packs\n   * every display field the viewer consumes — phaseNo (derived from the\n   * catalog index), label, color, milestones, params, overlays. Boundary\n   * labels aren't on the wire — the viewer derives them from neighbour\n   * phases' `label` fields.\n   */\n  private emitPhaseEnded(\n    bucket: CatalogPhase,\n    bucketIdx: number,\n    extrasValue: unknown,\n  ): void {\n    if (!this.session) return;\n    const now = performance.now();\n    const phaseStartMs = Math.round(\n      this.session.lastMilestonePerf - this.session.anchorPerf,\n    );\n    const phaseEndMs = Math.round(now - this.session.anchorPerf);\n    const milestones = this.milestonesOfBucket(bucket);\n    const params = toPhaseParams(extrasValue);\n    const overlays = resolveOverlays(\n      bucket.overlays,\n      this.session.times,\n      phaseStartMs,\n      phaseEndMs,\n    );\n    this.emitLifecycle('stream.phase_ended', {\n      sessionId: this.session.id,\n      phaseNo: bucketIdx + 1,\n      label: bucket.label,\n      color: bucket.color,\n      milestones,\n      params,\n      overlays,\n    });\n  }\n\n  private handleWindow(samples: AggregatedStat[]) {\n    if (!this.session) return;\n    const s = this.session;\n\n    const bitrate = this.aggregate(\n      samples.map((x) => x.aggregatedStats.bitrate ?? 0),\n    );\n    const fps = this.aggregate(\n      samples.map((x) => x.aggregatedStats.framesPerSecond ?? 0),\n    );\n    const qp = this.aggregate(\n      samples.map((x) => x.aggregatedStats.VideoEncoderQP ?? 0),\n    );\n    const jitter = this.aggregate(\n      samples.map((x) => x.aggregatedStats.jitter ?? 0),\n    );\n    const rtt = this.aggregate(\n      samples.map((x) => x.aggregatedStats.currentRoundTripTime ?? 0),\n    );\n    const latest = samples[samples.length - 1]?.aggregatedStats;\n\n    // Periodic sample event.\n    this.track('stream.sample', {\n      sessionId: s.id,\n      seq: s.seq++,\n      timestamp: new Date().toISOString(),\n      sampleCount: samples.length,\n      // Tab visibility state at emission time. Chrome does NOT throttle timers\n      // for WebRTC-active tabs, so the handler runs on time even when hidden —\n      // the point-in-time read is reliable in this specific context.\n      visibilityState: document.visibilityState,\n      bitrate,\n      fps,\n      qp,\n      jitter,\n      rtt,\n      packetsLost: latest?.packetsLost,\n      viewPort: {\n        width: latest?.frameWidth,\n        height: latest?.frameHeight,\n      },\n    });\n\n    this.evaluateAnomalies(fps, qp);\n  }\n\n  private evaluateAnomalies(fps: WindowAggregate, qp: WindowAggregate) {\n    if (!this.session) return;\n    const s = this.session;\n\n    // Quality (QP red) entry/exit.\n    const qpBadNow = qp.p50 > QP_RED_THRESHOLD;\n    if (qpBadNow !== s.qpBad) {\n      s.qpBad = qpBadNow;\n      this.track(\n        qpBadNow ? 'stream.quality_degraded' : 'stream.quality_recovered',\n        {\n          sessionId: s.id,\n          seq: s.seq,\n          timestamp: new Date().toISOString(),\n          qpP50: qp.p50,\n          qpP95: qp.p95,\n        },\n      );\n    }\n\n    // FPS low vs current target.\n    const ref = s.maxFpsTarget > 0 ? s.maxFpsTarget : UNLIMITED_REFERENCE_FPS;\n    const fpsLowNow = fps.p50 < ref * FPS_LOW_RATIO;\n    if (fpsLowNow && !s.fpsLow) {\n      this.track('stream.fps_low', {\n        sessionId: s.id,\n        seq: s.seq,\n        timestamp: new Date().toISOString(),\n        target: s.maxFpsTarget,\n        referenceTarget: ref,\n        fpsP50: fps.p50,\n        fpsP95: fps.p95,\n      });\n    }\n    s.fpsLow = fpsLowNow;\n  }\n\n  private updateMaxFpsTarget(maxFps: number) {\n    if (this.session) this.session.maxFpsTarget = maxFps;\n  }\n\n  /**\n   * Snapshot every milestone recorded in this session that belongs to\n   * {@link phase}. Used to attach a phase's milestone array to the\n   * lifecycle event that closes that phase.\n   */\n  /**\n   * Collect wire-shape milestones that fired within a bucket. Walks the\n   * catalog's own milestone list (minus the closer) and pulls each\n   * entry's time from the in-session map via object identity.\n   */\n  private milestonesOfBucket(bucket: CatalogPhase): EmittedMilestone[] {\n    if (!this.session) return [];\n    const out: EmittedMilestone[] = [];\n    const closerIdx = bucket.milestones.length - 1;\n    for (let i = 0; i < closerIdx; i++) {\n      const entry = bucket.milestones[i];\n      const time = this.session.times.get(entry);\n      if (time !== undefined) out.push({ label: entry.label, time });\n    }\n    return out;\n  }\n\n  /**\n   * Capture browser navigation timings — useful to explain the\n   * \"application bootstrap → session_started\" waterfall phase.\n   * Values are ms from navigation start; null if the entry is unavailable\n   * (old browsers, cross-origin iframes with limited perf access, etc.).\n   */\n  private collectBootstrapInfo(): Record<string, unknown> | null {\n    try {\n      const nav = performance.getEntriesByType('navigation')[0] as\n        | PerformanceNavigationTiming\n        | undefined;\n      if (!nav) return null;\n      return {\n        type: nav.type, // 'navigate' | 'reload' | 'back_forward' | 'prerender'\n        protocol: nav.nextHopProtocol || null, // 'h2' / 'h3' / 'http/1.1'\n        firstByteMs: Math.round(nav.responseStart),\n        domInteractiveMs: Math.round(nav.domInteractive),\n        domContentLoadedMs: Math.round(nav.domContentLoadedEventEnd),\n        loadEventMs: Math.round(nav.loadEventEnd),\n        // Navigation-only size — the HTML document itself. Usually small;\n        // the interesting number is `resources.transferSize` below.\n        navigationTransferSize: nav.transferSize || null,\n        navigationEncodedBodySize: nav.encodedBodySize || null,\n        navigationDecodedBodySize: nav.decodedBodySize || null,\n        resources: this.collectResourceTotals(),\n      };\n    } catch {\n      return null;\n    }\n  }\n\n  /**\n   * Aggregate all resources the browser has loaded so far\n   * (`performance.getEntriesByType('resource')`), grouped by `initiatorType`.\n   * Gives a real \"bytes downloaded before session start\" figure — unlike the\n   * navigation entry which only covers the HTML document.\n   *\n   * `transferSize === 0 && decodedBodySize > 0` means the resource came from\n   * the HTTP cache — counted separately so cached hits don't inflate\n   * the \"bytes on the wire\" metric.\n   */\n  private collectResourceTotals(): Record<string, unknown> | null {\n    try {\n      const list = performance.getEntriesByType(\n        'resource',\n      ) as PerformanceResourceTiming[];\n      if (!list.length) return null;\n\n      interface Bucket {\n        count: number;\n        cachedCount: number;\n        transferSize: number;\n        encodedBodySize: number;\n        decodedBodySize: number;\n      }\n      const empty = (): Bucket => ({\n        count: 0,\n        cachedCount: 0,\n        transferSize: 0,\n        encodedBodySize: 0,\n        decodedBodySize: 0,\n      });\n\n      const totals = empty();\n      const byType: Record<string, Bucket> = {};\n\n      for (const r of list) {\n        const type = r.initiatorType || 'other';\n        const b = (byType[type] ||= empty());\n        const fromCache = r.transferSize === 0 && r.decodedBodySize > 0;\n        const t = r.transferSize || 0;\n        const enc = r.encodedBodySize || 0;\n        const dec = r.decodedBodySize || 0;\n\n        b.count++;\n        if (fromCache) b.cachedCount++;\n        b.transferSize += t;\n        b.encodedBodySize += enc;\n        b.decodedBodySize += dec;\n\n        totals.count++;\n        if (fromCache) totals.cachedCount++;\n        totals.transferSize += t;\n        totals.encodedBodySize += enc;\n        totals.decodedBodySize += dec;\n      }\n\n      return { ...totals, byType };\n    } catch {\n      return null;\n    }\n  }\n\n  private aggregate(values: number[]): WindowAggregate {\n    if (values.length === 0) return { p50: 0, p95: 0, min: 0, max: 0 };\n    const sorted = [...values].sort((a, b) => a - b);\n    // Nearest-rank method: p-th percentile ≡ sorted[ceil(p/100 * n) - 1].\n    // Using `floor` would make p95 collapse to `max` for n=20\n    // (floor(0.95*20) = 19 = max index), hiding the max line behind p95\n    // in charts. `ceil - 1` keeps them distinct: p95 = sorted[18], max = sorted[19].\n    const pick = (p: number) => {\n      const idx = Math.ceil((p / 100) * sorted.length) - 1;\n      return sorted[Math.max(0, Math.min(sorted.length - 1, idx))];\n    };\n    return {\n      p50: pick(50),\n      p95: pick(95),\n      min: sorted[0],\n      max: sorted[sorted.length - 1],\n    };\n  }\n\n  private track(event: string, data: Record<string, unknown>) {\n    // `userId` is attached to every event so the server can bucket files\n    // under `data/<userId>/<sessionId>.jsonl` without maintaining a\n    // session→user index.\n    this.store.dispatch(\n      trackTelemetryData({\n        event,\n        data: { userId: this.userId, ...data },\n      }),\n    );\n  }\n}\n\n// ──────────────────────────────────────────────────────────────────\n// Module-scope helpers — keep the class body focused on RxJS wiring.\n// ──────────────────────────────────────────────────────────────────\n\n/** Compact one side of an ICE candidate pair to `\"type (url)\"` or just\n *  `type` (host candidates have no URL). */\nfunction fmtCandidate(\n  c: { type: string; url: string } | undefined,\n): string | null {\n  if (!c) return null;\n  return c.url ? `${c.type} (${c.url})` : c.type;\n}\n\n/**\n * Flatten the closer's emitted extras object into display key/value\n * pairs. Null/undefined/empty are dropped; objects and arrays are\n * skipped — they should be pre-formatted by the closer's `map(...)`.\n */\nfunction toPhaseParams(value: unknown): PhaseParam[] {\n  if (!value || typeof value !== 'object') return [];\n  const out: PhaseParam[] = [];\n  for (const [key, v] of Object.entries(value as Record<string, unknown>)) {\n    if (v === null || v === undefined || v === '') continue;\n    if (typeof v === 'object') continue;\n    out.push({ key, value: String(v) });\n  }\n  return out;\n}\n\n/**\n * Resolve declarative overlay recipes to absolute ms spans. Endpoints\n * fall back to the phase's own start/end when unspecified; recipes\n * whose referenced entry never fired are quietly skipped.\n */\nfunction resolveOverlays(\n  recipes: readonly OverlayRecipe[] | undefined,\n  times: ReadonlyMap<CatalogEntry, number>,\n  phaseStartMs: number,\n  phaseEndMs: number,\n): PhaseOverlay[] {\n  if (!recipes?.length) return [];\n  const out: PhaseOverlay[] = [];\n  for (const r of recipes) {\n    const fromMs = r.from ? (times.get(r.from) ?? null) : phaseStartMs;\n    const toMs = r.to ? (times.get(r.to) ?? null) : phaseEndMs;\n    if (fromMs === null || toMs === null || toMs <= fromMs) continue;\n    out.push({ fromMs, toMs, title: r.title });\n  }\n  return out;\n}\n","export const ReceivedMimeTypes = {\n  ApplicationJson: 'application/json',\n} as const;\nexport type ReceivedMimeType =\n  (typeof ReceivedMimeTypes)[keyof typeof ReceivedMimeTypes];\n","import { inject, Injectable } from '@angular/core';\nimport type { ReceivedFile } from './file-receiver.service';\nimport { FileReceiverService } from './file-receiver.service';\nimport { generateUuid, Logger, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { from, of, switchMap, take, timeout } from 'rxjs';\nimport { catchError, filter, map } from 'rxjs/operators';\nimport type { MetaBoxCommandList } from '@3dsource/types-unreal';\nimport type { ReceivedMimeType } from '../interfaces/ReceivedMimeTypes';\nimport { ReceivedMimeTypes } from '../interfaces/ReceivedMimeTypes';\n\ntype FileHandlers = Record<\n  ReceivedMimeType,\n  (data: ReceivedFile, correlationId: string) => Observable<unknown>\n>;\n\n@Injectable()\nexport class FileHandlerService {\n  private fileService = inject(FileReceiverService);\n  private fileHandlers: FileHandlers = {\n    [ReceivedMimeTypes.ApplicationJson]: this.handleJsonFile.bind(this),\n  };\n\n  private handleJsonFile(data: ReceivedFile, correlationId: string) {\n    const { blob } = data;\n    return from(blob.text()).pipe(\n      map((text: string) => JSON.parse(text)),\n      filter(({ commandCallback }) => {\n        return commandCallback.correlationId === correlationId;\n      }),\n    );\n  }\n\n  observeFileResponse<\n    K extends keyof MetaBoxCommandList,\n    T extends MetaBoxCommandList[K] = MetaBoxCommandList[K],\n  >(\n    mimetype: ReceivedMimeType,\n    data: T,\n    sender: (data: T) => void,\n    timeOut = 60000,\n  ) {\n    const correlationId = generateUuid();\n    const out = { ...data, correlationId };\n\n    const observable = this.fileService.fileComplete$.pipe(\n      switchMap((data) => {\n        if (data.valid && this.fileHandlers[mimetype]) {\n          return this.fileHandlers[mimetype](data, correlationId).pipe(\n            filter(Truthy),\n          );\n        }\n        return of(null);\n      }),\n      timeout(timeOut),\n      catchError((e) => {\n        Logger.error(e);\n        return of(null);\n      }),\n      take(1),\n    );\n    setTimeout(() => sender(out), 0);\n    return observable;\n  }\n}\n","import type { Observable } from 'rxjs';\nimport {\n  filter,\n  fromEvent,\n  map,\n  merge,\n  Subject,\n  takeUntil,\n  throttleTime,\n} from 'rxjs';\nimport { inject, Injectable } from '@angular/core';\nimport { distinctUntilChanged, tap } from 'rxjs/operators';\nimport { saveAnalyticsEvent, unrealFeature } from '../store';\nimport { Store } from '@ngrx/store';\nimport { Falsy, Logger, Truthy } from '@3dsource/utils';\nimport { SubService } from './sub.service';\n\n@Injectable()\nexport class AnalyticsService extends SubService {\n  #store = inject(Store);\n  /** Signals monitorMouse inner subscriptions to stop (viewport lost / new session). */\n  #stopMouse$ = new Subject<void>();\n\n  sendEventToMixPanel(\n    name: string,\n    params: Record<string, unknown> = {},\n  ): void {\n    Logger.log('Analytics Event:', name, params);\n    this.#store.dispatch(saveAnalyticsEvent({ event: { name, params } }));\n  }\n\n  constructor() {\n    super();\n    const abortSignal$ = this.#store\n      .select(unrealFeature.selectViewportReady)\n      .pipe(\n        filter(Falsy),\n        map(() => void 0),\n      );\n    this.#store\n      .select(unrealFeature.selectViewportReady)\n      .pipe(\n        distinctUntilChanged(),\n        filter(Truthy),\n        tap(() => this.monitorMouse(abortSignal$)),\n      )\n      .subscribe();\n  }\n\n  private monitorMouse(abortSignal$: Observable<void>) {\n    this.#stopMouse$.next();\n    const stop$ = merge(this.#stopMouse$.asObservable(), abortSignal$);\n    const element = document.getElementById('streamingVideo');\n\n    if (!element) {\n      return;\n    }\n\n    // Monitor mousewheel events\n    const mousewheel$ = fromEvent<WheelEvent>(element, 'wheel').pipe(\n      takeUntil(stop$),\n      throttleTime(1000),\n    );\n\n    // Monitor mouse button states\n    const mousedown$ = fromEvent<MouseEvent>(element, 'mousedown').pipe(\n      takeUntil(stop$),\n    );\n    const touchStart$ = fromEvent<TouchEvent>(element, 'touchstart').pipe(\n      takeUntil(stop$),\n    );\n    const touchMove$ = fromEvent<TouchEvent>(element, 'touchmove').pipe(\n      takeUntil(stop$),\n      throttleTime(200),\n    );\n\n    // Track mouse movement while the left or right button is pressed\n    mousedown$\n      .pipe(\n        filter((event) => event.button === 0 || event.button === 2),\n        tap((downEvent) => {\n          this.sendEventToMixPanel('mouse_interaction', {\n            viewX: downEvent.clientX / element.clientWidth,\n            viewY: downEvent.clientY / element.clientHeight,\n            action: downEvent.button === 0 ? 'spinning' : 'panning',\n          });\n        }),\n      )\n      .subscribe();\n\n    // Track mouse movement while the left or right button is pressed\n    touchStart$\n      .pipe(\n        tap((downEvent) => {\n          const totalTouches = downEvent.touches.length;\n          const touch = downEvent.touches[0];\n          this.sendEventToMixPanel('touch_interaction', {\n            viewX: touch.clientX / element.clientWidth,\n            viewY: touch.clientY / element.clientHeight,\n            action: totalTouches === 1 ? 'spinning' : 'panning',\n          });\n        }),\n      )\n      .subscribe();\n\n    let initialTouchDistance = 0;\n    // Subscribe to mousewheel events\n    touchMove$.subscribe((event: TouchEvent) => {\n      const totalTouches = event.touches.length;\n      if (totalTouches < 2) {\n        return;\n      }\n\n      // Calculate the current distance between two touches\n      const touch1 = event.touches[0];\n      const touch2 = event.touches[1];\n      const currentDistance = Math.sqrt(\n        Math.pow(touch2.clientX - touch1.clientX, 2) +\n          Math.pow(touch2.clientY - touch1.clientY, 2),\n      );\n\n      // Determine if zooming in or out based on distance change\n      const deltaDistance = currentDistance - initialTouchDistance;\n      const isZoomingIn = deltaDistance > 0;\n\n      // Only send event if there's a significant change (avoid noise)\n      if (Math.abs(deltaDistance) > 10) {\n        this.sendEventToMixPanel('touch_zoom_interaction', {\n          delta: isZoomingIn ? 1 : -1,\n          action: isZoomingIn ? 'zoomin' : 'zoomout',\n        });\n\n        // Update initial distance for next comparison\n        initialTouchDistance = currentDistance;\n      }\n    });\n\n    mousewheel$.subscribe((event: WheelEvent) => {\n      this.sendEventToMixPanel('mouse_zoom_interaction', {\n        delta: -(event.deltaY / Math.abs(event.deltaY)),\n        action: event.deltaY < 0 ? 'zoomin' : 'zoomout',\n      });\n    });\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { filter, takeUntil, withLatestFrom } from 'rxjs/operators';\nimport { clampf, Falsy, Logger } from '@3dsource/utils';\nimport { VideoService } from './video.service';\nimport { setMaxFps, unrealFeature } from '../store';\nimport { qpToQuality } from '../helpers';\nimport type { AggregatedStat } from '../interfaces';\nimport { skip, Subject } from 'rxjs';\nimport { UNREAL_CONFIG } from '../constants';\n\ntype Decision = 'decrease' | 'hold' | 'increase';\n\n/**\n * Adaptive FPS controller that monitors the incoming WebRTC video stream\n * quality and dynamically adjusts Unreal Engine's `t.MaxFPS` console variable.\n *\n * ## How it works\n *\n * The service subscribes to `VideoService.videoStats$` (emitted every 250 ms)\n * and collects samples of FPS, bitrate, and QP (Quantisation Parameter).\n * Every {@link SAMPLE_WINDOW} ticks (~2 s) it averages the collected samples\n * and feeds them into a set of **fuzzy-logic membership functions** that\n * classify each metric into overlapping quality bands.\n *\n * ### Input signals\n *\n * **1. FPS ratio** = `actualFPS / currentTargetFPS` (0..1+)\n *\n * | Band   | Range               | Meaning                                       |\n * |--------|---------------------|-----------------------------------------------|\n * | low    | ratio < 0.7 → 1.0, linear ramp 0.7..0.9 → 0   | Stream cannot keep up with the target         |\n * | ok     | triangle 0.8..1.0, peak at 0.95                 | Stream roughly matches the target             |\n * | high   | ratio 0.9..1.0 → ramp, >1.0 → 1.0              | Stream meets or exceeds the target            |\n *\n * **2. Bitrate load** = `currentBitrate / MAX_BITRATE` (0..1+)\n *\n * `MAX_BITRATE` = 20 Mbit/s — the reference ceiling for the encoder.\n *\n * | Band   | Range                                           | Meaning                                       |\n * |--------|-------------------------------------------------|-----------------------------------------------|\n * | high   | load 0.5..0.8 → ramp, >0.8 → 1.0               | Encoder is using most of the available bandwidth |\n * | not high | load < 0.5 → 0.0                              | Bandwidth headroom is available                |\n *\n * **3. Quality** — mapped from QP via `mapQpToQuality()` (see {@link Quality}):\n *\n * | Quality  | QP range  | Meaning                                         |\n * |----------|-----------|-------------------------------------------------|\n * | `lime`   | QP <= 26  | Good — encoder has enough headroom              |\n * | `orange` | QP 27..35 | Fair — encoder is under moderate pressure        |\n * | `red`    | QP > 35   | Poor — heavy compression, visible artefacts      |\n *\n * ### Decision rules (evaluated in priority order, first match wins)\n *\n * | # | Condition                                                  | Decision     |\n * |---|------------------------------------------------------------|--------------|\n * | 1 | FPS ratio is **low** (membership > 0.5)                    | **decrease** |\n * | 2 | FPS ratio is **ok** AND quality is `red`                   | **decrease** |\n * | 3 | FPS ratio is **ok** AND bitrate **high** AND quality is `orange` | **hold** |\n * | 4 | FPS ratio is **high** AND quality is `lime` AND bitrate **not high** | **increase** |\n * | — | Everything else                                            | **hold**     |\n *\n * ## Cooldown-based throttling\n *\n * The service continuously evaluates fuzzy rules every sample window.\n * After each FPS step change it enforces a cooldown before the next\n * change can be applied. The cooldown duration depends on the\n * (previous decision → next decision) pair:\n *\n * | Previous  | Next      | Cooldown                                            |\n * |-----------|-----------|-----------------------------------------------------|\n * | decrease  | decrease  | {@link COOLDOWN_DECREASE_AFTER_DECREASE_MS} (2 s)   |\n * | decrease  | increase  | {@link COOLDOWN_INCREASE_AFTER_DECREASE_MS} (10 s)  |\n * | increase  | decrease  | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s)            |\n * | increase  | increase  | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s)            |\n *\n * This means the system reacts quickly after an increase (2 s in any\n * direction) but is cautious about stepping back up after a decrease\n * (10 s), while still allowing consecutive decreases at 2 s intervals.\n *\n * ## FPS dispatch\n *\n * FPS changes are dispatched via the NgRx `setMaxFps` action, which triggers\n * the existing `CommandsEffects.setMaxFps$` effect that sends the\n * `t.MaxFPS <value>` console command to Unreal Engine.\n */\n@Injectable()\nexport class FpsMonitorService {\n  private videoService = inject(VideoService);\n  private store = inject(Store);\n  private readonly unrealConfig = inject(UNREAL_CONFIG, { optional: true });\n\n  /** Discrete FPS targets the controller can switch between (ascending order). Last 0 is unlimited framerate indicator*/\n  private readonly FPS_STEPS = [30, 40, 50, 0] as const;\n\n  /**\n   * Reference FPS used to compute the FPS ratio when `currentFpsTarget` is 0\n   * (unlimited). Keeps adaptive logic operational at the unlimited step:\n   * if the stream drops well below this value, fuzzy rules can still fire.\n   */\n  private readonly UNLIMITED_REFERENCE_FPS = 60;\n\n  /** Reference ceiling for bitrate (bits/sec) used to normalize a bitrate load to 0..1. */\n  private readonly MAX_BITRATE = 20_000_000;\n\n  /**\n   * Cooldown (ms) for any decision (increase or decrease) following an increase.\n   * After an increase, the system should react faster.\n   */\n  private readonly COOLDOWN_AFTER_INCREASE_MS = 2_000;\n\n  /**\n   * Cooldown (ms) for a decrease following a previous decrease.\n   */\n  private readonly COOLDOWN_DECREASE_AFTER_DECREASE_MS = 2_000;\n\n  /**\n   * Cooldown (ms) for an increase following a previous decrease.\n   * The stream needs more time to stabilise before stepping back up.\n   */\n  private readonly COOLDOWN_INCREASE_AFTER_DECREASE_MS = 10_000;\n\n  /**\n   * Number of videoStats$ ticks to accumulate before evaluating.\n   * At 250 ms per tick, this gives a ~2 s sliding evaluation window,\n   * long enough to smooth out single-frame jitter.\n   */\n  private readonly SAMPLE_WINDOW = 8;\n\n  /** Emits when the session ends, cancelling the current stats' subscription. */\n  private session$ = new Subject<void>();\n\n  /** Current FPS target; starts at max (60 FPS) and adapts downward/upward. */\n  private currentFpsTarget: number = this.FPS_STEPS[this.FPS_STEPS.length - 1];\n  private samples: { fps: number; bitrate: number; qp: number }[] = [];\n  private lastDecisionTime = Date.now();\n  private lastUpgrade: Decision = 'hold';\n\n  private disconnect$ = this.store\n    .select(unrealFeature.selectCirrusConnected)\n    .pipe(skip(1), filter(Falsy));\n\n  constructor() {\n    this.init();\n  }\n\n  protected init() {\n    if (this.unrealConfig?.playwright || !this.unrealConfig?.fpsMonitor) {\n      return;\n    }\n    // Reset mutable state and re-subscribe when a new session starts\n    this.store\n      .select(unrealFeature.selectViewportReady)\n      .pipe(filter(Boolean))\n      .subscribe(() => this.startSession());\n\n    // Reset mutable state when session ends\n    this.disconnect$.subscribe(() => this.resetSession());\n  }\n\n  private startSession() {\n    // Tear down previous stats subscription if any\n    this.session$.next();\n    this.resetMutableState();\n\n    this.videoService.videoStats$\n      .pipe(\n        withLatestFrom(this.store.select(unrealFeature.selectViewportReady)),\n        filter(([, viewportReady]) => viewportReady),\n        takeUntil(this.session$),\n      )\n      .subscribe(([stats]) => this.processTick(stats));\n  }\n\n  private resetSession() {\n    this.session$.next();\n    this.resetMutableState();\n  }\n\n  private resetMutableState() {\n    this.currentFpsTarget = this.FPS_STEPS[this.FPS_STEPS.length - 1];\n    this.samples = [];\n    this.lastDecisionTime = Date.now();\n    this.lastUpgrade = 'hold';\n  }\n\n  /**\n   * Called on every videoStats$ emission (~250 ms).\n   * Accumulates samples and evaluates once per SAMPLE_WINDOW.\n   */\n  private processTick(stats: AggregatedStat) {\n    const { framesPerSecond, bitrate, VideoEncoderQP } = stats.aggregatedStats;\n\n    this.samples.push({\n      fps: framesPerSecond ?? 0,\n      bitrate: bitrate ?? 0,\n      qp: VideoEncoderQP ?? 0,\n    });\n\n    // Wait until we have enough samples for a reliable average.\n    if (this.samples.length < this.SAMPLE_WINDOW) {\n      return;\n    }\n\n    const avg = this.averageSamples();\n    this.samples = [];\n\n    this.handleMonitoring(avg, this.currentFpsTarget);\n  }\n\n  private handleMonitoring(\n    avg: { fps: number; bitrate: number; qp: number },\n    currentTarget: number,\n  ) {\n    const decision = this.evaluateDecision(avg, currentTarget);\n    this.upgradeFps(decision, avg.qp);\n  }\n\n  /**\n   * Combines fuzzy membership values into a single discrete decision.\n   * Rules are evaluated in priority order — first match wins.\n   *\n   * Inputs:\n   * - `fpsRatio`    = avgFPS / currentTargetFPS  (e.g. 45/60 = 0.75)\n   * - `bitrateLoad` = avgBitrate / 20 Mbit/s     (e.g. 12M/20M = 0.6)\n   * - `quality`     = mapQpToQuality(avgQP)       → 'lime' | 'orange' | 'red'\n   */\n  private evaluateDecision(\n    avg: { fps: number; bitrate: number; qp: number },\n    currentTarget: number,\n  ): Decision {\n    const referenceTarget =\n      currentTarget > 0 ? currentTarget : this.UNLIMITED_REFERENCE_FPS;\n    const fpsRatio = avg.fps / referenceTarget;\n    const bitrateLoad = avg.bitrate / this.MAX_BITRATE;\n\n    const fpsLow = this.membershipFpsLow(fpsRatio);\n    const fpsOk = this.membershipFpsOk(fpsRatio);\n    const fpsHigh = this.membershipFpsHigh(fpsRatio);\n\n    const bitrateHigh = this.membershipBitrateHigh(bitrateLoad);\n\n    // Quality is derived from QP: lime (QP <= 26), orange (QP 27..35), red (QP > 35).\n    const quality = qpToQuality(avg.qp);\n\n    // Rule 1: FPS clearly below target (ratio roughly < 0.8) → step down immediately.\n    if (fpsLow > 0.5) {\n      return 'decrease';\n    }\n\n    // Rule 2: FPS looks acceptable numerically, but encoder quality is 'red'\n    // (QP > 35 — heavy compression artefacts). Reducing target FPS frees\n    // encoder headroom and improves visual quality.\n    if (fpsOk > 0.4 && quality === 'red') {\n      return 'decrease';\n    }\n\n    // Rule 3: FPS is ok, but bitrate is above ~50-80% of 20 Mbit/s ceiling\n    // and quality is 'orange' (QP 27..35). Near capacity — don't push higher.\n    if (fpsOk > 0.4 && bitrateHigh > 0.5 && quality === 'orange') {\n      return 'hold';\n    }\n\n    // Rule 4: FPS meets/exceeds target (ratio >= ~0.95), quality is 'lime'\n    // (QP <= 26), and bitrate is below 50% of ceiling — safe to step up.\n    // Note: the last FPS_STEPS value (0) means \"no limit\", so compare by\n    // position in FPS_STEPS rather than numerically.\n    const currentIndex = this.FPS_STEPS.indexOf(\n      this.currentFpsTarget as (typeof this.FPS_STEPS)[number],\n    );\n    if (\n      fpsHigh > 0.5 &&\n      quality === 'lime' &&\n      bitrateHigh < 0.5 &&\n      currentIndex !== -1 &&\n      currentIndex < this.FPS_STEPS.length - 1\n    ) {\n      return 'increase';\n    }\n\n    return 'hold';\n  }\n\n  // ---------------------------------------------------------------------------\n  // Fuzzy membership functions\n  //\n  // Each function maps a normalised input (0..1+) to a membership degree (0..1).\n  // Overlapping trapezoid/triangle shapes let multiple categories be partially\n  // active at the same time, which makes the rules less brittle than hard thresholds.\n  // ---------------------------------------------------------------------------\n\n  /**\n   * FPS ratio membership \"low\".\n   * Input: ratio = actualFPS / targetFPS (e.g. 42/60 = 0.70).\n   *\n   *   ratio < 0.7  → 1.0  (clearly failing, e.g. 40/60)\n   *   ratio 0.7..0.9 → linear ramp down (e.g. 0.8 → 0.5)\n   *   ratio > 0.9  → 0.0  (keeping up)\n   */\n  private membershipFpsLow(ratio: number): number {\n    if (ratio < 0.7) return 1.0;\n    if (ratio > 0.9) return 0.0;\n    return (0.9 - ratio) / 0.2;\n  }\n\n  /**\n   * FPS ratio membership \"ok\" — triangle shape.\n   * Input: ratio = actualFPS / targetFPS.\n   *\n   *   ratio < 0.8  → 0.0\n   *   ratio 0.8..0.95 → ramp up, peak at 0.95 (e.g. 57/60)\n   *   ratio 0.95..1.0 → ramp down\n   *   ratio > 1.0  → 0.0\n   */\n  private membershipFpsOk(ratio: number): number {\n    if (ratio < 0.8) return 0.0;\n    if (ratio < 0.95) return (ratio - 0.8) / 0.15;\n    if (ratio <= 1.0) return (1.0 - ratio) / 0.05;\n    return 0.0;\n  }\n\n  /**\n   * FPS ratio membership \"high\".\n   * Input: ratio = actualFPS / targetFPS.\n   *\n   *   ratio < 0.9  → 0.0\n   *   ratio 0.9..1.0 → linear ramp up (e.g. 0.95 → 0.5)\n   *   ratio >= 1.0 → 1.0  (meeting or exceeding target, e.g. 60/60)\n   */\n  private membershipFpsHigh(ratio: number): number {\n    if (ratio < 0.9) return 0.0;\n    if (ratio > 1.0) return 1.0;\n    return (ratio - 0.9) / 0.1;\n  }\n\n  /**\n   * Bitrate load membership \"high\".\n   * Input: load = currentBitrate / MAX_BITRATE (20 Mbit/s).\n   *\n   *   load < 0.5  → 0.0  (below 10 Mbit/s — plenty of headroom)\n   *   load 0.5..0.8 → linear ramp (e.g. 13M/20M = 0.65 → 0.5)\n   *   load > 0.8  → 1.0  (above 16 Mbit/s — near capacity)\n   */\n  private membershipBitrateHigh(load: number): number {\n    if (load < 0.5) return 0.0;\n    if (load > 0.8) return 1.0;\n    return (load - 0.5) / 0.3;\n  }\n\n  // ---------------------------------------------------------------------------\n  // Step actions\n  // ---------------------------------------------------------------------------\n\n  private upgradeFps(decision: Decision, qp: number) {\n    if (decision === 'hold') return;\n\n    const now = Date.now();\n\n    // Throttle: cooldown depends on (previous decision → current decision) pair.\n    const isStepUp = decision === 'increase';\n    const cooldown =\n      this.lastUpgrade === 'decrease'\n        ? isStepUp\n          ? this.COOLDOWN_INCREASE_AFTER_DECREASE_MS\n          : this.COOLDOWN_DECREASE_AFTER_DECREASE_MS\n        : this.COOLDOWN_AFTER_INCREASE_MS;\n\n    if (now - this.lastDecisionTime < cooldown) {\n      return;\n    }\n\n    this.lastUpgrade = decision;\n\n    const quality = qpToQuality(qp);\n    const newTarget = this.getNextFpsTarget(this.currentFpsTarget, decision);\n\n    Logger.info(\n      `[FpsMonitor] Decision: ${decision} → FPS: ${newTarget}, Quality: ${quality}`,\n    );\n\n    if (newTarget !== this.currentFpsTarget) {\n      this.currentFpsTarget = newTarget;\n      this.store.dispatch(setMaxFps({ maxFps: newTarget }));\n    }\n\n    this.lastDecisionTime = now;\n    this.samples = [];\n  }\n\n  /**\n   * Get the next FPS target based on current target and decision.\n   * Clamps to valid FPS_STEPS range.\n   */\n  private getNextFpsTarget(currentTarget: number, decision: Decision): number {\n    const currentIndex = this.FPS_STEPS.indexOf(\n      currentTarget as (typeof this.FPS_STEPS)[number],\n    );\n\n    // If current target is not in FPS_STEPS, find closest one\n    const validIndex =\n      currentIndex === -1\n        ? this.findClosestFpsIndex(currentTarget)\n        : currentIndex;\n\n    const delta = decision === 'increase' ? 1 : -1;\n    const newIndex = clampf(0, this.FPS_STEPS.length - 1, validIndex + delta);\n\n    return this.FPS_STEPS[newIndex];\n  }\n\n  /**\n   * Find the closest FPS step index for a given target value.\n   */\n  private findClosestFpsIndex(target: number): number {\n    let closestIndex = 0;\n    let closestDiff = Math.abs(this.FPS_STEPS[0] - target);\n\n    for (let i = 1; i < this.FPS_STEPS.length; i++) {\n      const diff = Math.abs(this.FPS_STEPS[i] - target);\n      if (diff < closestDiff) {\n        closestDiff = diff;\n        closestIndex = i;\n      }\n    }\n\n    return closestIndex;\n  }\n\n  /** Average all collected samples for the current evaluation window. */\n  private averageSamples(): { fps: number; bitrate: number; qp: number } {\n    const len = this.samples.length;\n    if (len === 0) return { fps: 0, bitrate: 0, qp: 0 };\n\n    let fps = 0;\n    let bitrate = 0;\n    let qp = 0;\n\n    for (const s of this.samples) {\n      fps += s.fps;\n      bitrate += s.bitrate;\n      qp += s.qp;\n    }\n\n    return { fps: fps / len, bitrate: bitrate / len, qp: qp / len };\n  }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Actions, ofType } from '@ngrx/effects';\nimport { of, take, timeout } from 'rxjs';\nimport { catchError, filter, map } from 'rxjs/operators';\nimport { generateUuid, tapLog, Truthy } from '@3dsource/utils';\nimport type {\n  FCameraChangedPayload,\n  FProductPayload,\n  FSceneState,\n  FTransformJson,\n  MetaBoxCommandList,\n} from '@3dsource/types-unreal';\nimport { unrealCommandCallback } from '../store';\n\n/**\n * Custom Unreal callback events that are not part of MetaBoxCommandList.\n * These events are pushed from Unreal to the frontend via the data channel.\n */\nexport interface UnrealCallbackEventMap {\n  onSceneState: { command: 'onSceneState'; payload: FSceneState };\n  onFocusObject: { command: 'onFocusObject'; payload: FProductPayload };\n  cameraChanged: { command: 'cameraChanged'; payload: FCameraChangedPayload };\n  onObjectTransformChanged: {\n    command: 'onObjectTransformChanged';\n    payload: { objectName: string; transform: FTransformJson };\n  };\n  onChangeSequence: { command: 'onChangeSequence'; payload: unknown };\n  onFinishedSequence: { command: 'onFinishedSequence'; payload: unknown };\n}\n\n/**\n * Combined map of all known callback event types:\n * MetaBoxCommandList (command responses) + UnrealCallbackEventMap (custom events).\n */\nexport type UnrealCallbackDescriptor = MetaBoxCommandList &\n  UnrealCallbackEventMap;\n\n@Injectable()\nexport class UnrealCallbackService {\n  private readonly actions$ = inject(Actions);\n\n  /**\n   * Listens for unreal command callbacks matching a specific command or event type.\n   *\n   * Supports both MetaBoxCommand keys (e.g. `MetaBoxCommand.FLoadProductCommand`)\n   * and custom Unreal callback events (e.g. `'cameraChanged'`, `'onSceneState'`).\n   *\n   * @param command - The command or event key to filter callbacks by\n   * @returns Observable that emits matching callback payloads\n   *\n   * @example\n   * ```ts\n   * // Listen for a MetaBox command callback\n   * this.unrealCallbackService\n   *   .fromUnrealCallback(MetaBoxCommand.FLoadProductCommand)\n   *   .subscribe(data => console.log(data));\n   *\n   * // Listen for a custom Unreal event\n   * this.unrealCallbackService\n   *   .fromUnrealCallback('cameraChanged')\n   *   .subscribe(data => console.log(data));\n   * ```\n   */\n  fromUnrealCallback<K extends keyof UnrealCallbackDescriptor>(command: K) {\n    return this.actions$.pipe(\n      ofType(unrealCommandCallback),\n      map(({ json }) => {\n        if ('commandCallback' in json) {\n          return json.commandCallback;\n        }\n        return json;\n      }),\n      filter((json) => json.command === command),\n      map(\n        (data) =>\n          ({\n            command: data.command,\n            payload: 'payload' in data ? data.payload : null,\n          }) as UnrealCallbackDescriptor[K],\n      ),\n    );\n  }\n\n  /**\n   * Sends a command and observes the matching response by correlationId.\n   * Replaces the old `observeCommandResponse` standalone function.\n   *\n   * @param data - The command data to send\n   * @param sender - Function to send the command to Unreal\n   * @param timeOut - Timeout in ms (default 60000)\n   * @param dispatchOnTimeout - Whether to emit on timeout (default true)\n   *\n   * @example\n   * ```ts\n   * this.unrealCallbackService\n   *   .observeCommandResponse<FLoopBackCommand['command']>(\n   *     { command: MetaBoxCommand.FLoopBackCommand },\n   *     (data) => this.communicator.sendCommandToUnreal(data),\n   *   )\n   *   .subscribe();\n   * ```\n   */\n  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  ) {\n    const correlationId = generateUuid();\n\n    const observable = this.actions$.pipe(\n      ofType(unrealCommandCallback),\n      map(({ json }) =>\n        'commandCallback' in json ? json.commandCallback : json,\n      ),\n      filter((json) => json.correlationId === correlationId),\n      timeout(timeOut),\n      catchError(() =>\n        dispatchOnTimeout\n          ? of({ command: 'timeout', correlationId: 'timeout' })\n          : of(null),\n      ),\n      take(1),\n      tapLog('Command Response Observer'),\n      filter(Truthy),\n      map(\n        (data) =>\n          ({\n            command: data.command,\n            payload: 'payload' in data ? data.payload : null,\n          }) as MetaBoxCommandList[K],\n      ),\n    );\n\n    setTimeout(() => sender({ ...data, correlationId }), 0);\n\n    return observable;\n  }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\nimport { AFKService } from '../../services';\nimport { Store } from '@ngrx/store';\nimport { unrealFeature } from '../../store';\n\n@Component({\n  selector: 'app-afk-timeout-modal',\n  templateUrl: './afk-timeout-modal.component.html',\n  styleUrl: './afk-timeout-modal.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [SourceButtonComponent],\n})\nexport class AfkTimeoutModalComponent {\n  #store = inject(Store);\n  #afkService = inject(AFKService);\n  readonly isAfkTimerVisible = this.#store.selectSignal(\n    unrealFeature.selectIsAfkTimerVisible,\n  );\n  readonly afkCountdown = this.#store.selectSignal(\n    unrealFeature.selectAfkCountdown,\n  );\n\n  resetAfk() {\n    this.#afkService.reset();\n  }\n}\n","@if (isAfkTimerVisible()) {\n  <div (click)=\"resetAfk()\" class=\"clickableState\" id=\"videoPlayOverlay\">\n    <div class=\"resume-box\">\n      <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n        <div [innerHTML]=\"afkCountdown()\" 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        [isFullWidth]=\"true\"\n        [data-testid]=\"'continue-session'\"\n        weight=\"primary\"\n        size=\"lg\"\n      >\n        Continue\n      </src-button>\n    </div>\n  </div>\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport {\n  selectFreezeFrameCombinedDataUrl,\n  selectFreezeFrameProgressMessageFromVideo,\n} from '../../store';\n\n@Component({\n  selector: 'app-freeze-frame',\n  templateUrl: './freeze-frame.component.html',\n  styleUrl: './freeze-frame.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FreezeFrameComponent {\n  #store = inject(Store);\n\n  readonly freezeFrameProgressMessageFromVideo = this.#store.selectSignal(\n    selectFreezeFrameProgressMessageFromVideo,\n  );\n  readonly combinedFreeze = this.#store.selectSignal(\n    selectFreezeFrameCombinedDataUrl,\n  );\n}\n","@let image = combinedFreeze();\n@let progress = freezeFrameProgressMessageFromVideo();\n\n<div class=\"freeze-images\">\n  @if (image) {\n    <img [src]=\"image\" class=\"videoStillImage\" alt=\"freezeFrameImage\" />\n  }\n\n  @if (progress) {\n    <div class=\"progress-status\">\n      {{ progress }}\n    </div>\n  }\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: string,\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 { DialogRef } from '@angular/cdk/dialog';\n\nimport { SafePipe } from '../../pipes';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n  selector: 'app-low-bandwidth-modal',\n  templateUrl: './low-bandwidth-modal.component.html',\n  styleUrl: './low-bandwidth-modal.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [SafePipe, SourceButtonComponent],\n})\nexport class LowBandwidthModalComponent {\n  #dialogRef = inject(DialogRef);\n\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  </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        weight=\"primary\"\n      >\n        Ok\n      </src-button>\n    </div>\n  </footer>\n</div>\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport {\n  selectIsLoaderScreenVisible,\n  setLoadingImageSrc,\n  unrealFeature,\n} from '../../store';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\n\n@Component({\n  selector: 'app-image-loading-src',\n  templateUrl: './image-loading-src.component.html',\n  styleUrl: './image-loading-src.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [NgOptimizedImage],\n})\nexport class ImageLoadingSrcComponent {\n  #store = inject(Store);\n\n  readonly isLoaderScreenVisible = this.#store.selectSignal(\n    selectIsLoaderScreenVisible,\n  );\n  readonly imageLoadingSrc = this.#store.selectSignal(\n    unrealFeature.selectImageLoadingSrc,\n  );\n\n  imageError() {\n    this.#store.dispatch(setLoadingImageSrc({ src: '' }));\n  }\n}\n","@let image = imageLoadingSrc();\n@if (isLoaderScreenVisible()) {\n  <div class=\"preload\">\n    <div class=\"back\">\n      @if (image) {\n        <img\n          (error)=\"imageError()\"\n          [ngSrc]=\"image\"\n          fill\n          loading=\"lazy\"\n          alt=\"image loading src\"\n        />\n      }\n    </div>\n  </div>\n}\n","import {\n  afterNextRender,\n  ChangeDetectionStrategy,\n  Component,\n  effect,\n  ElementRef,\n  HostListener,\n  inject,\n  input,\n  signal,\n  untracked,\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  styleUrl: './stat-graph.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StatGraphComponent {\n  readonly label = input.required<string>();\n  readonly stat = input<{ value: number }>();\n  readonly color = input('#417bc9');\n  readonly tickStep = input(3);\n\n  private el = inject(ElementRef);\n  readonly graph = viewChild<ElementRef<HTMLCanvasElement>>('graph');\n\n  private data: (number | null)[] = [];\n  readonly max = signal(0);\n  readonly min = signal(0);\n  readonly current = signal(0);\n\n  private canvas!: HTMLCanvasElement;\n  private ctx!: CanvasRenderingContext2D;\n\n  constructor() {\n    effect(() => {\n      const stat = this.stat();\n      untracked(() => this.pushData(stat?.value ?? null));\n    });\n    afterNextRender({\n      read: () => {\n        const graph = this.graph();\n        if (graph) {\n          this.canvas = graph.nativeElement;\n          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n          this.ctx = this.canvas.getContext('2d')!;\n        }\n      },\n    });\n  }\n\n  @HostListener('window:resize')\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.set(Math.max(...all));\n    this.min.set(Math.min(...all));\n    const scaleY = this.canvas.height / (this.max() || 1);\n    this.current.set(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) * 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) {\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      return '#' + RGBtoHEX(r, g, b);\n    }\n  }\n\n  private pushData(stat: number | null) {\n    this.data.push(stat);\n    if (!this.canvas) {\n      return;\n    }\n    if (this.data.length > this.canvas.width / this.tickStep()) {\n      this.data.shift();\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","import type { OnInit } from '@angular/core';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  inject,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { Falsy, tapLog, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { merge, of, skip, Subject, switchMap } from 'rxjs';\nimport {\n  debounceTime,\n  delay,\n  distinctUntilChanged,\n  filter,\n  map,\n  tap,\n} from 'rxjs/operators';\nimport {\n  selectShowLoader,\n  selectTotalProgress,\n  unrealFeature,\n} from '../../store';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { SCREEN_LOCKER_CONTAINER_ID, UNREAL_CONFIG } from '../../constants';\nimport { floatToSmoothPercents, keepMaxUntilReset } from '../../helpers';\nimport { SourceLoadingComponent } from '@3dsource/source-ui-native';\n\n@Component({\n  selector: 'app-unreal-status',\n  templateUrl: './unreal-status.component.html',\n  styleUrl: './unreal-status.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [SourceLoadingComponent],\n})\nexport class UnrealStatusComponent implements OnInit {\n  private readonly unrealInitialConfig = inject(UNREAL_CONFIG);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly store = inject(Store);\n\n  private readonly resetPercentageSignal$ = this.store\n    .select(selectShowLoader)\n    .pipe(filter(Falsy));\n\n  readonly showLoader = this.store.selectSignal(selectShowLoader);\n  /**\n   * An observable that emits smoothed percentage values from 0 to 100.\n   */\n  readonly messagePercents = toSignal(\n    this.store.select(selectTotalProgress).pipe(\n      keepMaxUntilReset(this.resetPercentageSignal$),\n      floatToSmoothPercents(),\n      distinctUntilChanged(),\n      map((progress) => progress || 0),\n    ),\n  );\n\n  readonly awsInstance = this.store.selectSignal(\n    unrealFeature.selectAwsInstance,\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     * A subscription that merges various status observables and emits debounced status via postMessage.\n     */\n    merge(nullifyObs$, cirrusConnected$, signalingStatus$, streamToggle$)\n      .pipe(\n        tapLog('STATUS=>'),\n        debounceTime(0),\n        takeUntilDestroyed(this.destroyRef),\n      )\n      .subscribe((status) => this.sendMessageToIndex(status as string));\n  }\n\n  /**\n   * Sends a message to the embedded iframe identified by the default value '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      this.unrealInitialConfig?.screenLockerContainerId ||\n        SCREEN_LOCKER_CONTAINER_ID,\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 (showLoader()) {\n  <div class=\"status-box\">\n    @if (awsInstance()?.message) {\n      <p>{{ awsInstance()?.message }}</p>\n    } @else {\n      <div class=\"status-box__message\">\n        <src-loading\n          [size]=\"30\"\n          [backgroundStrokeColor]=\"'#E5E7EB'\"\n          [progressStrokeColor]=\"'#1F2937'\"\n        />\n        {{ messagePercents() }}%\n      </div>\n    }\n  </div>\n}\n","import type { OnInit } from '@angular/core';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  inject,\n  signal,\n} from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { BehaviorSubject, combineLatestWith, of } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport type { InboundVideoStats } from '../../interfaces';\nimport { selectSignalingParameters, unrealFeature } from '../../store';\nimport { StatGraphComponent } from '../stat-graph/stat-graph.component';\nimport { AsyncPipe, JsonPipe } from '@angular/common';\nimport { Store } from '@ngrx/store';\nimport { DevModeService, VideoService } from '../../services';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { SafePipe } from '../../pipes';\n\ninterface GraphListItem {\n  key: string;\n  color: string;\n  stat: Observable<{ value: number }>;\n}\n\n@Component({\n  selector: 'app-video-stats',\n  templateUrl: './video-stats.component.html',\n  styleUrl: './video-stats.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [StatGraphComponent, AsyncPipe, JsonPipe, SafePipe],\n})\nexport class VideoStatsComponent implements OnInit {\n  readonly collapsed = signal(false);\n  private store = inject(Store);\n  private videoService = inject(VideoService);\n  private isDevMode = inject(DevModeService).isDevMode;\n  private obs$ = this.videoService.videoStats$;\n  readonly viewportReady = this.store.selectSignal(\n    unrealFeature.selectViewportReady,\n  );\n  readonly ssInfo = this.store.selectSignal(selectSignalingParameters);\n  readonly fpsTick = toSignal(\n    this.obs$.pipe(\n      map((stat) => ({\n        value: stat.aggregatedStats.framesPerSecond || 0,\n      })),\n    ),\n  );\n  readonly fpsAvgTick = toSignal(\n    this.obs$.pipe(\n      map((stat) => ({\n        value: stat.aggregatedStats.avgFrameRate,\n      })),\n    ),\n  );\n  readonly bitrateTick = toSignal(\n    this.obs$.pipe(\n      map((stat) => ({\n        value: stat.aggregatedStats.bitrate,\n      })),\n    ),\n  );\n  readonly videoQP = toSignal(\n    this.obs$.pipe(\n      map((stat) => ({\n        value: stat.aggregatedStats.VideoEncoderQP,\n      })),\n    ),\n  );\n  readonly bitrateAverageTick = toSignal(\n    this.obs$.pipe(\n      map((stat) => ({\n        value: stat.aggregatedStats.avgBitrate,\n      })),\n    ),\n  );\n  readonly 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: InboundVideoStats) => {\n        return this.fields\n          .map((key) => {\n            return {\n              key,\n              value: data[key as keyof InboundVideoStats],\n            };\n          })\n          .filter((r) => !this.elementsToShow.includes(r.key));\n      }),\n    ),\n  );\n  fields!: string[];\n  graphList: GraphListItem[] = [];\n  graphList$!: Observable<GraphListItem[]>;\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      'selectedPair',\n      //'pliCount',\n      //'sliCount',\n      //'transportId',\n      //'id',\n    ];\n\n    this.updateGraph();\n  }\n\n  updateGraph() {\n    this.graphList = this.fields.map((key: string) => {\n      const stat = this.obs$.pipe(\n        map((val) => {\n          const value = val.aggregatedStats[\n            key as keyof InboundVideoStats\n          ] as number;\n          return { value };\n        }),\n      );\n\n      return {\n        key,\n        color: Math.floor(Math.random() * 16777216).toString(),\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.update((collapsed) => !collapsed);\n    this.writeFields();\n  }\n\n  toggleGraph($event: MouseEvent, el: string, value?: unknown) {\n    $event.stopPropagation();\n    if (\n      (value && typeof value !== 'number') ||\n      (typeof value === 'number' && isNaN(value))\n    ) {\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.set(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() && viewportReady()) {\n  <div class=\"settings-container\">\n    <button (click)=\"toggle()\" class=\"gear-button\">Stats</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              [stat]=\"fpsTick()!\"\n              label=\"FPS (higher is better)\"\n            />\n          </li>\n          <li>\n            <app-stat-graph\n              [stat]=\"videoQP()!\"\n              label=\"QP (lower is better)\"\n              color=\"#D5ff07\"\n            />\n          </li>\n          <li>\n            <app-stat-graph\n              [stat]=\"bitrateTick()!\"\n              label=\"Bitrate\"\n              color=\"#D57F07\"\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                [stat]=\"(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","import type { AfterViewInit, OnInit } from '@angular/core';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  inject,\n  signal,\n} from '@angular/core';\nimport { VideoService } from '../../services';\nimport {\n  resetAfk,\n  selectIsExistMatchUrls,\n  selectIsLoaderScreenVisible,\n  selectShowReconnectPopup,\n  selectStreamConfig,\n  startStream,\n  unrealFeature,\n  videoStreamInitialized,\n} from '../../store';\nimport { filter, skip } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Falsy, Logger } from '@3dsource/utils';\nimport { Store } from '@ngrx/store';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\nimport { Actions, ofType } from '@ngrx/effects';\n\n@Component({\n  selector: 'app-resume-stream-button',\n  templateUrl: './resume-stream-button.component.html',\n  styleUrl: './resume-stream-button.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [SourceButtonComponent],\n})\nexport class ResumeStreamButtonComponent implements AfterViewInit, OnInit {\n  actions$ = inject(Actions);\n  #store = inject(Store);\n  #videoService = inject(VideoService);\n  #destroyRef = inject(DestroyRef);\n\n  readonly showReconnectPopup = this.#store.selectSignal(\n    selectShowReconnectPopup,\n  );\n  readonly isLoaderScreenVisible = this.#store.selectSignal(\n    selectIsLoaderScreenVisible,\n  );\n  readonly streamConfig = this.#store.selectSignal(selectStreamConfig);\n  readonly isExistMatchUrls = this.#store.selectSignal(selectIsExistMatchUrls);\n\n  readonly isSecondStart = signal(\n    !!(this.streamConfig()?.autoStart && location.href.match(/^https/gi)),\n  );\n  readonly isShowResumeButton = computed(\n    () =>\n      this.isLoaderScreenVisible() &&\n      this.showReconnectPopup() &&\n      this.isExistMatchUrls(),\n  );\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    this.actions$\n      .pipe(\n        ofType(videoStreamInitialized),\n        takeUntilDestroyed(this.#destroyRef),\n        filter(() => !!this.#videoService.video?.paused),\n      )\n      .subscribe(() => {\n        Logger.info('Simulate Press Play');\n        this.#videoService.play();\n        this.#store.dispatch(resetAfk());\n      });\n  }\n\n  connect() {\n    this.#store.dispatch(startStream({ config: { autoStart: true } }));\n  }\n\n  onDisconnect() {\n    this.isSecondStart.set(true);\n  }\n}\n","@if (isShowResumeButton()) {\n  <div class=\"resume-box\">\n    @if (isSecondStart()) {\n      <div class=\"resume-box__text\">\n        Your stream has been paused due to inactivity\n      </div>\n    }\n\n    <src-button\n      (onClick)=\"connect()\"\n      [isFullWidth]=\"true\"\n      [data-testid]=\"'connect-button'\"\n      size=\"lg\"\n      weight=\"primary\"\n      class=\"connect-button\"\n    >\n      {{ isSecondStart() ? 'Resume' : 'Start' }}\n    </src-button>\n  </div>\n}\n","import type { ElementRef } from '@angular/core';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  effect,\n  inject,\n  untracked,\n  viewChild,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\nimport { resetIntroSrc, unrealFeature } from '../../store';\n\n@Component({\n  selector: 'app-intro-src',\n  templateUrl: './intro-src.component.html',\n  styleUrl: './intro-src.component.scss',\n  imports: [NgOptimizedImage],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class IntroSrcComponent {\n  private readonly videoElement =\n    viewChild<ElementRef<HTMLDivElement>>('videoPlayerCover');\n  #store = inject(Store);\n  protected imageIntroSrc = this.#store.selectSignal(\n    unrealFeature.selectImageIntroSrc,\n  );\n  protected videoIntroSrc = this.#store.selectSignal(\n    unrealFeature.selectVideoIntroSrc,\n  );\n  private viewportReady = this.#store.selectSignal(\n    unrealFeature.selectViewportReady,\n  );\n\n  constructor() {\n    effect(() => {\n      const viewportReady = this.viewportReady();\n      const videoIntroSrc = this.videoIntroSrc();\n      const imageIntroSrc = this.imageIntroSrc();\n      untracked(() => {\n        if (viewportReady && (videoIntroSrc || imageIntroSrc)) {\n          this.#store.dispatch(resetIntroSrc());\n        }\n      });\n    });\n    effect(() => {\n      const videoElement = this.videoElement();\n      const videoIntroSrc = this.videoIntroSrc();\n      untracked(() => {\n        if (videoElement && videoIntroSrc) {\n          this.createVideo(videoIntroSrc, videoElement.nativeElement);\n        }\n      });\n    });\n  }\n\n  private createVideo(src: string, videoContainer: HTMLDivElement) {\n    if (typeof src !== 'string') {\n      return;\n    }\n    const matchAbsolutePath = /.*\\.(mp4|WebM)(\\?.*)?$/i.test(src);\n    videoContainer.innerHTML = ''; // This will remove all existing content within the layout\n    const videoElement = document.createElement('video');\n    videoElement.autoplay = true;\n    videoElement.muted = true;\n    videoElement.loop = true;\n    if (!matchAbsolutePath) {\n      videoElement.poster = `${src}/cover.webp`;\n    }\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    if (matchAbsolutePath) {\n      sourceElement.src = src;\n    } else {\n      sourceElement.src = `${src}/video.mp4`;\n    }\n\n    sourceElement.type = 'video/mp4';\n    videoElement.appendChild(sourceElement);\n\n    videoElement.addEventListener('error', () =>\n      this.#store.dispatch(resetIntroSrc()),\n    );\n    sourceElement.addEventListener('error', () =>\n      this.#store.dispatch(resetIntroSrc()),\n    );\n\n    videoContainer.appendChild(videoElement);\n  }\n\n  imageError() {\n    this.#store.dispatch(resetIntroSrc());\n  }\n}\n","@let image = imageIntroSrc();\n@if (image) {\n  <div class=\"backImage\">\n    <img (error)=\"imageError()\" [ngSrc]=\"image\" fill alt=\"imageSrc\" />\n  </div>\n} @else if (videoIntroSrc()) {\n  <div #videoPlayerCover class=\"backVideo\"></div>\n}\n","import {\n  afterNextRender,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  effect,\n  ElementRef,\n  HostListener,\n  inject,\n  input,\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 {\n  DevModeService,\n  UnrealCommunicatorService,\n  VideoService,\n} from '../../services';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport type { Size } from '@3dsource/utils';\nimport { fpIsASameAsB, Truthy } from '@3dsource/utils';\nimport { Store } from '@ngrx/store';\nimport {\n  changeStreamResolutionAction,\n  destroyUnrealScene,\n  forceResizeViewport,\n  initSignalling,\n  selectIsExistMatchUrls,\n  selectIsFreezeFrameLoading,\n  unrealFeature,\n  videoAdaptedToContainer,\n  videoStreamInitialized,\n} from '../../store';\nimport {\n  DEBOUNCE_TO_MANY_RESIZE_CALLS,\n  FULL_HD_HEIGHT,\n  FULL_HD_WIDTH,\n  SAME_SIZE_THRESHOLD,\n} from '../../constants';\nimport {\n  getResizeStudioValues,\n  getResizeValuesUniversal,\n  makeEven,\n} from '../../helpers';\nimport { AfkTimeoutModalComponent } from '../afk-timeout-modal/afk-timeout-modal.component';\nimport { UnrealStatusComponent } from '../unreal-status/unreal-status.component';\nimport { FreezeFrameComponent } from '../freeze-frame/freeze-frame.component';\nimport { VideoStatsComponent } from '../video-stats/video-stats.component';\nimport { ResumeStreamButtonComponent } from '../resume-stream-button/resume-stream-button.component';\nimport { ImageLoadingSrcComponent } from '../image-loading-src/image-loading-src.component';\nimport { IntroSrcComponent } from '../intro-src/intro-src.component';\nimport { EPayloadVersion, MetaBoxCommand } from '@3dsource/types-unreal';\nimport { Actions, ofType } from '@ngrx/effects';\n\n@Component({\n  selector: 'app-unreal-scene',\n  templateUrl: './unreal-scene.component.html',\n  styleUrl: './unreal-scene.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    AfkTimeoutModalComponent,\n    UnrealStatusComponent,\n    FreezeFrameComponent,\n    VideoStatsComponent,\n    ResumeStreamButtonComponent,\n    ImageLoadingSrcComponent,\n    IntroSrcComponent,\n  ],\n})\nexport class UnrealSceneComponent {\n  readonly isStudio = input(false);\n  readonly useContainerAsSizeProvider = input(true);\n  readonly 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  readonly videoElement =\n    viewChild<ElementRef<HTMLDivElement>>('videoContainer');\n  changeMouseOverScene = output<boolean>();\n  private width = FULL_HD_WIDTH;\n  private height = FULL_HD_HEIGHT;\n  private readonly actions$ = inject(Actions);\n  #store = inject(Store);\n  private isExistMatchUrls = this.#store.selectSignal(selectIsExistMatchUrls);\n  readonly isDevMode = inject(DevModeService).isDevMode;\n  readonly lightMode = this.#store.selectSignal(\n    unrealFeature.selectLowBandwidth,\n  );\n  private isFreezeFrameLoading = this.#store.selectSignal(\n    selectIsFreezeFrameLoading,\n  );\n  private readonly maxResolution = Truthy(\n    new URLSearchParams(location.search).get('maxresolution'),\n  );\n  private commandsSender = inject(UnrealCommunicatorService);\n  private videoService = inject(VideoService);\n  private element = inject(ElementRef);\n  private destroyRef = inject(DestroyRef);\n\n  private get resizeValues() {\n    if (this.isStudio()) {\n      return this.getResizeStudioValues();\n    }\n    return this.getResizeValuesUniversal();\n  }\n\n  private get pixelRatio() {\n    return window.devicePixelRatio;\n  }\n\n  @HostListener('mouseover')\n  onMouseOver() {\n    this.changeMouseOverScene.emit(true);\n  }\n  @HostListener('mouseout')\n  onMouseOut() {\n    this.changeMouseOverScene.emit(false);\n  }\n\n  constructor() {\n    this.destroyRef.onDestroy(() => this.#store.dispatch(destroyUnrealScene()));\n    effect(() => {\n      const videoElement = this.videoElement();\n      const isExistMatchUrls = this.isExistMatchUrls();\n      if (videoElement && isExistMatchUrls) {\n        this.#store.dispatch(initSignalling());\n      }\n    });\n\n    afterNextRender({\n      read: () => {\n        const videoElement = this.videoElement();\n        if (videoElement) {\n          this.videoService.setContainer(videoElement.nativeElement);\n\n          if (this.element?.nativeElement) {\n            fromEvent<Event>(this.element?.nativeElement, 'contextmenu')\n              .pipe(takeUntilDestroyed(this.destroyRef))\n              .subscribe((event: Event) => event.preventDefault());\n          }\n          this.listenResizeValues();\n        }\n      },\n    });\n  }\n\n  private listenResizeValues() {\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      this.actions$.pipe(ofType(videoStreamInitialized)),\n      fromEvent(window, 'resize'),\n    );\n\n    const videoStreamSizeChanged$ = this.videoService?.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          // 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    this.actions$\n      .pipe(ofType(forceResizeViewport), takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.sendResize(this.resizeValues));\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 = makeEven(size.w / pR / areaSize.scale);\n      video.height = makeEven(size.h / pR / areaSize.scale);\n\n      if (!this.isStudio()) {\n        video.style.overflow = 'hidden';\n        video.style.objectFit = 'cover';\n        video.style.width = `${video.width}px`;\n        video.style.height = `${video.height}px`;\n      }\n    }\n\n    this.#store.dispatch(videoAdaptedToContainer());\n  }\n\n  private getResizeValuesUniversal() {\n    let containerWidth = window.innerWidth || 2;\n    let containerHeight = window.innerHeight || 2;\n\n    if (this.useContainerAsSizeProvider()) {\n      containerWidth = this.videoElement()?.nativeElement.offsetWidth || 2;\n      containerHeight = this.videoElement()?.nativeElement.offsetHeight || 2;\n    }\n    const pixelRatio = this.pixelRatio;\n\n    return getResizeValuesUniversal({\n      pixelRatio,\n      containerWidth,\n      containerHeight,\n      maxResolution: this.maxResolution,\n    });\n  }\n\n  private getResizeStudioValues() {\n    const videoElement = this.videoElement()?.nativeElement;\n\n    return getResizeStudioValues({\n      pixelRatio: this.pixelRatio,\n      containerWidth: videoElement?.offsetWidth || 2,\n      containerHeight: videoElement?.offsetHeight || 2,\n      studioWidth: this.width,\n      studioHeight: this.height,\n      maxResolution: this.maxResolution,\n    });\n  }\n\n  private sendResize(size: Size) {\n    this.commandsSender.sendCommandToUnreal({\n      command: MetaBoxCommand.FChangeResolutionCommand,\n      payload: {\n        resolution: { x: size.w, y: size.h },\n        payloadVersion: this.isStudio()\n          ? EPayloadVersion.disableFovRecalculation\n          : undefined,\n      },\n    });\n  }\n}\n","<div class=\"frame unreal-container\">\n  <div #videoContainer [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\n\n  <app-intro-src />\n  <app-image-loading-src />\n  <app-resume-stream-button />\n  <app-unreal-status />\n  <app-freeze-frame />\n  <app-afk-timeout-modal />\n\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\n  @if (isDevMode) {\n    <app-video-stats />\n  }\n</div>\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { disconnectStream, unrealFeature } from '../../store';\nimport { DisconnectReason } from '../../interfaces';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\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: [SourceButtonComponent],\n})\nexport class WebrtcErrorModalComponent {\n  #dialogRef = inject(DialogRef);\n  #store = inject(Store);\n  readonly isCirrusConnected = inject(Store).selectSignal(\n    unrealFeature.selectCirrusConnected,\n  );\n\n  close() {\n    this.#dialogRef.close();\n  }\n\n  closeModalWithCirrusDisconnect() {\n    if (!this.isCirrusConnected()) {\n      this.#store.dispatch(\n        disconnectStream({\n          reason: DisconnectReason.DropConnection,\n          message: 'Modal Drop Connection',\n        }),\n      );\n    }\n    this.close();\n  }\n}\n","<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n  <header class=\"src-modal__header\"></header>\n  <section class=\"src-modal__body\">\n    <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n      WebRTC error\n    </div>\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      weight=\"primary\"\n    >\n      Ok\n    </src-button>\n  </footer>\n</div>\n","import type { OnInit } from '@angular/core';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport type { FilterSettings } from '../DataFlowConstants';\nimport { DefaultFilterModel, FilterModel } from '../DataFlowConstants';\nimport { Store } from '@ngrx/store';\nimport { setKalmanSettings } from '../../../store';\n\n@Component({\n  selector: 'app-filter-settings',\n  templateUrl: './filter-settings.component.html',\n  styleUrl: './filter-settings.component.scss',\n  imports: [FormsModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterSettingsComponent implements OnInit {\n  #store = inject(Store);\n  private readonly storageKey = 'LBMFilterSettings';\n  readonly defaultFilterModel = { ...DefaultFilterModel };\n  settings = { ...DefaultFilterModel };\n\n  ngOnInit() {\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(settings: FilterSettings) {\n    try {\n      localStorage.setItem(this.storageKey, JSON.stringify(settings));\n    } catch (e) {\n      Logger.error('Storage not available, Error saving filter settings:', e);\n    }\n    Object.assign(this.settings, settings);\n    Object.assign(FilterModel, settings);\n    this.#store.dispatch(setKalmanSettings({ settings }));\n  }\n\n  reset() {\n    this.dispatch({\n      ...DefaultFilterModel,\n      panelOpen: this.settings.panelOpen,\n    });\n  }\n}\n","<div class=\"settings-container\">\n  <button (click)=\"togglePanel()\" class=\"gear-button\">LBM</button>\n  @if (settings.panelOpen) {\n    <div 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  }\n</div>\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, Truthy } from '@3dsource/utils';\nimport {\n  takeUntilDestroyed,\n  toObservable,\n  toSignal,\n} from '@angular/core/rxjs-interop';\nimport { changeLowBandwidth, unrealFeature } from '../../store';\nimport { Dialog } from '@angular/cdk/dialog';\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 { DevModeService, VideoService } from '../../services';\nimport type { Quality } from '../../interfaces';\nimport type { DataFlowCheckResult } from '../../helpers';\nimport { FilterSettingsComponent } from './filter-settings/filter-settings.component';\nimport { BITRATE_MONITOR, FilterModel } from './DataFlowConstants';\n\n@Component({\n  selector: 'app-low-bandwidth-detector',\n  templateUrl: './low-bandwidth-detector.component.html',\n  styleUrl: './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 videoService = inject(VideoService);\n  readonly isDevMode = inject(DevModeService).isDevMode;\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.videoService.videoStats$.pipe(\n    map((data) => data.aggregatedStats),\n    share(),\n  );\n  private readonly nativeQuality$ = this.videoService.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    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$, { initialValue: 0 });\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 a 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 (isDevMode) {\n  <app-filter-settings />\n}\n","import { provideState } from '@ngrx/store';\nimport { provideEffects } from '@ngrx/effects';\nimport {\n  CommandsEffects,\n  commandsFeature,\n  UnrealEffects,\n  unrealFeature,\n} from '../store';\nimport {\n  AFKService,\n  AggregatorService,\n  AnalyticsService,\n  CommandTelemetryService,\n  ConsoleExtensionsService,\n  FileHandlerService,\n  FileReceiverService,\n  FpsMonitorService,\n  FreezeFrameService,\n  InputService,\n  RegionsPingService,\n  SignallingService,\n  StreamStatusTelemetryService,\n  StreamStatusTelemetryService2,\n  UnrealCallbackService,\n  UnrealCommunicatorService,\n  VideoService,\n  WebRtcPlayerService,\n} from '../services';\nimport {\n  inject,\n  makeEnvironmentProviders,\n  provideEnvironmentInitializer,\n} from '@angular/core';\n\nexport function provideUnrealModule() {\n  return makeEnvironmentProviders([\n    provideState(commandsFeature),\n    provideState(unrealFeature),\n    provideEffects([CommandsEffects, UnrealEffects]),\n    ConsoleExtensionsService,\n    InputService,\n    VideoService,\n    RegionsPingService,\n    FileReceiverService,\n    FileHandlerService,\n    AnalyticsService,\n    UnrealCallbackService,\n    CommandTelemetryService,\n    AggregatorService,\n    FreezeFrameService,\n    UnrealCommunicatorService,\n    AFKService,\n    SignallingService,\n    StreamStatusTelemetryService,\n    StreamStatusTelemetryService2,\n    FpsMonitorService,\n    WebRtcPlayerService,\n    provideEnvironmentInitializer(() => {\n      inject(AggregatorService);\n      inject(InputService);\n      inject(StreamStatusTelemetryService);\n      inject(StreamStatusTelemetryService2);\n      inject(ConsoleExtensionsService);\n      inject(AFKService);\n      inject(FreezeFrameService);\n      inject(AnalyticsService);\n      inject(FpsMonitorService);\n    }),\n  ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["scoped","initialState","map","switchMap","timeout","tap","debounceTime","takeUntil","take","startWith","filter","withLatestFrom","uuidv4","skip","distinctUntilChanged"],"mappings":"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"}