@3dsource/angular-unreal-module 0.0.13 → 0.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/3dsource-angular-unreal-module.mjs +189 -742
- package/fesm2022/3dsource-angular-unreal-module.mjs.map +1 -1
- package/lib/components/clickable-overlay/clickable-overlay.component.d.ts +0 -3
- package/lib/components/screen-locker/afk-restart-screen-locker.component.d.ts +0 -3
- package/lib/components/unreal-error-modal/unreal-error-modal.component.d.ts +11 -0
- package/lib/constants/index.d.ts +0 -1
- package/lib/helpers/CommandObserver.d.ts +1 -1
- package/lib/helpers/EventWrapper.d.ts +1 -1
- package/lib/helpers/prepare-commands.d.ts +1 -1
- package/lib/interfaces/index.d.ts +0 -1
- package/lib/interfaces/initial-config.d.ts +0 -2
- package/lib/interfaces/unreal-internal-signal-events.interface.d.ts +1 -1
- package/lib/services/index.d.ts +0 -1
- package/lib/services/unreal-communicator.service.d.ts +1 -1
- package/lib/store/unreal.actions.d.ts +7 -0
- package/package.json +6 -7
- package/lib/constants/mix-panel.constant.d.ts +0 -11
- package/lib/interfaces/mix-panel-events.d.ts +0 -8
- package/lib/interfaces/struct.d.ts +0 -5553
- package/lib/services/mix-panel.service.d.ts +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"3dsource-angular-unreal-module.mjs","sources":["../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/unreal-internal-signal-events.interface.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/EventWrapper.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.actions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/CustomCloseCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/disconnect-reasons.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/mix-panel-events.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/SignalingMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/ButtonsAndCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EControlSchemeType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EToClientMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/initial-config.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/InputOptions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/mix-panel.constant.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/UnrealStatusMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/unreal.constant.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/clamp-and-keep-max-percents.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/CommandObserver.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataDecoder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataFlowMonitor.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/dispatchResize.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/GetNextUrl.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/KalmanFilter1D.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/LatencyTimings.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/mapQpToQuality.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/struct.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/prepare-commands.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/remove-exile-commands.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resetAfk.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resize-observer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/TouchEmulator.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/VideoRecorder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.reducer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.feature.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.selectors.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/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/services/sub.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/screen-locker/afk-restart-screen-locker.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/screen-locker/afk-restart-screen-locker.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/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/services/freeze-frame.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/command-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/regions-ping.service.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/components/low-bandwidth-indicator/DataFlowConstants.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video-stream-status.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/afk.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/dev-mode.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/console-extensions.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/unreal-communicator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/input.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/mix-panel.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/stream-status-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.effects.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/deepEqual.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/aggregator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-locker/video-locker.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-locker/video-locker.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/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/3dsource-angular-unreal-module.ts"],"sourcesContent":["import type { MetaBoxCommandPacket } from './struct';\nimport type { Quality } from './quality.interface';\nimport type { DataFlowCheckResult } from '../helpers';\n\nexport const UnrealInternalSignalEvents = {\n OnVideoInitialized: 'OnVideoInitialized',\n RestAfkTimer: 'RestAfkTimer',\n FreezeFrameStart: 'FreezeFrameStart',\n UnrealCallback: 'UnrealCallback',\n ClickableOverlay: 'ClickableOverlay',\n VideoPlayClick: 'VideoPlayClick',\n ShowPlayButton: 'ShowPlayButton',\n ForceResizeViewport: 'ForceResizeViewport',\n VideoAdaptedToContainer: 'VideoAdaptedToContainer',\n TelemetryStart: 'TelemetryStart',\n TelemetryStop: 'TelemetryStop',\n TelemetryReset: 'TelemetryReset',\n} as const;\n\nexport interface SignalDescriptor {\n [UnrealInternalSignalEvents.UnrealCallback]: {\n json: UnrealCallBackJson;\n };\n [UnrealInternalSignalEvents.ClickableOverlay]: {\n message: string;\n className: string;\n isActivityDetected: boolean;\n onOverlayClick: () => void;\n } | void;\n [UnrealInternalSignalEvents.VideoPlayClick]: {\n text: string;\n };\n [UnrealInternalSignalEvents.ForceResizeViewport]: void;\n [UnrealInternalSignalEvents.OnVideoInitialized]: HTMLVideoElement;\n [UnrealInternalSignalEvents.VideoAdaptedToContainer]: void;\n [UnrealInternalSignalEvents.ShowPlayButton]: {\n text: string;\n callback: () => boolean;\n };\n [UnrealInternalSignalEvents.RestAfkTimer]: void;\n [UnrealInternalSignalEvents.FreezeFrameStart]: void;\n [UnrealInternalSignalEvents.TelemetryReset]: void;\n [UnrealInternalSignalEvents.TelemetryStart]: { externalId: string };\n [UnrealInternalSignalEvents.TelemetryStop]: {\n externalId: string;\n payload?: { multi?: boolean };\n };\n\n [key: string]: any;\n}\n\nexport type UnrealCallBackJson =\n | MetaBoxCommandPacket\n | WrappedMetaBoxCommandPacket;\n\nexport interface WrappedMetaBoxCommandPacket {\n commandCallback: MetaBoxCommandPacket;\n}\n\nexport interface IAggregatedStat {\n quality: Quality;\n aggregatedStats: InboundVideoStats;\n}\n\nexport interface InboundVideoStats extends RTCInboundRtpStreamStats {\n VideoEncoderQP: number;\n runTime: number;\n pixelRatio: number;\n bytesReceivedStart: number;\n framesDecodedStart: number;\n timestampStart: number;\n videoCodec: string;\n avgBitrate: number;\n avgFrameRate: number;\n currentRoundTripTime: number;\n codecs: Record<string, string>;\n receiveToCompositeMs: number;\n bitrate: number;\n kalmanBitrate: number;\n bitrateDrop: number;\n dataFlowCheckResult: DataFlowCheckResult;\n dataFlowBitrate: DataFlowCheckResult;\n}\n\nexport interface AwsInstance {\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n}\n","import type { SignalDescriptor } from '../interfaces/unreal-internal-signal-events.interface';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport type { Observable } from 'rxjs';\nimport { Signal } from '@3dsource/utils';\nimport { filter, map } from 'rxjs/operators';\nimport type { MetaBoxCommandList } from '../interfaces/struct';\n\ntype Descriptor = MetaBoxCommandList & SignalDescriptor;\n\n/**\n * UnrealInternalSignalEvents commands list wrapper listener\n * @param event\n */\nexport function fromSignal<K extends keyof Descriptor>(\n event: K,\n): Observable<Descriptor[K]> {\n return Signal.on(event).pipe(\n //tapLog('fromSignal', event), // <== for debugging, do not remove\n map((data: any) => data.detail),\n );\n}\n\ntype ArgumentType<K extends keyof Descriptor> = Descriptor[K] extends void\n ? never\n : Descriptor[K];\n\n/**\n * UnrealInternalSignalEvents commands list wrapper sender\n * @param event\n * @param args\n */\nexport function sendSignal<K extends keyof Descriptor>(\n event: K,\n ...args: ArgumentType<K> extends never ? [] : [ArgumentType<K>]\n) {\n Signal.broadcast(event, { detail: args?.[0] || null });\n}\n\nexport function fromUnrealCallBackSignal<K extends keyof Descriptor>(\n command: K,\n): Observable<Descriptor[K]> {\n return fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map((data) => data?.json),\n map((json) => {\n if ('commandCallback' in json) {\n return json?.commandCallback;\n }\n\n return json;\n }),\n filter((json) => json.command === command),\n map((data) => data),\n map((data) => {\n if ('payload' in data) {\n return {\n command: data.command,\n payload: data?.payload,\n } as Descriptor[K];\n }\n\n return {\n command: data.command,\n } as Descriptor[K];\n }),\n );\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal } from '../../helpers/EventWrapper';\nimport { NgClass } from '@angular/common';\nimport {\n SourceButtonColorScheme,\n SourceButtonComponent,\n SourceButtonSize,\n} from '@source/ui-sdk/source-button';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'app-clickable-overlay',\n templateUrl: './clickable-overlay.component.html',\n styleUrls: ['./clickable-overlay.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, SourceButtonComponent],\n})\nexport class ClickableOverlayComponent {\n protected SourceButtonSize = SourceButtonSize;\n protected SourceButtonColorScheme = SourceButtonColorScheme;\n\n state = toSignal(\n fromSignal(UnrealInternalSignalEvents.ClickableOverlay).pipe(\n map((data) => (typeof data === 'object' ? data : null)),\n ),\n );\n}\n","@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [colorScheme]=\"SourceButtonColorScheme.PRIMARY\"\n [isFullWidth]=\"true\"\n [size]=\"SourceButtonSize.LARGE\"\n [data-testid]=\"'continue-session'\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n","import { createAction, props } from '@ngrx/store';\nimport {\n DisconnectType,\n LBMStats,\n SignalingData,\n StreamConfig,\n UnrealErrorType,\n} from '../interfaces';\n\nconst scoped = (templateString: TemplateStringsArray) =>\n `[UNREAL] ${templateString[0]}`;\nexport const changeLowBandwidth = createAction(\n scoped`change low bandwidth`,\n props<{\n lowBandwidth: boolean;\n stats?: LBMStats;\n }>(),\n);\nexport const setMaxFps = createAction(\n scoped`change fps`,\n props<{ maxFps: number }>(),\n);\nexport const destroyRemoteConnections = createAction(\n scoped`destroyRemoteConnections`,\n props<{ disconnectReason: DisconnectType }>(),\n);\nexport const destroyConnectionsAndResetState = createAction(\n scoped`destroyConnections and reset`,\n);\nexport const setCirrusConnected = createAction(scoped`cirrusConnected`);\nexport const setCirrusDisconnected = createAction(scoped`cirrusDisconnected`);\nexport const changeStatusMainVideoOnScene = createAction(\n scoped`change status main video on scene`,\n props<{ isVideoPlaying: boolean }>(),\n);\nexport const setAwsInstance = createAction(\n scoped`set aws instance`,\n props<{\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n }>(),\n);\nexport const setStatusMessage = createAction(\n scoped`set status message`,\n props<{ message: string | null }>(),\n);\nexport const setStatusPercentSignallingServer = createAction(\n scoped`change status percent signalling server`,\n props<{ percent: number | null }>(),\n);\nexport const setFreezeFrame = createAction(\n scoped`set freeze frame`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setUnrealVersion = createAction(\n scoped`set unreal version`,\n props<{ version: string }>(),\n);\nexport const setStreamClientCompanyId = createAction(\n scoped`set stream client company id`,\n props<{ id: string }>(),\n);\nexport const setStreamViewId = createAction(\n scoped`set stream view id`,\n props<{ id: string }>(),\n);\nexport const setIntroImageSrc = createAction(\n scoped`set intro image src`,\n props<{ src: string }>(),\n);\nexport const setLoadingImageSrc = createAction(\n scoped`set loading image src`,\n props<{ src: string }>(),\n);\nexport const setIntroVideoSrc = createAction(\n scoped`set intro video src`,\n props<{ src: string }>(),\n);\nexport const resetIntroSrc = createAction(scoped`reset intro src`);\nexport const setFreezeFrameFromVideo = createAction(\n scoped`set freeze frame from video`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setEstablishingConnection = createAction(\n scoped`set establishing connection`,\n props<{ value: boolean }>(),\n);\nexport const setDataChannelConnected = createAction(\n scoped`set data channel connected`,\n props<{ value: boolean }>(),\n);\nexport const setConfig = createAction(\n scoped`set config`,\n props<{ config: Partial<StreamConfig> }>(),\n);\nexport const setErrorMessage = createAction(\n scoped`set error message`,\n props<{\n errorType: UnrealErrorType;\n message: string;\n }>(),\n);\nexport const setViewportReady = createAction(\n scoped`set viewport ready`,\n props<{ value: boolean }>(),\n);\nexport const changeStreamResolutionAction = createAction(\n scoped`change stream resolution`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const changeStreamResolutionSuccessAction = createAction(\n scoped`change stream resolution success action`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const setSignalingName = createAction(\n scoped`set aws instanceName`,\n props<{ instanceName: string }>(),\n);\nexport const updateCirrusInfo = createAction(\n scoped`set unrealInfo`,\n props<{\n ssInfo: string;\n ssData: SignalingData;\n }>(),\n);\nexport const commandStarted = createAction(\n scoped`command started`,\n props<{ id: string; command: string }>(),\n);\nexport const commandCompleted = createAction(\n scoped`command completed`,\n props<{ id: string }>(),\n);\nexport const setLoopBackCommandIsCompleted = createAction(\n scoped`set loopBack command is completed`,\n);\nexport const showUnrealErrorMessage = createAction(\n scoped`show unreal error message`,\n props<{ code: number | null }>(),\n);\nexport const initSignalling = createAction(scoped`init signalling`);\nexport const resetConfig = createAction(scoped`reset config`);\nexport const resetAfkAction = createAction(scoped`reset afk action`);\nexport const resetWarnTimeout = createAction(scoped`reset config warn timeout`);\nexport const resetUnrealStateAction = createAction(scoped`reset state`);\nexport const resetUnrealState = createAction(scoped`reset unreal state`);\n","export const WSCloseCode_NORMAL_CLOSURE = 3000;\nexport const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;\nexport const WSCloseCode_NORMAL_MANUAL_DISCONNECT = 3002;\nexport const WSCloseCode_NORMAL_CIRRUS_CLOSED = 3003;\n\nexport const WSCloseCodes = [\n WSCloseCode_NORMAL_CLOSURE,\n WSCloseCode_NORMAL_AFK_TIMEOUT,\n WSCloseCode_NORMAL_MANUAL_DISCONNECT,\n WSCloseCode_NORMAL_CIRRUS_CLOSED,\n] as const;\n\nexport type WSCloseCodesValues = (typeof WSCloseCodes)[number];\n","export const DisconnectReason = {\n afk: 'afk',\n none: 'none',\n reset: 'reset',\n wsOnError: 'wsOnError',\n dataChannelClosed: 'dataChannelClosed',\n dataChannelTimeout: 'dataChannelTimeout',\n} as const;\n\nexport type DisconnectType =\n (typeof DisconnectReason)[keyof typeof DisconnectReason];\n","export const MixPanelEvents = {\n pixelstreaming_end: 'pixelstreaming_end',\n pixelstreaming_start: 'pixelstreaming_start',\n render_request: 'render_request',\n custom_click: 'custom_click',\n route_change: 'route_change',\n} as const;\n\nexport type MixPanelEventsValues =\n (typeof MixPanelEvents)[keyof typeof MixPanelEvents];\n","/*\nexport interface RequestReservation extends InstanceMessageBase {\n type: 'requestReservation';\n}\n*/\n\nimport type { SignalingData } from './SignalingData';\n\nexport interface InstanceReady extends InstanceMessageBase {\n type: 'instanceReady';\n}\n\nexport interface InstanceReserved extends InstanceMessageBase {\n type: 'instanceReserved';\n}\n\ninterface InstanceMessageBase extends MessageBase {\n correlationId: string;\n payload: {\n instanceId: string;\n };\n}\n\nexport interface MessageBase {\n type: OrchestrationMessageType;\n}\n\nexport interface SSInfo extends MessageBase {\n type: 'ssInfo';\n message: string;\n data: SignalingData;\n}\n\nexport interface PlayerCountMessage extends MessageBase {\n type: 'playerCount';\n playerCount: number;\n}\n\nexport interface AnswerMessage extends RTCSessionDescriptionInit {\n type: RTCSdpType;\n}\n\nexport interface ConfigMessage extends MessageBase, UnknownFields {\n type: 'config';\n peerConnectionOptions: RTCConfiguration;\n}\n\nexport interface CandidateMessage extends MessageBase {\n type: 'iceCandidate';\n candidate: RTCIceCandidate;\n}\n\nexport interface PingMessage extends MessageBase {\n type: 'ping';\n playerId: string;\n appConnectionCounter: number;\n}\n\nexport type UnknownFields = Record<string, unknown>;\n\nexport const OrchestrationMessageTypes = {\n requestReservation: 'requestReservation',\n instanceReady: 'instanceReady',\n instanceReserved: 'instanceReserved',\n ssInfo: 'ssInfo',\n playerCount: 'playerCount',\n answer: 'answer',\n iceCandidate: 'iceCandidate',\n ping: 'ping',\n config: 'config',\n} as const;\n\nexport interface SignalingMessageMap {\n [OrchestrationMessageTypes.ssInfo]: SSInfo;\n [OrchestrationMessageTypes.playerCount]: PlayerCountMessage;\n [OrchestrationMessageTypes.answer]: AnswerMessage;\n [OrchestrationMessageTypes.config]: ConfigMessage;\n [OrchestrationMessageTypes.iceCandidate]: CandidateMessage;\n [OrchestrationMessageTypes.instanceReady]: InstanceReady;\n [OrchestrationMessageTypes.instanceReserved]: InstanceReserved;\n [OrchestrationMessageTypes.ping]: PingMessage;\n}\n\nexport type OrchestrationMessageType = keyof SignalingMessageMap;\n\nexport type SignalingMessageHandler<T extends keyof SignalingMessageMap> = (\n msg: SignalingMessageMap[T],\n) => void;\n\nexport interface PollingOrchestrationMessage {\n mm_message?: string;\n signallingServer?: string;\n error?: string;\n info?: {\n age: number | null;\n left: number | null;\n percent: number | null;\n total: number | null;\n };\n}\n","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 EControlSchemeType = {\n // A mouse can lock inside the WebRTC player so the user can simply move the\n // mouse to control the orientation of the camera. The user presses the\n // Escape key to unlock the mouse.\n LockedMouse: 0,\n\n // A mouse can hover over the WebRTC player so the user needs to click and\n // drag to control the orientation of the camera.\n HoveringMouse: 1,\n Default: 2,\n} as const;\n\nexport type EControlSchemeTypeValues =\n (typeof EControlSchemeType)[keyof typeof EControlSchemeType];\n","// Must be kept in sync with PixelStreamingProtocol::EToUE4Msg C++ descriptors.\n\nexport const EMessageType = {\n /*\n * Control Messages. Range = 0..49.\n */\n IFrameRequest: 0,\n RequestQualityControl: 1,\n MaxFpsRequest: 2,\n AverageBitrateRequest: 3,\n StartStreaming: 4,\n StopStreaming: 5,\n LatencyTest: 6,\n RequestInitialSettings: 7,\n\n /*\n * Input Messages. Range = 50..89.\n */\n\n // Generic Input Messages. Range = 50..59.\n UIInteraction: 50,\n Command: 51,\n\n // Keyboard Input Message. Range = 60..69.\n KeyDown: 60,\n KeyUp: 61,\n KeyPress: 62,\n\n // Mouse Input Messages. Range = 70..79.\n MouseEnter: 70,\n MouseLeave: 71,\n MouseDown: 72,\n MouseUp: 73,\n MouseMove: 74,\n MouseWheel: 75,\n\n // Touch Input Messages. Range = 80..89.\n TouchStart: 80,\n TouchEnd: 81,\n TouchMove: 82,\n} as const;\n\nexport type EMessageTypeValues =\n (typeof EMessageType)[keyof typeof EMessageType];\n","export const EToClientMessageType = {\n QualityControlOwnership: 0,\n Response: 1,\n Command: 2,\n FreezeFrame: 3,\n UnfreezeFrame: 4,\n VideoEncoderAvgQP: 5,\n LatencyTest: 6,\n InitialSettings: 7,\n InputControlOwnership: 12,\n Protocol: 255,\n} as const;\n","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 { EControlSchemeType } from './EControlSchemeType';\nimport type { InputProps } from '../interfaces';\n\nexport const InputOptions: InputProps = {\n controlScheme: EControlSchemeType.Default,\n suppressBrowserKeys: true,\n fakeMouseWithTouches: false,\n};\n","import type { Mixpanel } from 'mixpanel-browser';\n\nexport const MIX_PANEL: {\n /**\n * Mixpanel instance for tracking meta-box events\n */\n metaBoxTrack: Mixpanel;\n\n /**\n * Mixpanel instance for tracking stream events\n */\n streamTrack: Mixpanel;\n} = {\n metaBoxTrack: undefined,\n streamTrack: undefined,\n} as any;\n","export const UnrealStatusMessage = {\n CONNECTING_TO_SESSION: 'Connecting to session.',\n STARTING_YOUR_SESSION: 'Starting your session',\n} as const;\n","export const DEBOUNCE_TO_MANY_RESIZE_CALLS = 100;\nexport const SAME_SIZE_THRESHOLD = 1.01;\nexport const MINIMAL_FPS = 6;\nexport const STREAMING_VIDEO_ID = 'streamingVideo';\nexport const CONSOLE_COMMAND_ENABLE_MESSAGES = 'EnableAllScreenMessages';\nexport const CONSOLE_COMMAND_DISABLE_MESSAGES = 'DisableAllScreenMessages';\nexport const CONSOLE_COMMAND_PIXEL_QUALITY =\n 'PixelStreaming.FreezeFrameQuality 95';\nexport const FULL_HD_WIDTH = 1920;\nexport const FULL_HD_HEIGHT = 1080;\nexport const WS_TIMEOUT = 2000;\nexport const WS_OPEN_STATE = 1;\nexport const DEFAULT_TIMEOUT_PERIOD = 15;\nexport const DEFAULT_WARN_TIMEOUT = 120;\nexport const DATA_CHANNEL_CONNECTION_TIMEOUT = 5000; // 5 seconds;\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { AnswerMessage } from '../../interfaces/SignalingMessage';\n\nexport function AnswerHandler(this: SignallingService, msg: AnswerMessage) {\n this.onWebRtcAnswer$.next(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { ConfigMessage } from '../../interfaces/SignalingMessage';\n\nexport function ConfigHandler(this: SignallingService, msg: ConfigMessage) {\n this.onConfig$.next(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function IceCandidateHandler(\n this: SignallingService,\n msg: { candidate: RTCIceCandidate },\n) {\n this.onWebRtcIce$.next(msg.candidate);\n}\n","import type { InstanceReady } from '../../interfaces/SignalingMessage';\nimport type { SignallingService } from '../../services/signalling.service';\n\nexport function InstanceReadyHandler(\n this: SignallingService,\n _: InstanceReady,\n) {}\n","import type { InstanceReserved } from '../../interfaces/SignalingMessage';\nimport type { SignallingService } from '../../services/signalling.service';\nimport { setSignalingName } from '../..//store/unreal.actions';\n\nexport function InstanceReservedHandler(\n this: SignallingService,\n msg: InstanceReserved,\n) {\n this.store.dispatch(\n setSignalingName({\n instanceName: msg.payload.instanceId,\n }),\n );\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function PingHandler(this: SignallingService) {\n this.send(\n JSON.stringify({\n type: 'pong',\n source: 'front',\n }),\n );\n}\n","import type { SignallingService } from '../..//services/signalling.service';\nimport type { PlayerCountMessage } from '../..//interfaces/SignalingMessage';\nimport { Logger } from '@3dsource/utils';\n\nexport function PlayerCountHandler(\n this: SignallingService,\n msg: PlayerCountMessage,\n) {\n Logger.log(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { SSInfo } from '../../interfaces/SignalingMessage';\nimport { updateCirrusInfo } from '../../store/unreal.actions';\n\nexport function SSInfoHandler(this: SignallingService, msg: SSInfo) {\n this.store.dispatch(\n updateCirrusInfo({ ssInfo: msg.message, ssData: msg.data }),\n );\n return null;\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { Logger } from '@3dsource/utils';\nimport { setCirrusDisconnected } from '../../store/unreal.actions';\n\nexport function OnCloseHandler(this: SignallingService, e: CloseEvent): void {\n this.stopRetryTimer();\n Logger.warn(`WS closed: ${JSON.stringify(e.code)} - ${e.reason}`);\n this.store.dispatch(setCirrusDisconnected());\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { Logger } from '@3dsource/utils';\nimport {\n destroyRemoteConnections,\n setErrorMessage,\n} from '../../store/unreal.actions';\nimport { DisconnectReason } from '../../interfaces/disconnect-reasons';\n\nexport function OnErrorHandler(this: SignallingService, e: Event): void {\n clearTimeout(this.wsTimeoutHandler);\n Logger.warn(`WS error: ${JSON.stringify(e)}`);\n\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebSocketError',\n message: 'WebSocket Error',\n }),\n );\n this.store.dispatch(\n destroyRemoteConnections({ disconnectReason: DisconnectReason.wsOnError }),\n );\n this.initEstablishingConnection();\n this.watchTimeoutOrErrorAndReconnectLater();\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function OnMessageHandler(\n this: SignallingService,\n e: MessageEvent<string>,\n): void {\n clearTimeout(this.wsTimeoutHandler);\n //Logger.colored(...COLOR_CODES.FROM_SIGNALING, e.data);\n const msg = JSON.parse(e.data);\n this.handleMessage(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { setCirrusConnected } from '../../store/unreal.actions';\nimport { OrchestrationMessageTypes } from '../../interfaces/SignalingMessage';\n\nexport function OnOpenHandler(this: SignallingService) {\n this.stopRetryTimer();\n this.store.dispatch(setCirrusConnected());\n\n this.send({\n type: OrchestrationMessageTypes.requestReservation,\n correlationId: this.correlationId,\n payload: {\n environmentId: this.environmentId,\n },\n });\n}\n","import type { Observable } from 'rxjs';\nimport { scan } from 'rxjs';\nimport { clampf } from '@3dsource/utils';\n\nexport const clampAndKeepMaxPercents = (): ((\n source: Observable<number>,\n) => Observable<number>) => {\n return (source: Observable<number>) =>\n source.pipe(\n scan(\n (acc, value) =>\n value === 0 ? value : clampf(0, 100, Math.max(acc, value)),\n 0,\n ),\n );\n};\n","import type {\n MetaBoxCommandList,\n MetaBoxCommandPacket,\n} from '../interfaces/struct';\nimport type { Observable } from 'rxjs';\nimport { of, timeout } from 'rxjs';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { catchError, filter, first, map } from 'rxjs/operators';\nimport { fromSignal } from '../helpers/EventWrapper';\nimport { generateUuid, tapLog, Truthy } from '@3dsource/utils';\n\nexport function observeCommandResponse<\n K extends keyof MetaBoxCommandList,\n T extends MetaBoxCommandList[K] = MetaBoxCommandList[K],\n>(\n data: T,\n sender: (data: T) => void,\n timeOut = 60000,\n dispatchOnTimeout = true,\n): Observable<ObservedCallbackResponse<T> | never> {\n const correlationId = generateUuid();\n const out = { ...data, correlationId };\n\n const observable = fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(({ json }) => {\n // Some callbacks do not have commandCallback wrapper,\n // so first we check if it exists,\n // then fallback to JSON itself\n return 'commandCallback' in json\n ? { json }\n : { json: { commandCallback: json } };\n }),\n filter(({ json }) => {\n return json.commandCallback.correlationId === correlationId;\n }),\n timeout(timeOut),\n catchError(() =>\n dispatchOnTimeout\n ? of({ json: { commandCallback: { correlationId: 'timeout' } } })\n : of(null),\n ),\n first(),\n tapLog('Command Response Observer'),\n filter(Truthy),\n );\n\n setTimeout(() => sender(out), 0);\n\n return observable as never;\n}\n\n// Suppose MetaBoxCommandPacket is your base command shape.\n// This type ensures that after filtering, json.commandCallback\n// has the same type as you passed in to observeCommandResponse.\nexport interface ObservedCallbackResponse<T extends MetaBoxCommandPacket> {\n json: {\n commandCallback: T;\n };\n}\n","export function decodeData(anyData: any) {\n try {\n return new TextDecoder('utf-16').decode(anyData);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n return '';\n }\n}\n","import type { Quality } from '../interfaces/quality.interface';\nimport { calculateMedian, clampf } from '@3dsource/utils';\nimport type { FilterSettings } from '../components/low-bandwidth-indicator/DataFlowConstants';\n\nexport interface DataFlowCheckResult {\n isDropDetected: boolean;\n dropPercentage: number;\n activeMedian: number;\n quality: Quality;\n message: string;\n dataHistory: number[];\n config: {\n yellowFlagThresholdPercentage: number;\n redFlagThresholdPercentage: number;\n historyBufferLength: number;\n splitPoint: number;\n };\n}\n\nexport class DataFlowMonitor {\n protected dataHistory: number[] = [];\n\n /**\n * Initializes the DataFlowMonitor monitor.\n * @param yellowFlagThresholdPercentage - The percentage drop to trigger a YELLOW warning (default: 15%).\n * @param redFlagThresholdPercentage - The percentage drop to trigger a RED warning (default: 30%).\n * @param historyBufferLength - buffer length (default: 100).\n * @param splitPoint - The point at which to split the history buffer into two halves (default: 0.5).\n */\n constructor(\n protected yellowFlagThresholdPercentage = 15,\n protected redFlagThresholdPercentage = 30,\n protected historyBufferLength = 100,\n protected splitPoint = 0.5,\n ) {}\n\n reset() {\n this.dataHistory.length = 0;\n }\n\n config(data: FilterSettings) {\n this.reset();\n this.yellowFlagThresholdPercentage = data.yellowFlag;\n this.redFlagThresholdPercentage = data.redFlag;\n }\n\n /**\n * Adds a new bitrate measurement and checks for significant drops.\n * @param currentValue - The current bitrate in kbps.\n * @returns BitrateCheckResult indicating if a drop was detected.\n */\n addValue(currentValue: number): DataFlowCheckResult {\n if (isNaN(currentValue) || currentValue < 1) {\n return {} as DataFlowCheckResult;\n }\n const historyLength = this.dataHistory.length;\n\n if (historyLength > this.historyBufferLength) {\n this.dataHistory.shift();\n }\n this.dataHistory.push(currentValue);\n\n if (historyLength < this.historyBufferLength) {\n this.dataHistory.length = this.historyBufferLength;\n this.dataHistory.fill(currentValue, 0, this.historyBufferLength);\n }\n\n const splitIndex = Math.floor(historyLength * this.splitPoint);\n const firstHalf = this.dataHistory.slice(0, splitIndex);\n const secondHalf = this.dataHistory.slice(splitIndex);\n const firstHalfMedian = calculateMedian(firstHalf);\n const secondHalfMedian = calculateMedian(secondHalf);\n\n const dropPercentage = clampf(\n 0,\n 100,\n ((firstHalfMedian - secondHalfMedian) / firstHalfMedian) * 100,\n );\n\n const isRedFlag = dropPercentage >= this.redFlagThresholdPercentage;\n if (dropPercentage >= this.yellowFlagThresholdPercentage) {\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: true,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: isRedFlag ? 'red' : 'orange',\n message: `Significant flow drop detected: ${dropPercentage.toFixed(2)}% (from ${firstHalfMedian} to ${secondHalfMedian})`,\n };\n }\n\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: false,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: 'lime',\n message: 'Stable flow',\n };\n }\n}\n","import { sendSignal } from './EventWrapper';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\n\nexport const dispatchResize = () => {\n window.dispatchEvent(new Event('resize'));\n};\n\nexport const forceResizeUnrealVideo = () => {\n sendSignal(UnrealInternalSignalEvents.ForceResizeViewport);\n};\n","const errorCodes: Record<`code${number}`, string | undefined> = {\n code404:\n 'Your asset is being synced on Metabox servers and is not yet available in Metabox Studio or Metabox Configurator. Please check again later after syncing is complete. ',\n};\n\nexport function getRtcErrorMessage(code: number | null): string | undefined {\n if (code === null) return undefined;\n\n return errorCodes[`code${code}`];\n}\n","import type { Observable } from 'rxjs';\nimport { of, scan, switchMap } from 'rxjs';\nimport { smoothTransition } from '@3dsource/utils';\nimport { map } from 'rxjs/operators';\n\nexport const floatToSmoothPercents = (): ((\n source: Observable<number>,\n) => Observable<number>) => {\n return (source: Observable<number>) =>\n source.pipe(\n scan(\n (acc, value) => ({\n previous: acc.current,\n current: value,\n }),\n {\n previous: 0,\n current: 0,\n },\n ),\n\n switchMap(({ previous, current }) => {\n if (Math.abs(current - previous) > 0.95) {\n // Assume that big difference seems like switch between 0 and 1 immediately after resetLoaderState(),\n // so it should go to 'current' without transitions\n return of(current);\n }\n return smoothTransition(previous, current, 300);\n }), // 300ms duration for smooth transition\n\n map((value) => Math.floor(value * 100)),\n );\n};\n","import {\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n STREAMING_VIDEO_ID,\n} from '../constants/unreal.constant';\nimport type { ImageOutputValues } from '@3dsource/utils';\nimport { getCanvasCached, getSnapshot } from '@3dsource/utils';\nimport type { StreamResolutionProps } from '../interfaces/stream-resolution.interface';\n\nexport const getImageFromVideoStream = (\n takeSizeFrom: 'video' | 'constant' = 'video',\n imageOutput?: ImageOutputValues,\n sizes?: StreamResolutionProps,\n) => {\n try {\n const video = document.getElementById(\n STREAMING_VIDEO_ID,\n ) as HTMLVideoElement;\n const { canvas, ctx } = getCanvasCached('video');\n\n canvas.width =\n takeSizeFrom === 'video'\n ? sizes?.width || video?.clientWidth || FULL_HD_WIDTH\n : FULL_HD_WIDTH;\n canvas.height =\n takeSizeFrom === 'video'\n ? sizes?.height || video?.clientHeight || FULL_HD_HEIGHT\n : FULL_HD_HEIGHT;\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n return getSnapshot(canvas, canvas.width, imageOutput) as string;\n } catch {\n return null;\n }\n};\n","/**\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;\n UEReceiptTimeMs!: number | null;\n UEEncodeMs!: number | null;\n UECaptureToSendMs!: number | null;\n UETransmissionTimeMs!: number | null;\n BrowserReceiptTimeMs!: number | null;\n FrameDisplayDeltaTimeMs!: number | null;\n\n Reset() {\n this.TestStartTimeMs = null;\n this.UEReceiptTimeMs = null;\n this.UEEncodeMs = null;\n this.UECaptureToSendMs = null;\n this.UETransmissionTimeMs = null;\n this.BrowserReceiptTimeMs = null;\n this.FrameDisplayDeltaTimeMs = null;\n }\n\n SetUETimings(UETimings: any) {\n this.UEReceiptTimeMs = UETimings.ReceiptTimeMs;\n this.UEEncodeMs = UETimings.EncodeMs;\n this.UECaptureToSendMs = UETimings.CaptureToSendMs;\n this.UETransmissionTimeMs = UETimings.TransmissionTimeMs;\n this.BrowserReceiptTimeMs = Date.now();\n this.OnAllLatencyTimingsReady(this);\n }\n\n SetFrameDisplayDeltaTime(DeltaTimeMs: number) {\n if (this.FrameDisplayDeltaTimeMs == null) {\n this.FrameDisplayDeltaTimeMs = Math.round(DeltaTimeMs);\n this.OnAllLatencyTimingsReady(this);\n }\n }\n\n OnAllLatencyTimingsReady(_: any) {}\n}\n","import type { Quality } from '../interfaces/quality.interface';\n\nexport function mapQpToQuality(VideoEncoderQP: number): Quality {\n const orangeQP = 26;\n const redQP = 35;\n\n let quality: Quality = 'lime';\n if (VideoEncoderQP > redQP) {\n quality = 'red';\n } else if (VideoEncoderQP > orangeQP) {\n quality = 'orange';\n }\n return quality;\n}\n","/* eslint-disable */\n/**\n* This file is auto-generated by the API parser\n* Please note that any changes in this file may be overwritten\n* Version: 2025-04-22 14:21:41\n/*\n\n\n\n/**\n@description\nType of Asset for all PAKs.\n*/\nexport enum EAssetType {\n none = 'none',\n product = 'product',\n material = 'material',\n environment = 'environment',\n level = 'level',\n camera = 'camera',\n level_sequence = 'level_sequence',\n screenshot = 'screenshot',\n light = 'light',\n}\n\n/**\n@description\nDimension type.\n*/\nexport enum EDimensionType {\n none = 'none',\n millimeter = 'millimeter',\n centimeter = 'centimeter',\n meter = 'meter',\n kilometer = 'kilometer',\n inch = 'inch',\n duim = 'duim',\n yard = 'yard',\n miles = 'miles',\n}\n\n/**\n@description\nSequenceLoopBehavior.\n*/\nexport enum ESequenceLoopBehavior {\n none = 'none',\n loop = 'loop',\n pingPong = 'pingPong',\n loopSection = 'loopSection',\n pingPongSection = 'pingPongSection',\n}\n\n/**\n@description\nItems types that can be placed in scene.\n*/\nexport enum ESceneItemType {\n products = 'products',\n lights = 'lights',\n pawn = 'pawn',\n}\n\n/**\n@description\nMeasure axis position.\n*/\nexport enum EMeasureAxisZPosition {\n front = 'front',\n left = 'left',\n right = 'right',\n leftRight = 'leftRight',\n back = 'back',\n}\n\n/**\n@description\nMeasure axis position.\n*/\nexport enum EPaddingUnit {\n pixel = 'pixel',\n cm = 'cm',\n}\n\n/**\n@description\nCurve type.\n*/\nexport enum ECurve {\n linear = 'linear',\n inSine = 'inSine',\n outSine = 'outSine',\n inOutSine = 'inOutSine',\n inQuad = 'inQuad',\n outQuad = 'outQuad',\n inOutQuad = 'inOutQuad',\n inCubic = 'inCubic',\n outCubic = 'outCubic',\n inOutCubic = 'inOutCubic',\n inQuart = 'inQuart',\n outQuart = 'outQuart',\n inOutQuart = 'inOutQuart',\n inQuint = 'inQuint',\n outQuint = 'outQuint',\n inOutQuint = 'inOutQuint',\n inExpo = 'inExpo',\n outExpo = 'outExpo',\n inOutExpo = 'inOutExpo',\n inCirc = 'inCirc',\n outCirc = 'outCirc',\n inOutCirc = 'inOutCirc',\n inBack = 'inBack',\n outBack = 'outBack',\n inOutBack = 'inOutBack',\n inElastic = 'inElastic',\n outElastic = 'outElastic',\n inOutElastic = 'inOutElastic',\n inBounce = 'inBounce',\n outBounce = 'outBounce',\n inOutBounce = 'inOutBounce',\n}\n\n/**\n@description\nFit options.\n*/\nexport enum EFitMethod {\n none = 'none',\n byLocation = 'byLocation',\n byRotation = 'byRotation',\n top = 'top',\n bottom = 'bottom',\n front = 'front',\n back = 'back',\n right = 'right',\n left = 'left',\n}\n\n/**\n@description\nMovement allowance along specified axis.\n*/\nexport enum EMovementAllowance {\n none = 'none',\n planeYZ = 'planeYZ',\n planeXY = 'planeXY',\n planeXZ = 'planeXZ',\n axisX = 'axisX',\n axisY = 'axisY',\n axisZ = 'axisZ',\n}\n\n/**\n@description\nAlignment options.\n*/\nexport enum EAlignment {\n byBottomSide = 'byBottomSide',\n byTopSide = 'byTopSide',\n byFrontSide = 'byFrontSide',\n byBackSide = 'byBackSide',\n byRightSide = 'byRightSide',\n byLeftSide = 'byLeftSide',\n}\n\n/**\n@description\nGizmo type.\n*/\nexport enum EGizmoType {\n translation = 'translation',\n rotation = 'rotation',\n scale = 'scale',\n none = 'none',\n}\n\n/**\n@description\nPawn camera control mode.\n*/\nexport enum EControlMode {\n none = 'none',\n select = 'select',\n orbit = 'orbit',\n pan = 'pan',\n dolly = 'dolly',\n}\n\n/**\n@description\nPawn movement mode.\n*/\nexport enum EPawnMovementMode {\n none = 'none',\n around = 'around',\n aroundBlocking = 'aroundBlocking',\n walk = 'walk',\n aroundObstacles = 'aroundObstacles',\n productsControl = 'productsControl',\n}\n\n/**\n@description\nLight mode.\n*/\nexport enum ELightMode {\n NONE = 'NONE',\n RECT = 'RECT',\n PANEL = 'PANEL',\n}\n\n/**\n@description\nRectangle light type.\n*/\nexport enum ERectLightType {\n rect = 'rect',\n circ = 'circ',\n hexa = 'hexa',\n}\n\n/**\n@deprecated\nDon't need anymore.\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nApp type.\n*/\nexport enum EAppType {\n none = 'none',\n platform = 'platform',\n metabox = 'metabox',\n vps = 'vps',\n abg = 'abg',\n htmx = 'htmx',\n proampac = 'proampac',\n}\n\n/**\n@description\nDLSS mode.\n*/\nexport enum EDlssMode {\n Off = 'Off',\n Auto = 'Auto',\n DLAA = 'DLAA',\n UltraQuality = 'UltraQuality',\n Quality = 'Quality',\n Balanced = 'Balanced',\n Performance = 'Performance',\n}\n\n/**\n@description\nA vector in 2-D space composed of components (X, Y) with floating point precision.\n*/\nexport interface FVector2DJson {\n /**\n@description\nVector's X component.\nDefault value: 0.0 (float)\n*/\n x: number;\n\n /**\n@description\nVector's Y component.\nDefault value: 0.0 (float)\n*/\n y: number;\n}\n\n/**\n@description\nStructure for integer points in 2-d space.\n*/\nexport interface FIntPoint2DJson {\n /**\n@description\nHolds the point's X-coordinate.\nDefault value: 0\n*/\n x: number;\n\n /**\n@description\nHolds the point's Y-coordinate.\nDefault value: 0\n*/\n y: number;\n}\n\n/**\n@description\nAll rotation values are stored in degrees.\n*/\nexport interface FRotatorJson {\n /**\n@description\nRotation around the right axis (around Y axis), Looking up and down (0=Straight Ahead, +Up, -Down)\nDefault value: 0.0 (float)\n*/\n Pitch: number;\n\n /**\n@description\nRotation around the up axis (around Z axis), Running in circles 0=East, +North, -South.\nDefault value: 0.0 (float)\n*/\n Yaw: number;\n\n /**\n@description\nRotation around the forward axis (around X axis), Tilting your head, 0=Straight, +Clockwise, -CCW.\nDefault value: 0.0 (float)\n*/\n Roll: number;\n\n /**\n@deprecated\nUse {@link Yaw}, {@link Pitch}, {@link Roll}\n\nAll deprecated properties marked as optional. Use with care!\n\nDefault value: 0.0 (float)\n@optional\n*/\n x?: number;\n\n /**\n@deprecated\nUse {@link Yaw}, {@link Pitch}, {@link Roll}\n\nAll deprecated properties marked as optional. Use with care!\n\nDefault value: 0.0 (float)\n@optional\n*/\n y?: number;\n\n /**\n@deprecated\nUse {@link Yaw}, {@link Pitch}, {@link Roll}\n\nAll deprecated properties marked as optional. Use with care!\n\nDefault value: 0.0 (float)\n@optional\n*/\n z?: number;\n\n /**\n@deprecated\nUse {@link Yaw}, {@link Pitch}, {@link Roll}\n\nAll deprecated properties marked as optional. Use with care!\n\nDefault value: 0.0 (float)\n@optional\n*/\n w?: number;\n}\n\n/**\n@description\nA vector in 3-D space composed of components (X, Y, Z) with floating point precision.\n*/\nexport interface FVectorJson {\n /**\n@description\nVector's X component.\nDefault value: 0.0 (float)\n*/\n x: number;\n\n /**\n@description\nVector's Y component.\nDefault value: 0.0 (float)\n*/\n y: number;\n\n /**\n@description\nVector's Z component.\nDefault value: 0.0 (float)\n*/\n z: number;\n}\n\n/**\n@description\nTransform composed of Scale, Rotation (as a rotator), and Translation.\n*/\nexport interface FTransformJson {\n /**\n@description\nRotation of this transformation, as a rotator.\n*/\n rotation: FRotatorJson;\n\n /**\n@description\nTranslation of this transformation, as a vector.\n*/\n translation: FVectorJson;\n\n /**\n@description\n3D scale (always applied in local space) as a vector.\nDefault value: FVectorJson(1.0f, 1.0f, 1.0f)\n*/\n Scale3D: FVectorJson;\n}\n\n/**\n@description\nScalar material parameter.\n*/\nexport interface FScalarJson {\n /**\n@description\nScalar parameter name in material.\nDefault value: \"\"\n*/\n parameterName: string;\n\n /**\n@description\nValue of the scalar material parameter.\nDefault value: 1.0 (float)\n*/\n value: number;\n}\n\n/**\n@description\nLinearColor RGBA(1.1.1.1).\n*/\nexport interface FLinearColorJson {\n /**\n@description\nColor's Red component.\nDefault value: 1.0 (float)\n*/\n r: number;\n\n /**\n@description\nColor's Green component.\nDefault value: 1.0 (float)\n*/\n g: number;\n\n /**\n@description\nColor's Blue component.\nDefault value: 1.0 (float)\n*/\n b: number;\n\n /**\n@description\nColor's Alpha component.\nDefault value: 1.0 (float)\nMeta: ClampMin: 0.0; ClampMax: 1.0\n@optional\n*/\n a?: number;\n}\n\n/**\n@description\nMaterial texture.\n*/\nexport interface FTextureJson {\n /**\n@description\nParameter for texture in material.\nDefault value: \"\"\n*/\n parameterName: string;\n\n /**\n@description\nURL to download texture from.\nDefault value: \"\"\n*/\n url: string;\n\n /**\n@description\nEnable canvas for texture or not.\nDefault value: true\n@optional\n*/\n canvas?: boolean;\n\n /**\n@description\nSize of the texture.\nDefault value: {1024, 1024}\n@optional\n*/\n size?: FVector2DJson;\n\n /**\n@description\nPosition of the texture in relative space.\nDefault value: {0.5, 0.5}\n@optional\n*/\n position?: FVector2DJson;\n\n /**\n@description\nRotate angle in degrees.\nDefault value: 0\n@optional\n*/\n Rotate?: number;\n\n /**\n@description\nPivot of the texture in relative space.\nDefault value: {0.5, 0.5}\n@optional\n*/\n pivot?: FVector2DJson;\n\n /**\n@description\nGrid position.\nDefault value: {0, 0}\n@optional\n*/\n coordinatePosition?: FVector2DJson;\n\n /**\n@description\nGrid size.\nDefault value: {1, 1}\n@optional\n*/\n coordinateSize?: FVector2DJson;\n}\n\n/**\n@description\nMaterial.\n*/\nexport interface FMaterialJson {\n /**\n@description\nName of the asset relative to Content folder in project.\nDefault value: \"\"\n*/\n name: string;\n\n /**\n@deprecated\nUse {@link slotName}field.\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nMaterial slot name in product to which apply material.\nDefault value: \"\"\n*/\n slot_name?: string;\n\n /**\n@description\nMaterial slot name in product to which apply material.\nDefault value: \"\"\n*/\n slotName: string;\n\n /**\n@description\nList of textures in the material.\n@optional\n*/\n textures?: Array<FTextureJson>;\n\n /**\n@description\nList of scalars in the material.\n@optional\n*/\n scalars?: Array<FScalarJson>;\n\n /**\n@description\nRelative path to material pak file.\nDefault value: \"\"\n*/\n pakFilePath: string;\n\n /**\n@description\nColor\n@optional\n*/\n color?: FLinearColorJson;\n\n /**\n@description\nrenderTargetAspectRatio.\n@optional\n*/\n renderTargetAspectRatio?: FVector2DJson;\n}\n\n/**\n@description\nMaterial initial state.\n*/\nexport interface FAnimationInitialStateJson {\n /**\n@description\nProduct animations.\n*/\n animations: Array<string>;\n}\n\n/**\n@description\nMaterial initial state.\n*/\nexport interface FMaterialInitialStateJson {\n /**\n@description\nList of materials applying to product.\n*/\n materials: Array<FMaterialJson>;\n}\n\n/**\n@description\nMesh initial state.\n*/\nexport interface FMeshInitialStateJson extends FMaterialInitialStateJson {\n /**\n@description\nName of the asset relative to Content folder in project.\nDefault value: \"\"\n*/\n meshName: string;\n\n /**\n@description\nProduct spawn transform.\n@optional\n*/\n transform?: FTransformJson;\n\n /**\n@description\nProduct animations.\n@optional\n*/\n animations?: Array<string>;\n\n /**\n@description\nMaterials slots.\n@optional\n*/\n slots?: Array<string>;\n\n /**\n@description\nAttach sockets.\n@optional\n*/\n sockets?: Array<string>;\n\n /**\n@description\nFounded in product morphs.\n@optional\n*/\n morphs?: Array<string>;\n}\n\n/**\n@description\nObject describes path to pak/use file.\n*/\nexport interface FPakJson {\n /**\n@description\nRelative path to pak file.\nDefault value: \"\"\n*/\n pakFilePath: string;\n\n /**\n@description\nPath to usd/usdz file overrides pak file path.\nDefault value: \"\"\n@optional\n*/\n usdPath?: string;\n}\n\n/**\n@description\nAsset pak file.\n*/\nexport interface FAssetPakJson extends FPakJson {\n /**\n@description\nAsset name.\n*/\n assetName: string;\n}\n\n/**\n@description\nAnimation pak file.\n*/\nexport interface FAnimationPakJson extends FPakJson {\n /**\n@description\nAnimation initial state.\n*/\n initialState: FAnimationInitialStateJson;\n}\n\n/**\n@description\nMaterial pak file.\n*/\nexport interface FMaterialPakJson {\n /**\n@description\nMaterial initial state.\n*/\n initialState: FMaterialInitialStateJson;\n}\n\n/**\n@description\nMesh pak file.\n*/\nexport interface FMeshPakJson extends FPakJson {\n /**\n@description\nMesh initial state.\n*/\n initialState: FMeshInitialStateJson;\n}\n\n/**\n@description\nAttachment settings.\n*/\nexport interface FAttachment {\n /**\n@description\nFind object in scene to what attach.\n*/\n attachToObject: string;\n\n /**\n@description\nFind socket in object in scene to what attach. If empty, then boundCenterOffset is used.\n@optional\n*/\n attachToSocket?: string;\n\n /**\n@description\nUse socket as a pivot of attached object.\n@optional\n*/\n pivotSocket?: string;\n\n /**\n@description\nLocal distance offset. Orientation of attachToSocket is main for this local offset. Socket's forward vector is multiplied on X. If X = +5, then object will be moved out from object on 5 units. If X = -5, then object will be moved inside object on 5 units.\nDefault value: { 0 , 0 , 0}\n@optional\n*/\n offset?: FVectorJson;\n\n /**\n@description\nLocal distance offset from bound center of product. Orientation is relative to product. If attachToSocket is empty and boundCenterOffset is valid, then it would work.\n@optional\n*/\n boundCenterOffset?: FTransformJson;\n}\n\n/**\n@description\nSequence section.\n*/\nexport interface FSequenceSection {\n /**\n@description\nId of section.\nDefault value: -1\n*/\n id: number;\n\n /**\n@description\nStart time of section.\nDefault value: 0\n*/\n startTime: number;\n\n /**\n@description\nEnd time of section.\nDefault value: 0\n*/\n endTime: number;\n}\n\n/**\n@description\nNULL payload.\n*/\nexport interface FNullJson {}\n\n/**\n@description\nBase payload structure.\n*/\nexport interface FPayloadBase {}\n\n/**\n@description\nBase payload with bool to enable, click, drag and etc.\n*/\nexport interface FBoolPayload extends FPayloadBase {\n /**\n@description\nThis value means enable, click, drag, etc.\nDefault value: false\n*/\n value: boolean;\n}\n\n/**\n@description\nBase payload for float.\n*/\nexport interface FFloatPayload extends FPayloadBase {\n /**\n@description\nThis value is for changing float values.\nDefault value: 0\n*/\n value: number;\n}\n\n/**\n@description\nBase payload for vector.\n*/\nexport interface FFVectorPayload extends FPayloadBase {\n /**\n@description\nThis value is for changing vector values.\n*/\n value: FVectorJson;\n}\n\n/**\n@description\nBase payload for rotator.\n*/\nexport interface FFRotatorPayload extends FPayloadBase {\n /**\n@description\nThis value is for changing rotator values.\n*/\n value: FRotatorJson;\n}\n\n/**\n@description\nBase payload for string.\n*/\nexport interface FFStringPayload extends FPayloadBase {\n /**\n@description\nThis value could be used for ObjectName, URL and other strings.\n*/\n value: string;\n}\n\n/**\n@description\nBase payload for strings.\n*/\nexport interface FFStringsPayload extends FPayloadBase {\n /**\n@description\nThis value could be used for ObjectName, URL and other strings.\n*/\n values: Array<string>;\n}\n\n/**\n@description\nAdd mesh pak pak\n*/\nexport interface FAddMeshJson extends FPakJson {\n /**\n@description\nMesh name in pak.\n*/\n meshName: string;\n}\n\n/**\n@description\nUnwrap/Wrap mesh pairs params\n*/\nexport interface FUWMeshPairParamsJson {\n /**\n@description\nSize.\n*/\n size: FVectorJson;\n\n /**\n@description\nTile.\nDefault value: {1.f, 1.f}\n@optional\n*/\n UVTile?: FVector2DJson;\n\n /**\n@description\nposition.\n*/\n position: FVectorJson;\n\n /**\n@description\nscale.\nDefault value: {1.f, 1.f, 1.f}\n@optional\n*/\n scale?: FVectorJson;\n}\n\n/**\n@description\nUnwrap/Wrap mesh pairs pak\n*/\nexport interface FUWMeshPairPakJson extends FAddMeshJson {\n /**\n@description\nUWMeshPair params.\n*/\n params: FUWMeshPairParamsJson;\n}\n\n/**\n@description\nUnwrap/Wrap mesh pairs\n*/\nexport interface FUWMeshPairJson {\n /**\n@description\nUnwrap pak info.\n*/\n unwrap: FUWMeshPairPakJson;\n\n /**\n@description\nUnwrap pak info.\n*/\n wrap: FUWMeshPairPakJson;\n}\n\n/**\n@description\nMaterial Base Payload for PakExport.\n*/\nexport interface FMaterialBasePayload extends FPayloadBase {\n /**\n@description\nMaterial PAK.\n*/\n materialPak: FMaterialPakJson;\n}\n\n/**\n@description\nMaterial Base Payload for PakExport.\n*/\nexport interface FMaterialPayload extends FMaterialBasePayload {\n /**\n@description\nMaterial name.\n@optional\n*/\n materialName?: string;\n}\n\n/**\n@description\nThis payload is used in command to load/spawn and unload/destroy products.\n*/\nexport interface FProductPayload extends FMaterialBasePayload {\n /**\n@description\nGlobal(static) product ID in scene (not per instance).\n@optional\n*/\n productName?: string;\n\n /**\n@description\nMesh pak file.\n*/\n meshPak: FMeshPakJson;\n\n /**\n@description\nAnimations pak file.\n@optional\n*/\n animationsPak?: FPakJson;\n\n /**\n@description\nObject name used by frontend.\n@optional\n*/\n objectName?: string;\n\n /**\n@description\nMaterial slots.\n@optional\n*/\n materialSlots?: Array<string>;\n\n /**\n@description\nProduct transform in the world.\n@optional\n*/\n transform?: FTransformJson;\n\n /**\n@description\nVector parameters of product materials.\n@optional\n*/\n materialVectorParams?: Array<string>;\n\n /**\n@description\nDatasmith format file path.\n@optional\n*/\n datasmithFilePath?: string;\n\n /**\n@description\nAttachment settings.\n@optional\n*/\n attachment?: FAttachment;\n\n /**\n@description\nUnwrap/Wrap mesh pairs\n@optional\n*/\n UWMeshPairs?: Array<FUWMeshPairJson>;\n\n /**\n@description\nAdditional meshes for product\n@optional\n*/\n addMeshes?: Array<FAddMeshJson>;\n\n /**\n@description\nUnwrap mesh pak\n@optional\n*/\n unwrapPak?: FUWMeshPairPakJson;\n\n /**\n@description\nMake product like static mesh actor(no select)\nDefault value: false\n@optional\n*/\n staticMeshActor?: boolean;\n\n /**\n@description\nMake pan clamps for product\nDefault value: false\n@optional\n*/\n clampPanToProduct?: boolean;\n\n /**\n@description\nCan product collision with levels.\nDefault value: false\n@optional\n*/\n collisionLevel?: boolean;\n\n /**\n@description\nCan product collision with other products.\nDefault value: false\n@optional\n*/\n collisionProduct?: boolean;\n\n /**\n@description\nShow only meshes.\n@optional\n*/\n cutMeshes?: Array<string>;\n\n /**\n@description\nMeshes to hide from product.\n@optional\n*/\n hideMeshes?: Array<string>;\n\n /**\n@description\nMake pivot in center of bounds.\nDefault value: false\n@optional\n*/\n centerPivot?: boolean;\n\n /**\n@description\nShow unwrap for debug.\nDefault value: false\n@optional\n*/\n showUnwrap?: boolean;\n\n /**\n@description\nLayers to add product to.\n@optional\n*/\n layers?: Array<string>;\n\n /**\n@description\nSet product hidden in scene.\nDefault value: false\n@optional\n*/\n hide?: boolean;\n\n /**\n@description\nIs product selected.\nDefault value: false\n@optional\n*/\n selected?: boolean;\n\n /**\n@description\nMeasurements of product. It will be used to override bound size for FLoadMeasureCommand\n@optional\n*/\n measurements?: FVectorJson;\n\n /**\n@description\nDimension.\nDefault value: EDimensionType::none\n@optional\n*/\n dimensionType?: EDimensionType;\n}\n\n/**\n@description\nLoad sublevel.\n*/\nexport interface FLevelPayload extends FPayloadBase {\n /**\n@description\nLevel name.\n@optional\n*/\n levelName?: string;\n\n /**\n@description\nBool that hide all levels, after that it loads level with levelName.\nDefault value: false\n@optional\n*/\n hideAllLevels?: boolean;\n\n /**\n@description\nHide last level.\nDefault value: false\n@optional\n*/\n hideLastLevel?: boolean;\n\n /**\n@description\nThis means that parts of level with tag 'Selectable' can be selected.\nDefault value: false\n@optional\n*/\n selectable?: boolean;\n\n /**\n@description\nLevel VRam size in mb. It is used for level streaming and managing.\nDefault value: 0\n@optional\n*/\n levelVRamSize?: number;\n\n /**\n@description\nLocation of this sublevel.\n@optional\n*/\n location?: FVectorJson;\n\n /**\n@description\nRotation of this sublevel.\n@optional\n*/\n rotation?: FRotatorJson;\n\n /**\n@description\nLevel type.\n@optional\n*/\n levelType?: Array<string>;\n\n /**\n@description\nLevel PAK.\n*/\n levelPak: FAssetPakJson;\n\n /**\n@description\nMaterial slots of all actors in the world.\n@optional\n*/\n slots?: Array<string>;\n\n /**\n@description\nAttach sockets of all actors in the world.\n@optional\n*/\n sockets?: Array<string>;\n\n /**\n@description\nClear products during level change.\nDefault value: false\n@optional\n*/\n clearProducts?: boolean;\n}\n\n/**\n@description\nCamera settings.\n*/\nexport interface FCameraSettingsPayload extends FPayloadBase {\n /**\n@description\nCamera aperture.\nDefault value: 0\n@optional\n*/\n aperture?: number;\n\n /**\n@description\nCamera FocusOffset.\nDefault value: 0\n@optional\n*/\n focusOffset?: number;\n\n /**\n@description\nCamera FocalLength.\nDefault value: 0\n@optional\n*/\n focalLength?: number;\n\n /**\n@description\nCamera FOV.\nDefault value: 0\n@optional\n*/\n fov?: number;\n\n /**\n@description\nTurns off focusing completely.\nDefault value: false\n@optional\n*/\n enableFocus?: boolean;\n}\n\n/**\n@description\nCameraPreset with Location and Rotation. It Used in PakExportRuntime.\n*/\nexport interface FCameraPresetBasePayload extends FPayloadBase {\n /**\n@description\nLocation.\n*/\n location: FVectorJson;\n\n /**\n@description\nRotation.\n*/\n rotation: FRotatorJson;\n\n /**\n@description\nCamera object.\n@optional\n*/\n object?: string;\n\n /**\n@deprecated\nUse {@link FCameraSettingsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nCamera aperture.\nDefault value: 0\n@optional\n*/\n aperture?: number;\n\n /**\n@deprecated\nUse {@link FCameraSettingsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nCamera FocusOffset.\nDefault value: 0\n@optional\n*/\n focusOffset?: number;\n\n /**\n@deprecated\nUse {@link FCameraSettingsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nCamera FocalLength.\nDefault value: 0\n@optional\n*/\n focalLength?: number;\n\n /**\n@deprecated\nUse {@link FCameraSettingsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nCamera FOV.\nDefault value: 0\n@optional\n*/\n fov?: number;\n\n /**\n@deprecated\nUse {@link FCameraSettingsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nTurns off focusing completely.\nDefault value: false\n@optional\n*/\n enableFocus?: boolean;\n}\n\n/**\n@description\nSettings of sequence.\n*/\nexport interface FSettingsSequencePayload extends FPayloadBase {\n /**\n@description\nLoop behavior of sequence playing.\nDefault value: ESequenceLoopBehavior::none\n@optional\n*/\n loopBehavior?: ESequenceLoopBehavior;\n\n /**\n@description\nRate-speed of sequence playing\nTODO: Make play rate. It could be negative, so remove bool reverse.\nDefault value: 1.0 (float)\n@optional\n*/\n playRate?: number;\n\n /**\n@description\nIs reverse playing of sequence.\nDefault value: false\n@optional\n*/\n reverse?: boolean;\n\n /**\n@description\nTime period of responding changes for callbacks.\nDefault value: 0.05 (float)\n@optional\n*/\n timeResponseChangeCallBack?: number;\n\n /**\n@description\nSections of sequence. It is used for callback.\n@optional\n*/\n sections?: Array<FSequenceSection>;\n}\n\n/**\n@description\nInit sequence.\n*/\nexport interface FInitSequencePayload extends FSettingsSequencePayload {\n /**\n@description\nSequence to init if app uses CameraCuts as sections, not LevelSequences as sections. If invalid, then 0 index from paks.\n@optional\n*/\n sequenceName?: string;\n\n /**\n@description\nPAKs of sequences.\n*/\n paks: Array<FAssetPakJson>;\n}\n\n/**\n@description\nPadding or offset from borders of screen.\n*/\nexport interface FBorderPadding {\n /**\n@description\nPadding or offset from left broder of screen.\nDefault value: 0.f\n*/\n left: number;\n\n /**\n@description\nPadding or offset from right broder of screen.\nDefault value: 0.f\n*/\n right: number;\n\n /**\n@description\nPadding or offset from top broder of screen.\nDefault value: 0.f\n*/\n top: number;\n\n /**\n@description\nPadding or offset from bottom broder of screen.\nDefault value: 0.f\n*/\n bottom: number;\n}\n\n/**\n@deprecated\nUse {@link FUnLoadProductCommand}, {@link FFStringPayload}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nThis payload is used in comand to destroy product in scene by ObjectName.\n*/\nexport interface FRemoveProductInScenePayload extends FPayloadBase {\n /**\n@description\nObjectName of product to destroy.\n*/\n objectName: string;\n}\n\n/**\n@deprecated\nUse {@link FUnLoadLevelCommand}, {@link FFStringPayload}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nThis payload is used in comand to unload level by LevelName.\n*/\nexport interface FHideLevelPayload extends FPayloadBase {\n /**\n@description\nLevelName to unload.\n*/\n levelName: string;\n}\n\n/**\n@description\nPayload to use in FSetMaterialCommand.\n*/\nexport interface FSetMaterialPayload extends FMaterialPayload {\n /**\n@description\nObjectName to set material.\n@optional\n*/\n objectName?: string;\n\n /**\n@description\nProductName to set material.\n@optional\n*/\n productName?: string;\n\n /**\n@description\nMesh PAK.\n@optional\n*/\n meshPak?: FMeshPakJson;\n}\n\n/**\n@description\nPayload to use in FPlayAnimationCommand.\n*/\nexport interface FPlayAnimationPayload extends FPayloadBase {\n /**\n@description\nAnimations PAK file.\n*/\n animationsPak: FAnimationPakJson;\n}\n\n/**\n@description\nPayload to load and spawn button.\n*/\nexport interface FButtonPayload extends FPayloadBase {\n /**\n@description\nCallback message OnPressedButton event.\n*/\n callbackMessage: string;\n\n /**\n@description\nIs button facing to camera.\nDefault value: true\n@optional\n*/\n facingCamera?: boolean;\n\n /**\n@description\nDoes button align scale to camera.\nDefault value: true\n@optional\n*/\n scaleCamera?: boolean;\n\n /**\n@description\nDefault Scale.\nDefault value: 1.0 (float)\n@optional\n*/\n defaultScale?: number;\n\n /**\n@description\nScale multiplier for aligning to camera.\nDefault value: 1.0 (float)\n@optional\n*/\n scaleMultiplier?: number;\n\n /**\n@description\nClamp button's scale.\nDefault value: {0.1f, 10.0f}\n@optional\n*/\n scaleClamp?: FVector2DJson;\n\n /**\n@description\nPeriodTime to callback, if = 0 then no callback. Button's viewport position will be sended in 0-1 range.\nDefault value: 0\n@optional\n*/\n timeResponseCallBack?: number;\n\n /**\n@description\nObject name used by frontend.\n@optional\n*/\n objectName?: string;\n\n /**\n@description\nMaterial slots.\n@optional\n*/\n materialSlots?: Array<string>;\n\n /**\n@description\nVector parameters of button materials.\n@optional\n*/\n materialVectorParams?: Array<string>;\n\n /**\n@description\nButton's transform in the world.\n@optional\n*/\n transform?: FTransformJson;\n\n /**\n@description\nAttachment settings.\n@optional\n*/\n attachment?: FAttachment;\n\n /**\n@description\nActor Button Default pak.\n*/\n actorDefaultPak: FMeshPakJson;\n\n /**\n@description\nMaterial Button Default pak.\n*/\n materialDefaultPak: FMaterialPakJson;\n\n /**\n@description\nActor Button Hovered pak.\n*/\n actorHoveredPak: FMeshPakJson;\n\n /**\n@description\nMaterial Button Hovered pak.\n*/\n materialHoveredPak: FMaterialPakJson;\n\n /**\n@description\nActor Button Pressed pak.\n*/\n actorPressedPak: FMeshPakJson;\n\n /**\n@description\nMaterial Button Pressed pak.\n*/\n materialPressedPak: FMaterialPakJson;\n}\n\n/**\n@description\nRequest Unwrap Image Payload.\n*/\nexport interface FRequestUnwrapImagePayload extends FPayloadBase {\n /**\n@description\nMeshName.\n@optional\n*/\n meshName?: string;\n\n /**\n@description\nSend image by Web RTC.\nDefault value: false\n@optional\n*/\n sendByWebRTC?: boolean;\n\n /**\n@description\nImage base64.\n@optional\n*/\n image?: string;\n\n /**\n@description\nUnwrap size.\n*/\n unwrapSize: FVector2DJson;\n\n /**\n@description\nUnwrap size.\nDefault value: false\n@optional\n*/\n defaultMaterial?: boolean;\n\n /**\n@description\nUnwrap size.\n@optional\n*/\n scalars?: Array<FScalarJson>;\n\n /**\n@description\nUnwrap size.\n*/\n size: FVector2DJson;\n}\n\n/**\n@description\nAdd measures to array of objects.\n*/\nexport interface FMeasurePayload extends FPayloadBase {\n /**\n@description\nArray of object to measure.\n@optional\n*/\n objectNames?: Array<string>;\n\n /**\n@description\nDestroy all previous measures.\nDefault value: true\n@optional\n*/\n destroyAllMeasures?: boolean;\n\n /**\n@description\nColor of texts.\nDefault value: { 0, 0, 0, 1 }\n@optional\n*/\n colorText?: FLinearColorJson;\n\n /**\n@description\nColor of splines.\nDefault value: { 0, 0, 0, 1 }\n@optional\n*/\n colorSpline?: FLinearColorJson;\n\n /**\n@description\nColor of text's background.\nDefault value: { 0.5, 0.5, 0.5, 1 }\n@optional\n*/\n colorBackground?: FLinearColorJson;\n\n /**\n@description\nBackground visibility.\nDefault value: false\n@optional\n*/\n backgroundVisibility?: boolean;\n\n /**\n@description\nColor of text's outline.\nDefault value: { 1, 1, 1, 1 }\n@optional\n*/\n colorFontOutline?: FLinearColorJson;\n\n /**\n@description\nOutline size of text.\nDefault value: 1\n@optional\n*/\n fontOutlineSize?: number;\n\n /**\n@description\nWidget offset from spline to player camera.\nDefault value: 10\n@optional\n*/\n widgetOffset?: number;\n\n /**\n@description\nWidget scale.\nDefault value: 0.2\n@optional\n*/\n widgetScale?: number;\n\n /**\n@description\nWidget rendering size.\nDefault value: {128, 64}\n@optional\n*/\n widgetSize?: FVector2DJson;\n\n /**\n@description\nWidget measure text X to override.\n@optional\n*/\n measureTextX?: string;\n\n /**\n@description\nWidget measure text Y to override.\n@optional\n*/\n measureTextY?: string;\n\n /**\n@description\nWidget measure text Z to override.\n@optional\n*/\n measureTextZ?: string;\n\n /**\n@description\nGet info of bound from product (true) or get info of bound from 3d model (false).\nDefault value: true\n@optional\n*/\n getBoundInfoFromProduct?: boolean;\n\n /**\n@description\nDimension.\nDefault value: {}\n@optional\n*/\n dimensionType?: EDimensionType;\n\n /**\n@description\nPosition of Z Axis of measure.\nDefault value: EMeasureAxisZPosition::left\n@optional\n*/\n measureAxisZPosition?: EMeasureAxisZPosition;\n\n /**\n@description\nAlign XY Axis to bottom side of bounds.\nDefault value: true\n@optional\n*/\n alignAxisXYToBottom?: boolean;\n\n /**\n@description\nAlign XY Axis to 0 of Z axis with splineOffsetZ. If false then align to bottom Z-value of bound.\nDefault value: true\n@optional\n*/\n alignAxisXYToZeroZ?: boolean;\n\n /**\n@description\nSpline offset from bounds.\nDefault value: 10\n@optional\n*/\n splineOffset?: number;\n\n /**\n@description\nSpline offset along Z axis.\nDefault value: 0\n@optional\n*/\n splineOffsetZ?: number;\n\n /**\n@description\nSpline scale.\nDefault value: 0.2\n@optional\n*/\n splineScale?: number;\n\n /**\n@description\nName of MeasureObject for front callback.\n@optional\n*/\n measureObjectName?: string;\n}\n\n/**\n@description\nGet Assets In Pak payload.\n*/\nexport interface FGetAssetsInPakPayload extends FPayloadBase {\n /**\n@description\nPak file.\n*/\n pak: FPakJson;\n}\n\n/**\n@description\nGizmo type.\n*/\nexport interface FGizmoTypePayload extends FPayloadBase {\n /**\n@description\nGizmo type.\nDefault value: EGizmoType::translation\n*/\n gizmoType: EGizmoType;\n\n /**\n@description\nSub gizmo type.\nDefault value: 0\n@optional\n*/\n subGizmoType?: number;\n}\n\n/**\n@description\nSelection settings of post process material. All colors are emissive.\n*/\nexport interface FSelectionSettingsPayload extends FPayloadBase {\n /**\n@description\nThickness of primary outline. It is also background of minor outline. Minor lays down on major.\nDefault value: 2.0 (float)\n@optional\n*/\n primaryOutlineThickness?: number;\n\n /**\n@description\nThickness of secondary outline. Minor lays down on major. If 0 then secondary outline is not visible. If secondary 1 and primary 2 then outline is dual.\nDefault value: 0.0 (float)\n@optional\n*/\n secondaryOutlineThickness?: number;\n\n /**\n@description\nPrimary selection outline color. Alpha is transparency.\nDefault value: { 0, 1, 0, 1 }\n@optional\n*/\n primarySelectOutlineColor?: FLinearColorJson;\n\n /**\n@description\nMinor selection outline color. Alpha is transparency.\nDefault value: { 0, 0, 0, 0 }\n@optional\n*/\n secondarySelectOutlineColor?: FLinearColorJson;\n\n /**\n@description\nTransparency of hidden surface part of product, if it is selected.\nDefault value: 0.0 (float)\nMeta: ClampMin: 0.0; ClampMax: 1.0\n@optional\n*/\n hiddenSurfaceSelectTransparency?: number;\n\n /**\n@description\nSelection color for overlay product. Alpha is transparency.\nDefault value: { 0.5, 0.5, 0.5, 0 }\n@optional\n*/\n selectSurfaceColor?: FLinearColorJson;\n\n /**\n@description\nPrimary hovering outline color. Alpha is transparency.\nDefault value: { 1, 1, 1, 0 }\n@optional\n*/\n primaryHoverOutlineColor?: FLinearColorJson;\n\n /**\n@description\nSecondary hovering outline color. Alpha is transparency.\nDefault value: { 0, 0, 0, 0 }\n@optional\n*/\n secondaryHoverOutlineColor?: FLinearColorJson;\n\n /**\n@description\nTransparency of hidden surface part of product, if it is hovered.\nDefault value: 0.0 (float)\nMeta: ClampMin: 0.0; ClampMax: 1.0\n@optional\n*/\n hiddenSurfaceHoverTransparency?: number;\n\n /**\n@description\nHovering color for overlay product. Alpha is transparency.\nDefault value: { 0.25, 0.25, 0.25, 0 }\n@optional\n*/\n hoverSurfaceColor?: FLinearColorJson;\n}\n\n/**\n@deprecated\nUse {@link FitToObjectsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nFit to object.\n*/\nexport interface FFitPayload extends FPayloadBase {\n /**\n@description\nProduct objectName fit to.\n@optional\n*/\n objectName?: string;\n\n /**\n@description\nDistance multiplier.\nDefault value: 6\n@optional\n*/\n multiplier?: number;\n}\n\n/**\n@description\nFitToObjects payload\n*/\nexport interface FFitToObjectsPayload extends FPayloadBase {\n /**\n@description\nFit to bounds of array of Product's objectNames.\n@optional\n*/\n objectNames?: Array<string>;\n\n /**\n@description\nDistance multiplier.\nDefault value: 6\n@optional\n*/\n multiplier?: number;\n\n /**\n@description\nUse animated transition.\nTODO: Work incorrect. FitMethod::Top\nDefault value: false\n@optional\n*/\n transition?: boolean;\n\n /**\n@description\nSpeedRate of transition.\nDefault value: 1.0 (float)\n@optional\n*/\n transitionSpeedRate?: number;\n\n /**\n@description\nFit method describes from what view camera would fit.\nDefault value: EFitMethod::none\n@optional\n*/\n fitMethod?: EFitMethod;\n\n /**\n@description\nLocation to detect direction from what Camera will fit .\n@optional\n*/\n location?: FVectorJson;\n\n /**\n@description\nRotation aka direction to fit.\n@optional\n*/\n rotation?: FRotatorJson;\n}\n\n/**\n@description\nFitToObjectsByBoundBase payload\n*/\nexport interface FFitToObjectsBasePayload extends FPayloadBase {\n /**\n@description\nFit to bounds of array of Product's objectNames.\n@optional\n*/\n objectNames?: Array<string>;\n\n /**\n@description\nUse animated transition.\nTODO: Work incorrect. FitMethod::Top\nDefault value: false\n@optional\n*/\n transition?: boolean;\n\n /**\n@description\nTransition time.\nDefault value: 1.0 (float)\n@optional\n*/\n transitionTime?: number;\n\n /**\n@description\nCurve type or easing.\nDefault value: ECurve::linear\n@optional\n*/\n curve?: ECurve;\n\n /**\n@description\nFit method describes from what view camera would fit.\nDefault value: EFitMethod::none\n@optional\n*/\n fitMethod?: EFitMethod;\n\n /**\n@description\nLocation to detect direction from what Camera will fit .\n@optional\n*/\n location?: FVectorJson;\n\n /**\n@description\nRotation aka direction to fit.\n@optional\n*/\n rotation?: FRotatorJson;\n}\n\n/**\n@description\nFitToObjectsByBoundSphere payload\n*/\nexport interface FFitToObjectsByBSpherePayload\n extends FFitToObjectsBasePayload {\n /**\n@description\nPadding unit type.\nDefault value: EPaddingUnit::cm\n@optional\n*/\n paddingUnit?: EPaddingUnit;\n\n /**\n@description\nPadding as additional length of radius.\nDefault value: 0.0 (float)\n@optional\n*/\n paddingValue?: number;\n}\n\n/**\n@description\nFitToObjectsByBoundSphere payload\n*/\nexport interface FFitToObjectsByBBoxPayload extends FFitToObjectsBasePayload {\n /**\n@description\nPadding unit type.\nDefault value: EPaddingUnit::cm\n@optional\n*/\n paddingUnit?: EPaddingUnit;\n\n /**\n@description\nPadding from screen borders.\nDefault value: {0, 0, 0, 0}\n@optional\n*/\n paddingValue?: FBorderPadding;\n}\n\n/**\n@description\nSelect Product with outlining.\n*/\nexport interface FSelectProductByObjectNamePayload extends FPayloadBase {\n /**\n@description\nName of object to select.\n*/\n objectName: string;\n}\n\n/**\n@description\nMove selected payload.\n*/\nexport interface FMoveSelectedPayload extends FPayloadBase {\n /**\n@description\nOffset for object.\n@optional\n*/\n addOffset?: FVectorJson;\n\n /**\n@description\nDesired location.\n@optional\n*/\n location?: FVectorJson;\n}\n\n/**\n@description\nMove product by object name payload.\n*/\nexport interface FMoveProductByObjectNamePayload extends FMoveSelectedPayload {\n /**\n@description\nName of object to move.\n*/\n objectName: string;\n}\n\n/**\n@description\nSet product location payload.\n*/\nexport interface FSetProductsLocationPayload extends FFVectorPayload {\n /**\n@description\nTarget object names of products.\n@optional\n*/\n objectNames?: Array<string>;\n\n /**\n@description\nMovement allowance along specified axis.\nDefault value: EMovementAllowance::none\n@optional\n*/\n movementAllowance?: EMovementAllowance;\n}\n\n/**\n@description\nAlign products to plane payload.\n*/\nexport interface FAlignProductsToPlanePayload extends FPayloadBase {\n /**\n@description\nTarget object names of products.\n@optional\n*/\n objectNames?: Array<string>;\n\n /**\n@description\nAlignment. What side of bounding box of products use to align.\nDefault value: EAlignment::byBottomSide\n@optional\n*/\n alignment?: EAlignment;\n}\n\n/**\n@description\nRotate selected product.\n*/\nexport interface FRotatePayload extends FPayloadBase {\n /**\n@description\nDesired rotation.\n@optional\n*/\n rotation?: FRotatorJson;\n\n /**\n@description\nAdd world rotation.\n@optional\n*/\n addRotation?: FRotatorJson;\n}\n\n/**\n@description\nRotate object by name payload.\n*/\nexport interface FRotateObjectNamePayload extends FRotatePayload {\n /**\n@description\nName of object to rotate.\n*/\n objectName: string;\n}\n\n/**\n@description\nDrop payload.\n*/\nexport interface FDropPayload extends FPayloadBase {\n /**\n@description\nProduct to drop.\n@optional\n*/\n product?: FProductPayload;\n}\n\n/**\n@description\nRotate Actor By Tag payload.\n*/\nexport interface FRotateActorByTagPayload extends FRotatePayload {\n /**\n@description\nTag to search actor.\n*/\n tag: string;\n}\n\n/**\n@description\nMove all attached products by socket.\n*/\nexport interface FAttachmentPayload extends FPayloadBase {\n /**\n@description\nAttachment settings.\n*/\n attachment: FAttachment;\n}\n\n/**\n@description\nMove all attached products by socket.\n*/\nexport interface FAttachmentObjectPayload extends FAttachmentPayload {\n /**\n@description\nObject what to attach or detach.\n*/\n objectName: string;\n}\n\n/**\n@description\nMove all attached products toward the target socket in the direction of the projection onto the axis of the vector from the bounding box center to the target socket.\n*/\nexport interface FMoveAttachedActorsInSocketPayload extends FAttachmentPayload {\n /**\n@description\nDistance to move.\nDefault value: {}\n*/\n distance: number;\n}\n\n/**\n@description\nSet location and rotation with offsets.\n*/\nexport interface FPawnTransformControlPayload extends FPayloadBase {\n /**\n@description\nRotate Camera on X and Y angles.\n@optional\n*/\n addRotation?: FRotatorJson;\n\n /**\n@description\nMove Pawn/User on offset.\n@optional\n*/\n addTranslation?: FVectorJson;\n\n /**\n@deprecated\nUse {@link rotationAngle}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nRotation X.\nDefault value: {}\n@optional\n*/\n RotationX?: number;\n\n /**\n@deprecated\nUse {@link rotationAngle}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nRotation Y.\nDefault value: {}\n@optional\n*/\n RotationY?: number;\n\n /**\n@deprecated\nUse {@link offset}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nMove X.\nDefault value: {}\n@optional\n*/\n MoveX?: number;\n\n /**\n@deprecated\nUse {@link offset}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nMove Y.\nDefault value: {}\n@optional\n*/\n MoveY?: number;\n\n /**\n@deprecated\nUse {@link offset}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nMove Z.\nDefault value: {}\n@optional\n*/\n MoveZ?: number;\n}\n\n/**\n@description\nControl sensitivity.\n*/\nexport interface FControlSensitivityPayload extends FPayloadBase {\n /**\n@description\nWalk multiplier.\nDefault value: 200.0 (float)\n@optional\n*/\n walkSpeed?: number;\n\n /**\n@description\nPan multiplier for touch.\nDefault value: 1.0 (float)\n@optional\n*/\n panTouchSpeed?: number;\n\n /**\n@description\nRotation speed multiplier for touch.\nDefault value: 1.0 (float)\n@optional\n*/\n rotationTouchSpeed?: number;\n\n /**\n@description\nZoom Multiplier aka zoomStep for touch.\nDefault value: 1.0 (float)\n@optional\n*/\n zoomTouchSpeed?: number;\n\n /**\n@description\nDouble touch Zoom Multiplier aka zoomStep for double tap.\nDefault value: 10.0 (float)\n@optional\n*/\n zoomDoubleTouchSpeed?: number;\n\n /**\n@description\nPan multiplier.\nDefault value: 3.0 (float)\n@optional\n*/\n panSpeed?: number;\n\n /**\n@description\nRotation speed multiplier.\nDefault value: 3.0 (float)\n@optional\n*/\n rotationSpeed?: number;\n\n /**\n@description\nZoom Multiplier aka zoomStep.\nDefault value: 1.0 (float)\n@optional\n*/\n zoomSpeed?: number;\n}\n\n/**\n@description\nEnable or disable controls by cursor.\n*/\nexport interface FControlsByCursorPayload extends FPayloadBase {\n /**\n@description\nEnable or disable rotation by cursor.\nDefault value: true\n@optional\n*/\n rotation?: boolean;\n\n /**\n@description\nEnable or disable pan by cursor.\nDefault value: true\n@optional\n*/\n pan?: boolean;\n\n /**\n@description\nEnable or disable zoom by cursor.\nDefault value: true\n@optional\n*/\n zoom?: boolean;\n\n /**\n@description\nEnable or disable selection by cursor.\nDefault value: true\n@optional\n*/\n select?: boolean;\n\n /**\n@description\nEnable or disable interaction by cursor.\nDefault value: true\n@optional\n*/\n interact?: boolean;\n}\n\n/**\n@description\nControl camera mode.\n*/\nexport interface FControlCameraModePayload extends FPayloadBase {\n /**\n@description\nControl camera mode.\nDefault value: EControlMode::none\n*/\n mode: EControlMode;\n}\n\n/**\n@description\nPawn Movement Mode.\n*/\nexport interface FSetPawnMovementModePayload extends FPayloadBase {\n /**\n@description\nPawn Movement Mode.\nDefault value: EPawnMovementMode::around\n*/\n mode: EPawnMovementMode;\n}\n\n/**\n@description\nControl clamps for camera in world.\nTODO: Is it camera clamps or control clamps?\n*/\nexport interface FCameraClampsPayload extends FPayloadBase {\n /**\n@description\nMin zoom.\nDefault value: 0\n@optional\n*/\n minZoom?: number;\n\n /**\n@description\nMax zoom.\nDefault value: 0\n@optional\n*/\n maxZoom?: number;\n\n /**\n@description\nMin pitch.\nDefault value: 0\n@optional\n*/\n minPitch?: number;\n\n /**\n@description\nMax pitch.\nDefault value: 0\n@optional\n*/\n maxPitch?: number;\n\n /**\n@description\nMin yaw.\nDefault value: 0\n@optional\n*/\n minYaw?: number;\n\n /**\n@description\nMax yaw.\nDefault value: 0\n@optional\n*/\n maxYaw?: number;\n\n /**\n@description\nMin pan.\n@optional\n*/\n minPan?: FVectorJson;\n\n /**\n@description\nMax pan.\n@optional\n*/\n maxPan?: FVectorJson;\n}\n\n/**\n@description\nBase CameraPresetPayload for ApplyCameraPreset and SetCameraTransform.\n*/\nexport interface FCameraPresetPayload extends FCameraPresetBasePayload {\n /**\n@description\nOnly camera cast no transform.\nDefault value: false\n@optional\n*/\n onlyCameraCast?: boolean;\n\n /**\n@description\nTransition with timeline. It is used in SetCameraTransformCommand\nDefault value: false\n@optional\n*/\n transition?: boolean;\n\n /**\n@description\nSpeedRate of Camera Transition\nDefault value: 1.0 (float)\n@optional\n*/\n transitionSpeedRate?: number;\n\n /**\n@deprecated\nFor backward compatibility\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nArmm length.\nDefault value: 0\n@optional\n*/\n armLength?: number;\n}\n\n/**\n@description\nApply zoom.\n*/\nexport interface FApplyZoomPayload extends FPayloadBase {\n /**\n@description\nZoom add.\nDefault value: 0\n@optional\n*/\n zoomAdd?: number;\n\n /**\n@deprecated\nUse zoomValue\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nNew zoom value.\nDefault value: 0\n@optional\n*/\n zoomVal?: number;\n\n /**\n@description\nNew zoom value.\nDefault value: 0\n@optional\n*/\n zoomValue?: number;\n\n /**\n@deprecated\nUse {@link zoomPercentage}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nZoom Percentage\nDefault value: 0\n@optional\n*/\n zoomValProc?: number;\n\n /**\n@description\nZoom Percentage.\nDefault value: 0\n@optional\n*/\n zoomPercentage?: number;\n}\n\n/**\n@description\nBase Light Payload.\n*/\nexport interface FLightPayload extends FPayloadBase {\n /**\n@description\nLocation.\n@optional\n*/\n location?: FVectorJson;\n\n /**\n@description\nRotation.\n@optional\n*/\n rotation?: FRotatorJson;\n\n /**\n@description\nSubLocation.\n@optional\n*/\n subLocation?: FVectorJson;\n\n /**\n@description\nSubRotation.\n@optional\n*/\n subRotation?: FRotatorJson;\n\n /**\n@description\nArmLength.\nDefault value: 0\n@optional\n*/\n armLength?: number;\n\n /**\n@description\nSize.\n@optional\n*/\n size?: FVector2DJson;\n\n /**\n@description\nIntensity.\nDefault value: 0\n@optional\n*/\n intensity?: number;\n\n /**\n@description\nColor.\n@optional\n*/\n color?: FLinearColorJson;\n\n /**\n@description\nDisable gizmo.\nDefault value: false\n@optional\n*/\n disableGizmo?: boolean;\n\n /**\n@description\nYaw.\nDefault value: 0\n@optional\n*/\n yaw?: number;\n\n /**\n@description\nPitch.\nDefault value: 0\n@optional\n*/\n pitch?: number;\n\n /**\n@description\nObject name.\n@optional\n*/\n objectName?: string;\n\n /**\n@description\nSet light current after add.\nDefault value: false\n@optional\n*/\n setCurrent?: boolean;\n}\n\n/**\n@description\nRectangle Light .\n*/\nexport interface FRectLightPayload extends FLightPayload {\n /**\n@description\nRectangle light type.\nDefault value: ERectLightType::rect\n@optional\n*/\n rectLightType?: ERectLightType;\n\n /**\n@description\nTemperature.\nDefault value: 0\n@optional\n*/\n temperature?: number;\n}\n\n/**\n@description\nPanel light payload.\n*/\nexport interface FPanelLightPayload extends FLightPayload {\n /**\n@description\nKelvin.\nDefault value: 0\n@optional\n*/\n kelvin?: number;\n}\n\n/**\n@description\nSet HDR.\n*/\nexport interface FHdrPayload extends FPayloadBase {\n /**\n@description\nImage URL.\n@optional\n*/\n imageUrl?: string;\n\n /**\n@description\nIntensity.\nDefault value: {}\n@optional\n*/\n intensity?: number;\n\n /**\n@description\nHorizontal rotation\nDefault value: {}\n@optional\n*/\n rotation?: number;\n}\n\n/**\n@description\nSun.\n*/\nexport interface FSunPayload extends FPayloadBase {\n /**\n@description\nEnable sun.\nDefault value: false\n@optional\n*/\n enable?: boolean;\n\n /**\n@description\nNorthYaw.\nDefault value: 0\n@optional\n*/\n northYaw?: number;\n\n /**\n@description\nLongitude.\nDefault value: 0\n@optional\n*/\n longitude?: number;\n\n /**\n@description\nLatitude.\nDefault value: 0\n@optional\n*/\n latitude?: number;\n\n /**\n@description\nTime of the day for sun.\nDefault value: 0\n@optional\n*/\n timeOfDay?: number;\n}\n\n/**\n@description\nWeather and ultra dynamic sky with sun.\n*/\nexport interface FWeatherPayload extends FPayloadBase {\n /**\n@description\nSun data.\n*/\n sunData: FSunPayload;\n}\n\n/**\n@deprecated\nUse {@link FWeatherCommand}, {@link FWeatherPayload}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nSun orientation\n*/\nexport interface FSunOrientationPayload extends FPayloadBase {\n /**\n@description\nNorthYaw.\nDefault value: 0\n@optional\n*/\n northYaw?: number;\n\n /**\n@description\nLongitude.\nDefault value: 0\n@optional\n*/\n longitude?: number;\n\n /**\n@description\nLatitude.\nDefault value: 0\n@optional\n*/\n latitude?: number;\n}\n\n/**\n@description\nLight Mode.\n*/\nexport interface FLightModePayload extends FLightPayload {\n /**\n@description\nEnable light.\nDefault value: false\n*/\n enable: boolean;\n\n /**\n@description\nTemperature.\nDefault value: 0\n@optional\n*/\n temperature?: number;\n\n /**\n@description\nKelvin.\nDefault value: 0\n@optional\n*/\n kelvin?: number;\n\n /**\n@description\nRect light type.\nDefault value: ERectLightType::rect\n@optional\n*/\n rectLightType?: ERectLightType;\n\n /**\n@description\nLight mode.\n*/\n lightMode: string;\n}\n\n/**\n@description\nComposure.\n*/\nexport interface FComposurePayload extends FPayloadBase {\n /**\n@description\nEnable composure.\nDefault value: false\n*/\n enable: boolean;\n\n /**\n@description\nURL.\n@optional\n*/\n url?: string;\n\n /**\n@description\nColorHex.\n@optional\n*/\n colorHex?: string;\n}\n\n/**\n@description\nInit sequence from product's Pak by name.\n*/\nexport interface FInitSequenceByObjectNamePayload\n extends FSettingsSequencePayload {\n /**\n@description\nObjectName of product, from wich Pak file sequence will be loaded.\n@optional\n*/\n objectName?: string;\n}\n\n/**\n@description\nPlay sequence.\n*/\nexport interface FPlaySequencePayload extends FPayloadBase {\n /**\n@description\nRate-speed of sequence playing.\nTODO: Make play rate. It could be negative and remove bool reverse. \nDefault value: {}\n@optional\n*/\n playRate?: number;\n\n /**\n@description\nReverse playing.\nDefault value: {}\n@optional\n*/\n reverse?: boolean;\n}\n\n/**\n@description\nJump to section.\n*/\nexport interface FJumpToSequencePayload extends FPayloadBase {\n /**\n@description\nSection to jump.\nDefault value: {}\n*/\n id: number;\n}\n\n/**\n@description\nDrag to time.\n*/\nexport interface FDragSequencePayload extends FPayloadBase {\n /**\n@description\nChoose case to drag.\nDefault value: false\n@optional\n*/\n dragBySectionTime?: boolean;\n\n /**\n@description\nId of section of sequence to drag.\nDefault value: {}\n@optional\n*/\n id?: number;\n\n /**\n@description\nTime of section of sequence to drag.\nDefault value: {}\n@optional\n*/\n sectionTime?: number;\n\n /**\n@description\nGlobal time of sequence to drag.\nDefault value: {}\n*/\n time: number;\n}\n\n/**\n@description\nMain screenshot payload.\nTODO: In refactoring proccess\n*/\nexport interface FRenderPayload extends FPayloadBase {\n /**\n@description\nSize.\n*/\n size: FIntPoint2DJson;\n\n /**\n@description\nName.\n@optional\n*/\n name?: string;\n\n /**\n@description\nFormat png, jpg(jpeg).\n@optional\n*/\n format?: string;\n\n /**\n@description\nURL upload render to.\n@optional\n*/\n url?: string;\n\n /**\n@description\nFile path save render to.\n@optional\n*/\n filePath?: string;\n\n /**\n@description\nPreset.\n@optional\n*/\n preset?: string;\n\n /**\n@description\nCrop.\nDefault value: false\n@optional\n*/\n crop?: boolean;\n\n /**\n@description\nSamples.\nDefault value: 100\n@optional\n*/\n samples?: number;\n\n /**\n@description\nTransparent Background.\nDefault value: false\n@optional\n*/\n transparentBackground?: boolean;\n\n /**\n@description\nsendByWebRTC.\nDefault value: false\n@optional\n*/\n sendByWebRTC?: boolean;\n\n /**\n@description\npath tracing.\nDefault value: false\n@optional\n*/\n pathTrace?: boolean;\n\n /**\n@description\nMeta.\n@optional\n*/\n meta?: string;\n\n /**\n@description\nFrames.\nDefault value: {}\n*/\n frames: number;\n\n /**\n@description\nPitchCurve.\n@optional\n*/\n pitchCurve?: string;\n}\n\n/**\n@description\nEnable 360.\n*/\nexport interface FSpinnerModePayload extends FBoolPayload {\n /**\n@description\nArmLength.\nDefault value: {}\n@optional\n*/\n armLength?: number;\n}\n\n/**\n@description\nInternal scene state model, used only by unreal.\n*/\nexport interface FSceneState extends FPayloadBase {\n /**\n@description\nCamera settings.\n@optional\n*/\n cameraSettings?: FCameraPresetPayload;\n\n /**\n@description\nWeather data.\n@optional\n*/\n weatherData?: FWeatherPayload;\n\n /**\n@description\nComposure data.\n@optional\n*/\n composData?: FComposurePayload;\n\n /**\n@description\nHDR data.\n@optional\n*/\n HDR?: FHdrPayload;\n\n /**\n@description\nIs UNDO available.\nDefault value: false\n@optional\n*/\n undoAvailable?: boolean;\n\n /**\n@description\nIs REDO available.\nDefault value: false\n@optional\n*/\n redoAvailable?: boolean;\n\n /**\n@description\nProducts in camera view.\n@optional\n*/\n productsInView?: Array<FProductPayload>;\n\n /**\n@description\nObject in focus.\n@optional\n*/\n focusObject?: FProductPayload;\n\n /**\n@description\nControl camera mode.\n@optional\n*/\n controlCameraMode?: FControlCameraModePayload;\n\n /**\n@description\nPawn movement mode.\n@optional\n*/\n pawnMovementMode?: FSetPawnMovementModePayload;\n}\n\n/**\n@description\nRequest scene state.\n*/\nexport interface FRequestSceneStatePayload extends FPayloadBase {\n /**\n@description\nOnly products in view to send.\nDefault value: false\n@optional\n*/\n productsInView?: boolean;\n\n /**\n@description\nSceneTate. It is used for callback\n@optional\n*/\n sceneState?: FSceneState;\n}\n\n/**\n@description\nScene state.\n*/\nexport interface FLoadSceneStatePayload extends FPayloadBase {\n /**\n@description\nScene state to load.\n*/\n sceneState: FSceneState;\n\n /**\n@description\nScene item types to leave (not destroy) during applying state.\n@optional\n*/\n leave?: Array<ESceneItemType>;\n}\n\n/**\n@description\nAdd Undo Redo Chain payload.\n*/\nexport interface FAddUndoRedoChainPayload extends FPayloadBase {\n /**\n@description\nAdd undo&redo chain reason\n@optional\n*/\n reason?: string;\n}\n\n/**\n@description\nSet DLSS mode.\n*/\nexport interface FSetDlssModePayload extends FPayloadBase {\n /**\n@description\nDLSS mode.\nDefault value: EDlssMode::Off\n*/\n dlssMode: EDlssMode;\n\n /**\n@description\nDLSS mode for showcase.\nDefault value: EDlssMode::Off\n@optional\n*/\n dlssModeShowcase?: EDlssMode;\n}\n\n/**\n@deprecated\nDon't need anymore\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nAppInit.\n*/\nexport interface FAppInitPayload extends FPayloadBase {\n /**\n@description\nAppType.\nDefault value: EAppType::none\n*/\n appType: EAppType;\n}\n\n/**\n@description\nResolution.\n*/\nexport interface FResolutionPayload extends FPayloadBase {\n /**\n@description\nResolution x = width, y = height.\n*/\n resolution: FVector2DJson;\n}\n\n/**\n@description\nResetScene.\n*/\nexport interface FResetScenePayload extends FPayloadBase {\n /**\n@description\nUE scene item types to leave.\n@optional\n*/\n leave?: Array<ESceneItemType>;\n\n /**\n@description\nPrevent full reset with restart base level.\nDefault value: false\n@optional\n*/\n preventFullReset?: boolean;\n}\n\n/**\n@description\nMorphToPAK.\n*/\nexport interface FMorphToPakPayload extends FPayloadBase {\n /**\n@description\nLength.\nDefault value: 0\n*/\n length: number;\n\n /**\n@description\nWidth.\nDefault value: 0\n*/\n width: number;\n\n /**\n@description\nEdge.\nDefault value: 0\n*/\n edge: number;\n\n /**\n@description\nSizeX.\n*/\n sizeX: FVector2DJson;\n\n /**\n@description\nGap.\nDefault value: 0\n*/\n gap: number;\n\n /**\n@description\nStyling.\n*/\n styling: string;\n\n /**\n@description\nDestination or path.\n*/\n destination: string;\n\n /**\n@description\nPak file path.\n*/\n pakFilePath: string;\n}\n\n/**\n@description\nScreen Position.\n*/\nexport interface FScreenPositionPayload extends FPayloadBase {\n /**\n@description\nButton's name.\n*/\n objectName: string;\n\n /**\n@description\nScreen position multiplier is a koef from 0 to 1.\n*/\n screenPositionMultiplier: FVector2DJson;\n\n /**\n@description\nScreen position.\n*/\n screenPosition: FVector2DJson;\n}\n\n/**\n@description\nTest payload for FVector and for FRotator.\n*/\nexport interface FTestPayload extends FPayloadBase {\n /**\n@description\nTest FVector. FVector(X,Y,Z)\nDefault value: { 0,0,0 }\n*/\n testVector: any;\n\n /**\n@description\nTest FRotator. FRotator(Roll,Pitch,Yaw)\nDefault value: { 0.0, 0.0, 0.0 }\n*/\n testRotator: any;\n}\n\n/**\n@description\nBase Structure for commands.\n*/\nexport interface FCommandBase {\n /**\n@description\nCommand name.\n*/\n command: MetaBoxCommand;\n\n /**\n@description\nCorrelation id.\n@optional\n*/\n correlationId?: string;\n}\n\n/**\n@deprecated\nNo need\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nLoad paks in memory.\n*/\nexport interface FLoadPaksInMemoryCommand extends FCommandBase {\n command: MetaBoxCommand.FLoadPaksInMemoryCommand;\n\n /**\n@description\nPak file paths to load.\n*/\n payload: FFStringsPayload;\n}\n\n/**\n@description\nLoad paks in memory.\n*/\nexport interface FSetDlssModeCommand extends FCommandBase {\n command: MetaBoxCommand.FSetDlssModeCommand;\n\n /**\n@description\nPak file paths to load.\n*/\n payload: FSetDlssModePayload;\n}\n\n/**\n@description\nLoad and spawn product in the world.\n*/\nexport interface FLoadProductCommand extends FCommandBase {\n command: MetaBoxCommand.FLoadProductCommand;\n\n /**\n@description\nProduct payload.\n*/\n payload: FProductPayload;\n}\n\n/**\n@deprecated\nUse {@link FLoadProductCommand} \n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nLoad and spawn product in the world.\n*/\nexport interface FSelectProductCommand extends FCommandBase {\n command: MetaBoxCommand.FSelectProductCommand;\n\n /**\n@description\nProduct payload.\n*/\n payload: FProductPayload;\n}\n\n/**\n@deprecated\nUse {@link FUnLoadProductByObjectNameCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nDestroy product in the world.\n*/\nexport interface FUnLoadProductCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadProductCommand;\n\n /**\n@description\nProduct payload.\n*/\n payload: FProductPayload;\n}\n\n/**\n@deprecated\nUse {@link FUnLoadProductCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nDestroy product in the world.\n*/\nexport interface FRemoveProductCommand extends FCommandBase {\n command: MetaBoxCommand.FRemoveProductCommand;\n\n /**\n@description\nProduct payload.\n*/\n payload: FProductPayload;\n}\n\n/**\n@description\nDestroy product by object name in the world.\n*/\nexport interface FUnLoadProductByObjectNameCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadProductByObjectNameCommand;\n\n /**\n@description\nValue is objectName.\n*/\n payload: FFStringPayload;\n}\n\n/**\n@deprecated\nUse {@link FUnLoadProductByObjectNameCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nDestroy product by name in the world.\n*/\nexport interface FRemoveProductInSceneCommand extends FCommandBase {\n command: MetaBoxCommand.FRemoveProductInSceneCommand;\n\n /**\n@description\nValue is objectName.\n*/\n payload: FRemoveProductInScenePayload;\n}\n\n/**\n@description\nDestroy all products in the world.\n*/\nexport interface FUnLoadAllProductsCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadAllProductsCommand;\n}\n\n/**\n@deprecated\nUse {@link FUnLoadAllProductsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nDestroy all products in the world.\n*/\nexport interface FRemoveAllProductsCommand extends FCommandBase {\n command: MetaBoxCommand.FRemoveAllProductsCommand;\n}\n\n/**\n@description\nSet flying Mesh.\n*/\nexport interface FSetFlyingMeshCommand extends FCommandBase {\n command: MetaBoxCommand.FSetFlyingMeshCommand;\n\n /**\n@description\nSet flying mesh payload.\n*/\n payload: FProductPayload;\n}\n\n/**\n@description\nLoad SubLevel.\n*/\nexport interface FLoadLevelCommand extends FCommandBase {\n command: MetaBoxCommand.FLoadLevelCommand;\n\n /**\n@description\nLoad SubLevel.\n*/\n payload: FLevelPayload;\n}\n\n/**\n@description\nUnLoad SubLevel.\n*/\nexport interface FUnLoadLevelCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadLevelCommand;\n\n /**\n@description\nValue is LevelName.\n*/\n payload: FFStringPayload;\n}\n\n/**\n@deprecated\nUse {@link FUnLoadLevelCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nUnload level.\n*/\nexport interface FHideLevelCommand extends FCommandBase {\n command: MetaBoxCommand.FHideLevelCommand;\n\n /**\n@description\nUnLoad SubLevel.\n*/\n payload: FHideLevelPayload;\n}\n\n/**\n@description\nUnLoad all SubLevels.\n*/\nexport interface FUnLoadAllLevelsCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadAllLevelsCommand;\n}\n\n/**\n@deprecated\nUse {@link FUnLoadAllLevelsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nUnload level.\n*/\nexport interface FHideAllLevelsCommand extends FCommandBase {\n command: MetaBoxCommand.FHideAllLevelsCommand;\n}\n\n/**\n@description\nSet material.\n*/\nexport interface FSetMaterialCommand extends FCommandBase {\n command: MetaBoxCommand.FSetMaterialCommand;\n\n /**\n@description\nSet material.\n*/\n payload: FSetMaterialPayload;\n}\n\n/**\n@description\nSet flying material.\n*/\nexport interface FSetFlyingMaterialCommand extends FCommandBase {\n command: MetaBoxCommand.FSetFlyingMaterialCommand;\n\n /**\n@description\nSet flying material.\n*/\n payload: FSetMaterialPayload;\n}\n\n/**\n@description\nPlay animation.\n*/\nexport interface FPlayAnimationCommand extends FCommandBase {\n command: MetaBoxCommand.FPlayAnimationCommand;\n\n /**\n@description\nPlay animation PAK payload.\n*/\n payload: FPlayAnimationPayload;\n}\n\n/**\n@description\nAdd button. When it clicked - wait for callback.\n*/\nexport interface FLoadButtonCommand extends FCommandBase {\n command: MetaBoxCommand.FLoadButtonCommand;\n\n /**\n@description\nButton pak payload.\n*/\n payload: FButtonPayload;\n}\n\n/**\n@description\nDestroy button.\n*/\nexport interface FUnLoadButtonByObjectNameCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadButtonByObjectNameCommand;\n\n /**\n@description\nValue is Button's ObjectName.\n*/\n payload: FFStringPayload;\n}\n\n/**\n@description\nDestroy all buttons.\n*/\nexport interface FUnLoadAllButtonsCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadAllButtonsCommand;\n}\n\n/**\n@description\nSet scale of all buttons on scene and on all buttons, that will be spawned.\n*/\nexport interface FSetButtonScaleCommand extends FCommandBase {\n command: MetaBoxCommand.FSetButtonScaleCommand;\n\n /**\n@description\nScale of buttons.\n*/\n payload: number;\n}\n\n/**\n@description\nRequest unwrap image.\n*/\nexport interface FRequestUnwrapImageCommand extends FCommandBase {\n command: MetaBoxCommand.FRequestUnwrapImageCommand;\n\n /**\n@description\nRequest unwrap image payload.\n*/\n payload: FRequestUnwrapImagePayload;\n}\n\n/**\n@description\nAdd measures to array of objects.\n*/\nexport interface FLoadMeasureCommand extends FCommandBase {\n command: MetaBoxCommand.FLoadMeasureCommand;\n\n /**\n@description\nMeasuringTool payload.\n*/\n payload: FMeasurePayload;\n}\n\n/**\n@description\nDestroy target Measure.\n*/\nexport interface FUnLoadMeasureByObjectNameCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadMeasureByObjectNameCommand;\n\n /**\n@description\nValue is Measure's ObjectName.\n*/\n payload: FFStringPayload;\n}\n\n/**\n@description\nDestroy all Measures.\n*/\nexport interface FUnLoadAllMeasuresCommand extends FCommandBase {\n command: MetaBoxCommand.FUnLoadAllMeasuresCommand;\n}\n\n/**\n@description\nGet Assets In Pak File.\n*/\nexport interface FGetAssetsInPakCommand extends FCommandBase {\n command: MetaBoxCommand.FGetAssetsInPakCommand;\n\n /**\n@description\nGet Assets In Pak payload.\n*/\n payload: FGetAssetsInPakPayload;\n}\n\n/**\n@description\nGizmo type.\n*/\nexport interface FChangeGizmoTypeCommand extends FCommandBase {\n command: MetaBoxCommand.FChangeGizmoTypeCommand;\n\n /**\n@description\nGizmo type.\n*/\n payload: FGizmoTypePayload;\n}\n\n/**\n@description\nSelection settings.\n*/\nexport interface FSetSelectionSettingsCommand extends FCommandBase {\n command: MetaBoxCommand.FSetSelectionSettingsCommand;\n\n /**\n@description\nSelection settings of post process material.\n*/\n payload: FSelectionSettingsPayload;\n}\n\n/**\n@description\nDrag.\n*/\nexport interface FDragCommand extends FCommandBase {\n command: MetaBoxCommand.FDragCommand;\n}\n\n/**\n@description\nDrop to cursor location.\n*/\nexport interface FDropCommand extends FCommandBase {\n command: MetaBoxCommand.FDropCommand;\n\n /**\n@description\nDrop payload.\n@optional\n*/\n payload?: FDropPayload;\n}\n\n/**\n@deprecated\nUse {@link FFitToObjectsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nFit to product.\n*/\nexport interface FFitCommand extends FCommandBase {\n command: MetaBoxCommand.FFitCommand;\n\n /**\n@description\nFit payload.\n@optional\n*/\n payload?: FFitPayload;\n}\n\n/**\n@description\nFit to array of products.\n*/\nexport interface FFitToObjectsCommand extends FCommandBase {\n command: MetaBoxCommand.FFitToObjectsCommand;\n\n /**\n@description\nFitToObjects payload.\n@optional\n*/\n payload?: FFitToObjectsPayload;\n}\n\n/**\n@description\nFit to array of products by bound sphere.\nTODO: Work incorrect. In Editor it works, but in game with WindowedFullscreen mode it doesn't.\n*/\nexport interface FFitToObjectsByBSphereCommand extends FCommandBase {\n command: MetaBoxCommand.FFitToObjectsByBSphereCommand;\n\n /**\n@description\nFitToObjectsByBoundSphere payload.\n@optional\n*/\n payload?: FFitToObjectsByBSpherePayload;\n}\n\n/**\n@description\nFit to array of products by bound box.\nTODO: Work incorrect. In Editor it works, but in game with WindowedFullscreen mode it doesn't.\n*/\nexport interface FFitToObjectsByBBoxCommand extends FCommandBase {\n command: MetaBoxCommand.FFitToObjectsByBBoxCommand;\n\n /**\n@description\nFitToObjectsByBoundBox payload.\n@optional\n*/\n payload?: FFitToObjectsByBBoxPayload;\n}\n\n/**\n@deprecated\nUse {@link FSelectProductByObjectNameCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nSelect product in scene.\n*/\nexport interface FSelectProductInSceneCommand extends FCommandBase {\n command: MetaBoxCommand.FSelectProductInSceneCommand;\n\n /**\n@description\nSelectProduct in scene payload.\n*/\n payload: FSelectProductByObjectNamePayload;\n}\n\n/**\n@description\nSelect product in scene.\n*/\nexport interface FSelectProductByObjectNameCommand extends FCommandBase {\n command: MetaBoxCommand.FSelectProductByObjectNameCommand;\n\n /**\n@description\nSelectProduct in scene payload.\n*/\n payload: FSelectProductByObjectNamePayload;\n}\n\n/**\n@description\nUnselect all products in scene.\n*/\nexport interface FUnselectAllProductsCommand extends FCommandBase {\n command: MetaBoxCommand.FUnselectAllProductsCommand;\n}\n\n/**\n@description\nMove selected product.\n*/\nexport interface FMoveSelectedCommand extends FCommandBase {\n command: MetaBoxCommand.FMoveSelectedCommand;\n\n /**\n@description\nMove selected product payload.\n*/\n payload: FMoveSelectedPayload;\n}\n\n/**\n@description\nMove product by object name.\n*/\nexport interface FMoveProductByObjectNameCommand extends FCommandBase {\n command: MetaBoxCommand.FMoveProductByObjectNameCommand;\n\n /**\n@description\nMove product payload.\n*/\n payload: FMoveProductByObjectNamePayload;\n}\n\n/**\n@description\nSet products location by object name.\n*/\nexport interface FSetProductsLocationCommand extends FCommandBase {\n command: MetaBoxCommand.FSetProductsLocationCommand;\n\n /**\n@description\nSet products location payload.\n*/\n payload: FSetProductsLocationPayload;\n}\n\n/**\n@description\nAlign products bounding box to plane.\n*/\nexport interface FAlignProductsToPlaneCommand extends FCommandBase {\n command: MetaBoxCommand.FAlignProductsToPlaneCommand;\n\n /**\n@description\nAlign products to plane payload.\n*/\n payload: FAlignProductsToPlanePayload;\n}\n\n/**\n@description\nRotate selected product.\n*/\nexport interface FRotateSelectedCommand extends FCommandBase {\n command: MetaBoxCommand.FRotateSelectedCommand;\n\n /**\n@description\nRotate selected product payload.\n*/\n payload: FRotatePayload;\n}\n\n/**\n@description\nRotate by object name.\n*/\nexport interface FRotateObjectNameCommand extends FCommandBase {\n command: MetaBoxCommand.FRotateObjectNameCommand;\n\n /**\n@description\nRotate by object name payload.\n*/\n payload: FRotateObjectNamePayload;\n}\n\n/**\n@description\nRotate actor by tag.\n*/\nexport interface FRotateActorByTagCommand extends FCommandBase {\n command: MetaBoxCommand.FRotateActorByTagCommand;\n\n /**\n@description\nRotate actor by tag payload.\n*/\n payload: FRotateActorByTagPayload;\n}\n\n/**\n@deprecated\nUse {@link FUnloadSelectedProductCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nRemoveFocused Product.\n*/\nexport interface FRemoveFocusedCommand extends FCommandBase {\n command: MetaBoxCommand.FRemoveFocusedCommand;\n}\n\n/**\n@description\nUnload Selected Product.\n*/\nexport interface FUnloadSelectedProductCommand extends FCommandBase {\n command: MetaBoxCommand.FUnloadSelectedProductCommand;\n}\n\n/**\n@description\nAttach product.\n*/\nexport interface FAttachActorCommand extends FCommandBase {\n command: MetaBoxCommand.FAttachActorCommand;\n\n /**\n@description\nAttachment actor.\n*/\n payload: FAttachmentObjectPayload;\n}\n\n/**\n@description\nDetach actor by ObjectName.\n*/\nexport interface FDetachActorCommand extends FCommandBase {\n command: MetaBoxCommand.FDetachActorCommand;\n\n /**\n@description\nDetach actor by ObjectName payload.\n*/\n payload: FAttachmentObjectPayload;\n}\n\n/**\n@description\nDetach all products in target socket of target attachParent actor.\n*/\nexport interface FDetachAllActorsCommand extends FCommandBase {\n command: MetaBoxCommand.FDetachAllActorsCommand;\n\n /**\n@description\nDetach all products in target socket of target attachParent actor.\n*/\n payload: FAttachmentPayload;\n}\n\n/**\n@description\nMove all attached products toward the target socket in the direction of the projection onto the axis of the vector from the bounding box center to the target socket.\n*/\nexport interface FMoveAttachedActorsInSocketCommand extends FCommandBase {\n command: MetaBoxCommand.FMoveAttachedActorsInSocketCommand;\n\n /**\n@description\nMove all attached products toward the target socket in the direction of the projection onto the axis of the vector from the bounding box center to the target socket.\n*/\n payload: FMoveAttachedActorsInSocketPayload;\n}\n\n/**\n@description\nEnable teleport\n*/\nexport interface FEnableTeleportCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableTeleportCommand;\n\n /**\n@description\nbool Value is enable teleport\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nSet Pawn Movement Mode\n*/\nexport interface FSetPawnMovementModeCommand extends FCommandBase {\n command: MetaBoxCommand.FSetPawnMovementModeCommand;\n\n /**\n@description\nPawn Movement Mode payload\n*/\n payload: FSetPawnMovementModePayload;\n}\n\n/**\n@description\nSnap axis\n*/\nexport interface FSnapAxisCommand extends FCommandBase {\n command: MetaBoxCommand.FSnapAxisCommand;\n}\n\n/**\n@description\nSnap product by click to cursor location.\n*/\nexport interface FClickSnapCommand extends FCommandBase {\n command: MetaBoxCommand.FClickSnapCommand;\n\n /**\n@description\nbool Value is clickSnap\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nChange user's pawn transform.\n*/\nexport interface FPawnTransformControlCommand extends FCommandBase {\n command: MetaBoxCommand.FPawnTransformControlCommand;\n\n /**\n@description\nControlPayload\n*/\n payload: FPawnTransformControlPayload;\n}\n\n/**\n@description\nFlyingProduct.\n*/\nexport interface FFlyingProductCommand extends FCommandBase {\n command: MetaBoxCommand.FFlyingProductCommand;\n\n /**\n@description\nEnable/disable flying product.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nEnable freeze frame.\n*/\nexport interface FFreezeFrameCommand extends FCommandBase {\n command: MetaBoxCommand.FFreezeFrameCommand;\n\n /**\n@description\nbool Value is freeze.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@deprecated\nUse {@link FControlSensitivityCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nMouse sensitivity.\n*/\nexport interface FMouseSensitivityCommand extends FCommandBase {\n command: MetaBoxCommand.FMouseSensitivityCommand;\n\n /**\n@description\nControl sensitivity payload.\n*/\n payload: FControlSensitivityPayload;\n}\n\n/**\n@description\nControl sensitivity.\n*/\nexport interface FControlSensitivityCommand extends FCommandBase {\n command: MetaBoxCommand.FControlSensitivityCommand;\n\n /**\n@description\nControl sensitivity payload.\n*/\n payload: FControlSensitivityPayload;\n}\n\n/**\n@description\nEnable composure.\n*/\nexport interface FEnableComposureCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableComposureCommand;\n\n /**\n@description\nbool Value will Enable or Disable composure\n*/\n payload: FComposurePayload;\n}\n\n/**\n@description\nEnable Cursor.\n*/\nexport interface FEnableCursorCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableCursorCommand;\n\n /**\n@description\nbool Value will Enable or Disable cursor\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nEnable user controls.\n*/\nexport interface FEnableControlsCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableControlsCommand;\n\n /**\n@description\nbool Value will Enable or Disable controls\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nEnable or disable product selection by cursor.\n*/\nexport interface FEnableSelectionByCursorCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableSelectionByCursorCommand;\n\n /**\n@description\nEnable or disable product selection by cursor.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nEnable or disable rotation by cursor.\n*/\nexport interface FEnableRotationByCursorCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableRotationByCursorCommand;\n\n /**\n@description\nEnable or disable rotation by cursor.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nEnable or disable zoom by cursor.\n*/\nexport interface FEnableZoomByCursorCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableZoomByCursorCommand;\n\n /**\n@description\nEnable or disable zoom by cursor.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nEnable or disable interact by cursor. Interaction with buttons, gizmo etc.\n*/\nexport interface FEnableInteractByCursorCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableInteractByCursorCommand;\n\n /**\n@description\nEnable or disable interact by cursor. Interaction with buttons, gizmo etc.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nEnable or disable pan by cursor.\n*/\nexport interface FEnablePanByCursorCommand extends FCommandBase {\n command: MetaBoxCommand.FEnablePanByCursorCommand;\n\n /**\n@description\nEnable or disable pan by cursor.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nEnable or disable pan by cursor.\n*/\nexport interface FEnableControlsByCursorCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableControlsByCursorCommand;\n\n /**\n@description\nEnable or disable pan by cursor.\n*/\n payload: FControlsByCursorPayload;\n}\n\n/**\n@description\nSet Pawn control camera mode.\n*/\nexport interface FSetControlCameraModeCommand extends FCommandBase {\n command: MetaBoxCommand.FSetControlCameraModeCommand;\n\n /**\n@description\nControl camera mode payload.\n*/\n payload: FControlCameraModePayload;\n}\n\n/**\n@description\nSet CameraHeight.\n*/\nexport interface FSetCameraHeightCommand extends FCommandBase {\n command: MetaBoxCommand.FSetCameraHeightCommand;\n\n /**\n@description\nValue is CameraHeight.\n*/\n payload: number;\n}\n\n/**\n@description\nAdd CameraHeight.\n*/\nexport interface FAddCameraHeightCommand extends FCommandBase {\n command: MetaBoxCommand.FAddCameraHeightCommand;\n\n /**\n@description\nValue is additional OffsetZ of camera height.\n*/\n payload: number;\n}\n\n/**\n@deprecated\nUse {@link FAddCameraHeightCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nAdd Camera Height.\n*/\nexport interface FMoveCameraCommand extends FCommandBase {\n command: MetaBoxCommand.FMoveCameraCommand;\n\n /**\n@description\nOnly Z is used.\n*/\n payload: FFVectorPayload;\n}\n\n/**\n@description\nCamera box.\n*/\nexport interface FCameraBoxCommand extends FCommandBase {\n command: MetaBoxCommand.FCameraBoxCommand;\n\n /**\n@description\nValue is CameraBox.\n*/\n payload: FFVectorPayload;\n}\n\n/**\n@deprecated\nUse {@link FClampPanToProductsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nClamp pan to product.\n*/\nexport interface FClampPanToProductCommand extends FCommandBase {\n command: MetaBoxCommand.FClampPanToProductCommand;\n\n /**\n@description\nClamp pan to product payload.\n@optional\n*/\n payload?: FFStringPayload;\n}\n\n/**\n@description\nClamp pan to products array.\n*/\nexport interface FClampPanToProductsCommand extends FCommandBase {\n command: MetaBoxCommand.FClampPanToProductsCommand;\n\n /**\n@description\nClamp pan to products array payload.\n@optional\n*/\n payload?: FFStringsPayload;\n}\n\n/**\n@description\nCamera Control Clamps.\n*/\nexport interface FSetCameraControlClampsCommand extends FCommandBase {\n command: MetaBoxCommand.FSetCameraControlClampsCommand;\n\n /**\n@description\nCamera Control Clamps payload.\n*/\n payload: FCameraClampsPayload;\n}\n\n/**\n@description\nCamera Control Reset Clamps.\n*/\nexport interface FResetControlClampsCommand extends FCommandBase {\n command: MetaBoxCommand.FResetControlClampsCommand;\n}\n\n/**\n@description\nCamera settings.\n*/\nexport interface FCameraSettingsCommand extends FCommandBase {\n command: MetaBoxCommand.FCameraSettingsCommand;\n\n /**\n@description\nCamera settings payload.\n*/\n payload: FCameraSettingsPayload;\n}\n\n/**\n@deprecated\nUse {@link FCameraSettingsCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nChange FOV.\n*/\nexport interface FChangeFovCommand extends FCommandBase {\n command: MetaBoxCommand.FChangeFovCommand;\n\n /**\n@description\nValue is FOV.\n*/\n payload: number;\n}\n\n/**\n@description\nApply camera preset with location and rotation.\n*/\nexport interface FApplyCameraPresetCommand extends FCommandBase {\n command: MetaBoxCommand.FApplyCameraPresetCommand;\n\n /**\n@description\nApply camera preset with location and rotation payload.\n*/\n payload: FCameraPresetPayload;\n}\n\n/**\n@description\nSet Camera location and rotation. It could be with timeline transition . It changes transform of Pawn and Camera, that is already in use, no new camera.\n*/\nexport interface FSetCameraTransformCommand extends FCommandBase {\n command: MetaBoxCommand.FSetCameraTransformCommand;\n\n /**\n@description\nSet Camera location and rotation. It could be with transition.\n*/\n payload: FCameraPresetPayload;\n}\n\n/**\n@description\nRequest camera preset. Catch the preset in callback.\n*/\nexport interface FRequestCameraPresetCommand extends FCommandBase {\n command: MetaBoxCommand.FRequestCameraPresetCommand;\n}\n\n/**\n@description\nReset camera\nTODO: Rename to FResetCamera\n*/\nexport interface FCameraRecenterCommand extends FCommandBase {\n command: MetaBoxCommand.FCameraRecenterCommand;\n}\n\n/**\n@description\nReset Zoom controls of camera\nTODO: Create FResetZoomPayload or ZoomDefaultPayload if needed.\n*/\nexport interface FResetZoomCommand extends FCommandBase {\n command: MetaBoxCommand.FResetZoomCommand;\n}\n\n/**\n@deprecated\nUse {@link FResetZoomCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nReset Zoom controls of camera.\n*/\nexport interface FResetMinZoomCommand extends FCommandBase {\n command: MetaBoxCommand.FResetMinZoomCommand;\n}\n\n/**\n@description\nApply zoom.\n*/\nexport interface FApplyZoomCommand extends FCommandBase {\n command: MetaBoxCommand.FApplyZoomCommand;\n\n /**\n@description\nApply zoom payload.\n*/\n payload: FApplyZoomPayload;\n}\n\n/**\n@deprecated\nUse {@link FApplyZoomCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nApply zoom.\n*/\nexport interface FZoomCommand extends FCommandBase {\n command: MetaBoxCommand.FZoomCommand;\n\n /**\n@description\nApply zoom payload.\n*/\n payload: FApplyZoomPayload;\n}\n\n/**\n@description\nAdd panel light.\n*/\nexport interface FAddPanelLightCommand extends FCommandBase {\n command: MetaBoxCommand.FAddPanelLightCommand;\n\n /**\n@description\nAdd Panel light payload.\n*/\n payload: FPanelLightPayload;\n}\n\n/**\n@description\nUpdate panel light.\n*/\nexport interface FUpdatePanelLightCommand extends FCommandBase {\n command: MetaBoxCommand.FUpdatePanelLightCommand;\n\n /**\n@description\nPanel light payload.\n*/\n payload: FPanelLightPayload;\n}\n\n/**\n@description\nAdd rectangle light.\n*/\nexport interface FAddRectLightCommand extends FCommandBase {\n command: MetaBoxCommand.FAddRectLightCommand;\n\n /**\n@description\nAdd rectangle light payload.\n*/\n payload: FRectLightPayload;\n}\n\n/**\n@description\nUpdate rectangle light.\n*/\nexport interface FUpdateRectLightCommand extends FCommandBase {\n command: MetaBoxCommand.FUpdateRectLightCommand;\n\n /**\n@description\nRectangle light payload.\n*/\n payload: FRectLightPayload;\n}\n\n/**\n@description\nRemove light by object name.\n*/\nexport interface FRemoveLightCommand extends FCommandBase {\n command: MetaBoxCommand.FRemoveLightCommand;\n\n /**\n@description\nValue is objectName of the light.\n*/\n payload: FFStringPayload;\n}\n\n/**\n@description\nSet HDR.\n*/\nexport interface FSetHdrCommand extends FCommandBase {\n command: MetaBoxCommand.FSetHdrCommand;\n\n /**\n@description\nSet HDR payload.\n*/\n payload: FHdrPayload;\n}\n\n/**\n@description\nUpdate weather.\n*/\nexport interface FWeatherCommand extends FCommandBase {\n command: MetaBoxCommand.FWeatherCommand;\n\n /**\n@description\nWeather payload.\n*/\n payload: FWeatherPayload;\n}\n\n/**\n@deprecated\nUse {@link FWeatherCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nEnable UDS.\n*/\nexport interface FEnableUDSCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableUDSCommand;\n\n /**\n@description\nValue is Enable UDS.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@deprecated\nUse {@link FWeatherCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nTime UDS.\n*/\nexport interface FTimeUDSCommand extends FCommandBase {\n command: MetaBoxCommand.FTimeUDSCommand;\n\n /**\n@description\nValue is Time of day.\n*/\n payload: number;\n}\n\n/**\n@deprecated\nUse {@link FWeatherCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nSet sun orientation.\n*/\nexport interface FSetSunOrientationCommand extends FCommandBase {\n command: MetaBoxCommand.FSetSunOrientationCommand;\n\n /**\n@description\nSun orientation payload.\n*/\n payload: FSunOrientationPayload;\n}\n\n/**\n@description\nEnable light mode.\n*/\nexport interface FEnableLightModeCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableLightModeCommand;\n\n /**\n@description\nLight mode payload.\n*/\n payload: FLightModePayload;\n}\n\n/**\n@description\nSet settings of sequence.\n*/\nexport interface FSetSettingsSequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FSetSettingsSequenceCommand;\n\n /**\n@description\nSettings of sequence payload.\n*/\n payload: FSettingsSequencePayload;\n}\n\n/**\n@description\nLoad, init and set settings of sequence.\n*/\nexport interface FInitSequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FInitSequenceCommand;\n\n /**\n@description\nSettings and paks of sequence.\n*/\n payload: FInitSequencePayload;\n}\n\n/**\n@description\nLoad, init and set settings of sequence from Product's Pak. If payload hasn't objectName, Sequence would play from random product on scene.\n*/\nexport interface FInitSequenceByObjectNameCommand extends FCommandBase {\n command: MetaBoxCommand.FInitSequenceByObjectNameCommand;\n\n /**\n@description\nSettings and paks of sequence.\n*/\n payload: FInitSequenceByObjectNamePayload;\n}\n\n/**\n@description\nPlay sequence.\n*/\nexport interface FPlaySequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FPlaySequenceCommand;\n\n /**\n@description\nPlay settings.\n*/\n payload: FPlaySequencePayload;\n}\n\n/**\n@description\nJumpt to section of sequence by id.\n*/\nexport interface FJumpToSequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FJumpToSequenceCommand;\n\n /**\n@description\nJump section id payload.\n*/\n payload: FJumpToSequencePayload;\n}\n\n/**\n@description\nDrag on sequence by time.\n*/\nexport interface FDragSequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FDragSequenceCommand;\n\n /**\n@description\nDrag on sequence by time payload.\n*/\n payload: FDragSequencePayload;\n}\n\n/**\n@description\nPause sequence.\n*/\nexport interface FPauseSequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FPauseSequenceCommand;\n}\n\n/**\n@description\nStop sequence.\n*/\nexport interface FStopSequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FStopSequenceCommand;\n}\n\n/**\n@deprecated\nUse {@link FPlaySequenceCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nResume sequence.\n*/\nexport interface FResumeSequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FResumeSequenceCommand;\n\n /**\n@description\nPlay settings.\n*/\n payload: FPlaySequencePayload;\n}\n\n/**\n@deprecated\nUse {@link FInitSequenceCommand}, {@link FPlaySequenceCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nInit and play.\n*/\nexport interface FStartSequenceCommand extends FCommandBase {\n command: MetaBoxCommand.FStartSequenceCommand;\n\n /**\n@description\nUse Init sequence payload.\n*/\n payload: FInitSequencePayload;\n}\n\n/**\n@deprecated\nUse {@link FTakeRenderCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nTake screenshot.\n*/\nexport interface FTakeScreenshotCommand extends FCommandBase {\n command: MetaBoxCommand.FTakeScreenshotCommand;\n\n /**\n@description\nScreenshot payload.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@description\nTake render.\n*/\nexport interface FTakeRenderCommand extends FCommandBase {\n command: MetaBoxCommand.FTakeRenderCommand;\n\n /**\n@description\nRender payload.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@deprecated\nUse {@link FTakeLayeredRenderCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nTake layered screenshot.\n*/\nexport interface FTakeLayeredScreenshotCommand extends FCommandBase {\n command: MetaBoxCommand.FTakeLayeredScreenshotCommand;\n\n /**\n@description\nRender payload.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@description\nTake layered render.\n*/\nexport interface FTakeLayeredRenderCommand extends FCommandBase {\n command: MetaBoxCommand.FTakeLayeredRenderCommand;\n\n /**\n@description\nRender payload.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@deprecated\nUse {@link FTakeSpinnerRenderCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nTake 360 screenshot.\n*/\nexport interface FTake360ScreenshotCommand extends FCommandBase {\n command: MetaBoxCommand.FTake360ScreenshotCommand;\n\n /**\n@description\nRender payload.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@deprecated\nUse {@link FTakeSpinnerRenderCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nTake 360 render.\n*/\nexport interface FTake360RenderCommand extends FCommandBase {\n command: MetaBoxCommand.FTake360RenderCommand;\n\n /**\n@description\nRender payload.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@description\nTake spinner render.\n*/\nexport interface FTakeSpinnerRenderCommand extends FCommandBase {\n command: MetaBoxCommand.FTakeSpinnerRenderCommand;\n\n /**\n@description\nRender payload.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@deprecated\nUse {@link FTakeSpinnerRenderPreviewCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nTake 360 render preview.\n*/\nexport interface FTake360PreviewCommand extends FCommandBase {\n command: MetaBoxCommand.FTake360PreviewCommand;\n\n /**\n@description\nRender payload.Payload.Preview = True.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@description\nTake spinner render preview.\n*/\nexport interface FTakeSpinnerRenderPreviewCommand extends FCommandBase {\n command: MetaBoxCommand.FTakeSpinnerRenderPreviewCommand;\n\n /**\n@description\nRender payload.Payload.Preview = True.\n*/\n payload: FRenderPayload;\n}\n\n/**\n@deprecated\nUse {@link FEnableSpinnerModeCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nEnable 360.\n*/\nexport interface F360EnableCommand extends FCommandBase {\n command: MetaBoxCommand.F360EnableCommand;\n\n /**\n@description\nEnable 360 payload.\n*/\n payload: FSpinnerModePayload;\n}\n\n/**\n@deprecated\nUse {@link FEnableSpinnerModeCommand}\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nDisable 360.\n*/\nexport interface F360DisableCommand extends FCommandBase {\n command: MetaBoxCommand.F360DisableCommand;\n\n /**\n@description\nSpinner mode payload.\n*/\n payload: FSpinnerModePayload;\n}\n\n/**\n@description\nEnable or disable Spinner mode.\n*/\nexport interface FEnableSpinnerModeCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableSpinnerModeCommand;\n\n /**\n@description\nSpinner mode payload.\n*/\n payload: FSpinnerModePayload;\n}\n\n/**\n@description\n360 Vertical rotate.\n*/\nexport interface F360VerticalRotateCommand extends FCommandBase {\n command: MetaBoxCommand.F360VerticalRotateCommand;\n\n /**\n@description\nValue is angle.\n*/\n payload: number;\n}\n\n/**\n@description\nUndo.\n*/\nexport interface FUnDoCommand extends FCommandBase {\n command: MetaBoxCommand.FUnDoCommand;\n}\n\n/**\n@description\nRedo.\n*/\nexport interface FReDoCommand extends FCommandBase {\n command: MetaBoxCommand.FReDoCommand;\n}\n\n/**\n@description\nRequest scene state.\n*/\nexport interface FRequestSceneStateCommand extends FCommandBase {\n command: MetaBoxCommand.FRequestSceneStateCommand;\n\n /**\n@description\nRequest scene state payload.\n*/\n payload: FRequestSceneStatePayload;\n}\n\n/**\n@description\nEnable or disable scene state callback.\n*/\nexport interface FEnableSceneStateCallbackCommand extends FCommandBase {\n command: MetaBoxCommand.FEnableSceneStateCallbackCommand;\n\n /**\n@description\nEnable or disable scene state callback payload.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@deprecated\nUse {@link FRequestSceneStateCommand} \n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nSave scene state.\n*/\nexport interface FSaveSceneStateCommand extends FCommandBase {\n command: MetaBoxCommand.FSaveSceneStateCommand;\n}\n\n/**\n@description\nLoad scene state.\n*/\nexport interface FLoadSceneStateCommand extends FCommandBase {\n command: MetaBoxCommand.FLoadSceneStateCommand;\n\n /**\n@description\nLoad scene state payload.\n*/\n payload: FLoadSceneStatePayload;\n}\n\n/**\n@description\nStart undo&redo chain.\n*/\nexport interface FStartUndoRedoChainCommand extends FCommandBase {\n command: MetaBoxCommand.FStartUndoRedoChainCommand;\n}\n\n/**\n@description\nAdd undo&redo chain.\n*/\nexport interface FAddUndoRedoChainCommand extends FCommandBase {\n command: MetaBoxCommand.FAddUndoRedoChainCommand;\n\n /**\n@description\nAdd undo&redo chain payload.\n*/\n payload: FAddUndoRedoChainPayload;\n}\n\n/**\n@deprecated\nDon't need anymore.\n\nAll deprecated properties marked as optional. Use with care!\n\n@description\nApp init.\n*/\nexport interface FAppInitCommand extends FCommandBase {\n command: MetaBoxCommand.FAppInitCommand;\n\n /**\n@description\nApp init payload.\n*/\n payload: FAppInitPayload;\n}\n\n/**\n@description\nDebug mode.\n*/\nexport interface FDebugModeCommand extends FCommandBase {\n command: MetaBoxCommand.FDebugModeCommand;\n\n /**\n@description\nEnable/Disable Debug mode.\n*/\n payload: FBoolPayload;\n}\n\n/**\n@description\nChange resolution.\n*/\nexport interface FChangeResolutionCommand extends FCommandBase {\n command: MetaBoxCommand.FChangeResolutionCommand;\n\n /**\n@description\nResolution payload.\n*/\n payload: FResolutionPayload;\n}\n\n/**\n@description\nExecute console command.\n*/\nexport interface FExecuteConsoleCommandCommand extends FCommandBase {\n command: MetaBoxCommand.FExecuteConsoleCommandCommand;\n\n /**\n@description\nConsole command payload. Value is console command\n*/\n payload: FFStringPayload;\n}\n\n/**\n@description\nPing.\n*/\nexport interface FPingCommand extends FCommandBase {\n command: MetaBoxCommand.FPingCommand;\n}\n\n/**\n@description\nRestart compose command.\n*/\nexport interface FRestartComposeCommand extends FCommandBase {\n command: MetaBoxCommand.FRestartComposeCommand;\n}\n\n/**\n@description\nResetScene command.\n*/\nexport interface FResetSceneCommand extends FCommandBase {\n command: MetaBoxCommand.FResetSceneCommand;\n\n /**\n@description\nResetScene payload.\n*/\n payload: FResetScenePayload;\n}\n\n/**\n@description\nDatasmithToPak command.\n*/\nexport interface FDatasmithToPakCommand extends FCommandBase {\n command: MetaBoxCommand.FDatasmithToPakCommand;\n\n /**\n@description\nDatasmithToPak payload. Value is DatasmithPath\n*/\n payload: FFStringPayload;\n}\n\n/**\n@description\nMorphToPak command.\n*/\nexport interface FMorphToPakCommand extends FCommandBase {\n command: MetaBoxCommand.FMorphToPakCommand;\n\n /**\n@description\nMorphToPak payload.\n*/\n payload: FMorphToPakPayload;\n}\n\n/**\n@description\nLoopBack command. Used for check connection\n*/\nexport interface FLoopBackCommand extends FCommandBase {\n command: MetaBoxCommand.FLoopBackCommand;\n}\n\n/**\n@description\nTestCommand for FVector and FRotator\n*/\nexport interface FTestCommand extends FCommandBase {\n command: MetaBoxCommand.FTestCommand;\n\n /**\n@description\ntest payload.\n*/\n payload: FTestPayload;\n}\n\n/**\n@description\nError codes\n*/\nexport interface FErrorCodes {\n /**\n@description\nUnknown error\nDefault value: 0\n*/\n Unknown: number;\n\n /**\n@description\nThe requested file could not be found\nDefault value: 404\n*/\n NotFound: number;\n}\n\nexport enum MetaBoxCommand {\n /**\n@deprecated\nNo need\n*/\n FLoadPaksInMemoryCommand = 'loadPaksInMemory',\n FSetDlssModeCommand = 'setDlssMode',\n FLoadProductCommand = 'loadProduct',\n\n /**\n@deprecated\nUse {@link FLoadProductCommand} \n*/\n FSelectProductCommand = 'selectProduct',\n\n /**\n@deprecated\nUse {@link FUnLoadProductByObjectNameCommand}\n*/\n FUnLoadProductCommand = 'unLoadProduct',\n\n /**\n@deprecated\nUse {@link FUnLoadProductCommand}\n*/\n FRemoveProductCommand = 'removeProduct',\n FUnLoadProductByObjectNameCommand = 'unLoadProductByObjectName',\n\n /**\n@deprecated\nUse {@link FUnLoadProductByObjectNameCommand}\n*/\n FRemoveProductInSceneCommand = 'removeProductInScene',\n FUnLoadAllProductsCommand = 'unLoadAllProducts',\n\n /**\n@deprecated\nUse {@link FUnLoadAllProductsCommand}\n*/\n FRemoveAllProductsCommand = 'removeAllProducts',\n FSetFlyingMeshCommand = 'setFlyingMesh',\n FLoadLevelCommand = 'loadLevel',\n FUnLoadLevelCommand = 'unLoadLevel',\n\n /**\n@deprecated\nUse {@link FUnLoadLevelCommand}\n*/\n FHideLevelCommand = 'hideLevel',\n FUnLoadAllLevelsCommand = 'unLoadAllLevels',\n\n /**\n@deprecated\nUse {@link FUnLoadAllLevelsCommand}\n*/\n FHideAllLevelsCommand = 'hideAllLevels',\n FSetMaterialCommand = 'setMaterial',\n FSetFlyingMaterialCommand = 'setFlyingMaterial',\n FPlayAnimationCommand = 'playAnimation',\n FLoadButtonCommand = 'loadButton',\n FUnLoadButtonByObjectNameCommand = 'unLoadButtonByObjectName',\n FUnLoadAllButtonsCommand = 'unLoadAllButtons',\n FSetButtonScaleCommand = 'setButtonScale',\n FRequestUnwrapImageCommand = 'requestUnwrapImage',\n FLoadMeasureCommand = 'loadMeasure',\n FUnLoadMeasureByObjectNameCommand = 'unLoadMeasureByObjectName',\n FUnLoadAllMeasuresCommand = 'unLoadAllMeasures',\n FGetAssetsInPakCommand = 'getAssetsInPak',\n FChangeGizmoTypeCommand = 'changeGizmoType',\n FSetSelectionSettingsCommand = 'setSelectionSettings',\n FDragCommand = 'drag',\n FDropCommand = 'drop',\n\n /**\n@deprecated\nUse {@link FFitToObjectsCommand}\n*/\n FFitCommand = 'fit',\n FFitToObjectsCommand = 'fitToObjects',\n FFitToObjectsByBSphereCommand = 'fitToObjectsByBSphere',\n FFitToObjectsByBBoxCommand = 'fitToObjectsByBBox',\n\n /**\n@deprecated\nUse {@link FSelectProductByObjectNameCommand}\n*/\n FSelectProductInSceneCommand = 'selectProductInScene',\n FSelectProductByObjectNameCommand = 'selectProductByObjectName',\n FUnselectAllProductsCommand = 'unselectAllProducts',\n FMoveSelectedCommand = 'moveSelected',\n FMoveProductByObjectNameCommand = 'moveProductByObjectName',\n FSetProductsLocationCommand = 'setProductsLocation',\n FAlignProductsToPlaneCommand = 'alignProductsToPlane',\n FRotateSelectedCommand = 'rotateSelected',\n FRotateObjectNameCommand = 'rotateObjectName',\n FRotateActorByTagCommand = 'rotateActorByTag',\n\n /**\n@deprecated\nUse {@link FUnloadSelectedProductCommand}\n*/\n FRemoveFocusedCommand = 'removeFocused',\n FUnloadSelectedProductCommand = 'unloadSelectedProduct',\n FAttachActorCommand = 'attachActor',\n FDetachActorCommand = 'detachActor',\n FDetachAllActorsCommand = 'detachAllActors',\n FMoveAttachedActorsInSocketCommand = 'moveAttachedActorsInSocket',\n FEnableTeleportCommand = 'enableTeleport',\n FSetPawnMovementModeCommand = 'setPawnMovementMode',\n FSnapAxisCommand = 'snapAxis',\n FClickSnapCommand = 'clickSnap',\n FPawnTransformControlCommand = 'pawnTransformControl',\n FFlyingProductCommand = 'flyingProduct',\n FFreezeFrameCommand = 'freezeFrame',\n\n /**\n@deprecated\nUse {@link FControlSensitivityCommand}\n*/\n FMouseSensitivityCommand = 'mouseSensitivity',\n FControlSensitivityCommand = 'controlSensitivity',\n FEnableComposureCommand = 'enableComposure',\n FEnableCursorCommand = 'enableCursor',\n FEnableControlsCommand = 'enableControls',\n FEnableSelectionByCursorCommand = 'enableSelectionByCursor',\n FEnableRotationByCursorCommand = 'enableRotationByCursor',\n FEnableZoomByCursorCommand = 'enableZoomByCursor',\n FEnableInteractByCursorCommand = 'enableInteractByCursor',\n FEnablePanByCursorCommand = 'enablePanByCursor',\n FEnableControlsByCursorCommand = 'enableControlsByCursor',\n FSetControlCameraModeCommand = 'setControlCameraMode',\n FSetCameraHeightCommand = 'setCameraHeight',\n FAddCameraHeightCommand = 'addCameraHeight',\n\n /**\n@deprecated\nUse {@link FAddCameraHeightCommand}\n*/\n FMoveCameraCommand = 'moveCamera',\n FCameraBoxCommand = 'cameraBox',\n\n /**\n@deprecated\nUse {@link FClampPanToProductsCommand}\n*/\n FClampPanToProductCommand = 'clampPanToProduct',\n FClampPanToProductsCommand = 'clampPanToProducts',\n FSetCameraControlClampsCommand = 'setCameraControlClamps',\n FResetControlClampsCommand = 'resetControlClamps',\n FCameraSettingsCommand = 'cameraSettings',\n\n /**\n@deprecated\nUse {@link FCameraSettingsCommand}\n*/\n FChangeFovCommand = 'changeFov',\n FApplyCameraPresetCommand = 'applyCameraPreset',\n FSetCameraTransformCommand = 'setCameraTransform',\n FRequestCameraPresetCommand = 'requestCameraPreset',\n FCameraRecenterCommand = 'cameraRecenter',\n FResetZoomCommand = 'resetZoom',\n\n /**\n@deprecated\nUse {@link FResetZoomCommand}\n*/\n FResetMinZoomCommand = 'resetMinZoom',\n FApplyZoomCommand = 'applyZoom',\n\n /**\n@deprecated\nUse {@link FApplyZoomCommand}\n*/\n FZoomCommand = 'zoom',\n FAddPanelLightCommand = 'addPanelLight',\n FUpdatePanelLightCommand = 'updatePanelLight',\n FAddRectLightCommand = 'addRectLight',\n FUpdateRectLightCommand = 'updateRectLight',\n FRemoveLightCommand = 'removeLight',\n FSetHdrCommand = 'setHdr',\n FWeatherCommand = 'weather',\n\n /**\n@deprecated\nUse {@link FWeatherCommand}\n*/\n FEnableUDSCommand = 'enableUDS',\n\n /**\n@deprecated\nUse {@link FWeatherCommand}\n*/\n FTimeUDSCommand = 'timeUDS',\n\n /**\n@deprecated\nUse {@link FWeatherCommand}\n*/\n FSetSunOrientationCommand = 'setSunOrientation',\n FEnableLightModeCommand = 'enableLightMode',\n FSetSettingsSequenceCommand = 'setSettingsSequence',\n FInitSequenceCommand = 'initSequence',\n FInitSequenceByObjectNameCommand = 'initSequenceByObjectName',\n FPlaySequenceCommand = 'playSequence',\n FJumpToSequenceCommand = 'jumpToSequence',\n FDragSequenceCommand = 'dragSequence',\n FPauseSequenceCommand = 'pauseSequence',\n FStopSequenceCommand = 'stopSequence',\n\n /**\n@deprecated\nUse {@link FPlaySequenceCommand}\n*/\n FResumeSequenceCommand = 'resumeSequence',\n\n /**\n@deprecated\nUse {@link FInitSequenceCommand}, {@link FPlaySequenceCommand}\n*/\n FStartSequenceCommand = 'startSequence',\n\n /**\n@deprecated\nUse {@link FTakeRenderCommand}\n*/\n FTakeScreenshotCommand = 'takeScreenshot',\n FTakeRenderCommand = 'takeRender',\n\n /**\n@deprecated\nUse {@link FTakeLayeredRenderCommand}\n*/\n FTakeLayeredScreenshotCommand = 'takeLayeredScreenshot',\n FTakeLayeredRenderCommand = 'takeLayeredRender',\n\n /**\n@deprecated\nUse {@link FTakeSpinnerRenderCommand}\n*/\n FTake360ScreenshotCommand = 'take360Screenshot',\n\n /**\n@deprecated\nUse {@link FTakeSpinnerRenderCommand}\n*/\n FTake360RenderCommand = 'take360Render',\n FTakeSpinnerRenderCommand = 'takeSpinnerRender',\n\n /**\n@deprecated\nUse {@link FTakeSpinnerRenderPreviewCommand}\n*/\n FTake360PreviewCommand = 'take360Preview',\n FTakeSpinnerRenderPreviewCommand = 'takeSpinnerRenderPreview',\n\n /**\n@deprecated\nUse {@link FEnableSpinnerModeCommand}\n*/\n F360EnableCommand = '360Enable',\n\n /**\n@deprecated\nUse {@link FEnableSpinnerModeCommand}\n*/\n F360DisableCommand = '360Disable',\n FEnableSpinnerModeCommand = 'enableSpinnerMode',\n F360VerticalRotateCommand = '360VerticalRotate',\n FUnDoCommand = 'unDo',\n FReDoCommand = 'reDo',\n FRequestSceneStateCommand = 'requestSceneState',\n FEnableSceneStateCallbackCommand = 'enableSceneStateCallback',\n\n /**\n@deprecated\nUse {@link FRequestSceneStateCommand} \n*/\n FSaveSceneStateCommand = 'saveSceneState',\n FLoadSceneStateCommand = 'loadSceneState',\n FStartUndoRedoChainCommand = 'startUndoRedoChain',\n FAddUndoRedoChainCommand = 'addUndoRedoChain',\n\n /**\n@deprecated\nDon't need anymore.\n*/\n FAppInitCommand = 'appInit',\n FDebugModeCommand = 'debugMode',\n FChangeResolutionCommand = 'changeResolution',\n FExecuteConsoleCommandCommand = 'executeConsoleCommand',\n FPingCommand = 'ping',\n FRestartComposeCommand = 'restartCompose',\n FResetSceneCommand = 'resetScene',\n FDatasmithToPakCommand = 'datasmithToPak',\n FMorphToPakCommand = 'morphToPak',\n FLoopBackCommand = 'loopBack',\n FTestCommand = 'test',\n}\nexport interface MetaBoxCommandList {\n [MetaBoxCommand.FLoadPaksInMemoryCommand]: FLoadPaksInMemoryCommand;\n [MetaBoxCommand.FSetDlssModeCommand]: FSetDlssModeCommand;\n [MetaBoxCommand.FLoadProductCommand]: FLoadProductCommand;\n [MetaBoxCommand.FSelectProductCommand]: FSelectProductCommand;\n [MetaBoxCommand.FUnLoadProductCommand]: FUnLoadProductCommand;\n [MetaBoxCommand.FRemoveProductCommand]: FRemoveProductCommand;\n [MetaBoxCommand.FUnLoadProductByObjectNameCommand]: FUnLoadProductByObjectNameCommand;\n [MetaBoxCommand.FRemoveProductInSceneCommand]: FRemoveProductInSceneCommand;\n [MetaBoxCommand.FUnLoadAllProductsCommand]: FUnLoadAllProductsCommand;\n [MetaBoxCommand.FRemoveAllProductsCommand]: FRemoveAllProductsCommand;\n [MetaBoxCommand.FSetFlyingMeshCommand]: FSetFlyingMeshCommand;\n [MetaBoxCommand.FLoadLevelCommand]: FLoadLevelCommand;\n [MetaBoxCommand.FUnLoadLevelCommand]: FUnLoadLevelCommand;\n [MetaBoxCommand.FHideLevelCommand]: FHideLevelCommand;\n [MetaBoxCommand.FUnLoadAllLevelsCommand]: FUnLoadAllLevelsCommand;\n [MetaBoxCommand.FHideAllLevelsCommand]: FHideAllLevelsCommand;\n [MetaBoxCommand.FSetMaterialCommand]: FSetMaterialCommand;\n [MetaBoxCommand.FSetFlyingMaterialCommand]: FSetFlyingMaterialCommand;\n [MetaBoxCommand.FPlayAnimationCommand]: FPlayAnimationCommand;\n [MetaBoxCommand.FLoadButtonCommand]: FLoadButtonCommand;\n [MetaBoxCommand.FUnLoadButtonByObjectNameCommand]: FUnLoadButtonByObjectNameCommand;\n [MetaBoxCommand.FUnLoadAllButtonsCommand]: FUnLoadAllButtonsCommand;\n [MetaBoxCommand.FSetButtonScaleCommand]: FSetButtonScaleCommand;\n [MetaBoxCommand.FRequestUnwrapImageCommand]: FRequestUnwrapImageCommand;\n [MetaBoxCommand.FLoadMeasureCommand]: FLoadMeasureCommand;\n [MetaBoxCommand.FUnLoadMeasureByObjectNameCommand]: FUnLoadMeasureByObjectNameCommand;\n [MetaBoxCommand.FUnLoadAllMeasuresCommand]: FUnLoadAllMeasuresCommand;\n [MetaBoxCommand.FGetAssetsInPakCommand]: FGetAssetsInPakCommand;\n [MetaBoxCommand.FChangeGizmoTypeCommand]: FChangeGizmoTypeCommand;\n [MetaBoxCommand.FSetSelectionSettingsCommand]: FSetSelectionSettingsCommand;\n [MetaBoxCommand.FDragCommand]: FDragCommand;\n [MetaBoxCommand.FDropCommand]: FDropCommand;\n [MetaBoxCommand.FFitCommand]: FFitCommand;\n [MetaBoxCommand.FFitToObjectsCommand]: FFitToObjectsCommand;\n [MetaBoxCommand.FFitToObjectsByBSphereCommand]: FFitToObjectsByBSphereCommand;\n [MetaBoxCommand.FFitToObjectsByBBoxCommand]: FFitToObjectsByBBoxCommand;\n [MetaBoxCommand.FSelectProductInSceneCommand]: FSelectProductInSceneCommand;\n [MetaBoxCommand.FSelectProductByObjectNameCommand]: FSelectProductByObjectNameCommand;\n [MetaBoxCommand.FUnselectAllProductsCommand]: FUnselectAllProductsCommand;\n [MetaBoxCommand.FMoveSelectedCommand]: FMoveSelectedCommand;\n [MetaBoxCommand.FMoveProductByObjectNameCommand]: FMoveProductByObjectNameCommand;\n [MetaBoxCommand.FSetProductsLocationCommand]: FSetProductsLocationCommand;\n [MetaBoxCommand.FAlignProductsToPlaneCommand]: FAlignProductsToPlaneCommand;\n [MetaBoxCommand.FRotateSelectedCommand]: FRotateSelectedCommand;\n [MetaBoxCommand.FRotateObjectNameCommand]: FRotateObjectNameCommand;\n [MetaBoxCommand.FRotateActorByTagCommand]: FRotateActorByTagCommand;\n [MetaBoxCommand.FRemoveFocusedCommand]: FRemoveFocusedCommand;\n [MetaBoxCommand.FUnloadSelectedProductCommand]: FUnloadSelectedProductCommand;\n [MetaBoxCommand.FAttachActorCommand]: FAttachActorCommand;\n [MetaBoxCommand.FDetachActorCommand]: FDetachActorCommand;\n [MetaBoxCommand.FDetachAllActorsCommand]: FDetachAllActorsCommand;\n [MetaBoxCommand.FMoveAttachedActorsInSocketCommand]: FMoveAttachedActorsInSocketCommand;\n [MetaBoxCommand.FEnableTeleportCommand]: FEnableTeleportCommand;\n [MetaBoxCommand.FSetPawnMovementModeCommand]: FSetPawnMovementModeCommand;\n [MetaBoxCommand.FSnapAxisCommand]: FSnapAxisCommand;\n [MetaBoxCommand.FClickSnapCommand]: FClickSnapCommand;\n [MetaBoxCommand.FPawnTransformControlCommand]: FPawnTransformControlCommand;\n [MetaBoxCommand.FFlyingProductCommand]: FFlyingProductCommand;\n [MetaBoxCommand.FFreezeFrameCommand]: FFreezeFrameCommand;\n [MetaBoxCommand.FMouseSensitivityCommand]: FMouseSensitivityCommand;\n [MetaBoxCommand.FControlSensitivityCommand]: FControlSensitivityCommand;\n [MetaBoxCommand.FEnableComposureCommand]: FEnableComposureCommand;\n [MetaBoxCommand.FEnableCursorCommand]: FEnableCursorCommand;\n [MetaBoxCommand.FEnableControlsCommand]: FEnableControlsCommand;\n [MetaBoxCommand.FEnableSelectionByCursorCommand]: FEnableSelectionByCursorCommand;\n [MetaBoxCommand.FEnableRotationByCursorCommand]: FEnableRotationByCursorCommand;\n [MetaBoxCommand.FEnableZoomByCursorCommand]: FEnableZoomByCursorCommand;\n [MetaBoxCommand.FEnableInteractByCursorCommand]: FEnableInteractByCursorCommand;\n [MetaBoxCommand.FEnablePanByCursorCommand]: FEnablePanByCursorCommand;\n [MetaBoxCommand.FEnableControlsByCursorCommand]: FEnableControlsByCursorCommand;\n [MetaBoxCommand.FSetControlCameraModeCommand]: FSetControlCameraModeCommand;\n [MetaBoxCommand.FSetCameraHeightCommand]: FSetCameraHeightCommand;\n [MetaBoxCommand.FAddCameraHeightCommand]: FAddCameraHeightCommand;\n [MetaBoxCommand.FMoveCameraCommand]: FMoveCameraCommand;\n [MetaBoxCommand.FCameraBoxCommand]: FCameraBoxCommand;\n [MetaBoxCommand.FClampPanToProductCommand]: FClampPanToProductCommand;\n [MetaBoxCommand.FClampPanToProductsCommand]: FClampPanToProductsCommand;\n [MetaBoxCommand.FSetCameraControlClampsCommand]: FSetCameraControlClampsCommand;\n [MetaBoxCommand.FResetControlClampsCommand]: FResetControlClampsCommand;\n [MetaBoxCommand.FCameraSettingsCommand]: FCameraSettingsCommand;\n [MetaBoxCommand.FChangeFovCommand]: FChangeFovCommand;\n [MetaBoxCommand.FApplyCameraPresetCommand]: FApplyCameraPresetCommand;\n [MetaBoxCommand.FSetCameraTransformCommand]: FSetCameraTransformCommand;\n [MetaBoxCommand.FRequestCameraPresetCommand]: FRequestCameraPresetCommand;\n [MetaBoxCommand.FCameraRecenterCommand]: FCameraRecenterCommand;\n [MetaBoxCommand.FResetZoomCommand]: FResetZoomCommand;\n [MetaBoxCommand.FResetMinZoomCommand]: FResetMinZoomCommand;\n [MetaBoxCommand.FApplyZoomCommand]: FApplyZoomCommand;\n [MetaBoxCommand.FZoomCommand]: FZoomCommand;\n [MetaBoxCommand.FAddPanelLightCommand]: FAddPanelLightCommand;\n [MetaBoxCommand.FUpdatePanelLightCommand]: FUpdatePanelLightCommand;\n [MetaBoxCommand.FAddRectLightCommand]: FAddRectLightCommand;\n [MetaBoxCommand.FUpdateRectLightCommand]: FUpdateRectLightCommand;\n [MetaBoxCommand.FRemoveLightCommand]: FRemoveLightCommand;\n [MetaBoxCommand.FSetHdrCommand]: FSetHdrCommand;\n [MetaBoxCommand.FWeatherCommand]: FWeatherCommand;\n [MetaBoxCommand.FEnableUDSCommand]: FEnableUDSCommand;\n [MetaBoxCommand.FTimeUDSCommand]: FTimeUDSCommand;\n [MetaBoxCommand.FSetSunOrientationCommand]: FSetSunOrientationCommand;\n [MetaBoxCommand.FEnableLightModeCommand]: FEnableLightModeCommand;\n [MetaBoxCommand.FSetSettingsSequenceCommand]: FSetSettingsSequenceCommand;\n [MetaBoxCommand.FInitSequenceCommand]: FInitSequenceCommand;\n [MetaBoxCommand.FInitSequenceByObjectNameCommand]: FInitSequenceByObjectNameCommand;\n [MetaBoxCommand.FPlaySequenceCommand]: FPlaySequenceCommand;\n [MetaBoxCommand.FJumpToSequenceCommand]: FJumpToSequenceCommand;\n [MetaBoxCommand.FDragSequenceCommand]: FDragSequenceCommand;\n [MetaBoxCommand.FPauseSequenceCommand]: FPauseSequenceCommand;\n [MetaBoxCommand.FStopSequenceCommand]: FStopSequenceCommand;\n [MetaBoxCommand.FResumeSequenceCommand]: FResumeSequenceCommand;\n [MetaBoxCommand.FStartSequenceCommand]: FStartSequenceCommand;\n [MetaBoxCommand.FTakeScreenshotCommand]: FTakeScreenshotCommand;\n [MetaBoxCommand.FTakeRenderCommand]: FTakeRenderCommand;\n [MetaBoxCommand.FTakeLayeredScreenshotCommand]: FTakeLayeredScreenshotCommand;\n [MetaBoxCommand.FTakeLayeredRenderCommand]: FTakeLayeredRenderCommand;\n [MetaBoxCommand.FTake360ScreenshotCommand]: FTake360ScreenshotCommand;\n [MetaBoxCommand.FTake360RenderCommand]: FTake360RenderCommand;\n [MetaBoxCommand.FTakeSpinnerRenderCommand]: FTakeSpinnerRenderCommand;\n [MetaBoxCommand.FTake360PreviewCommand]: FTake360PreviewCommand;\n [MetaBoxCommand.FTakeSpinnerRenderPreviewCommand]: FTakeSpinnerRenderPreviewCommand;\n [MetaBoxCommand.F360EnableCommand]: F360EnableCommand;\n [MetaBoxCommand.F360DisableCommand]: F360DisableCommand;\n [MetaBoxCommand.FEnableSpinnerModeCommand]: FEnableSpinnerModeCommand;\n [MetaBoxCommand.F360VerticalRotateCommand]: F360VerticalRotateCommand;\n [MetaBoxCommand.FUnDoCommand]: FUnDoCommand;\n [MetaBoxCommand.FReDoCommand]: FReDoCommand;\n [MetaBoxCommand.FRequestSceneStateCommand]: FRequestSceneStateCommand;\n [MetaBoxCommand.FEnableSceneStateCallbackCommand]: FEnableSceneStateCallbackCommand;\n [MetaBoxCommand.FSaveSceneStateCommand]: FSaveSceneStateCommand;\n [MetaBoxCommand.FLoadSceneStateCommand]: FLoadSceneStateCommand;\n [MetaBoxCommand.FStartUndoRedoChainCommand]: FStartUndoRedoChainCommand;\n [MetaBoxCommand.FAddUndoRedoChainCommand]: FAddUndoRedoChainCommand;\n [MetaBoxCommand.FAppInitCommand]: FAppInitCommand;\n [MetaBoxCommand.FDebugModeCommand]: FDebugModeCommand;\n [MetaBoxCommand.FChangeResolutionCommand]: FChangeResolutionCommand;\n [MetaBoxCommand.FExecuteConsoleCommandCommand]: FExecuteConsoleCommandCommand;\n [MetaBoxCommand.FPingCommand]: FPingCommand;\n [MetaBoxCommand.FRestartComposeCommand]: FRestartComposeCommand;\n [MetaBoxCommand.FResetSceneCommand]: FResetSceneCommand;\n [MetaBoxCommand.FDatasmithToPakCommand]: FDatasmithToPakCommand;\n [MetaBoxCommand.FMorphToPakCommand]: FMorphToPakCommand;\n [MetaBoxCommand.FLoopBackCommand]: FLoopBackCommand;\n [MetaBoxCommand.FTestCommand]: FTestCommand;\n}\n\n/**\n * List of deprecated commands.\n */\nexport const DeprecatedCommands = [\n MetaBoxCommand.FLoadPaksInMemoryCommand,\n MetaBoxCommand.FSelectProductCommand,\n MetaBoxCommand.FUnLoadProductCommand,\n MetaBoxCommand.FRemoveProductCommand,\n MetaBoxCommand.FRemoveProductInSceneCommand,\n MetaBoxCommand.FRemoveAllProductsCommand,\n MetaBoxCommand.FHideLevelCommand,\n MetaBoxCommand.FHideAllLevelsCommand,\n MetaBoxCommand.FFitCommand,\n MetaBoxCommand.FSelectProductInSceneCommand,\n MetaBoxCommand.FRemoveFocusedCommand,\n MetaBoxCommand.FMouseSensitivityCommand,\n MetaBoxCommand.FMoveCameraCommand,\n MetaBoxCommand.FClampPanToProductCommand,\n MetaBoxCommand.FChangeFovCommand,\n MetaBoxCommand.FResetMinZoomCommand,\n MetaBoxCommand.FZoomCommand,\n MetaBoxCommand.FEnableUDSCommand,\n MetaBoxCommand.FTimeUDSCommand,\n MetaBoxCommand.FSetSunOrientationCommand,\n MetaBoxCommand.FResumeSequenceCommand,\n MetaBoxCommand.FStartSequenceCommand,\n MetaBoxCommand.FTakeScreenshotCommand,\n MetaBoxCommand.FTakeLayeredScreenshotCommand,\n MetaBoxCommand.FTake360ScreenshotCommand,\n MetaBoxCommand.FTake360RenderCommand,\n MetaBoxCommand.FTake360PreviewCommand,\n MetaBoxCommand.F360EnableCommand,\n MetaBoxCommand.F360DisableCommand,\n MetaBoxCommand.FSaveSceneStateCommand,\n MetaBoxCommand.FAppInitCommand,\n];\n\n/**\n * Used for track commands RTT.\n */\nexport type TelemetryData = { trackingId?: string };\n\n/**\n * 'UnrealCommands' is a TypeScript type that represents a command to be sent to Unreal.\n *\n * @example\n * export class TestService {\n * constructor() {\n *\n * // Example of sending a command to Unreal\n * const command: UnrealCommands = {\n * command: MetaBoxCommand.F360EnableCommand,\n * payload: {\n * value: true,\n * armLength: 0,\n * },\n * };\n * this.sendCommandToUnreal(command);\n *\n * sendCommandToUnreal(data: MetaBoxCommandPacket): void {\n * console.log(data);\n * }\n * }\n *\n * @remarks\n * This type is used to ensure type safety when creating Unreal commands.\n * It ensures that the command and its associated payload match the definitions in MetaBoxCommandList.\n * @see\n * {@link MetaBoxCommandList}\n */\nexport type UnrealCommands =\n | FLoadPaksInMemoryCommand\n | FSetDlssModeCommand\n | FLoadProductCommand\n | FSelectProductCommand\n | FUnLoadProductCommand\n | FRemoveProductCommand\n | FUnLoadProductByObjectNameCommand\n | FRemoveProductInSceneCommand\n | FUnLoadAllProductsCommand\n | FRemoveAllProductsCommand\n | FSetFlyingMeshCommand\n | FLoadLevelCommand\n | FUnLoadLevelCommand\n | FHideLevelCommand\n | FUnLoadAllLevelsCommand\n | FHideAllLevelsCommand\n | FSetMaterialCommand\n | FSetFlyingMaterialCommand\n | FPlayAnimationCommand\n | FLoadButtonCommand\n | FUnLoadButtonByObjectNameCommand\n | FUnLoadAllButtonsCommand\n | FSetButtonScaleCommand\n | FRequestUnwrapImageCommand\n | FLoadMeasureCommand\n | FUnLoadMeasureByObjectNameCommand\n | FUnLoadAllMeasuresCommand\n | FGetAssetsInPakCommand\n | FChangeGizmoTypeCommand\n | FSetSelectionSettingsCommand\n | FDragCommand\n | FDropCommand\n | FFitCommand\n | FFitToObjectsCommand\n | FFitToObjectsByBSphereCommand\n | FFitToObjectsByBBoxCommand\n | FSelectProductInSceneCommand\n | FSelectProductByObjectNameCommand\n | FUnselectAllProductsCommand\n | FMoveSelectedCommand\n | FMoveProductByObjectNameCommand\n | FSetProductsLocationCommand\n | FAlignProductsToPlaneCommand\n | FRotateSelectedCommand\n | FRotateObjectNameCommand\n | FRotateActorByTagCommand\n | FRemoveFocusedCommand\n | FUnloadSelectedProductCommand\n | FAttachActorCommand\n | FDetachActorCommand\n | FDetachAllActorsCommand\n | FMoveAttachedActorsInSocketCommand\n | FEnableTeleportCommand\n | FSetPawnMovementModeCommand\n | FSnapAxisCommand\n | FClickSnapCommand\n | FPawnTransformControlCommand\n | FFlyingProductCommand\n | FFreezeFrameCommand\n | FMouseSensitivityCommand\n | FControlSensitivityCommand\n | FEnableComposureCommand\n | FEnableCursorCommand\n | FEnableControlsCommand\n | FEnableSelectionByCursorCommand\n | FEnableRotationByCursorCommand\n | FEnableZoomByCursorCommand\n | FEnableInteractByCursorCommand\n | FEnablePanByCursorCommand\n | FEnableControlsByCursorCommand\n | FSetControlCameraModeCommand\n | FSetCameraHeightCommand\n | FAddCameraHeightCommand\n | FMoveCameraCommand\n | FCameraBoxCommand\n | FClampPanToProductCommand\n | FClampPanToProductsCommand\n | FSetCameraControlClampsCommand\n | FResetControlClampsCommand\n | FCameraSettingsCommand\n | FChangeFovCommand\n | FApplyCameraPresetCommand\n | FSetCameraTransformCommand\n | FRequestCameraPresetCommand\n | FCameraRecenterCommand\n | FResetZoomCommand\n | FResetMinZoomCommand\n | FApplyZoomCommand\n | FZoomCommand\n | FAddPanelLightCommand\n | FUpdatePanelLightCommand\n | FAddRectLightCommand\n | FUpdateRectLightCommand\n | FRemoveLightCommand\n | FSetHdrCommand\n | FWeatherCommand\n | FEnableUDSCommand\n | FTimeUDSCommand\n | FSetSunOrientationCommand\n | FEnableLightModeCommand\n | FSetSettingsSequenceCommand\n | FInitSequenceCommand\n | FInitSequenceByObjectNameCommand\n | FPlaySequenceCommand\n | FJumpToSequenceCommand\n | FDragSequenceCommand\n | FPauseSequenceCommand\n | FStopSequenceCommand\n | FResumeSequenceCommand\n | FStartSequenceCommand\n | FTakeScreenshotCommand\n | FTakeRenderCommand\n | FTakeLayeredScreenshotCommand\n | FTakeLayeredRenderCommand\n | FTake360ScreenshotCommand\n | FTake360RenderCommand\n | FTakeSpinnerRenderCommand\n | FTake360PreviewCommand\n | FTakeSpinnerRenderPreviewCommand\n | F360EnableCommand\n | F360DisableCommand\n | FEnableSpinnerModeCommand\n | F360VerticalRotateCommand\n | FUnDoCommand\n | FReDoCommand\n | FRequestSceneStateCommand\n | FEnableSceneStateCallbackCommand\n | FSaveSceneStateCommand\n | FLoadSceneStateCommand\n | FStartUndoRedoChainCommand\n | FAddUndoRedoChainCommand\n | FAppInitCommand\n | FDebugModeCommand\n | FChangeResolutionCommand\n | FExecuteConsoleCommandCommand\n | FPingCommand\n | FRestartComposeCommand\n | FResetSceneCommand\n | FDatasmithToPakCommand\n | FMorphToPakCommand\n | FLoopBackCommand\n | FTestCommand;\n\n/**\n * MetaBoxCommandPacket is a TypeScript type that represents an 'UnrealCommands'\n * command to be sent to Unreal with additional tracking properties.\n * Includes TelemetryData.\n *\n * @see\n * {@link TelemetryData}\n */\nexport type MetaBoxCommandPacket = UnrealCommands & TelemetryData;\n","import type {\n FAlignProductsToPlaneCommand,\n FAlignProductsToPlanePayload,\n FApplyCameraPresetCommand,\n FApplyZoomCommand,\n FApplyZoomPayload,\n FBoolPayload,\n FCameraBoxCommand,\n FCameraClampsPayload,\n FCameraPresetPayload,\n FCameraRecenterCommand,\n FCameraSettingsCommand,\n FCameraSettingsPayload,\n FChangeGizmoTypeCommand,\n FChangeResolutionCommand,\n FClampPanToProductsCommand,\n FClickSnapCommand,\n FComposurePayload,\n FControlCameraModePayload,\n FControlSensitivityCommand,\n FControlSensitivityPayload,\n FDebugModeCommand,\n FDragCommand,\n FDragSequenceCommand,\n FDragSequencePayload,\n FDropCommand,\n FDropPayload,\n FEnableComposureCommand,\n FEnableControlsCommand,\n FEnableSpinnerModeCommand,\n FEnableTeleportCommand,\n FExecuteConsoleCommandCommand,\n FFitToObjectsCommand,\n FFitToObjectsPayload,\n FFreezeFrameCommand,\n FFStringPayload,\n FFStringsPayload,\n FFVectorPayload,\n FGizmoTypePayload,\n FInitSequenceByObjectNameCommand,\n FInitSequenceByObjectNamePayload,\n FJumpToSequenceCommand,\n FJumpToSequencePayload,\n FLevelPayload,\n FLoadLevelCommand,\n FLoadProductCommand,\n FLoadSceneStateCommand,\n FLoadSceneStatePayload,\n FLoopBackCommand,\n FMoveSelectedCommand,\n FMoveSelectedPayload,\n FPauseSequenceCommand,\n FPlaySequenceCommand,\n FPlaySequencePayload,\n FProductPayload,\n FRenderPayload,\n FRequestCameraPresetCommand,\n FResetControlClampsCommand,\n FResolutionPayload,\n FRotatePayload,\n FRotateSelectedCommand,\n FSelectProductByObjectNameCommand,\n FSelectProductByObjectNamePayload,\n FSetCameraControlClampsCommand,\n FSetControlCameraModeCommand,\n FSetMaterialCommand,\n FSetMaterialPayload,\n FSetPawnMovementModeCommand,\n FSetPawnMovementModePayload,\n FSetProductsLocationCommand,\n FSetProductsLocationPayload,\n FSetSettingsSequenceCommand,\n FSettingsSequencePayload,\n FStopSequenceCommand,\n FTakeRenderCommand,\n FTakeSpinnerRenderCommand,\n FTakeSpinnerRenderPreviewCommand,\n FUnLoadAllLevelsCommand,\n FUnLoadAllProductsCommand,\n FUnLoadProductByObjectNameCommand,\n FUnselectAllProductsCommand,\n FWeatherCommand,\n FWeatherPayload,\n} from '../interfaces/struct';\nimport { MetaBoxCommand } from '../interfaces/struct';\n\nexport const getResetControlClampsCommand = (): FResetControlClampsCommand => ({\n command: MetaBoxCommand.FResetControlClampsCommand,\n});\nexport const getCameraRecenterCommand = (): FCameraRecenterCommand => ({\n command: MetaBoxCommand.FCameraRecenterCommand,\n});\nexport const unLoadAllLevelsCommand = (): FUnLoadAllLevelsCommand => ({\n command: MetaBoxCommand.FUnLoadAllLevelsCommand,\n});\nexport const getDragCommand = (): FDragCommand => ({\n command: MetaBoxCommand.FDragCommand,\n});\nexport const getUnselectAllProductsCommand =\n (): FUnselectAllProductsCommand => ({\n command: MetaBoxCommand.FUnselectAllProductsCommand,\n });\nexport const getPauseSequenceCommand = (): FPauseSequenceCommand => ({\n command: MetaBoxCommand.FPauseSequenceCommand,\n});\nexport const getStopSequenceCommand = (): FStopSequenceCommand => ({\n command: MetaBoxCommand.FStopSequenceCommand,\n});\nexport const getUnLoadAllProductsCommand = (): FUnLoadAllProductsCommand => ({\n command: MetaBoxCommand.FUnLoadAllProductsCommand,\n});\nexport const getRequestCameraPresetCommand =\n (): FRequestCameraPresetCommand => ({\n command: MetaBoxCommand.FRequestCameraPresetCommand,\n });\nexport const getLoopBackCommand = (): FLoopBackCommand => ({\n command: MetaBoxCommand.FLoopBackCommand,\n});\nexport const getSetFpsCommand = (\n fpsRequired: number,\n): FExecuteConsoleCommandCommand => ({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload: { value: `t.MaxFPS ${fpsRequired}` },\n});\nexport const getFreezeFrameCommand = (\n payload: FBoolPayload,\n source: string,\n): FFreezeFrameCommand =>\n ({\n command: MetaBoxCommand.FFreezeFrameCommand,\n payload,\n source,\n }) as FFreezeFrameCommand;\nexport const getDragSequenceCommand = (\n payload: FDragSequencePayload,\n): FDragSequenceCommand => ({\n command: MetaBoxCommand.FDragSequenceCommand,\n payload,\n});\nexport const alignProductsToPlaneCommand = (\n payload: FAlignProductsToPlanePayload,\n): FAlignProductsToPlaneCommand => ({\n command: MetaBoxCommand.FAlignProductsToPlaneCommand,\n payload,\n});\nexport const getApplyCameraPresetCommand = (\n payload: FCameraPresetPayload,\n): FApplyCameraPresetCommand => ({\n command: MetaBoxCommand.FApplyCameraPresetCommand,\n payload,\n});\nexport const getLoadSceneStateCommand = (\n payload: FLoadSceneStatePayload,\n): FLoadSceneStateCommand => ({\n command: MetaBoxCommand.FLoadSceneStateCommand,\n payload,\n});\nexport const getClickSnapCommand = (\n payload: FBoolPayload,\n): FClickSnapCommand => ({\n command: MetaBoxCommand.FClickSnapCommand,\n payload,\n});\nexport const getSetControlCameraModeCommand = (\n payload: FControlCameraModePayload,\n): FSetControlCameraModeCommand => ({\n command: MetaBoxCommand.FSetControlCameraModeCommand,\n payload,\n});\nexport const getSetCameraControlClampsCommand = (\n payload: FCameraClampsPayload,\n): FSetCameraControlClampsCommand => ({\n command: MetaBoxCommand.FSetCameraControlClampsCommand,\n payload,\n});\nexport const getSetPawnMovementModeCommand = (\n payload: FSetPawnMovementModePayload,\n): FSetPawnMovementModeCommand => ({\n command: MetaBoxCommand.FSetPawnMovementModeCommand,\n payload,\n});\nexport const getEnableTeleportCommand = (\n payload: FBoolPayload,\n): FEnableTeleportCommand => ({\n command: MetaBoxCommand.FEnableTeleportCommand,\n payload,\n});\nexport const getApplyZoomCommand = (\n payload: FApplyZoomPayload,\n): FApplyZoomCommand => ({\n command: MetaBoxCommand.FApplyZoomCommand,\n payload,\n});\nexport const getCameraBoxCommand = (\n payload: FFVectorPayload,\n): FCameraBoxCommand => ({\n command: MetaBoxCommand.FCameraBoxCommand,\n payload,\n});\nexport const getDropCommand = (payload?: FDropPayload): FDropCommand => ({\n command: MetaBoxCommand.FDropCommand,\n payload,\n});\nexport const getSelectProductByObjectNameCommand = (\n payload: FSelectProductByObjectNamePayload,\n): FSelectProductByObjectNameCommand => ({\n command: MetaBoxCommand.FSelectProductByObjectNameCommand,\n payload,\n});\nexport const getChangeGizmoTypeCommand = (\n payload: FGizmoTypePayload,\n): FChangeGizmoTypeCommand => ({\n command: MetaBoxCommand.FChangeGizmoTypeCommand,\n payload,\n});\nexport const getWeatherCommand = (\n payload: FWeatherPayload,\n): FWeatherCommand => ({\n command: MetaBoxCommand.FWeatherCommand,\n payload,\n});\nexport const getFitToObjectsCommand = (\n payload?: FFitToObjectsPayload,\n): FFitToObjectsCommand => ({\n command: MetaBoxCommand.FFitToObjectsCommand,\n payload,\n});\nexport const setProductsLocationCommand = (\n payload: FSetProductsLocationPayload,\n): FSetProductsLocationCommand => ({\n command: MetaBoxCommand.FSetProductsLocationCommand,\n payload,\n});\nexport const getChangeResolutionCommand = (\n payload: FResolutionPayload,\n): FChangeResolutionCommand => ({\n command: MetaBoxCommand.FChangeResolutionCommand,\n payload,\n});\nexport const getEnableSpinnerModeCommand = (\n payload: FBoolPayload,\n): FEnableSpinnerModeCommand => ({\n command: MetaBoxCommand.FEnableSpinnerModeCommand,\n payload,\n});\nexport const getControlSensitivityCommand = (\n payload: FControlSensitivityPayload,\n): FControlSensitivityCommand => ({\n command: MetaBoxCommand.FControlSensitivityCommand,\n payload,\n});\nexport const getCameraSettingsCommand = (\n payload: FCameraSettingsPayload,\n): FCameraSettingsCommand => ({\n command: MetaBoxCommand.FCameraSettingsCommand,\n payload,\n});\nexport const getDebugModeCommand = (\n payload: FBoolPayload,\n): FDebugModeCommand => ({\n command: MetaBoxCommand.FDebugModeCommand,\n payload,\n});\nexport const getEnableControlsCommand = (\n payload: FBoolPayload,\n): FEnableControlsCommand => ({\n command: MetaBoxCommand.FEnableControlsCommand,\n payload,\n});\nexport const getExecuteConsoleCommand = (\n payload: FFStringPayload,\n): FExecuteConsoleCommandCommand => ({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload,\n});\nexport const getInitSequenceByObjectNameCommand = (\n payload: FInitSequenceByObjectNamePayload,\n): FInitSequenceByObjectNameCommand => ({\n command: MetaBoxCommand.FInitSequenceByObjectNameCommand,\n payload,\n});\nexport const getPlaySequenceCommand = (\n payload: FPlaySequencePayload,\n): FPlaySequenceCommand => ({\n command: MetaBoxCommand.FPlaySequenceCommand,\n payload,\n});\nexport const getJumpToSequenceCommand = (\n payload: FJumpToSequencePayload,\n): FJumpToSequenceCommand => ({\n command: MetaBoxCommand.FJumpToSequenceCommand,\n payload,\n});\nexport const getMoveSelectedCommand = (\n payload: FMoveSelectedPayload,\n): FMoveSelectedCommand => ({\n command: MetaBoxCommand.FMoveSelectedCommand,\n payload,\n});\nexport const getRotateSelectedCommand = (\n payload: FRotatePayload,\n): FRotateSelectedCommand => ({\n command: MetaBoxCommand.FRotateSelectedCommand,\n payload,\n});\nexport const getTakeRenderCommand = (\n payload: FRenderPayload,\n): FTakeRenderCommand => ({\n command: MetaBoxCommand.FTakeRenderCommand,\n payload,\n});\nexport const getTakeSpinnerRenderPreviewCommand = (\n payload: FRenderPayload,\n): FTakeSpinnerRenderPreviewCommand => ({\n command: MetaBoxCommand.FTakeSpinnerRenderPreviewCommand,\n payload,\n});\nexport const getTakeSpinnerRenderCommand = (\n payload: FRenderPayload,\n): FTakeSpinnerRenderCommand => ({\n command: MetaBoxCommand.FTakeSpinnerRenderCommand,\n payload,\n});\nexport const getSetMaterialCommand = (\n payload: FSetMaterialPayload,\n): FSetMaterialCommand => ({\n command: MetaBoxCommand.FSetMaterialCommand,\n payload,\n});\nexport const getLoadProductCommand = (\n payload: FProductPayload,\n): FLoadProductCommand => ({\n command: MetaBoxCommand.FLoadProductCommand,\n payload,\n});\nexport const getUnLoadProductByObjectNameCommand = (\n payload: FFStringPayload,\n): FUnLoadProductByObjectNameCommand => ({\n command: MetaBoxCommand.FUnLoadProductByObjectNameCommand,\n payload,\n});\nexport const getLoadLevelCommand = (\n payload: FLevelPayload,\n): FLoadLevelCommand => ({\n command: MetaBoxCommand.FLoadLevelCommand,\n payload,\n});\nexport const getEnableComposureCommand = (\n payload: FComposurePayload,\n): FEnableComposureCommand => ({\n command: MetaBoxCommand.FEnableComposureCommand,\n payload,\n});\nexport const clampPanToProductsCommand = (\n payload?: FFStringsPayload,\n): FClampPanToProductsCommand => ({\n command: MetaBoxCommand.FClampPanToProductsCommand,\n payload,\n});\nexport const getSetSettingsSequenceCommand = (\n payload: FSettingsSequencePayload,\n): FSetSettingsSequenceCommand => ({\n command: MetaBoxCommand.FSetSettingsSequenceCommand,\n payload,\n});\n","import { whereNot } from '@3dsource/utils';\nimport type { CommandsLoaderState } from '../store/unreal.reducer';\n\nexport const removeExileCommands = (\n state: CommandsLoaderState,\n idToRemove: string,\n) => {\n const exileTimout = 10000;\n const out = { ...state };\n out.commandsInProgress = out.commandsInProgress.filter(\n whereNot({ id: idToRemove }),\n );\n out.totalCommandsCompleted++;\n const time = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries(out.commandsInProgress).forEach(([, { id, timeStamp }]) => {\n if (time - timeStamp > exileTimout) {\n markForDelete.push(id);\n }\n });\n out.totalCommandsCompleted += markForDelete.length;\n out.commandsInProgress = out.commandsInProgress.filter(\n (command) => !markForDelete.includes(command.id),\n );\n return out;\n};\n","import { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { sendSignal } from './EventWrapper';\n\nexport const resetAfk = () => {\n sendSignal(UnrealInternalSignalEvents.RestAfkTimer);\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","import type { InputService } from '../services/input.service';\nimport { MouseButton } from '../constants/ButtonsAndCodes';\nimport { fromEvent } from 'rxjs';\n\nexport default class TouchEmulator {\n private lastDistance = 0;\n private prevDistance = 0;\n private touchReset = true;\n private delta = 0;\n private moveSensitivityScale = 3;\n private prevX = 0;\n private prevY = 0;\n\n constructor(private host: InputService) {\n this.registerTouchEvents(host.video);\n }\n\n private getPosition({ clientX, clientY }: Position) {\n return {\n x: clientX - this.host.videoBoundingRect.left,\n y: clientY - this.host.videoBoundingRect.top,\n };\n }\n\n private getCenter(v1: Vector, v2: Vector) {\n return {\n x: (v2.x - v1.x) / 2 + v1.x,\n y: (v2.y - v1.y) / 2 + v1.y,\n };\n }\n\n private getDistance(v1: Vector, v2: Vector) {\n const quad = {\n x: Math.abs(v2.x - v1.x) ^ 2,\n y: Math.abs(v2.y - v1.y) ^ 2,\n };\n\n return Math.sqrt(quad.x + quad.y);\n }\n\n updateDistance(touches: TouchList) {\n const center = this.getCenter(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n this.lastDistance = this.getDistance(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n if (this.touchReset) {\n this.prevDistance = this.lastDistance;\n this.touchReset = false;\n }\n\n return center;\n }\n\n private touchToVector2({ clientX, clientY }: Position) {\n return {\n x: clientX,\n y: clientY,\n };\n }\n\n private twoFingersAction(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n\n this.lastDistance = 0;\n this.prevDistance = 0;\n this.prevX = center.x;\n this.prevY = center.y;\n this.host.emitMouseUp(MouseButton.MainButton, center.x, center.y);\n this.host.emitMouseDown(MouseButton.SecondaryButton, center.x, center.y);\n }\n\n private threeFingersActionMove(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n this.delta = this.lastDistance - this.prevDistance;\n\n const xx = center.x - this.prevX;\n const yy = center.y - this.prevY;\n\n this.host.emitMouseMove(\n center.x,\n center.y,\n this.moveSensitivityScale * xx,\n this.moveSensitivityScale * yy,\n );\n this.prevX = center.x;\n this.prevY = center.y;\n }\n\n private twoFingersActionZoom(touches: TouchList) {\n const center = this.updateDistance(touches);\n this.delta = this.lastDistance - this.prevDistance;\n\n if (Math.abs(this.delta) < 0.3) {\n return;\n }\n\n this.delta = (this.delta / Math.abs(this.delta)) * 2000;\n\n if (isNaN(this.delta)) {\n return;\n }\n\n this.prevDistance = this.lastDistance;\n this.host.emitMouseWheel(this.delta, center.x, center.y);\n }\n\n private registerTouchEvents(playerElement: HTMLVideoElement) {\n let finger: Finger | undefined;\n\n fromEvent<TouchEvent>(playerElement, 'touchstart', {\n passive: false,\n }).subscribe((e: TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const touches: TouchList = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersAction(touches);\n\n return;\n }\n\n /**\n * One finger actions below\n */\n\n this.prevDistance = 0;\n this.touchReset = true;\n\n if (finger === undefined) {\n const firstTouch = e.changedTouches[0];\n const { x, y } = this.getPosition(firstTouch);\n finger = {\n id: firstTouch.identifier,\n x,\n y,\n };\n // Hack: Mouse events require an enter and leave so we just\n // enter and leave manually with each touch as this event\n // is not fired with a touch device.\n playerElement.dispatchEvent(new MouseEvent('mouseenter', e));\n this.host.emitMouseDown(MouseButton.MainButton, finger.x, finger.y);\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchend', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < e.changedTouches.length; t++) {\n const touch = e.changedTouches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n this.host.emitMouseUp(MouseButton.MainButton, x, y);\n this.host.emitMouseUp(MouseButton.SecondaryButton, x, y);\n // Hack: Manual mouse leave event.\n playerElement.dispatchEvent(new MouseEvent('mouseleave', e));\n finger = undefined;\n\n break;\n }\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchmove', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n const touches = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n this.threeFingersActionMove(touches);\n\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersActionZoom(touches);\n\n return;\n }\n\n for (let t = 0; t < touches.length; t++) {\n const touch = e.touches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n\n this.host.emitMouseMove(\n x,\n y,\n this.moveSensitivityScale * (x - finger.x),\n this.moveSensitivityScale * (y - finger.y),\n );\n finger.x = x;\n finger.y = y;\n\n break;\n }\n }\n });\n }\n}\n\ninterface Vector {\n x: number;\n y: number;\n}\n\ninterface Finger extends Vector {\n id: number;\n}\n\ninterface Position {\n clientX: number;\n clientY: number;\n}\n","export class VideoRecorder {\n private recordedChunks!: any[];\n private mediaRecorder!: MediaRecorder;\n\n capture(canvas: any) {\n // Optional frames per second argument can be set in captureStream().\n const stream = (canvas as HTMLCanvasElement).captureStream();\n\n this.recordedChunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n this.mediaRecorder = new MediaRecorder(stream, options);\n this.mediaRecorder.ondataavailable = this.handleDataAvailable.bind(this);\n this.mediaRecorder.start();\n\n // demo: to download after 9sec\n /*\n setTimeout((event) => {\n mediaRecorder.stop();\n }, 9000);\n */\n }\n\n stop() {\n this.mediaRecorder?.stop();\n }\n\n handleDataAvailable(event: any) {\n if (event.data.size > 0) {\n this.recordedChunks.push(event.data);\n this.download();\n }\n }\n\n download() {\n const blob = new Blob(this.recordedChunks, {\n type: 'video/webm',\n });\n\n const url = URL.createObjectURL(blob);\n const a: any = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.download = 'test.webm';\n a.click();\n URL.revokeObjectURL(url);\n }\n}\n","import {\n changeLowBandwidth,\n changeStatusMainVideoOnScene,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n commandStarted,\n initSignalling,\n resetConfig,\n resetIntroSrc,\n resetUnrealState,\n resetUnrealStateAction,\n resetWarnTimeout,\n setAwsInstance,\n setCirrusConnected,\n setCirrusDisconnected,\n setConfig,\n setDataChannelConnected,\n setErrorMessage,\n setEstablishingConnection,\n setFreezeFrame,\n setFreezeFrameFromVideo,\n setIntroImageSrc,\n setIntroVideoSrc,\n setLoadingImageSrc,\n setLoopBackCommandIsCompleted,\n setSignalingName,\n setStatusMessage,\n setStatusPercentSignallingServer,\n setStreamClientCompanyId,\n setStreamViewId,\n setUnrealVersion,\n setViewportReady,\n updateCirrusInfo,\n} from './unreal.actions';\nimport { on } from '@ngrx/store';\nimport { createImmerReducer } from 'ngrx-immer/store';\nimport {\n AwsInstance,\n DisconnectReason,\n DisconnectType,\n FreezeFrameMessage,\n LBMStats,\n SignalingData,\n StreamConfig,\n StreamResolutionProps,\n UnrealError,\n} from '../interfaces';\nimport { DEFAULT_WARN_TIMEOUT } from '../constants';\nimport { removeExileCommands } from '../helpers';\n\nexport interface CommandsLoaderState {\n commandsInProgress: {\n timeStamp: number;\n command: string;\n id: string;\n }[];\n totalCommandsStarted: number;\n totalCommandsCompleted: number;\n}\n\nexport interface UnrealState {\n lowBandwidthStats: LBMStats | undefined;\n streamConfig: StreamConfig;\n awsInstance: AwsInstance;\n lowBandwidth: boolean;\n wasInitialized: boolean;\n isFirstSuccessLoad: boolean;\n cirrusConnected: boolean;\n viewportReady: boolean;\n freezeFrameFromVideo: FreezeFrameMessage;\n freezeFrame: FreezeFrameMessage;\n statusMessage: string | null;\n /**\n * @deprecated, use ssData in future\n */\n ssInfo: string | null;\n ssData: SignalingData | null;\n statusPercentSignallingServer: number | null;\n errorMessage: UnrealError | null;\n dataChannelConnected: boolean;\n streamResolution: StreamResolutionProps;\n isVideoPlaying: boolean;\n establishingConnection: boolean;\n disconnectReason: DisconnectType;\n loaderCommands: CommandsLoaderState;\n unrealVersion: string | null;\n streamClientCompanyId: string | null;\n streamViewId: string | null;\n videoIntroSrc: string | null;\n imageIntroSrc: string | null;\n imageLoadingSrc: string;\n}\n\nexport const initialState: UnrealState = {\n lowBandwidthStats: undefined,\n wasInitialized: false,\n isFirstSuccessLoad: false,\n lowBandwidth: false,\n cirrusConnected: false,\n establishingConnection: false,\n viewportReady: false,\n dataChannelConnected: false,\n isVideoPlaying: false,\n statusPercentSignallingServer: null,\n statusMessage: null,\n errorMessage: null,\n ssInfo: null,\n ssData: null,\n streamResolution: { width: null, height: null },\n freezeFrameFromVideo: { dataUrl: null, progress: null },\n freezeFrame: { dataUrl: null, progress: null },\n disconnectReason: DisconnectReason.none,\n awsInstance: {\n wsUrl: null,\n instanceName: null,\n pollingUrl: null,\n },\n streamConfig: {\n autoStart: true,\n warnTimeout: DEFAULT_WARN_TIMEOUT,\n matchMakerUrls: [],\n },\n loaderCommands: {\n commandsInProgress: [],\n totalCommandsStarted: 0,\n totalCommandsCompleted: 0,\n },\n unrealVersion: '',\n streamClientCompanyId: '',\n streamViewId: 'default',\n videoIntroSrc: null,\n imageIntroSrc: null,\n imageLoadingSrc: 'assets/images/avif/configurator_bg.avif',\n};\nexport const unrealReducer = createImmerReducer(\n initialState,\n on(changeLowBandwidth, (state: UnrealState, { lowBandwidth, stats }) => {\n state.lowBandwidth = lowBandwidth;\n if (!lowBandwidth) {\n state.lowBandwidthStats = undefined;\n return state;\n }\n state.lowBandwidthStats = stats;\n return state;\n }),\n on(changeStatusMainVideoOnScene, (state: UnrealState, { isVideoPlaying }) => {\n state.isVideoPlaying = isVideoPlaying;\n return state;\n }),\n on(setAwsInstance, (state: UnrealState, awsInstance) => {\n state.awsInstance = awsInstance;\n return state;\n }),\n on(setViewportReady, (state: UnrealState, { value }) => {\n state.viewportReady = value;\n if (value) {\n state.statusMessage = null;\n state.errorMessage = null;\n }\n return state;\n }),\n on(updateCirrusInfo, (state: UnrealState, { ssInfo, ssData }) => {\n state.ssInfo = ssInfo; // For back compatibility\n state.ssData = ssData; //Contains all the data from the ssInfo as object\n return state;\n }),\n on(\n changeStreamResolutionSuccessAction,\n (state: UnrealState, { width, height }) => {\n state.streamResolution.width = width;\n state.streamResolution.height = height;\n return state;\n },\n ),\n on(setFreezeFrame, (state: UnrealState, freezeFrame) => {\n if (\n freezeFrame.progress === 0 ||\n freezeFrame.progress === 1 ||\n freezeFrame.progress === null\n ) {\n state.freezeFrame.dataUrl = freezeFrame.dataUrl;\n }\n state.freezeFrame.progress = freezeFrame.progress || null;\n return state;\n }),\n on(setErrorMessage, (state: UnrealState, errorMessage) => {\n if (state.dataChannelConnected) {\n return state;\n }\n state.errorMessage = errorMessage;\n state.statusMessage = null;\n return state;\n }),\n on(setFreezeFrameFromVideo, (state: UnrealState, freezeFrameFromVideo) => {\n state.freezeFrameFromVideo.dataUrl = freezeFrameFromVideo.dataUrl;\n state.freezeFrameFromVideo.progress = freezeFrameFromVideo.progress || null;\n return state;\n }),\n on(setStatusMessage, (state: UnrealState, { message }) => {\n state.statusMessage = message;\n return state;\n }),\n on(setEstablishingConnection, (state: UnrealState, { value }) => {\n state.establishingConnection = value;\n return state;\n }),\n on(setStatusPercentSignallingServer, (state: UnrealState, { percent }) => {\n state.statusPercentSignallingServer = percent;\n return state;\n }),\n on(setDataChannelConnected, (state: UnrealState, { value }) => {\n state.dataChannelConnected = value;\n if (value) {\n state.wasInitialized = true;\n }\n return state;\n }),\n on(setConfig, (state: UnrealState, { config }) => {\n state.streamConfig = { ...state.streamConfig, ...config };\n return state;\n }),\n on(resetConfig, (state: UnrealState) => {\n state.streamConfig = initialState.streamConfig;\n return state;\n }),\n on(resetWarnTimeout, (state: UnrealState) => {\n state.streamConfig.warnTimeout = DEFAULT_WARN_TIMEOUT;\n return state;\n }),\n on(setCirrusConnected, (state: UnrealState) => {\n state.cirrusConnected = true;\n return state;\n }),\n on(setCirrusDisconnected, (state: UnrealState) => {\n state.cirrusConnected = false;\n return state;\n }),\n on(initSignalling, (state: UnrealState) => {\n state.disconnectReason = DisconnectReason.none;\n return state;\n }),\n on(setSignalingName, (state: UnrealState, { instanceName }) => {\n state.awsInstance = { ...state.awsInstance, instanceName };\n return state;\n }),\n on(setLoopBackCommandIsCompleted, (state) => {\n state.isFirstSuccessLoad = true;\n return state;\n }),\n on(setUnrealVersion, (state: UnrealState, { version }) => {\n state.unrealVersion = version;\n return state;\n }),\n on(setStreamClientCompanyId, (state: UnrealState, { id }) => {\n state.streamClientCompanyId = id;\n return state;\n }),\n on(setStreamViewId, (state: UnrealState, { id }) => {\n state.streamViewId = id;\n return state;\n }),\n on(setIntroImageSrc, (state: UnrealState, { src }) => {\n state.imageIntroSrc = src;\n return state;\n }),\n on(setLoadingImageSrc, (state: UnrealState, { src }) => {\n state.imageLoadingSrc = src;\n return state;\n }),\n on(setIntroVideoSrc, (state: UnrealState, { src }) => {\n state.videoIntroSrc = src;\n return state;\n }),\n on(resetIntroSrc, (state: UnrealState) => {\n state.imageIntroSrc = '';\n state.videoIntroSrc = '';\n return state;\n }),\n on(commandStarted, (state, { id, command }) => {\n state.loaderCommands.totalCommandsStarted =\n state.loaderCommands.totalCommandsStarted + 1;\n state.loaderCommands.commandsInProgress = [\n ...state.loaderCommands.commandsInProgress,\n { id, command, timeStamp: new Date().getTime() },\n ];\n return state;\n }),\n on(commandCompleted, (state, { id }) => {\n state.loaderCommands = removeExileCommands(state.loaderCommands, id);\n return state;\n }),\n on(resetUnrealState, (state: UnrealState) => {\n return {\n ...initialState,\n wasInitialized: state.wasInitialized,\n isFirstSuccessLoad: state.isFirstSuccessLoad,\n unrealVersion: state.unrealVersion,\n streamClientCompanyId: state.streamClientCompanyId,\n streamViewId: state.streamViewId,\n imageLoadingSrc: state.imageLoadingSrc,\n };\n }),\n on(resetUnrealStateAction, () => {\n return initialState;\n }),\n);\n","import { createFeature } from '@ngrx/store';\nimport { unrealReducer } from './unreal.reducer';\n\nexport const unrealFeature = createFeature({\n name: 'unrealFeature',\n reducer: unrealReducer,\n});\n","import { createSelector } from '@ngrx/store';\nimport { unrealFeature } from './unreal.feature';\nimport { DEFAULT_WARN_TIMEOUT } from '../constants';\nimport { clampf, lerp, Truthy } from '@3dsource/utils';\n\nexport const selectFreezeFrameDataUrlFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.dataUrl || null,\n);\nexport const selectFreezeFrameProgressMessageFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.progress || null,\n);\nexport const selectFreezeFrameDataUrl = createSelector(\n unrealFeature.selectFreezeFrame,\n unrealFeature.selectLowBandwidth,\n (freezeFrame, isLow) =>\n freezeFrame?.dataUrl && isLow ? freezeFrame?.dataUrl : null,\n);\nexport const selectIsFreezeFrameLoading = createSelector(\n unrealFeature.selectFreezeFrame,\n (freezeFrame) =>\n freezeFrame?.progress\n ? freezeFrame.progress > 0 && freezeFrame.progress < 1\n : false,\n);\nexport const selectFreezeFrameCombinedDataUrl = createSelector(\n selectFreezeFrameDataUrlFromVideo,\n selectFreezeFrameDataUrl,\n (dataUrlFromVideo, remoteDataUrl) =>\n dataUrlFromVideo || remoteDataUrl || null,\n);\nexport const selectStreamConfig = createSelector(\n unrealFeature.selectStreamConfig,\n (config) => config,\n);\nexport const selectWarnTimeout = createSelector(\n selectStreamConfig,\n (config) => config?.warnTimeout || DEFAULT_WARN_TIMEOUT,\n);\nexport const selectMatchUrls = createSelector(selectStreamConfig, (config) =>\n (config?.matchMakerUrls || []).filter(Truthy),\n);\nexport const selectIsAutostart = createSelector(\n selectStreamConfig,\n (config) => config?.autoStart,\n);\nexport const selectWsUrl = createSelector(\n unrealFeature.selectAwsInstance,\n (instance) => instance?.wsUrl,\n);\nexport const selectShowReconnectPopup = createSelector(\n unrealFeature.selectWasInitialized,\n unrealFeature.selectCirrusConnected,\n unrealFeature.selectEstablishingConnection,\n unrealFeature.selectImageIntroSrc,\n unrealFeature.selectVideoIntroSrc,\n (wasInitialized, connected, establishing, imageSrc, videoSrc) =>\n wasInitialized && !connected && !establishing && !imageSrc && !videoSrc,\n);\nexport const selectShowLoader = createSelector(\n unrealFeature.selectWasInitialized,\n unrealFeature.selectViewportReady,\n selectStreamConfig,\n selectShowReconnectPopup,\n (wasInitialized, viewportReady, config, showPopup) =>\n ((config.autoStart && !wasInitialized) || !showPopup) && !viewportReady,\n);\nexport const selectIsVideoPlayingAndDataChannelConnected = createSelector(\n unrealFeature.selectIsVideoPlaying,\n unrealFeature.selectDataChannelConnected,\n (isVideoPlaying, isDataChannelConnected) =>\n isVideoPlaying && isDataChannelConnected,\n);\nexport const selectSignalingParameters = createSelector(\n unrealFeature.selectSsData,\n unrealFeature.selectAwsInstance,\n unrealFeature.selectSsInfo,\n (data, instance, ssInfo) => {\n const info = [];\n if (data) {\n info.push(`${data.cirrusVersion}, ${data.branchInfo}`);\n info.push(`Unreal App Version: ${data.streamerVersion}`);\n info.push(`APP: ${data.streamPath}${data.streamApp}`);\n } else {\n info.push(ssInfo);\n }\n info.push(`Polling: ${instance.pollingUrl}`);\n info.push(`WS: ${instance.wsUrl}`);\n return info.join('<br>');\n },\n);\nexport const selectLoaderCommands = createSelector(\n unrealFeature.selectLoaderCommands,\n (loaderCommands) => loaderCommands,\n);\nexport const selectCommandsInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => loaderCommands.commandsInProgress.length,\n);\nexport const selectCommandProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => {\n if (loaderCommands.totalCommandsStarted > 0) {\n return (\n loaderCommands.totalCommandsCompleted /\n loaderCommands.totalCommandsStarted\n );\n }\n return 0;\n },\n);\nexport const selectLastCommandInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) =>\n loaderCommands.commandsInProgress?.length\n ? loaderCommands.commandsInProgress[\n loaderCommands.commandsInProgress.length - 1\n ]\n : null,\n);\n/**\n * Returns Scene load progress as a float value in between 0-1\n */\nexport const selectTotalProgress = createSelector(\n unrealFeature.selectStatusPercentSignallingServer,\n selectCommandProgress,\n unrealFeature.selectAwsInstance,\n (statusPercentSignallingServer, commandProgress, signalingServer) => {\n /**\n * Set 20% immediately when signalingServer?.signalingUrl is available\n * Up to 19% of the progress is reserved for signaling server polling\n */\n const splitPoint = signalingServer?.wsUrl ? 0.2 : 0.19;\n const percentSignaling = lerp(\n 0.001,\n splitPoint,\n (statusPercentSignallingServer || 0) / 100,\n );\n const percentRest = lerp(0, 1 - splitPoint, commandProgress);\n return clampf(0, 1, percentSignaling + percentRest);\n },\n);\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport {\n selectFreezeFrameCombinedDataUrl,\n selectFreezeFrameProgressMessageFromVideo,\n} from '../../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'app-freeze-frame',\n templateUrl: './freeze-frame.component.html',\n styleUrls: ['./freeze-frame.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FreezeFrameComponent {\n #store = inject(Store);\n\n freezeFrameProgressMessageFromVideo = toSignal(\n this.#store.select(selectFreezeFrameProgressMessageFromVideo),\n );\n combinedFreeze = toSignal(\n this.#store.select(selectFreezeFrameCombinedDataUrl),\n );\n}\n","<div class=\"freeze-images\">\n @if (combinedFreeze()) {\n <img\n [src]=\"combinedFreeze()\"\n class=\"videoStillImage\"\n alt=\"freezeFrameImage\"\n />\n }\n\n @if (freezeFrameProgressMessageFromVideo()) {\n <div class=\"progress-status\">\n {{ freezeFrameProgressMessageFromVideo() }}\n </div>\n }\n</div>\n","import type { PipeTransform } from '@angular/core';\nimport { inject, Pipe } from '@angular/core';\nimport type {\n SafeHtml,\n SafeResourceUrl,\n SafeScript,\n SafeStyle,\n SafeUrl,\n} from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safe',\n})\nexport class SafePipe implements PipeTransform {\n private sanitizer = inject(DomSanitizer);\n\n transform(\n value: any,\n type: string,\n ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {\n if (!value) {\n return value;\n }\n\n switch (type) {\n case 'html':\n return this.sanitizer.bypassSecurityTrustHtml(value);\n case 'style':\n return this.sanitizer.bypassSecurityTrustStyle(value);\n case 'script':\n return this.sanitizer.bypassSecurityTrustScript(value);\n case 'url':\n return this.sanitizer.bypassSecurityTrustUrl(value);\n case 'resourceUrl':\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\n default:\n throw new Error(`Invalid safe type specified: ${type}`);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { SafePipe } from '../../pipes/safe-html.pipe';\nimport { SourceButtonComponent } from '@source/ui-sdk/source-button';\nimport { DialogRef } from '@angular/cdk/dialog';\nimport { SourceRoundButtonComponent } from '@source/ui-sdk/source-round-button';\n\n@Component({\n selector: 'app-low-bandwidth-modal',\n templateUrl: './low-bandwidth-modal.component.html',\n styleUrls: ['./low-bandwidth-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SafePipe, SourceButtonComponent, SourceRoundButtonComponent],\n})\nexport class LowBandwidthModalComponent {\n dialogRef = inject(DialogRef);\n close(value?: boolean) {\n this.dialogRef.close(value || false);\n }\n}\n","<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n <src-round-button\n (onClick)=\"close()\"\n [icon]=\"'close_small'\"\n [data-testid]=\"'close'\"\n class=\"src-modal__close\"\n />\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n colorScheme=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n","import { share, skip } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { inject } from '@angular/core';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { filter } from 'rxjs/operators';\nimport { Falsy } from '@3dsource/utils';\n\nexport class SubService {\n store = inject(Store);\n\n disconnect$ = this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), share());\n}\n","import { from, fromEvent, take } from 'rxjs';\nimport { SubService } from './sub.service';\nimport { Injectable } from '@angular/core';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { catchError, filter, first } from 'rxjs/operators';\nimport { sendSignal } from '../helpers/EventWrapper';\nimport { changeStatusMainVideoOnScene } from '../store/unreal.actions';\nimport { STREAMING_VIDEO_ID } from '../constants/unreal.constant';\nimport { dispatchResize } from '../helpers/dispatchResize';\nimport { tapLog } from '@3dsource/utils';\n\n@Injectable()\nexport class VideoService extends SubService {\n video!: HTMLVideoElement | null;\n audio!: HTMLAudioElement | null;\n container!: HTMLDivElement | null;\n\n create() {\n this.disconnect$.pipe(take(1)).subscribe(() => this.destroy());\n this.destroy();\n this.createWebRtcVideo();\n this.createWebRtcAudio();\n }\n\n private destroy() {\n this.video = null;\n this.audio = null;\n\n while (this.container?.firstChild) {\n this.container.removeChild(this.container.firstChild);\n }\n\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: false }),\n );\n }\n\n private createWebRtcVideo() {\n dispatchResize();\n const video = document.createElement('video');\n video.id = STREAMING_VIDEO_ID;\n video.playsInline = true;\n video.muted = true;\n video.autoplay = true;\n video.preload = 'auto';\n video.disablePictureInPicture = true;\n\n this.video = video;\n this.container?.appendChild(this.video);\n\n this.video.addEventListener('play', () => {\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: true }),\n );\n });\n\n fromEvent(this.video, 'loadedmetadata')\n .pipe(\n first(),\n filter((data) => this.video === data.target),\n tapLog('VideoService loadedmetadata:'),\n )\n .subscribe(() =>\n sendSignal(UnrealInternalSignalEvents.OnVideoInitialized, this.video!),\n );\n }\n\n attachVideoStream(stream: MediaStream) {\n if (this.video) {\n this.video.srcObject = stream;\n } else {\n console.error('Video element is not defined.');\n }\n }\n\n attachAudioStream(stream: MediaStream) {\n // do nothing the video has the same media stream as the audio track we have here (they are linked)\n if (this.video?.srcObject === stream) {\n return;\n }\n // video element has some other media stream that is not associated with this audio track\n else if (\n this.audio &&\n this.video?.srcObject &&\n this.video?.srcObject !== stream\n ) {\n this.audio.srcObject = stream;\n this.playAudio(this.audio);\n }\n }\n\n private createWebRtcAudio() {\n const audio = new Audio();\n audio.id = 'streamingAudio';\n this.audio = audio;\n }\n\n private playAudio(audio: HTMLAudioElement) {\n from(audio.play())\n .pipe(\n catchError(() => fromEvent(document, 'click')),\n take(1),\n )\n .subscribe({\n next: () => audio.play(),\n error: () => ({}),\n });\n }\n\n play() {\n void this.video?.play();\n }\n}\n","import type { AfterViewInit, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { VideoService } from '../../services/video.service';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { filter, skip } from 'rxjs/operators';\nimport type { SignalDescriptor } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { Falsy, Logger } from '@3dsource/utils';\nimport {\n selectShowReconnectPopup,\n selectStreamConfig,\n} from '../../store/unreal.selectors';\nimport { fromSignal } from '../../helpers/EventWrapper';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\nimport {\n SourceButtonColorScheme,\n SourceButtonComponent,\n SourceButtonSize,\n} from '@source/ui-sdk/source-button';\nimport { initSignalling } from '../../store/unreal.actions';\n\n@Component({\n selector: 'app-afk-restart-screen-locker',\n templateUrl: './afk-restart-screen-locker.component.html',\n styleUrls: ['./afk-restart-screen-locker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgOptimizedImage, SourceButtonComponent],\n})\nexport class AfkRestartScreenLockerComponent implements AfterViewInit, OnInit {\n store = inject(Store);\n videoService = inject(VideoService);\n destroyRef = inject(DestroyRef);\n\n showReconnectPopup = toSignal(this.store.select(selectShowReconnectPopup));\n isViewportReady = toSignal(\n this.store.select(unrealFeature.selectViewportReady),\n );\n imageLoadingSrc = toSignal(\n this.store.select(unrealFeature.selectImageLoadingSrc),\n );\n streamConfig = toSignal(this.store.select(selectStreamConfig));\n isSecondStart = signal(\n !!(this.streamConfig()?.autoStart && location.href.match(/^https/gi)),\n );\n\n SourceButtonSize = SourceButtonSize;\n SourceButtonColorScheme = SourceButtonColorScheme;\n playCallBack: null | (() => void) = null;\n\n ngOnInit() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.onDisconnect());\n }\n\n ngAfterViewInit() {\n fromSignal(UnrealInternalSignalEvents.ShowPlayButton)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: SignalDescriptor['ShowPlayButton']) => {\n this.playCallBack = event.callback;\n\n if (this.videoService.video?.paused) {\n Logger.info('Simulate Press Play');\n this.playCallBack();\n }\n });\n }\n\n connect() {\n this.store.dispatch(initSignalling());\n }\n\n onDisconnect() {\n this.isSecondStart.set(true);\n this.playCallBack = null;\n }\n}\n","@if (!isViewportReady()) {\n <div class=\"preload\">\n <div class=\"back\">\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n </div>\n\n @if (showReconnectPopup()) {\n <div class=\"stream-message-wrapper\">\n <div class=\"resume-box\">\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [size]=\"SourceButtonSize.LARGE\"\n [colorScheme]=\"SourceButtonColorScheme.PRIMARY\"\n [label]=\"isSecondStart() ? 'Resume' : 'Start'\"\n [data-testid]=\"'connect-button'\"\n class=\"connect-button\"\n >\n </src-button>\n </div>\n </div>\n }\n </div>\n}\n","import type { AfterViewInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n inject,\n Input,\n input,\n ViewChild,\n} from '@angular/core';\nimport {\n HEXtoRGB,\n HSVtoRGB,\n inverseLerp,\n RGBtoHEX,\n RGBtoHSV,\n} from '@3dsource/utils';\n\n@Component({\n selector: 'app-stat-graph',\n templateUrl: './stat-graph.component.html',\n styleUrls: ['./stat-graph.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StatGraphComponent implements AfterViewInit {\n private el = inject(ElementRef);\n @ViewChild('graph') graph!: ElementRef;\n private canvas!: HTMLCanvasElement;\n private ctx!: CanvasRenderingContext2D;\n\n readonly color = input('#417bc9');\n readonly tickStep = input(3);\n readonly label = input.required<string>();\n private scaleY!: number;\n\n @Input() set dataTick(data: { value: number; hash: number } | null) {\n this.pushData(data?.value ?? null);\n }\n\n private data: (number | null)[] = [];\n\n max = 0;\n min = 0;\n current = 0;\n\n ngAfterViewInit() {\n this.canvas = this.graph.nativeElement;\n this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n }\n\n @HostListener('window:resize', ['$event'])\n resize() {\n this.draw();\n }\n\n private draw() {\n if (!this.canvas) {\n return;\n }\n\n const all = this.data.filter((r) => r !== null && !isNaN(r)) as number[];\n this.max = Math.max(...all);\n this.min = Math.min(...all);\n this.scaleY = this.canvas.height / (this.max || 1);\n this.current = all[all.length - 1] || 0;\n this.ctx.save();\n const bounds = this.el.nativeElement.getBoundingClientRect();\n this.canvas.width = bounds.width;\n this.canvas.height = bounds.height - 30; // -p height\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n [...this.data].reverse().forEach((val, index) => {\n const h = (val || 0) * this.scaleY;\n\n this.ctx.fillStyle = this.getColor(this.color(), h as number);\n this.ctx.fillRect(\n index * this.tickStep(),\n this.canvas.height - h,\n this.tickStep(),\n h,\n );\n });\n this.ctx.restore();\n }\n\n private getColor(fillStyle: string, value = 0): string {\n const { r, g, b } = HEXtoRGB(fillStyle);\n /* eslint-disable-next-line prefer-const */\n let [h, s, v] = RGBtoHSV(r, g, b);\n v = inverseLerp(0, this.canvas.height, value);\n {\n const [r, g, b] = HSVtoRGB(h, s, v);\n const hex = '#' + RGBtoHEX(r, g, b);\n return hex;\n }\n }\n\n private pushData(value: number | null) {\n this.data.push(value);\n\n if (!this.canvas) {\n return;\n }\n\n if (this.data.length > this.canvas.width / this.tickStep()) {\n this.data.shift();\n }\n\n this.draw();\n }\n}\n","<div class=\"content\">\n <p>{{ label() }}: {{ current }} | Min:{{ min }} | Max:{{ max }}</p>\n <canvas #graph class=\"graph\"></canvas>\n</div>\n","import { filter } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { setFreezeFrame } from '../store/unreal.actions';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { sendSignal } from '../helpers/EventWrapper';\nimport { unrealFeature } from '../store/unreal.feature';\n\n@Injectable()\nexport class FreezeFrameService extends SubService {\n receiving = false;\n\n private size = 0;\n private jpeg!: Uint8Array | undefined;\n private freezeFrameOverlay = new Image();\n\n init() {\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy))\n .subscribe(() => this.invalidate());\n }\n\n setData(view: Uint8Array) {\n view = view.slice(1 + 4);\n\n const jpeg = new Uint8Array(this.jpeg!.length + view.length);\n jpeg.set(this.jpeg!, 0);\n jpeg.set(view, this.jpeg!.length);\n this.jpeg = jpeg;\n if (this.jpeg.length === this.size) {\n this.receiving = false;\n Logger.info(`FRAME: Received complete freeze frame ${this.size}`);\n this.showFreezeFrame();\n } else if (this.jpeg.length > this.size) {\n Logger.error(\n `FRAME: Received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`,\n );\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: 0 }));\n\n this.jpeg = undefined;\n this.receiving = false;\n } else {\n this.dispatchInProgress();\n /* Logger.warn(\n `received next chunk (${view.length} bytes) of freeze frame: ${this.jpeg.length}/${this.size}`,\n );*/\n }\n }\n\n private dispatchInProgress() {\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: null,\n progress: (this.jpeg?.length || 0) / this.size,\n }),\n );\n }\n\n start(view: Uint8Array) {\n this.size = new DataView(view.slice(1, 5).buffer).getInt32(0, true);\n this.jpeg = view.slice(1 + 4);\n if (this.jpeg.length < this.size) {\n this.dispatchInProgress();\n sendSignal(UnrealInternalSignalEvents.FreezeFrameStart);\n Logger.info(\n `FRAME: Received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = true;\n } else {\n Logger.info(\n `FRAME: Received complete freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = false;\n this.showFreezeFrame();\n }\n }\n\n invalidate() {\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: null }));\n this.jpeg = undefined;\n this.receiving = false;\n }\n\n private showFreezeFrame() {\n if (!this.jpeg) {\n return;\n }\n\n const base64 = btoa(\n this.jpeg?.reduce((data, byte) => data + String.fromCharCode(byte), ''),\n );\n this.freezeFrameOverlay.src = 'data:image/jpeg;base64,' + base64;\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: this.freezeFrameOverlay.src,\n progress: 1,\n }),\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { filter } from 'rxjs/operators';\nimport type { TelemetryType } from '../interfaces/TelemetryEvent';\nimport { timer } from 'rxjs';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { generateUuid, Truthy } from '@3dsource/utils';\nimport { HttpClient } from '@angular/common/http';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\n\n@Injectable()\nexport class CommandTelemetryService {\n private readonly appId: string = 'metabox-telemetry';\n private commandsSent: Record<string, CommandToSend> = {};\n private exileTimout = 60000;\n private pollingTime = 5000;\n private commandSequenceNumber = 0;\n\n /**\n * The time the telemetry service was started.\n * Initialized at a moment when connectToSignaling() was called.\n * @private\n */\n private startTime!: number;\n private lastTime!: number;\n private uuid!: string;\n private viewId!: string;\n private readonly sessionId: string;\n private readonly userId: string;\n private payloads: Payload[] = [];\n\n private readonly httpClient = inject(HttpClient);\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG, {\n optional: true,\n });\n\n constructor() {\n this.reset();\n this.sessionId = sessionStorage.getItem(this.appId) || this.uuid;\n this.userId = localStorage.getItem(this.appId) || this.uuid;\n sessionStorage.setItem(this.appId, this.sessionId);\n localStorage.setItem(this.appId, this.userId);\n this.start();\n }\n\n private get timeNow() {\n return Date.now();\n }\n\n private get sessionTime() {\n return this.timeNow - this.startTime;\n }\n\n private get canSkipSending() {\n return !(this.timeNow - this.lastTime > this.pollingTime * 2);\n }\n\n decorate(funcToDecorate: IToBeDecorated) {\n this.listenCallbacks();\n return this.wrapper.bind(this, funcToDecorate);\n }\n\n private start() {\n fromSignal(UnrealInternalSignalEvents.TelemetryStart).subscribe(\n ({ externalId }) => {\n this.trackStartCommand(`EXT-${externalId}`);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryStop).subscribe(\n ({ externalId, payload }) => {\n const trackingId = `EXT-${externalId}`;\n this.trackStopCommand(trackingId, undefined, payload?.multi, payload);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryReset).subscribe(() => {\n this.reset();\n });\n\n timer(0, this.pollingTime).subscribe(() => {\n this.send(this.payloads);\n });\n }\n\n private reset() {\n this.uuid = generateUuid();\n this.commandSequenceNumber = 0;\n this.viewId = this.uuid;\n this.startTime = this.timeNow;\n this.payloads.length = 0;\n this.commandsSent = {};\n }\n\n private trackStartCommand(trackingId: string) {\n const out = {\n command: trackingId,\n trackingId,\n };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer('commandSent', out, timers);\n this.trackTime(out);\n }\n\n private trackStopCommand(\n trackingId: string,\n timeStampsRaw?: TimeStampsRaw,\n multi = false,\n response: any = {},\n ) {\n const commandResponse = this.commandsSent[trackingId];\n if (!commandResponse) {\n return;\n }\n const totalRoundTripTime = this.timeNow - commandResponse.timeStampJs;\n\n /**\n * Time between telemetry was reset and command was sent.\n */\n const commandSentJsTime = commandResponse.timeStampJs - this.startTime;\n let unrealTimers = {};\n\n const t = timeStampsRaw?.timeStampCommand;\n if (t) {\n unrealTimers = {\n unrealRoundTripTime:\n t.onCompleteCommand.timestamp - t.onRequestCommand.timestamp,\n\n unrealExecutionDuration:\n t.onCompleteCommand.timestamp - t.onStartCommand.timestamp,\n\n timeDiffRequest:\n t.onRequestCommand.timestamp - commandResponse.timeStampJs,\n\n timeDiffCallBack: this.timeNow - t.onCompleteCommand.timestamp,\n };\n }\n\n const timers = {\n sessionElapsedTime: this.sessionTime,\n commandSentJsTime,\n totalRoundTripTime,\n ...unrealTimers,\n } as ComputedTimers;\n\n this.pushStatToBuffer(\n 'commandStop',\n { ...commandResponse.command, response },\n timers,\n timeStampsRaw,\n );\n if (!multi) {\n delete this.commandsSent[trackingId];\n }\n }\n\n private pushStatToBuffer(\n type: TelemetryType,\n commandContent: any,\n computedTimers: ComputedTimers,\n timeStampsRaw?: TimeStampsRaw,\n ) {\n this.pushData({\n type,\n commandSequenceNumber: this.commandSequenceNumber++,\n commandContent,\n timeStampsRaw,\n computedTimers,\n });\n }\n\n private trackTime(command: any) {\n this.commandsSent[command.trackingId] = {\n timeStampJs: this.timeNow,\n command,\n };\n }\n\n private send(payload: Payload[]) {\n if (payload.length === 0 || (this.canSkipSending && payload.length < 10)) {\n return;\n }\n this.lastTime = this.timeNow;\n const out: TelemetryBatch = {\n appId: this.appId,\n sessionId: this.sessionId,\n viewId: this.viewId,\n userId: this.userId,\n ua: navigator.userAgent,\n timeStamp: new Date(this.timeNow).toString(),\n href: location.href,\n resolution: {\n width: window.screen.width,\n height: window.screen.height,\n pixelRatio: window.devicePixelRatio,\n },\n payload,\n };\n const lastIndex = payload[payload.length - 1].commandSequenceNumber;\n this.httpClient\n .post(this.unrealInitialConfig?.commandTelemetryReceiver || '', out)\n .subscribe(() => {\n this.payloads = this.payloads.filter(\n (p) => p.commandSequenceNumber > lastIndex,\n );\n });\n }\n\n /**\n * Listens for Unreal Engine callbacks.\n * Subscribes to the Unreal Engine event loop back and filters out events that do not have a tracking ID.\n * When a callback with a tracking ID is received,\n * it stops tracking the time for that command and filters out commands\n * that have exceeded the timeout limit.\n */\n private listenCallbacks() {\n fromSignal(UnrealInternalSignalEvents.UnrealCallback)\n .pipe(\n filter(({ json }) => {\n const callback =\n 'commandCallback' in json ? json.commandCallback : json;\n\n return Truthy(callback?.trackingId);\n }),\n )\n .subscribe(({ json }: any) => {\n const callback = json.commandCallback;\n const timeStampsRaw = json.timeStamp;\n const trackingId = callback?.trackingId || '';\n\n this.trackStopCommand(trackingId, timeStampsRaw);\n this.removeExileCommands();\n });\n }\n\n private pushData(payload: Payload) {\n this.payloads.push(payload);\n }\n\n /**\n * Removes commands that have exceeded the timeout limit.\n * Iterates over all the commands sent and checks if the difference between the current time\n * and the time the command was sent is greater than the timeout limit.\n * If it is, the command is marked for deletion.\n * After checking all commands, those marked for deletion are removed from the commands sent.\n * This method is used to ensure that commands that are not responded to within a certain time frame\n * do not remain in the commandsSent object indefinitely, which could lead to memory leaks over time.\n */\n private removeExileCommands() {\n const time: number = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries<CommandToSend>(this.commandsSent).forEach(\n ([trackingId, { timeStampJs }]) => {\n if (time - timeStampJs > this.exileTimout) {\n markForDelete.push(trackingId);\n }\n },\n );\n\n markForDelete.forEach((trackingId) => {\n delete this.commandsSent[trackingId];\n });\n }\n\n /**\n * Wraps the provided function with telemetry tracking.\n * Generates a unique tracking ID and adds it to the data object.\n * Pushes the command sent to the payloads with the tracking ID.\n * Starts tracking the time for the command.\n * Finally, calls the provided function with the modified data object.\n *\n * @param {IToBeDecorated} funcToDecorate - The function to be decorated with telemetry tracking.\n * @param {any} data - The data object to be passed to the function. It will be augmented with a unique tracking ID.\n */\n private wrapper(funcToDecorate: IToBeDecorated, data: any) {\n const out = { ...data, trackingId: generateUuid() };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer(\n 'commandSent',\n {\n ...out,\n trackingId: `${out.trackingId}`,\n },\n timers,\n );\n this.trackTime(out);\n funcToDecorate(out);\n }\n}\n\ntype IToBeDecorated = (data: any) => unknown;\n\ninterface TelemetryBatch {\n appId: string;\n sessionId: string;\n viewId: string;\n userId: string;\n ua: string;\n timeStamp: string;\n href: string;\n payload: Payload[];\n resolution: {\n width: number;\n height: number;\n pixelRatio: number;\n };\n}\n\ninterface Payload {\n type: TelemetryType;\n commandSequenceNumber: number;\n commandContent: any;\n timeStampsRaw?: TimeStampsRaw;\n computedTimers: ComputedTimers;\n}\n\ninterface TimeStampsRaw {\n timeStampPak: TimeStampPakCollection;\n timeStampCommand: TimeStampCommandCollection;\n}\n\ninterface TimeStampPakCollection {\n onLoadPak: TimeStampMemory;\n onRenderPak: TimeStampMemory;\n onSequencePak: TimeStampMemory;\n onSpawnPak: TimeStampMemory;\n}\n\ninterface TimeStampMemory {\n timestamp: number;\n ram: number;\n vRam: number;\n}\n\ninterface TimeStampCommandCollection {\n onRequestCommand: TimeStampMemory;\n onStartCommand: TimeStampMemory;\n onCompleteCommand: TimeStampMemory;\n}\n\ninterface ComputedTimers {\n unrealRoundTripTime: number;\n totalRoundTripTime: number;\n unrealExecutionDuration: number;\n sessionElapsedTime: number;\n timeDiffRequest: number;\n timeDiffCallBack: number;\n commandSentJsTime: number;\n}\n\nexport function TelemetryStart(externalId: string) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStart, { externalId });\n}\n\nexport function TelemetryStop(externalId: string, payload?: any) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStop, { externalId, payload });\n}\n\nexport function ResetTelemetry() {\n sendSignal(UnrealInternalSignalEvents.TelemetryReset);\n}\n\ninterface CommandToSend {\n timeStampJs: number;\n command: { trackingId: string };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Observable } from 'rxjs';\nimport { from, of, switchMap } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { Semaphore } from '@3dsource/utils';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\n\n@Injectable()\nexport class RegionsPingService {\n private httpClient = inject(HttpClient);\n private unrealInitialConfig = inject(UNREAL_CONFIG, { 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 ): Observable<string | undefined> {\n return this.getProviders(regionListUrl).pipe(\n switchMap((providers: ProvidersData) => this.getPingResult(providers)),\n catchError(() => of(null)),\n map((data) => data?.region_code),\n );\n }\n\n public getPingResult(\n providers: ProvidersData,\n ): Observable<PingResult | null> {\n const regions = providers.regions;\n this.config.ping_timeout = providers.timeout || this.config.ping_timeout;\n\n return from(this.startPinging(regions));\n }\n\n public getProviders(\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 } finally {\n const latency = Math.round(performance.now() - startTime);\n pingResults.push(latency);\n }\n }\n return pingResults;\n }\n\n private async fetchWithTimeout(\n url: string,\n options: any = {},\n timeout: number,\n ) {\n const controller = new AbortController();\n options.signal = controller.signal;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\ninterface ProvidersData {\n timeout?: number;\n regions: Region[];\n}\n\ninterface Region {\n region_code: string;\n url: string;\n timeout?: number;\n}\n\ninterface PingResult {\n region_code: string | undefined;\n result: number[];\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n ResetTelemetry,\n TelemetryStart,\n TelemetryStop,\n} from './command-telemetry.service';\nimport {\n combineLatest,\n merge,\n retryWhen,\n share,\n skip,\n Subject,\n switchMap,\n timeout,\n} from 'rxjs';\nimport { delay, filter, first, map, takeUntil, tap } from 'rxjs/operators';\nimport {\n initSignalling,\n setAwsInstance,\n setErrorMessage,\n setEstablishingConnection,\n setStatusMessage,\n setStatusPercentSignallingServer,\n} from '../store/unreal.actions';\nimport { HttpClient } from '@angular/common/http';\nimport { SubService } from './sub.service';\nimport { UnrealStatusMessage } from '../constants/UnrealStatusMessage';\nimport { unrealFeature } from '../store/unreal.feature';\nimport type { CloseReason } from '../interfaces/CloseReason';\nimport {\n COLOR_CODES,\n Falsy,\n generateUuid,\n Logger,\n tapLog,\n Truthy,\n} from '@3dsource/utils';\nimport {\n selectIsAutostart,\n selectMatchUrls,\n selectWsUrl,\n} from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport type {\n ConfigMessage,\n MessageBase,\n PollingOrchestrationMessage,\n SignalingMessageHandler,\n SignalingMessageMap,\n} from '../interfaces/SignalingMessage';\nimport { ConfigHandler } from '../helpers/FromStreamerHandlers/ConfigHandler';\nimport { AnswerHandler } from '../helpers/FromStreamerHandlers/AnswerHandler';\nimport { IceCandidateHandler } from '../helpers/FromStreamerHandlers/IceCandidateHandler';\nimport { SSInfoHandler } from '../helpers/FromStreamerHandlers/SSInfoHandler';\nimport { InstanceReadyHandler } from '../helpers/FromStreamerHandlers/InstanceReadyHandler';\nimport { InstanceReservedHandler } from '../helpers/FromStreamerHandlers/InstanceReservedHandler';\nimport { PingHandler } from '../helpers/FromStreamerHandlers/PingHandler';\nimport { OnOpenHandler } from '../helpers/WsHandlers/OpenHandler';\nimport { OnCloseHandler } from '../helpers/WsHandlers/OnCloseHandler';\nimport { OnErrorHandler } from '../helpers/WsHandlers/OnErrorHandler';\nimport { OnMessageHandler } from '../helpers/WsHandlers/OnMessageHandler';\nimport { PlayerCountHandler } from '../helpers/FromStreamerHandlers/PlayerCountHandler';\nimport { getActiveUrl } from '../helpers/GetNextUrl';\nimport { RegionsPingService } from '../services/regions-ping.service';\nimport { WSCloseCode_NORMAL_CLOSURE } from '../interfaces/CustomCloseCodes';\nimport { WS_OPEN_STATE, WS_TIMEOUT } from '../constants/unreal.constant';\n\n@Injectable()\nexport class SignallingService extends SubService {\n private readonly httpClient = inject(HttpClient);\n private readonly regionsPingService = inject(RegionsPingService);\n onConfig$ = new Subject<ConfigMessage>();\n onWebRtcIce$ = new Subject<RTCIceCandidate>();\n onWebRtcAnswer$ = new Subject<RTCSessionDescriptionInit | null>();\n\n private ws!: WebSocket;\n protected wsTimeoutHandler!: ReturnType<typeof setTimeout>;\n\n private wsMsgHandlers: Partial<{\n [K in keyof SignalingMessageMap]: SignalingMessageHandler<K>;\n }> = {};\n\n protected correlationId!: string;\n protected environmentId!: string;\n\n private establishingConnection = toSignal(\n this.store.select(unrealFeature.selectEstablishingConnection),\n );\n private isCirrusConnected = toSignal(\n this.store.select(unrealFeature.selectCirrusConnected),\n );\n private establishingConnectionDrop$ = this.store\n .select(unrealFeature.selectEstablishingConnection)\n .pipe(\n skip(1),\n filter(Falsy),\n tapLog('selectEstablishingConnection'),\n share(),\n );\n\n constructor() {\n super();\n this.setHandlersFromStream();\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy))\n .subscribe(() => {\n this.send(\n JSON.stringify({\n type: 'p2pEstablished',\n source: 'front',\n sessionId: generateUuid(),\n }),\n );\n });\n\n combineLatest([\n this.store\n .select(selectMatchUrls)\n .pipe(tapLog('MatchMakerUrls changed:')),\n this.store.select(selectIsAutostart).pipe(tapLog('Autostart is:')),\n ])\n .pipe(\n filter(([, autoStart]) => autoStart),\n map(([matchMakerUrls]) => [...matchMakerUrls].filter(Truthy)),\n filter((urls) => urls.length > 0),\n )\n .subscribe((urls) => this.connectToSignaling(urls));\n\n this.store\n .select(selectWsUrl)\n .pipe(filter(Truthy))\n .subscribe((url) => {\n this.initWebSocket(url);\n });\n }\n\n protected initEstablishingConnection() {\n this.showStatusMessage(UnrealStatusMessage.STARTING_YOUR_SESSION);\n this.store.dispatch(setEstablishingConnection({ value: true }));\n }\n\n private stopEstablishingConnection() {\n this.store.dispatch(setEstablishingConnection({ value: false }));\n }\n\n private connectToSignaling(urlList: string[]) {\n // Preparation for WebSocket Orchestration\n this.correlationId = generateUuid();\n this.environmentId = '7e356e8d-8fa5-4cf7-83d0-394903e7b0d6';\n\n ResetTelemetry();\n if (this.establishingConnection() || this.isCirrusConnected()) {\n Logger.warn(\n `SIGNALING REQUEST can't be called again!. Waiting for connection or error.`,\n );\n return;\n }\n\n this.initEstablishingConnection();\n this.regionsPingService\n .getFastest()\n .pipe(first())\n .subscribe((region) => {\n const out = urlList.map((url) => {\n if (region && !url.includes(':region')) {\n return url.replace(\n /signallingserver/gi,\n `signallingserver/region:${region}`,\n );\n }\n return url;\n });\n this.connectToSignalingAfterPing(out);\n });\n }\n\n private connectToSignalingAfterPing(urls: string[]): void {\n const urlGen = getActiveUrl(urls);\n\n TelemetryStart('getSignaling');\n\n const createSubscription = () => {\n const signalingUrl = `${urlGen.next().value}`;\n\n if (signalingUrl.match(/^ws(s?):\\/\\//i)) {\n this.store.dispatch(\n setAwsInstance({\n wsUrl: signalingUrl,\n pollingUrl: null,\n instanceName: null,\n }),\n );\n\n return;\n }\n\n const subscription = combineLatest([\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ])\n .pipe(\n filter(([clientId, viewId]) => !!clientId && !!viewId),\n tapLog('Stream Id =>'),\n switchMap(([clientId, viewId]) =>\n this.httpClient.get(`${signalingUrl}${clientId}/${viewId}`),\n ),\n timeout(4000),\n filter((data: PollingOrchestrationMessage) => {\n TelemetryStop('getSignaling', { ...data, multi: true });\n\n if (data.signallingServer === '' || data.error) {\n this.showStatusMessage(data?.mm_message || 'Server not found');\n\n if (data?.info) {\n this.store.dispatch(\n setStatusPercentSignallingServer({\n percent: data.info.percent,\n }),\n );\n }\n\n throw new Error('Invalid Value');\n }\n\n this.store.dispatch(\n setStatusPercentSignallingServer({ percent: 100 }),\n );\n\n return true;\n }),\n retryWhen((error) =>\n error.pipe(\n tap(() =>\n this.showStatusMessage(\n UnrealStatusMessage.CONNECTING_TO_SESSION,\n ),\n ),\n tap(() => Logger.log('Retrying with new URL')),\n delay(4000),\n tap(() => {\n // Unsubscribe the previous subscription and create a new one\n subscription.unsubscribe();\n createSubscription();\n }),\n ),\n ),\n takeUntil(merge(this.disconnect$, this.establishingConnectionDrop$)),\n )\n .subscribe((data: PollingOrchestrationMessage) => {\n subscription.unsubscribe();\n const wsProtocol = location.protocol.match(/https/i) ? 'wss' : 'ws';\n const wsUrl = `${wsProtocol}://${data.signallingServer}`;\n this.store.dispatch(\n setAwsInstance({\n wsUrl,\n pollingUrl: signalingUrl,\n instanceName: data.signallingServer!,\n }),\n );\n });\n };\n createSubscription();\n }\n\n showStatusMessage(message: string | null) {\n this.store.dispatch(setStatusMessage({ message }));\n }\n\n /**\n * Close the connection with the signaling server\n * @param data\n */\n close(data: CloseReason | void) {\n const { code, reason } = data || {\n code: WSCloseCode_NORMAL_CLOSURE,\n reason: 'NoReason',\n };\n if (this.ws) Logger.warn('Closing existing WebSocket connection');\n this.ws?.close(code, reason);\n this.ws = null as never;\n }\n\n send(data: string | object) {\n let dataString = data;\n if (typeof dataString !== 'string') {\n dataString = JSON.stringify(data);\n }\n if (this.ws && this.ws.readyState === WS_OPEN_STATE) {\n try {\n Logger.colored(...COLOR_CODES.TO_CIRRUS, JSON.parse(data as string));\n } catch {\n Logger.colored(...COLOR_CODES.TO_CIRRUS, data);\n }\n try {\n this.ws.send(dataString);\n } catch {\n Logger.error('No Websocket');\n }\n }\n }\n\n protected watchTimeoutOrErrorAndReconnectLater() {\n this.stopRetryTimer();\n this.wsTimeoutHandler = setTimeout(() => {\n Logger.warn('No WS Response, retrying new signaling');\n this.showStatusMessage(UnrealStatusMessage.CONNECTING_TO_SESSION);\n this.stopEstablishingConnection();\n this.store.dispatch(initSignalling());\n }, WS_TIMEOUT);\n }\n\n protected stopRetryTimer() {\n clearTimeout(this.wsTimeoutHandler);\n }\n\n private initWebSocket(url: string) {\n if (!window?.['WebSocket']) {\n alert(\"Your browser doesn't support WebSocket\");\n return;\n }\n\n this.clearWs();\n const wsUrl = this.httpUrlToWs(url);\n\n Logger.info('Creating socket', wsUrl);\n try {\n this.ws = new WebSocket(wsUrl);\n } catch (error) {\n this.ws = {} as WebSocket;\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebSocketError',\n message: 'WebSocket Error',\n }),\n );\n Logger.error('Error creating WebSocket', error);\n }\n\n this.ws.onmessage = OnMessageHandler.bind(this);\n this.ws.onerror = OnErrorHandler.bind(this);\n this.ws.onclose = OnCloseHandler.bind(this);\n this.ws.onopen = OnOpenHandler.bind(this);\n this.watchTimeoutOrErrorAndReconnectLater();\n TelemetryStart('iceCandidate');\n }\n\n private httpUrlToWs(url: string) {\n return url.replace('http://', 'ws://').replace('https://', 'wss://');\n }\n\n private clearWs() {\n this.onWebRtcAnswer$.next(null);\n if (this.ws) {\n this.ws.onmessage = () => null;\n this.ws.onerror = () => null;\n this.ws.onclose = () => null;\n this.ws.onopen = () => null;\n this.ws = null as never;\n }\n }\n\n protected handleMessage(msg: MessageBase) {\n try {\n Logger.colored(...COLOR_CODES.FROM_CIRRUS, msg);\n this.wsMsgHandlers[msg.type]!(msg as never);\n } catch {\n Logger.colored(\n ...COLOR_CODES.FROM_CIRRUS_ERROR,\n `Invalid CIRRUS message type: ${msg.type}`,\n );\n }\n }\n\n private setHandlersFromStream() {\n this.wsMsgHandlers.ping = PingHandler.bind(this);\n this.wsMsgHandlers.config = ConfigHandler.bind(this);\n this.wsMsgHandlers.answer = AnswerHandler.bind(this);\n this.wsMsgHandlers.ssInfo = SSInfoHandler.bind(this);\n this.wsMsgHandlers.playerCount = PlayerCountHandler.bind(this);\n this.wsMsgHandlers.iceCandidate = IceCandidateHandler.bind(this);\n this.wsMsgHandlers.instanceReady = InstanceReadyHandler.bind(this);\n this.wsMsgHandlers.instanceReserved = InstanceReservedHandler.bind(this);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { fromEvent, share, Subject, tap } from 'rxjs';\nimport { filter, first, map, takeUntil } from 'rxjs/operators';\nimport {\n destroyRemoteConnections,\n setDataChannelConnected,\n setErrorMessage,\n setStatusMessage,\n} from '../store/unreal.actions';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { TelemetryStart, TelemetryStop } from './command-telemetry.service';\nimport type { ConfigMessage } from '../interfaces/SignalingMessage';\nimport { DisconnectReason } from '../interfaces/disconnect-reasons';\n\n@Injectable()\nexport class WebRtcPlayerService extends SubService {\n pcClient!: RTCPeerConnection | null;\n onAudioTrack$ = new Subject<MediaStream>();\n onVideoTrack$ = new Subject<MediaStream>();\n onDataChannelMessage$ = new Subject<number[]>();\n onWebRtcCandidate$ = new Subject<RTCIceCandidate>();\n onWebRtcOffer$ = new Subject<RTCSessionDescriptionInit>();\n\n private cfg: RTCConfiguration = {};\n private useMic = false;\n private forceTURN = false;\n private preferSFU = false;\n private autoPlayAudio = true;\n private startVideoMuted = true;\n private forceMonoAudio = false;\n private forceMaxBundle = false;\n private dcClient!: RTCDataChannel | null;\n private sdpConstraints!: RTCOfferOptions;\n private dataChannelOptions!: { ordered: boolean };\n private webRtcErrorTimeout!: ReturnType<typeof setTimeout>;\n\n async createWebRtcOffer(): Promise<void> {\n Logger.info('Creating offer');\n let offer: void;\n try {\n clearTimeout(this.webRtcErrorTimeout);\n offer = await this.createOffer(this.cfg);\n this.webRtcErrorTimeout = setTimeout(() => {\n if (this.pcClient?.connectionState?.match(/connecting|failed/gi)) {\n this.dispatchWebRtcError('WebRTCError: Timeout');\n }\n }, 10000);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n this.dispatchWebRtcError('WebRTCError: Offer Error');\n }\n\n return offer;\n }\n\n private dispatchWebRtcError(message: string) {\n Logger.error(message);\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebRTCError',\n message,\n }),\n );\n }\n\n private async createOffer(config: RTCConfiguration): Promise<void> {\n this.closePC();\n this.pcClient = new RTCPeerConnection(config);\n\n TelemetryStart('Browser ICE gathering');\n TelemetryStart('Browser ICE connection');\n TelemetryStart('Signaling state change');\n\n fromEvent(this.pcClient, 'signalingstatechange')\n .pipe(\n map(() => this.pcClient?.signalingState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Signaling state change] |', state, '|');\n TelemetryStop('Signaling state change', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'iceconnectionstatechange')\n .pipe(\n map(() => this.pcClient?.iceConnectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE connection] |', state, '|');\n TelemetryStop('Browser ICE connection', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'icegatheringstatechange')\n .pipe(\n map(() => this.pcClient?.iceGatheringState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE gathering] |', state, '|');\n TelemetryStop('Browser ICE gathering', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'connectionstatechange')\n .pipe(\n map(() => this.pcClient?.connectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[RTCPeerConnection state] |', state, '|');\n });\n\n fromEvent<RTCPeerConnectionIceEvent>(this.pcClient, 'icecandidate')\n .pipe(\n map((e: RTCPeerConnectionIceEvent) => e.candidate),\n filter(Truthy),\n tap((candidate: RTCIceCandidate) =>\n Logger.info(\n '[Browser ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n ),\n ),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onWebRtcCandidate$.next(data));\n\n fromEvent<RTCDataChannelEvent>(this.pcClient, 'datachannel')\n .pipe(\n tap(() =>\n Logger.info(\n 'Data channel created for us by browser as we are a receiving peer.',\n ),\n ),\n map((e: RTCDataChannelEvent) => e.channel),\n takeUntil(this.disconnect$),\n )\n .subscribe((datachannel) => {\n this.dcClient = this.setupDataChannelCallbacks(datachannel);\n });\n\n const onTrack$ = fromEvent<RTCTrackEvent>(this.pcClient, 'track').pipe(\n filter((e) => !!e.track),\n tap((e) =>\n Logger.info(\n 'Got track - ' +\n e.track.kind +\n ' id=' +\n e.track.id +\n ' readyState=' +\n e.track.readyState,\n ),\n ),\n share(),\n );\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'audio'),\n map((e) => e.streams[0]),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onAudioTrack$.next(data));\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'video'),\n map((e) => e.streams[0]),\n tap(() => Logger.info('Set video source from video track ontrack.')),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onVideoTrack$.next(data));\n\n await this.setupTransceiversAsync(this.pcClient);\n this.dcClient = this.createDataChannel(\n this.pcClient,\n 'cirrus',\n this.dataChannelOptions,\n );\n\n this.disconnect$.pipe(first()).subscribe(() => {\n this.closePC();\n });\n\n await this.handleCreateOffer();\n }\n\n createDataChannel(\n pc: RTCPeerConnection,\n label: string,\n options: RTCDataChannelInit,\n ) {\n // This is the primary data channel code path when we are \"offering\"\n Logger.info(`[DATACHANNEL] Creating datachannel primary (${label})...`);\n const datachannel = pc.createDataChannel(label, options);\n return this.setupDataChannelCallbacks(datachannel);\n }\n\n private async setupTransceiversAsync(pc: RTCPeerConnection): Promise<void> {\n const hasTransceivers = pc.getTransceivers().length > 0;\n\n // Setup a transceiver for getting UE video\n pc.addTransceiver('video', { direction: 'recvonly' });\n\n // Setup a transceiver for sending mic audio to UE and receiving audio from UE\n if (!this.useMic) {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n } else {\n const audioSendOptions = this.useMic\n ? {\n autoGainControl: false,\n channelCount: 1,\n echoCancellation: false,\n latency: 0,\n noiseSuppression: false,\n sampleRate: 48000,\n sampleSize: 16,\n volume: 1.0,\n }\n : false;\n\n // Note using mic on android chrome requires SSL or chrome://flags/ \"unsafely-treat-insecure-origin-as-secure\"\n const stream = await navigator.mediaDevices.getUserMedia({\n video: false,\n audio: audioSendOptions,\n });\n if (stream) {\n if (hasTransceivers) {\n for (const transceiver of pc.getTransceivers()) {\n if (\n transceiver &&\n transceiver.receiver &&\n transceiver.receiver.track &&\n transceiver.receiver.track.kind === 'audio'\n ) {\n for (const track of stream.getTracks()) {\n // eslint-disable-next-line eqeqeq\n if (track.kind && track.kind == 'audio') {\n transceiver.sender.replaceTrack(track);\n transceiver.direction = 'sendrecv';\n }\n }\n }\n }\n } else {\n for (const track of stream.getTracks()) {\n // eslint-disable-next-line eqeqeq\n if (track.kind && track.kind == 'audio') {\n pc.addTransceiver(track, { direction: 'sendrecv' });\n }\n }\n }\n } else {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n }\n }\n }\n\n private setupDataChannelCallbacks(\n datachannel: RTCDataChannel,\n ): RTCDataChannel | null {\n try {\n TelemetryStart('DataChannel Connection');\n // Inform browser we would like binary data as an ArrayBuffer (FF chooses Blob by default!)\n datachannel.binaryType = 'arraybuffer';\n\n fromEvent(datachannel, 'close')\n .pipe(first())\n .subscribe((e) => {\n Logger.warn(\n `[DATACHANNEL] Data channel disconnected: ${datachannel.label}(${datachannel.id})`,\n e,\n );\n\n this.store.dispatch(\n destroyRemoteConnections({\n disconnectReason: DisconnectReason.dataChannelClosed,\n }),\n );\n });\n\n fromEvent(datachannel, 'error')\n .pipe(takeUntil(this.disconnect$))\n .subscribe((e) => {\n const message = `[DATACHANNEL] Data channel error: ${datachannel.label}(${datachannel.id})`;\n Logger.error(message, e);\n });\n\n fromEvent(datachannel, 'open')\n .pipe(\n tap(() => {\n Logger.info(\n `[DATACHANNEL] Data channel connected: ${datachannel.label}(${datachannel.id})`,\n );\n }),\n takeUntil(this.disconnect$),\n )\n .subscribe(() => {\n TelemetryStop('DataChannel Connection');\n this.onDataChannelConnected();\n });\n\n fromEvent<MessageEvent>(datachannel, 'message')\n .pipe(\n map((e: MessageEvent) => e.data),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onDataChannelMessage$.next(data));\n\n return datachannel;\n } catch (e) {\n Logger.warn('[DATACHANNEL] Datachannel setup caused an exception: ', e);\n return null;\n }\n }\n\n private onDataChannelConnected() {\n let text = 'Session connected, video stream starting.';\n if (navigator.userAgent.includes('Firefox')) {\n text +=\n '\\n If you are experiencing connection problems please try Google Chrome';\n }\n this.store.dispatch(setStatusMessage({ message: text }));\n this.store.dispatch(setDataChannelConnected({ value: true }));\n }\n\n private async handleCreateOffer(): Promise<void> {\n try {\n const offer = await this.pcClient!.createOffer(this.sdpConstraints);\n this.mungeSDP(offer);\n this.pcClient?.setLocalDescription(offer);\n this.onWebRtcOffer$.next(offer);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n Logger.error(\"Couldn't create offer\");\n }\n }\n\n receiveAnswer(answer: RTCSessionDescriptionInit) {\n this.pcClient?.setRemoteDescription(answer);\n }\n\n handleCandidateFromServer(iceCandidate: RTCIceCandidate) {\n try {\n const candidate = new RTCIceCandidate(iceCandidate);\n Logger.info(\n '[Unreal ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n\n // if forcing TURN, reject any candidates not relay\n if (this.forceTURN) {\n // check if no relay address is found, if so, we are assuming it means no TURN server\n if (candidate.candidate.indexOf('relay') < 0) {\n Logger.warn(\n 'Dropping candidate because it was not TURN relay.',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n return;\n }\n }\n this.pcClient?.addIceCandidate(candidate).catch(function () {\n // Logger.error('Failed to add ICE candidate', e);\n });\n } catch (e) {\n Logger.error('Error handleCandidateFromServer', e);\n }\n }\n\n mungeSDP(offer: RTCSessionDescriptionInit): void {\n let audioSDP = '';\n\n // set max bitrate to highest bitrate Opus supports\n audioSDP += 'maxaveragebitrate=510000;';\n\n if (this.useMic) {\n // set the max capture rate to 48khz (so we can send high quality audio from mic)\n audioSDP += 'sprop-maxcapturerate=48000;';\n }\n\n // Force mono or stereo based on whether ?forceMono was passed or not\n audioSDP += this.forceMonoAudio\n ? 'sprop-stereo=0;stereo=0;'\n : 'sprop-stereo=1;stereo=1;';\n\n // enable in-band forward error correction for opus audio\n audioSDP += 'useinbandfec=1';\n\n // We use the line 'useinbandfec=1' (which Opus uses) to set our Opus specific audio parameters.\n offer.sdp = offer.sdp?.replace('useinbandfec=1', audioSDP);\n }\n\n /**\n * Closes existing PeerConnection\n */\n closePC(): void {\n if (this.pcClient) Logger.warn('Closing existing PeerConnection');\n this.pcClient?.close();\n this.pcClient = null;\n }\n\n canSend() {\n return this.dcClient && this.dcClient.readyState === 'open';\n }\n\n send(data: ArrayBuffer): void {\n if (this.canSend()) {\n this.dcClient!.send(data);\n } else {\n throw new Error('data channel is not prepared!');\n }\n }\n\n setConfig(parOptions: ConfigMessage = {} as ConfigMessage): void {\n const urlParams = new URLSearchParams(window.location.search);\n\n //**********************\n //Config setup\n //**********************\n this.cfg =\n typeof parOptions.peerConnectionOptions !== 'undefined'\n ? parOptions.peerConnectionOptions\n : {};\n //this.cfg.sdpSemantics = 'unified-plan';\n\n // If this is true in Chrome 89+ SDP is sent that is incompatible with UE Pixel Streaming 4.26 and below.\n // However 4.27 Pixel Streaming does not need this set to false as it supports `offerExtmapAllowMixed`.\n // tdlr; uncomment this line for older versions of Pixel Streaming that need Chrome 89+.\n //this.cfg.offerExtmapAllowMixed = false;\n\n this.forceTURN = urlParams.has('ForceTURN');\n if (this.forceTURN) {\n Logger.info(\n 'Forcing TURN usage by setting ICE Transport Policy in peer connection config.',\n );\n this.cfg.iceTransportPolicy = 'relay';\n }\n\n this.cfg.bundlePolicy = 'balanced';\n this.forceMaxBundle = urlParams.has('ForceMaxBundle');\n if (this.forceMaxBundle) {\n this.cfg.bundlePolicy = 'max-bundle';\n }\n\n //**********************\n //Variables\n //**********************\n this.pcClient = null;\n this.dcClient = null;\n\n this.sdpConstraints = {\n offerToReceiveAudio: false, //Note: if you don't need audio you can get improved latency by turning this off.\n offerToReceiveVideo: true,\n };\n\n // See https://www.w3.org/TR/webrtc/#dom-rtcdatachannelinit for values (this is needed for Firefox to be consistent with Chrome.)\n this.dataChannelOptions = { ordered: true };\n\n // This is useful if the video/audio needs to autoplay (without user input) as browsers do not allow autoplay non-muted of sound sources without user interaction.\n this.startVideoMuted =\n typeof parOptions?.['startVideoMuted'] !== 'undefined'\n ? !!parOptions?.['startVideoMuted']\n : false;\n this.autoPlayAudio =\n typeof parOptions?.['autoPlayAudio'] !== 'undefined'\n ? !!parOptions?.['autoPlayAudio']\n : true;\n\n // To force mono playback of WebRTC audio\n this.forceMonoAudio = urlParams.has('ForceMonoAudio');\n if (this.forceMonoAudio) {\n Logger.info(\n 'Will attempt to force mono audio by munging the sdp in the browser.',\n );\n }\n\n // To enable mic in browser use SSL/localhost and have ?useMic in the query string.\n this.useMic = urlParams.has('useMic');\n if (!this.useMic) {\n Logger.info(\n 'Microphone access is not enabled. Pass ?useMic in the url to enable it.',\n );\n }\n // When ?useMic check for SSL or localhost\n const isLocalhostConnection =\n location.hostname === 'localhost' || location.hostname === '127.0.0.1';\n const isHttpsConnection = location.protocol === 'https:';\n if (this.useMic && !isLocalhostConnection && !isHttpsConnection) {\n this.useMic = false;\n Logger.error(\n 'Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access.',\n );\n Logger.error(\n \"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'\",\n );\n }\n\n // Prefer SFU or P2P connection\n this.preferSFU = urlParams.has('preferSFU');\n Logger.info(\n this.preferSFU\n ? 'The browser will signal it would prefer an SFU connection. Remove ?preferSFU from the url to signal for P2P usage.'\n : 'The browser will signal for a P2P connection. Pass ?preferSFU in the url to signal for SFU usage.',\n );\n }\n}\n","import { DataFlowMonitor } from '../../helpers/DataFlowMonitor';\n\nexport interface FilterSettings {\n /**\n * Minimum number of kilobits per second to trigger low bandwidth\n */\n minimumBitrate: number;\n /**\n * Amount of a percentage drop to trigger a yellow warning\n */\n\n yellowFlag: number;\n\n /**\n * Amount of a percentage drop to trigger a red warning\n */\n redFlag: number;\n\n /**\n * Minimum number of frames per second to trigger low bandwidth\n */\n minimumFps: number;\n\n /**\n * Time to wait before checking if we can switch to low bandwidth\n */\n monitoringDelayTime: number;\n\n // initial guess in kbps\n initialBitrateEstimate: number;\n\n // initial error covariance\n initialErrorCovariance: number;\n\n // Q: how much we expect the bitrate to change between measurements\n processNoise: number;\n\n // R: variance of measurement noise\n measurementNoise: number;\n\n panelOpen: boolean;\n}\n\n/**\n * Default LBM Filter Parameters\n */\nexport const DefaultFilterModel: FilterSettings = {\n minimumBitrate: 1600,\n yellowFlag: 30,\n redFlag: 50,\n minimumFps: 5,\n monitoringDelayTime: 5000,\n initialBitrateEstimate: 1600,\n initialErrorCovariance: 1,\n processNoise: 3,\n measurementNoise: 500,\n panelOpen: false,\n} as const;\n\n/**\n * Global LBM Filter Parameters\n */\nexport const FilterModel = { ...DefaultFilterModel };\n\n/**\n * Bitrate Monitor Static Class\n */\nexport const BITRATE_MONITOR = new DataFlowMonitor(\n FilterModel.yellowFlag,\n FilterModel.redFlag,\n 20,\n);\n","import type {\n IAggregatedStat,\n InboundVideoStats,\n} from '../interfaces/unreal-internal-signal-events.interface';\nimport { inject, Injectable } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { from, interval, share } from 'rxjs';\nimport { filter, switchMap } from 'rxjs/operators';\nimport { LatencyTimings } from '../helpers/LatencyTimings';\nimport { SubService } from './sub.service';\nimport { Signal, Truthy } from '@3dsource/utils';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { mapQpToQuality } from '../helpers/mapQpToQuality';\nimport { KalmanFilter1D } from '../helpers/KalmanFilter1D';\nimport {\n BITRATE_MONITOR,\n FilterModel,\n} from '../components/low-bandwidth-indicator/DataFlowConstants';\n\n@Injectable()\nexport class VideoStreamStatusService extends SubService {\n readonly latencyTestTimings = new LatencyTimings();\n private readonly webrtcPlayer = inject(WebRtcPlayerService);\n private aggregatedStats: InboundVideoStats = {} as InboundVideoStats;\n private VideoEncoderQP = 0;\n private kalmanFilter1D = new KalmanFilter1D(\n FilterModel.initialBitrateEstimate,\n FilterModel.initialErrorCovariance,\n FilterModel.processNoise,\n FilterModel.measurementNoise,\n );\n readonly videoStats$: Observable<IAggregatedStat> = this.aggregateStats();\n\n constructor() {\n super();\n Signal.on('setKalmanParams').subscribe((data) => {\n this.kalmanFilter1D.config(data);\n BITRATE_MONITOR.config(data);\n });\n }\n\n /**\n * Aggregate video stats and emit it as videoStats$\n */\n private aggregateStats() {\n return this.webrtcPlayer.onVideoTrack$.pipe(\n // IMPORTANT! DO NOT CHANGE THOSE NUMBERS, LBM Stats are based on those values\n switchMap(() => interval(250)),\n switchMap(() => from(this.getStats(this.webrtcPlayer.pcClient))),\n filter(Truthy),\n share(),\n );\n }\n\n setEncoder(data: any) {\n this.VideoEncoderQP = Number(new TextDecoder('utf-16').decode(data));\n }\n\n private async getStats(\n pcClient: RTCPeerConnection | null,\n ): Promise<IAggregatedStat | null> {\n if (!pcClient) {\n return null;\n }\n\n const stats = await pcClient.getStats(null);\n\n return this.generateAggregatedStatsFunction(stats);\n }\n\n private generateAggregatedStatsFunction(\n stats: RTCStatsReport,\n ): IAggregatedStat {\n const newStat: InboundVideoStats = {} as InboundVideoStats;\n\n // store each type of codec we can get stats on\n newStat.codecs = {};\n newStat.currentRoundTripTime = -1;\n\n stats.forEach((stat) => {\n // Get the inbound-rtp for video\n if (stat.type === 'inbound-rtp' && stat.kind === 'video') {\n Object.assign(newStat, stat);\n\n newStat.bytesReceivedStart =\n this.aggregatedStats && this.aggregatedStats.bytesReceivedStart\n ? this.aggregatedStats.bytesReceivedStart\n : stat.bytesReceived;\n\n newStat.framesDecodedStart =\n this.aggregatedStats && this.aggregatedStats.framesDecodedStart\n ? this.aggregatedStats.framesDecodedStart\n : stat.framesDecoded;\n\n newStat.timestampStart =\n this.aggregatedStats && this.aggregatedStats.timestampStart\n ? this.aggregatedStats.timestampStart\n : stat.timestamp;\n\n if (this.aggregatedStats && this.aggregatedStats.timestamp) {\n // Get the mimetype of the video codec being used\n if (\n stat.codecId &&\n this.aggregatedStats.codecs &&\n Object.hasOwn(this.aggregatedStats.codecs, stat.codecId)\n ) {\n newStat.videoCodec = this.aggregatedStats.codecs[stat.codecId];\n }\n\n if (this.aggregatedStats.bytesReceived) {\n // bitrate = bits received since last time / number of ms since last time\n // This is automatically in kbits (where k=1000) since time is in ms and stat we want is in seconds (so a '* 1000' then a '/ 1000' would negate each other)\n newStat.bitrate = Math.floor(\n (8 *\n (newStat.bytesReceived! - this.aggregatedStats.bytesReceived)) /\n (newStat.timestamp - this.aggregatedStats.timestamp),\n );\n }\n\n if (this.aggregatedStats.bytesReceivedStart) {\n newStat.avgBitrate = Math.floor(\n (8 *\n (newStat?.bytesReceived! -\n this.aggregatedStats.bytesReceivedStart)) /\n (newStat.timestamp - this.aggregatedStats.timestampStart),\n );\n }\n\n if (this.aggregatedStats.framesDecodedStart) {\n newStat.avgFrameRate = Math.floor(\n (newStat.framesDecoded! -\n this.aggregatedStats.framesDecodedStart) /\n ((newStat.timestamp - this.aggregatedStats.timestampStart) /\n 1000),\n );\n }\n }\n }\n\n if (\n stat.type === 'candidate-pair' &&\n Object.hasOwn(stat, 'currentRoundTripTime')\n ) {\n newStat.currentRoundTripTime = stat.currentRoundTripTime ?? 0;\n }\n\n // Store mimetype of each codec\n if (\n Object.hasOwn(newStat, 'codecs') &&\n stat.type === 'codec' &&\n stat.mimeType &&\n stat.id\n ) {\n const codecId = stat.id;\n newStat.codecs[codecId] = stat.mimeType\n .replace('video/', '')\n .replace('audio/', '');\n }\n });\n\n newStat.pixelRatio = +window.devicePixelRatio.toFixed(2);\n if (this.aggregatedStats.receiveToCompositeMs) {\n newStat.receiveToCompositeMs = this.aggregatedStats.receiveToCompositeMs;\n this.latencyTestTimings.SetFrameDisplayDeltaTime(\n this.aggregatedStats.receiveToCompositeMs,\n );\n }\n\n // Calculate duration of run\n newStat.runTime = Math.floor(\n (newStat.timestamp - newStat.timestampStart) / 1000,\n );\n newStat.kalmanBitrate = Math.floor(\n this.kalmanFilter1D.update(\n newStat.bitrate || FilterModel.initialBitrateEstimate,\n ),\n );\n\n newStat.dataFlowCheckResult = BITRATE_MONITOR.addValue(\n newStat.kalmanBitrate,\n );\n\n newStat.bitrateDrop = Math.floor(\n newStat.dataFlowCheckResult.dropPercentage,\n );\n this.aggregatedStats = newStat;\n return this.onAggregatedStats(newStat);\n }\n\n private onAggregatedStats(aggregatedStats: InboundVideoStats) {\n return {\n quality: mapQpToQuality(this.VideoEncoderQP),\n\n aggregatedStats: {\n ...aggregatedStats,\n VideoEncoderQP: this.VideoEncoderQP,\n },\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { distinctUntilChanged, filter, withLatestFrom } from 'rxjs/operators';\nimport { EControlSchemeType } from '../constants/EControlSchemeType';\nimport { Truthy } from '@3dsource/utils';\nimport { InputOptions } from '../constants/InputOptions';\nimport { SubService } from './sub.service';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { selectWarnTimeout } from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\nimport { destroyConnectionsAndResetState } from '../store/unreal.actions';\nimport { DEFAULT_TIMEOUT_PERIOD } from '../constants';\n\n@Injectable()\nexport class AFKService extends SubService {\n // Optionally detect if the user is not interacting (AFK) and disconnect them.\n private enabled = true; // Set to true to enable the AFK system.\n private closeTimeout = DEFAULT_TIMEOUT_PERIOD; // The time after the warning when we disconnect the user.\n private active = false; // Whether the AFK system is currently looking for inactivity.\n private warnTimer!: ReturnType<typeof setTimeout>; // The timer which waits to show the inactivity warning overlay.\n private countdown = 0; // The inactivity warning overlay has a countdown to show time until disconnect.\n private countdownTimer!: ReturnType<typeof setTimeout>; // The timer used to tick the seconds shown on the inactivity warning overlay.\n private selectWarnTimeout = toSignal(this.store.select(selectWarnTimeout));\n\n constructor() {\n super();\n this.initAfk();\n }\n\n initAfk() {\n merge(\n this.store.select(selectWarnTimeout),\n fromSignal(UnrealInternalSignalEvents.RestAfkTimer),\n )\n .pipe(\n withLatestFrom(this.store.select(unrealFeature.selectViewportReady)),\n filter(([, viewportReady]) => viewportReady),\n )\n .subscribe(() => this.resetAfkWarningTimer());\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(distinctUntilChanged(), filter(Truthy))\n .subscribe(() => this.startAfkWarningTimer());\n this.disconnect$.subscribe(() => this.stop());\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\n\n private hideOverlay() {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay);\n }\n\n /**\n * Start a timer which when elapsed will warn the user they are inactive.\n */\n private startAfkWarningTimer() {\n this.active = this.enabled;\n this.resetAfkWarningTimer();\n }\n\n /**\n * If the user interacts, then reset the warning timer.\n */\n private resetAfkWarningTimer() {\n if (this.active) {\n this.stop();\n this.warnTimer = setTimeout(() => {\n this.showAfkOverlay();\n }, this.selectWarnTimeout()! * 1000);\n }\n }\n\n /**\n * Update the count-down spans number for the overlay\n * @param countdown the count down number to be inserted into the span for updating\n */\n private updateCountDown(countdown: number) {\n this.dispatchMessage(String(countdown));\n }\n\n /**\n * Update the text overlays inner text\n * @param message the update text to be inserted into the overlay\n */\n private dispatchMessage(message: string) {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay, {\n message,\n isActivityDetected: true,\n className: 'clickableState',\n onOverlayClick: () => this.reset(),\n });\n }\n\n private stop() {\n clearInterval(this.countdownTimer);\n clearTimeout(this.warnTimer);\n this.hideOverlay();\n }\n\n private reset() {\n this.hideOverlay();\n clearInterval(this.countdownTimer);\n this.startAfkWarningTimer();\n }\n\n private showAfkOverlay() {\n // Pause the timer while the user is looking at the inactivity warning overlay.\n this.active = false;\n this.countdown = this.closeTimeout;\n this.updateCountDown(this.countdown);\n\n if (InputOptions.controlScheme == EControlSchemeType.LockedMouse) {\n document.exitPointerLock();\n }\n\n this.countdownTimer = setInterval(() => {\n this.countdown--;\n if (this.countdown === 0) {\n // The user failed to click so disconnect them\n this.hideOverlay();\n // TODO possible way (Blinking), because postponed close event: destroyRemoteConnections({ disconnectReason: DisconnectReason.afk }),\n this.store.dispatch(destroyConnectionsAndResetState());\n clearInterval(this.countdownTimer);\n } else {\n this.updateCountDown(this.countdown);\n }\n }, 1000);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Truthy } from '@3dsource/utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DevModeService {\n get isDevMode() {\n return Truthy(localStorage.getItem('devMode'));\n }\n setDevMode(value: boolean) {\n return localStorage.setItem('devMode', value.toString());\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n changeLowBandwidth,\n destroyConnectionsAndResetState,\n setConfig,\n setMaxFps,\n} from '../store/unreal.actions';\nimport { of, switchMap } from 'rxjs';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { HttpClient } from '@angular/common/http';\nimport { Logger, tapLog } from '@3dsource/utils';\nimport { catchError, filter, first } from 'rxjs/operators';\nimport { SubService } from '../services/sub.service';\nimport { DevModeService } from '../services/dev-mode.service';\n\ninterface CustomWindow extends Window {\n emitUIInteraction: (data: unknown) => void;\n emitCommand: (data: unknown) => void;\n dropConnection: (data: unknown) => void;\n toggleBandwidth: (data: unknown) => void;\n setMaxFps: (data: number) => void;\n rebootInstance: (data: unknown) => void;\n startShowcase: (data: unknown) => void;\n restartApp: (data: unknown) => void;\n unrealHelp: (data: unknown) => void;\n setWarnTime: (data: number) => void;\n}\n\ndeclare let window: CustomWindow;\n\n@Injectable()\nexport class ConsoleExtensionsService extends SubService {\n private httpClient = inject(HttpClient);\n private isDevMode = inject(DevModeService).isDevMode;\n\n init() {\n if (!this.isDevMode) {\n return;\n }\n\n window.dropConnection = () => {\n this.store.dispatch(destroyConnectionsAndResetState());\n\n return true;\n };\n\n window.toggleBandwidth = () => {\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(first())\n .subscribe((isLow) => {\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: !isLow }));\n });\n\n return 'LowBandwidth => toggled';\n };\n\n window.setMaxFps = (maxFps: number) => {\n this.store.dispatch(setMaxFps({ maxFps }));\n return `Max Fps Set to ${maxFps}`;\n };\n\n window.restartApp = () => {\n this.store\n .select(unrealFeature.selectAwsInstance)\n .pipe(\n first(),\n filter((data) => !!data.instanceName),\n tapLog('Instance', `Restart initiated`),\n switchMap((data) =>\n this.httpClient.get(`//${data.instanceName}/restartapp`),\n ),\n\n catchError(() => of(null)),\n )\n .subscribe();\n };\n\n window.unrealHelp = () => {\n this.unrealHelp();\n };\n\n window.setWarnTime = (time: number) => {\n this.store.dispatch(setConfig({ config: { warnTimeout: time } }));\n };\n }\n\n private unrealHelp() {\n Logger.info(\n 'dropConnection() => Closes Web Socket and abort communication.',\n );\n Logger.info('toggleBandwidth() => toggles speed.');\n Logger.info('restartApp() => force restart Unreal app.');\n Logger.info('rebootInstance() => force reboot instance.');\n Logger.info('startShowcase(time) => start Showcase.');\n Logger.info('setWarnTime() => set time to appear the AFK window.');\n Logger.info('emitCommand(command) => send command to Unreal Engine.');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { MetaBoxCommandPacket } from '../interfaces/struct';\nimport { Subject } from 'rxjs';\nimport { AFKService } from './afk.service';\nimport { CommandTelemetryService } from './command-telemetry.service';\nimport type { EMessageTypeValues } from '../constants/EMessageType';\nimport { EMessageType } from '../constants/EMessageType';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { Store } from '@ngrx/store';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoService } from './video.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { COLOR_CODES, generateUuid, Logger, Truthy } from '@3dsource/utils';\nimport { ConsoleExtensionsService } from '../services/console-extensions.service';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { filter } from 'rxjs/operators';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { resetAfk } from '../helpers/resetAfk';\nimport { commandStarted } from '../store/unreal.actions';\n\n@Injectable()\nexport class UnrealCommunicatorService {\n private telemetry = inject(CommandTelemetryService);\n private afkService = inject(AFKService);\n private freezeFrame = inject(FreezeFrameService);\n private webrtcPlayer = inject(WebRtcPlayerService);\n private videoService = inject(VideoService);\n private consoleExtensions = inject(ConsoleExtensionsService);\n private store = inject(Store);\n private destroy$ = new Subject<void>();\n\n private cirrusConnected = toSignal(\n this.store.select(unrealFeature.selectCirrusConnected),\n );\n\n constructor() {\n this.emitUIInteraction = this.telemetry.decorate(\n this.emitUIInteraction.bind(this),\n );\n this.consoleExtensions.init();\n this.afkService.init();\n this.freezeFrame.init();\n\n this.listenVideo();\n\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy))\n .subscribe(() => {\n this.requestInitialSettings();\n this.requestQualityControl();\n });\n }\n\n destroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n sendCommandToUnreal(data: MetaBoxCommandPacket) {\n if (this.webrtcPlayer.canSend()) {\n const uniqId = data?.correlationId ?? generateUuid();\n const sendData: MetaBoxCommandPacket = { ...data, correlationId: uniqId };\n Logger.colored(...COLOR_CODES.TO_UNREAL, sendData);\n this.emitUIInteraction(sendData);\n\n this.store.dispatch(\n commandStarted({ id: uniqId, command: data.command as string }),\n );\n }\n }\n\n emitUIInteraction(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.UIInteraction, descriptor);\n }\n\n /**\n A build-in command can be sent to the UE4 client. The commands are defined by a\n JSON descriptor and will be executed automatically.\n The currently supported commands are:\n\n 1. A command to run any console command:\n \"{ ConsoleCommand: <string> }\"\n\n 2. A command to change the resolution to the given width and height.\n \"{ Resolution.Width: <value>, Resolution.Height: <value> } }\"\n */\n emitCommand(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.Command, descriptor);\n }\n\n sendInputData(data: ArrayBuffer) {\n try {\n resetAfk();\n this.webrtcPlayer.send(data);\n } catch (error) {\n if (this.cirrusConnected()) {\n Logger.error(\n `DataChannel connection not established, can't send data=>${error}`,\n );\n }\n }\n }\n\n private emitDescriptor(\n messageType: EMessageTypeValues,\n descriptor: MetaBoxCommandPacket,\n ) {\n // Convert the descriptor object into a JSON string.\n const descriptorAsString = JSON.stringify(descriptor);\n\n // Add the UTF-16 JSON string to the array byte buffer, going two bytes at\n // a time.\n const data = new DataView(\n new ArrayBuffer(1 + 2 + 2 * descriptorAsString.length),\n );\n let byteIdx = 0;\n data.setUint8(byteIdx, messageType);\n byteIdx++;\n data.setUint16(byteIdx, descriptorAsString.length, true);\n byteIdx += 2;\n\n for (let i = 0; i < descriptorAsString.length; i++) {\n data.setUint16(byteIdx, descriptorAsString.charCodeAt(i), true);\n byteIdx += 2;\n }\n\n this.sendInputData(data.buffer);\n }\n\n private requestInitialSettings() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestInitialSettings]).buffer,\n );\n }\n\n private requestQualityControl() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestQualityControl]).buffer,\n );\n }\n\n private listenVideo() {\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized).subscribe(() =>\n this.prepareScreen(),\n );\n }\n\n private prepareScreen() {\n this.showPlayOverlay();\n this.freezeFrame.invalidate();\n }\n\n private showPlayOverlay() {\n const callback = () => {\n this.videoService.play();\n resetAfk();\n sendSignal(UnrealInternalSignalEvents.VideoPlayClick, {\n text: 'Play Clicked',\n });\n\n return true;\n };\n\n sendSignal(UnrealInternalSignalEvents.ShowPlayButton, {\n text: 'Play',\n callback,\n });\n }\n}\n","import type { IKeyCode, IKeyName } from '@3dsource/utils';\nimport {\n InvertedKeyMap,\n KeyboardNumericCode,\n Logger,\n Truthy,\n} from '@3dsource/utils';\nimport type {\n InputProps,\n NormalizeAndQuantizeSignedValue,\n NormalizeAndQuantizeUnsignedValue,\n UnquantizeAndDenormalizeUnsignedValue,\n} from '../interfaces/input.interface';\nimport {\n MouseButton,\n MouseButtonsMask,\n SpecialKeyCodes,\n} from '../constants/ButtonsAndCodes';\nimport type { Observable } from 'rxjs';\nimport {\n combineLatestWith,\n fromEvent,\n merge,\n startWith,\n Subject,\n takeUntil,\n} from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n} from 'rxjs/operators';\nimport type { EMessageTypeValues } from '../constants/EMessageType';\nimport { EMessageType } from '../constants/EMessageType';\nimport { inject } from '@angular/core';\nimport { InputOptions } from '../constants/InputOptions';\nimport TouchEmulator from '../helpers/TouchEmulator';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal } from '../helpers/EventWrapper';\nimport { fromResizeObserver } from '../helpers/resize-observer';\nimport { UnrealCommunicatorService } from '../services/unreal-communicator.service';\nimport { DevModeService } from '../services/dev-mode.service';\nimport { SubService } from '../services/sub.service';\nimport { unrealFeature } from '../store/unreal.feature';\n\nexport class InputService extends SubService {\n private commandsSender = inject(UnrealCommunicatorService);\n private isDevMode = inject(DevModeService).isDevMode;\n\n readonly defaultKeys = [\n KeyboardNumericCode.KeyW,\n KeyboardNumericCode.KeyS,\n KeyboardNumericCode.KeyA,\n KeyboardNumericCode.KeyD,\n KeyboardNumericCode.ArrowUp,\n KeyboardNumericCode.ArrowDown,\n KeyboardNumericCode.ArrowLeft,\n KeyboardNumericCode.ArrowRight,\n KeyboardNumericCode.NumpadAdd,\n KeyboardNumericCode.NumpadSubtract,\n KeyboardNumericCode.ControlRight,\n KeyboardNumericCode.Equal,\n KeyboardNumericCode.Minus,\n KeyboardNumericCode.NumpadDecimal,\n ];\n private availableKeys: IKeyCode[] = this.defaultKeys;\n private options!: InputProps;\n private reInit$ = new Subject<void>();\n private deactivatedVideoTrigger$!: Observable<unknown>;\n\n private normalizeAndQuantizeUnsigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeUnsignedValue;\n private unQuantizeAndDenormalizeUnsigned!: (\n x: number,\n y: number,\n ) => UnquantizeAndDenormalizeUnsignedValue;\n private normalizeAndQuantizeSigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeSignedValue;\n\n video!: HTMLVideoElement;\n videoBoundingRect: DOMRect = new DOMRect(0, 0, 1, 1);\n fingerIds = new Map();\n maxByteValue = 255;\n fingers = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];\n\n private offsetParams: OffsetParams = {\n scaleX: 1,\n scaleY: 1,\n scaledHeight: 0,\n scaledWidth: 0,\n offsetByY: 0,\n offsetByX: 0,\n };\n\n constructor() {\n super();\n const visibilityHiddenTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'hidden'),\n filter(Truthy),\n );\n\n const visibilityVisibleTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n startWith(true),\n );\n\n this.deactivatedVideoTrigger$ = merge(\n this.disconnect$,\n this.reInit$,\n visibilityHiddenTrigger$,\n );\n\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized)\n .pipe(\n combineLatestWith(\n visibilityVisibleTrigger$,\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy), startWith(true)),\n ),\n filter(([video]) => !!video),\n )\n .subscribe(([video]) => this.setup(video));\n }\n\n useKeyboardKeys(keys: IKeyCode[]) {\n this.availableKeys = keys || [];\n }\n\n private setup(video: HTMLVideoElement) {\n this.options = InputOptions;\n this.video = video;\n this.reInit$.next();\n\n merge(\n fromResizeObserver(video),\n fromSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer),\n )\n .pipe(debounceTime(300), takeUntil(this.deactivatedVideoTrigger$))\n .subscribe(() => {\n this.setupNormalizeAndQuantize(video);\n });\n\n this.setupNormalizeAndQuantize(video);\n this.registerInputs();\n }\n\n /**\n * We use `object-fit: cover` on the video element. Since the video can have\n * a different aspect ratio from its container (and potentially be larger),\n * we need to calculate offsets and scale factors to map container (e.g., mouse)\n * coordinates back to the actual video coordinates.\n *\n * @param videoElement The video element whose scaling and positioning we need\n * @returns Object containing offset and scale info for coordinate normalization\n * @private\n */\n private getObjectFitOffset(videoElement: HTMLVideoElement) {\n const { width, height } = this.videoBoundingRect;\n const { videoWidth, videoHeight } = videoElement;\n\n Logger.log('Video Quantizing with => ', this.videoBoundingRect, {\n videoWidth,\n videoHeight,\n });\n\n // Compute aspect ratios\n const containerRatio = width / height;\n const videoRatio = videoWidth / videoHeight;\n\n // Determine how much to scale the video to fit the container (cover mode)\n const scale =\n videoRatio > containerRatio ? height / videoHeight : width / videoWidth;\n\n // Calculate the displayed (scaled) dimensions of the video\n const scaledWidth = videoWidth * scale;\n const scaledHeight = videoHeight * scale;\n\n // Offsets in x/y directions (like \"padding\") once the video is scaled\n const offsetByX = (width - scaledWidth) / 2;\n const offsetByY = (height - scaledHeight) / 2;\n\n // Scale factors for coordinate transformation from container space to video space\n const scaleX = width / scaledWidth;\n const scaleY = height / scaledHeight;\n\n return {\n offsetByX,\n offsetByY,\n scaleX,\n scaleY,\n scaledWidth,\n scaledHeight,\n };\n }\n\n private setupNormalizeAndQuantize(videoElement: HTMLVideoElement) {\n if (videoElement) {\n this.videoBoundingRect = videoElement.getBoundingClientRect();\n this.offsetParams = this.getObjectFitOffset(videoElement);\n\n // Unsigned XY positions are the ratio (0.0..1.0) along a viewport axis,\n // quantized into an uint16 (0..65536).\n // Signed XY deltas are the ratio (-1.0..1.0) along a viewport axis,\n // quantized into an int16 (-32767..32767).\n // This allows the browser viewport and client viewport to have a different\n // size.\n // Hack: Currently we set an out-of-range position to an extreme (65535)\n // as we can't yet accurately detect mouse enter and leave events\n // precisely inside a video with an aspect ratio which causes mattes.\n\n this.normalizeAndQuantizeUnsigned = (x, y) => {\n const normalizedX = x / videoElement.clientWidth;\n const normalizedY = y / videoElement.clientHeight;\n\n if (\n normalizedX < 0.0 ||\n normalizedX > 1.0 ||\n normalizedY < 0.0 ||\n normalizedY > 1.0\n ) {\n return {\n inRange: false,\n x: 65535,\n y: 65535,\n };\n } else {\n return {\n inRange: true,\n x: normalizedX * 65536,\n y: normalizedY * 65536,\n };\n }\n };\n\n this.unQuantizeAndDenormalizeUnsigned = (x, y) => {\n const normalizedX = x / 65536;\n const normalizedY = y / 65536;\n return {\n x: normalizedX * videoElement.clientWidth,\n y: normalizedY * videoElement.clientHeight,\n };\n };\n\n // Signed.\n this.normalizeAndQuantizeSigned = (x, y) => {\n const normalizedX = x / (0.5 * videoElement.clientWidth);\n const normalizedY = y / (0.5 * videoElement.clientHeight);\n return {\n x: normalizedX * 32767,\n y: normalizedY * 32767,\n };\n };\n }\n }\n\n private sendInputData(data: ArrayBuffer) {\n this.commandsSender.sendInputData(data);\n }\n\n private registerInputs() {\n merge(\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(distinctUntilChanged(), filter(Truthy)),\n fromEvent(window, 'blur'),\n )\n .pipe(\n filter(() => !!this.video),\n takeUntil(this.deactivatedVideoTrigger$),\n )\n .subscribe(() => this.releaseMouseButtons(255, 0, 0));\n\n this.registerMouseEnterAndLeaveEvents(this.video);\n this.registerHoveringMouseEvents(this.video);\n this.registerKeyboardEvents(this.availableKeys);\n\n if (InputOptions.fakeMouseWithTouches) {\n new TouchEmulator(this);\n } else {\n this.registerTouchEvents(this.video);\n }\n }\n\n private getTouchPositionWithOffset({ clientX, clientY }: Touch) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (clientX - offsetByX - this.videoBoundingRect.left) * scaleX,\n y: (clientY - offsetByY - this.videoBoundingRect.top) * scaleY,\n };\n }\n\n private getMousePositionWithOffset({ offsetX, offsetY }: MouseEvent) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (offsetX - offsetByX) * scaleX,\n y: (offsetY - offsetByY) * scaleY,\n };\n }\n\n private registerTouchEvents(htmlVideoElement: HTMLVideoElement) {\n // We need to assign a unique identifier to each finger.\n // We do this by mapping each Touch object to the identifier.\n\n const rememberTouch = (touch: Touch) => {\n const finger = this.fingers.pop();\n if (finger === undefined) {\n Logger.info('exhausted touch indentifiers');\n return;\n }\n this.fingerIds.set(touch.identifier, finger);\n };\n\n const forgetTouch = (touch: Touch) => {\n this.fingers.push(this.fingerIds.get(touch.identifier));\n // Sort array back into descending order. This means if finger '1' were to lift after finger '0', we would ensure that 0 will be the first index to pop\n this.fingers.sort(function (a, b) {\n return b - a;\n });\n this.fingerIds.delete(touch.identifier);\n };\n\n const emitTouchData = (type: EMessageTypeValues, touches: TouchList) => {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n let byte = 2;\n const numTouches = 1; // the number of touches to be sent this message\n const touch = touches[t];\n const { x, y } = this.getTouchPositionWithOffset(touch);\n Logger.info(`F${this.fingerIds.get(touch.identifier)}=(${x}, ${y})`);\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const data = new DataView(new ArrayBuffer(9));\n\n data.setUint8(0, type);\n data.setUint8(1, numTouches);\n data.setUint16(byte, coord.x, true);\n byte += 2;\n data.setUint16(byte, coord.y, true);\n byte += 2;\n data.setUint8(byte, this.fingerIds.get(touch.identifier));\n byte += 1;\n // force is between 0.0 and 1.0 so quantize into byte.\n // iOs bug: Forced to be always 0.5 on all devices as we do not use forced touch any way;/\n data.setUint8(byte, this.maxByteValue * 0.5);\n byte += 1;\n data.setUint8(byte, coord.inRange ? 1 : 0);\n byte += 1;\n this.sendInputData(data.buffer);\n }\n };\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchstart')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n this.focusWindow();\n const touches: TouchList = e.changedTouches;\n // Assign a unique identifier to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n rememberTouch(touches[t]);\n }\n Logger.info('touch start');\n emitTouchData(EMessageType.TouchStart, touches);\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchend')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n const touches: TouchList = e.changedTouches;\n Logger.info('touch end');\n\n emitTouchData(EMessageType.TouchEnd, touches);\n\n // Re-cycle unique identifiers previously assigned to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n forgetTouch(touches[t]);\n }\n\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchmove')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n const touches: TouchList = e.touches;\n Logger.info('touch move');\n\n emitTouchData(EMessageType.TouchMove, touches);\n e.preventDefault();\n });\n }\n\n focusWindow() {\n window.focus();\n }\n\n emitMouseMove(x: number, y: number, deltaX: number, deltaY: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const delta = this.normalizeAndQuantizeSigned(deltaX, deltaY);\n const Data = new DataView(new ArrayBuffer(9));\n\n Data.setUint8(0, EMessageType.MouseMove);\n Data.setUint16(1, coord.x, true);\n Data.setUint16(3, coord.y, true);\n Data.setInt16(5, delta.x, true);\n Data.setInt16(7, delta.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseDown(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseDown);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseUp(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseUp);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseWheel(delta: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(7));\n Data.setUint8(0, EMessageType.MouseWheel);\n Data.setInt16(1, delta, true);\n Data.setUint16(3, coord.x, true);\n Data.setUint16(5, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n private releaseMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseUp(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseUp(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseUp(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseUp(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseUp(MouseButton.FifthButton, x, y);\n }\n }\n\n // If the user has any mouse buttons pressed then press them again.\n private pressMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseDown(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseDown(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseDown(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseDown(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseDown(MouseButton.FifthButton, x, y);\n }\n }\n\n private registerHoveringMouseEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmousemove = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseMove(x, y, e.movementX, e.movementY);\n e.preventDefault();\n };\n\n htmlVideoElement.onmousedown = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.focusWindow();\n this.emitMouseDown(e.button, x, y);\n e.preventDefault();\n };\n\n htmlVideoElement.onmouseup = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseUp(e.button, x, y);\n e.preventDefault();\n };\n\n // When the context menu is shown then it is safest to release the button\n // which was pressed when the event happened. This will guarantee we will\n // get at least one mouse up corresponding to a mouse down event. Otherwise\n // the mouse can get stuck.\n // https://github.com/facebook/react/issues/5531\n // playerElement.oncontextmenu = (e) => {\n // e.preventDefault();\n // this.emitMouseUp(e.button, e.offsetX, e.offsetY);\n // };\n\n fromEvent<WheelEvent>(htmlVideoElement, 'wheel')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e: WheelEvent) => {\n this.emitMouseWheel(e.deltaY * -120, e.offsetX, e.offsetY);\n e.preventDefault();\n });\n\n (htmlVideoElement as Clickable).pressMouseButtons = (e: MouseEvent) => {\n this.pressMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n\n (htmlVideoElement as Clickable).releaseMouseButtons = (e: MouseEvent) => {\n this.releaseMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n }\n\n private registerMouseEnterAndLeaveEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmouseenter = (e) => {\n this.focusWindow();\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseEnter);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).pressMouseButtons(e);\n };\n\n htmlVideoElement.onmouseleave = (e) => {\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseLeave);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).releaseMouseButtons(e);\n };\n }\n\n // Browser keys do not have a charCode so we only need to test keyCode.\n private isKeyCodeBrowserKey(keyCode: number): boolean {\n // Function keys or tab key.\n return (keyCode >= 112 && keyCode <= 123) || keyCode === 9;\n }\n\n private getKeyCode(e: KeyboardEvent): number {\n if (e.keyCode === SpecialKeyCodes.Shift && e.code === 'ShiftRight')\n return SpecialKeyCodes.RightShift;\n else if (e.keyCode === SpecialKeyCodes.Control && e.code === 'ControlRight')\n return SpecialKeyCodes.RightControl;\n else if (e.keyCode === SpecialKeyCodes.Alt && e.code === 'AltRight')\n return SpecialKeyCodes.RightAlt;\n else return e.keyCode;\n }\n\n private registerKeyboardEvents(availableKeys: IKeyCode[]) {\n const availableKeyNames = Object.entries(availableKeys).map(([, value]) => {\n return InvertedKeyMap[value];\n });\n\n const keyBlock = (event: KeyboardEvent) => {\n const code: IKeyName = event.code as IKeyName;\n const isInputFieldFocused =\n (event.target as HTMLElement)?.localName === 'input';\n const keyMatch = availableKeyNames.includes(code);\n\n if (this.isDevMode && !keyMatch) {\n Logger.warn(\n 'Code=>',\n code,\n 'Keyboard event is not filtered in DEV Mode. App may behave inappropriately!',\n );\n return isInputFieldFocused;\n }\n\n return isInputFieldFocused || !keyMatch;\n };\n this.startListenKeys(keyBlock);\n }\n\n private startListenKeys(_filter?: (event: KeyboardEvent) => boolean) {\n const filter = _filter ?? (() => false);\n\n document.onkeydown = (e) => {\n if (filter(e)) {\n return;\n }\n\n const isCtrlOrCommand = e.ctrlKey || e.metaKey;\n\n const isPlusOrMinus =\n e.keyCode === KeyboardNumericCode.Equal ||\n e.keyCode === KeyboardNumericCode.Minus;\n if (isCtrlOrCommand && isPlusOrMinus) {\n return;\n }\n\n this.sendInputData(\n new Uint8Array([\n EMessageType.KeyDown,\n this.getKeyCode(e),\n Number(e.repeat),\n ]).buffer,\n );\n // Backspace is not considered a keypress in JavaScript but we need it\n // to be so characters may be deleted in a UE4 text entry field.\n if (e.keyCode === SpecialKeyCodes.BackSpace) {\n (document as DocumentClickable).onkeypress({\n charCode: SpecialKeyCodes.BackSpace,\n });\n //document.dispatchEvent(new KeyboardEvent('keydown',{key: name, keyCode: SpecialKeyCodes.BackSpace, code: SpecialKeyCodes.BackSpace, repeat: false} ));\n }\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeyup = (e) => {\n if (filter(e)) {\n return;\n }\n this.sendInputData(\n new Uint8Array([EMessageType.KeyUp, this.getKeyCode(e)]).buffer,\n );\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeypress = (e) => {\n if (filter(e)) {\n return;\n }\n const data = new DataView(new ArrayBuffer(3));\n data.setUint8(0, EMessageType.KeyPress);\n data.setUint16(1, e.charCode, true);\n this.sendInputData(data.buffer);\n };\n }\n}\n\ninterface OffsetParams {\n scaleX: number;\n scaleY: number;\n scaledHeight: number;\n scaledWidth: number;\n offsetByY: number;\n offsetByX: number;\n}\ntype Clickable = HTMLVideoElement & {\n releaseMouseButtons: (e: MouseEvent) => void;\n pressMouseButtons: (e: MouseEvent) => void;\n};\n\ntype DocumentClickable = Document & {\n onkeypress: (data: unknown) => void;\n};\n","import { inject, Injectable } from '@angular/core';\nimport type { MixPanelEventsValues } from '../interfaces/mix-panel-events';\nimport { MIX_PANEL } from '../constants/mix-panel.constant';\nimport type { Dict } from 'mixpanel-browser';\nimport mixpanel from 'mixpanel-browser';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MixPanelService {\n #unrealConfig = inject(UNREAL_CONFIG);\n\n init() {\n MIX_PANEL.metaBoxTrack = mixpanel.init(\n this.#unrealConfig.mixpanelToken,\n {\n ignore_dnt: true,\n },\n 'metaBoxTrack',\n );\n MIX_PANEL.streamTrack = mixpanel.init(\n this.#unrealConfig.mixpanelStreamToken,\n {\n ignore_dnt: true,\n },\n 'streamTrack',\n );\n this.trackMetabox('Metabox started');\n this.trackStream('Metabox started');\n }\n\n trackMetabox(event: MixPanelEventsValues | string, data?: Dict) {\n MIX_PANEL.metaBoxTrack.track(event, data);\n }\n\n trackStream(event: MixPanelEventsValues | string, data?: Dict) {\n MIX_PANEL.streamTrack.track(event, data);\n }\n}\n","import { Store } from '@ngrx/store';\nimport { inject, Injectable } from '@angular/core';\nimport { auditTime } from 'rxjs';\nimport { map, withLatestFrom } from 'rxjs/operators';\nimport { unrealFeature } from '../store/unreal.feature';\nimport type {\n AwsInstance,\n IAggregatedStat,\n InboundVideoStats,\n} from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoStreamStatusService } from './video-stream-status.service';\nimport type { LBMStats } from '../interfaces/LBMStats';\nimport { MixPanelService } from '../services/mix-panel.service';\n\n@Injectable()\nexport class StreamStatusTelemetryService {\n #store = inject(Store);\n #videoStatGenerator = inject(VideoStreamStatusService);\n #mixPanelService = inject(MixPanelService);\n\n constructor() {\n this.initTelemetry();\n }\n\n private mapEventData(\n data: IAggregatedStat,\n signalingServer: AwsInstance,\n isLowBandwidth: boolean,\n lbmStats: LBMStats | undefined,\n ) {\n const {\n bitrate,\n VideoEncoderQP,\n framesPerSecond,\n frameWidth,\n frameHeight,\n jitter,\n packetsLost,\n currentRoundTripTime,\n } = data.aggregatedStats;\n\n return {\n runTime: data.aggregatedStats.runTime,\n frameWidth,\n frameHeight,\n isLowBandwidth,\n client: signalingServer.wsUrl,\n pixelRatio: window.devicePixelRatio,\n framesPerSecond,\n jitter,\n packetsLost,\n instanceName: signalingServer.instanceName,\n bitrate,\n lbmStats,\n rtt: currentRoundTripTime,\n VideoEncoderQP,\n };\n }\n\n private initTelemetry() {\n this.#videoStatGenerator.videoStats$\n .pipe(\n withLatestFrom(\n this.#store.select(unrealFeature.selectAwsInstance),\n this.#store.select(unrealFeature.selectLowBandwidth),\n this.#store.select(unrealFeature.selectLowBandwidthStats),\n ),\n auditTime(5000),\n map(([data, signalingServer, isLowBandwidth, lbmStats]) =>\n this.mapEventData(data, signalingServer, isLowBandwidth, lbmStats),\n ),\n )\n .subscribe((data) => this.trackEventToMixPanel(data));\n }\n\n private trackEventToMixPanel(data: Partial<InboundVideoStats>) {\n this.#mixPanelService.trackStream('streamStatus', data);\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport {\n combineLatestWith,\n debounceTime,\n EMPTY,\n fromEvent,\n map,\n of,\n switchMap,\n} from 'rxjs';\nimport { concatLatestFrom } from '@ngrx/operators';\nimport { Store } from '@ngrx/store';\nimport {\n changeLowBandwidth,\n changeStreamResolutionAction,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n destroyConnectionsAndResetState,\n destroyRemoteConnections,\n initSignalling,\n resetAfkAction,\n resetConfig,\n resetUnrealState,\n resetWarnTimeout,\n setAwsInstance,\n setCirrusDisconnected,\n setConfig,\n setDataChannelConnected,\n setErrorMessage,\n setFreezeFrame,\n setLoopBackCommandIsCompleted,\n setMaxFps,\n setViewportReady,\n showUnrealErrorMessage,\n} from './unreal.actions';\nimport { unrealFeature } from './unreal.feature';\nimport {\n catchError,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { Falsy, isEmpty, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport {\n fromSignal,\n getDebugModeCommand,\n getExecuteConsoleCommand,\n getLoopBackCommand,\n getRtcErrorMessage,\n getSetFpsCommand,\n observeCommandResponse,\n resetAfk,\n} from '../helpers';\nimport {\n CONSOLE_COMMAND_PIXEL_QUALITY,\n DATA_CHANNEL_CONNECTION_TIMEOUT,\n MINIMAL_FPS,\n UNREAL_CONFIG,\n} from '../constants';\nimport { selectCommandsInProgress } from '../store';\nimport { WebrtcErrorModalComponent } from '../components';\nimport {\n DevModeService,\n SignallingService,\n TelemetryStart,\n TelemetryStop,\n UnrealCommunicatorService,\n VideoStreamStatusService,\n WebRtcPlayerService,\n} from '../services';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport { ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport {\n DisconnectReason,\n UnrealInternalSignalEvents,\n WrappedMetaBoxCommandPacket,\n WSCloseCode_NORMAL_CIRRUS_CLOSED,\n} from '../interfaces';\nimport { SourceModalComponent } from '@source/ui-sdk/source-modal';\nimport type { FLoopBackCommand } from '../interfaces/struct';\n\n@Injectable()\nexport class UnrealEffects {\n private dialog = inject(Dialog);\n private http = inject(HttpClient);\n private store = inject(Store);\n private isDevMode = inject(DevModeService).isDevMode;\n private unrealInitialConfig = inject(UNREAL_CONFIG, { optional: true });\n private actions$ = inject(Actions);\n private player = inject(WebRtcPlayerService);\n private signallingService = inject(SignallingService);\n private scrollStrategy = inject(ScrollStrategyOptions).block();\n private commandsSender = inject(UnrealCommunicatorService);\n private videoStatGenerator = inject(VideoStreamStatusService);\n\n cirrusDisconnectEffect$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setCirrusDisconnected),\n map(() => resetUnrealState()),\n );\n });\n destroyConnections$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyConnectionsAndResetState),\n map(() =>\n destroyRemoteConnections({ disconnectReason: DisconnectReason.reset }),\n ),\n );\n });\n resetState$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyConnectionsAndResetState),\n map(() => resetUnrealState()),\n );\n });\n destroyRemoteConnections$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n tap(({ disconnectReason }) => {\n this.signallingService.close({\n code: WSCloseCode_NORMAL_CIRRUS_CLOSED,\n reason: disconnectReason,\n });\n this.player.closePC();\n }),\n );\n },\n { dispatch: false },\n );\n changeStreamResolution$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeStreamResolutionAction),\n filter((size) => !!(size?.width && size?.height)),\n concatLatestFrom(() => [\n this.store.select(unrealFeature.selectStreamResolution),\n ]),\n filter(\n ([newSizes, savedSizes]) =>\n !(\n newSizes.width === savedSizes.width &&\n newSizes.height === savedSizes.height\n ),\n ),\n map(([sizes]) =>\n changeStreamResolutionSuccessAction({\n width: sizes.width,\n height: sizes.height,\n }),\n ),\n );\n });\n forceLBMOff$ = createEffect(() => {\n return fromEvent(document, 'visibilitychange').pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n tapLog('forceLBMOff$'),\n map(() => changeLowBandwidth({ lowBandwidth: false })),\n );\n });\n resetFreezeFrameOnLowBandwidthTriggered$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeLowBandwidth),\n map((state) => state.lowBandwidth),\n distinctUntilChanged(),\n map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n );\n });\n sendLbmStat$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n distinctUntilChanged(),\n filter(Truthy),\n exhaustMap(() =>\n this.actions$.pipe(\n ofType(changeLowBandwidth),\n filter(({ lowBandwidth }) => lowBandwidth),\n withLatestFrom(\n this.store.select(unrealFeature.selectAwsInstance),\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ),\n first(),\n exhaustMap(([, instance, companyId, viewId]) =>\n this.http\n .post(this.unrealInitialConfig?.customErrorsEndpoint || '', {\n message: {\n type: 'front',\n error: 'low_bandwidth_mode',\n signalling: instance.pollingUrl,\n },\n client: instance.pollingUrl,\n session_uuid: companyId,\n session_uuid2: viewId,\n })\n .pipe(catchError(() => EMPTY)),\n ),\n ),\n ),\n )\n .subscribe();\n resetAfk$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setConfig, resetWarnTimeout, resetConfig),\n map(() => resetAfkAction()),\n );\n });\n resetFreezeFrameOnViewportDestroy$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setViewportReady),\n filter(Falsy),\n map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n );\n });\n setMaxFps$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(setMaxFps),\n tap(({ maxFps }) => {\n this.commandsSender.sendCommandToUnreal(getSetFpsCommand(maxFps));\n }),\n );\n },\n { dispatch: false },\n );\n webrtcErrorModalComponent$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(setErrorMessage),\n debounceTime(400),\n combineLatestWith(\n this.store.select(unrealFeature.selectDataChannelConnected),\n ),\n filter(([error, isConnected]) => {\n return !isConnected && error?.errorType === 'WebRTCError';\n }),\n tap(() => this.dialog.open(WebrtcErrorModalComponent)),\n );\n },\n { dispatch: false },\n );\n resetAfkAction$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(resetAfkAction),\n tap(() => resetAfk()),\n );\n },\n { dispatch: false },\n );\n setDataChannelTimeoutCheck$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setAwsInstance),\n filter(({ wsUrl }) => !!wsUrl),\n debounceTime(DATA_CHANNEL_CONNECTION_TIMEOUT), // Timeout, if not connected, send error report, then reconnect\n concatLatestFrom(() => [\n this.store.select(unrealFeature.selectSsData),\n this.store.select(unrealFeature.selectCirrusConnected),\n this.store.select(unrealFeature.selectDataChannelConnected),\n ]),\n filter(([, , isCirrusConnected, isDataChannelConnected]) => {\n return isCirrusConnected && !isDataChannelConnected;\n }),\n switchMap(([awsInstance, ssData]) => {\n const error = `DataChannel connection timeout ${DATA_CHANNEL_CONNECTION_TIMEOUT}ms, requesting new signaling.`;\n Logger.error(error);\n\n return this.http\n .post(awsInstance.pollingUrl || '', {\n awsInstance,\n connectionId: ssData?.connectionId,\n href: location.href,\n userAgent: navigator.userAgent,\n error,\n })\n .pipe(\n catchError((error: unknown) => {\n Logger.error('Error sending timeout info:', error);\n return of(null);\n }),\n );\n }),\n map(() =>\n destroyRemoteConnections({\n disconnectReason: DisconnectReason.dataChannelTimeout,\n }),\n ),\n );\n });\n destroyConnectionAndRestart$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n filter(\n ({ disconnectReason }) =>\n disconnectReason === DisconnectReason.dataChannelTimeout,\n ),\n switchMap(() => this.actions$.pipe(ofType(resetUnrealState), first())),\n map(() => initSignalling()),\n );\n });\n showUnrealError$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(showUnrealErrorMessage),\n map(({ code }) => getRtcErrorMessage(code)),\n distinctUntilChanged(),\n filter(Truthy),\n switchMap(\n (content: string) =>\n this.dialog.open(SourceModalComponent, {\n scrollStrategy: this.scrollStrategy,\n data: {\n size: 'small',\n backButton: false,\n closeButton: true,\n headerTitle: 'Warning',\n content,\n testID: 'unreal-error',\n footerButtons: [\n {\n srcButtonConfig: {\n colorScheme: 'secondary',\n },\n label: 'Ok',\n action: () => false,\n },\n ],\n },\n }).closed,\n ),\n map(() => showUnrealErrorMessage({ code: null })),\n );\n });\n initAppBySetDataChannelConnected$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setDataChannelConnected),\n tap(() => {\n this.commandsSender.sendCommandToUnreal(\n getExecuteConsoleCommand({\n value: CONSOLE_COMMAND_PIXEL_QUALITY,\n }),\n );\n\n this.commandsSender.sendCommandToUnreal(\n getDebugModeCommand({ value: this.isDevMode }),\n );\n\n TelemetryStart('SetViewportReady');\n }),\n switchMap(() =>\n this.store.select(selectCommandsInProgress).pipe(\n debounceTime(500),\n first(),\n switchMap(() =>\n observeCommandResponse<FLoopBackCommand['command']>(\n getLoopBackCommand(),\n (data) => this.commandsSender.sendCommandToUnreal(data),\n ),\n ),\n switchMap(() => this.videoStatGenerator.videoStats$),\n filter(\n (videoStats) =>\n !!videoStats.aggregatedStats.framesPerSecond &&\n videoStats.aggregatedStats.framesPerSecond > MINIMAL_FPS &&\n (videoStats.aggregatedStats.framesDecoded || 0) > 15,\n ),\n first(),\n map(() => setLoopBackCommandIsCompleted()),\n ),\n ),\n );\n });\n setViewportReadyBySetLoopBackCommandIsCompleted$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setLoopBackCommandIsCompleted),\n tap(() => TelemetryStop('SetViewportReady', { ready: true })),\n map(() => setViewportReady({ value: true })),\n );\n });\n listenUnrealCallbackByInitSignalling$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(initSignalling),\n switchMap(() =>\n fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(\n ({ json }) =>\n (json as WrappedMetaBoxCommandPacket)?.commandCallback\n ?.correlationId,\n ),\n filter(Truthy),\n map((id) => commandCompleted({ id })),\n ),\n ),\n );\n });\n setConfigByInitSignalling$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(initSignalling),\n switchMap(() =>\n this.store.select(unrealFeature.selectUnrealVersion).pipe(\n filter(Truthy),\n map((unrealVersion) =>\n [\n unrealVersion && this.unrealInitialConfig?.signalling\n ? this.unrealInitialConfig.signalling[unrealVersion]\n : '',\n ]\n .flat()\n .filter(Truthy),\n ),\n ),\n ),\n map((urls) => {\n if (isEmpty(urls)) {\n throw Error('Signalling URL(s) is empty');\n }\n return setConfig({ config: { matchMakerUrls: urls } });\n }),\n );\n });\n}\n","export 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 { COLOR_CODES, Falsy, Logger, Truthy, where } from '@3dsource/utils';\nimport { inject, Injectable } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { Subject } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n takeUntil,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { EControlSchemeType } from '../constants/EControlSchemeType';\nimport { EToClientMessageType } from '../constants/EToClientMessageType';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { InputOptions } from '../constants/InputOptions';\nimport { SignallingService } from './signalling.service';\nimport { Store } from '@ngrx/store';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoService } from './video.service';\nimport { VideoStreamStatusService } from './video-stream-status.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { unrealFeature } from '../store';\nimport { sendSignal } from '../helpers';\nimport { decodeData } from '../helpers/DataDecoder';\nimport { selectStreamConfig } from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TelemetryStop } from '../services/command-telemetry.service';\nimport type { ConfigMessage } from '../interfaces/SignalingMessage';\nimport type { UnrealCommands } from '../interfaces/struct';\nimport { showUnrealErrorMessage } from '../store/unreal.actions';\nimport { deepEqual } from '../helpers/deepEqual';\n\n@Injectable()\nexport class AggregatorService {\n readonly store = inject(Store);\n readonly selectStreamConfig = toSignal(this.store.select(selectStreamConfig));\n readonly videoService = inject(VideoService);\n readonly webrtcPlayer = inject(WebRtcPlayerService);\n readonly freezeFrame = inject(FreezeFrameService);\n readonly signallingSrv = inject(SignallingService);\n readonly stats = inject(VideoStreamStatusService);\n /**\n * /Never called for now\n * @\n */\n destroy$ = new Subject<void>();\n responseEventListeners!: Map<string, (data: unknown) => void>;\n disconnect$!: Observable<boolean>;\n unlockViewport$!: Observable<boolean>;\n\n constructor() {\n this.listenWebRTC();\n this.listenSignaling();\n this.initialize();\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\n\n private initialize() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(distinctUntilChanged())\n .subscribe((connected) => {\n this.resetResponseList();\n\n if (connected) {\n this.startListenCallbacks();\n }\n });\n\n this.disconnect$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Falsy));\n\n this.unlockViewport$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy));\n\n this.unlockViewport$.subscribe(() => {\n this.removeLoadScreen();\n });\n\n this.disconnect$.subscribe(() => {\n this.removeLoadScreen();\n });\n\n if (\n !this.selectStreamConfig()?.autoStart ||\n location.href.match(/^http:/gi)\n ) {\n this.removeLoadScreen();\n }\n\n InputOptions.controlScheme = EControlSchemeType.HoveringMouse;\n\n this.addExternalResponses();\n }\n\n /**\n * @deprecated\n * Hack for 3DS platform;\n * TODO remove ASAP, use {@link BasicConfiguratorApiService.toMetaBoxHandlers.watchCallbacks}\n * Add external responses to the list of responses\n */\n private addExternalResponses() {\n /*Signal.on('ADDRESPONSE')\n .pipe(takeUntil(this.destroy$))\n .subscribe((data: any) => {\n this.addResponseEventListener(data.name!, (event) => {\n this.externalApi.sendMessage({\n action: FromMetaBoxApiAction.UnrealResponse,\n name: data.name,\n responseEvent: event,\n });\n });\n });*/\n }\n\n addResponseEventListener(name: string, listener: (data: unknown) => void) {\n this.responseEventListeners.set(name, listener);\n }\n\n showOnScreenKeyboard<T extends { showOnScreenKeyboard: boolean }>(\n command: T,\n ) {\n if (command.showOnScreenKeyboard) {\n // Show the 'edit text' button.\n //editTextButton.classList.remove('hiddenState');\n // Place the 'edit text' button near the UE4 input widget.\n //let pos = unquantizeAndDenormalizeUnsigned(command.x, command.y);\n //editTextButton.style.top = pos.y.toString() + 'px';\n //editTextButton.style.left = (pos.x - 40).toString() + 'px';\n } else {\n // Hide the 'edit text' button.\n //editTextButton.classList.add('hiddenState');\n // Hide the on-screen keyboard.\n // hiddenInput.blur();\n }\n }\n\n exposeApi() {\n // const globals: Window = window;\n // if ('apiReady' in globals) {\n // try {\n // const api = {\n // setStreamData: (streamData: StreamData) => {\n // this.streamConfig.setConfig(streamData.params);\n // },\n // };\n // globals.apiReady(api);\n // } catch (e) {\n // /!* empty *!/\n // }\n // }\n }\n\n removeLoadScreen() {\n document.getElementById('3dsource_start_screen')?.remove();\n }\n\n startListenCallbacks() {\n Logger.info('Start Listen Callbacks');\n\n let previousJson: unknown = null;\n\n this.addResponseEventListener('unrealEvents', (data) => {\n try {\n if (typeof data !== 'string') {\n return;\n }\n const json = JSON.parse(data);\n\n if (!deepEqual(json, previousJson)) {\n if (json?.error) {\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL_ERROR,\n `${json.error}`,\n data,\n );\n this.store.dispatch(showUnrealErrorMessage({ code: json.code }));\n } else {\n this.showMessageFromUnreal(json);\n\n previousJson = json;\n sendSignal(UnrealInternalSignalEvents.UnrealCallback, { json });\n }\n } else {\n //Logger.warn('Duplicate message received');\n }\n } catch (e) {\n Logger.error(e);\n Logger.error('ERROR=>', data);\n }\n });\n }\n\n private showMessageFromUnreal<T extends UnrealCommands>(json: T) {\n if (filteredLogs.some(where({ command: json?.command }))) {\n return;\n }\n Logger.colored(...COLOR_CODES.FROM_UNREAL, json);\n }\n\n resetResponseList() {\n this.responseEventListeners = new Map();\n }\n\n listenSignaling() {\n const iceCandidateBuffer: RTCIceCandidate[] = [];\n\n const processBuffer = () => {\n iceCandidateBuffer.forEach((cnd) => {\n this.webrtcPlayer.handleCandidateFromServer(cnd);\n });\n iceCandidateBuffer.length = 0;\n };\n\n this.signallingSrv.onConfig$\n .pipe(takeUntil(this.destroy$))\n .subscribe((config: ConfigMessage) => {\n this.videoService.create();\n this.webrtcPlayer.setConfig(config);\n void this.webrtcPlayer.createWebRtcOffer();\n });\n\n this.signallingSrv.onWebRtcAnswer$\n .pipe(filter(Truthy), takeUntil(this.destroy$))\n .subscribe((answer) => {\n this.webrtcPlayer.receiveAnswer(answer);\n processBuffer();\n });\n\n this.signallingSrv.onWebRtcIce$\n .pipe(\n withLatestFrom(this.signallingSrv.onWebRtcAnswer$),\n takeUntil(this.destroy$),\n )\n .subscribe(([candidate, answerEstablished]) => {\n TelemetryStop('iceCandidate', {\n multi: true,\n });\n\n iceCandidateBuffer.push(candidate);\n if (answerEstablished) {\n processBuffer();\n }\n });\n }\n\n listenWebRTC() {\n this.webrtcPlayer.onWebRtcOffer$\n .pipe(takeUntil(this.destroy$))\n .subscribe((offer: RTCSessionDescriptionInit) =>\n this.signallingSrv.send(offer),\n );\n\n this.webrtcPlayer.onWebRtcCandidate$\n .pipe(takeUntil(this.destroy$))\n .subscribe((candidate: RTCIceCandidate) =>\n this.signallingSrv.send(\n JSON.stringify({\n type: 'iceCandidate',\n candidate: candidate,\n }),\n ),\n );\n\n this.webrtcPlayer.onDataChannelMessage$\n .pipe(takeUntil(this.destroy$))\n .subscribe((data: number[]) => this.dataChannelMessageHandler(data));\n\n this.webrtcPlayer.onAudioTrack$\n .pipe(takeUntil(this.destroy$))\n .subscribe((stream: MediaStream) =>\n this.videoService.attachAudioStream(stream),\n );\n\n this.webrtcPlayer.onVideoTrack$\n .pipe(takeUntil(this.destroy$))\n .subscribe((stream: MediaStream) => {\n this.videoService.attachVideoStream(stream);\n });\n }\n\n dataChannelMessageHandler(data: number[]) {\n const view = new Uint8Array(data);\n const anyData = data.slice(1);\n\n if (this.freezeFrame.receiving) {\n this.freezeFrame.setData(view);\n\n return;\n }\n\n switch (view[0]) {\n case EToClientMessageType.QualityControlOwnership: {\n const ownership = view[1] !== 0;\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Received quality controller message, will control quality: ' +\n ownership,\n );\n break;\n }\n\n case EToClientMessageType.Response: {\n const response = decodeData(anyData);\n\n for (const listener of this.responseEventListeners.values()) {\n listener(response as never);\n }\n\n break;\n }\n\n case EToClientMessageType.Command: {\n const commandAsString = decodeData(anyData);\n Logger.colored(...COLOR_CODES.FROM_UNREAL, commandAsString);\n const command = JSON.parse(commandAsString);\n\n if (command.command === 'onScreenKeyboard') {\n this.showOnScreenKeyboard(command);\n }\n break;\n }\n\n case EToClientMessageType.FreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Freeze frame');\n this.freezeFrame.start(view);\n break;\n\n case EToClientMessageType.UnfreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Un-Freeze frame');\n this.freezeFrame.invalidate();\n break;\n\n case EToClientMessageType.VideoEncoderAvgQP:\n this.stats.setEncoder(anyData);\n break;\n\n case EToClientMessageType.LatencyTest: {\n const latencyTimings = decodeData(anyData);\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Got latency timings :',\n latencyTimings,\n );\n Logger.colored(...COLOR_CODES.FROM_UNREAL, latencyTimings);\n this.stats.latencyTestTimings.SetUETimings(latencyTimings);\n break;\n }\n\n case EToClientMessageType.InitialSettings:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InitialSettings message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.Protocol:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Protocol message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.InputControlOwnership:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InputControlOwnership message :',\n anyData,\n );\n break;\n\n default:\n Logger.warn(`unrecognized data received, packet ID ${view[0]}`);\n }\n }\n}\n\nexport const filteredLogs = [\n {\n command: 'onChangeSequence',\n },\n];\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n OnInit,\n} from '@angular/core';\nimport { BehaviorSubject, combineLatestWith, Observable, of } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport type { InboundVideoStats } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { StatGraphComponent } from '../../components/stat-graph/stat-graph.component';\nimport { AsyncPipe, JsonPipe } from '@angular/common';\nimport { Store } from '@ngrx/store';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport { DevModeService } from '../../services/dev-mode.service';\nimport { SourceIconComponent } from '@source/ui-sdk/source-icon';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { selectSignalingParameters } from '../../store/unreal.selectors';\nimport { SafePipe } from '../../pipes/safe-html.pipe';\n\n@Component({\n selector: 'app-video-stats',\n templateUrl: './video-stats.component.html',\n styleUrls: ['./video-stats.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n StatGraphComponent,\n AsyncPipe,\n JsonPipe,\n SourceIconComponent,\n SafePipe,\n ],\n})\nexport class VideoStatsComponent implements OnInit {\n collapsed = false;\n private store = inject(Store);\n private videoStatGenerator = inject(VideoStreamStatusService);\n private isDevMode = inject(DevModeService).isDevMode;\n private obs$ = this.videoStatGenerator.videoStats$;\n\n viewportReady = toSignal(\n this.store.select(unrealFeature.selectViewportReady),\n );\n ssInfo = toSignal(this.store.select(selectSignalingParameters));\n fpsTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.framesPerSecond, hash: index }) as any,\n ),\n ),\n );\n fpsAvgTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.avgFrameRate, hash: index }) as any,\n ),\n ),\n );\n bitrateTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.bitrate, hash: index }) as any,\n ),\n ),\n );\n videoQP = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.VideoEncoderQP, hash: index }) as any,\n ),\n ),\n );\n bitrateAverageTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.avgBitrate, hash: index }) as any,\n ),\n ),\n );\n videoStatus = toSignal(\n this.obs$.pipe(\n map(\n (event) =>\n this.isDevMode &&\n ({\n ...event.aggregatedStats,\n quality: event.quality,\n } as InboundVideoStats),\n ),\n filter(Boolean),\n map((data: any) => {\n return this.fields\n .map((key) => {\n return {\n key,\n value: data[key],\n };\n })\n .filter((r) => !this.elementsToShow.includes(r.key));\n }),\n ),\n );\n fields!: string[];\n graphList: any[] = [];\n graphList$!: Observable<any>;\n private idKey = 'com.source3d.unreal.stat';\n private elementsToShow: string[] = [];\n\n private trigger$ = new BehaviorSubject<void>(undefined);\n\n constructor() {\n this.getFields();\n }\n\n ngOnInit() {\n this.fields = [\n 'kalmanBitrate',\n 'bitrateDrop',\n 'runTime',\n 'pixelRatio',\n 'frameHeight',\n 'frameWidth',\n ':-------------',\n 'jitter',\n 'MBytesReceived',\n 'framesDecoded',\n 'framesDropped',\n 'framesReceived',\n 'keyFramesDecoded',\n 'currentRoundTripTime',\n 'packetsLost',\n ':-------------',\n 'quality',\n 'videoCodec',\n 'kind',\n 'type',\n 'codecs',\n //'pliCount',\n //'sliCount',\n //'transportId',\n //'id',\n ];\n\n this.updateGraph();\n }\n\n updateGraph() {\n this.graphList = this.fields.map((key: any) => {\n const stat = this.obs$.pipe(\n map((val, index) => {\n const value = (val.aggregatedStats as any)[key];\n return { value, hash: index } as any;\n }),\n );\n\n return {\n key,\n color: Math.floor(Math.random() * 16777216),\n stat,\n };\n });\n\n this.graphList$ = of(this.graphList).pipe(\n combineLatestWith(this.trigger$),\n map(([graphList]) =>\n graphList.filter((r) => this.elementsToShow.includes(r.key)),\n ),\n );\n }\n\n toggle() {\n this.collapsed = !this.collapsed;\n this.writeFields();\n }\n\n toggleGraph($event: MouseEvent, el: string, value?: any) {\n $event.stopPropagation();\n if ((value && typeof value !== 'number') || isNaN(value)) {\n return;\n }\n if (this.elementsToShow.includes(el)) {\n this.elementsToShow = this.elementsToShow.filter((item) => item !== el);\n } else {\n this.elementsToShow.push(el);\n }\n this.writeFields();\n this.trigger$.next();\n }\n\n private getFields() {\n try {\n const { elements, collapsed } =\n JSON.parse(localStorage.getItem(this.idKey) as string) || [];\n this.elementsToShow = elements || [];\n this.collapsed = collapsed;\n } catch {\n this.elementsToShow = [];\n }\n }\n\n private writeFields() {\n localStorage.setItem(\n this.idKey,\n JSON.stringify({\n collapsed: this.collapsed,\n elements: this.elementsToShow,\n }),\n );\n }\n}\n","@if (videoStatus()) {\n @if (viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">\n <src-icon [name]=\"'settings'\" />\n </button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [dataTick]=\"fpsTick()\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgFPS (higher is better)\"\n [dataTick]=\"fpsAvgTick()\"\n color=\"#00aa00\"\n />\n </li>-->\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgBitrate\"\n [dataTick]=\"bitrateAverageTick()\"\n color=\"#D50007\"\n />\n </li>-->\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n }\n}\n","import type { OnInit } from '@angular/core';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { Falsy, tapLog, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { combineLatestWith, merge, of, skip, Subject, switchMap } from 'rxjs';\nimport { debounceTime, delay, filter, map, tap } from 'rxjs/operators';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { VideoStatsComponent } from '../../components/video-stats/video-stats.component';\nimport { floatToSmoothPercents } from '../../helpers/float-to-smooth-percents';\nimport { clampAndKeepMaxPercents } from '../../helpers/clamp-and-keep-max-percents';\nimport { SourceLoadingComponent } from '@source/ui-sdk/source-loading';\nimport {\n selectShowLoader,\n selectTotalProgress,\n} from '../../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DevModeService } from '../../services/dev-mode.service';\n\n@Component({\n selector: 'app-unreal-status',\n templateUrl: './unreal-status.component.html',\n styleUrls: ['./unreal-status.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [VideoStatsComponent, SourceLoadingComponent],\n})\nexport class UnrealStatusComponent implements OnInit {\n message$!: Observable<string | null>;\n #store = inject(Store);\n #onDisconnect$ = this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(filter(Falsy));\n\n readonly isDevMode = inject(DevModeService).isDevMode;\n\n /**\n * An observable that emits smoothed percentage values from 0 to 100.\n */\n readonly messagePercents$ = toSignal(\n this.#onDisconnect$.pipe(\n switchMap(() =>\n this.#store.select(selectTotalProgress).pipe(\n floatToSmoothPercents(),\n clampAndKeepMaxPercents(),\n combineLatestWith(this.#store.select(selectShowLoader)),\n map(([progress, showLoader]) => (showLoader ? progress || 0 : null)),\n ),\n ),\n ),\n );\n\n ngOnInit() {\n /**\n * A subject that emits null values to trigger nullification.\n */\n const nullify$ = new Subject<null>();\n\n /**\n * An observable that emits null values with a delay of 2000 milliseconds.\n */\n const nullifyObs$: Observable<null> = nullify$\n .asObservable()\n .pipe(delay(2000));\n\n /**\n * An observable that emits the status message from the Unreal feature store.\n */\n const signalingStatus$ = this.#store.select(\n unrealFeature.selectStatusMessage,\n );\n\n /**\n * An observable that emits connection status messages based on the Cirrus connection state.\n * Then call side effect to nullify the message.\n */\n const cirrusConnected$ = this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(\n skip(1),\n switchMap((connected) =>\n connected\n ? of('Creating Socket...')\n : of('Connection closed.').pipe(tap(() => nullify$.next(null))),\n ),\n );\n\n /**\n * An observable that emits the viewport visibility state.\n */\n const viewportTrigger$ = this.#store.select(\n unrealFeature.selectViewportReady,\n );\n\n /**\n * An observable that will nullify any message displayed after 500 mSec, when viewport changes its state.\n */\n const streamToggle$ = merge(\n viewportTrigger$.pipe(filter(Falsy), skip(1)),\n viewportTrigger$.pipe(filter(Truthy)),\n ).pipe(\n delay(500),\n map(() => null),\n );\n\n /**\n * An observable that merges various status observables and emits debounced status messages.\n */\n this.message$ = merge(\n nullifyObs$,\n cirrusConnected$,\n signalingStatus$,\n streamToggle$,\n ).pipe(\n debounceTime(0),\n tap((status) => this.sendMessageToIndex(status as string)),\n tapLog('STATUS'),\n );\n }\n\n /**\n * Sends a message to the embedded iframe identified by the '3dsource_start_screen' ID.\n * This function tries to post a message to the iframe's content window. If the content\n * window is not accessible (e.g., due to cross-origin policies), the function fails silently.\n *\n * @param {string} text The message to be sent to the iframe. This could be a status update\n * or any other relevant information that the iframe needs to process.\n */\n private sendMessageToIndex(text: string) {\n const objectElement = document.getElementById(\n '3dsource_start_screen',\n ) as HTMLIFrameElement;\n\n try {\n const objectDocument = objectElement.contentWindow;\n objectDocument?.postMessage(text, '*');\n } catch {\n // Fails silently if the iframe's content window cannot be accessed\n }\n }\n}\n","@if (messagePercents$() !== null) {\n <div class=\"status-box\">\n <div class=\"status-box__message\">\n <src-loading\n [size]=\"30\"\n [backgroundStrokeColor]=\"'#E5E7EB'\"\n [progressStrokeColor]=\"'#1F2937'\"\n />\n {{ messagePercents$() }}%\n </div>\n </div>\n}\n\n@if (isDevMode) {\n <app-video-stats />\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n HostListener,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewChild,\n} from '@angular/core';\nimport { distinctUntilChanged, filter, map, tap } from 'rxjs/operators';\nimport {\n combineLatestWith,\n debounceTime,\n fromEvent,\n merge,\n switchMap,\n take,\n timer,\n} from 'rxjs';\nimport { VideoService } from '../../services/video.service';\nimport { AggregatorService } from '../../services/aggregator.service';\nimport { InputService } from '../../services/input.service';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport type { Area, Size } from '@3dsource/utils';\nimport { fitIntoRectangle, fpIsASameAsB, Truthy } from '@3dsource/utils';\nimport { Store } from '@ngrx/store';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport {\n changeStreamResolutionAction,\n destroyConnectionsAndResetState,\n initSignalling,\n resetUnrealStateAction,\n} from '../../store/unreal.actions';\nimport {\n DEBOUNCE_TO_MANY_RESIZE_CALLS,\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n SAME_SIZE_THRESHOLD,\n} from '../../constants/unreal.constant';\nimport { StreamStatusTelemetryService } from '../../services/stream-status-telemetry.service';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport { fromSignal, sendSignal } from '../../helpers/EventWrapper';\nimport { AfkRestartScreenLockerComponent } from '../../components/screen-locker/afk-restart-screen-locker.component';\nimport { ClickableOverlayComponent } from '../../components/clickable-overlay/clickable-overlay.component';\nimport { UnrealCommunicatorService } from '../../services/unreal-communicator.service';\nimport { UnrealStatusComponent } from '../../components/unreal-status/unreal-status.component';\nimport { getChangeResolutionCommand } from '../../helpers/prepare-commands';\nimport { FreezeFrameComponent } from '../../components/freeze-frame/freeze-frame.component';\nimport { selectIsFreezeFrameLoading } from '../../store/unreal.selectors';\n\n@Component({\n selector: 'app-unreal-scene',\n templateUrl: './unreal-scene.component.html',\n styleUrls: ['./unreal-scene.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AfkRestartScreenLockerComponent,\n ClickableOverlayComponent,\n UnrealStatusComponent,\n FreezeFrameComponent,\n ],\n})\nexport class UnrealSceneComponent implements AfterViewInit, OnInit, OnDestroy {\n isStudio = input(false);\n useContainerAsSizeProvider = input(true);\n studioResolutionSize = input<{ width: number; height: number }>({\n width: FULL_HD_WIDTH,\n height: FULL_HD_HEIGHT,\n });\n studioResolutionValues = toObservable(\n computed(() => {\n const values = this.studioResolutionSize();\n return { width: values.width, height: values.height };\n }),\n );\n private width = FULL_HD_WIDTH;\n private height = FULL_HD_HEIGHT;\n private store = inject(Store);\n private aggregatorService = inject(AggregatorService);\n private commandsSender = inject(UnrealCommunicatorService);\n private inputService = inject(InputService);\n private videoService = inject(VideoService);\n private stats = inject(VideoStreamStatusService);\n private streamTelemetryService = inject(StreamStatusTelemetryService);\n private element = inject(ElementRef);\n private destroyRef = inject(DestroyRef);\n\n lightMode = toSignal(this.store.select(unrealFeature.selectLowBandwidth));\n isFreezeFrameLoading = toSignal(\n this.store.select(selectIsFreezeFrameLoading),\n );\n\n @ViewChild('container') container!: ElementRef;\n changeMouseOverScene = output<boolean>();\n\n @HostListener('mouseover')\n onMouseOver() {\n this.changeMouseOverScene.emit(true);\n }\n\n @HostListener('mouseout')\n onMouseOut() {\n this.changeMouseOverScene.emit(false);\n }\n\n ngOnInit() {\n this.streamTelemetryService.init();\n this.aggregatorService.init();\n this.inputService.useKeyboardKeys(this.inputService.defaultKeys);\n this.store.dispatch(initSignalling());\n }\n\n ngAfterViewInit() {\n fromEvent<Event>(this.element.nativeElement, 'contextmenu')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: Event) => event.preventDefault());\n\n this.videoService.container = this.container.nativeElement;\n\n const customSizeInputChanged$ = this.studioResolutionValues.pipe(\n filter(Truthy),\n distinctUntilChanged(),\n filter(\n ({ width, height }) => this.width !== width || this.height !== height,\n ),\n map(({ width, height }) => ({ width, height })),\n tap(({ width, height }) => {\n this.width = width;\n this.height = height;\n }),\n );\n\n const resizeRequired$ = merge(\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized),\n fromEvent(window, 'resize'),\n );\n\n const videoStreamSizeChanged$ = this.stats?.videoStats$.pipe(\n filter(() => !this.isFreezeFrameLoading()),\n map((stats) => ({\n w: stats.aggregatedStats.frameWidth || 0,\n h: stats.aggregatedStats.frameHeight || 0,\n })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n );\n\n merge(customSizeInputChanged$, resizeRequired$, videoStreamSizeChanged$)\n .pipe(\n debounceTime(DEBOUNCE_TO_MANY_RESIZE_CALLS),\n switchMap(() => {\n const key = Math.random();\n\n // Monitoring the size of the video stream\n return timer(0, 300).pipe(\n take(3),\n map(() => key),\n );\n }),\n map((key) => ({ key, ...this.resizeValues })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD) &&\n previous.key === current.key,\n ),\n tap((size) => this.adaptVideo(size)),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n combineLatestWith(\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy)),\n ),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(([size]) => {\n this.store.dispatch(\n changeStreamResolutionAction({ width: size.w, height: size.h }),\n );\n this.sendResize(size);\n });\n\n fromSignal(UnrealInternalSignalEvents.ForceResizeViewport)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.sendResize(this.resizeValues);\n });\n }\n\n ngOnDestroy() {\n this.commandsSender.destroy();\n this.store.dispatch(destroyConnectionsAndResetState());\n this.store.dispatch(resetUnrealStateAction());\n }\n\n private adaptVideo(size: Size) {\n const video = this.videoService.video;\n const areaSize = this.resizeValues;\n\n if (video?.style) {\n const pR = this.pixelRatio;\n video.width = size.w / pR / areaSize.scale;\n video.height = size.h / pR / areaSize.scale;\n\n if (!this.isStudio()) {\n video.style.objectFit = 'cover';\n video.style.width = '100%';\n video.style.height = '100%';\n }\n }\n\n sendSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer);\n }\n\n private get resizeValues(): Area {\n if (!this.isStudio()) {\n return this.getResizeValuesUniversal();\n }\n\n return this.getResizeValues();\n }\n\n /**\n * This method calculates the dimensions for resizing a layout in a configurator stream.\n * It takes into account the pixel ratio of the device's screen and the orientation of the layout.\n * The method uses the `fitIntoRectangle` function to calculate the dimensions that would allow the layout to fit into the maximum space while maintaining its aspect ratio.\n * It also sets the maximum limits for the width and height based on the layout's orientation.\n * If the scale of the fitted dimensions is less than 1, it assigns the fitted dimensions to the output. Otherwise, it sets the scale of the output to 1.\n * @returns {Area} An object of type `Area` that contains the calculated dimensions for resizing the layout.\n */\n private getResizeValuesUniversal(): Area {\n const pR = this.pixelRatio;\n let containerW = window.innerWidth || 1;\n let containerH = window.innerHeight || 1;\n\n if (this.useContainerAsSizeProvider()) {\n containerW = this.container?.nativeElement.offsetWidth || 1;\n containerH = this.container?.nativeElement.offsetHeight || 1;\n }\n\n const maxSpace = { w: containerW * pR, h: containerH * pR };\n\n const isVertical = containerW < containerH;\n let maxH = FULL_HD_HEIGHT;\n let maxW = FULL_HD_WIDTH;\n\n const params = new URLSearchParams(location.search);\n const maxRes = params.get('maxresolution');\n\n if (Truthy(maxRes)) {\n maxH = FULL_HD_HEIGHT * 2;\n maxW = FULL_HD_WIDTH * 2;\n }\n\n const maxLimits = isVertical\n ? { w: maxH, h: maxW, x: 0, y: 0 }\n : { w: maxW, h: maxH, x: 0, y: 0 };\n\n const props = fitIntoRectangle(\n { x: 0, y: 0, w: containerW, h: containerH },\n { x: 0, y: 0, ...maxSpace },\n );\n\n let out = { ...props };\n\n const fitIntoMax = fitIntoRectangle(props, maxLimits);\n if (fitIntoMax.scale < 1) {\n // If reducing size to 1920x1080 is required, do it\n out = fitIntoMax;\n } else {\n // Otherwise, use the lowest resolution, because layout size is smaller than 1920x1080\n out.scale = 1;\n }\n\n return { ...out };\n }\n\n private getResizeValues(): Area {\n const pR = this.pixelRatio;\n const containerW = pR * (this.container?.nativeElement.offsetWidth || 1);\n const containerH = pR * (this.container?.nativeElement.offsetHeight || 1);\n const maxSpace = { w: containerW, h: containerH };\n\n const videoSizePixelPerfect = fitIntoRectangle(\n { x: 0, y: 0, w: this.width, h: this.height },\n { x: 0, y: 0, ...maxSpace },\n );\n\n return fitIntoRectangle(videoSizePixelPerfect, {\n x: 0,\n y: 0,\n w: Math.min(containerW, FULL_HD_WIDTH),\n h: Math.min(containerH, FULL_HD_HEIGHT),\n });\n }\n\n private sendResize(size: Size) {\n this.commandsSender.sendCommandToUnreal(\n getChangeResolutionCommand({\n resolution: {\n x: size.w,\n y: size.h,\n },\n }),\n );\n }\n\n private get pixelRatio() {\n return window.devicePixelRatio;\n }\n}\n","<div class=\"frame unreal-container\">\n <div #container [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\n\n <app-unreal-status />\n <app-freeze-frame />\n <app-clickable-overlay />\n <app-afk-restart-screen-locker />\n\n <ng-content select=\"app-video-locker\"></ng-content>\n <ng-content select=\"app-pdf\"></ng-content>\n <ng-content select=\"app-show-case\"></ng-content>\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\n</div>\n","import type { AfterViewInit, ElementRef, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n ViewChild,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AsyncPipe, NgOptimizedImage } from '@angular/common';\nimport { Truthy } from '@3dsource/utils';\nimport { filter } from 'rxjs/operators';\nimport { combineLatest, first, map } from 'rxjs';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { resetIntroSrc } from '../../store/unreal.actions';\n\n@Component({\n selector: 'app-video-locker',\n templateUrl: './video-locker.component.html',\n styleUrl: './video-locker.component.scss',\n imports: [AsyncPipe, NgOptimizedImage],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VideoLockerComponent implements AfterViewInit, OnInit {\n @ViewChild('videoPlayerCover', { static: false })\n videoElement!: ElementRef<HTMLDivElement>;\n private store = inject(Store);\n private destroyRef = inject(DestroyRef);\n protected videoIntroSrc$ = this.store.select(\n unrealFeature.selectVideoIntroSrc,\n );\n protected imageIntroSrc$ = this.store\n .select(unrealFeature.selectImageIntroSrc)\n .pipe(\n map((src) => {\n // TODO need for demos site and need to delete this and move to demos\n if (!src) {\n return null;\n }\n const matchAbsolutePath = !!src.match(\n /.*\\.(png|avif|jpg|webp|svg)(\\?.*)?$/i,\n );\n if (matchAbsolutePath) {\n return src;\n }\n return src;\n }),\n );\n\n ngOnInit() {\n combineLatest([\n this.store.select(unrealFeature.selectViewportReady),\n this.videoIntroSrc$,\n this.imageIntroSrc$,\n ])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(\n ([viewportReady, videoSrc, imageSrc]) =>\n viewportReady && (!!videoSrc || !!imageSrc),\n ),\n first(),\n )\n .subscribe(() => this.store.dispatch(resetIntroSrc()));\n }\n\n ngAfterViewInit() {\n this.videoIntroSrc$\n .pipe(filter(Truthy), takeUntilDestroyed(this.destroyRef))\n .subscribe((src) => this.createVideo(src));\n }\n\n private createVideo(src: string) {\n // Select the parent layout where the video will be inserted\n const videoContainer = this.videoElement.nativeElement;\n videoContainer.innerHTML = ''; // This will remove all existing content within the layout\n // Create the video element\n const videoElement = document.createElement('video');\n videoElement.autoplay = true;\n videoElement.muted = true;\n videoElement.loop = true;\n videoElement.poster = `${src}/cover.webp`;\n\n videoElement.style.position = 'absolute';\n videoElement.style.width = '100%';\n videoElement.style.height = '100%';\n videoElement.style.objectFit = 'cover';\n\n const sourceElement = document.createElement('source');\n sourceElement.src = `${src}/video.mp4`;\n sourceElement.type = 'video/mp4';\n\n // Append the source element to the video element\n videoElement.appendChild(sourceElement);\n\n // Handle browser fallback text\n videoElement.innerHTML += 'Browser not supported';\n\n // Append the video element to the layout\n videoContainer.appendChild(videoElement);\n }\n}\n","@if (imageIntroSrc$ | async; as url) {\n <div class=\"backImage\">\n <img [ngSrc]=\"url\" fill alt=\"Loading...\" />\n </div>\n} @else if (videoIntroSrc$ | async) {\n <div #videoPlayerCover class=\"backVideo\"></div>\n}\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { first } from 'rxjs/operators';\nimport { SourceRoundButtonComponent } from '@source/ui-sdk/source-round-button';\nimport { SourceButtonComponent } from '@source/ui-sdk/source-button';\nimport { destroyConnectionsAndResetState } from '../../store/unreal.actions';\n\n@Component({\n selector: 'app-webrtc-error-modal',\n templateUrl: './webrtc-error-modal.component.html',\n styleUrl: './webrtc-error-modal.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceRoundButtonComponent, SourceButtonComponent],\n})\nexport class WebrtcErrorModalComponent {\n dialogRef = inject(DialogRef);\n #store = inject(Store);\n\n close() {\n this.dialogRef.close();\n }\n\n closeModalWithCirrusDisconnect() {\n this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(first())\n .subscribe((isConnected) => {\n if (!isConnected) {\n this.#store.dispatch(destroyConnectionsAndResetState());\n }\n this.close();\n });\n }\n}\n","<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n <src-round-button\n (onClick)=\"close()\"\n [icon]=\"'close'\"\n [data-testid]=\"'close'\"\n class=\"src-modal__close\"\n >\n </src-round-button>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n colorScheme=\"primary\"\n >Ok</src-button\n >\n </footer>\n</div>\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NgIf } from '@angular/common';\nimport { SourceIconComponent } from '@source/ui-sdk/source-icon';\nimport { Logger, Signal, Truthy } from '@3dsource/utils';\nimport { DefaultFilterModel, FilterModel } from '../DataFlowConstants';\n\n@Component({\n selector: 'app-filter-settings',\n templateUrl: './filter-settings.component.html',\n styleUrls: ['./filter-settings.component.scss'],\n imports: [FormsModule, NgIf, SourceIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterSettingsComponent implements OnInit {\n private readonly storageKey = 'LBMFilterSettings';\n readonly defaultFilterModel = { ...DefaultFilterModel };\n settings = { ...DefaultFilterModel };\n\n ngOnInit(): void {\n const savedSettings = localStorage.getItem(this.storageKey);\n if (savedSettings) {\n this.dispatch(JSON.parse(savedSettings));\n }\n }\n\n togglePanel() {\n this.settings.panelOpen = !this.settings.panelOpen;\n this.saveSettings();\n }\n\n saveSettings() {\n const valid = Object.entries(this.settings).reduce((acc, [key, value]) => {\n return Truthy(value) ? { ...acc, [key]: value } : acc;\n }, {});\n this.dispatch({ ...DefaultFilterModel, ...valid });\n }\n\n dispatch(model: typeof DefaultFilterModel) {\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(model));\n } catch (e) {\n Logger.error('Storage not available, Error saving filter settings:', e);\n }\n Object.assign(this.settings, model);\n Object.assign(FilterModel, model);\n Signal.broadcast('setKalmanParams', model);\n }\n\n reset() {\n this.dispatch({\n ...DefaultFilterModel,\n panelOpen: this.settings.panelOpen,\n });\n }\n}\n","<!-- filter-settings.component.html -->\n<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">\n <src-icon [name]=\"'settings'\" />\n </button>\n\n <div *ngIf=\"settings.panelOpen\" class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n</div>\n","import type { OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { filter, tap } from 'rxjs/operators';\nimport { LowBandwidthModalComponent } from '../low-bandwidth-modal/low-bandwidth-modal.component';\nimport { Store } from '@ngrx/store';\nimport { Falsy, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { changeLowBandwidth } from '../../store/unreal.actions';\nimport {\n combineLatestWith,\n concat,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n of,\n share,\n skip,\n switchMap,\n take,\n takeUntil,\n timer,\n} from 'rxjs';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport type { Quality } from '../../interfaces/quality.interface';\nimport type { DataFlowCheckResult } from '../../helpers/DataFlowMonitor';\nimport {\n BITRATE_MONITOR,\n FilterModel,\n} from '../../components/low-bandwidth-indicator/DataFlowConstants';\nimport { DevModeService } from '../..//services/dev-mode.service';\nimport { FilterSettingsComponent } from '../../components/low-bandwidth-indicator/filter-settings/filter-settings.component';\n\n@Component({\n selector: 'app-low-bandwidth-detector',\n templateUrl: './low-bandwidth-detector.component.html',\n styleUrls: ['./low-bandwidth-detector.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FilterSettingsComponent],\n})\nexport class LowBandwidthDetectorComponent implements OnInit {\n private readonly store = inject(Store);\n private readonly dialog = inject(Dialog);\n private readonly destroyRef = inject(DestroyRef);\n private readonly videoStatGenerator = inject(VideoStreamStatusService);\n readonly devModeService = inject(DevModeService);\n\n private readonly viewportReady$ = this.store.select(\n unrealFeature.selectViewportReady,\n );\n private readonly isLowBandwidth$ = this.store.select(\n unrealFeature.selectLowBandwidth,\n );\n private readonly lowBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Truthy),\n );\n private readonly highBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly viewPortDestroyedTrigger$ = this.viewportReady$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly aggregatedStats$ = this.videoStatGenerator.videoStats$.pipe(\n map((data) => data.aggregatedStats),\n share(),\n );\n private readonly nativeQuality$ = this.videoStatGenerator.videoStats$.pipe(\n map((data) => data.quality),\n );\n\n private readonly monitoringTrigger$ = this.viewportReady$\n .pipe(\n combineLatestWith(this.isLowBandwidth$),\n map(\n ([viewPortReady, isLowBandwidth]) => viewPortReady && !isLowBandwidth,\n ),\n )\n .pipe(share());\n\n private readonly reTrigger$ = this.monitoringTrigger$.pipe(\n map(() => ({ quality: 'lime' as Quality })),\n );\n\n private readonly canSwitchToLowBand$ = this.monitoringTrigger$.pipe(\n debounceTime(100),\n switchMap((canSwitch) =>\n concat(\n of(false),\n timer(FilterModel.monitoringDelayTime).pipe(map(() => canSwitch)),\n ).pipe(take(2), takeUntil(this.monitoringTrigger$)),\n ),\n distinctUntilChanged(),\n tapLog('DROP: [LOWBANDWIDTH] Monitoring Active =>'),\n share(),\n );\n\n private readonly videoQuality$ = merge(\n this.nativeQuality$,\n this.reTrigger$,\n ).pipe(share(), takeUntil(this.viewPortDestroyedTrigger$));\n\n private readonly fps$ = this.aggregatedStats$.pipe(\n map((data) => data.framesPerSecond || 0),\n );\n\n private readonly bitrateDrop$ = this.aggregatedStats$.pipe(\n map((data) => data.dataFlowCheckResult),\n filter((br) => br.isDropDetected),\n takeUntil(merge(this.viewPortDestroyedTrigger$, this.reTrigger$)),\n );\n\n readonly fps = toSignal(this.fps$);\n readonly nativeQuality = toSignal(this.nativeQuality$);\n readonly isLowBandwidth = toSignal(this.isLowBandwidth$);\n readonly aggregatedStats = toSignal(this.aggregatedStats$);\n readonly isReducedQuality = signal(false);\n readonly isIndicatorExpanded = signal(false);\n\n readonly isIndicatorExpandedTrigger$ = toObservable(\n this.isIndicatorExpanded,\n ).pipe(skip(1), distinctUntilChanged(), filter(Falsy));\n\n ngOnInit() {\n this.lowBandwidthTrigger$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.toggleIndicator(true));\n\n merge(this.viewPortDestroyedTrigger$, this.highBandwidthTrigger$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.isReducedQuality.set(false));\n\n this.canSwitchToLowBand$\n .pipe(\n filter(Truthy),\n tap(() => {\n BITRATE_MONITOR.reset();\n this.isReducedQuality.set(false);\n }),\n switchMap(() => this.bitrateDrop$),\n tap(this.trySetLowBandwidth.bind(this)),\n map((dataFlowResult) => dataFlowResult?.isDropDetected),\n distinctUntilChanged(),\n tap(() => {\n this.isReducedQuality.set(true);\n }),\n switchMap(() => this.videoQuality$),\n filter((quality) => quality === 'lime'),\n tap(() => this.isReducedQuality.set(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private trySetLowBandwidth(dataFlowResult: DataFlowCheckResult) {\n // Evaluate FPS and native quality\n const isFpsLow = this.fps()! < FilterModel.minimumFps;\n const isNativeQualityRed = this.nativeQuality() === 'red';\n const shouldSwitch = isNativeQualityRed || isFpsLow;\n\n // Exit if conditions are not met or already in low bandwidth\n if (!shouldSwitch || this.isLowBandwidth()) return;\n\n const { quality, activeMedian } = dataFlowResult;\n const isQualityRed = quality === 'red';\n const isLowBitrate = activeMedian < FilterModel.minimumBitrate;\n\n // Final check for red drop or low bitrate, or low FPS\n if (isQualityRed || isLowBitrate || isFpsLow) {\n let reason: string;\n\n if (isFpsLow) {\n reason = `FPS < ${FilterModel.minimumFps}`;\n } else if (quality === 'red') {\n reason = `Drop > ${FilterModel.redFlag}%`;\n } else {\n reason = `Speed < ${FilterModel.minimumBitrate}`;\n }\n\n Logger.info(\n `LBM DETECTED: ${reason}, switching to low bandwidth; `,\n dataFlowResult.message,\n );\n\n this.store.dispatch(\n changeLowBandwidth({\n lowBandwidth: true,\n stats: {\n dataFlowResult,\n reason,\n triggerTime: this.aggregatedStats()?.runTime ?? 0,\n },\n }),\n );\n }\n }\n\n toggleIndicator(value: boolean) {\n this.isIndicatorExpanded.set(value);\n\n if (value) {\n this.hideIndicatorAfterDelay();\n }\n }\n\n hideIndicatorAfterDelay() {\n timer(3000)\n .pipe(take(1), takeUntil(this.isIndicatorExpandedTrigger$))\n .subscribe(() => this.toggleIndicator(false));\n }\n\n openLBMDialog() {\n this.dialog\n .open(LowBandwidthModalComponent)\n .closed.pipe(filter(Truthy))\n .subscribe(() => {\n this.toggleIndicator(false);\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));\n });\n }\n}\n","@if (isReducedQuality() || isLowBandwidth()) {\n <div\n [class.expanded]=\"isIndicatorExpanded() && isLowBandwidth()\"\n class=\"lbm-indicator freeze-loader\"\n >\n <div (click)=\"toggleIndicator(true)\" class=\"lbm-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"#85888E\"\n d=\"M7.189 3.605c-.73.145-1.438.35-2.126.614A14.412 14.412 0 0 0 .896 6.666a1.08 1.08 0 0 0-.375.844c0 .34.118.629.354.865s.524.36.865.375c.34.014.65-.09.927-.313a11.89 11.89 0 0 1 3.385-1.916 10.94 10.94 0 0 1 1.235-.375l-.098-2.541ZM7.385 8.708a9.107 9.107 0 0 0-2.906 1.48c-.264.194-.402.464-.416.812-.014.347.104.646.354.896.236.236.524.364.864.385.34.02.664-.073.97-.281.422-.29.878-.53 1.368-.721a2.545 2.545 0 0 1-.166-.814l-.068-1.757ZM12.386 11.267c.094-.25.15-.52.161-.802l.068-1.755a9.019 9.019 0 0 1 2.927 1.52c.264.193.4.46.406.801.007.34-.114.635-.364.885a1.213 1.213 0 0 1-.865.365A1.614 1.614 0 0 1 13.77 12a6.574 6.574 0 0 0-1.385-.733ZM12.713 6.146l.098-2.542c.73.146 1.438.351 2.127.615 1.541.59 2.93 1.406 4.166 2.447.25.223.379.5.386.834.007.333-.115.625-.365.875a1.253 1.253 0 0 1-.864.375c-.34.014-.65-.09-.927-.313a11.892 11.892 0 0 0-3.386-1.916 10.94 10.94 0 0 0-1.235-.375ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n />\n <path\n fill=\"#fff\"\n fill-rule=\"evenodd\"\n d=\"M10 .833c-.91 0-1.637.756-1.602 1.665l.304 7.92a1.299 1.299 0 0 0 2.596 0l.305-7.92A1.604 1.604 0 0 0 10 .833ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div\n [class.lbm-message--open]=\"isLowBandwidth() && isIndicatorExpanded()\"\n class=\"lbm-message\"\n >\n <p class=\"lbm-description\">\n Fluid Interactivity Modes were disabled due to an unstable connection.\n\n <button\n (click)=\"openLBMDialog()\"\n [attr.data-testid]=\"'learn-more-lbm'\"\n type=\"button\"\n class=\"lbm-learn-more\"\n >\n Learn more\n </button>\n </p>\n <button\n (click)=\"toggleIndicator(false)\"\n [attr.data-testid]=\"'close-lbm-indicator'\"\n type=\"button\"\n class=\"lbm-close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 11.2289L6.68618 14.5428C6.51951 14.7095 6.31818 14.7895 6.08218 14.7828C5.84618 14.7755 5.64485 14.6885 5.47818 14.5218C5.31151 14.3552 5.22818 14.1505 5.22818 13.9078C5.22818 13.6645 5.31151 13.4595 5.47818 13.2928L8.77107 9.99992L5.45718 6.68603C5.29051 6.51936 5.21051 6.3147 5.21718 6.07203C5.22451 5.8287 5.31151 5.6237 5.47818 5.45703C5.64485 5.29036 5.84951 5.20703 6.09218 5.20703C6.33551 5.20703 6.54051 5.29036 6.70718 5.45703L10.0001 8.77092L13.314 5.45703C13.4806 5.29036 13.6853 5.20703 13.928 5.20703C14.1713 5.20703 14.3763 5.29036 14.543 5.45703C14.7096 5.6237 14.793 5.8287 14.793 6.07203C14.793 6.3147 14.7096 6.51936 14.543 6.68603L11.2291 9.99992L14.543 13.3138C14.7096 13.4805 14.793 13.6818 14.793 13.9178C14.793 14.1538 14.7096 14.3552 14.543 14.5218C14.3763 14.6885 14.1713 14.7718 13.928 14.7718C13.6853 14.7718 13.4806 14.6885 13.314 14.5218L10.0001 11.2289Z\"\n fill=\"white\"\n />\n </svg>\n </button>\n </div>\n </div>\n}\n\n@if (devModeService.isDevMode) {\n <app-filter-settings />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["skip","tap","switchMap","takeUntil","map","debounceTime","first","distinctUntilChanged"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"3dsource-angular-unreal-module.mjs","sources":["../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/unreal-internal-signal-events.interface.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/EventWrapper.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/clickable-overlay/clickable-overlay.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.actions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/interfaces/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/constants/ButtonsAndCodes.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EControlSchemeType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/EToClientMessageType.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/initial-config.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/InputOptions.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/UnrealStatusMessage.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/constants/unreal.constant.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/clamp-and-keep-max-percents.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/CommandObserver.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataDecoder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/DataFlowMonitor.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/dispatchResize.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/GetNextUrl.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/KalmanFilter1D.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/LatencyTimings.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/mapQpToQuality.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/prepare-commands.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/remove-exile-commands.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resetAfk.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/resize-observer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/TouchEmulator.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/VideoRecorder.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.reducer.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.feature.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/store/unreal.selectors.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/freeze-frame/freeze-frame.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/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/services/sub.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/screen-locker/afk-restart-screen-locker.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/screen-locker/afk-restart-screen-locker.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/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/services/freeze-frame.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/command-telemetry.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/regions-ping.service.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/components/low-bandwidth-indicator/DataFlowConstants.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/video-stream-status.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/afk.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/dev-mode.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/console-extensions.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/unreal-communicator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/input.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/stream-status-telemetry.service.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/store/unreal.effects.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/helpers/deepEqual.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/services/aggregator.service.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-stats/video-stats.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-status/unreal-status.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/unreal-scene/unreal-scene.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-locker/video-locker.component.ts","../../../../projects/3dsource/angular-unreal-module/src/lib/components/video-locker/video-locker.component.html","../../../../projects/3dsource/angular-unreal-module/src/lib/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/3dsource-angular-unreal-module.ts"],"sourcesContent":["import type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\nimport type { Quality } from './quality.interface';\nimport type { DataFlowCheckResult } from '../helpers';\n\nexport const UnrealInternalSignalEvents = {\n OnVideoInitialized: 'OnVideoInitialized',\n RestAfkTimer: 'RestAfkTimer',\n FreezeFrameStart: 'FreezeFrameStart',\n UnrealCallback: 'UnrealCallback',\n ClickableOverlay: 'ClickableOverlay',\n VideoPlayClick: 'VideoPlayClick',\n ShowPlayButton: 'ShowPlayButton',\n ForceResizeViewport: 'ForceResizeViewport',\n VideoAdaptedToContainer: 'VideoAdaptedToContainer',\n TelemetryStart: 'TelemetryStart',\n TelemetryStop: 'TelemetryStop',\n TelemetryReset: 'TelemetryReset',\n} as const;\n\nexport interface SignalDescriptor {\n [UnrealInternalSignalEvents.UnrealCallback]: {\n json: UnrealCallBackJson;\n };\n [UnrealInternalSignalEvents.ClickableOverlay]: {\n message: string;\n className: string;\n isActivityDetected: boolean;\n onOverlayClick: () => void;\n } | void;\n [UnrealInternalSignalEvents.VideoPlayClick]: {\n text: string;\n };\n [UnrealInternalSignalEvents.ForceResizeViewport]: void;\n [UnrealInternalSignalEvents.OnVideoInitialized]: HTMLVideoElement;\n [UnrealInternalSignalEvents.VideoAdaptedToContainer]: void;\n [UnrealInternalSignalEvents.ShowPlayButton]: {\n text: string;\n callback: () => boolean;\n };\n [UnrealInternalSignalEvents.RestAfkTimer]: void;\n [UnrealInternalSignalEvents.FreezeFrameStart]: void;\n [UnrealInternalSignalEvents.TelemetryReset]: void;\n [UnrealInternalSignalEvents.TelemetryStart]: { externalId: string };\n [UnrealInternalSignalEvents.TelemetryStop]: {\n externalId: string;\n payload?: { multi?: boolean };\n };\n\n [key: string]: any;\n}\n\nexport type UnrealCallBackJson =\n | MetaBoxCommandPacket\n | WrappedMetaBoxCommandPacket;\n\nexport interface WrappedMetaBoxCommandPacket {\n commandCallback: MetaBoxCommandPacket;\n}\n\nexport interface IAggregatedStat {\n quality: Quality;\n aggregatedStats: InboundVideoStats;\n}\n\nexport interface InboundVideoStats extends RTCInboundRtpStreamStats {\n VideoEncoderQP: number;\n runTime: number;\n pixelRatio: number;\n bytesReceivedStart: number;\n framesDecodedStart: number;\n timestampStart: number;\n videoCodec: string;\n avgBitrate: number;\n avgFrameRate: number;\n currentRoundTripTime: number;\n codecs: Record<string, string>;\n receiveToCompositeMs: number;\n bitrate: number;\n kalmanBitrate: number;\n bitrateDrop: number;\n dataFlowCheckResult: DataFlowCheckResult;\n dataFlowBitrate: DataFlowCheckResult;\n}\n\nexport interface AwsInstance {\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n}\n","import type { SignalDescriptor } from '../interfaces/unreal-internal-signal-events.interface';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport type { Observable } from 'rxjs';\nimport { Signal } from '@3dsource/utils';\nimport { filter, map } from 'rxjs/operators';\nimport type { MetaBoxCommandList } from '@3dsource/types-unreal';\n\ntype Descriptor = MetaBoxCommandList & SignalDescriptor;\n\n/**\n * UnrealInternalSignalEvents commands list wrapper listener\n * @param event\n */\nexport function fromSignal<K extends keyof Descriptor>(\n event: K,\n): Observable<Descriptor[K]> {\n return Signal.on(event).pipe(\n //tapLog('fromSignal', event), // <== for debugging, do not remove\n map((data: any) => data.detail),\n );\n}\n\ntype ArgumentType<K extends keyof Descriptor> = Descriptor[K] extends void\n ? never\n : Descriptor[K];\n\n/**\n * UnrealInternalSignalEvents commands list wrapper sender\n * @param event\n * @param args\n */\nexport function sendSignal<K extends keyof Descriptor>(\n event: K,\n ...args: ArgumentType<K> extends never ? [] : [ArgumentType<K>]\n) {\n Signal.broadcast(event, { detail: args?.[0] || null });\n}\n\nexport function fromUnrealCallBackSignal<K extends keyof Descriptor>(\n command: K,\n): Observable<Descriptor[K]> {\n return fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map((data) => data?.json),\n map((json) => {\n if ('commandCallback' in json) {\n return json?.commandCallback;\n }\n\n return json;\n }),\n filter((json) => json.command === command),\n map((data) => data),\n map((data) => {\n if ('payload' in data) {\n return {\n command: data.command,\n payload: data?.payload,\n } as Descriptor[K];\n }\n\n return {\n command: data.command,\n } as Descriptor[K];\n }),\n );\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { map } from 'rxjs/operators';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal } from '../../helpers/EventWrapper';\nimport { NgClass } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-clickable-overlay',\n templateUrl: './clickable-overlay.component.html',\n styleUrls: ['./clickable-overlay.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, SourceButtonComponent],\n})\nexport class ClickableOverlayComponent {\n state = toSignal(\n fromSignal(UnrealInternalSignalEvents.ClickableOverlay).pipe(\n map((data) => (typeof data === 'object' ? data : null)),\n ),\n );\n}\n","@if (state()) {\n <div\n (click)=\"state()?.onOverlayClick()\"\n [ngClass]=\"state()?.className\"\n id=\"videoPlayOverlay\"\n >\n @if (state()?.isActivityDetected) {\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"state()?.message\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [colorScheme]=\"'primary'\"\n [isFullWidth]=\"true\"\n [size]=\"'large'\"\n [data-testid]=\"'continue-session'\"\n >\n Continue\n </src-button>\n </div>\n }\n </div>\n}\n","import { createAction, props } from '@ngrx/store';\nimport {\n DisconnectType,\n LBMStats,\n SignalingData,\n StreamConfig,\n UnrealErrorType,\n} from '../interfaces';\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 changeLowBandwidth = createAction(\n scoped`change low bandwidth`,\n props<{\n lowBandwidth: boolean;\n stats?: LBMStats;\n }>(),\n);\nexport const setMaxFps = createAction(\n scoped`change fps`,\n props<{ maxFps: number }>(),\n);\nexport const destroyRemoteConnections = createAction(\n scoped`destroyRemoteConnections`,\n props<{ disconnectReason: DisconnectType }>(),\n);\nexport const destroyConnectionsAndResetState = createAction(\n scoped`destroyConnections and reset`,\n);\nexport const setCirrusConnected = createAction(scoped`cirrusConnected`);\nexport const setCirrusDisconnected = createAction(scoped`cirrusDisconnected`);\nexport const changeStatusMainVideoOnScene = createAction(\n scoped`change status main video on scene`,\n props<{ isVideoPlaying: boolean }>(),\n);\nexport const setAwsInstance = createAction(\n scoped`set aws instance`,\n props<{\n wsUrl: string | null;\n pollingUrl: string | null;\n instanceName: string | null;\n }>(),\n);\nexport const setStatusMessage = createAction(\n scoped`set status message`,\n props<{ message: string | null }>(),\n);\nexport const setStatusPercentSignallingServer = createAction(\n scoped`change status percent signalling server`,\n props<{ percent: number | null }>(),\n);\nexport const setFreezeFrame = createAction(\n scoped`set freeze frame`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setUnrealVersion = createAction(\n scoped`set unreal version`,\n props<{ version: string }>(),\n);\nexport const setStreamClientCompanyId = createAction(\n scoped`set stream client company id`,\n props<{ id: string }>(),\n);\nexport const setStreamViewId = createAction(\n scoped`set stream view id`,\n props<{ id: string }>(),\n);\nexport const setIntroImageSrc = createAction(\n scoped`set intro image src`,\n props<{ src: string }>(),\n);\nexport const setLoadingImageSrc = createAction(\n scoped`set loading image src`,\n props<{ src: string }>(),\n);\nexport const setIntroVideoSrc = createAction(\n scoped`set intro video src`,\n props<{ src: string }>(),\n);\nexport const resetIntroSrc = createAction(scoped`reset intro src`);\nexport const setFreezeFrameFromVideo = createAction(\n scoped`set freeze frame from video`,\n props<{\n dataUrl: string | null;\n progress: number | null;\n }>(),\n);\nexport const setEstablishingConnection = createAction(\n scoped`set establishing connection`,\n props<{ value: boolean }>(),\n);\nexport const setDataChannelConnected = createAction(\n scoped`set data channel connected`,\n props<{ value: boolean }>(),\n);\nexport const setConfig = createAction(\n scoped`set config`,\n props<{ config: Partial<StreamConfig> }>(),\n);\nexport const setErrorMessage = createAction(\n scoped`set error message`,\n props<{\n errorType: UnrealErrorType;\n message: string;\n }>(),\n);\nexport const setViewportReady = createAction(\n scoped`set viewport ready`,\n props<{ value: boolean }>(),\n);\nexport const changeStreamResolutionAction = createAction(\n scoped`change stream resolution`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const changeStreamResolutionSuccessAction = createAction(\n scoped`change stream resolution success action`,\n props<{\n width: number | null;\n height: number | null;\n }>(),\n);\nexport const setSignalingName = createAction(\n scoped`set aws instanceName`,\n props<{ instanceName: string }>(),\n);\nexport const updateCirrusInfo = createAction(\n scoped`set unrealInfo`,\n props<{\n ssInfo: string;\n ssData: SignalingData;\n }>(),\n);\nexport const commandStarted = createAction(\n scoped`command started`,\n props<{ id: string; command: string }>(),\n);\nexport const commandCompleted = createAction(\n scoped`command completed`,\n props<{ id: string }>(),\n);\nexport const setLoopBackCommandIsCompleted = createAction(\n scoped`set loopBack command is completed`,\n);\nexport const showUnrealErrorMessage = createAction(\n scoped`show unreal error message`,\n props<{ code: number | null }>(),\n);\nexport const initSignalling = createAction(scoped`init signalling`);\nexport const resetConfig = createAction(scoped`reset config`);\nexport const resetAfkAction = createAction(scoped`reset afk action`);\nexport const resetWarnTimeout = createAction(scoped`reset config warn timeout`);\nexport const resetUnrealStateAction = createAction(scoped`reset state`);\nexport const resetUnrealState = createAction(scoped`reset unreal state`);\n","export const WSCloseCode_NORMAL_CLOSURE = 3000;\nexport const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;\nexport const WSCloseCode_NORMAL_MANUAL_DISCONNECT = 3002;\nexport const WSCloseCode_NORMAL_CIRRUS_CLOSED = 3003;\n\nexport const WSCloseCodes = [\n WSCloseCode_NORMAL_CLOSURE,\n WSCloseCode_NORMAL_AFK_TIMEOUT,\n WSCloseCode_NORMAL_MANUAL_DISCONNECT,\n WSCloseCode_NORMAL_CIRRUS_CLOSED,\n] as const;\n\nexport type WSCloseCodesValues = (typeof WSCloseCodes)[number];\n","export const DisconnectReason = {\n afk: 'afk',\n none: 'none',\n reset: 'reset',\n wsOnError: 'wsOnError',\n dataChannelClosed: 'dataChannelClosed',\n dataChannelTimeout: 'dataChannelTimeout',\n} as const;\n\nexport type DisconnectType =\n (typeof DisconnectReason)[keyof typeof DisconnectReason];\n","/*\nexport interface RequestReservation extends InstanceMessageBase {\n type: 'requestReservation';\n}\n*/\n\nimport type { SignalingData } from './SignalingData';\n\nexport interface InstanceReady extends InstanceMessageBase {\n type: 'instanceReady';\n}\n\nexport interface InstanceReserved extends InstanceMessageBase {\n type: 'instanceReserved';\n}\n\ninterface InstanceMessageBase extends MessageBase {\n correlationId: string;\n payload: {\n instanceId: string;\n };\n}\n\nexport interface MessageBase {\n type: OrchestrationMessageType;\n}\n\nexport interface SSInfo extends MessageBase {\n type: 'ssInfo';\n message: string;\n data: SignalingData;\n}\n\nexport interface PlayerCountMessage extends MessageBase {\n type: 'playerCount';\n playerCount: number;\n}\n\nexport interface AnswerMessage extends RTCSessionDescriptionInit {\n type: RTCSdpType;\n}\n\nexport interface ConfigMessage extends MessageBase, UnknownFields {\n type: 'config';\n peerConnectionOptions: RTCConfiguration;\n}\n\nexport interface CandidateMessage extends MessageBase {\n type: 'iceCandidate';\n candidate: RTCIceCandidate;\n}\n\nexport interface PingMessage extends MessageBase {\n type: 'ping';\n playerId: string;\n appConnectionCounter: number;\n}\n\nexport type UnknownFields = Record<string, unknown>;\n\nexport const OrchestrationMessageTypes = {\n requestReservation: 'requestReservation',\n instanceReady: 'instanceReady',\n instanceReserved: 'instanceReserved',\n ssInfo: 'ssInfo',\n playerCount: 'playerCount',\n answer: 'answer',\n iceCandidate: 'iceCandidate',\n ping: 'ping',\n config: 'config',\n} as const;\n\nexport interface SignalingMessageMap {\n [OrchestrationMessageTypes.ssInfo]: SSInfo;\n [OrchestrationMessageTypes.playerCount]: PlayerCountMessage;\n [OrchestrationMessageTypes.answer]: AnswerMessage;\n [OrchestrationMessageTypes.config]: ConfigMessage;\n [OrchestrationMessageTypes.iceCandidate]: CandidateMessage;\n [OrchestrationMessageTypes.instanceReady]: InstanceReady;\n [OrchestrationMessageTypes.instanceReserved]: InstanceReserved;\n [OrchestrationMessageTypes.ping]: PingMessage;\n}\n\nexport type OrchestrationMessageType = keyof SignalingMessageMap;\n\nexport type SignalingMessageHandler<T extends keyof SignalingMessageMap> = (\n msg: SignalingMessageMap[T],\n) => void;\n\nexport interface PollingOrchestrationMessage {\n mm_message?: string;\n signallingServer?: string;\n error?: string;\n info?: {\n age: number | null;\n left: number | null;\n percent: number | null;\n total: number | null;\n };\n}\n","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 EControlSchemeType = {\n // A mouse can lock inside the WebRTC player so the user can simply move the\n // mouse to control the orientation of the camera. The user presses the\n // Escape key to unlock the mouse.\n LockedMouse: 0,\n\n // A mouse can hover over the WebRTC player so the user needs to click and\n // drag to control the orientation of the camera.\n HoveringMouse: 1,\n Default: 2,\n} as const;\n\nexport type EControlSchemeTypeValues =\n (typeof EControlSchemeType)[keyof typeof EControlSchemeType];\n","// Must be kept in sync with PixelStreamingProtocol::EToUE4Msg C++ descriptors.\n\nexport const EMessageType = {\n /*\n * Control Messages. Range = 0..49.\n */\n IFrameRequest: 0,\n RequestQualityControl: 1,\n MaxFpsRequest: 2,\n AverageBitrateRequest: 3,\n StartStreaming: 4,\n StopStreaming: 5,\n LatencyTest: 6,\n RequestInitialSettings: 7,\n\n /*\n * Input Messages. Range = 50..89.\n */\n\n // Generic Input Messages. Range = 50..59.\n UIInteraction: 50,\n Command: 51,\n\n // Keyboard Input Message. Range = 60..69.\n KeyDown: 60,\n KeyUp: 61,\n KeyPress: 62,\n\n // Mouse Input Messages. Range = 70..79.\n MouseEnter: 70,\n MouseLeave: 71,\n MouseDown: 72,\n MouseUp: 73,\n MouseMove: 74,\n MouseWheel: 75,\n\n // Touch Input Messages. Range = 80..89.\n TouchStart: 80,\n TouchEnd: 81,\n TouchMove: 82,\n} as const;\n\nexport type EMessageTypeValues =\n (typeof EMessageType)[keyof typeof EMessageType];\n","export const EToClientMessageType = {\n QualityControlOwnership: 0,\n Response: 1,\n Command: 2,\n FreezeFrame: 3,\n UnfreezeFrame: 4,\n VideoEncoderAvgQP: 5,\n LatencyTest: 6,\n InitialSettings: 7,\n InputControlOwnership: 12,\n Protocol: 255,\n} as const;\n","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 { EControlSchemeType } from './EControlSchemeType';\nimport type { InputProps } from '../interfaces';\n\nexport const InputOptions: InputProps = {\n controlScheme: EControlSchemeType.Default,\n suppressBrowserKeys: true,\n fakeMouseWithTouches: false,\n};\n","export const UnrealStatusMessage = {\n CONNECTING_TO_SESSION: 'Connecting to session.',\n STARTING_YOUR_SESSION: 'Starting your session',\n} as const;\n","export const DEBOUNCE_TO_MANY_RESIZE_CALLS = 100;\nexport const SAME_SIZE_THRESHOLD = 1.01;\nexport const MINIMAL_FPS = 6;\nexport const STREAMING_VIDEO_ID = 'streamingVideo';\nexport const CONSOLE_COMMAND_ENABLE_MESSAGES = 'EnableAllScreenMessages';\nexport const CONSOLE_COMMAND_DISABLE_MESSAGES = 'DisableAllScreenMessages';\nexport const CONSOLE_COMMAND_PIXEL_QUALITY =\n 'PixelStreaming.FreezeFrameQuality 95';\nexport const FULL_HD_WIDTH = 1920;\nexport const FULL_HD_HEIGHT = 1080;\nexport const WS_TIMEOUT = 2000;\nexport const WS_OPEN_STATE = 1;\nexport const DEFAULT_TIMEOUT_PERIOD = 15;\nexport const DEFAULT_WARN_TIMEOUT = 120;\nexport const DATA_CHANNEL_CONNECTION_TIMEOUT = 5000; // 5 seconds;\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { AnswerMessage } from '../../interfaces/SignalingMessage';\n\nexport function AnswerHandler(this: SignallingService, msg: AnswerMessage) {\n this.onWebRtcAnswer$.next(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { ConfigMessage } from '../../interfaces/SignalingMessage';\n\nexport function ConfigHandler(this: SignallingService, msg: ConfigMessage) {\n this.onConfig$.next(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function IceCandidateHandler(\n this: SignallingService,\n msg: { candidate: RTCIceCandidate },\n) {\n this.onWebRtcIce$.next(msg.candidate);\n}\n","import type { InstanceReady } from '../../interfaces/SignalingMessage';\nimport type { SignallingService } from '../../services/signalling.service';\n\nexport function InstanceReadyHandler(\n this: SignallingService,\n _: InstanceReady,\n) {}\n","import type { InstanceReserved } from '../../interfaces/SignalingMessage';\nimport type { SignallingService } from '../../services/signalling.service';\nimport { setSignalingName } from '../..//store/unreal.actions';\n\nexport function InstanceReservedHandler(\n this: SignallingService,\n msg: InstanceReserved,\n) {\n this.store.dispatch(\n setSignalingName({\n instanceName: msg.payload.instanceId,\n }),\n );\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function PingHandler(this: SignallingService) {\n this.send(\n JSON.stringify({\n type: 'pong',\n source: 'front',\n }),\n );\n}\n","import type { SignallingService } from '../..//services/signalling.service';\nimport type { PlayerCountMessage } from '../..//interfaces/SignalingMessage';\nimport { Logger } from '@3dsource/utils';\n\nexport function PlayerCountHandler(\n this: SignallingService,\n msg: PlayerCountMessage,\n) {\n Logger.log(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport type { SSInfo } from '../../interfaces/SignalingMessage';\nimport { updateCirrusInfo } from '../../store/unreal.actions';\n\nexport function SSInfoHandler(this: SignallingService, msg: SSInfo) {\n this.store.dispatch(\n updateCirrusInfo({ ssInfo: msg.message, ssData: msg.data }),\n );\n return null;\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { Logger } from '@3dsource/utils';\nimport { setCirrusDisconnected } from '../../store/unreal.actions';\n\nexport function OnCloseHandler(this: SignallingService, e: CloseEvent): void {\n this.stopRetryTimer();\n Logger.warn(`WS closed: ${JSON.stringify(e.code)} - ${e.reason}`);\n this.store.dispatch(setCirrusDisconnected());\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { Logger } from '@3dsource/utils';\nimport {\n destroyRemoteConnections,\n setErrorMessage,\n} from '../../store/unreal.actions';\nimport { DisconnectReason } from '../../interfaces/disconnect-reasons';\n\nexport function OnErrorHandler(this: SignallingService, e: Event): void {\n clearTimeout(this.wsTimeoutHandler);\n Logger.warn(`WS error: ${JSON.stringify(e)}`);\n\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebSocketError',\n message: 'WebSocket Error',\n }),\n );\n this.store.dispatch(\n destroyRemoteConnections({ disconnectReason: DisconnectReason.wsOnError }),\n );\n this.initEstablishingConnection();\n this.watchTimeoutOrErrorAndReconnectLater();\n}\n","import type { SignallingService } from '../../services/signalling.service';\n\nexport function OnMessageHandler(\n this: SignallingService,\n e: MessageEvent<string>,\n): void {\n clearTimeout(this.wsTimeoutHandler);\n //Logger.colored(...COLOR_CODES.FROM_SIGNALING, e.data);\n const msg = JSON.parse(e.data);\n this.handleMessage(msg);\n}\n","import type { SignallingService } from '../../services/signalling.service';\nimport { setCirrusConnected } from '../../store/unreal.actions';\nimport { OrchestrationMessageTypes } from '../../interfaces/SignalingMessage';\n\nexport function OnOpenHandler(this: SignallingService) {\n this.stopRetryTimer();\n this.store.dispatch(setCirrusConnected());\n\n this.send({\n type: OrchestrationMessageTypes.requestReservation,\n correlationId: this.correlationId,\n payload: {\n environmentId: this.environmentId,\n },\n });\n}\n","import type { Observable } from 'rxjs';\nimport { scan } from 'rxjs';\nimport { clampf } from '@3dsource/utils';\n\nexport const clampAndKeepMaxPercents = (): ((\n source: Observable<number>,\n) => Observable<number>) => {\n return (source: Observable<number>) =>\n source.pipe(\n scan(\n (acc, value) =>\n value === 0 ? value : clampf(0, 100, Math.max(acc, value)),\n 0,\n ),\n );\n};\n","import type {\n MetaBoxCommandList,\n MetaBoxCommandPacket,\n} from '@3dsource/types-unreal';\nimport type { Observable } from 'rxjs';\nimport { of, timeout } from 'rxjs';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { catchError, filter, first, map } from 'rxjs/operators';\nimport { fromSignal } from '../helpers/EventWrapper';\nimport { generateUuid, tapLog, Truthy } from '@3dsource/utils';\n\nexport function observeCommandResponse<\n K extends keyof MetaBoxCommandList,\n T extends MetaBoxCommandList[K] = MetaBoxCommandList[K],\n>(\n data: T,\n sender: (data: T) => void,\n timeOut = 60000,\n dispatchOnTimeout = true,\n): Observable<ObservedCallbackResponse<T> | never> {\n const correlationId = generateUuid();\n const out = { ...data, correlationId };\n\n const observable = fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(({ json }) => {\n // Some callbacks do not have commandCallback wrapper,\n // so first we check if it exists,\n // then fallback to JSON itself\n return 'commandCallback' in json\n ? { json }\n : { json: { commandCallback: json } };\n }),\n filter(({ json }) => {\n return json.commandCallback.correlationId === correlationId;\n }),\n timeout(timeOut),\n catchError(() =>\n dispatchOnTimeout\n ? of({ json: { commandCallback: { correlationId: 'timeout' } } })\n : of(null),\n ),\n first(),\n tapLog('Command Response Observer'),\n filter(Truthy),\n );\n\n setTimeout(() => sender(out), 0);\n\n return observable as never;\n}\n\n// Suppose MetaBoxCommandPacket is your base command shape.\n// This type ensures that after filtering, json.commandCallback\n// has the same type as you passed in to observeCommandResponse.\nexport interface ObservedCallbackResponse<T extends MetaBoxCommandPacket> {\n json: {\n commandCallback: T;\n };\n}\n","export function decodeData(anyData: any) {\n try {\n return new TextDecoder('utf-16').decode(anyData);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (e) {\n return '';\n }\n}\n","import type { Quality } from '../interfaces/quality.interface';\nimport { calculateMedian, clampf } from '@3dsource/utils';\nimport type { FilterSettings } from '../components/low-bandwidth-indicator/DataFlowConstants';\n\nexport interface DataFlowCheckResult {\n isDropDetected: boolean;\n dropPercentage: number;\n activeMedian: number;\n quality: Quality;\n message: string;\n dataHistory: number[];\n config: {\n yellowFlagThresholdPercentage: number;\n redFlagThresholdPercentage: number;\n historyBufferLength: number;\n splitPoint: number;\n };\n}\n\nexport class DataFlowMonitor {\n protected dataHistory: number[] = [];\n\n /**\n * Initializes the DataFlowMonitor monitor.\n * @param yellowFlagThresholdPercentage - The percentage drop to trigger a YELLOW warning (default: 15%).\n * @param redFlagThresholdPercentage - The percentage drop to trigger a RED warning (default: 30%).\n * @param historyBufferLength - buffer length (default: 100).\n * @param splitPoint - The point at which to split the history buffer into two halves (default: 0.5).\n */\n constructor(\n protected yellowFlagThresholdPercentage = 15,\n protected redFlagThresholdPercentage = 30,\n protected historyBufferLength = 100,\n protected splitPoint = 0.5,\n ) {}\n\n reset() {\n this.dataHistory.length = 0;\n }\n\n config(data: FilterSettings) {\n this.reset();\n this.yellowFlagThresholdPercentage = data.yellowFlag;\n this.redFlagThresholdPercentage = data.redFlag;\n }\n\n /**\n * Adds a new bitrate measurement and checks for significant drops.\n * @param currentValue - The current bitrate in kbps.\n * @returns BitrateCheckResult indicating if a drop was detected.\n */\n addValue(currentValue: number): DataFlowCheckResult {\n if (isNaN(currentValue) || currentValue < 1) {\n return {} as DataFlowCheckResult;\n }\n const historyLength = this.dataHistory.length;\n\n if (historyLength > this.historyBufferLength) {\n this.dataHistory.shift();\n }\n this.dataHistory.push(currentValue);\n\n if (historyLength < this.historyBufferLength) {\n this.dataHistory.length = this.historyBufferLength;\n this.dataHistory.fill(currentValue, 0, this.historyBufferLength);\n }\n\n const splitIndex = Math.floor(historyLength * this.splitPoint);\n const firstHalf = this.dataHistory.slice(0, splitIndex);\n const secondHalf = this.dataHistory.slice(splitIndex);\n const firstHalfMedian = calculateMedian(firstHalf);\n const secondHalfMedian = calculateMedian(secondHalf);\n\n const dropPercentage = clampf(\n 0,\n 100,\n ((firstHalfMedian - secondHalfMedian) / firstHalfMedian) * 100,\n );\n\n const isRedFlag = dropPercentage >= this.redFlagThresholdPercentage;\n if (dropPercentage >= this.yellowFlagThresholdPercentage) {\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: true,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: isRedFlag ? 'red' : 'orange',\n message: `Significant flow drop detected: ${dropPercentage.toFixed(2)}% (from ${firstHalfMedian} to ${secondHalfMedian})`,\n };\n }\n\n return {\n config: {\n yellowFlagThresholdPercentage: this.yellowFlagThresholdPercentage,\n redFlagThresholdPercentage: this.redFlagThresholdPercentage,\n historyBufferLength: this.historyBufferLength,\n splitPoint: this.splitPoint,\n },\n isDropDetected: false,\n dropPercentage,\n dataHistory: [...this.dataHistory],\n activeMedian: secondHalfMedian,\n quality: 'lime',\n message: 'Stable flow',\n };\n }\n}\n","import { sendSignal } from './EventWrapper';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\n\nexport const dispatchResize = () => {\n window.dispatchEvent(new Event('resize'));\n};\n\nexport const forceResizeUnrealVideo = () => {\n sendSignal(UnrealInternalSignalEvents.ForceResizeViewport);\n};\n","const errorCodes: Record<`code${number}`, string | undefined> = {\n code404:\n 'Your asset is being synced on Metabox servers and is not yet available in Metabox Studio or Metabox Configurator. Please check again later after syncing is complete. ',\n};\n\nexport function getRtcErrorMessage(code: number | null): string | undefined {\n if (code === null) return undefined;\n\n return errorCodes[`code${code}`];\n}\n","import type { Observable } from 'rxjs';\nimport { of, scan, switchMap } from 'rxjs';\nimport { smoothTransition } from '@3dsource/utils';\nimport { map } from 'rxjs/operators';\n\nexport const floatToSmoothPercents = (): ((\n source: Observable<number>,\n) => Observable<number>) => {\n return (source: Observable<number>) =>\n source.pipe(\n scan(\n (acc, value) => ({\n previous: acc.current,\n current: value,\n }),\n {\n previous: 0,\n current: 0,\n },\n ),\n\n switchMap(({ previous, current }) => {\n if (Math.abs(current - previous) > 0.95) {\n // Assume that big difference seems like switch between 0 and 1 immediately after resetLoaderState(),\n // so it should go to 'current' without transitions\n return of(current);\n }\n return smoothTransition(previous, current, 300);\n }), // 300ms duration for smooth transition\n\n map((value) => Math.floor(value * 100)),\n );\n};\n","import {\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n STREAMING_VIDEO_ID,\n} from '../constants/unreal.constant';\nimport type { ImageOutputValues } from '@3dsource/utils';\nimport { getCanvasCached, getSnapshot } from '@3dsource/utils';\nimport type { StreamResolutionProps } from '../interfaces/stream-resolution.interface';\n\nexport const getImageFromVideoStream = (\n takeSizeFrom: 'video' | 'constant' = 'video',\n imageOutput?: ImageOutputValues,\n sizes?: StreamResolutionProps,\n) => {\n try {\n const video = document.getElementById(\n STREAMING_VIDEO_ID,\n ) as HTMLVideoElement;\n const { canvas, ctx } = getCanvasCached('video');\n\n canvas.width =\n takeSizeFrom === 'video'\n ? sizes?.width || video?.clientWidth || FULL_HD_WIDTH\n : FULL_HD_WIDTH;\n canvas.height =\n takeSizeFrom === 'video'\n ? sizes?.height || video?.clientHeight || FULL_HD_HEIGHT\n : FULL_HD_HEIGHT;\n\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n return getSnapshot(canvas, canvas.width, imageOutput) as string;\n } catch {\n return null;\n }\n};\n","/**\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;\n UEReceiptTimeMs!: number | null;\n UEEncodeMs!: number | null;\n UECaptureToSendMs!: number | null;\n UETransmissionTimeMs!: number | null;\n BrowserReceiptTimeMs!: number | null;\n FrameDisplayDeltaTimeMs!: number | null;\n\n Reset() {\n this.TestStartTimeMs = null;\n this.UEReceiptTimeMs = null;\n this.UEEncodeMs = null;\n this.UECaptureToSendMs = null;\n this.UETransmissionTimeMs = null;\n this.BrowserReceiptTimeMs = null;\n this.FrameDisplayDeltaTimeMs = null;\n }\n\n SetUETimings(UETimings: any) {\n this.UEReceiptTimeMs = UETimings.ReceiptTimeMs;\n this.UEEncodeMs = UETimings.EncodeMs;\n this.UECaptureToSendMs = UETimings.CaptureToSendMs;\n this.UETransmissionTimeMs = UETimings.TransmissionTimeMs;\n this.BrowserReceiptTimeMs = Date.now();\n this.OnAllLatencyTimingsReady(this);\n }\n\n SetFrameDisplayDeltaTime(DeltaTimeMs: number) {\n if (this.FrameDisplayDeltaTimeMs == null) {\n this.FrameDisplayDeltaTimeMs = Math.round(DeltaTimeMs);\n this.OnAllLatencyTimingsReady(this);\n }\n }\n\n OnAllLatencyTimingsReady(_: any) {}\n}\n","import type { Quality } from '../interfaces/quality.interface';\n\nexport function mapQpToQuality(VideoEncoderQP: number): Quality {\n const orangeQP = 26;\n const redQP = 35;\n\n let quality: Quality = 'lime';\n if (VideoEncoderQP > redQP) {\n quality = 'red';\n } else if (VideoEncoderQP > orangeQP) {\n quality = 'orange';\n }\n return quality;\n}\n","import type {\n FAlignProductsToPlaneCommand,\n FAlignProductsToPlanePayload,\n FApplyCameraPresetCommand,\n FApplyZoomCommand,\n FApplyZoomPayload,\n FBoolPayload,\n FCameraBoxCommand,\n FCameraClampsPayload,\n FCameraPresetPayload,\n FCameraRecenterCommand,\n FCameraSettingsCommand,\n FCameraSettingsPayload,\n FChangeGizmoTypeCommand,\n FChangeResolutionCommand,\n FClampPanToProductsCommand,\n FClickSnapCommand,\n FComposurePayload,\n FControlCameraModePayload,\n FControlSensitivityCommand,\n FControlSensitivityPayload,\n FDebugModeCommand,\n FDragCommand,\n FDragSequenceCommand,\n FDragSequencePayload,\n FDropCommand,\n FDropPayload,\n FEnableComposureCommand,\n FEnableControlsCommand,\n FEnableSpinnerModeCommand,\n FEnableTeleportCommand,\n FExecuteConsoleCommandCommand,\n FFitToObjectsCommand,\n FFitToObjectsPayload,\n FFreezeFrameCommand,\n FFStringPayload,\n FFStringsPayload,\n FFVectorPayload,\n FGizmoTypePayload,\n FInitSequenceByObjectNameCommand,\n FInitSequenceByObjectNamePayload,\n FJumpToSequenceCommand,\n FJumpToSequencePayload,\n FLevelPayload,\n FLoadLevelCommand,\n FLoadProductCommand,\n FLoadSceneStateCommand,\n FLoadSceneStatePayload,\n FLoopBackCommand,\n FMoveSelectedCommand,\n FMoveSelectedPayload,\n FPauseSequenceCommand,\n FPlaySequenceCommand,\n FPlaySequencePayload,\n FProductPayload,\n FRenderPayload,\n FRequestCameraPresetCommand,\n FResetControlClampsCommand,\n FResolutionPayload,\n FRotatePayload,\n FRotateSelectedCommand,\n FSelectProductByObjectNameCommand,\n FSelectProductByObjectNamePayload,\n FSetCameraControlClampsCommand,\n FSetControlCameraModeCommand,\n FSetMaterialCommand,\n FSetMaterialPayload,\n FSetPawnMovementModeCommand,\n FSetPawnMovementModePayload,\n FSetProductsLocationCommand,\n FSetProductsLocationPayload,\n FSetSettingsSequenceCommand,\n FSettingsSequencePayload,\n FStopSequenceCommand,\n FTakeRenderCommand,\n FTakeSpinnerRenderCommand,\n FTakeSpinnerRenderPreviewCommand,\n FUnLoadAllLevelsCommand,\n FUnLoadAllProductsCommand,\n FUnLoadProductByObjectNameCommand,\n FUnselectAllProductsCommand,\n FWeatherCommand,\n FWeatherPayload,\n} from '@3dsource/types-unreal';\nimport { MetaBoxCommand } from '@3dsource/types-unreal';\n\nexport const getResetControlClampsCommand = (): FResetControlClampsCommand => ({\n command: MetaBoxCommand.FResetControlClampsCommand,\n});\nexport const getCameraRecenterCommand = (): FCameraRecenterCommand => ({\n command: MetaBoxCommand.FCameraRecenterCommand,\n});\nexport const unLoadAllLevelsCommand = (): FUnLoadAllLevelsCommand => ({\n command: MetaBoxCommand.FUnLoadAllLevelsCommand,\n});\nexport const getDragCommand = (): FDragCommand => ({\n command: MetaBoxCommand.FDragCommand,\n});\nexport const getUnselectAllProductsCommand =\n (): FUnselectAllProductsCommand => ({\n command: MetaBoxCommand.FUnselectAllProductsCommand,\n });\nexport const getPauseSequenceCommand = (): FPauseSequenceCommand => ({\n command: MetaBoxCommand.FPauseSequenceCommand,\n});\nexport const getStopSequenceCommand = (): FStopSequenceCommand => ({\n command: MetaBoxCommand.FStopSequenceCommand,\n});\nexport const getUnLoadAllProductsCommand = (): FUnLoadAllProductsCommand => ({\n command: MetaBoxCommand.FUnLoadAllProductsCommand,\n});\nexport const getRequestCameraPresetCommand =\n (): FRequestCameraPresetCommand => ({\n command: MetaBoxCommand.FRequestCameraPresetCommand,\n });\nexport const getLoopBackCommand = (): FLoopBackCommand => ({\n command: MetaBoxCommand.FLoopBackCommand,\n});\nexport const getSetFpsCommand = (\n fpsRequired: number,\n): FExecuteConsoleCommandCommand => ({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload: { value: `t.MaxFPS ${fpsRequired}` },\n});\nexport const getFreezeFrameCommand = (\n payload: FBoolPayload,\n source: string,\n): FFreezeFrameCommand =>\n ({\n command: MetaBoxCommand.FFreezeFrameCommand,\n payload,\n source,\n }) as FFreezeFrameCommand;\nexport const getDragSequenceCommand = (\n payload: FDragSequencePayload,\n): FDragSequenceCommand => ({\n command: MetaBoxCommand.FDragSequenceCommand,\n payload,\n});\nexport const alignProductsToPlaneCommand = (\n payload: FAlignProductsToPlanePayload,\n): FAlignProductsToPlaneCommand => ({\n command: MetaBoxCommand.FAlignProductsToPlaneCommand,\n payload,\n});\nexport const getApplyCameraPresetCommand = (\n payload: FCameraPresetPayload,\n): FApplyCameraPresetCommand => ({\n command: MetaBoxCommand.FApplyCameraPresetCommand,\n payload,\n});\nexport const getLoadSceneStateCommand = (\n payload: FLoadSceneStatePayload,\n): FLoadSceneStateCommand => ({\n command: MetaBoxCommand.FLoadSceneStateCommand,\n payload,\n});\nexport const getClickSnapCommand = (\n payload: FBoolPayload,\n): FClickSnapCommand => ({\n command: MetaBoxCommand.FClickSnapCommand,\n payload,\n});\nexport const getSetControlCameraModeCommand = (\n payload: FControlCameraModePayload,\n): FSetControlCameraModeCommand => ({\n command: MetaBoxCommand.FSetControlCameraModeCommand,\n payload,\n});\nexport const getSetCameraControlClampsCommand = (\n payload: FCameraClampsPayload,\n): FSetCameraControlClampsCommand => ({\n command: MetaBoxCommand.FSetCameraControlClampsCommand,\n payload,\n});\nexport const getSetPawnMovementModeCommand = (\n payload: FSetPawnMovementModePayload,\n): FSetPawnMovementModeCommand => ({\n command: MetaBoxCommand.FSetPawnMovementModeCommand,\n payload,\n});\nexport const getEnableTeleportCommand = (\n payload: FBoolPayload,\n): FEnableTeleportCommand => ({\n command: MetaBoxCommand.FEnableTeleportCommand,\n payload,\n});\nexport const getApplyZoomCommand = (\n payload: FApplyZoomPayload,\n): FApplyZoomCommand => ({\n command: MetaBoxCommand.FApplyZoomCommand,\n payload,\n});\nexport const getCameraBoxCommand = (\n payload: FFVectorPayload,\n): FCameraBoxCommand => ({\n command: MetaBoxCommand.FCameraBoxCommand,\n payload,\n});\nexport const getDropCommand = (payload?: FDropPayload): FDropCommand => ({\n command: MetaBoxCommand.FDropCommand,\n payload,\n});\nexport const getSelectProductByObjectNameCommand = (\n payload: FSelectProductByObjectNamePayload,\n): FSelectProductByObjectNameCommand => ({\n command: MetaBoxCommand.FSelectProductByObjectNameCommand,\n payload,\n});\nexport const getChangeGizmoTypeCommand = (\n payload: FGizmoTypePayload,\n): FChangeGizmoTypeCommand => ({\n command: MetaBoxCommand.FChangeGizmoTypeCommand,\n payload,\n});\nexport const getWeatherCommand = (\n payload: FWeatherPayload,\n): FWeatherCommand => ({\n command: MetaBoxCommand.FWeatherCommand,\n payload,\n});\nexport const getFitToObjectsCommand = (\n payload?: FFitToObjectsPayload,\n): FFitToObjectsCommand => ({\n command: MetaBoxCommand.FFitToObjectsCommand,\n payload,\n});\nexport const setProductsLocationCommand = (\n payload: FSetProductsLocationPayload,\n): FSetProductsLocationCommand => ({\n command: MetaBoxCommand.FSetProductsLocationCommand,\n payload,\n});\nexport const getChangeResolutionCommand = (\n payload: FResolutionPayload,\n): FChangeResolutionCommand => ({\n command: MetaBoxCommand.FChangeResolutionCommand,\n payload,\n});\nexport const getEnableSpinnerModeCommand = (\n payload: FBoolPayload,\n): FEnableSpinnerModeCommand => ({\n command: MetaBoxCommand.FEnableSpinnerModeCommand,\n payload,\n});\nexport const getControlSensitivityCommand = (\n payload: FControlSensitivityPayload,\n): FControlSensitivityCommand => ({\n command: MetaBoxCommand.FControlSensitivityCommand,\n payload,\n});\nexport const getCameraSettingsCommand = (\n payload: FCameraSettingsPayload,\n): FCameraSettingsCommand => ({\n command: MetaBoxCommand.FCameraSettingsCommand,\n payload,\n});\nexport const getDebugModeCommand = (\n payload: FBoolPayload,\n): FDebugModeCommand => ({\n command: MetaBoxCommand.FDebugModeCommand,\n payload,\n});\nexport const getEnableControlsCommand = (\n payload: FBoolPayload,\n): FEnableControlsCommand => ({\n command: MetaBoxCommand.FEnableControlsCommand,\n payload,\n});\nexport const getExecuteConsoleCommand = (\n payload: FFStringPayload,\n): FExecuteConsoleCommandCommand => ({\n command: MetaBoxCommand.FExecuteConsoleCommandCommand,\n payload,\n});\nexport const getInitSequenceByObjectNameCommand = (\n payload: FInitSequenceByObjectNamePayload,\n): FInitSequenceByObjectNameCommand => ({\n command: MetaBoxCommand.FInitSequenceByObjectNameCommand,\n payload,\n});\nexport const getPlaySequenceCommand = (\n payload: FPlaySequencePayload,\n): FPlaySequenceCommand => ({\n command: MetaBoxCommand.FPlaySequenceCommand,\n payload,\n});\nexport const getJumpToSequenceCommand = (\n payload: FJumpToSequencePayload,\n): FJumpToSequenceCommand => ({\n command: MetaBoxCommand.FJumpToSequenceCommand,\n payload,\n});\nexport const getMoveSelectedCommand = (\n payload: FMoveSelectedPayload,\n): FMoveSelectedCommand => ({\n command: MetaBoxCommand.FMoveSelectedCommand,\n payload,\n});\nexport const getRotateSelectedCommand = (\n payload: FRotatePayload,\n): FRotateSelectedCommand => ({\n command: MetaBoxCommand.FRotateSelectedCommand,\n payload,\n});\nexport const getTakeRenderCommand = (\n payload: FRenderPayload,\n): FTakeRenderCommand => ({\n command: MetaBoxCommand.FTakeRenderCommand,\n payload,\n});\nexport const getTakeSpinnerRenderPreviewCommand = (\n payload: FRenderPayload,\n): FTakeSpinnerRenderPreviewCommand => ({\n command: MetaBoxCommand.FTakeSpinnerRenderPreviewCommand,\n payload,\n});\nexport const getTakeSpinnerRenderCommand = (\n payload: FRenderPayload,\n): FTakeSpinnerRenderCommand => ({\n command: MetaBoxCommand.FTakeSpinnerRenderCommand,\n payload,\n});\nexport const getSetMaterialCommand = (\n payload: FSetMaterialPayload,\n): FSetMaterialCommand => ({\n command: MetaBoxCommand.FSetMaterialCommand,\n payload,\n});\nexport const getLoadProductCommand = (\n payload: FProductPayload,\n): FLoadProductCommand => ({\n command: MetaBoxCommand.FLoadProductCommand,\n payload,\n});\nexport const getUnLoadProductByObjectNameCommand = (\n payload: FFStringPayload,\n): FUnLoadProductByObjectNameCommand => ({\n command: MetaBoxCommand.FUnLoadProductByObjectNameCommand,\n payload,\n});\nexport const getLoadLevelCommand = (\n payload: FLevelPayload,\n): FLoadLevelCommand => ({\n command: MetaBoxCommand.FLoadLevelCommand,\n payload,\n});\nexport const getEnableComposureCommand = (\n payload: FComposurePayload,\n): FEnableComposureCommand => ({\n command: MetaBoxCommand.FEnableComposureCommand,\n payload,\n});\nexport const clampPanToProductsCommand = (\n payload?: FFStringsPayload,\n): FClampPanToProductsCommand => ({\n command: MetaBoxCommand.FClampPanToProductsCommand,\n payload,\n});\nexport const getSetSettingsSequenceCommand = (\n payload: FSettingsSequencePayload,\n): FSetSettingsSequenceCommand => ({\n command: MetaBoxCommand.FSetSettingsSequenceCommand,\n payload,\n});\n","import { whereNot } from '@3dsource/utils';\nimport type { CommandsLoaderState } from '../store/unreal.reducer';\n\nexport const removeExileCommands = (\n state: CommandsLoaderState,\n idToRemove: string,\n) => {\n const exileTimout = 10000;\n const out = { ...state };\n out.commandsInProgress = out.commandsInProgress.filter(\n whereNot({ id: idToRemove }),\n );\n out.totalCommandsCompleted++;\n const time = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries(out.commandsInProgress).forEach(([, { id, timeStamp }]) => {\n if (time - timeStamp > exileTimout) {\n markForDelete.push(id);\n }\n });\n out.totalCommandsCompleted += markForDelete.length;\n out.commandsInProgress = out.commandsInProgress.filter(\n (command) => !markForDelete.includes(command.id),\n );\n return out;\n};\n","import { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { sendSignal } from './EventWrapper';\n\nexport const resetAfk = () => {\n sendSignal(UnrealInternalSignalEvents.RestAfkTimer);\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","import type { InputService } from '../services/input.service';\nimport { MouseButton } from '../constants/ButtonsAndCodes';\nimport { fromEvent } from 'rxjs';\n\nexport default class TouchEmulator {\n private lastDistance = 0;\n private prevDistance = 0;\n private touchReset = true;\n private delta = 0;\n private moveSensitivityScale = 3;\n private prevX = 0;\n private prevY = 0;\n\n constructor(private host: InputService) {\n this.registerTouchEvents(host.video);\n }\n\n private getPosition({ clientX, clientY }: Position) {\n return {\n x: clientX - this.host.videoBoundingRect.left,\n y: clientY - this.host.videoBoundingRect.top,\n };\n }\n\n private getCenter(v1: Vector, v2: Vector) {\n return {\n x: (v2.x - v1.x) / 2 + v1.x,\n y: (v2.y - v1.y) / 2 + v1.y,\n };\n }\n\n private getDistance(v1: Vector, v2: Vector) {\n const quad = {\n x: Math.abs(v2.x - v1.x) ^ 2,\n y: Math.abs(v2.y - v1.y) ^ 2,\n };\n\n return Math.sqrt(quad.x + quad.y);\n }\n\n updateDistance(touches: TouchList) {\n const center = this.getCenter(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n this.lastDistance = this.getDistance(\n this.getPosition(touches[0]),\n this.getPosition(touches[1]),\n );\n\n if (this.touchReset) {\n this.prevDistance = this.lastDistance;\n this.touchReset = false;\n }\n\n return center;\n }\n\n private touchToVector2({ clientX, clientY }: Position) {\n return {\n x: clientX,\n y: clientY,\n };\n }\n\n private twoFingersAction(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n\n this.lastDistance = 0;\n this.prevDistance = 0;\n this.prevX = center.x;\n this.prevY = center.y;\n this.host.emitMouseUp(MouseButton.MainButton, center.x, center.y);\n this.host.emitMouseDown(MouseButton.SecondaryButton, center.x, center.y);\n }\n\n private threeFingersActionMove(touches: TouchList) {\n const center = this.getCenter(\n this.touchToVector2(touches[0]),\n this.touchToVector2(touches[1]),\n );\n this.delta = this.lastDistance - this.prevDistance;\n\n const xx = center.x - this.prevX;\n const yy = center.y - this.prevY;\n\n this.host.emitMouseMove(\n center.x,\n center.y,\n this.moveSensitivityScale * xx,\n this.moveSensitivityScale * yy,\n );\n this.prevX = center.x;\n this.prevY = center.y;\n }\n\n private twoFingersActionZoom(touches: TouchList) {\n const center = this.updateDistance(touches);\n this.delta = this.lastDistance - this.prevDistance;\n\n if (Math.abs(this.delta) < 0.3) {\n return;\n }\n\n this.delta = (this.delta / Math.abs(this.delta)) * 2000;\n\n if (isNaN(this.delta)) {\n return;\n }\n\n this.prevDistance = this.lastDistance;\n this.host.emitMouseWheel(this.delta, center.x, center.y);\n }\n\n private registerTouchEvents(playerElement: HTMLVideoElement) {\n let finger: Finger | undefined;\n\n fromEvent<TouchEvent>(playerElement, 'touchstart', {\n passive: false,\n }).subscribe((e: TouchEvent) => {\n e.preventDefault();\n e.stopPropagation();\n const touches: TouchList = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersAction(touches);\n\n return;\n }\n\n /**\n * One finger actions below\n */\n\n this.prevDistance = 0;\n this.touchReset = true;\n\n if (finger === undefined) {\n const firstTouch = e.changedTouches[0];\n const { x, y } = this.getPosition(firstTouch);\n finger = {\n id: firstTouch.identifier,\n x,\n y,\n };\n // Hack: Mouse events require an enter and leave so we just\n // enter and leave manually with each touch as this event\n // is not fired with a touch device.\n playerElement.dispatchEvent(new MouseEvent('mouseenter', e));\n this.host.emitMouseDown(MouseButton.MainButton, finger.x, finger.y);\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchend', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < e.changedTouches.length; t++) {\n const touch = e.changedTouches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n this.host.emitMouseUp(MouseButton.MainButton, x, y);\n this.host.emitMouseUp(MouseButton.SecondaryButton, x, y);\n // Hack: Manual mouse leave event.\n playerElement.dispatchEvent(new MouseEvent('mouseleave', e));\n finger = undefined;\n\n break;\n }\n }\n });\n\n fromEvent<TouchEvent>(playerElement, 'touchmove', {\n passive: false,\n }).subscribe((e) => {\n e.preventDefault();\n e.stopPropagation();\n const touches = e.touches || e.changedTouches;\n\n if (touches.length === 3) {\n this.threeFingersActionMove(touches);\n\n return;\n }\n\n if (touches.length === 2) {\n this.twoFingersActionZoom(touches);\n\n return;\n }\n\n for (let t = 0; t < touches.length; t++) {\n const touch = e.touches[t];\n\n if (touch.identifier === finger?.id) {\n const { x, y } = this.getPosition(touch);\n\n this.host.emitMouseMove(\n x,\n y,\n this.moveSensitivityScale * (x - finger.x),\n this.moveSensitivityScale * (y - finger.y),\n );\n finger.x = x;\n finger.y = y;\n\n break;\n }\n }\n });\n }\n}\n\ninterface Vector {\n x: number;\n y: number;\n}\n\ninterface Finger extends Vector {\n id: number;\n}\n\ninterface Position {\n clientX: number;\n clientY: number;\n}\n","export class VideoRecorder {\n private recordedChunks!: any[];\n private mediaRecorder!: MediaRecorder;\n\n capture(canvas: any) {\n // Optional frames per second argument can be set in captureStream().\n const stream = (canvas as HTMLCanvasElement).captureStream();\n\n this.recordedChunks = [];\n const options = { mimeType: 'video/webm; codecs=vp9' };\n this.mediaRecorder = new MediaRecorder(stream, options);\n this.mediaRecorder.ondataavailable = this.handleDataAvailable.bind(this);\n this.mediaRecorder.start();\n\n // demo: to download after 9sec\n /*\n setTimeout((event) => {\n mediaRecorder.stop();\n }, 9000);\n */\n }\n\n stop() {\n this.mediaRecorder?.stop();\n }\n\n handleDataAvailable(event: any) {\n if (event.data.size > 0) {\n this.recordedChunks.push(event.data);\n this.download();\n }\n }\n\n download() {\n const blob = new Blob(this.recordedChunks, {\n type: 'video/webm',\n });\n\n const url = URL.createObjectURL(blob);\n const a: any = document.createElement('a');\n document.body.appendChild(a);\n a.style = 'display: none';\n a.href = url;\n a.download = 'test.webm';\n a.click();\n URL.revokeObjectURL(url);\n }\n}\n","import {\n changeLowBandwidth,\n changeStatusMainVideoOnScene,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n commandStarted,\n initSignalling,\n resetConfig,\n resetIntroSrc,\n resetUnrealState,\n resetUnrealStateAction,\n resetWarnTimeout,\n setAwsInstance,\n setCirrusConnected,\n setCirrusDisconnected,\n setConfig,\n setDataChannelConnected,\n setErrorMessage,\n setEstablishingConnection,\n setFreezeFrame,\n setFreezeFrameFromVideo,\n setIntroImageSrc,\n setIntroVideoSrc,\n setLoadingImageSrc,\n setLoopBackCommandIsCompleted,\n setSignalingName,\n setStatusMessage,\n setStatusPercentSignallingServer,\n setStreamClientCompanyId,\n setStreamViewId,\n setUnrealVersion,\n setViewportReady,\n updateCirrusInfo,\n} from './unreal.actions';\nimport { createReducer, on } from '@ngrx/store';\nimport {\n AwsInstance,\n DisconnectReason,\n DisconnectType,\n FreezeFrameMessage,\n LBMStats,\n SignalingData,\n StreamConfig,\n StreamResolutionProps,\n UnrealError,\n} from '../interfaces';\nimport { DEFAULT_WARN_TIMEOUT } from '../constants';\nimport { removeExileCommands } from '../helpers';\n\nexport interface CommandsLoaderState {\n commandsInProgress: {\n timeStamp: number;\n command: string;\n id: string;\n }[];\n totalCommandsStarted: number;\n totalCommandsCompleted: number;\n}\n\nexport interface UnrealState {\n lowBandwidthStats: LBMStats | undefined;\n streamConfig: StreamConfig;\n awsInstance: AwsInstance;\n lowBandwidth: boolean;\n wasInitialized: boolean;\n isFirstSuccessLoad: boolean;\n cirrusConnected: boolean;\n viewportReady: boolean;\n freezeFrameFromVideo: FreezeFrameMessage;\n freezeFrame: FreezeFrameMessage;\n statusMessage: string | null;\n /**\n * @deprecated, use ssData in future\n */\n ssInfo: string | null;\n ssData: SignalingData | null;\n statusPercentSignallingServer: number | null;\n errorMessage: UnrealError | null;\n dataChannelConnected: boolean;\n streamResolution: StreamResolutionProps;\n isVideoPlaying: boolean;\n establishingConnection: boolean;\n disconnectReason: DisconnectType;\n loaderCommands: CommandsLoaderState;\n unrealVersion: string | null;\n streamClientCompanyId: string | null;\n streamViewId: string | null;\n videoIntroSrc: string | null;\n imageIntroSrc: string | null;\n imageLoadingSrc: string;\n}\n\nexport const initialState: UnrealState = {\n lowBandwidthStats: undefined,\n wasInitialized: false,\n isFirstSuccessLoad: false,\n lowBandwidth: false,\n cirrusConnected: false,\n establishingConnection: false,\n viewportReady: false,\n dataChannelConnected: false,\n isVideoPlaying: false,\n statusPercentSignallingServer: null,\n statusMessage: null,\n errorMessage: null,\n ssInfo: null,\n ssData: null,\n streamResolution: { width: null, height: null },\n freezeFrameFromVideo: { dataUrl: null, progress: null },\n freezeFrame: { dataUrl: null, progress: null },\n disconnectReason: DisconnectReason.none,\n awsInstance: {\n wsUrl: null,\n instanceName: null,\n pollingUrl: null,\n },\n streamConfig: {\n autoStart: true,\n warnTimeout: DEFAULT_WARN_TIMEOUT,\n matchMakerUrls: [],\n },\n loaderCommands: {\n commandsInProgress: [],\n totalCommandsStarted: 0,\n totalCommandsCompleted: 0,\n },\n unrealVersion: '',\n streamClientCompanyId: '',\n streamViewId: 'default',\n videoIntroSrc: null,\n imageIntroSrc: null,\n imageLoadingSrc: 'assets/images/avif/configurator_bg.avif',\n};\nexport const unrealReducer = createReducer(\n initialState,\n on(changeLowBandwidth, (state: UnrealState, { lowBandwidth, stats }) => {\n return {\n ...state,\n lowBandwidth: lowBandwidth,\n lowBandwidthStats: lowBandwidth ? stats : undefined,\n };\n }),\n on(changeStatusMainVideoOnScene, (state: UnrealState, { isVideoPlaying }) => {\n return {\n ...state,\n isVideoPlaying: isVideoPlaying,\n };\n }),\n on(setAwsInstance, (state: UnrealState, awsInstance) => {\n return {\n ...state,\n awsInstance: awsInstance,\n };\n }),\n on(setViewportReady, (state: UnrealState, { value }) => {\n return {\n ...state,\n viewportReady: value,\n statusMessage: value ? null : state.statusMessage,\n errorMessage: value ? null : state.errorMessage,\n };\n }),\n on(updateCirrusInfo, (state: UnrealState, { ssInfo, ssData }) => {\n return {\n ...state,\n ssInfo: ssInfo, // For back compatibility\n ssData: ssData, // Contains all the data from the ssInfo as object\n };\n }),\n on(\n changeStreamResolutionSuccessAction,\n (state: UnrealState, { width, height }) => {\n return {\n ...state,\n streamResolution: {\n width: width,\n height: height,\n },\n };\n },\n ),\n on(setFreezeFrame, (state: UnrealState, freezeFrame) => {\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(setErrorMessage, (state: UnrealState, errorMessage) => {\n if (state.dataChannelConnected) {\n return state;\n }\n\n return {\n ...state,\n errorMessage: errorMessage,\n statusMessage: null,\n };\n }),\n on(setFreezeFrameFromVideo, (state: UnrealState, freezeFrameFromVideo) => {\n return {\n ...state,\n freezeFrameFromVideo: {\n dataUrl: freezeFrameFromVideo.dataUrl,\n progress: freezeFrameFromVideo.progress || null,\n },\n };\n }),\n on(setStatusMessage, (state: UnrealState, { message }) => {\n return {\n ...state,\n statusMessage: message,\n };\n }),\n on(setEstablishingConnection, (state: UnrealState, { value }) => {\n return {\n ...state,\n establishingConnection: value,\n };\n }),\n on(setStatusPercentSignallingServer, (state: UnrealState, { percent }) => {\n return {\n ...state,\n statusPercentSignallingServer: percent,\n };\n }),\n on(setDataChannelConnected, (state: UnrealState, { value }) => {\n return {\n ...state,\n dataChannelConnected: value,\n wasInitialized: value ? true : state.wasInitialized,\n };\n }),\n on(setConfig, (state: UnrealState, { config }) => {\n return {\n ...state,\n streamConfig: { ...state.streamConfig, ...config },\n };\n }),\n on(resetConfig, (state: UnrealState) => {\n return {\n ...state,\n streamConfig: initialState.streamConfig,\n };\n }),\n on(resetWarnTimeout, (state: UnrealState) => {\n return {\n ...state,\n streamConfig: {\n ...state.streamConfig,\n warnTimeout: DEFAULT_WARN_TIMEOUT,\n },\n };\n }),\n on(setCirrusConnected, (state: UnrealState) => {\n return {\n ...state,\n cirrusConnected: true,\n };\n }),\n on(setCirrusDisconnected, (state: UnrealState) => {\n return {\n ...state,\n cirrusConnected: false,\n };\n }),\n on(initSignalling, (state: UnrealState) => {\n return {\n ...state,\n disconnectReason: DisconnectReason.none,\n };\n }),\n on(setSignalingName, (state: UnrealState, { instanceName }) => {\n return {\n ...state,\n awsInstance: { ...state.awsInstance, instanceName },\n };\n }),\n on(setLoopBackCommandIsCompleted, (state) => {\n return {\n ...state,\n isFirstSuccessLoad: true,\n };\n }),\n on(setUnrealVersion, (state: UnrealState, { version }) => {\n return {\n ...state,\n unrealVersion: version,\n };\n }),\n on(setStreamClientCompanyId, (state: UnrealState, { id }) => {\n return {\n ...state,\n streamClientCompanyId: id,\n };\n }),\n on(setStreamViewId, (state: UnrealState, { id }) => {\n return {\n ...state,\n streamViewId: id,\n };\n }),\n on(setIntroImageSrc, (state: UnrealState, { src }) => {\n return {\n ...state,\n imageIntroSrc: src,\n };\n }),\n on(setLoadingImageSrc, (state: UnrealState, { src }) => {\n return {\n ...state,\n imageLoadingSrc: src,\n };\n }),\n on(setIntroVideoSrc, (state: UnrealState, { src }) => {\n return {\n ...state,\n videoIntroSrc: src,\n };\n }),\n on(resetIntroSrc, (state: UnrealState) => {\n return {\n ...state,\n imageIntroSrc: '',\n videoIntroSrc: '',\n };\n }),\n on(commandStarted, (state, { id, command }) => {\n return {\n ...state,\n loaderCommands: {\n ...state.loaderCommands,\n totalCommandsStarted: state.loaderCommands.totalCommandsStarted + 1,\n commandsInProgress: [\n ...state.loaderCommands.commandsInProgress,\n { id, command, timeStamp: new Date().getTime() },\n ],\n },\n };\n }),\n on(commandCompleted, (state, { id }) => {\n return {\n ...state,\n loaderCommands: removeExileCommands(state.loaderCommands, id),\n };\n }),\n on(resetUnrealState, (state: UnrealState) => {\n return {\n ...initialState,\n wasInitialized: state.wasInitialized,\n isFirstSuccessLoad: state.isFirstSuccessLoad,\n unrealVersion: state.unrealVersion,\n streamClientCompanyId: state.streamClientCompanyId,\n streamViewId: state.streamViewId,\n imageLoadingSrc: state.imageLoadingSrc,\n };\n }),\n on(resetUnrealStateAction, () => {\n return initialState;\n }),\n);\n","import { createFeature } from '@ngrx/store';\nimport { unrealReducer } from './unreal.reducer';\n\nexport const unrealFeature = createFeature({\n name: 'unrealFeature',\n reducer: unrealReducer,\n});\n","import { createSelector } from '@ngrx/store';\nimport { unrealFeature } from './unreal.feature';\nimport { DEFAULT_WARN_TIMEOUT } from '../constants';\nimport { clampf, lerp, Truthy } from '@3dsource/utils';\n\nexport const selectFreezeFrameDataUrlFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.dataUrl || null,\n);\nexport const selectFreezeFrameProgressMessageFromVideo = createSelector(\n unrealFeature.selectFreezeFrameFromVideo,\n unrealFeature.selectLowBandwidth,\n (freezeFrameFromVideo, isLow) =>\n isLow ? null : freezeFrameFromVideo?.progress || null,\n);\nexport const selectFreezeFrameDataUrl = createSelector(\n unrealFeature.selectFreezeFrame,\n unrealFeature.selectLowBandwidth,\n (freezeFrame, isLow) =>\n freezeFrame?.dataUrl && isLow ? freezeFrame?.dataUrl : null,\n);\nexport const selectIsFreezeFrameLoading = createSelector(\n unrealFeature.selectFreezeFrame,\n (freezeFrame) =>\n freezeFrame?.progress\n ? freezeFrame.progress > 0 && freezeFrame.progress < 1\n : false,\n);\nexport const selectFreezeFrameCombinedDataUrl = createSelector(\n selectFreezeFrameDataUrlFromVideo,\n selectFreezeFrameDataUrl,\n (dataUrlFromVideo, remoteDataUrl) =>\n dataUrlFromVideo || remoteDataUrl || null,\n);\nexport const selectStreamConfig = createSelector(\n unrealFeature.selectStreamConfig,\n (config) => config,\n);\nexport const selectWarnTimeout = createSelector(\n selectStreamConfig,\n (config) => config?.warnTimeout || DEFAULT_WARN_TIMEOUT,\n);\nexport const selectMatchUrls = createSelector(selectStreamConfig, (config) =>\n (config?.matchMakerUrls || []).filter(Truthy),\n);\nexport const selectIsAutostart = createSelector(\n selectStreamConfig,\n (config) => config?.autoStart,\n);\nexport const selectWsUrl = createSelector(\n unrealFeature.selectAwsInstance,\n (instance) => instance?.wsUrl,\n);\nexport const selectShowReconnectPopup = createSelector(\n unrealFeature.selectWasInitialized,\n unrealFeature.selectCirrusConnected,\n unrealFeature.selectEstablishingConnection,\n unrealFeature.selectImageIntroSrc,\n unrealFeature.selectVideoIntroSrc,\n (wasInitialized, connected, establishing, imageSrc, videoSrc) =>\n wasInitialized && !connected && !establishing && !imageSrc && !videoSrc,\n);\nexport const selectShowLoader = createSelector(\n unrealFeature.selectWasInitialized,\n unrealFeature.selectViewportReady,\n selectStreamConfig,\n selectShowReconnectPopup,\n (wasInitialized, viewportReady, config, showPopup) =>\n ((config.autoStart && !wasInitialized) || !showPopup) && !viewportReady,\n);\nexport const selectIsVideoPlayingAndDataChannelConnected = createSelector(\n unrealFeature.selectIsVideoPlaying,\n unrealFeature.selectDataChannelConnected,\n (isVideoPlaying, isDataChannelConnected) =>\n isVideoPlaying && isDataChannelConnected,\n);\nexport const selectSignalingParameters = createSelector(\n unrealFeature.selectSsData,\n unrealFeature.selectAwsInstance,\n unrealFeature.selectSsInfo,\n (data, instance, ssInfo) => {\n const info = [];\n if (data) {\n info.push(`${data.cirrusVersion}, ${data.branchInfo}`);\n info.push(`Unreal App Version: ${data.streamerVersion}`);\n info.push(`APP: ${data.streamPath}${data.streamApp}`);\n } else {\n info.push(ssInfo);\n }\n info.push(`Polling: ${instance.pollingUrl}`);\n info.push(`WS: ${instance.wsUrl}`);\n return info.join('<br>');\n },\n);\nexport const selectLoaderCommands = createSelector(\n unrealFeature.selectLoaderCommands,\n (loaderCommands) => loaderCommands,\n);\nexport const selectCommandsInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => loaderCommands.commandsInProgress.length,\n);\nexport const selectCommandProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) => {\n if (loaderCommands.totalCommandsStarted > 0) {\n return (\n loaderCommands.totalCommandsCompleted /\n loaderCommands.totalCommandsStarted\n );\n }\n return 0;\n },\n);\nexport const selectLastCommandInProgress = createSelector(\n selectLoaderCommands,\n (loaderCommands) =>\n loaderCommands.commandsInProgress?.length\n ? loaderCommands.commandsInProgress[\n loaderCommands.commandsInProgress.length - 1\n ]\n : null,\n);\n/**\n * Returns Scene load progress as a float value in between 0-1\n */\nexport const selectTotalProgress = createSelector(\n unrealFeature.selectStatusPercentSignallingServer,\n selectCommandProgress,\n unrealFeature.selectAwsInstance,\n (statusPercentSignallingServer, commandProgress, signalingServer) => {\n /**\n * Set 20% immediately when signalingServer?.signalingUrl is available\n * Up to 19% of the progress is reserved for signaling server polling\n */\n const splitPoint = signalingServer?.wsUrl ? 0.2 : 0.19;\n const percentSignaling = lerp(\n 0.001,\n splitPoint,\n (statusPercentSignallingServer || 0) / 100,\n );\n const percentRest = lerp(0, 1 - splitPoint, commandProgress);\n return clampf(0, 1, percentSignaling + percentRest);\n },\n);\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport {\n selectFreezeFrameCombinedDataUrl,\n selectFreezeFrameProgressMessageFromVideo,\n} from '../../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'app-freeze-frame',\n templateUrl: './freeze-frame.component.html',\n styleUrls: ['./freeze-frame.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FreezeFrameComponent {\n #store = inject(Store);\n\n freezeFrameProgressMessageFromVideo = toSignal(\n this.#store.select(selectFreezeFrameProgressMessageFromVideo),\n );\n combinedFreeze = toSignal(\n this.#store.select(selectFreezeFrameCombinedDataUrl),\n );\n}\n","<div class=\"freeze-images\">\n @if (combinedFreeze()) {\n <img\n [src]=\"combinedFreeze()\"\n class=\"videoStillImage\"\n alt=\"freezeFrameImage\"\n />\n }\n\n @if (freezeFrameProgressMessageFromVideo()) {\n <div class=\"progress-status\">\n {{ freezeFrameProgressMessageFromVideo() }}\n </div>\n }\n</div>\n","import type { PipeTransform } from '@angular/core';\nimport { inject, Pipe } from '@angular/core';\nimport type {\n SafeHtml,\n SafeResourceUrl,\n SafeScript,\n SafeStyle,\n SafeUrl,\n} from '@angular/platform-browser';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Pipe({\n name: 'safe',\n})\nexport class SafePipe implements PipeTransform {\n private sanitizer = inject(DomSanitizer);\n\n transform(\n value: any,\n type: string,\n ): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {\n if (!value) {\n return value;\n }\n\n switch (type) {\n case 'html':\n return this.sanitizer.bypassSecurityTrustHtml(value);\n case 'style':\n return this.sanitizer.bypassSecurityTrustStyle(value);\n case 'script':\n return this.sanitizer.bypassSecurityTrustScript(value);\n case 'url':\n return this.sanitizer.bypassSecurityTrustUrl(value);\n case 'resourceUrl':\n return this.sanitizer.bypassSecurityTrustResourceUrl(value);\n default:\n throw new Error(`Invalid safe type specified: ${type}`);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { DialogRef } from '@angular/cdk/dialog';\nimport {\n SourceButtonComponent,\n SourceIconButtonComponent,\n} from '@3dsource/source-ui-native';\nimport { SafePipe } from '../../pipes';\n\n@Component({\n selector: 'app-low-bandwidth-modal',\n templateUrl: './low-bandwidth-modal.component.html',\n styleUrls: ['./low-bandwidth-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceIconButtonComponent, 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 colorScheme=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n","import { share, skip } from 'rxjs';\nimport { Store } from '@ngrx/store';\nimport { inject } from '@angular/core';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { filter } from 'rxjs/operators';\nimport { Falsy } from '@3dsource/utils';\n\nexport class SubService {\n store = inject(Store);\n\n disconnect$ = this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), share());\n}\n","import { from, fromEvent, take } from 'rxjs';\nimport { SubService } from './sub.service';\nimport { Injectable } from '@angular/core';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { catchError, filter, first } from 'rxjs/operators';\nimport { sendSignal } from '../helpers/EventWrapper';\nimport { changeStatusMainVideoOnScene } from '../store/unreal.actions';\nimport { STREAMING_VIDEO_ID } from '../constants/unreal.constant';\nimport { dispatchResize } from '../helpers/dispatchResize';\nimport { tapLog } from '@3dsource/utils';\n\n@Injectable()\nexport class VideoService extends SubService {\n video!: HTMLVideoElement | null;\n audio!: HTMLAudioElement | null;\n container!: HTMLDivElement | null;\n\n create() {\n this.disconnect$.pipe(take(1)).subscribe(() => this.destroy());\n this.destroy();\n this.createWebRtcVideo();\n this.createWebRtcAudio();\n }\n\n private destroy() {\n this.video = null;\n this.audio = null;\n\n while (this.container?.firstChild) {\n this.container.removeChild(this.container.firstChild);\n }\n\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: false }),\n );\n }\n\n private createWebRtcVideo() {\n dispatchResize();\n const video = document.createElement('video');\n video.id = STREAMING_VIDEO_ID;\n video.playsInline = true;\n video.muted = true;\n video.autoplay = true;\n video.preload = 'auto';\n video.disablePictureInPicture = true;\n\n this.video = video;\n this.container?.appendChild(this.video);\n\n this.video.addEventListener('play', () => {\n this.store.dispatch(\n changeStatusMainVideoOnScene({ isVideoPlaying: true }),\n );\n });\n\n fromEvent(this.video, 'loadedmetadata')\n .pipe(\n first(),\n filter((data) => this.video === data.target),\n tapLog('VideoService loadedmetadata:'),\n )\n .subscribe(() =>\n sendSignal(UnrealInternalSignalEvents.OnVideoInitialized, this.video!),\n );\n }\n\n attachVideoStream(stream: MediaStream) {\n if (this.video) {\n this.video.srcObject = stream;\n } else {\n console.error('Video element is not defined.');\n }\n }\n\n attachAudioStream(stream: MediaStream) {\n // do nothing the video has the same media stream as the audio track we have here (they are linked)\n if (this.video?.srcObject === stream) {\n return;\n }\n // video element has some other media stream that is not associated with this audio track\n else if (\n this.audio &&\n this.video?.srcObject &&\n this.video?.srcObject !== stream\n ) {\n this.audio.srcObject = stream;\n this.playAudio(this.audio);\n }\n }\n\n private createWebRtcAudio() {\n const audio = new Audio();\n audio.id = 'streamingAudio';\n this.audio = audio;\n }\n\n private playAudio(audio: HTMLAudioElement) {\n from(audio.play())\n .pipe(\n catchError(() => fromEvent(document, 'click')),\n take(1),\n )\n .subscribe({\n next: () => audio.play(),\n error: () => ({}),\n });\n }\n\n play() {\n void this.video?.play();\n }\n}\n","import type { AfterViewInit, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n signal,\n} from '@angular/core';\nimport { VideoService } from '../../services/video.service';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { filter, skip } from 'rxjs/operators';\nimport type { SignalDescriptor } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { Falsy, Logger } from '@3dsource/utils';\nimport {\n selectShowReconnectPopup,\n selectStreamConfig,\n} from '../../store/unreal.selectors';\nimport { fromSignal } from '../../helpers/EventWrapper';\nimport { Store } from '@ngrx/store';\nimport { NgOptimizedImage } from '@angular/common';\nimport { initSignalling } from '../../store/unreal.actions';\nimport { SourceButtonComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-afk-restart-screen-locker',\n templateUrl: './afk-restart-screen-locker.component.html',\n styleUrls: ['./afk-restart-screen-locker.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgOptimizedImage, SourceButtonComponent, SourceButtonComponent],\n})\nexport class AfkRestartScreenLockerComponent implements AfterViewInit, OnInit {\n store = inject(Store);\n videoService = inject(VideoService);\n destroyRef = inject(DestroyRef);\n\n showReconnectPopup = toSignal(this.store.select(selectShowReconnectPopup));\n isViewportReady = toSignal(\n this.store.select(unrealFeature.selectViewportReady),\n );\n imageLoadingSrc = toSignal(\n this.store.select(unrealFeature.selectImageLoadingSrc),\n );\n streamConfig = toSignal(this.store.select(selectStreamConfig));\n isSecondStart = signal(\n !!(this.streamConfig()?.autoStart && location.href.match(/^https/gi)),\n );\n\n playCallBack: null | (() => void) = null;\n\n ngOnInit() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(skip(1), filter(Falsy), takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.onDisconnect());\n }\n\n ngAfterViewInit() {\n fromSignal(UnrealInternalSignalEvents.ShowPlayButton)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: SignalDescriptor['ShowPlayButton']) => {\n this.playCallBack = event.callback;\n\n if (this.videoService.video?.paused) {\n Logger.info('Simulate Press Play');\n this.playCallBack();\n }\n });\n }\n\n connect() {\n this.store.dispatch(initSignalling());\n }\n\n onDisconnect() {\n this.isSecondStart.set(true);\n this.playCallBack = null;\n }\n}\n","@if (!isViewportReady()) {\n <div class=\"preload\">\n <div class=\"back\">\n <img\n [ngSrc]=\"imageLoadingSrc()!\"\n fill\n loading=\"lazy\"\n alt=\"image loading src\"\n />\n </div>\n\n @if (showReconnectPopup()) {\n <div class=\"stream-message-wrapper\">\n <div class=\"resume-box\">\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [size]=\"'large'\"\n [colorScheme]=\"'primary'\"\n [data-testid]=\"'connect-button'\"\n class=\"connect-button\"\n >\n {{ isSecondStart() ? 'Resume' : 'Start' }}\n </src-button>\n </div>\n </div>\n }\n </div>\n}\n","import type { AfterViewInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n inject,\n Input,\n input,\n ViewChild,\n} from '@angular/core';\nimport {\n HEXtoRGB,\n HSVtoRGB,\n inverseLerp,\n RGBtoHEX,\n RGBtoHSV,\n} from '@3dsource/utils';\n\n@Component({\n selector: 'app-stat-graph',\n templateUrl: './stat-graph.component.html',\n styleUrls: ['./stat-graph.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StatGraphComponent implements AfterViewInit {\n private el = inject(ElementRef);\n @ViewChild('graph') graph!: ElementRef;\n private canvas!: HTMLCanvasElement;\n private ctx!: CanvasRenderingContext2D;\n\n readonly color = input('#417bc9');\n readonly tickStep = input(3);\n readonly label = input.required<string>();\n private scaleY!: number;\n\n @Input() set dataTick(data: { value: number; hash: number } | null) {\n this.pushData(data?.value ?? null);\n }\n\n private data: (number | null)[] = [];\n\n max = 0;\n min = 0;\n current = 0;\n\n ngAfterViewInit() {\n this.canvas = this.graph.nativeElement;\n this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n }\n\n @HostListener('window:resize', ['$event'])\n resize() {\n this.draw();\n }\n\n private draw() {\n if (!this.canvas) {\n return;\n }\n\n const all = this.data.filter((r) => r !== null && !isNaN(r)) as number[];\n this.max = Math.max(...all);\n this.min = Math.min(...all);\n this.scaleY = this.canvas.height / (this.max || 1);\n this.current = all[all.length - 1] || 0;\n this.ctx.save();\n const bounds = this.el.nativeElement.getBoundingClientRect();\n this.canvas.width = bounds.width;\n this.canvas.height = bounds.height - 30; // -p height\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n\n [...this.data].reverse().forEach((val, index) => {\n const h = (val || 0) * this.scaleY;\n\n this.ctx.fillStyle = this.getColor(this.color(), h as number);\n this.ctx.fillRect(\n index * this.tickStep(),\n this.canvas.height - h,\n this.tickStep(),\n h,\n );\n });\n this.ctx.restore();\n }\n\n private getColor(fillStyle: string, value = 0): string {\n const { r, g, b } = HEXtoRGB(fillStyle);\n /* eslint-disable-next-line prefer-const */\n let [h, s, v] = RGBtoHSV(r, g, b);\n v = inverseLerp(0, this.canvas.height, value);\n {\n const [r, g, b] = HSVtoRGB(h, s, v);\n const hex = '#' + RGBtoHEX(r, g, b);\n return hex;\n }\n }\n\n private pushData(value: number | null) {\n this.data.push(value);\n\n if (!this.canvas) {\n return;\n }\n\n if (this.data.length > this.canvas.width / this.tickStep()) {\n this.data.shift();\n }\n\n this.draw();\n }\n}\n","<div class=\"content\">\n <p>{{ label() }}: {{ current }} | Min:{{ min }} | Max:{{ max }}</p>\n <canvas #graph class=\"graph\"></canvas>\n</div>\n","import { filter } from 'rxjs/operators';\nimport { Injectable } from '@angular/core';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { setFreezeFrame } from '../store/unreal.actions';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { sendSignal } from '../helpers/EventWrapper';\nimport { unrealFeature } from '../store/unreal.feature';\n\n@Injectable()\nexport class FreezeFrameService extends SubService {\n receiving = false;\n\n private size = 0;\n private jpeg!: Uint8Array | undefined;\n private freezeFrameOverlay = new Image();\n\n init() {\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy))\n .subscribe(() => this.invalidate());\n }\n\n setData(view: Uint8Array) {\n view = view.slice(1 + 4);\n\n const jpeg = new Uint8Array(this.jpeg!.length + view.length);\n jpeg.set(this.jpeg!, 0);\n jpeg.set(view, this.jpeg!.length);\n this.jpeg = jpeg;\n if (this.jpeg.length === this.size) {\n this.receiving = false;\n Logger.info(`FRAME: Received complete freeze frame ${this.size}`);\n this.showFreezeFrame();\n } else if (this.jpeg.length > this.size) {\n Logger.error(\n `FRAME: Received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`,\n );\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: 0 }));\n\n this.jpeg = undefined;\n this.receiving = false;\n } else {\n this.dispatchInProgress();\n /* Logger.warn(\n `received next chunk (${view.length} bytes) of freeze frame: ${this.jpeg.length}/${this.size}`,\n );*/\n }\n }\n\n private dispatchInProgress() {\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: null,\n progress: (this.jpeg?.length || 0) / this.size,\n }),\n );\n }\n\n start(view: Uint8Array) {\n this.size = new DataView(view.slice(1, 5).buffer).getInt32(0, true);\n this.jpeg = view.slice(1 + 4);\n if (this.jpeg.length < this.size) {\n this.dispatchInProgress();\n sendSignal(UnrealInternalSignalEvents.FreezeFrameStart);\n Logger.info(\n `FRAME: Received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = true;\n } else {\n Logger.info(\n `FRAME: Received complete freeze frame: ${this.jpeg.length}/${this.size}`,\n );\n this.receiving = false;\n this.showFreezeFrame();\n }\n }\n\n invalidate() {\n this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: null }));\n this.jpeg = undefined;\n this.receiving = false;\n }\n\n private showFreezeFrame() {\n if (!this.jpeg) {\n return;\n }\n\n const base64 = btoa(\n this.jpeg?.reduce((data, byte) => data + String.fromCharCode(byte), ''),\n );\n this.freezeFrameOverlay.src = 'data:image/jpeg;base64,' + base64;\n this.store.dispatch(\n setFreezeFrame({\n dataUrl: this.freezeFrameOverlay.src,\n progress: 1,\n }),\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { filter } from 'rxjs/operators';\nimport type { TelemetryType } from '../interfaces/TelemetryEvent';\nimport { timer } from 'rxjs';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { generateUuid, Truthy } from '@3dsource/utils';\nimport { HttpClient } from '@angular/common/http';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\n\n@Injectable()\nexport class CommandTelemetryService {\n private readonly appId: string = 'metabox-telemetry';\n private commandsSent: Record<string, CommandToSend> = {};\n private exileTimout = 60000;\n private pollingTime = 5000;\n private commandSequenceNumber = 0;\n\n /**\n * The time the telemetry service was started.\n * Initialized at a moment when connectToSignaling() was called.\n * @private\n */\n private startTime!: number;\n private lastTime!: number;\n private uuid!: string;\n private viewId!: string;\n private readonly sessionId: string;\n private readonly userId: string;\n private payloads: Payload[] = [];\n\n private readonly httpClient = inject(HttpClient);\n private readonly unrealInitialConfig = inject(UNREAL_CONFIG, {\n optional: true,\n });\n\n constructor() {\n this.reset();\n this.sessionId = sessionStorage.getItem(this.appId) || this.uuid;\n this.userId = localStorage.getItem(this.appId) || this.uuid;\n sessionStorage.setItem(this.appId, this.sessionId);\n localStorage.setItem(this.appId, this.userId);\n this.start();\n }\n\n private get timeNow() {\n return Date.now();\n }\n\n private get sessionTime() {\n return this.timeNow - this.startTime;\n }\n\n private get canSkipSending() {\n return !(this.timeNow - this.lastTime > this.pollingTime * 2);\n }\n\n decorate(funcToDecorate: IToBeDecorated) {\n this.listenCallbacks();\n return this.wrapper.bind(this, funcToDecorate);\n }\n\n private start() {\n fromSignal(UnrealInternalSignalEvents.TelemetryStart).subscribe(\n ({ externalId }) => {\n this.trackStartCommand(`EXT-${externalId}`);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryStop).subscribe(\n ({ externalId, payload }) => {\n const trackingId = `EXT-${externalId}`;\n this.trackStopCommand(trackingId, undefined, payload?.multi, payload);\n },\n );\n\n fromSignal(UnrealInternalSignalEvents.TelemetryReset).subscribe(() => {\n this.reset();\n });\n\n timer(0, this.pollingTime).subscribe(() => {\n this.send(this.payloads);\n });\n }\n\n private reset() {\n this.uuid = generateUuid();\n this.commandSequenceNumber = 0;\n this.viewId = this.uuid;\n this.startTime = this.timeNow;\n this.payloads.length = 0;\n this.commandsSent = {};\n }\n\n private trackStartCommand(trackingId: string) {\n const out = {\n command: trackingId,\n trackingId,\n };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer('commandSent', out, timers);\n this.trackTime(out);\n }\n\n private trackStopCommand(\n trackingId: string,\n timeStampsRaw?: TimeStampsRaw,\n multi = false,\n response: any = {},\n ) {\n const commandResponse = this.commandsSent[trackingId];\n if (!commandResponse) {\n return;\n }\n const totalRoundTripTime = this.timeNow - commandResponse.timeStampJs;\n\n /**\n * Time between telemetry was reset and command was sent.\n */\n const commandSentJsTime = commandResponse.timeStampJs - this.startTime;\n let unrealTimers = {};\n\n const t = timeStampsRaw?.timeStampCommand;\n if (t) {\n unrealTimers = {\n unrealRoundTripTime:\n t.onCompleteCommand.timestamp - t.onRequestCommand.timestamp,\n\n unrealExecutionDuration:\n t.onCompleteCommand.timestamp - t.onStartCommand.timestamp,\n\n timeDiffRequest:\n t.onRequestCommand.timestamp - commandResponse.timeStampJs,\n\n timeDiffCallBack: this.timeNow - t.onCompleteCommand.timestamp,\n };\n }\n\n const timers = {\n sessionElapsedTime: this.sessionTime,\n commandSentJsTime,\n totalRoundTripTime,\n ...unrealTimers,\n } as ComputedTimers;\n\n this.pushStatToBuffer(\n 'commandStop',\n { ...commandResponse.command, response },\n timers,\n timeStampsRaw,\n );\n if (!multi) {\n delete this.commandsSent[trackingId];\n }\n }\n\n private pushStatToBuffer(\n type: TelemetryType,\n commandContent: any,\n computedTimers: ComputedTimers,\n timeStampsRaw?: TimeStampsRaw,\n ) {\n this.pushData({\n type,\n commandSequenceNumber: this.commandSequenceNumber++,\n commandContent,\n timeStampsRaw,\n computedTimers,\n });\n }\n\n private trackTime(command: any) {\n this.commandsSent[command.trackingId] = {\n timeStampJs: this.timeNow,\n command,\n };\n }\n\n private send(payload: Payload[]) {\n if (payload.length === 0 || (this.canSkipSending && payload.length < 10)) {\n return;\n }\n this.lastTime = this.timeNow;\n const out: TelemetryBatch = {\n appId: this.appId,\n sessionId: this.sessionId,\n viewId: this.viewId,\n userId: this.userId,\n ua: navigator.userAgent,\n timeStamp: new Date(this.timeNow).toString(),\n href: location.href,\n resolution: {\n width: window.screen.width,\n height: window.screen.height,\n pixelRatio: window.devicePixelRatio,\n },\n payload,\n };\n const lastIndex = payload[payload.length - 1].commandSequenceNumber;\n this.httpClient\n .post(this.unrealInitialConfig?.commandTelemetryReceiver || '', out)\n .subscribe(() => {\n this.payloads = this.payloads.filter(\n (p) => p.commandSequenceNumber > lastIndex,\n );\n });\n }\n\n /**\n * Listens for Unreal Engine callbacks.\n * Subscribes to the Unreal Engine event loop back and filters out events that do not have a tracking ID.\n * When a callback with a tracking ID is received,\n * it stops tracking the time for that command and filters out commands\n * that have exceeded the timeout limit.\n */\n private listenCallbacks() {\n fromSignal(UnrealInternalSignalEvents.UnrealCallback)\n .pipe(\n filter(({ json }) => {\n const callback =\n 'commandCallback' in json ? json.commandCallback : json;\n\n return Truthy(callback?.trackingId);\n }),\n )\n .subscribe(({ json }: any) => {\n const callback = json.commandCallback;\n const timeStampsRaw = json.timeStamp;\n const trackingId = callback?.trackingId || '';\n\n this.trackStopCommand(trackingId, timeStampsRaw);\n this.removeExileCommands();\n });\n }\n\n private pushData(payload: Payload) {\n this.payloads.push(payload);\n }\n\n /**\n * Removes commands that have exceeded the timeout limit.\n * Iterates over all the commands sent and checks if the difference between the current time\n * and the time the command was sent is greater than the timeout limit.\n * If it is, the command is marked for deletion.\n * After checking all commands, those marked for deletion are removed from the commands sent.\n * This method is used to ensure that commands that are not responded to within a certain time frame\n * do not remain in the commandsSent object indefinitely, which could lead to memory leaks over time.\n */\n private removeExileCommands() {\n const time: number = new Date().getTime();\n const markForDelete: string[] = [];\n Object.entries<CommandToSend>(this.commandsSent).forEach(\n ([trackingId, { timeStampJs }]) => {\n if (time - timeStampJs > this.exileTimout) {\n markForDelete.push(trackingId);\n }\n },\n );\n\n markForDelete.forEach((trackingId) => {\n delete this.commandsSent[trackingId];\n });\n }\n\n /**\n * Wraps the provided function with telemetry tracking.\n * Generates a unique tracking ID and adds it to the data object.\n * Pushes the command sent to the payloads with the tracking ID.\n * Starts tracking the time for the command.\n * Finally, calls the provided function with the modified data object.\n *\n * @param {IToBeDecorated} funcToDecorate - The function to be decorated with telemetry tracking.\n * @param {any} data - The data object to be passed to the function. It will be augmented with a unique tracking ID.\n */\n private wrapper(funcToDecorate: IToBeDecorated, data: any) {\n const out = { ...data, trackingId: generateUuid() };\n const timers = {\n sessionElapsedTime: this.sessionTime,\n } as ComputedTimers;\n this.pushStatToBuffer(\n 'commandSent',\n {\n ...out,\n trackingId: `${out.trackingId}`,\n },\n timers,\n );\n this.trackTime(out);\n funcToDecorate(out);\n }\n}\n\ntype IToBeDecorated = (data: any) => unknown;\n\ninterface TelemetryBatch {\n appId: string;\n sessionId: string;\n viewId: string;\n userId: string;\n ua: string;\n timeStamp: string;\n href: string;\n payload: Payload[];\n resolution: {\n width: number;\n height: number;\n pixelRatio: number;\n };\n}\n\ninterface Payload {\n type: TelemetryType;\n commandSequenceNumber: number;\n commandContent: any;\n timeStampsRaw?: TimeStampsRaw;\n computedTimers: ComputedTimers;\n}\n\ninterface TimeStampsRaw {\n timeStampPak: TimeStampPakCollection;\n timeStampCommand: TimeStampCommandCollection;\n}\n\ninterface TimeStampPakCollection {\n onLoadPak: TimeStampMemory;\n onRenderPak: TimeStampMemory;\n onSequencePak: TimeStampMemory;\n onSpawnPak: TimeStampMemory;\n}\n\ninterface TimeStampMemory {\n timestamp: number;\n ram: number;\n vRam: number;\n}\n\ninterface TimeStampCommandCollection {\n onRequestCommand: TimeStampMemory;\n onStartCommand: TimeStampMemory;\n onCompleteCommand: TimeStampMemory;\n}\n\ninterface ComputedTimers {\n unrealRoundTripTime: number;\n totalRoundTripTime: number;\n unrealExecutionDuration: number;\n sessionElapsedTime: number;\n timeDiffRequest: number;\n timeDiffCallBack: number;\n commandSentJsTime: number;\n}\n\nexport function TelemetryStart(externalId: string) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStart, { externalId });\n}\n\nexport function TelemetryStop(externalId: string, payload?: any) {\n sendSignal(UnrealInternalSignalEvents.TelemetryStop, { externalId, payload });\n}\n\nexport function ResetTelemetry() {\n sendSignal(UnrealInternalSignalEvents.TelemetryReset);\n}\n\ninterface CommandToSend {\n timeStampJs: number;\n command: { trackingId: string };\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport type { Observable } from 'rxjs';\nimport { from, of, switchMap } from 'rxjs';\nimport { catchError, map } from 'rxjs/operators';\nimport { Semaphore } from '@3dsource/utils';\nimport { UNREAL_CONFIG } from '../constants/initial-config';\n\n@Injectable()\nexport class RegionsPingService {\n private httpClient = inject(HttpClient);\n private unrealInitialConfig = inject(UNREAL_CONFIG, { 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 ): Observable<string | undefined> {\n return this.getProviders(regionListUrl).pipe(\n switchMap((providers: ProvidersData) => this.getPingResult(providers)),\n catchError(() => of(null)),\n map((data) => data?.region_code),\n );\n }\n\n public getPingResult(\n providers: ProvidersData,\n ): Observable<PingResult | null> {\n const regions = providers.regions;\n this.config.ping_timeout = providers.timeout || this.config.ping_timeout;\n\n return from(this.startPinging(regions));\n }\n\n public getProviders(\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 } finally {\n const latency = Math.round(performance.now() - startTime);\n pingResults.push(latency);\n }\n }\n return pingResults;\n }\n\n private async fetchWithTimeout(\n url: string,\n options: any = {},\n timeout: number,\n ) {\n const controller = new AbortController();\n options.signal = controller.signal;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, options);\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n}\n\ninterface ProvidersData {\n timeout?: number;\n regions: Region[];\n}\n\ninterface Region {\n region_code: string;\n url: string;\n timeout?: number;\n}\n\ninterface PingResult {\n region_code: string | undefined;\n result: number[];\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n ResetTelemetry,\n TelemetryStart,\n TelemetryStop,\n} from './command-telemetry.service';\nimport {\n combineLatest,\n merge,\n retryWhen,\n share,\n skip,\n Subject,\n switchMap,\n timeout,\n} from 'rxjs';\nimport { delay, filter, first, map, takeUntil, tap } from 'rxjs/operators';\nimport {\n initSignalling,\n setAwsInstance,\n setErrorMessage,\n setEstablishingConnection,\n setStatusMessage,\n setStatusPercentSignallingServer,\n} from '../store/unreal.actions';\nimport { HttpClient } from '@angular/common/http';\nimport { SubService } from './sub.service';\nimport { UnrealStatusMessage } from '../constants/UnrealStatusMessage';\nimport { unrealFeature } from '../store/unreal.feature';\nimport type { CloseReason } from '../interfaces/CloseReason';\nimport {\n COLOR_CODES,\n Falsy,\n generateUuid,\n Logger,\n tapLog,\n Truthy,\n} from '@3dsource/utils';\nimport {\n selectIsAutostart,\n selectMatchUrls,\n selectWsUrl,\n} from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport type {\n ConfigMessage,\n MessageBase,\n PollingOrchestrationMessage,\n SignalingMessageHandler,\n SignalingMessageMap,\n} from '../interfaces/SignalingMessage';\nimport { ConfigHandler } from '../helpers/FromStreamerHandlers/ConfigHandler';\nimport { AnswerHandler } from '../helpers/FromStreamerHandlers/AnswerHandler';\nimport { IceCandidateHandler } from '../helpers/FromStreamerHandlers/IceCandidateHandler';\nimport { SSInfoHandler } from '../helpers/FromStreamerHandlers/SSInfoHandler';\nimport { InstanceReadyHandler } from '../helpers/FromStreamerHandlers/InstanceReadyHandler';\nimport { InstanceReservedHandler } from '../helpers/FromStreamerHandlers/InstanceReservedHandler';\nimport { PingHandler } from '../helpers/FromStreamerHandlers/PingHandler';\nimport { OnOpenHandler } from '../helpers/WsHandlers/OpenHandler';\nimport { OnCloseHandler } from '../helpers/WsHandlers/OnCloseHandler';\nimport { OnErrorHandler } from '../helpers/WsHandlers/OnErrorHandler';\nimport { OnMessageHandler } from '../helpers/WsHandlers/OnMessageHandler';\nimport { PlayerCountHandler } from '../helpers/FromStreamerHandlers/PlayerCountHandler';\nimport { getActiveUrl } from '../helpers/GetNextUrl';\nimport { RegionsPingService } from '../services/regions-ping.service';\nimport { WSCloseCode_NORMAL_CLOSURE } from '../interfaces/CustomCloseCodes';\nimport { WS_OPEN_STATE, WS_TIMEOUT } from '../constants/unreal.constant';\n\n@Injectable()\nexport class SignallingService extends SubService {\n private readonly httpClient = inject(HttpClient);\n private readonly regionsPingService = inject(RegionsPingService);\n onConfig$ = new Subject<ConfigMessage>();\n onWebRtcIce$ = new Subject<RTCIceCandidate>();\n onWebRtcAnswer$ = new Subject<RTCSessionDescriptionInit | null>();\n\n private ws!: WebSocket;\n protected wsTimeoutHandler!: ReturnType<typeof setTimeout>;\n\n private wsMsgHandlers: Partial<{\n [K in keyof SignalingMessageMap]: SignalingMessageHandler<K>;\n }> = {};\n\n protected correlationId!: string;\n protected environmentId!: string;\n\n private establishingConnection = toSignal(\n this.store.select(unrealFeature.selectEstablishingConnection),\n );\n private isCirrusConnected = toSignal(\n this.store.select(unrealFeature.selectCirrusConnected),\n );\n private establishingConnectionDrop$ = this.store\n .select(unrealFeature.selectEstablishingConnection)\n .pipe(\n skip(1),\n filter(Falsy),\n tapLog('selectEstablishingConnection'),\n share(),\n );\n\n constructor() {\n super();\n this.setHandlersFromStream();\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy))\n .subscribe(() => {\n this.send(\n JSON.stringify({\n type: 'p2pEstablished',\n source: 'front',\n sessionId: generateUuid(),\n }),\n );\n });\n\n combineLatest([\n this.store\n .select(selectMatchUrls)\n .pipe(tapLog('MatchMakerUrls changed:')),\n this.store.select(selectIsAutostart).pipe(tapLog('Autostart is:')),\n ])\n .pipe(\n filter(([, autoStart]) => autoStart),\n map(([matchMakerUrls]) => [...matchMakerUrls].filter(Truthy)),\n filter((urls) => urls.length > 0),\n )\n .subscribe((urls) => this.connectToSignaling(urls));\n\n this.store\n .select(selectWsUrl)\n .pipe(filter(Truthy))\n .subscribe((url) => {\n this.initWebSocket(url);\n });\n }\n\n protected initEstablishingConnection() {\n this.showStatusMessage(UnrealStatusMessage.STARTING_YOUR_SESSION);\n this.store.dispatch(setEstablishingConnection({ value: true }));\n }\n\n private stopEstablishingConnection() {\n this.store.dispatch(setEstablishingConnection({ value: false }));\n }\n\n private connectToSignaling(urlList: string[]) {\n // Preparation for WebSocket Orchestration\n this.correlationId = generateUuid();\n this.environmentId = '7e356e8d-8fa5-4cf7-83d0-394903e7b0d6';\n\n ResetTelemetry();\n if (this.establishingConnection() || this.isCirrusConnected()) {\n Logger.warn(\n `SIGNALING REQUEST can't be called again!. Waiting for connection or error.`,\n );\n return;\n }\n\n this.initEstablishingConnection();\n this.regionsPingService\n .getFastest()\n .pipe(first())\n .subscribe((region) => {\n const out = urlList.map((url) => {\n if (region && !url.includes(':region')) {\n return url.replace(\n /signallingserver/gi,\n `signallingserver/region:${region}`,\n );\n }\n return url;\n });\n this.connectToSignalingAfterPing(out);\n });\n }\n\n private connectToSignalingAfterPing(urls: string[]): void {\n const urlGen = getActiveUrl(urls);\n\n TelemetryStart('getSignaling');\n\n const createSubscription = () => {\n const signalingUrl = `${urlGen.next().value}`;\n\n if (signalingUrl.match(/^ws(s?):\\/\\//i)) {\n this.store.dispatch(\n setAwsInstance({\n wsUrl: signalingUrl,\n pollingUrl: null,\n instanceName: null,\n }),\n );\n\n return;\n }\n\n const subscription = combineLatest([\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ])\n .pipe(\n filter(([clientId, viewId]) => !!clientId && !!viewId),\n tapLog('Stream Id =>'),\n switchMap(([clientId, viewId]) =>\n this.httpClient.get(`${signalingUrl}${clientId}/${viewId}`),\n ),\n timeout(4000),\n filter((data: PollingOrchestrationMessage) => {\n TelemetryStop('getSignaling', { ...data, multi: true });\n\n if (data.signallingServer === '' || data.error) {\n this.showStatusMessage(data?.mm_message || 'Server not found');\n\n if (data?.info) {\n this.store.dispatch(\n setStatusPercentSignallingServer({\n percent: data.info.percent,\n }),\n );\n }\n\n throw new Error('Invalid Value');\n }\n\n this.store.dispatch(\n setStatusPercentSignallingServer({ percent: 100 }),\n );\n\n return true;\n }),\n retryWhen((error) =>\n error.pipe(\n tap(() =>\n this.showStatusMessage(\n UnrealStatusMessage.CONNECTING_TO_SESSION,\n ),\n ),\n tap(() => Logger.log('Retrying with new URL')),\n delay(4000),\n tap(() => {\n // Unsubscribe the previous subscription and create a new one\n subscription.unsubscribe();\n createSubscription();\n }),\n ),\n ),\n takeUntil(merge(this.disconnect$, this.establishingConnectionDrop$)),\n )\n .subscribe((data: PollingOrchestrationMessage) => {\n subscription.unsubscribe();\n const wsProtocol = location.protocol.match(/https/i) ? 'wss' : 'ws';\n const wsUrl = `${wsProtocol}://${data.signallingServer}`;\n this.store.dispatch(\n setAwsInstance({\n wsUrl,\n pollingUrl: signalingUrl,\n instanceName: data.signallingServer!,\n }),\n );\n });\n };\n createSubscription();\n }\n\n showStatusMessage(message: string | null) {\n this.store.dispatch(setStatusMessage({ message }));\n }\n\n /**\n * Close the connection with the signaling server\n * @param data\n */\n close(data: CloseReason | void) {\n const { code, reason } = data || {\n code: WSCloseCode_NORMAL_CLOSURE,\n reason: 'NoReason',\n };\n if (this.ws) Logger.warn('Closing existing WebSocket connection');\n this.ws?.close(code, reason);\n this.ws = null as never;\n }\n\n send(data: string | object) {\n let dataString = data;\n if (typeof dataString !== 'string') {\n dataString = JSON.stringify(data);\n }\n if (this.ws && this.ws.readyState === WS_OPEN_STATE) {\n try {\n Logger.colored(...COLOR_CODES.TO_CIRRUS, JSON.parse(data as string));\n } catch {\n Logger.colored(...COLOR_CODES.TO_CIRRUS, data);\n }\n try {\n this.ws.send(dataString);\n } catch {\n Logger.error('No Websocket');\n }\n }\n }\n\n protected watchTimeoutOrErrorAndReconnectLater() {\n this.stopRetryTimer();\n this.wsTimeoutHandler = setTimeout(() => {\n Logger.warn('No WS Response, retrying new signaling');\n this.showStatusMessage(UnrealStatusMessage.CONNECTING_TO_SESSION);\n this.stopEstablishingConnection();\n this.store.dispatch(initSignalling());\n }, WS_TIMEOUT);\n }\n\n protected stopRetryTimer() {\n clearTimeout(this.wsTimeoutHandler);\n }\n\n private initWebSocket(url: string) {\n if (!window?.['WebSocket']) {\n alert(\"Your browser doesn't support WebSocket\");\n return;\n }\n\n this.clearWs();\n const wsUrl = this.httpUrlToWs(url);\n\n Logger.info('Creating socket', wsUrl);\n try {\n this.ws = new WebSocket(wsUrl);\n } catch (error) {\n this.ws = {} as WebSocket;\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebSocketError',\n message: 'WebSocket Error',\n }),\n );\n Logger.error('Error creating WebSocket', error);\n }\n\n this.ws.onmessage = OnMessageHandler.bind(this);\n this.ws.onerror = OnErrorHandler.bind(this);\n this.ws.onclose = OnCloseHandler.bind(this);\n this.ws.onopen = OnOpenHandler.bind(this);\n this.watchTimeoutOrErrorAndReconnectLater();\n TelemetryStart('iceCandidate');\n }\n\n private httpUrlToWs(url: string) {\n return url.replace('http://', 'ws://').replace('https://', 'wss://');\n }\n\n private clearWs() {\n this.onWebRtcAnswer$.next(null);\n if (this.ws) {\n this.ws.onmessage = () => null;\n this.ws.onerror = () => null;\n this.ws.onclose = () => null;\n this.ws.onopen = () => null;\n this.ws = null as never;\n }\n }\n\n protected handleMessage(msg: MessageBase) {\n try {\n Logger.colored(...COLOR_CODES.FROM_CIRRUS, msg);\n this.wsMsgHandlers[msg.type]!(msg as never);\n } catch {\n Logger.colored(\n ...COLOR_CODES.FROM_CIRRUS_ERROR,\n `Invalid CIRRUS message type: ${msg.type}`,\n );\n }\n }\n\n private setHandlersFromStream() {\n this.wsMsgHandlers.ping = PingHandler.bind(this);\n this.wsMsgHandlers.config = ConfigHandler.bind(this);\n this.wsMsgHandlers.answer = AnswerHandler.bind(this);\n this.wsMsgHandlers.ssInfo = SSInfoHandler.bind(this);\n this.wsMsgHandlers.playerCount = PlayerCountHandler.bind(this);\n this.wsMsgHandlers.iceCandidate = IceCandidateHandler.bind(this);\n this.wsMsgHandlers.instanceReady = InstanceReadyHandler.bind(this);\n this.wsMsgHandlers.instanceReserved = InstanceReservedHandler.bind(this);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { fromEvent, share, Subject, tap } from 'rxjs';\nimport { filter, first, map, takeUntil } from 'rxjs/operators';\nimport {\n destroyRemoteConnections,\n setDataChannelConnected,\n setErrorMessage,\n setStatusMessage,\n} from '../store/unreal.actions';\nimport { SubService } from './sub.service';\nimport { Logger, Truthy } from '@3dsource/utils';\nimport { TelemetryStart, TelemetryStop } from './command-telemetry.service';\nimport type { ConfigMessage } from '../interfaces/SignalingMessage';\nimport { DisconnectReason } from '../interfaces/disconnect-reasons';\n\n@Injectable()\nexport class WebRtcPlayerService extends SubService {\n pcClient!: RTCPeerConnection | null;\n onAudioTrack$ = new Subject<MediaStream>();\n onVideoTrack$ = new Subject<MediaStream>();\n onDataChannelMessage$ = new Subject<number[]>();\n onWebRtcCandidate$ = new Subject<RTCIceCandidate>();\n onWebRtcOffer$ = new Subject<RTCSessionDescriptionInit>();\n\n private cfg: RTCConfiguration = {};\n private useMic = false;\n private forceTURN = false;\n private preferSFU = false;\n private autoPlayAudio = true;\n private startVideoMuted = true;\n private forceMonoAudio = false;\n private forceMaxBundle = false;\n private dcClient!: RTCDataChannel | null;\n private sdpConstraints!: RTCOfferOptions;\n private dataChannelOptions!: { ordered: boolean };\n private webRtcErrorTimeout!: ReturnType<typeof setTimeout>;\n\n async createWebRtcOffer(): Promise<void> {\n Logger.info('Creating offer');\n let offer: void;\n try {\n clearTimeout(this.webRtcErrorTimeout);\n offer = await this.createOffer(this.cfg);\n this.webRtcErrorTimeout = setTimeout(() => {\n if (this.pcClient?.connectionState?.match(/connecting|failed/gi)) {\n this.dispatchWebRtcError('WebRTCError: Timeout');\n }\n }, 10000);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n this.dispatchWebRtcError('WebRTCError: Offer Error');\n }\n\n return offer;\n }\n\n private dispatchWebRtcError(message: string) {\n Logger.error(message);\n this.store.dispatch(\n setErrorMessage({\n errorType: 'WebRTCError',\n message,\n }),\n );\n }\n\n private async createOffer(config: RTCConfiguration): Promise<void> {\n this.closePC();\n this.pcClient = new RTCPeerConnection(config);\n\n TelemetryStart('Browser ICE gathering');\n TelemetryStart('Browser ICE connection');\n TelemetryStart('Signaling state change');\n\n fromEvent(this.pcClient, 'signalingstatechange')\n .pipe(\n map(() => this.pcClient?.signalingState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Signaling state change] |', state, '|');\n TelemetryStop('Signaling state change', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'iceconnectionstatechange')\n .pipe(\n map(() => this.pcClient?.iceConnectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE connection] |', state, '|');\n TelemetryStop('Browser ICE connection', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'icegatheringstatechange')\n .pipe(\n map(() => this.pcClient?.iceGatheringState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[Browser ICE gathering] |', state, '|');\n TelemetryStop('Browser ICE gathering', { state, multi: true });\n });\n\n fromEvent(this.pcClient, 'connectionstatechange')\n .pipe(\n map(() => this.pcClient?.connectionState),\n takeUntil(this.disconnect$),\n )\n .subscribe((state) => {\n Logger.info('[RTCPeerConnection state] |', state, '|');\n });\n\n fromEvent<RTCPeerConnectionIceEvent>(this.pcClient, 'icecandidate')\n .pipe(\n map((e: RTCPeerConnectionIceEvent) => e.candidate),\n filter(Truthy),\n tap((candidate: RTCIceCandidate) =>\n Logger.info(\n '[Browser ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n ),\n ),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onWebRtcCandidate$.next(data));\n\n fromEvent<RTCDataChannelEvent>(this.pcClient, 'datachannel')\n .pipe(\n tap(() =>\n Logger.info(\n 'Data channel created for us by browser as we are a receiving peer.',\n ),\n ),\n map((e: RTCDataChannelEvent) => e.channel),\n takeUntil(this.disconnect$),\n )\n .subscribe((datachannel) => {\n this.dcClient = this.setupDataChannelCallbacks(datachannel);\n });\n\n const onTrack$ = fromEvent<RTCTrackEvent>(this.pcClient, 'track').pipe(\n filter((e) => !!e.track),\n tap((e) =>\n Logger.info(\n 'Got track - ' +\n e.track.kind +\n ' id=' +\n e.track.id +\n ' readyState=' +\n e.track.readyState,\n ),\n ),\n share(),\n );\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'audio'),\n map((e) => e.streams[0]),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onAudioTrack$.next(data));\n\n onTrack$\n .pipe(\n filter((e: RTCTrackEvent) => e.track.kind === 'video'),\n map((e) => e.streams[0]),\n tap(() => Logger.info('Set video source from video track ontrack.')),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onVideoTrack$.next(data));\n\n await this.setupTransceiversAsync(this.pcClient);\n this.dcClient = this.createDataChannel(\n this.pcClient,\n 'cirrus',\n this.dataChannelOptions,\n );\n\n this.disconnect$.pipe(first()).subscribe(() => {\n this.closePC();\n });\n\n await this.handleCreateOffer();\n }\n\n createDataChannel(\n pc: RTCPeerConnection,\n label: string,\n options: RTCDataChannelInit,\n ) {\n // This is the primary data channel code path when we are \"offering\"\n Logger.info(`[DATACHANNEL] Creating datachannel primary (${label})...`);\n const datachannel = pc.createDataChannel(label, options);\n return this.setupDataChannelCallbacks(datachannel);\n }\n\n private async setupTransceiversAsync(pc: RTCPeerConnection): Promise<void> {\n const hasTransceivers = pc.getTransceivers().length > 0;\n\n // Setup a transceiver for getting UE video\n pc.addTransceiver('video', { direction: 'recvonly' });\n\n // Setup a transceiver for sending mic audio to UE and receiving audio from UE\n if (!this.useMic) {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n } else {\n const audioSendOptions = this.useMic\n ? {\n autoGainControl: false,\n channelCount: 1,\n echoCancellation: false,\n latency: 0,\n noiseSuppression: false,\n sampleRate: 48000,\n sampleSize: 16,\n volume: 1.0,\n }\n : false;\n\n // Note using mic on android chrome requires SSL or chrome://flags/ \"unsafely-treat-insecure-origin-as-secure\"\n const stream = await navigator.mediaDevices.getUserMedia({\n video: false,\n audio: audioSendOptions,\n });\n if (stream) {\n if (hasTransceivers) {\n for (const transceiver of pc.getTransceivers()) {\n if (\n transceiver &&\n transceiver.receiver &&\n transceiver.receiver.track &&\n transceiver.receiver.track.kind === 'audio'\n ) {\n for (const track of stream.getTracks()) {\n // eslint-disable-next-line eqeqeq\n if (track.kind && track.kind == 'audio') {\n transceiver.sender.replaceTrack(track);\n transceiver.direction = 'sendrecv';\n }\n }\n }\n }\n } else {\n for (const track of stream.getTracks()) {\n // eslint-disable-next-line eqeqeq\n if (track.kind && track.kind == 'audio') {\n pc.addTransceiver(track, { direction: 'sendrecv' });\n }\n }\n }\n } else {\n pc.addTransceiver('audio', { direction: 'recvonly' });\n }\n }\n }\n\n private setupDataChannelCallbacks(\n datachannel: RTCDataChannel,\n ): RTCDataChannel | null {\n try {\n TelemetryStart('DataChannel Connection');\n // Inform browser we would like binary data as an ArrayBuffer (FF chooses Blob by default!)\n datachannel.binaryType = 'arraybuffer';\n\n fromEvent(datachannel, 'close')\n .pipe(first())\n .subscribe((e) => {\n Logger.warn(\n `[DATACHANNEL] Data channel disconnected: ${datachannel.label}(${datachannel.id})`,\n e,\n );\n\n this.store.dispatch(\n destroyRemoteConnections({\n disconnectReason: DisconnectReason.dataChannelClosed,\n }),\n );\n });\n\n fromEvent(datachannel, 'error')\n .pipe(takeUntil(this.disconnect$))\n .subscribe((e) => {\n const message = `[DATACHANNEL] Data channel error: ${datachannel.label}(${datachannel.id})`;\n Logger.error(message, e);\n });\n\n fromEvent(datachannel, 'open')\n .pipe(\n tap(() => {\n Logger.info(\n `[DATACHANNEL] Data channel connected: ${datachannel.label}(${datachannel.id})`,\n );\n }),\n takeUntil(this.disconnect$),\n )\n .subscribe(() => {\n TelemetryStop('DataChannel Connection');\n this.onDataChannelConnected();\n });\n\n fromEvent<MessageEvent>(datachannel, 'message')\n .pipe(\n map((e: MessageEvent) => e.data),\n takeUntil(this.disconnect$),\n )\n .subscribe((data) => this.onDataChannelMessage$.next(data));\n\n return datachannel;\n } catch (e) {\n Logger.warn('[DATACHANNEL] Datachannel setup caused an exception: ', e);\n return null;\n }\n }\n\n private onDataChannelConnected() {\n let text = 'Session connected, video stream starting.';\n if (navigator.userAgent.includes('Firefox')) {\n text +=\n '\\n If you are experiencing connection problems please try Google Chrome';\n }\n this.store.dispatch(setStatusMessage({ message: text }));\n this.store.dispatch(setDataChannelConnected({ value: true }));\n }\n\n private async handleCreateOffer(): Promise<void> {\n try {\n const offer = await this.pcClient!.createOffer(this.sdpConstraints);\n this.mungeSDP(offer);\n this.pcClient?.setLocalDescription(offer);\n this.onWebRtcOffer$.next(offer);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error) {\n Logger.error(\"Couldn't create offer\");\n }\n }\n\n receiveAnswer(answer: RTCSessionDescriptionInit) {\n this.pcClient?.setRemoteDescription(answer);\n }\n\n handleCandidateFromServer(iceCandidate: RTCIceCandidate) {\n try {\n const candidate = new RTCIceCandidate(iceCandidate);\n Logger.info(\n '[Unreal ICE candidate]',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n\n // if forcing TURN, reject any candidates not relay\n if (this.forceTURN) {\n // check if no relay address is found, if so, we are assuming it means no TURN server\n if (candidate.candidate.indexOf('relay') < 0) {\n Logger.warn(\n 'Dropping candidate because it was not TURN relay.',\n '| Type=',\n candidate.type,\n '| Protocol=',\n candidate.protocol,\n '| Address=',\n candidate.address,\n '| Port=',\n candidate.port,\n '|',\n );\n return;\n }\n }\n this.pcClient?.addIceCandidate(candidate).catch(function () {\n // Logger.error('Failed to add ICE candidate', e);\n });\n } catch (e) {\n Logger.error('Error handleCandidateFromServer', e);\n }\n }\n\n mungeSDP(offer: RTCSessionDescriptionInit): void {\n let audioSDP = '';\n\n // set max bitrate to highest bitrate Opus supports\n audioSDP += 'maxaveragebitrate=510000;';\n\n if (this.useMic) {\n // set the max capture rate to 48khz (so we can send high quality audio from mic)\n audioSDP += 'sprop-maxcapturerate=48000;';\n }\n\n // Force mono or stereo based on whether ?forceMono was passed or not\n audioSDP += this.forceMonoAudio\n ? 'sprop-stereo=0;stereo=0;'\n : 'sprop-stereo=1;stereo=1;';\n\n // enable in-band forward error correction for opus audio\n audioSDP += 'useinbandfec=1';\n\n // We use the line 'useinbandfec=1' (which Opus uses) to set our Opus specific audio parameters.\n offer.sdp = offer.sdp?.replace('useinbandfec=1', audioSDP);\n }\n\n /**\n * Closes existing PeerConnection\n */\n closePC(): void {\n if (this.pcClient) Logger.warn('Closing existing PeerConnection');\n this.pcClient?.close();\n this.pcClient = null;\n }\n\n canSend() {\n return this.dcClient && this.dcClient.readyState === 'open';\n }\n\n send(data: ArrayBuffer): void {\n if (this.canSend()) {\n this.dcClient!.send(data);\n } else {\n throw new Error('data channel is not prepared!');\n }\n }\n\n setConfig(parOptions: ConfigMessage = {} as ConfigMessage): void {\n const urlParams = new URLSearchParams(window.location.search);\n\n //**********************\n //Config setup\n //**********************\n this.cfg =\n typeof parOptions.peerConnectionOptions !== 'undefined'\n ? parOptions.peerConnectionOptions\n : {};\n //this.cfg.sdpSemantics = 'unified-plan';\n\n // If this is true in Chrome 89+ SDP is sent that is incompatible with UE Pixel Streaming 4.26 and below.\n // However 4.27 Pixel Streaming does not need this set to false as it supports `offerExtmapAllowMixed`.\n // tdlr; uncomment this line for older versions of Pixel Streaming that need Chrome 89+.\n //this.cfg.offerExtmapAllowMixed = false;\n\n this.forceTURN = urlParams.has('ForceTURN');\n if (this.forceTURN) {\n Logger.info(\n 'Forcing TURN usage by setting ICE Transport Policy in peer connection config.',\n );\n this.cfg.iceTransportPolicy = 'relay';\n }\n\n this.cfg.bundlePolicy = 'balanced';\n this.forceMaxBundle = urlParams.has('ForceMaxBundle');\n if (this.forceMaxBundle) {\n this.cfg.bundlePolicy = 'max-bundle';\n }\n\n //**********************\n //Variables\n //**********************\n this.pcClient = null;\n this.dcClient = null;\n\n this.sdpConstraints = {\n offerToReceiveAudio: false, //Note: if you don't need audio you can get improved latency by turning this off.\n offerToReceiveVideo: true,\n };\n\n // See https://www.w3.org/TR/webrtc/#dom-rtcdatachannelinit for values (this is needed for Firefox to be consistent with Chrome.)\n this.dataChannelOptions = { ordered: true };\n\n // This is useful if the video/audio needs to autoplay (without user input) as browsers do not allow autoplay non-muted of sound sources without user interaction.\n this.startVideoMuted =\n typeof parOptions?.['startVideoMuted'] !== 'undefined'\n ? !!parOptions?.['startVideoMuted']\n : false;\n this.autoPlayAudio =\n typeof parOptions?.['autoPlayAudio'] !== 'undefined'\n ? !!parOptions?.['autoPlayAudio']\n : true;\n\n // To force mono playback of WebRTC audio\n this.forceMonoAudio = urlParams.has('ForceMonoAudio');\n if (this.forceMonoAudio) {\n Logger.info(\n 'Will attempt to force mono audio by munging the sdp in the browser.',\n );\n }\n\n // To enable mic in browser use SSL/localhost and have ?useMic in the query string.\n this.useMic = urlParams.has('useMic');\n if (!this.useMic) {\n Logger.info(\n 'Microphone access is not enabled. Pass ?useMic in the url to enable it.',\n );\n }\n // When ?useMic check for SSL or localhost\n const isLocalhostConnection =\n location.hostname === 'localhost' || location.hostname === '127.0.0.1';\n const isHttpsConnection = location.protocol === 'https:';\n if (this.useMic && !isLocalhostConnection && !isHttpsConnection) {\n this.useMic = false;\n Logger.error(\n 'Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access.',\n );\n Logger.error(\n \"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'\",\n );\n }\n\n // Prefer SFU or P2P connection\n this.preferSFU = urlParams.has('preferSFU');\n Logger.info(\n this.preferSFU\n ? 'The browser will signal it would prefer an SFU connection. Remove ?preferSFU from the url to signal for P2P usage.'\n : 'The browser will signal for a P2P connection. Pass ?preferSFU in the url to signal for SFU usage.',\n );\n }\n}\n","import { DataFlowMonitor } from '../../helpers/DataFlowMonitor';\n\nexport interface FilterSettings {\n /**\n * Minimum number of kilobits per second to trigger low bandwidth\n */\n minimumBitrate: number;\n /**\n * Amount of a percentage drop to trigger a yellow warning\n */\n\n yellowFlag: number;\n\n /**\n * Amount of a percentage drop to trigger a red warning\n */\n redFlag: number;\n\n /**\n * Minimum number of frames per second to trigger low bandwidth\n */\n minimumFps: number;\n\n /**\n * Time to wait before checking if we can switch to low bandwidth\n */\n monitoringDelayTime: number;\n\n // initial guess in kbps\n initialBitrateEstimate: number;\n\n // initial error covariance\n initialErrorCovariance: number;\n\n // Q: how much we expect the bitrate to change between measurements\n processNoise: number;\n\n // R: variance of measurement noise\n measurementNoise: number;\n\n panelOpen: boolean;\n}\n\n/**\n * Default LBM Filter Parameters\n */\nexport const DefaultFilterModel: FilterSettings = {\n minimumBitrate: 1600,\n yellowFlag: 30,\n redFlag: 50,\n minimumFps: 5,\n monitoringDelayTime: 5000,\n initialBitrateEstimate: 1600,\n initialErrorCovariance: 1,\n processNoise: 3,\n measurementNoise: 500,\n panelOpen: false,\n} as const;\n\n/**\n * Global LBM Filter Parameters\n */\nexport const FilterModel = { ...DefaultFilterModel };\n\n/**\n * Bitrate Monitor Static Class\n */\nexport const BITRATE_MONITOR = new DataFlowMonitor(\n FilterModel.yellowFlag,\n FilterModel.redFlag,\n 20,\n);\n","import type {\n IAggregatedStat,\n InboundVideoStats,\n} from '../interfaces/unreal-internal-signal-events.interface';\nimport { inject, Injectable } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { from, interval, share } from 'rxjs';\nimport { filter, switchMap } from 'rxjs/operators';\nimport { LatencyTimings } from '../helpers/LatencyTimings';\nimport { SubService } from './sub.service';\nimport { Signal, Truthy } from '@3dsource/utils';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { mapQpToQuality } from '../helpers/mapQpToQuality';\nimport { KalmanFilter1D } from '../helpers/KalmanFilter1D';\nimport {\n BITRATE_MONITOR,\n FilterModel,\n} from '../components/low-bandwidth-indicator/DataFlowConstants';\n\n@Injectable()\nexport class VideoStreamStatusService extends SubService {\n readonly latencyTestTimings = new LatencyTimings();\n private readonly webrtcPlayer = inject(WebRtcPlayerService);\n private aggregatedStats: InboundVideoStats = {} as InboundVideoStats;\n private VideoEncoderQP = 0;\n private kalmanFilter1D = new KalmanFilter1D(\n FilterModel.initialBitrateEstimate,\n FilterModel.initialErrorCovariance,\n FilterModel.processNoise,\n FilterModel.measurementNoise,\n );\n readonly videoStats$: Observable<IAggregatedStat> = this.aggregateStats();\n\n constructor() {\n super();\n Signal.on('setKalmanParams').subscribe((data) => {\n this.kalmanFilter1D.config(data);\n BITRATE_MONITOR.config(data);\n });\n }\n\n /**\n * Aggregate video stats and emit it as videoStats$\n */\n private aggregateStats() {\n return this.webrtcPlayer.onVideoTrack$.pipe(\n // IMPORTANT! DO NOT CHANGE THOSE NUMBERS, LBM Stats are based on those values\n switchMap(() => interval(250)),\n switchMap(() => from(this.getStats(this.webrtcPlayer.pcClient))),\n filter(Truthy),\n share(),\n );\n }\n\n setEncoder(data: any) {\n this.VideoEncoderQP = Number(new TextDecoder('utf-16').decode(data));\n }\n\n private async getStats(\n pcClient: RTCPeerConnection | null,\n ): Promise<IAggregatedStat | null> {\n if (!pcClient) {\n return null;\n }\n\n const stats = await pcClient.getStats(null);\n\n return this.generateAggregatedStatsFunction(stats);\n }\n\n private generateAggregatedStatsFunction(\n stats: RTCStatsReport,\n ): IAggregatedStat {\n const newStat: InboundVideoStats = {} as InboundVideoStats;\n\n // store each type of codec we can get stats on\n newStat.codecs = {};\n newStat.currentRoundTripTime = -1;\n\n stats.forEach((stat) => {\n // Get the inbound-rtp for video\n if (stat.type === 'inbound-rtp' && stat.kind === 'video') {\n Object.assign(newStat, stat);\n\n newStat.bytesReceivedStart =\n this.aggregatedStats && this.aggregatedStats.bytesReceivedStart\n ? this.aggregatedStats.bytesReceivedStart\n : stat.bytesReceived;\n\n newStat.framesDecodedStart =\n this.aggregatedStats && this.aggregatedStats.framesDecodedStart\n ? this.aggregatedStats.framesDecodedStart\n : stat.framesDecoded;\n\n newStat.timestampStart =\n this.aggregatedStats && this.aggregatedStats.timestampStart\n ? this.aggregatedStats.timestampStart\n : stat.timestamp;\n\n if (this.aggregatedStats && this.aggregatedStats.timestamp) {\n // Get the mimetype of the video codec being used\n if (\n stat.codecId &&\n this.aggregatedStats.codecs &&\n Object.hasOwn(this.aggregatedStats.codecs, stat.codecId)\n ) {\n newStat.videoCodec = this.aggregatedStats.codecs[stat.codecId];\n }\n\n if (this.aggregatedStats.bytesReceived) {\n // bitrate = bits received since last time / number of ms since last time\n // This is automatically in kbits (where k=1000) since time is in ms and stat we want is in seconds (so a '* 1000' then a '/ 1000' would negate each other)\n newStat.bitrate = Math.floor(\n (8 *\n (newStat.bytesReceived! - this.aggregatedStats.bytesReceived)) /\n (newStat.timestamp - this.aggregatedStats.timestamp),\n );\n }\n\n if (this.aggregatedStats.bytesReceivedStart) {\n newStat.avgBitrate = Math.floor(\n (8 *\n (newStat?.bytesReceived! -\n this.aggregatedStats.bytesReceivedStart)) /\n (newStat.timestamp - this.aggregatedStats.timestampStart),\n );\n }\n\n if (this.aggregatedStats.framesDecodedStart) {\n newStat.avgFrameRate = Math.floor(\n (newStat.framesDecoded! -\n this.aggregatedStats.framesDecodedStart) /\n ((newStat.timestamp - this.aggregatedStats.timestampStart) /\n 1000),\n );\n }\n }\n }\n\n if (\n stat.type === 'candidate-pair' &&\n Object.hasOwn(stat, 'currentRoundTripTime')\n ) {\n newStat.currentRoundTripTime = stat.currentRoundTripTime ?? 0;\n }\n\n // Store mimetype of each codec\n if (\n Object.hasOwn(newStat, 'codecs') &&\n stat.type === 'codec' &&\n stat.mimeType &&\n stat.id\n ) {\n const codecId = stat.id;\n newStat.codecs[codecId] = stat.mimeType\n .replace('video/', '')\n .replace('audio/', '');\n }\n });\n\n newStat.pixelRatio = +window.devicePixelRatio.toFixed(2);\n if (this.aggregatedStats.receiveToCompositeMs) {\n newStat.receiveToCompositeMs = this.aggregatedStats.receiveToCompositeMs;\n this.latencyTestTimings.SetFrameDisplayDeltaTime(\n this.aggregatedStats.receiveToCompositeMs,\n );\n }\n\n // Calculate duration of run\n newStat.runTime = Math.floor(\n (newStat.timestamp - newStat.timestampStart) / 1000,\n );\n newStat.kalmanBitrate = Math.floor(\n this.kalmanFilter1D.update(\n newStat.bitrate || FilterModel.initialBitrateEstimate,\n ),\n );\n\n newStat.dataFlowCheckResult = BITRATE_MONITOR.addValue(\n newStat.kalmanBitrate,\n );\n\n newStat.bitrateDrop = Math.floor(\n newStat.dataFlowCheckResult.dropPercentage,\n );\n this.aggregatedStats = newStat;\n return this.onAggregatedStats(newStat);\n }\n\n private onAggregatedStats(aggregatedStats: InboundVideoStats) {\n return {\n quality: mapQpToQuality(this.VideoEncoderQP),\n\n aggregatedStats: {\n ...aggregatedStats,\n VideoEncoderQP: this.VideoEncoderQP,\n },\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { distinctUntilChanged, filter, withLatestFrom } from 'rxjs/operators';\nimport { EControlSchemeType } from '../constants/EControlSchemeType';\nimport { Truthy } from '@3dsource/utils';\nimport { InputOptions } from '../constants/InputOptions';\nimport { SubService } from './sub.service';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { selectWarnTimeout } from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\nimport { destroyConnectionsAndResetState } from '../store/unreal.actions';\nimport { DEFAULT_TIMEOUT_PERIOD } from '../constants';\n\n@Injectable()\nexport class AFKService extends SubService {\n // Optionally detect if the user is not interacting (AFK) and disconnect them.\n private enabled = true; // Set to true to enable the AFK system.\n private closeTimeout = DEFAULT_TIMEOUT_PERIOD; // The time after the warning when we disconnect the user.\n private active = false; // Whether the AFK system is currently looking for inactivity.\n private warnTimer!: ReturnType<typeof setTimeout>; // The timer which waits to show the inactivity warning overlay.\n private countdown = 0; // The inactivity warning overlay has a countdown to show time until disconnect.\n private countdownTimer!: ReturnType<typeof setTimeout>; // The timer used to tick the seconds shown on the inactivity warning overlay.\n private selectWarnTimeout = toSignal(this.store.select(selectWarnTimeout));\n\n constructor() {\n super();\n this.initAfk();\n }\n\n initAfk() {\n merge(\n this.store.select(selectWarnTimeout),\n fromSignal(UnrealInternalSignalEvents.RestAfkTimer),\n )\n .pipe(\n withLatestFrom(this.store.select(unrealFeature.selectViewportReady)),\n filter(([, viewportReady]) => viewportReady),\n )\n .subscribe(() => this.resetAfkWarningTimer());\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(distinctUntilChanged(), filter(Truthy))\n .subscribe(() => this.startAfkWarningTimer());\n this.disconnect$.subscribe(() => this.stop());\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\n\n private hideOverlay() {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay);\n }\n\n /**\n * Start a timer which when elapsed will warn the user they are inactive.\n */\n private startAfkWarningTimer() {\n this.active = this.enabled;\n this.resetAfkWarningTimer();\n }\n\n /**\n * If the user interacts, then reset the warning timer.\n */\n private resetAfkWarningTimer() {\n if (this.active) {\n this.stop();\n this.warnTimer = setTimeout(() => {\n this.showAfkOverlay();\n }, this.selectWarnTimeout()! * 1000);\n }\n }\n\n /**\n * Update the count-down spans number for the overlay\n * @param countdown the count down number to be inserted into the span for updating\n */\n private updateCountDown(countdown: number) {\n this.dispatchMessage(String(countdown));\n }\n\n /**\n * Update the text overlays inner text\n * @param message the update text to be inserted into the overlay\n */\n private dispatchMessage(message: string) {\n sendSignal(UnrealInternalSignalEvents.ClickableOverlay, {\n message,\n isActivityDetected: true,\n className: 'clickableState',\n onOverlayClick: () => this.reset(),\n });\n }\n\n private stop() {\n clearInterval(this.countdownTimer);\n clearTimeout(this.warnTimer);\n this.hideOverlay();\n }\n\n private reset() {\n this.hideOverlay();\n clearInterval(this.countdownTimer);\n this.startAfkWarningTimer();\n }\n\n private showAfkOverlay() {\n // Pause the timer while the user is looking at the inactivity warning overlay.\n this.active = false;\n this.countdown = this.closeTimeout;\n this.updateCountDown(this.countdown);\n\n if (InputOptions.controlScheme == EControlSchemeType.LockedMouse) {\n document.exitPointerLock();\n }\n\n this.countdownTimer = setInterval(() => {\n this.countdown--;\n if (this.countdown === 0) {\n // The user failed to click so disconnect them\n this.hideOverlay();\n // TODO possible way (Blinking), because postponed close event: destroyRemoteConnections({ disconnectReason: DisconnectReason.afk }),\n this.store.dispatch(destroyConnectionsAndResetState());\n clearInterval(this.countdownTimer);\n } else {\n this.updateCountDown(this.countdown);\n }\n }, 1000);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Truthy } from '@3dsource/utils';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DevModeService {\n get isDevMode() {\n return Truthy(localStorage.getItem('devMode'));\n }\n setDevMode(value: boolean) {\n return localStorage.setItem('devMode', value.toString());\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport {\n changeLowBandwidth,\n destroyConnectionsAndResetState,\n setConfig,\n setMaxFps,\n} from '../store/unreal.actions';\nimport { of, switchMap } from 'rxjs';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { HttpClient } from '@angular/common/http';\nimport { Logger, tapLog } from '@3dsource/utils';\nimport { catchError, filter, first } from 'rxjs/operators';\nimport { SubService } from '../services/sub.service';\nimport { DevModeService } from '../services/dev-mode.service';\n\ninterface CustomWindow extends Window {\n emitUIInteraction: (data: unknown) => void;\n emitCommand: (data: unknown) => void;\n dropConnection: (data: unknown) => void;\n toggleBandwidth: (data: unknown) => void;\n setMaxFps: (data: number) => void;\n rebootInstance: (data: unknown) => void;\n startShowcase: (data: unknown) => void;\n restartApp: (data: unknown) => void;\n unrealHelp: (data: unknown) => void;\n setWarnTime: (data: number) => void;\n}\n\ndeclare let window: CustomWindow;\n\n@Injectable()\nexport class ConsoleExtensionsService extends SubService {\n private httpClient = inject(HttpClient);\n private isDevMode = inject(DevModeService).isDevMode;\n\n init() {\n if (!this.isDevMode) {\n return;\n }\n\n window.dropConnection = () => {\n this.store.dispatch(destroyConnectionsAndResetState());\n\n return true;\n };\n\n window.toggleBandwidth = () => {\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(first())\n .subscribe((isLow) => {\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: !isLow }));\n });\n\n return 'LowBandwidth => toggled';\n };\n\n window.setMaxFps = (maxFps: number) => {\n this.store.dispatch(setMaxFps({ maxFps }));\n return `Max Fps Set to ${maxFps}`;\n };\n\n window.restartApp = () => {\n this.store\n .select(unrealFeature.selectAwsInstance)\n .pipe(\n first(),\n filter((data) => !!data.instanceName),\n tapLog('Instance', `Restart initiated`),\n switchMap((data) =>\n this.httpClient.get(`//${data.instanceName}/restartapp`),\n ),\n\n catchError(() => of(null)),\n )\n .subscribe();\n };\n\n window.unrealHelp = () => {\n this.unrealHelp();\n };\n\n window.setWarnTime = (time: number) => {\n this.store.dispatch(setConfig({ config: { warnTimeout: time } }));\n };\n }\n\n private unrealHelp() {\n Logger.info(\n 'dropConnection() => Closes Web Socket and abort communication.',\n );\n Logger.info('toggleBandwidth() => toggles speed.');\n Logger.info('restartApp() => force restart Unreal app.');\n Logger.info('rebootInstance() => force reboot instance.');\n Logger.info('startShowcase(time) => start Showcase.');\n Logger.info('setWarnTime() => set time to appear the AFK window.');\n Logger.info('emitCommand(command) => send command to Unreal Engine.');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport type { MetaBoxCommandPacket } from '@3dsource/types-unreal';\nimport { Subject } from 'rxjs';\nimport { AFKService } from './afk.service';\nimport { CommandTelemetryService } from './command-telemetry.service';\nimport type { EMessageTypeValues } from '../constants/EMessageType';\nimport { EMessageType } from '../constants/EMessageType';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { Store } from '@ngrx/store';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoService } from './video.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { fromSignal, sendSignal } from '../helpers/EventWrapper';\nimport { COLOR_CODES, generateUuid, Logger, Truthy } from '@3dsource/utils';\nimport { ConsoleExtensionsService } from '../services/console-extensions.service';\nimport { unrealFeature } from '../store/unreal.feature';\nimport { filter } from 'rxjs/operators';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { resetAfk } from '../helpers/resetAfk';\nimport { commandStarted } from '../store/unreal.actions';\n\n@Injectable()\nexport class UnrealCommunicatorService {\n private telemetry = inject(CommandTelemetryService);\n private afkService = inject(AFKService);\n private freezeFrame = inject(FreezeFrameService);\n private webrtcPlayer = inject(WebRtcPlayerService);\n private videoService = inject(VideoService);\n private consoleExtensions = inject(ConsoleExtensionsService);\n private store = inject(Store);\n private destroy$ = new Subject<void>();\n\n private cirrusConnected = toSignal(\n this.store.select(unrealFeature.selectCirrusConnected),\n );\n\n constructor() {\n this.emitUIInteraction = this.telemetry.decorate(\n this.emitUIInteraction.bind(this),\n );\n this.consoleExtensions.init();\n this.afkService.init();\n this.freezeFrame.init();\n\n this.listenVideo();\n\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy))\n .subscribe(() => {\n this.requestInitialSettings();\n this.requestQualityControl();\n });\n }\n\n destroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n sendCommandToUnreal(data: MetaBoxCommandPacket) {\n if (this.webrtcPlayer.canSend()) {\n const uniqId = data?.correlationId ?? generateUuid();\n const sendData: MetaBoxCommandPacket = { ...data, correlationId: uniqId };\n Logger.colored(...COLOR_CODES.TO_UNREAL, sendData);\n this.emitUIInteraction(sendData);\n\n this.store.dispatch(\n commandStarted({ id: uniqId, command: data.command as string }),\n );\n }\n }\n\n emitUIInteraction(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.UIInteraction, descriptor);\n }\n\n /**\n A build-in command can be sent to the UE4 client. The commands are defined by a\n JSON descriptor and will be executed automatically.\n The currently supported commands are:\n\n 1. A command to run any console command:\n \"{ ConsoleCommand: <string> }\"\n\n 2. A command to change the resolution to the given width and height.\n \"{ Resolution.Width: <value>, Resolution.Height: <value> } }\"\n */\n emitCommand(descriptor: MetaBoxCommandPacket) {\n this.emitDescriptor(EMessageType.Command, descriptor);\n }\n\n sendInputData(data: ArrayBuffer) {\n try {\n resetAfk();\n this.webrtcPlayer.send(data);\n } catch (error) {\n if (this.cirrusConnected()) {\n Logger.error(\n `DataChannel connection not established, can't send data=>${error}`,\n );\n }\n }\n }\n\n private emitDescriptor(\n messageType: EMessageTypeValues,\n descriptor: MetaBoxCommandPacket,\n ) {\n // Convert the descriptor object into a JSON string.\n const descriptorAsString = JSON.stringify(descriptor);\n\n // Add the UTF-16 JSON string to the array byte buffer, going two bytes at\n // a time.\n const data = new DataView(\n new ArrayBuffer(1 + 2 + 2 * descriptorAsString.length),\n );\n let byteIdx = 0;\n data.setUint8(byteIdx, messageType);\n byteIdx++;\n data.setUint16(byteIdx, descriptorAsString.length, true);\n byteIdx += 2;\n\n for (let i = 0; i < descriptorAsString.length; i++) {\n data.setUint16(byteIdx, descriptorAsString.charCodeAt(i), true);\n byteIdx += 2;\n }\n\n this.sendInputData(data.buffer);\n }\n\n private requestInitialSettings() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestInitialSettings]).buffer,\n );\n }\n\n private requestQualityControl() {\n this.sendInputData(\n new Uint8Array([EMessageType.RequestQualityControl]).buffer,\n );\n }\n\n private listenVideo() {\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized).subscribe(() =>\n this.prepareScreen(),\n );\n }\n\n private prepareScreen() {\n this.showPlayOverlay();\n this.freezeFrame.invalidate();\n }\n\n private showPlayOverlay() {\n const callback = () => {\n this.videoService.play();\n resetAfk();\n sendSignal(UnrealInternalSignalEvents.VideoPlayClick, {\n text: 'Play Clicked',\n });\n\n return true;\n };\n\n sendSignal(UnrealInternalSignalEvents.ShowPlayButton, {\n text: 'Play',\n callback,\n });\n }\n}\n","import type { IKeyCode, IKeyName } from '@3dsource/utils';\nimport {\n InvertedKeyMap,\n KeyboardNumericCode,\n Logger,\n Truthy,\n} from '@3dsource/utils';\nimport type {\n InputProps,\n NormalizeAndQuantizeSignedValue,\n NormalizeAndQuantizeUnsignedValue,\n UnquantizeAndDenormalizeUnsignedValue,\n} from '../interfaces/input.interface';\nimport {\n MouseButton,\n MouseButtonsMask,\n SpecialKeyCodes,\n} from '../constants/ButtonsAndCodes';\nimport type { Observable } from 'rxjs';\nimport {\n combineLatestWith,\n fromEvent,\n merge,\n startWith,\n Subject,\n takeUntil,\n} from 'rxjs';\nimport {\n debounceTime,\n distinctUntilChanged,\n filter,\n map,\n} from 'rxjs/operators';\nimport type { EMessageTypeValues } from '../constants/EMessageType';\nimport { EMessageType } from '../constants/EMessageType';\nimport { inject } from '@angular/core';\nimport { InputOptions } from '../constants/InputOptions';\nimport TouchEmulator from '../helpers/TouchEmulator';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { fromSignal } from '../helpers/EventWrapper';\nimport { fromResizeObserver } from '../helpers/resize-observer';\nimport { UnrealCommunicatorService } from '../services/unreal-communicator.service';\nimport { DevModeService } from '../services/dev-mode.service';\nimport { SubService } from '../services/sub.service';\nimport { unrealFeature } from '../store/unreal.feature';\n\nexport class InputService extends SubService {\n private commandsSender = inject(UnrealCommunicatorService);\n private isDevMode = inject(DevModeService).isDevMode;\n\n readonly defaultKeys = [\n KeyboardNumericCode.KeyW,\n KeyboardNumericCode.KeyS,\n KeyboardNumericCode.KeyA,\n KeyboardNumericCode.KeyD,\n KeyboardNumericCode.ArrowUp,\n KeyboardNumericCode.ArrowDown,\n KeyboardNumericCode.ArrowLeft,\n KeyboardNumericCode.ArrowRight,\n KeyboardNumericCode.NumpadAdd,\n KeyboardNumericCode.NumpadSubtract,\n KeyboardNumericCode.ControlRight,\n KeyboardNumericCode.Equal,\n KeyboardNumericCode.Minus,\n KeyboardNumericCode.NumpadDecimal,\n ];\n private availableKeys: IKeyCode[] = this.defaultKeys;\n private options!: InputProps;\n private reInit$ = new Subject<void>();\n private deactivatedVideoTrigger$!: Observable<unknown>;\n\n private normalizeAndQuantizeUnsigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeUnsignedValue;\n private unQuantizeAndDenormalizeUnsigned!: (\n x: number,\n y: number,\n ) => UnquantizeAndDenormalizeUnsignedValue;\n private normalizeAndQuantizeSigned!: (\n x: number,\n y: number,\n ) => NormalizeAndQuantizeSignedValue;\n\n video!: HTMLVideoElement;\n videoBoundingRect: DOMRect = new DOMRect(0, 0, 1, 1);\n fingerIds = new Map();\n maxByteValue = 255;\n fingers = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];\n\n private offsetParams: OffsetParams = {\n scaleX: 1,\n scaleY: 1,\n scaledHeight: 0,\n scaledWidth: 0,\n offsetByY: 0,\n offsetByX: 0,\n };\n\n constructor() {\n super();\n const visibilityHiddenTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'hidden'),\n filter(Truthy),\n );\n\n const visibilityVisibleTrigger$ = fromEvent(\n document,\n 'visibilitychange',\n ).pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n startWith(true),\n );\n\n this.deactivatedVideoTrigger$ = merge(\n this.disconnect$,\n this.reInit$,\n visibilityHiddenTrigger$,\n );\n\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized)\n .pipe(\n combineLatestWith(\n visibilityVisibleTrigger$,\n this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy), startWith(true)),\n ),\n filter(([video]) => !!video),\n )\n .subscribe(([video]) => this.setup(video));\n }\n\n useKeyboardKeys(keys: IKeyCode[]) {\n this.availableKeys = keys || [];\n }\n\n private setup(video: HTMLVideoElement) {\n this.options = InputOptions;\n this.video = video;\n this.reInit$.next();\n\n merge(\n fromResizeObserver(video),\n fromSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer),\n )\n .pipe(debounceTime(300), takeUntil(this.deactivatedVideoTrigger$))\n .subscribe(() => {\n this.setupNormalizeAndQuantize(video);\n });\n\n this.setupNormalizeAndQuantize(video);\n this.registerInputs();\n }\n\n /**\n * We use `object-fit: cover` on the video element. Since the video can have\n * a different aspect ratio from its container (and potentially be larger),\n * we need to calculate offsets and scale factors to map container (e.g., mouse)\n * coordinates back to the actual video coordinates.\n *\n * @param videoElement The video element whose scaling and positioning we need\n * @returns Object containing offset and scale info for coordinate normalization\n * @private\n */\n private getObjectFitOffset(videoElement: HTMLVideoElement) {\n const { width, height } = this.videoBoundingRect;\n const { videoWidth, videoHeight } = videoElement;\n\n Logger.log('Video Quantizing with => ', this.videoBoundingRect, {\n videoWidth,\n videoHeight,\n });\n\n // Compute aspect ratios\n const containerRatio = width / height;\n const videoRatio = videoWidth / videoHeight;\n\n // Determine how much to scale the video to fit the container (cover mode)\n const scale =\n videoRatio > containerRatio ? height / videoHeight : width / videoWidth;\n\n // Calculate the displayed (scaled) dimensions of the video\n const scaledWidth = videoWidth * scale;\n const scaledHeight = videoHeight * scale;\n\n // Offsets in x/y directions (like \"padding\") once the video is scaled\n const offsetByX = (width - scaledWidth) / 2;\n const offsetByY = (height - scaledHeight) / 2;\n\n // Scale factors for coordinate transformation from container space to video space\n const scaleX = width / scaledWidth;\n const scaleY = height / scaledHeight;\n\n return {\n offsetByX,\n offsetByY,\n scaleX,\n scaleY,\n scaledWidth,\n scaledHeight,\n };\n }\n\n private setupNormalizeAndQuantize(videoElement: HTMLVideoElement) {\n if (videoElement) {\n this.videoBoundingRect = videoElement.getBoundingClientRect();\n this.offsetParams = this.getObjectFitOffset(videoElement);\n\n // Unsigned XY positions are the ratio (0.0..1.0) along a viewport axis,\n // quantized into an uint16 (0..65536).\n // Signed XY deltas are the ratio (-1.0..1.0) along a viewport axis,\n // quantized into an int16 (-32767..32767).\n // This allows the browser viewport and client viewport to have a different\n // size.\n // Hack: Currently we set an out-of-range position to an extreme (65535)\n // as we can't yet accurately detect mouse enter and leave events\n // precisely inside a video with an aspect ratio which causes mattes.\n\n this.normalizeAndQuantizeUnsigned = (x, y) => {\n const normalizedX = x / videoElement.clientWidth;\n const normalizedY = y / videoElement.clientHeight;\n\n if (\n normalizedX < 0.0 ||\n normalizedX > 1.0 ||\n normalizedY < 0.0 ||\n normalizedY > 1.0\n ) {\n return {\n inRange: false,\n x: 65535,\n y: 65535,\n };\n } else {\n return {\n inRange: true,\n x: normalizedX * 65536,\n y: normalizedY * 65536,\n };\n }\n };\n\n this.unQuantizeAndDenormalizeUnsigned = (x, y) => {\n const normalizedX = x / 65536;\n const normalizedY = y / 65536;\n return {\n x: normalizedX * videoElement.clientWidth,\n y: normalizedY * videoElement.clientHeight,\n };\n };\n\n // Signed.\n this.normalizeAndQuantizeSigned = (x, y) => {\n const normalizedX = x / (0.5 * videoElement.clientWidth);\n const normalizedY = y / (0.5 * videoElement.clientHeight);\n return {\n x: normalizedX * 32767,\n y: normalizedY * 32767,\n };\n };\n }\n }\n\n private sendInputData(data: ArrayBuffer) {\n this.commandsSender.sendInputData(data);\n }\n\n private registerInputs() {\n merge(\n this.store\n .select(unrealFeature.selectLowBandwidth)\n .pipe(distinctUntilChanged(), filter(Truthy)),\n fromEvent(window, 'blur'),\n )\n .pipe(\n filter(() => !!this.video),\n takeUntil(this.deactivatedVideoTrigger$),\n )\n .subscribe(() => this.releaseMouseButtons(255, 0, 0));\n\n this.registerMouseEnterAndLeaveEvents(this.video);\n this.registerHoveringMouseEvents(this.video);\n this.registerKeyboardEvents(this.availableKeys);\n\n if (InputOptions.fakeMouseWithTouches) {\n new TouchEmulator(this);\n } else {\n this.registerTouchEvents(this.video);\n }\n }\n\n private getTouchPositionWithOffset({ clientX, clientY }: Touch) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (clientX - offsetByX - this.videoBoundingRect.left) * scaleX,\n y: (clientY - offsetByY - this.videoBoundingRect.top) * scaleY,\n };\n }\n\n private getMousePositionWithOffset({ offsetX, offsetY }: MouseEvent) {\n const { offsetByX, offsetByY, scaleX, scaleY } = this.offsetParams;\n\n return {\n x: (offsetX - offsetByX) * scaleX,\n y: (offsetY - offsetByY) * scaleY,\n };\n }\n\n private registerTouchEvents(htmlVideoElement: HTMLVideoElement) {\n // We need to assign a unique identifier to each finger.\n // We do this by mapping each Touch object to the identifier.\n\n const rememberTouch = (touch: Touch) => {\n const finger = this.fingers.pop();\n if (finger === undefined) {\n Logger.info('exhausted touch indentifiers');\n return;\n }\n this.fingerIds.set(touch.identifier, finger);\n };\n\n const forgetTouch = (touch: Touch) => {\n this.fingers.push(this.fingerIds.get(touch.identifier));\n // Sort array back into descending order. This means if finger '1' were to lift after finger '0', we would ensure that 0 will be the first index to pop\n this.fingers.sort(function (a, b) {\n return b - a;\n });\n this.fingerIds.delete(touch.identifier);\n };\n\n const emitTouchData = (type: EMessageTypeValues, touches: TouchList) => {\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n let byte = 2;\n const numTouches = 1; // the number of touches to be sent this message\n const touch = touches[t];\n const { x, y } = this.getTouchPositionWithOffset(touch);\n Logger.info(`F${this.fingerIds.get(touch.identifier)}=(${x}, ${y})`);\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const data = new DataView(new ArrayBuffer(9));\n\n data.setUint8(0, type);\n data.setUint8(1, numTouches);\n data.setUint16(byte, coord.x, true);\n byte += 2;\n data.setUint16(byte, coord.y, true);\n byte += 2;\n data.setUint8(byte, this.fingerIds.get(touch.identifier));\n byte += 1;\n // force is between 0.0 and 1.0 so quantize into byte.\n // iOs bug: Forced to be always 0.5 on all devices as we do not use forced touch any way;/\n data.setUint8(byte, this.maxByteValue * 0.5);\n byte += 1;\n data.setUint8(byte, coord.inRange ? 1 : 0);\n byte += 1;\n this.sendInputData(data.buffer);\n }\n };\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchstart')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n this.focusWindow();\n const touches: TouchList = e.changedTouches;\n // Assign a unique identifier to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n rememberTouch(touches[t]);\n }\n Logger.info('touch start');\n emitTouchData(EMessageType.TouchStart, touches);\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchend')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n const touches: TouchList = e.changedTouches;\n Logger.info('touch end');\n\n emitTouchData(EMessageType.TouchEnd, touches);\n\n // Re-cycle unique identifiers previously assigned to each touch.\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let t = 0; t < touches.length; t++) {\n forgetTouch(touches[t]);\n }\n\n e.preventDefault();\n });\n\n fromEvent<TouchEvent>(htmlVideoElement, 'touchmove')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e) => {\n const touches: TouchList = e.touches;\n Logger.info('touch move');\n\n emitTouchData(EMessageType.TouchMove, touches);\n e.preventDefault();\n });\n }\n\n focusWindow() {\n window.focus();\n }\n\n emitMouseMove(x: number, y: number, deltaX: number, deltaY: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const delta = this.normalizeAndQuantizeSigned(deltaX, deltaY);\n const Data = new DataView(new ArrayBuffer(9));\n\n Data.setUint8(0, EMessageType.MouseMove);\n Data.setUint16(1, coord.x, true);\n Data.setUint16(3, coord.y, true);\n Data.setInt16(5, delta.x, true);\n Data.setInt16(7, delta.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseDown(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseDown);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseUp(button: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(6));\n Data.setUint8(0, EMessageType.MouseUp);\n Data.setUint8(1, button);\n Data.setUint16(2, coord.x, true);\n Data.setUint16(4, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n emitMouseWheel(delta: number, x: number, y: number) {\n const coord = this.normalizeAndQuantizeUnsigned(x, y);\n const Data = new DataView(new ArrayBuffer(7));\n Data.setUint8(0, EMessageType.MouseWheel);\n Data.setInt16(1, delta, true);\n Data.setUint16(3, coord.x, true);\n Data.setUint16(5, coord.y, true);\n this.sendInputData(Data.buffer);\n }\n\n private releaseMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseUp(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseUp(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseUp(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseUp(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseUp(MouseButton.FifthButton, x, y);\n }\n }\n\n // If the user has any mouse buttons pressed then press them again.\n private pressMouseButtons(buttons: number, x: number, y: number) {\n if (buttons & MouseButtonsMask.PrimaryButton) {\n this.emitMouseDown(MouseButton.MainButton, x, y);\n }\n if (buttons & MouseButtonsMask.SecondaryButton) {\n this.emitMouseDown(MouseButton.SecondaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.AuxiliaryButton) {\n this.emitMouseDown(MouseButton.AuxiliaryButton, x, y);\n }\n if (buttons & MouseButtonsMask.FourthButton) {\n this.emitMouseDown(MouseButton.FourthButton, x, y);\n }\n if (buttons & MouseButtonsMask.FifthButton) {\n this.emitMouseDown(MouseButton.FifthButton, x, y);\n }\n }\n\n private registerHoveringMouseEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmousemove = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseMove(x, y, e.movementX, e.movementY);\n e.preventDefault();\n };\n\n htmlVideoElement.onmousedown = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.focusWindow();\n this.emitMouseDown(e.button, x, y);\n e.preventDefault();\n };\n\n htmlVideoElement.onmouseup = (e) => {\n const { x, y } = this.getMousePositionWithOffset(e);\n this.emitMouseUp(e.button, x, y);\n e.preventDefault();\n };\n\n // When the context menu is shown then it is safest to release the button\n // which was pressed when the event happened. This will guarantee we will\n // get at least one mouse up corresponding to a mouse down event. Otherwise\n // the mouse can get stuck.\n // https://github.com/facebook/react/issues/5531\n // playerElement.oncontextmenu = (e) => {\n // e.preventDefault();\n // this.emitMouseUp(e.button, e.offsetX, e.offsetY);\n // };\n\n fromEvent<WheelEvent>(htmlVideoElement, 'wheel')\n .pipe(takeUntil(this.deactivatedVideoTrigger$))\n .subscribe((e: WheelEvent) => {\n this.emitMouseWheel(e.deltaY * -120, e.offsetX, e.offsetY);\n e.preventDefault();\n });\n\n (htmlVideoElement as Clickable).pressMouseButtons = (e: MouseEvent) => {\n this.pressMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n\n (htmlVideoElement as Clickable).releaseMouseButtons = (e: MouseEvent) => {\n this.releaseMouseButtons(e.buttons, e.offsetX, e.offsetY);\n };\n }\n\n private registerMouseEnterAndLeaveEvents(htmlVideoElement: HTMLVideoElement) {\n htmlVideoElement.onmouseenter = (e) => {\n this.focusWindow();\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseEnter);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).pressMouseButtons(e);\n };\n\n htmlVideoElement.onmouseleave = (e) => {\n const Data = new DataView(new ArrayBuffer(1));\n Data.setUint8(0, EMessageType.MouseLeave);\n this.sendInputData(Data.buffer);\n (htmlVideoElement as Clickable).releaseMouseButtons(e);\n };\n }\n\n // Browser keys do not have a charCode so we only need to test keyCode.\n private isKeyCodeBrowserKey(keyCode: number): boolean {\n // Function keys or tab key.\n return (keyCode >= 112 && keyCode <= 123) || keyCode === 9;\n }\n\n private getKeyCode(e: KeyboardEvent): number {\n if (e.keyCode === SpecialKeyCodes.Shift && e.code === 'ShiftRight')\n return SpecialKeyCodes.RightShift;\n else if (e.keyCode === SpecialKeyCodes.Control && e.code === 'ControlRight')\n return SpecialKeyCodes.RightControl;\n else if (e.keyCode === SpecialKeyCodes.Alt && e.code === 'AltRight')\n return SpecialKeyCodes.RightAlt;\n else return e.keyCode;\n }\n\n private registerKeyboardEvents(availableKeys: IKeyCode[]) {\n const availableKeyNames = Object.entries(availableKeys).map(([, value]) => {\n return InvertedKeyMap[value];\n });\n\n const keyBlock = (event: KeyboardEvent) => {\n const code: IKeyName = event.code as IKeyName;\n const isInputFieldFocused =\n (event.target as HTMLElement)?.localName === 'input';\n const keyMatch = availableKeyNames.includes(code);\n\n if (this.isDevMode && !keyMatch) {\n Logger.warn(\n 'Code=>',\n code,\n 'Keyboard event is not filtered in DEV Mode. App may behave inappropriately!',\n );\n return isInputFieldFocused;\n }\n\n return isInputFieldFocused || !keyMatch;\n };\n this.startListenKeys(keyBlock);\n }\n\n private startListenKeys(_filter?: (event: KeyboardEvent) => boolean) {\n const filter = _filter ?? (() => false);\n\n document.onkeydown = (e) => {\n if (filter(e)) {\n return;\n }\n\n const isCtrlOrCommand = e.ctrlKey || e.metaKey;\n\n const isPlusOrMinus =\n e.keyCode === KeyboardNumericCode.Equal ||\n e.keyCode === KeyboardNumericCode.Minus;\n if (isCtrlOrCommand && isPlusOrMinus) {\n return;\n }\n\n this.sendInputData(\n new Uint8Array([\n EMessageType.KeyDown,\n this.getKeyCode(e),\n Number(e.repeat),\n ]).buffer,\n );\n // Backspace is not considered a keypress in JavaScript but we need it\n // to be so characters may be deleted in a UE4 text entry field.\n if (e.keyCode === SpecialKeyCodes.BackSpace) {\n (document as DocumentClickable).onkeypress({\n charCode: SpecialKeyCodes.BackSpace,\n });\n //document.dispatchEvent(new KeyboardEvent('keydown',{key: name, keyCode: SpecialKeyCodes.BackSpace, code: SpecialKeyCodes.BackSpace, repeat: false} ));\n }\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeyup = (e) => {\n if (filter(e)) {\n return;\n }\n this.sendInputData(\n new Uint8Array([EMessageType.KeyUp, this.getKeyCode(e)]).buffer,\n );\n if (\n this.options.suppressBrowserKeys &&\n this.isKeyCodeBrowserKey(e.keyCode)\n ) {\n e.preventDefault();\n }\n };\n\n document.onkeypress = (e) => {\n if (filter(e)) {\n return;\n }\n const data = new DataView(new ArrayBuffer(3));\n data.setUint8(0, EMessageType.KeyPress);\n data.setUint16(1, e.charCode, true);\n this.sendInputData(data.buffer);\n };\n }\n}\n\ninterface OffsetParams {\n scaleX: number;\n scaleY: number;\n scaledHeight: number;\n scaledWidth: number;\n offsetByY: number;\n offsetByX: number;\n}\ntype Clickable = HTMLVideoElement & {\n releaseMouseButtons: (e: MouseEvent) => void;\n pressMouseButtons: (e: MouseEvent) => void;\n};\n\ntype DocumentClickable = Document & {\n onkeypress: (data: unknown) => void;\n};\n","import { Store } from '@ngrx/store';\nimport { inject, Injectable } from '@angular/core';\nimport { auditTime } from 'rxjs';\nimport { map, withLatestFrom } from 'rxjs/operators';\nimport { unrealFeature } from '../store/unreal.feature';\nimport type {\n AwsInstance,\n IAggregatedStat,\n InboundVideoStats,\n} from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoStreamStatusService } from './video-stream-status.service';\nimport type { LBMStats } from '../interfaces/LBMStats';\nimport { trackMixpanelEvent } from '../store';\n\n@Injectable()\nexport class StreamStatusTelemetryService {\n #store = inject(Store);\n #videoStatGenerator = inject(VideoStreamStatusService);\n\n constructor() {\n this.initTelemetry();\n }\n\n private mapEventData(\n data: IAggregatedStat,\n signalingServer: AwsInstance,\n isLowBandwidth: boolean,\n lbmStats: LBMStats | undefined,\n ) {\n const {\n bitrate,\n VideoEncoderQP,\n framesPerSecond,\n frameWidth,\n frameHeight,\n jitter,\n packetsLost,\n currentRoundTripTime,\n } = data.aggregatedStats;\n\n return {\n runTime: data.aggregatedStats.runTime,\n frameWidth,\n frameHeight,\n isLowBandwidth,\n client: signalingServer.wsUrl,\n pixelRatio: window.devicePixelRatio,\n framesPerSecond,\n jitter,\n packetsLost,\n instanceName: signalingServer.instanceName,\n bitrate,\n lbmStats,\n rtt: currentRoundTripTime,\n VideoEncoderQP,\n };\n }\n\n private initTelemetry() {\n this.#videoStatGenerator.videoStats$\n .pipe(\n withLatestFrom(\n this.#store.select(unrealFeature.selectAwsInstance),\n this.#store.select(unrealFeature.selectLowBandwidth),\n this.#store.select(unrealFeature.selectLowBandwidthStats),\n ),\n auditTime(5000),\n map(([data, signalingServer, isLowBandwidth, lbmStats]) =>\n this.mapEventData(data, signalingServer, isLowBandwidth, lbmStats),\n ),\n )\n .subscribe((data) => this.trackEventToMixPanel(data));\n }\n\n private trackEventToMixPanel(data: Partial<InboundVideoStats>) {\n this.#store.dispatch(trackMixpanelEvent({ event: 'streamStatus', data }));\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\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 styleUrls: ['./unreal-error-modal.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SourceButtonComponent],\n})\nexport class UnrealErrorModalComponent {\n dialogRef = inject(DialogRef);\n dialogData = inject<{ content: string }>(DIALOG_DATA);\n\n close() {\n this.dialogRef.close();\n }\n}\n","<div class=\"src-modal src-modal--small\">\n <div class=\"src-modal__header\">\n <div\n class=\"src-modal__title\"\n [attr.data-testid]=\"'unreal-error-header-title'\"\n >\n Warning\n </div>\n </div>\n <div class=\"src-modal__body\">\n <div>{{ dialogData.content }}</div>\n </div>\n <div class=\"src-modal__footer\">\n <src-button [colorScheme]=\"'secondary'\" (onClick)=\"close()\">\n Ok\n </src-button>\n </div>\n</div>\n","import { inject, Injectable } from '@angular/core';\nimport { Actions, createEffect, ofType } from '@ngrx/effects';\nimport {\n combineLatestWith,\n debounceTime,\n EMPTY,\n fromEvent,\n map,\n of,\n switchMap,\n} from 'rxjs';\nimport { concatLatestFrom } from '@ngrx/operators';\nimport { Store } from '@ngrx/store';\nimport {\n changeLowBandwidth,\n changeStreamResolutionAction,\n changeStreamResolutionSuccessAction,\n commandCompleted,\n destroyConnectionsAndResetState,\n destroyRemoteConnections,\n initSignalling,\n resetAfkAction,\n resetConfig,\n resetUnrealState,\n resetWarnTimeout,\n setAwsInstance,\n setCirrusDisconnected,\n setConfig,\n setDataChannelConnected,\n setErrorMessage,\n setFreezeFrame,\n setLoopBackCommandIsCompleted,\n setMaxFps,\n setViewportReady,\n showUnrealErrorMessage,\n} from './unreal.actions';\nimport { unrealFeature } from './unreal.feature';\nimport {\n catchError,\n distinctUntilChanged,\n exhaustMap,\n filter,\n first,\n tap,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { Falsy, isEmpty, Logger, tapLog, Truthy } from '@3dsource/utils';\nimport {\n fromSignal,\n getDebugModeCommand,\n getExecuteConsoleCommand,\n getLoopBackCommand,\n getRtcErrorMessage,\n getSetFpsCommand,\n observeCommandResponse,\n resetAfk,\n} from '../helpers';\nimport {\n CONSOLE_COMMAND_PIXEL_QUALITY,\n DATA_CHANNEL_CONNECTION_TIMEOUT,\n MINIMAL_FPS,\n UNREAL_CONFIG,\n} from '../constants';\nimport { selectCommandsInProgress } from '../store';\nimport { WebrtcErrorModalComponent } from '../components';\nimport {\n DevModeService,\n SignallingService,\n TelemetryStart,\n TelemetryStop,\n UnrealCommunicatorService,\n VideoStreamStatusService,\n WebRtcPlayerService,\n} from '../services';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { HttpClient } from '@angular/common/http';\nimport { ScrollStrategyOptions } from '@angular/cdk/overlay';\nimport {\n DisconnectReason,\n UnrealInternalSignalEvents,\n WrappedMetaBoxCommandPacket,\n WSCloseCode_NORMAL_CIRRUS_CLOSED,\n} from '../interfaces';\nimport type { FLoopBackCommand } from '@3dsource/types-unreal';\nimport { UnrealErrorModalComponent } from '../components/unreal-error-modal/unreal-error-modal.component';\n\n@Injectable()\nexport class UnrealEffects {\n private dialog = inject(Dialog);\n private http = inject(HttpClient);\n private store = inject(Store);\n private isDevMode = inject(DevModeService).isDevMode;\n private unrealInitialConfig = inject(UNREAL_CONFIG, { optional: true });\n private actions$ = inject(Actions);\n private player = inject(WebRtcPlayerService);\n private signallingService = inject(SignallingService);\n private scrollStrategy = inject(ScrollStrategyOptions).block();\n private commandsSender = inject(UnrealCommunicatorService);\n private videoStatGenerator = inject(VideoStreamStatusService);\n\n cirrusDisconnectEffect$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setCirrusDisconnected),\n map(() => resetUnrealState()),\n );\n });\n destroyConnections$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyConnectionsAndResetState),\n map(() =>\n destroyRemoteConnections({ disconnectReason: DisconnectReason.reset }),\n ),\n );\n });\n resetState$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyConnectionsAndResetState),\n map(() => resetUnrealState()),\n );\n });\n destroyRemoteConnections$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n tap(({ disconnectReason }) => {\n this.signallingService.close({\n code: WSCloseCode_NORMAL_CIRRUS_CLOSED,\n reason: disconnectReason,\n });\n this.player.closePC();\n }),\n );\n },\n { dispatch: false },\n );\n changeStreamResolution$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeStreamResolutionAction),\n filter((size) => !!(size?.width && size?.height)),\n concatLatestFrom(() => [\n this.store.select(unrealFeature.selectStreamResolution),\n ]),\n filter(\n ([newSizes, savedSizes]) =>\n !(\n newSizes.width === savedSizes.width &&\n newSizes.height === savedSizes.height\n ),\n ),\n map(([sizes]) =>\n changeStreamResolutionSuccessAction({\n width: sizes.width,\n height: sizes.height,\n }),\n ),\n );\n });\n forceLBMOff$ = createEffect(() => {\n return fromEvent(document, 'visibilitychange').pipe(\n map(() => document.visibilityState === 'visible'),\n filter(Truthy),\n tapLog('forceLBMOff$'),\n map(() => changeLowBandwidth({ lowBandwidth: false })),\n );\n });\n resetFreezeFrameOnLowBandwidthTriggered$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(changeLowBandwidth),\n map((state) => state.lowBandwidth),\n distinctUntilChanged(),\n map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n );\n });\n sendLbmStat$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(\n distinctUntilChanged(),\n filter(Truthy),\n exhaustMap(() =>\n this.actions$.pipe(\n ofType(changeLowBandwidth),\n filter(({ lowBandwidth }) => lowBandwidth),\n withLatestFrom(\n this.store.select(unrealFeature.selectAwsInstance),\n this.store.select(unrealFeature.selectStreamClientCompanyId),\n this.store.select(unrealFeature.selectStreamViewId),\n ),\n first(),\n exhaustMap(([, instance, companyId, viewId]) =>\n this.http\n .post(this.unrealInitialConfig?.customErrorsEndpoint || '', {\n message: {\n type: 'front',\n error: 'low_bandwidth_mode',\n signalling: instance.pollingUrl,\n },\n client: instance.pollingUrl,\n session_uuid: companyId,\n session_uuid2: viewId,\n })\n .pipe(catchError(() => EMPTY)),\n ),\n ),\n ),\n )\n .subscribe();\n resetAfk$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setConfig, resetWarnTimeout, resetConfig),\n map(() => resetAfkAction()),\n );\n });\n resetFreezeFrameOnViewportDestroy$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setViewportReady),\n filter(Falsy),\n map(() => setFreezeFrame({ dataUrl: null, progress: null })),\n );\n });\n setMaxFps$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(setMaxFps),\n tap(({ maxFps }) => {\n this.commandsSender.sendCommandToUnreal(getSetFpsCommand(maxFps));\n }),\n );\n },\n { dispatch: false },\n );\n webrtcErrorModalComponent$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(setErrorMessage),\n debounceTime(400),\n combineLatestWith(\n this.store.select(unrealFeature.selectDataChannelConnected),\n ),\n filter(([error, isConnected]) => {\n return !isConnected && error?.errorType === 'WebRTCError';\n }),\n tap(() => this.dialog.open(WebrtcErrorModalComponent)),\n );\n },\n { dispatch: false },\n );\n resetAfkAction$ = createEffect(\n () => {\n return this.actions$.pipe(\n ofType(resetAfkAction),\n tap(() => resetAfk()),\n );\n },\n { dispatch: false },\n );\n setDataChannelTimeoutCheck$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setAwsInstance),\n filter(({ wsUrl }) => !!wsUrl),\n debounceTime(DATA_CHANNEL_CONNECTION_TIMEOUT), // Timeout, if not connected, send error report, then reconnect\n concatLatestFrom(() => [\n this.store.select(unrealFeature.selectSsData),\n this.store.select(unrealFeature.selectCirrusConnected),\n this.store.select(unrealFeature.selectDataChannelConnected),\n ]),\n filter(([, , isCirrusConnected, isDataChannelConnected]) => {\n return isCirrusConnected && !isDataChannelConnected;\n }),\n switchMap(([awsInstance, ssData]) => {\n const error = `DataChannel connection timeout ${DATA_CHANNEL_CONNECTION_TIMEOUT}ms, requesting new signaling.`;\n Logger.error(error);\n\n return this.http\n .post(awsInstance.pollingUrl || '', {\n awsInstance,\n connectionId: ssData?.connectionId,\n href: location.href,\n userAgent: navigator.userAgent,\n error,\n })\n .pipe(\n catchError((error: unknown) => {\n Logger.error('Error sending timeout info:', error);\n return of(null);\n }),\n );\n }),\n map(() =>\n destroyRemoteConnections({\n disconnectReason: DisconnectReason.dataChannelTimeout,\n }),\n ),\n );\n });\n destroyConnectionAndRestart$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(destroyRemoteConnections),\n filter(\n ({ disconnectReason }) =>\n disconnectReason === DisconnectReason.dataChannelTimeout,\n ),\n switchMap(() => this.actions$.pipe(ofType(resetUnrealState), first())),\n map(() => initSignalling()),\n );\n });\n showUnrealError$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(showUnrealErrorMessage),\n map(({ code }) => getRtcErrorMessage(code)),\n distinctUntilChanged(),\n filter(Truthy),\n switchMap(\n (content: string) =>\n this.dialog.open(UnrealErrorModalComponent, {\n scrollStrategy: this.scrollStrategy,\n data: { content },\n }).closed,\n ),\n map(() => showUnrealErrorMessage({ code: null })),\n );\n });\n initAppBySetDataChannelConnected$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setDataChannelConnected),\n tap(() => {\n this.commandsSender.sendCommandToUnreal(\n getExecuteConsoleCommand({\n value: CONSOLE_COMMAND_PIXEL_QUALITY,\n }),\n );\n\n this.commandsSender.sendCommandToUnreal(\n getDebugModeCommand({ value: this.isDevMode }),\n );\n\n TelemetryStart('SetViewportReady');\n }),\n switchMap(() =>\n this.store.select(selectCommandsInProgress).pipe(\n debounceTime(500),\n first(),\n switchMap(() =>\n observeCommandResponse<FLoopBackCommand['command']>(\n getLoopBackCommand(),\n (data) => this.commandsSender.sendCommandToUnreal(data),\n ),\n ),\n switchMap(() => this.videoStatGenerator.videoStats$),\n filter(\n (videoStats) =>\n !!videoStats.aggregatedStats.framesPerSecond &&\n videoStats.aggregatedStats.framesPerSecond > MINIMAL_FPS &&\n (videoStats.aggregatedStats.framesDecoded || 0) > 15,\n ),\n first(),\n map(() => setLoopBackCommandIsCompleted()),\n ),\n ),\n );\n });\n setViewportReadyBySetLoopBackCommandIsCompleted$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(setLoopBackCommandIsCompleted),\n tap(() => TelemetryStop('SetViewportReady', { ready: true })),\n map(() => setViewportReady({ value: true })),\n );\n });\n listenUnrealCallbackByInitSignalling$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(initSignalling),\n switchMap(() =>\n fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(\n map(\n ({ json }) =>\n (json as WrappedMetaBoxCommandPacket)?.commandCallback\n ?.correlationId,\n ),\n filter(Truthy),\n map((id) => commandCompleted({ id })),\n ),\n ),\n );\n });\n setConfigByInitSignalling$ = createEffect(() => {\n return this.actions$.pipe(\n ofType(initSignalling),\n switchMap(() =>\n this.store.select(unrealFeature.selectUnrealVersion).pipe(\n filter(Truthy),\n map((unrealVersion) =>\n [\n unrealVersion && this.unrealInitialConfig?.signalling\n ? this.unrealInitialConfig.signalling[unrealVersion]\n : '',\n ]\n .flat()\n .filter(Truthy),\n ),\n ),\n ),\n map((urls) => {\n if (isEmpty(urls)) {\n throw Error('Signalling URL(s) is empty');\n }\n return setConfig({ config: { matchMakerUrls: urls } });\n }),\n );\n });\n}\n","export 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 { COLOR_CODES, Falsy, Logger, Truthy, where } from '@3dsource/utils';\nimport { inject, Injectable } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { Subject } from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n takeUntil,\n withLatestFrom,\n} from 'rxjs/operators';\nimport { EControlSchemeType } from '../constants/EControlSchemeType';\nimport { EToClientMessageType } from '../constants/EToClientMessageType';\nimport { FreezeFrameService } from './freeze-frame.service';\nimport { InputOptions } from '../constants/InputOptions';\nimport { SignallingService } from './signalling.service';\nimport { Store } from '@ngrx/store';\nimport { UnrealInternalSignalEvents } from '../interfaces/unreal-internal-signal-events.interface';\nimport { VideoService } from './video.service';\nimport { VideoStreamStatusService } from './video-stream-status.service';\nimport { WebRtcPlayerService } from './web-rtc-player.service';\nimport { unrealFeature } from '../store';\nimport { sendSignal } from '../helpers';\nimport { decodeData } from '../helpers/DataDecoder';\nimport { selectStreamConfig } from '../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TelemetryStop } from '../services/command-telemetry.service';\nimport type { ConfigMessage } from '../interfaces/SignalingMessage';\nimport type { UnrealCommands } from '@3dsource/types-unreal';\nimport { showUnrealErrorMessage } from '../store/unreal.actions';\nimport { deepEqual } from '../helpers/deepEqual';\n\n@Injectable()\nexport class AggregatorService {\n readonly store = inject(Store);\n readonly selectStreamConfig = toSignal(this.store.select(selectStreamConfig));\n readonly videoService = inject(VideoService);\n readonly webrtcPlayer = inject(WebRtcPlayerService);\n readonly freezeFrame = inject(FreezeFrameService);\n readonly signallingSrv = inject(SignallingService);\n readonly stats = inject(VideoStreamStatusService);\n /**\n * /Never called for now\n * @\n */\n destroy$ = new Subject<void>();\n responseEventListeners!: Map<string, (data: unknown) => void>;\n disconnect$!: Observable<boolean>;\n unlockViewport$!: Observable<boolean>;\n\n constructor() {\n this.listenWebRTC();\n this.listenSignaling();\n this.initialize();\n }\n\n init() {\n // do nothing, just to not forget to initialize Service\n }\n\n private initialize() {\n this.store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(distinctUntilChanged())\n .subscribe((connected) => {\n this.resetResponseList();\n\n if (connected) {\n this.startListenCallbacks();\n }\n });\n\n this.disconnect$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Falsy));\n\n this.unlockViewport$ = this.store\n .select(unrealFeature.selectViewportReady)\n .pipe(filter(Truthy));\n\n this.unlockViewport$.subscribe(() => {\n this.removeLoadScreen();\n });\n\n this.disconnect$.subscribe(() => {\n this.removeLoadScreen();\n });\n\n if (\n !this.selectStreamConfig()?.autoStart ||\n location.href.match(/^http:/gi)\n ) {\n this.removeLoadScreen();\n }\n\n InputOptions.controlScheme = EControlSchemeType.HoveringMouse;\n\n this.addExternalResponses();\n }\n\n /**\n * @deprecated\n * Hack for 3DS platform;\n * TODO remove ASAP, use {@link BasicConfiguratorApiService.toMetaBoxHandlers.watchCallbacks}\n * Add external responses to the list of responses\n */\n private addExternalResponses() {\n /*Signal.on('ADDRESPONSE')\n .pipe(takeUntil(this.destroy$))\n .subscribe((data: any) => {\n this.addResponseEventListener(data.name!, (event) => {\n this.externalApi.sendMessage({\n action: FromMetaBoxApiAction.UnrealResponse,\n name: data.name,\n responseEvent: event,\n });\n });\n });*/\n }\n\n addResponseEventListener(name: string, listener: (data: unknown) => void) {\n this.responseEventListeners.set(name, listener);\n }\n\n showOnScreenKeyboard<T extends { showOnScreenKeyboard: boolean }>(\n command: T,\n ) {\n if (command.showOnScreenKeyboard) {\n // Show the 'edit text' button.\n //editTextButton.classList.remove('hiddenState');\n // Place the 'edit text' button near the UE4 input widget.\n //let pos = unquantizeAndDenormalizeUnsigned(command.x, command.y);\n //editTextButton.style.top = pos.y.toString() + 'px';\n //editTextButton.style.left = (pos.x - 40).toString() + 'px';\n } else {\n // Hide the 'edit text' button.\n //editTextButton.classList.add('hiddenState');\n // Hide the on-screen keyboard.\n // hiddenInput.blur();\n }\n }\n\n exposeApi() {\n // const globals: Window = window;\n // if ('apiReady' in globals) {\n // try {\n // const api = {\n // setStreamData: (streamData: StreamData) => {\n // this.streamConfig.setConfig(streamData.params);\n // },\n // };\n // globals.apiReady(api);\n // } catch (e) {\n // /!* empty *!/\n // }\n // }\n }\n\n removeLoadScreen() {\n document.getElementById('3dsource_start_screen')?.remove();\n }\n\n startListenCallbacks() {\n Logger.info('Start Listen Callbacks');\n\n let previousJson: unknown = null;\n\n this.addResponseEventListener('unrealEvents', (data) => {\n try {\n if (typeof data !== 'string') {\n return;\n }\n const json = JSON.parse(data);\n\n if (!deepEqual(json, previousJson)) {\n if (json?.error) {\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL_ERROR,\n `${json.error}`,\n data,\n );\n this.store.dispatch(showUnrealErrorMessage({ code: json.code }));\n } else {\n this.showMessageFromUnreal(json);\n\n previousJson = json;\n sendSignal(UnrealInternalSignalEvents.UnrealCallback, { json });\n }\n } else {\n //Logger.warn('Duplicate message received');\n }\n } catch (e) {\n Logger.error(e);\n Logger.error('ERROR=>', data);\n }\n });\n }\n\n private showMessageFromUnreal<T extends UnrealCommands>(json: T) {\n if (filteredLogs.some(where({ command: json?.command }))) {\n return;\n }\n Logger.colored(...COLOR_CODES.FROM_UNREAL, json);\n }\n\n resetResponseList() {\n this.responseEventListeners = new Map();\n }\n\n listenSignaling() {\n const iceCandidateBuffer: RTCIceCandidate[] = [];\n\n const processBuffer = () => {\n iceCandidateBuffer.forEach((cnd) => {\n this.webrtcPlayer.handleCandidateFromServer(cnd);\n });\n iceCandidateBuffer.length = 0;\n };\n\n this.signallingSrv.onConfig$\n .pipe(takeUntil(this.destroy$))\n .subscribe((config: ConfigMessage) => {\n this.videoService.create();\n this.webrtcPlayer.setConfig(config);\n void this.webrtcPlayer.createWebRtcOffer();\n });\n\n this.signallingSrv.onWebRtcAnswer$\n .pipe(filter(Truthy), takeUntil(this.destroy$))\n .subscribe((answer) => {\n this.webrtcPlayer.receiveAnswer(answer);\n processBuffer();\n });\n\n this.signallingSrv.onWebRtcIce$\n .pipe(\n withLatestFrom(this.signallingSrv.onWebRtcAnswer$),\n takeUntil(this.destroy$),\n )\n .subscribe(([candidate, answerEstablished]) => {\n TelemetryStop('iceCandidate', {\n multi: true,\n });\n\n iceCandidateBuffer.push(candidate);\n if (answerEstablished) {\n processBuffer();\n }\n });\n }\n\n listenWebRTC() {\n this.webrtcPlayer.onWebRtcOffer$\n .pipe(takeUntil(this.destroy$))\n .subscribe((offer: RTCSessionDescriptionInit) =>\n this.signallingSrv.send(offer),\n );\n\n this.webrtcPlayer.onWebRtcCandidate$\n .pipe(takeUntil(this.destroy$))\n .subscribe((candidate: RTCIceCandidate) =>\n this.signallingSrv.send(\n JSON.stringify({\n type: 'iceCandidate',\n candidate: candidate,\n }),\n ),\n );\n\n this.webrtcPlayer.onDataChannelMessage$\n .pipe(takeUntil(this.destroy$))\n .subscribe((data: number[]) => this.dataChannelMessageHandler(data));\n\n this.webrtcPlayer.onAudioTrack$\n .pipe(takeUntil(this.destroy$))\n .subscribe((stream: MediaStream) =>\n this.videoService.attachAudioStream(stream),\n );\n\n this.webrtcPlayer.onVideoTrack$\n .pipe(takeUntil(this.destroy$))\n .subscribe((stream: MediaStream) => {\n this.videoService.attachVideoStream(stream);\n });\n }\n\n dataChannelMessageHandler(data: number[]) {\n const view = new Uint8Array(data);\n const anyData = data.slice(1);\n\n if (this.freezeFrame.receiving) {\n this.freezeFrame.setData(view);\n\n return;\n }\n\n switch (view[0]) {\n case EToClientMessageType.QualityControlOwnership: {\n const ownership = view[1] !== 0;\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Received quality controller message, will control quality: ' +\n ownership,\n );\n break;\n }\n\n case EToClientMessageType.Response: {\n const response = decodeData(anyData);\n\n for (const listener of this.responseEventListeners.values()) {\n listener(response as never);\n }\n\n break;\n }\n\n case EToClientMessageType.Command: {\n const commandAsString = decodeData(anyData);\n Logger.colored(...COLOR_CODES.FROM_UNREAL, commandAsString);\n const command = JSON.parse(commandAsString);\n\n if (command.command === 'onScreenKeyboard') {\n this.showOnScreenKeyboard(command);\n }\n break;\n }\n\n case EToClientMessageType.FreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Freeze frame');\n this.freezeFrame.start(view);\n break;\n\n case EToClientMessageType.UnfreezeFrame:\n Logger.colored(...COLOR_CODES.FROM_UNREAL, 'Un-Freeze frame');\n this.freezeFrame.invalidate();\n break;\n\n case EToClientMessageType.VideoEncoderAvgQP:\n this.stats.setEncoder(anyData);\n break;\n\n case EToClientMessageType.LatencyTest: {\n const latencyTimings = decodeData(anyData);\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Got latency timings :',\n latencyTimings,\n );\n Logger.colored(...COLOR_CODES.FROM_UNREAL, latencyTimings);\n this.stats.latencyTestTimings.SetUETimings(latencyTimings);\n break;\n }\n\n case EToClientMessageType.InitialSettings:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InitialSettings message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.Protocol:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'Protocol message :',\n JSON.parse(decodeData(anyData)),\n );\n break;\n\n case EToClientMessageType.InputControlOwnership:\n Logger.colored(\n ...COLOR_CODES.FROM_UNREAL,\n 'InputControlOwnership message :',\n anyData,\n );\n break;\n\n default:\n Logger.warn(`unrecognized data received, packet ID ${view[0]}`);\n }\n }\n}\n\nexport const filteredLogs = [\n {\n command: 'onChangeSequence',\n },\n];\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n OnInit,\n} from '@angular/core';\nimport { BehaviorSubject, combineLatestWith, Observable, of } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\nimport type { InboundVideoStats } from '../../interfaces/unreal-internal-signal-events.interface';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { StatGraphComponent } from '../../components/stat-graph/stat-graph.component';\nimport { AsyncPipe, JsonPipe } from '@angular/common';\nimport { Store } from '@ngrx/store';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport { DevModeService } from '../../services/dev-mode.service';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { selectSignalingParameters } from '../../store/unreal.selectors';\nimport { SafePipe } from '../../pipes/safe-html.pipe';\n\n@Component({\n selector: 'app-video-stats',\n templateUrl: './video-stats.component.html',\n styleUrls: ['./video-stats.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [StatGraphComponent, AsyncPipe, JsonPipe, SafePipe],\n})\nexport class VideoStatsComponent implements OnInit {\n collapsed = false;\n private store = inject(Store);\n private videoStatGenerator = inject(VideoStreamStatusService);\n private isDevMode = inject(DevModeService).isDevMode;\n private obs$ = this.videoStatGenerator.videoStats$;\n\n viewportReady = toSignal(\n this.store.select(unrealFeature.selectViewportReady),\n );\n ssInfo = toSignal(this.store.select(selectSignalingParameters));\n fpsTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.framesPerSecond, hash: index }) as any,\n ),\n ),\n );\n fpsAvgTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.avgFrameRate, hash: index }) as any,\n ),\n ),\n );\n bitrateTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.bitrate, hash: index }) as any,\n ),\n ),\n );\n videoQP = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.VideoEncoderQP, hash: index }) as any,\n ),\n ),\n );\n bitrateAverageTick = toSignal(\n this.obs$.pipe(\n map(\n (stat, index) =>\n ({ value: stat.aggregatedStats.avgBitrate, hash: index }) as any,\n ),\n ),\n );\n videoStatus = toSignal(\n this.obs$.pipe(\n map(\n (event) =>\n this.isDevMode &&\n ({\n ...event.aggregatedStats,\n quality: event.quality,\n } as InboundVideoStats),\n ),\n filter(Boolean),\n map((data: any) => {\n return this.fields\n .map((key) => {\n return {\n key,\n value: data[key],\n };\n })\n .filter((r) => !this.elementsToShow.includes(r.key));\n }),\n ),\n );\n fields!: string[];\n graphList: any[] = [];\n graphList$!: Observable<any>;\n private idKey = 'com.source3d.unreal.stat';\n private elementsToShow: string[] = [];\n\n private trigger$ = new BehaviorSubject<void>(undefined);\n\n constructor() {\n this.getFields();\n }\n\n ngOnInit() {\n this.fields = [\n 'kalmanBitrate',\n 'bitrateDrop',\n 'runTime',\n 'pixelRatio',\n 'frameHeight',\n 'frameWidth',\n ':-------------',\n 'jitter',\n 'MBytesReceived',\n 'framesDecoded',\n 'framesDropped',\n 'framesReceived',\n 'keyFramesDecoded',\n 'currentRoundTripTime',\n 'packetsLost',\n ':-------------',\n 'quality',\n 'videoCodec',\n 'kind',\n 'type',\n 'codecs',\n //'pliCount',\n //'sliCount',\n //'transportId',\n //'id',\n ];\n\n this.updateGraph();\n }\n\n updateGraph() {\n this.graphList = this.fields.map((key: any) => {\n const stat = this.obs$.pipe(\n map((val, index) => {\n const value = (val.aggregatedStats as any)[key];\n return { value, hash: index } as any;\n }),\n );\n\n return {\n key,\n color: Math.floor(Math.random() * 16777216),\n stat,\n };\n });\n\n this.graphList$ = of(this.graphList).pipe(\n combineLatestWith(this.trigger$),\n map(([graphList]) =>\n graphList.filter((r) => this.elementsToShow.includes(r.key)),\n ),\n );\n }\n\n toggle() {\n this.collapsed = !this.collapsed;\n this.writeFields();\n }\n\n toggleGraph($event: MouseEvent, el: string, value?: any) {\n $event.stopPropagation();\n if ((value && typeof value !== 'number') || isNaN(value)) {\n return;\n }\n if (this.elementsToShow.includes(el)) {\n this.elementsToShow = this.elementsToShow.filter((item) => item !== el);\n } else {\n this.elementsToShow.push(el);\n }\n this.writeFields();\n this.trigger$.next();\n }\n\n private getFields() {\n try {\n const { elements, collapsed } =\n JSON.parse(localStorage.getItem(this.idKey) as string) || [];\n this.elementsToShow = elements || [];\n this.collapsed = collapsed;\n } catch {\n this.elementsToShow = [];\n }\n }\n\n private writeFields() {\n localStorage.setItem(\n this.idKey,\n JSON.stringify({\n collapsed: this.collapsed,\n elements: this.elementsToShow,\n }),\n );\n }\n}\n","@if (videoStatus()) {\n @if (viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Video 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 [dataTick]=\"fpsTick()\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [dataTick]=\"videoQP()\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgFPS (higher is better)\"\n [dataTick]=\"fpsAvgTick()\"\n color=\"#00aa00\"\n />\n </li>-->\n <li>\n <app-stat-graph\n [dataTick]=\"bitrateTick()\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n <!-- <li>\n <app-stat-graph\n label=\"AvgBitrate\"\n [dataTick]=\"bitrateAverageTick()\"\n color=\"#D50007\"\n />\n </li>-->\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [dataTick]=\"graph.stat | async\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n }\n}\n","import type { OnInit } from '@angular/core';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { Falsy, tapLog, Truthy } from '@3dsource/utils';\nimport type { Observable } from 'rxjs';\nimport { combineLatestWith, merge, of, skip, Subject, switchMap } from 'rxjs';\nimport { debounceTime, delay, filter, map, tap } from 'rxjs/operators';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { VideoStatsComponent } from '../../components/video-stats/video-stats.component';\nimport { floatToSmoothPercents } from '../../helpers/float-to-smooth-percents';\nimport { clampAndKeepMaxPercents } from '../../helpers/clamp-and-keep-max-percents';\nimport {\n selectShowLoader,\n selectTotalProgress,\n} from '../../store/unreal.selectors';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DevModeService } from '../../services/dev-mode.service';\nimport { SourceLoadingComponent } from '@3dsource/source-ui-native';\n\n@Component({\n selector: 'app-unreal-status',\n templateUrl: './unreal-status.component.html',\n styleUrls: ['./unreal-status.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [VideoStatsComponent, SourceLoadingComponent],\n})\nexport class UnrealStatusComponent implements OnInit {\n message$!: Observable<string | null>;\n #store = inject(Store);\n #onDisconnect$ = this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(filter(Falsy));\n\n readonly isDevMode = inject(DevModeService).isDevMode;\n\n /**\n * An observable that emits smoothed percentage values from 0 to 100.\n */\n readonly messagePercents$ = toSignal(\n this.#onDisconnect$.pipe(\n switchMap(() =>\n this.#store.select(selectTotalProgress).pipe(\n floatToSmoothPercents(),\n clampAndKeepMaxPercents(),\n combineLatestWith(this.#store.select(selectShowLoader)),\n map(([progress, showLoader]) => (showLoader ? progress || 0 : null)),\n ),\n ),\n ),\n );\n\n ngOnInit() {\n /**\n * A subject that emits null values to trigger nullification.\n */\n const nullify$ = new Subject<null>();\n\n /**\n * An observable that emits null values with a delay of 2000 milliseconds.\n */\n const nullifyObs$: Observable<null> = nullify$\n .asObservable()\n .pipe(delay(2000));\n\n /**\n * An observable that emits the status message from the Unreal feature store.\n */\n const signalingStatus$ = this.#store.select(\n unrealFeature.selectStatusMessage,\n );\n\n /**\n * An observable that emits connection status messages based on the Cirrus connection state.\n * Then call side effect to nullify the message.\n */\n const cirrusConnected$ = this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(\n skip(1),\n switchMap((connected) =>\n connected\n ? of('Creating Socket...')\n : of('Connection closed.').pipe(tap(() => nullify$.next(null))),\n ),\n );\n\n /**\n * An observable that emits the viewport visibility state.\n */\n const viewportTrigger$ = this.#store.select(\n unrealFeature.selectViewportReady,\n );\n\n /**\n * An observable that will nullify any message displayed after 500 mSec, when viewport changes its state.\n */\n const streamToggle$ = merge(\n viewportTrigger$.pipe(filter(Falsy), skip(1)),\n viewportTrigger$.pipe(filter(Truthy)),\n ).pipe(\n delay(500),\n map(() => null),\n );\n\n /**\n * An observable that merges various status observables and emits debounced status messages.\n */\n this.message$ = merge(\n nullifyObs$,\n cirrusConnected$,\n signalingStatus$,\n streamToggle$,\n ).pipe(\n debounceTime(0),\n tap((status) => this.sendMessageToIndex(status as string)),\n tapLog('STATUS'),\n );\n }\n\n /**\n * Sends a message to the embedded iframe identified by the '3dsource_start_screen' ID.\n * This function tries to post a message to the iframe's content window. If the content\n * window is not accessible (e.g., due to cross-origin policies), the function fails silently.\n *\n * @param {string} text The message to be sent to the iframe. This could be a status update\n * or any other relevant information that the iframe needs to process.\n */\n private sendMessageToIndex(text: string) {\n const objectElement = document.getElementById(\n '3dsource_start_screen',\n ) as HTMLIFrameElement;\n\n try {\n const objectDocument = objectElement.contentWindow;\n objectDocument?.postMessage(text, '*');\n } catch {\n // Fails silently if the iframe's content window cannot be accessed\n }\n }\n}\n","@if (messagePercents$() !== null) {\n <div class=\"status-box\">\n <div class=\"status-box__message\">\n <src-loading\n [size]=\"30\"\n [backgroundStrokeColor]=\"'#E5E7EB'\"\n [progressStrokeColor]=\"'#1F2937'\"\n />\n {{ messagePercents$() }}%\n </div>\n </div>\n}\n\n@if (isDevMode) {\n <app-video-stats />\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n ElementRef,\n HostListener,\n inject,\n input,\n OnDestroy,\n OnInit,\n output,\n ViewChild,\n} from '@angular/core';\nimport { distinctUntilChanged, filter, map, tap } from 'rxjs/operators';\nimport {\n combineLatestWith,\n debounceTime,\n fromEvent,\n merge,\n switchMap,\n take,\n timer,\n} from 'rxjs';\nimport { VideoService } from '../../services/video.service';\nimport { AggregatorService } from '../../services/aggregator.service';\nimport { InputService } from '../../services/input.service';\nimport { UnrealInternalSignalEvents } from '../../interfaces/unreal-internal-signal-events.interface';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport type { Area, Size } from '@3dsource/utils';\nimport { fitIntoRectangle, fpIsASameAsB, Truthy } from '@3dsource/utils';\nimport { Store } from '@ngrx/store';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport {\n changeStreamResolutionAction,\n destroyConnectionsAndResetState,\n initSignalling,\n resetUnrealStateAction,\n} from '../../store/unreal.actions';\nimport {\n DEBOUNCE_TO_MANY_RESIZE_CALLS,\n FULL_HD_HEIGHT,\n FULL_HD_WIDTH,\n SAME_SIZE_THRESHOLD,\n} from '../../constants/unreal.constant';\nimport { StreamStatusTelemetryService } from '../../services/stream-status-telemetry.service';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport { fromSignal, sendSignal } from '../../helpers/EventWrapper';\nimport { AfkRestartScreenLockerComponent } from '../../components/screen-locker/afk-restart-screen-locker.component';\nimport { ClickableOverlayComponent } from '../../components/clickable-overlay/clickable-overlay.component';\nimport { UnrealCommunicatorService } from '../../services/unreal-communicator.service';\nimport { UnrealStatusComponent } from '../../components/unreal-status/unreal-status.component';\nimport { getChangeResolutionCommand } from '../../helpers/prepare-commands';\nimport { FreezeFrameComponent } from '../../components/freeze-frame/freeze-frame.component';\nimport { selectIsFreezeFrameLoading } from '../../store/unreal.selectors';\n\n@Component({\n selector: 'app-unreal-scene',\n templateUrl: './unreal-scene.component.html',\n styleUrls: ['./unreal-scene.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AfkRestartScreenLockerComponent,\n ClickableOverlayComponent,\n UnrealStatusComponent,\n FreezeFrameComponent,\n ],\n})\nexport class UnrealSceneComponent implements AfterViewInit, OnInit, OnDestroy {\n isStudio = input(false);\n useContainerAsSizeProvider = input(true);\n studioResolutionSize = input<{ width: number; height: number }>({\n width: FULL_HD_WIDTH,\n height: FULL_HD_HEIGHT,\n });\n studioResolutionValues = toObservable(\n computed(() => {\n const values = this.studioResolutionSize();\n return { width: values.width, height: values.height };\n }),\n );\n private width = FULL_HD_WIDTH;\n private height = FULL_HD_HEIGHT;\n private store = inject(Store);\n private aggregatorService = inject(AggregatorService);\n private commandsSender = inject(UnrealCommunicatorService);\n private inputService = inject(InputService);\n private videoService = inject(VideoService);\n private stats = inject(VideoStreamStatusService);\n private streamTelemetryService = inject(StreamStatusTelemetryService);\n private element = inject(ElementRef);\n private destroyRef = inject(DestroyRef);\n\n lightMode = toSignal(this.store.select(unrealFeature.selectLowBandwidth));\n isFreezeFrameLoading = toSignal(\n this.store.select(selectIsFreezeFrameLoading),\n );\n\n @ViewChild('container') container!: ElementRef;\n changeMouseOverScene = output<boolean>();\n\n @HostListener('mouseover')\n onMouseOver() {\n this.changeMouseOverScene.emit(true);\n }\n\n @HostListener('mouseout')\n onMouseOut() {\n this.changeMouseOverScene.emit(false);\n }\n\n ngOnInit() {\n this.streamTelemetryService.init();\n this.aggregatorService.init();\n this.inputService.useKeyboardKeys(this.inputService.defaultKeys);\n this.store.dispatch(initSignalling());\n }\n\n ngAfterViewInit() {\n fromEvent<Event>(this.element.nativeElement, 'contextmenu')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event: Event) => event.preventDefault());\n\n this.videoService.container = this.container.nativeElement;\n\n const customSizeInputChanged$ = this.studioResolutionValues.pipe(\n filter(Truthy),\n distinctUntilChanged(),\n filter(\n ({ width, height }) => this.width !== width || this.height !== height,\n ),\n map(({ width, height }) => ({ width, height })),\n tap(({ width, height }) => {\n this.width = width;\n this.height = height;\n }),\n );\n\n const resizeRequired$ = merge(\n fromSignal(UnrealInternalSignalEvents.OnVideoInitialized),\n fromEvent(window, 'resize'),\n );\n\n const videoStreamSizeChanged$ = this.stats?.videoStats$.pipe(\n filter(() => !this.isFreezeFrameLoading()),\n map((stats) => ({\n w: stats.aggregatedStats.frameWidth || 0,\n h: stats.aggregatedStats.frameHeight || 0,\n })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n );\n\n merge(customSizeInputChanged$, resizeRequired$, videoStreamSizeChanged$)\n .pipe(\n debounceTime(DEBOUNCE_TO_MANY_RESIZE_CALLS),\n switchMap(() => {\n const key = Math.random();\n\n // Monitoring the size of the video stream\n return timer(0, 300).pipe(\n take(3),\n map(() => key),\n );\n }),\n map((key) => ({ key, ...this.resizeValues })),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD) &&\n previous.key === current.key,\n ),\n tap((size) => this.adaptVideo(size)),\n distinctUntilChanged(\n (previous, current) =>\n fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&\n fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD),\n ),\n combineLatestWith(\n this.store\n .select(unrealFeature.selectDataChannelConnected)\n .pipe(filter(Truthy)),\n ),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(([size]) => {\n this.store.dispatch(\n changeStreamResolutionAction({ width: size.w, height: size.h }),\n );\n this.sendResize(size);\n });\n\n fromSignal(UnrealInternalSignalEvents.ForceResizeViewport)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n this.sendResize(this.resizeValues);\n });\n }\n\n ngOnDestroy() {\n this.commandsSender.destroy();\n this.store.dispatch(destroyConnectionsAndResetState());\n this.store.dispatch(resetUnrealStateAction());\n }\n\n private adaptVideo(size: Size) {\n const video = this.videoService.video;\n const areaSize = this.resizeValues;\n\n if (video?.style) {\n const pR = this.pixelRatio;\n video.width = size.w / pR / areaSize.scale;\n video.height = size.h / pR / areaSize.scale;\n\n if (!this.isStudio()) {\n video.style.objectFit = 'cover';\n video.style.width = '100%';\n video.style.height = '100%';\n }\n }\n\n sendSignal(UnrealInternalSignalEvents.VideoAdaptedToContainer);\n }\n\n private get resizeValues(): Area {\n if (!this.isStudio()) {\n return this.getResizeValuesUniversal();\n }\n\n return this.getResizeValues();\n }\n\n /**\n * This method calculates the dimensions for resizing a layout in a configurator stream.\n * It takes into account the pixel ratio of the device's screen and the orientation of the layout.\n * The method uses the `fitIntoRectangle` function to calculate the dimensions that would allow the layout to fit into the maximum space while maintaining its aspect ratio.\n * It also sets the maximum limits for the width and height based on the layout's orientation.\n * If the scale of the fitted dimensions is less than 1, it assigns the fitted dimensions to the output. Otherwise, it sets the scale of the output to 1.\n * @returns {Area} An object of type `Area` that contains the calculated dimensions for resizing the layout.\n */\n private getResizeValuesUniversal(): Area {\n const pR = this.pixelRatio;\n let containerW = window.innerWidth || 1;\n let containerH = window.innerHeight || 1;\n\n if (this.useContainerAsSizeProvider()) {\n containerW = this.container?.nativeElement.offsetWidth || 1;\n containerH = this.container?.nativeElement.offsetHeight || 1;\n }\n\n const maxSpace = { w: containerW * pR, h: containerH * pR };\n\n const isVertical = containerW < containerH;\n let maxH = FULL_HD_HEIGHT;\n let maxW = FULL_HD_WIDTH;\n\n const params = new URLSearchParams(location.search);\n const maxRes = params.get('maxresolution');\n\n if (Truthy(maxRes)) {\n maxH = FULL_HD_HEIGHT * 2;\n maxW = FULL_HD_WIDTH * 2;\n }\n\n const maxLimits = isVertical\n ? { w: maxH, h: maxW, x: 0, y: 0 }\n : { w: maxW, h: maxH, x: 0, y: 0 };\n\n const props = fitIntoRectangle(\n { x: 0, y: 0, w: containerW, h: containerH },\n { x: 0, y: 0, ...maxSpace },\n );\n\n let out = { ...props };\n\n const fitIntoMax = fitIntoRectangle(props, maxLimits);\n if (fitIntoMax.scale < 1) {\n // If reducing size to 1920x1080 is required, do it\n out = fitIntoMax;\n } else {\n // Otherwise, use the lowest resolution, because layout size is smaller than 1920x1080\n out.scale = 1;\n }\n\n return { ...out };\n }\n\n private getResizeValues(): Area {\n const pR = this.pixelRatio;\n const containerW = pR * (this.container?.nativeElement.offsetWidth || 1);\n const containerH = pR * (this.container?.nativeElement.offsetHeight || 1);\n const maxSpace = { w: containerW, h: containerH };\n\n const videoSizePixelPerfect = fitIntoRectangle(\n { x: 0, y: 0, w: this.width, h: this.height },\n { x: 0, y: 0, ...maxSpace },\n );\n\n return fitIntoRectangle(videoSizePixelPerfect, {\n x: 0,\n y: 0,\n w: Math.min(containerW, FULL_HD_WIDTH),\n h: Math.min(containerH, FULL_HD_HEIGHT),\n });\n }\n\n private sendResize(size: Size) {\n this.commandsSender.sendCommandToUnreal(\n getChangeResolutionCommand({\n resolution: {\n x: size.w,\n y: size.h,\n },\n }),\n );\n }\n\n private get pixelRatio() {\n return window.devicePixelRatio;\n }\n}\n","<div class=\"frame unreal-container\">\n <div #container [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\n\n <app-unreal-status />\n <app-freeze-frame />\n <app-clickable-overlay />\n <app-afk-restart-screen-locker />\n\n <ng-content select=\"app-video-locker\"></ng-content>\n <ng-content select=\"app-pdf\"></ng-content>\n <ng-content select=\"app-show-case\"></ng-content>\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\n</div>\n","import type { AfterViewInit, ElementRef, OnInit } from '@angular/core';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n ViewChild,\n} from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AsyncPipe, NgOptimizedImage } from '@angular/common';\nimport { Truthy } from '@3dsource/utils';\nimport { filter } from 'rxjs/operators';\nimport { combineLatest, first, map } from 'rxjs';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { resetIntroSrc } from '../../store/unreal.actions';\n\n@Component({\n selector: 'app-video-locker',\n templateUrl: './video-locker.component.html',\n styleUrl: './video-locker.component.scss',\n imports: [AsyncPipe, NgOptimizedImage],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class VideoLockerComponent implements AfterViewInit, OnInit {\n @ViewChild('videoPlayerCover', { static: false })\n videoElement!: ElementRef<HTMLDivElement>;\n private store = inject(Store);\n private destroyRef = inject(DestroyRef);\n protected videoIntroSrc$ = this.store.select(\n unrealFeature.selectVideoIntroSrc,\n );\n protected imageIntroSrc$ = this.store\n .select(unrealFeature.selectImageIntroSrc)\n .pipe(\n map((src) => {\n // TODO need for demos site and need to delete this and move to demos\n if (!src) {\n return null;\n }\n const matchAbsolutePath = !!src.match(\n /.*\\.(png|avif|jpg|webp|svg)(\\?.*)?$/i,\n );\n if (matchAbsolutePath) {\n return src;\n }\n return src;\n }),\n );\n\n ngOnInit() {\n combineLatest([\n this.store.select(unrealFeature.selectViewportReady),\n this.videoIntroSrc$,\n this.imageIntroSrc$,\n ])\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter(\n ([viewportReady, videoSrc, imageSrc]) =>\n viewportReady && (!!videoSrc || !!imageSrc),\n ),\n first(),\n )\n .subscribe(() => this.store.dispatch(resetIntroSrc()));\n }\n\n ngAfterViewInit() {\n this.videoIntroSrc$\n .pipe(filter(Truthy), takeUntilDestroyed(this.destroyRef))\n .subscribe((src) => this.createVideo(src));\n }\n\n private createVideo(src: string) {\n // Select the parent layout where the video will be inserted\n const videoContainer = this.videoElement.nativeElement;\n videoContainer.innerHTML = ''; // This will remove all existing content within the layout\n // Create the video element\n const videoElement = document.createElement('video');\n videoElement.autoplay = true;\n videoElement.muted = true;\n videoElement.loop = true;\n videoElement.poster = `${src}/cover.webp`;\n\n videoElement.style.position = 'absolute';\n videoElement.style.width = '100%';\n videoElement.style.height = '100%';\n videoElement.style.objectFit = 'cover';\n\n const sourceElement = document.createElement('source');\n sourceElement.src = `${src}/video.mp4`;\n sourceElement.type = 'video/mp4';\n\n // Append the source element to the video element\n videoElement.appendChild(sourceElement);\n\n // Handle browser fallback text\n videoElement.innerHTML += 'Browser not supported';\n\n // Append the video element to the layout\n videoContainer.appendChild(videoElement);\n }\n}\n","@if (imageIntroSrc$ | async; as url) {\n <div class=\"backImage\">\n <img [ngSrc]=\"url\" fill alt=\"Loading...\" />\n </div>\n} @else if (videoIntroSrc$ | async) {\n <div #videoPlayerCover class=\"backVideo\"></div>\n}\n","import { DialogRef } from '@angular/cdk/dialog';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { Store } from '@ngrx/store';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { first } from 'rxjs/operators';\nimport { destroyConnectionsAndResetState } from '../../store/unreal.actions';\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, SourceButtonComponent],\n})\nexport class WebrtcErrorModalComponent {\n dialogRef = inject(DialogRef);\n #store = inject(Store);\n\n close() {\n this.dialogRef.close();\n }\n\n closeModalWithCirrusDisconnect() {\n this.#store\n .select(unrealFeature.selectCirrusConnected)\n .pipe(first())\n .subscribe((isConnected) => {\n if (!isConnected) {\n this.#store.dispatch(destroyConnectionsAndResetState());\n }\n this.close();\n });\n }\n}\n","<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n </header>\n <section class=\"src-modal__body\">\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n [colorScheme]=\"'primary'\"\n >\n Ok\n </src-button>\n </footer>\n</div>\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Logger, Signal, Truthy } from '@3dsource/utils';\nimport { DefaultFilterModel, FilterModel } from '../DataFlowConstants';\n\n@Component({\n selector: 'app-filter-settings',\n templateUrl: './filter-settings.component.html',\n styleUrls: ['./filter-settings.component.scss'],\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FilterSettingsComponent implements OnInit {\n private readonly storageKey = 'LBMFilterSettings';\n readonly defaultFilterModel = { ...DefaultFilterModel };\n settings = { ...DefaultFilterModel };\n\n ngOnInit(): void {\n const savedSettings = localStorage.getItem(this.storageKey);\n if (savedSettings) {\n this.dispatch(JSON.parse(savedSettings));\n }\n }\n\n togglePanel() {\n this.settings.panelOpen = !this.settings.panelOpen;\n this.saveSettings();\n }\n\n saveSettings() {\n const valid = Object.entries(this.settings).reduce((acc, [key, value]) => {\n return Truthy(value) ? { ...acc, [key]: value } : acc;\n }, {});\n this.dispatch({ ...DefaultFilterModel, ...valid });\n }\n\n dispatch(model: typeof DefaultFilterModel) {\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(model));\n } catch (e) {\n Logger.error('Storage not available, Error saving filter settings:', e);\n }\n Object.assign(this.settings, model);\n Object.assign(FilterModel, model);\n Signal.broadcast('setKalmanParams', model);\n }\n\n reset() {\n this.dispatch({\n ...DefaultFilterModel,\n panelOpen: this.settings.panelOpen,\n });\n }\n}\n","<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, tapLog, Truthy } from '@3dsource/utils';\nimport {\n takeUntilDestroyed,\n toObservable,\n toSignal,\n} from '@angular/core/rxjs-interop';\nimport { unrealFeature } from '../../store/unreal.feature';\nimport { Dialog } from '@angular/cdk/dialog';\nimport { changeLowBandwidth } from '../../store/unreal.actions';\nimport {\n combineLatestWith,\n concat,\n debounceTime,\n distinctUntilChanged,\n map,\n merge,\n of,\n share,\n skip,\n switchMap,\n take,\n takeUntil,\n timer,\n} from 'rxjs';\nimport { VideoStreamStatusService } from '../../services/video-stream-status.service';\nimport type { Quality } from '../../interfaces/quality.interface';\nimport type { DataFlowCheckResult } from '../../helpers/DataFlowMonitor';\nimport {\n BITRATE_MONITOR,\n FilterModel,\n} from '../../components/low-bandwidth-indicator/DataFlowConstants';\nimport { DevModeService } from '../..//services/dev-mode.service';\nimport { FilterSettingsComponent } from '../../components/low-bandwidth-indicator/filter-settings/filter-settings.component';\n\n@Component({\n selector: 'app-low-bandwidth-detector',\n templateUrl: './low-bandwidth-detector.component.html',\n styleUrls: ['./low-bandwidth-detector.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FilterSettingsComponent],\n})\nexport class LowBandwidthDetectorComponent implements OnInit {\n private readonly store = inject(Store);\n private readonly dialog = inject(Dialog);\n private readonly destroyRef = inject(DestroyRef);\n private readonly videoStatGenerator = inject(VideoStreamStatusService);\n readonly devModeService = inject(DevModeService);\n\n private readonly viewportReady$ = this.store.select(\n unrealFeature.selectViewportReady,\n );\n private readonly isLowBandwidth$ = this.store.select(\n unrealFeature.selectLowBandwidth,\n );\n private readonly lowBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Truthy),\n );\n private readonly highBandwidthTrigger$ = this.isLowBandwidth$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly viewPortDestroyedTrigger$ = this.viewportReady$.pipe(\n distinctUntilChanged(),\n filter(Falsy),\n );\n\n private readonly aggregatedStats$ = this.videoStatGenerator.videoStats$.pipe(\n map((data) => data.aggregatedStats),\n share(),\n );\n private readonly nativeQuality$ = this.videoStatGenerator.videoStats$.pipe(\n map((data) => data.quality),\n );\n\n private readonly monitoringTrigger$ = this.viewportReady$\n .pipe(\n combineLatestWith(this.isLowBandwidth$),\n map(\n ([viewPortReady, isLowBandwidth]) => viewPortReady && !isLowBandwidth,\n ),\n )\n .pipe(share());\n\n private readonly reTrigger$ = this.monitoringTrigger$.pipe(\n map(() => ({ quality: 'lime' as Quality })),\n );\n\n private readonly canSwitchToLowBand$ = this.monitoringTrigger$.pipe(\n debounceTime(100),\n switchMap((canSwitch) =>\n concat(\n of(false),\n timer(FilterModel.monitoringDelayTime).pipe(map(() => canSwitch)),\n ).pipe(take(2), takeUntil(this.monitoringTrigger$)),\n ),\n distinctUntilChanged(),\n tapLog('DROP: [LOWBANDWIDTH] Monitoring Active =>'),\n share(),\n );\n\n private readonly videoQuality$ = merge(\n this.nativeQuality$,\n this.reTrigger$,\n ).pipe(share(), takeUntil(this.viewPortDestroyedTrigger$));\n\n private readonly fps$ = this.aggregatedStats$.pipe(\n map((data) => data.framesPerSecond || 0),\n );\n\n private readonly bitrateDrop$ = this.aggregatedStats$.pipe(\n map((data) => data.dataFlowCheckResult),\n filter((br) => br.isDropDetected),\n takeUntil(merge(this.viewPortDestroyedTrigger$, this.reTrigger$)),\n );\n\n readonly fps = toSignal(this.fps$);\n readonly nativeQuality = toSignal(this.nativeQuality$);\n readonly isLowBandwidth = toSignal(this.isLowBandwidth$);\n readonly aggregatedStats = toSignal(this.aggregatedStats$);\n readonly isReducedQuality = signal(false);\n readonly isIndicatorExpanded = signal(false);\n\n readonly isIndicatorExpandedTrigger$ = toObservable(\n this.isIndicatorExpanded,\n ).pipe(skip(1), distinctUntilChanged(), filter(Falsy));\n\n ngOnInit() {\n this.lowBandwidthTrigger$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.toggleIndicator(true));\n\n merge(this.viewPortDestroyedTrigger$, this.highBandwidthTrigger$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.isReducedQuality.set(false));\n\n this.canSwitchToLowBand$\n .pipe(\n filter(Truthy),\n tap(() => {\n BITRATE_MONITOR.reset();\n this.isReducedQuality.set(false);\n }),\n switchMap(() => this.bitrateDrop$),\n tap(this.trySetLowBandwidth.bind(this)),\n map((dataFlowResult) => dataFlowResult?.isDropDetected),\n distinctUntilChanged(),\n tap(() => {\n this.isReducedQuality.set(true);\n }),\n switchMap(() => this.videoQuality$),\n filter((quality) => quality === 'lime'),\n tap(() => this.isReducedQuality.set(false)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe();\n }\n\n private trySetLowBandwidth(dataFlowResult: DataFlowCheckResult) {\n // Evaluate FPS and native quality\n const isFpsLow = this.fps()! < FilterModel.minimumFps;\n const isNativeQualityRed = this.nativeQuality() === 'red';\n const shouldSwitch = isNativeQualityRed || isFpsLow;\n\n // Exit if conditions are not met or already in low bandwidth\n if (!shouldSwitch || this.isLowBandwidth()) return;\n\n const { quality, activeMedian } = dataFlowResult;\n const isQualityRed = quality === 'red';\n const isLowBitrate = activeMedian < FilterModel.minimumBitrate;\n\n // Final check for red drop or low bitrate, or low FPS\n if (isQualityRed || isLowBitrate || isFpsLow) {\n let reason: string;\n\n if (isFpsLow) {\n reason = `FPS < ${FilterModel.minimumFps}`;\n } else if (quality === 'red') {\n reason = `Drop > ${FilterModel.redFlag}%`;\n } else {\n reason = `Speed < ${FilterModel.minimumBitrate}`;\n }\n\n Logger.info(\n `LBM DETECTED: ${reason}, switching to low bandwidth; `,\n dataFlowResult.message,\n );\n\n this.store.dispatch(\n changeLowBandwidth({\n lowBandwidth: true,\n stats: {\n dataFlowResult,\n reason,\n triggerTime: this.aggregatedStats()?.runTime ?? 0,\n },\n }),\n );\n }\n }\n\n toggleIndicator(value: boolean) {\n this.isIndicatorExpanded.set(value);\n\n if (value) {\n this.hideIndicatorAfterDelay();\n }\n }\n\n hideIndicatorAfterDelay() {\n timer(3000)\n .pipe(take(1), takeUntil(this.isIndicatorExpandedTrigger$))\n .subscribe(() => this.toggleIndicator(false));\n }\n\n openLBMDialog() {\n this.dialog\n .open(LowBandwidthModalComponent)\n .closed.pipe(filter(Truthy))\n .subscribe(() => {\n this.toggleIndicator(false);\n this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));\n });\n }\n}\n","@if (isReducedQuality() || isLowBandwidth()) {\n <div\n [class.expanded]=\"isIndicatorExpanded() && isLowBandwidth()\"\n class=\"lbm-indicator freeze-loader\"\n >\n <div (click)=\"toggleIndicator(true)\" class=\"lbm-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"#85888E\"\n d=\"M7.189 3.605c-.73.145-1.438.35-2.126.614A14.412 14.412 0 0 0 .896 6.666a1.08 1.08 0 0 0-.375.844c0 .34.118.629.354.865s.524.36.865.375c.34.014.65-.09.927-.313a11.89 11.89 0 0 1 3.385-1.916 10.94 10.94 0 0 1 1.235-.375l-.098-2.541ZM7.385 8.708a9.107 9.107 0 0 0-2.906 1.48c-.264.194-.402.464-.416.812-.014.347.104.646.354.896.236.236.524.364.864.385.34.02.664-.073.97-.281.422-.29.878-.53 1.368-.721a2.545 2.545 0 0 1-.166-.814l-.068-1.757ZM12.386 11.267c.094-.25.15-.52.161-.802l.068-1.755a9.019 9.019 0 0 1 2.927 1.52c.264.193.4.46.406.801.007.34-.114.635-.364.885a1.213 1.213 0 0 1-.865.365A1.614 1.614 0 0 1 13.77 12a6.574 6.574 0 0 0-1.385-.733ZM12.713 6.146l.098-2.542c.73.146 1.438.351 2.127.615 1.541.59 2.93 1.406 4.166 2.447.25.223.379.5.386.834.007.333-.115.625-.365.875a1.253 1.253 0 0 1-.864.375c-.34.014-.65-.09-.927-.313a11.892 11.892 0 0 0-3.386-1.916 10.94 10.94 0 0 0-1.235-.375ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n />\n <path\n fill=\"#fff\"\n fill-rule=\"evenodd\"\n d=\"M10 .833c-.91 0-1.637.756-1.602 1.665l.304 7.92a1.299 1.299 0 0 0 2.596 0l.305-7.92A1.604 1.604 0 0 0 10 .833ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div\n [class.lbm-message--open]=\"isLowBandwidth() && isIndicatorExpanded()\"\n class=\"lbm-message\"\n >\n <p class=\"lbm-description\">\n Fluid Interactivity Modes were disabled due to an unstable connection.\n\n <button\n (click)=\"openLBMDialog()\"\n [attr.data-testid]=\"'learn-more-lbm'\"\n type=\"button\"\n class=\"lbm-learn-more\"\n >\n Learn more\n </button>\n </p>\n <button\n (click)=\"toggleIndicator(false)\"\n [attr.data-testid]=\"'close-lbm-indicator'\"\n type=\"button\"\n class=\"lbm-close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 11.2289L6.68618 14.5428C6.51951 14.7095 6.31818 14.7895 6.08218 14.7828C5.84618 14.7755 5.64485 14.6885 5.47818 14.5218C5.31151 14.3552 5.22818 14.1505 5.22818 13.9078C5.22818 13.6645 5.31151 13.4595 5.47818 13.2928L8.77107 9.99992L5.45718 6.68603C5.29051 6.51936 5.21051 6.3147 5.21718 6.07203C5.22451 5.8287 5.31151 5.6237 5.47818 5.45703C5.64485 5.29036 5.84951 5.20703 6.09218 5.20703C6.33551 5.20703 6.54051 5.29036 6.70718 5.45703L10.0001 8.77092L13.314 5.45703C13.4806 5.29036 13.6853 5.20703 13.928 5.20703C14.1713 5.20703 14.3763 5.29036 14.543 5.45703C14.7096 5.6237 14.793 5.8287 14.793 6.07203C14.793 6.3147 14.7096 6.51936 14.543 6.68603L11.2291 9.99992L14.543 13.3138C14.7096 13.4805 14.793 13.6818 14.793 13.9178C14.793 14.1538 14.7096 14.3552 14.543 14.5218C14.3763 14.6885 14.1713 14.7718 13.928 14.7718C13.6853 14.7718 13.4806 14.6885 13.314 14.5218L10.0001 11.2289Z\"\n fill=\"white\"\n />\n </svg>\n </button>\n </div>\n </div>\n}\n\n@if (devModeService.isDevMode) {\n <app-filter-settings />\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["skip","tap","switchMap","takeUntil","map","debounceTime","first","distinctUntilChanged"],"mappings":"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"}
|