@3dsource/angular-unreal-module 0.0.113-dev.0 → 0.0.113-dev.2

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.
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ElementRef, OnInit, InjectionToken, DestroyRef, PipeTransform } from '@angular/core';
2
+ import { ElementRef, InjectionToken, DestroyRef, OnInit, PipeTransform } from '@angular/core';
3
+ import * as _3dsource_angular_unreal_module from '@3dsource/angular-unreal-module';
3
4
  import * as rxjs from 'rxjs';
4
5
  import { Observable, Subject, Subscription } from 'rxjs';
5
- import * as _3dsource_angular_unreal_module from '@3dsource/angular-unreal-module';
6
6
  import * as _ngrx_store from '@ngrx/store';
7
7
  import { Store } from '@ngrx/store';
8
8
  import * as _ngrx_effects from '@ngrx/effects';
@@ -41,7 +41,7 @@ declare class ImageLoadingSrcComponent {
41
41
  #private;
42
42
  readonly isLoaderScreenVisible: i0.Signal<boolean>;
43
43
  readonly imageLoadingSrc: i0.Signal<string>;
44
- imageError(): void;
44
+ loadingImageError(): void;
45
45
  static ɵfac: i0.ɵɵFactoryDeclaration<ImageLoadingSrcComponent, never>;
46
46
  static ɵcmp: i0.ɵɵComponentDeclaration<ImageLoadingSrcComponent, "app-image-loading-src", never, {}, {}, never, never, true, never>;
47
47
  }
@@ -72,33 +72,30 @@ declare class StatGraphComponent {
72
72
 
73
73
  declare class UnrealSceneComponent {
74
74
  #private;
75
- readonly isStudio: i0.InputSignal<boolean>;
76
75
  readonly useContainerAsSizeProvider: i0.InputSignal<boolean>;
77
- readonly studioResolutionSize: i0.InputSignal<{
78
- width: number;
79
- height: number;
80
- }>;
81
- studioResolutionValues: rxjs.Observable<{
76
+ readonly isStudio: i0.InputSignal<boolean>;
77
+ readonly resolutionSize: i0.InputSignal<{
82
78
  width: number;
83
79
  height: number;
84
80
  }>;
81
+ readonly changeMouseOverScene: i0.OutputEmitterRef<boolean>;
85
82
  readonly videoElement: i0.Signal<ElementRef<HTMLDivElement> | undefined>;
86
- changeMouseOverScene: i0.OutputEmitterRef<boolean>;
83
+ private readonly resolutionValues$;
87
84
  private width;
88
85
  private height;
89
86
  private readonly actions$;
90
- private isExistMatchUrls;
87
+ private readonly isExistMatchUrls;
91
88
  readonly isDevMode: boolean;
92
- private isFreezeFrameLoading;
89
+ private readonly isFreezeFrameLoading;
93
90
  private readonly maxResolution;
94
- private commandsSender;
95
- private videoService;
96
- private element;
97
- private destroyRef;
91
+ private readonly commandsSender;
92
+ private readonly videoService;
93
+ private readonly destroyRef;
98
94
  private get resizeValues();
99
95
  private get pixelRatio();
100
96
  onMouseOver(): void;
101
97
  onMouseOut(): void;
98
+ onContextMenu(event: Event): void;
102
99
  constructor();
103
100
  private listenResizeValues;
104
101
  private adaptVideo;
@@ -106,7 +103,7 @@ declare class UnrealSceneComponent {
106
103
  private getResizeStudioValues;
107
104
  private sendResize;
108
105
  static ɵfac: i0.ɵɵFactoryDeclaration<UnrealSceneComponent, never>;
109
- static ɵcmp: i0.ɵɵComponentDeclaration<UnrealSceneComponent, "app-unreal-scene", never, { "isStudio": { "alias": "isStudio"; "required": false; "isSignal": true; }; "useContainerAsSizeProvider": { "alias": "useContainerAsSizeProvider"; "required": false; "isSignal": true; }; "studioResolutionSize": { "alias": "studioResolutionSize"; "required": false; "isSignal": true; }; }, { "changeMouseOverScene": "changeMouseOverScene"; }, never, ["app-pdf", "app-show-case"], true, never>;
106
+ static ɵcmp: i0.ɵɵComponentDeclaration<UnrealSceneComponent, "app-unreal-scene", never, { "useContainerAsSizeProvider": { "alias": "useContainerAsSizeProvider"; "required": false; "isSignal": true; }; "isStudio": { "alias": "isStudio"; "required": false; "isSignal": true; }; "resolutionSize": { "alias": "resolutionSize"; "required": false; "isSignal": true; }; }, { "changeMouseOverScene": "changeMouseOverScene"; }, never, ["app-pdf", "app-show-case"], true, never>;
110
107
  }
111
108
 
112
109
  declare class IntroSrcComponent {
@@ -116,8 +113,8 @@ declare class IntroSrcComponent {
116
113
  protected videoIntroSrc: i0.Signal<string | null>;
117
114
  private viewportReady;
118
115
  constructor();
116
+ loadingImageError(): void;
119
117
  private createVideo;
120
- imageError(): void;
121
118
  static ɵfac: i0.ɵɵFactoryDeclaration<IntroSrcComponent, never>;
122
119
  static ɵcmp: i0.ɵɵComponentDeclaration<IntroSrcComponent, "app-intro-src", never, {}, {}, never, never, true, never>;
123
120
  }
@@ -129,12 +126,12 @@ interface GraphListItem {
129
126
  value: number;
130
127
  }>;
131
128
  }
132
- declare class VideoStatsComponent implements OnInit {
129
+ declare class VideoStatsComponent {
133
130
  readonly collapsed: i0.WritableSignal<boolean>;
134
- private store;
135
- private videoService;
136
- private isDevMode;
137
- private obs$;
131
+ private readonly store;
132
+ private readonly videoService;
133
+ private readonly isDevMode;
134
+ private readonly obs$;
138
135
  readonly viewportReady: i0.Signal<boolean>;
139
136
  readonly ssData: i0.Signal<string>;
140
137
  readonly fpsTick: i0.Signal<{
@@ -165,18 +162,15 @@ declare class VideoStatsComponent implements OnInit {
165
162
  };
166
163
  } | null | undefined;
167
164
  }[] | undefined>;
168
- fields: string[];
169
- graphList: GraphListItem[];
170
- graphList$: Observable<GraphListItem[]>;
171
- private idKey;
172
- private elementsToShow;
173
- private trigger$;
165
+ readonly fields: string[];
166
+ private readonly elementsToShow;
167
+ private readonly idKey;
168
+ private readonly graphListItems;
169
+ readonly graphList: i0.Signal<GraphListItem[]>;
174
170
  constructor();
175
- ngOnInit(): void;
176
- updateGraph(): void;
177
171
  toggle(): void;
178
172
  toggleGraph($event: MouseEvent, el: string, value?: unknown): void;
179
- private getFields;
173
+ private restoreFromStorage;
180
174
  private writeFields;
181
175
  static ɵfac: i0.ɵɵFactoryDeclaration<VideoStatsComponent, never>;
182
176
  static ɵcmp: i0.ɵɵComponentDeclaration<VideoStatsComponent, "app-video-stats", never, {}, {}, never, never, true, never>;
@@ -185,8 +179,8 @@ declare class VideoStatsComponent implements OnInit {
185
179
  declare class WebrtcErrorModalComponent {
186
180
  #private;
187
181
  readonly isCirrusConnected: i0.Signal<boolean>;
188
- close(): void;
189
182
  closeModalWithCirrusDisconnect(): void;
183
+ private close;
190
184
  static ɵfac: i0.ɵɵFactoryDeclaration<WebrtcErrorModalComponent, never>;
191
185
  static ɵcmp: i0.ɵɵComponentDeclaration<WebrtcErrorModalComponent, "app-webrtc-error-modal", never, {}, {}, never, never, true, never>;
192
186
  }
@@ -346,8 +340,10 @@ declare const DESTROY_DISCONNECT_REASONS: DisconnectReasonType[];
346
340
 
347
341
  declare const DEBOUNCE_TO_MANY_RESIZE_CALLS = 100;
348
342
  declare const SAME_SIZE_THRESHOLD = 1.01;
343
+ declare const MIN_CONTAINER_SIZE = 2;
349
344
  declare const MINIMAL_FPS = 6;
350
345
  declare const STREAMING_VIDEO_ID = "streamingVideo";
346
+ declare const STREAMING_AUDIO_ID = "streamingAudio";
351
347
  declare const CONSOLE_COMMAND_ENABLE_MESSAGES = "EnableAllScreenMessages";
352
348
  declare const CONSOLE_COMMAND_DISABLE_MESSAGES = "DisableAllScreenMessages";
353
349
  declare const CONSOLE_COMMAND_PIXEL_QUALITY = "PixelStreaming.FreezeFrameQuality 95";
@@ -598,10 +594,10 @@ type TelemetryType = 'commandSent' | 'commandStop';
598
594
  declare class SubService {
599
595
  protected readonly destroyRef: DestroyRef;
600
596
  protected readonly destroy$: Subject<void>;
601
- actions$: Actions<any>;
602
- store: Store<any>;
597
+ protected readonly actions$: Actions<any>;
598
+ protected readonly store: Store<any>;
603
599
  disconnect$: rxjs.Observable<false>;
604
- _destroy: () => void;
600
+ constructor();
605
601
  }
606
602
 
607
603
  declare class AFKService extends SubService {
@@ -610,11 +606,11 @@ declare class AFKService extends SubService {
610
606
  private countdown;
611
607
  private countdownTimer;
612
608
  private readonly warnTimeout;
609
+ private readonly isAfkTimerVisible;
613
610
  private readonly isViewportReady;
614
611
  private readonly unrealConfig;
615
612
  /** Ticks every time warnTimeout changes or resetAfk action fires */
616
613
  private readonly afkResetTrigger;
617
- /** Ticks when cirrus disconnects */
618
614
  private readonly disconnected;
619
615
  constructor();
620
616
  private hideOverlay;
@@ -639,6 +635,14 @@ declare class AFKService extends SubService {
639
635
  static ɵprov: i0.ɵɵInjectableDeclaration<AFKService>;
640
636
  }
641
637
 
638
+ declare class LoadingProgressService {
639
+ #private;
640
+ readonly loaderVisible: i0.Signal<boolean>;
641
+ readonly percents: i0.Signal<number | undefined>;
642
+ static ɵfac: i0.ɵɵFactoryDeclaration<LoadingProgressService, never>;
643
+ static ɵprov: i0.ɵɵInjectableDeclaration<LoadingProgressService>;
644
+ }
645
+
642
646
  declare class AggregatorService extends SubService {
643
647
  private readonly selectStreamConfig;
644
648
  private readonly videoService;
@@ -655,7 +659,6 @@ declare class AggregatorService extends SubService {
655
659
  protected listenWebRTC(): void;
656
660
  protected initialize(): void;
657
661
  private addResponseEventListener;
658
- private showOnScreenKeyboard;
659
662
  private removeLoadScreen;
660
663
  private startListenCallbacks;
661
664
  private showMessageFromUnreal;
@@ -767,6 +770,10 @@ declare class ConsoleExtensionsService extends SubService {
767
770
 
768
771
  declare class DevModeService {
769
772
  get isDevMode(): boolean;
773
+ /**
774
+ * Called from the browser console to toggle dev mode at runtime.
775
+ * @preserve
776
+ */
770
777
  setDevMode(value: boolean): void;
771
778
  static ɵfac: i0.ɵɵFactoryDeclaration<DevModeService, never>;
772
779
  static ɵprov: i0.ɵɵInjectableDeclaration<DevModeService>;
@@ -790,9 +797,9 @@ declare class FreezeFrameService extends SubService {
790
797
  }
791
798
 
792
799
  declare class InputService extends SubService {
793
- private commandsSender;
794
- private isDevMode;
795
- private videoService;
800
+ private readonly commandsSender;
801
+ private readonly isDevMode;
802
+ private readonly videoService;
796
803
  private readonly unrealConfig;
797
804
  readonly defaultKeys: (17 | 37 | 38 | 39 | 40 | 46 | 65 | 68 | 83 | 87 | 107 | 109 | 187 | 189)[];
798
805
  private availableKeys;
@@ -801,10 +808,10 @@ declare class InputService extends SubService {
801
808
  private deactivatedVideoTrigger$;
802
809
  private normalizeAndQuantizeUnsigned;
803
810
  private normalizeAndQuantizeSigned;
804
- videoBoundingRect: DOMRect;
805
- fingerIds: Map<any, any>;
806
- maxByteValue: number;
807
- fingers: (0 | 2 | 1 | 4 | 8 | 3 | 5 | 6 | 7 | 9)[];
811
+ private videoBoundingRect;
812
+ private fingerIds;
813
+ private maxByteValue;
814
+ private fingers;
808
815
  private offsetParams;
809
816
  constructor();
810
817
  protected init(): void;
@@ -914,7 +921,7 @@ declare class SignallingService extends SubService {
914
921
  *
915
922
  * 1. **Telemetry** — Starts a `getSignaling` span for end-to-end timing.
916
923
  * 2. **Candidate URL selection** — A stateful generator (`urlGen`) is created
917
- * from `urlsPool`. Each resubscription (e.g. via `retry`) advances to the next URL.
924
+ * from `urlsPool`. Each resubscription (e.g., via `retry`) advances to the next URL.
918
925
  * 3. **Short-circuit for WS URLs** — If the picked candidate already matches
919
926
  * `ws://` or `wss://`, emit `{ wsUrl, pollingUrl: null, instanceName: null }`
920
927
  * immediately and complete (no HTTP request).
@@ -926,7 +933,7 @@ declare class SignallingService extends SubService {
926
933
  * while the request is in flight are **ignored** until completion, preventing overlap.
927
934
  * 6. **Per-attempt timeout** — `timeout(WS_TIMEOUT)` caps how long we wait for a response.
928
935
  * On timeout, the attempt errors and the outer `retry` schedules the next URL.
929
- * 7. **Response validation & progress reporting** — A `filter`:
936
+ * 7. **Response validation and progress reporting** — A `filter`:
930
937
  * - Calls `TelemetryStop('getSignaling', { ...data, multi: true })` on receipt.
931
938
  * - If `data.signallingServer === ''` or `data.error`:
932
939
  * shows a status message, optionally dispatches `setStatusPercentSignallingServer`
@@ -943,7 +950,7 @@ declare class SignallingService extends SubService {
943
950
  *
944
951
  * ### Concurrency semantics
945
952
  *
946
- * - `exhaustMap` guarantees a **single** HTTP request per attempt; subsequent
953
+ * - `exhaustMap` guarantees a **single** HTTP request per attempt; later
947
954
  * `{clientId, viewId}` emissions are ignored until the current request completes.
948
955
  *
949
956
  * ### Telemetry semantics
@@ -977,7 +984,7 @@ declare class SignallingService extends SubService {
977
984
  * @remarks
978
985
  * - The URL generator (`urlGen`) is created **outside** `defer`, so resubscriptions
979
986
  * advance the pool. Creating it inside `defer` would restart from the first URL each retry.
980
- * - `location.protocol` is used to derive `ws` vs `wss`. If this may run in non-browser
987
+ * - `location.protocol` is used to derive `ws` vs. `wss`. If this may run in non-browser
981
988
  * contexts (e.g., SSR), guard or abstract this logic.
982
989
  * - Consider capping retries with `count` in `retry({ count, delay })` when appropriate.
983
990
  *
@@ -1088,7 +1095,7 @@ declare class StreamStatusTelemetryService2 {
1088
1095
  /**
1089
1096
  * Whether a session has already started during the current page lifetime.
1090
1097
  * Used to distinguish a fresh page load (bootstrap measurement is
1091
- * meaningful) from a Resume/restart (the document is already loaded,
1098
+ * meaningful) from a Résumé/restart (the document is already loaded,
1092
1099
  * so "bootstrap" is a no-op). Only the first session gets the bootstrap
1093
1100
  * phase anchored at navigation start (perf.now() === 0).
1094
1101
  */
@@ -1097,7 +1104,7 @@ declare class StreamStatusTelemetryService2 {
1097
1104
  * Rolling snapshot of the currently selected WebRTC ICE candidate pair
1098
1105
  * (local/remote type + url). Scanned over `videoStats$` so the stream
1099
1106
  * *keeps* the first non-null pair even if later stats emit null — WebRTC
1100
- * doesn't un-select a pair mid-session, but the source is nullable. The
1107
+ * doesn't unselect a pair mid-session, but the source is nullable. The
1101
1108
  * `startWith(null)` seed makes `withLatestFrom` on this stream safe even
1102
1109
  * before the first video stat arrives (common at data-channel-open).
1103
1110
  */
@@ -1106,7 +1113,7 @@ declare class StreamStatusTelemetryService2 {
1106
1113
  * Correlation-matched Observable: emits once when the first `loopBack`
1107
1114
  * command's corresponding `command completed` action fires. Built from
1108
1115
  * the two related actions — the command-started captures the correlation
1109
- * id, the command-completed with that id emits.
1116
+ * id; the command-completed with that id emits.
1110
1117
  */
1111
1118
  private readonly loopbackReceived$;
1112
1119
  private readonly pollingStartedEntry;
@@ -1117,7 +1124,7 @@ declare class StreamStatusTelemetryService2 {
1117
1124
  /**
1118
1125
  * Unified phase catalog — the single source of truth for everything
1119
1126
  * this service tracks after `session_started`. Each entry is a phase;
1120
- * its `milestones` array is ordered chronologically and the *last*
1127
+ * its `milestones` array is ordered chronologically, and the *last*
1121
1128
  * entry is the phase closer. When that closer's observable fires, the
1122
1129
  * service emits one generic `stream.phase_ended` wire event with every
1123
1130
  * display field the viewer needs.
@@ -1143,7 +1150,7 @@ declare class StreamStatusTelemetryService2 {
1143
1150
  * Emit the unified `stream.phase_ended` wire event for a closer. Packs
1144
1151
  * every display field the viewer consumes — phaseNo (derived from the
1145
1152
  * catalog index), label, color, milestones, params, overlays. Boundary
1146
- * labels aren't on the wire — the viewer derives them from neighbour
1153
+ * labels aren't on the wire — the viewer derives them from neighbor
1147
1154
  * phases' `label` fields.
1148
1155
  */
1149
1156
  private emitPhaseEnded;
@@ -1186,10 +1193,10 @@ declare class StreamStatusTelemetryService2 {
1186
1193
  }
1187
1194
 
1188
1195
  declare class UnrealCommunicatorService {
1189
- private store;
1190
- private actions$;
1191
- private commandTelemetryService;
1192
- private webRtcPlayerService;
1196
+ private readonly store;
1197
+ private readonly actions$;
1198
+ private readonly commandTelemetryService;
1199
+ private readonly webRtcPlayerService;
1193
1200
  private readonly unrealConfig;
1194
1201
  private destroy$;
1195
1202
  private cirrusConnected;
@@ -1222,6 +1229,7 @@ declare class UnrealCommunicatorService {
1222
1229
  }
1223
1230
 
1224
1231
  declare class VideoService extends SubService {
1232
+ private readonly isVideoPlaying;
1225
1233
  video: HTMLVideoElement | null;
1226
1234
  audio: HTMLAudioElement | null;
1227
1235
  private container;
@@ -1246,6 +1254,7 @@ declare class VideoService extends SubService {
1246
1254
  private generateAggregatedStatsFunction;
1247
1255
  private onAggregatedStats;
1248
1256
  private destroy;
1257
+ private changeStatusMainVideoOnScene;
1249
1258
  private createWebRtcVideo;
1250
1259
  private createWebRtcAudio;
1251
1260
  private playAudio;
@@ -1257,9 +1266,9 @@ declare class WebRtcPlayerService extends SubService {
1257
1266
  onDataChannelMessage$: Subject<ArrayBuffer>;
1258
1267
  private pcClient;
1259
1268
  private dcClient;
1260
- private signallingSrv;
1261
- private videoService;
1262
- private commandTelemetryService;
1269
+ private readonly signallingSrv;
1270
+ private readonly videoService;
1271
+ private readonly commandTelemetryService;
1263
1272
  private cfg;
1264
1273
  private useMic;
1265
1274
  private forceTURN;
@@ -1310,7 +1319,7 @@ declare class WebRtcPlayerService extends SubService {
1310
1319
  * RFC 6184 that encodes three H.264 parameters:
1311
1320
  * - **Profile IDC** (`XX`) — the H.264 profile.
1312
1321
  * - **Profile IOP** (`YY`) — constraint flags that further narrow the profile.
1313
- * - **Level IDC** (`ZZ`) — the level, which caps resolution/framerate/bitrate.
1322
+ * - **Level IDC** (`ZZ`) — the level which caps resolution/framerate/bitrate.
1314
1323
  *
1315
1324
  * ### H.264 profiles relevant to Unreal Engine Pixel Streaming
1316
1325
  *
@@ -1328,12 +1337,12 @@ declare class WebRtcPlayerService extends SubService {
1328
1337
  * | `f4001f` | High 4:4:4 Predictive | 3.1 | Lossless capable; rare in browsers |
1329
1338
  *
1330
1339
  * UE Pixel Streaming defaults to Constrained Baseline (`42e01f`) or High (`6400xx`)
1331
- * depending on engine version and `WebRTC.H264Profile` CVar.
1340
+ * depending on the engine version and `WebRTC.H264Profile` CVar.
1332
1341
  *
1333
1342
  * We prioritize `42e01f` because it guarantees hardware decoding on
1334
1343
  * virtually all client devices (desktop, mobile, embedded), avoiding
1335
1344
  * fallback to software decoding or negotiation of a higher profile
1336
- * that the client GPU may not accelerate.
1345
+ * that the client GPU may not speed up.
1337
1346
  */
1338
1347
  private prioritizeH264Profile;
1339
1348
  private mungeSDP;
@@ -1438,7 +1447,7 @@ declare class AnalyticsService extends SubService {
1438
1447
  * ## How it works
1439
1448
  *
1440
1449
  * The service subscribes to `VideoService.videoStats$` (emitted every 250 ms)
1441
- * and collects samples of FPS, bitrate, and QP (Quantisation Parameter).
1450
+ * and collects samples of FPS, bitrate, and QP (Quantization Parameter).
1442
1451
  * Every {@link SAMPLE_WINDOW} ticks (~2 s) it averages the collected samples
1443
1452
  * and feeds them into a set of **fuzzy-logic membership functions** that
1444
1453
  * classify each metric into overlapping quality bands.
@@ -1447,28 +1456,28 @@ declare class AnalyticsService extends SubService {
1447
1456
  *
1448
1457
  * **1. FPS ratio** = `actualFPS / currentTargetFPS` (0..1+)
1449
1458
  *
1450
- * | Band | Range | Meaning |
1459
+ * | Band | Range | Meaning |
1451
1460
  * |--------|---------------------|-----------------------------------------------|
1452
- * | low | ratio < 0.7 → 1.0, linear ramp 0.7..0.9 → 0 | Stream cannot keep up with the target |
1453
- * | ok | triangle 0.8..1.0, peak at 0.95 | Stream roughly matches the target |
1454
- * | high | ratio 0.9..1.0 → ramp, >1.0 → 1.0 | Stream meets or exceeds the target |
1461
+ * | low | ratio < 0.7 → 1.0, linear ramp 0.7..0.9 → 0 | Stream cannot keep up with the target |
1462
+ * | okays | triangle 0.8..1.0, peak at 0.95 | Stream roughly matches the target |
1463
+ * | high | ratio 0.9..1.0 → ramp, >1.0 → 1.0 | Stream meets or exceeds the target |
1455
1464
  *
1456
1465
  * **2. Bitrate load** = `currentBitrate / MAX_BITRATE` (0..1+)
1457
1466
  *
1458
1467
  * `MAX_BITRATE` = 20 Mbit/s — the reference ceiling for the encoder.
1459
1468
  *
1460
- * | Band | Range | Meaning |
1469
+ * | Band | Range | Meaning |
1461
1470
  * |--------|-------------------------------------------------|-----------------------------------------------|
1462
- * | high | load 0.5..0.8 → ramp, >0.8 → 1.0 | Encoder is using most of the available bandwidth |
1463
- * | not high | load < 0.5 → 0.0 | Bandwidth headroom is available |
1471
+ * | high | load 0.5..0.8 → ramp, >0.8 → 1.0 | Encoder is using most of the available bandwidth |
1472
+ * | not high | load < 0.5 → 0.0 | Bandwidth headroom is available |
1464
1473
  *
1465
1474
  * **3. Quality** — mapped from QP via `mapQpToQuality()` (see {@link Quality}):
1466
1475
  *
1467
- * | Quality | QP range | Meaning |
1476
+ * | Quality | QP range | Meaning |
1468
1477
  * |----------|-----------|-------------------------------------------------|
1469
- * | `lime` | QP <= 26 | Good — encoder has enough headroom |
1470
- * | `orange` | QP 27..35 | Fair — encoder is under moderate pressure |
1471
- * | `red` | QP > 35 | Poor — heavy compression, visible artefacts |
1478
+ * | `lime` | QP <= 26 | Good — encoder has enough headroom |
1479
+ * | `orange` | QP 27..35 | Fair — encoder is under moderate pressure |
1480
+ * | `red` | QP > 35 | Poor — heavy compression, visible artifacts |
1472
1481
  *
1473
1482
  * ### Decision rules (evaluated in priority order, first match wins)
1474
1483
  *
@@ -1482,17 +1491,17 @@ declare class AnalyticsService extends SubService {
1482
1491
  *
1483
1492
  * ## Cooldown-based throttling
1484
1493
  *
1485
- * The service continuously evaluates fuzzy rules every sample window.
1494
+ * The service continuously evaluates fuzzy rules in every sample window.
1486
1495
  * After each FPS step change it enforces a cooldown before the next
1487
1496
  * change can be applied. The cooldown duration depends on the
1488
1497
  * (previous decision → next decision) pair:
1489
1498
  *
1490
- * | Previous | Next | Cooldown |
1499
+ * | Previous | Next | Cooldown |
1491
1500
  * |-----------|-----------|-----------------------------------------------------|
1492
- * | decrease | decrease | {@link COOLDOWN_DECREASE_AFTER_DECREASE_MS} (2 s) |
1493
- * | decrease | increase | {@link COOLDOWN_INCREASE_AFTER_DECREASE_MS} (10 s) |
1494
- * | increase | decrease | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |
1495
- * | increase | increase | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |
1501
+ * | decrease | decrease | {@link COOLDOWN_DECREASE_AFTER_DECREASE_MS} (2 s) |
1502
+ * | decrease | increase | {@link COOLDOWN_INCREASE_AFTER_DECREASE_MS} (10 s) |
1503
+ * | increase | decrease | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |
1504
+ * | increase | increase | {@link COOLDOWN_AFTER_INCREASE_MS} (2 s) |
1496
1505
  *
1497
1506
  * This means the system reacts quickly after an increase (2 s in any
1498
1507
  * direction) but is cautious about stepping back up after a decrease
@@ -1508,7 +1517,7 @@ declare class FpsMonitorService {
1508
1517
  private videoService;
1509
1518
  private store;
1510
1519
  private readonly unrealConfig;
1511
- /** Discrete FPS targets the controller can switch between (ascending order). Last 0 is unlimited framerate indicator*/
1520
+ /** Discrete FPS targets the controller can switch between (ascending order). Last 0 is an unlimited framerate indicator*/
1512
1521
  private readonly FPS_STEPS;
1513
1522
  /**
1514
1523
  * Reference FPS used to compute the FPS ratio when `currentFpsTarget` is 0
@@ -1529,7 +1538,7 @@ declare class FpsMonitorService {
1529
1538
  private readonly COOLDOWN_DECREASE_AFTER_DECREASE_MS;
1530
1539
  /**
1531
1540
  * Cooldown (ms) for an increase following a previous decrease.
1532
- * The stream needs more time to stabilise before stepping back up.
1541
+ * The stream needs more time to stabilize before stepping back up.
1533
1542
  */
1534
1543
  private readonly COOLDOWN_INCREASE_AFTER_DECREASE_MS;
1535
1544
  /**
@@ -1562,52 +1571,52 @@ declare class FpsMonitorService {
1562
1571
  * Rules are evaluated in priority order — first match wins.
1563
1572
  *
1564
1573
  * Inputs:
1565
- * - `fpsRatio` = avgFPS / currentTargetFPS (e.g. 45/60 = 0.75)
1566
- * - `bitrateLoad` = avgBitrate / 20 Mbit/s (e.g. 12M/20M = 0.6)
1567
- * - `quality` = mapQpToQuality(avgQP) → 'lime' | 'orange' | 'red'
1574
+ * - `fpsRatio` = avgFPS / currentTargetFPS (e.g., 45/60 = 0.75)
1575
+ * - `bitrateLoad` = avgBitrate / 20 Mbit/s (e.g., 12M/20M = 0.6)
1576
+ * - `quality` = mapQpToQuality(avgQP) → 'lime' | 'orange' | 'red'
1568
1577
  */
1569
1578
  private evaluateDecision;
1570
1579
  /**
1571
1580
  * FPS ratio membership "low".
1572
- * Input: ratio = actualFPS / targetFPS (e.g. 42/60 = 0.70).
1581
+ * Input: a ratio = actualFPS / targetFPS (e.g., 42/60 = 0.70).
1573
1582
  *
1574
- * ratio < 0.7 → 1.0 (clearly failing, e.g. 40/60)
1575
- * ratio 0.7..0.9 → linear ramp down (e.g. 0.8 → 0.5)
1576
- * ratio > 0.9 → 0.0 (keeping up)
1583
+ * ratio < 0.7 → 1.0 (clearly failing, e.g., 40/60)
1584
+ * ratio 0.7..0.9 → linear ramp down (e.g., 0.8 → 0.5)
1585
+ * a ratio > 0.9 → 0.0 (keeping up)
1577
1586
  */
1578
1587
  private membershipFpsLow;
1579
1588
  /**
1580
1589
  * FPS ratio membership "ok" — triangle shape.
1581
1590
  * Input: ratio = actualFPS / targetFPS.
1582
1591
  *
1583
- * ratio < 0.8 → 0.0
1584
- * ratio 0.8..0.95 → ramp up, peak at 0.95 (e.g. 57/60)
1592
+ * ratio < 0.8 → 0.0
1593
+ * ratio 0.8..0.95 → ramp up, peak at 0.95 (e.g., 57/60)
1585
1594
  * ratio 0.95..1.0 → ramp down
1586
- * ratio > 1.0 → 0.0
1595
+ * a ratio > 1.0 → 0.0
1587
1596
  */
1588
1597
  private membershipFpsOk;
1589
1598
  /**
1590
1599
  * FPS ratio membership "high".
1591
1600
  * Input: ratio = actualFPS / targetFPS.
1592
1601
  *
1593
- * ratio < 0.9 → 0.0
1594
- * ratio 0.9..1.0 → linear ramp up (e.g. 0.95 → 0.5)
1595
- * ratio >= 1.0 → 1.0 (meeting or exceeding target, e.g. 60/60)
1602
+ * ratio < 0.9 → 0.0
1603
+ * ratio 0.9..1.0 → linear ramp up (e.g., 0.95 → 0.5)
1604
+ * a ratio >= 1.0 → 1.0 (meeting or exceeding target, e.g., 60/60)
1596
1605
  */
1597
1606
  private membershipFpsHigh;
1598
1607
  /**
1599
1608
  * Bitrate load membership "high".
1600
- * Input: load = currentBitrate / MAX_BITRATE (20 Mbit/s).
1609
+ * Input: a load = currentBitrate / MAX_BITRATE (20 Mbit/s).
1601
1610
  *
1602
- * load < 0.5 → 0.0 (below 10 Mbit/s — plenty of headroom)
1603
- * load 0.5..0.8 → linear ramp (e.g. 13M/20M = 0.65 → 0.5)
1604
- * load > 0.8 → 1.0 (above 16 Mbit/s — near capacity)
1611
+ * load < 0.5 → 0.0 (below 10 Mbit/s — plenty of headroom)
1612
+ * load 0.5..0.8 → linear ramp (e.g., 13M/20M = 0.65 → 0.5)
1613
+ * load > 0.8 → 1.0 (above 16 Mbit/s — near capacity)
1605
1614
  */
1606
1615
  private membershipBitrateHigh;
1607
1616
  private upgradeFps;
1608
1617
  /**
1609
- * Get the next FPS target based on current target and decision.
1610
- * Clamps to valid FPS_STEPS range.
1618
+ * Get the next FPS target based on the current target and decision.
1619
+ * Clamps to the valid FPS_STEPS range.
1611
1620
  */
1612
1621
  private getNextFpsTarget;
1613
1622
  /**
@@ -1857,21 +1866,6 @@ declare function getResizeValuesUniversal(params: {
1857
1866
  maxResolution: boolean;
1858
1867
  }): Area;
1859
1868
 
1860
- declare function getResizeValuesUniversalOld(params: {
1861
- pixelRatio: number;
1862
- containerWidth: number;
1863
- containerHeight: number;
1864
- maxResolution: boolean;
1865
- }): Area;
1866
- declare function getResizeStudioValuesOld(params: {
1867
- pixelRatio: number;
1868
- containerWidth: number;
1869
- containerHeight: number;
1870
- studioWidth: number;
1871
- studioHeight: number;
1872
- maxResolution: boolean;
1873
- }): Area;
1874
-
1875
1869
  /**
1876
1870
  * Rounds a number to the nearest even integer (rounding up for odd values).
1877
1871
  *
@@ -2049,7 +2043,7 @@ declare class FilterSettingsComponent implements OnInit {
2049
2043
  }
2050
2044
 
2051
2045
  declare class LowBandwidthDetectorComponent implements OnInit {
2052
- private readonly store;
2046
+ #private;
2053
2047
  private readonly dialog;
2054
2048
  private readonly destroyRef;
2055
2049
  private readonly videoService;
@@ -2121,8 +2115,8 @@ declare const commandCompleted: _ngrx_store.ActionCreator<string, (props: {
2121
2115
  } & _ngrx_store.Action<string>>;
2122
2116
 
2123
2117
  declare class CommandsEffects {
2124
- private actions$;
2125
- private unrealInitialConfig;
2118
+ private readonly actions$;
2119
+ private readonly unrealInitialConfig;
2126
2120
  listenUnrealCallbackByInitSignalling$: rxjs.Observable<{
2127
2121
  id: string;
2128
2122
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
@@ -2158,11 +2152,6 @@ interface UnrealCommandsState {
2158
2152
  }
2159
2153
  declare const commandsReducer: _ngrx_store.ActionReducer<UnrealCommandsState, _ngrx_store.Action<string>>;
2160
2154
 
2161
- declare const selectCommandsInProgress: _ngrx_store.MemoizedSelector<Record<string, any>, number, (s1: {
2162
- timeStamp: number;
2163
- command: string;
2164
- id: string;
2165
- }[]) => number>;
2166
2155
  declare const selectCommandProgress: _ngrx_store.MemoizedSelector<Record<string, any>, number, (s1: number, s2: number) => number>;
2167
2156
 
2168
2157
  declare const trackMixpanelEvent: _ngrx_store.ActionCreator<string, (props: {
@@ -2325,9 +2314,9 @@ declare const instanceReady: _ngrx_store.ActionCreator<string, () => _ngrx_store
2325
2314
  declare const regionPingFetchStart: _ngrx_store.ActionCreator<string, () => _ngrx_store.Action<string>>;
2326
2315
  /**
2327
2316
  * Dispatched once `RegionsPingService.getProviders()` returns the region
2328
- * list — i.e. the fetch step is done and the actual per-region ping
2317
+ * list — i.e., the fetch step is done and the actual per-region ping
2329
2318
  * sweep is about to start. Splits the region-discovery waterfall into
2330
- * two legs: config fetch vs ping sweep. Observability-only.
2319
+ * two legs: config fetch vs. ping sweep. Observability-only.
2331
2320
  */
2332
2321
  declare const regionPingFetchEnd: _ngrx_store.ActionCreator<string, () => _ngrx_store.Action<string>>;
2333
2322
  /**
@@ -2345,9 +2334,9 @@ declare const regionResolved: _ngrx_store.ActionCreator<string, (props: {
2345
2334
  pingsMs: number[];
2346
2335
  } & _ngrx_store.Action<string>>;
2347
2336
  /**
2348
- * Dispatched around the HTTP polling roundtrip inside `getAwsInstance`
2337
+ * Dispatched around the HTTP polling roundup inside `getAwsInstance`
2349
2338
  * (old orchestration flow). Only fires when polling is actually used
2350
- * (i.e. signaling URL is not a direct `ws://` / `wss://` endpoint).
2339
+ * (i.e., signaling URL is not a direct `ws://` / `wss://` endpoint).
2351
2340
  * Observability-only — no state change.
2352
2341
  */
2353
2342
  declare const pollingStarted: _ngrx_store.ActionCreator<string, () => _ngrx_store.Action<string>>;
@@ -2396,10 +2385,8 @@ declare const showUnrealErrorMessage: _ngrx_store.ActionCreator<string, (props:
2396
2385
  code: number | null;
2397
2386
  error?: string;
2398
2387
  } & _ngrx_store.Action<string>>;
2399
- declare const initSignalling: _ngrx_store.FunctionWithParametersType<[data?: {
2400
- resetDisconnectionReason: boolean;
2401
- } | undefined], {
2402
- resetDisconnectionReason: boolean;
2388
+ declare const initSignalling: _ngrx_store.FunctionWithParametersType<[resetDisconnectionReason?: any], {
2389
+ resetDisconnectionReason: any;
2403
2390
  } & _ngrx_store.Action<string>> & _ngrx_store.Action<string>;
2404
2391
  declare const startStream: _ngrx_store.ActionCreator<string, (props: {
2405
2392
  config: Partial<StreamConfig>;
@@ -2463,47 +2450,45 @@ declare const showResumeStreamPopup: _ngrx_store.ActionCreator<string, (props: {
2463
2450
  }) => {
2464
2451
  visible: boolean;
2465
2452
  } & _ngrx_store.Action<string>>;
2466
- declare const showAfkTimeoutPopup: _ngrx_store.ActionCreator<string, (props: {
2453
+ declare const showUserInactivityTimeoutPopup: _ngrx_store.ActionCreator<string, (props: {
2467
2454
  visible: boolean;
2468
2455
  }) => {
2469
2456
  visible: boolean;
2470
2457
  } & _ngrx_store.Action<string>>;
2471
- declare const setAfkTimeout: _ngrx_store.ActionCreator<string, (props: {
2458
+ declare const setUserInactivityTimeout: _ngrx_store.ActionCreator<string, (props: {
2472
2459
  timeout: number;
2473
2460
  }) => {
2474
2461
  timeout: number;
2475
2462
  } & _ngrx_store.Action<string>>;
2463
+ declare const resetUserInactivityTimeout: _ngrx_store.ActionCreator<string, () => _ngrx_store.Action<string>>;
2476
2464
 
2477
2465
  declare class UnrealEffects {
2478
- private actions$;
2479
- private dialog;
2480
- private http;
2481
- private store;
2482
- private isDevMode;
2483
- private scrollStrategy;
2484
- private unrealInitialConfig;
2485
- private webRtcPlayerService;
2486
- private commandsSender;
2466
+ private readonly actions$;
2467
+ private readonly dialog;
2468
+ private readonly http;
2469
+ private readonly store;
2470
+ private readonly isDevMode;
2471
+ private readonly scrollStrategy;
2472
+ private readonly unrealInitialConfig;
2473
+ private readonly webRtcPlayerService;
2474
+ private readonly commandsSender;
2487
2475
  private readonly commandTelemetryService;
2488
- private signallingService;
2489
- private videoService;
2490
- private unrealCallbackService;
2476
+ private readonly signallingService;
2477
+ private readonly videoService;
2478
+ private readonly unrealCallbackService;
2491
2479
  private dataChannelConnectionTimeout;
2492
2480
  private connectionCompleted$;
2493
2481
  private reconnectConfig;
2494
- disconnectReasonHandling$: rxjs.Observable<{
2495
- reason: _3dsource_angular_unreal_module.DisconnectReasonType;
2496
- } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2497
2482
  destroyConnections$: rxjs.Observable<{
2498
2483
  reason: _3dsource_angular_unreal_module.DisconnectReasonType;
2499
2484
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2500
- destroyRemoteConnections$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2501
2485
  changeStreamResolution$: rxjs.Observable<{
2502
2486
  width: number | null;
2503
2487
  height: number | null;
2504
2488
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2505
2489
  resetAfk$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2506
2490
  abortEstablishingConnection$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2491
+ iframeMessaging$: rxjs.Observable<string | null> & _ngrx_effects.CreateEffectMetadata;
2507
2492
  setSignalingTo100$: rxjs.Observable<{
2508
2493
  percent: number | null;
2509
2494
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
@@ -2514,20 +2499,6 @@ declare class UnrealEffects {
2514
2499
  reason: _3dsource_angular_unreal_module.DisconnectReasonType;
2515
2500
  message: string;
2516
2501
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2517
- resetCirrusOnDestroy$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2518
- destroyConnectionAndRestart$: rxjs.Observable<{
2519
- resetDisconnectionReason: boolean;
2520
- } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2521
- showUnrealError$: rxjs.Observable<{
2522
- code: number | null;
2523
- error?: string;
2524
- } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2525
- unrealReceiverReady$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2526
- initAppByDataChannelReady$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2527
- setViewportReadyBySetLoopBackCommandIsCompleted$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2528
- startStream$: rxjs.Observable<{
2529
- resetDisconnectionReason: boolean;
2530
- } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2531
2502
  /**
2532
2503
  * Effect: `forceViewportNotReady$`
2533
2504
  *
@@ -2544,6 +2515,22 @@ declare class UnrealEffects {
2544
2515
  * a visible flicker (video flashing to black).
2545
2516
  */
2546
2517
  forceViewportNotReady$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2518
+ resetCirrusOnDestroy$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2519
+ destroyRemoteConnections$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2520
+ destroyConnectionAndRestart$: rxjs.Observable<{
2521
+ resetDisconnectionReason: any;
2522
+ } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2523
+ showUnrealError$: rxjs.Observable<{
2524
+ code: number | null;
2525
+ error?: string;
2526
+ } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2527
+ unrealReceiverReady$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2528
+ initAppByDataChannelReady$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2529
+ setViewportReadyBySetLoopBackCommandIsCompleted$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2530
+ startStream$: rxjs.Observable<{
2531
+ resetDisconnectionReason: any;
2532
+ } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2533
+ resetAfkOnVideoStart$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2547
2534
  /**
2548
2535
  * Effect: `handleDataChannelClosed$`
2549
2536
  *
@@ -2551,11 +2538,15 @@ declare class UnrealEffects {
2551
2538
  * Only triggers if reconnection is enabled, onDataChannelClose is true,
2552
2539
  * and the signaling WebSocket is still connected.
2553
2540
  */
2541
+ disconnectReasonHandling$: rxjs.Observable<{
2542
+ reason: _3dsource_angular_unreal_module.DisconnectReasonType;
2543
+ } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2554
2544
  handleDataChannelClosed$: rxjs.Observable<{
2555
2545
  attempt: number;
2556
2546
  maxAttempts: number;
2557
2547
  delay?: number;
2558
2548
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2549
+ webrtcErrorModalComponent$: rxjs.Observable<false> & _ngrx_effects.CreateEffectMetadata;
2559
2550
  /**
2560
2551
  * Effect: `resetStateForPeerReconnect$`
2561
2552
  *
@@ -2588,15 +2579,10 @@ declare class UnrealEffects {
2588
2579
  setMaxFps$: rxjs.Observable<{
2589
2580
  maxFps: number;
2590
2581
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2591
- webrtcErrorModalComponent$: rxjs.Observable<false> & _ngrx_effects.CreateEffectMetadata;
2592
2582
  sendStatisticsToUnreal$: rxjs.Observable<Object> & _ngrx_effects.CreateEffectMetadata;
2593
2583
  connectToSignaling$: rxjs.Observable<WebSocket> & _ngrx_effects.CreateEffectMetadata;
2594
- /**
2595
- * Effect: `logPeerReconnectSuccess$`
2596
- *
2597
- * Logs successful peer reconnection for telemetry.
2598
- */
2599
- logPeerReconnectSuccess$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2584
+ private canPeerReconnect;
2585
+ private postToScreenLocker;
2600
2586
  static ɵfac: i0.ɵɵFactoryDeclaration<UnrealEffects, never>;
2601
2587
  static ɵprov: i0.ɵɵInjectableDeclaration<UnrealEffects>;
2602
2588
  }
@@ -2612,7 +2598,7 @@ declare const unrealFeature: {
2612
2598
  selectStreamRequestContext: _ngrx_store.MemoizedSelector<Record<string, any>, _3dsource_angular_unreal_module.StreamRequestContext | null, (featureState: _3dsource_angular_unreal_module.UnrealState) => _3dsource_angular_unreal_module.StreamRequestContext | null>;
2613
2599
  selectSsData: _ngrx_store.MemoizedSelector<Record<string, any>, _3dsource_angular_unreal_module.SignalingData | null, (featureState: _3dsource_angular_unreal_module.UnrealState) => _3dsource_angular_unreal_module.SignalingData | null>;
2614
2600
  selectStreamConfig: _ngrx_store.MemoizedSelector<Record<string, any>, _3dsource_angular_unreal_module.StreamConfig, (featureState: _3dsource_angular_unreal_module.UnrealState) => _3dsource_angular_unreal_module.StreamConfig>;
2615
- selectAfkTimeout: _ngrx_store.MemoizedSelector<Record<string, any>, number, (featureState: _3dsource_angular_unreal_module.UnrealState) => number>;
2601
+ selectUserInactivityTimeout: _ngrx_store.MemoizedSelector<Record<string, any>, number, (featureState: _3dsource_angular_unreal_module.UnrealState) => number>;
2616
2602
  selectAwsInstance: _ngrx_store.MemoizedSelector<Record<string, any>, _3dsource_angular_unreal_module.AwsInstance, (featureState: _3dsource_angular_unreal_module.UnrealState) => _3dsource_angular_unreal_module.AwsInstance>;
2617
2603
  selectIsFirstSuccessLoad: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (featureState: _3dsource_angular_unreal_module.UnrealState) => boolean>;
2618
2604
  selectIsAfkTimerVisible: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (featureState: _3dsource_angular_unreal_module.UnrealState) => boolean>;
@@ -2647,8 +2633,7 @@ declare const unrealFeature: {
2647
2633
 
2648
2634
  interface UnrealState {
2649
2635
  streamConfig: StreamConfig;
2650
- /** Custom AFK timeout (seconds) set via query param or action. Survives config resets. */
2651
- afkTimeout: number;
2636
+ userInactivityTimeout: number;
2652
2637
  awsInstance: AwsInstance;
2653
2638
  isFirstSuccessLoad: boolean;
2654
2639
  isAfkTimerVisible: boolean;
@@ -2695,8 +2680,7 @@ declare const selectWarnTimeout: _ngrx_store.MemoizedSelector<Record<string, any
2695
2680
  declare const selectIsExistMatchUrls: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: string[]) => boolean>;
2696
2681
  declare const selectIsAutostart: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: _3dsource_angular_unreal_module.StreamConfig) => boolean>;
2697
2682
  declare const selectShowReconnectPopup: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
2698
- declare const selectShowLoader: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean, s3: boolean) => boolean>;
2699
- declare const selectIsVideoPlayingAndDataChannelConnected: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
2683
+ declare const selectShowLoader: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
2700
2684
  declare const selectSignalingParameters: _ngrx_store.MemoizedSelector<Record<string, any>, string, (s1: _3dsource_angular_unreal_module.SignalingData | null, s2: _3dsource_angular_unreal_module.AwsInstance) => string>;
2701
2685
  declare const selectClientAndViewIds: _ngrx_store.MemoizedSelector<Record<string, any>, {
2702
2686
  clientId: string | null;
@@ -2705,12 +2689,21 @@ declare const selectClientAndViewIds: _ngrx_store.MemoizedSelector<Record<string
2705
2689
  clientId: string | null;
2706
2690
  viewId: string | null;
2707
2691
  }>;
2708
- declare const selectIsLoaderScreenVisible: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean, s3: boolean) => boolean>;
2692
+ declare const selectIsFullyConnected: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean, s3: boolean) => boolean>;
2693
+ declare const selectIsLoaderScreenVisible: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean) => boolean>;
2709
2694
  declare const selectCirrusConnectionId: _ngrx_store.MemoizedSelector<Record<string, any>, string | undefined, (s1: _3dsource_angular_unreal_module.SignalingData | null) => string | undefined>;
2710
2695
  /**
2711
- * Returns Scene load progress as a float value in between 0-1
2696
+ * Returns Scene load progress as a float value between 0 and 1.
2697
+ *
2698
+ * Progress is split into two phases:
2699
+ * 1. **Signaling** (0 → ~56%): connection polling or orchestration progress.
2700
+ * Starts at 0.1%, so the bar is never visually empty while connecting.
2701
+ * 2. **Commands** (~56% → 100%): Unreal command progress after the data channel connects.
2702
+ *
2703
+ * The split point bumps by +1% once the WebSocket URL is known,
2704
+ * producing a small visual step that indicates the WS handshake succeeded.
2712
2705
  */
2713
2706
  declare const selectTotalProgress: _ngrx_store.MemoizedSelector<Record<string, any>, number, (s1: number | null, s2: number, s3: _3dsource_angular_unreal_module.AwsInstance, s4: boolean) => number>;
2714
2707
 
2715
- export { AFKService, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, CommandTelemetryService, CommandsEffects, ConfigHandler, ConsoleExtensionsService, ControlScheme, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DEFAULT_RECONNECT_DELAY_MS, DEFAULT_RECONNECT_ENABLED, DEFAULT_RECONNECT_MAX_ATTEMPTS, DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE, DEFAULT_RECONNECT_ON_ICE_FAILURE, DESTROY_DISCONNECT_REASONS, DataFlowMonitor, DevModeService, DisconnectReason, FULL_HD_HEIGHT, FULL_HD_WIDTH, FileHandlerService, FileReceiverService, FilterSettingsComponent, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, KalmanFilter1D, LatencyTimings, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MessageType, MouseButton, MouseButtonsMask, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PingHandler, PlayerCountHandler, RegionsPingService, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryService, StreamStatusTelemetryService2, SubService, ToClientMessage, UNREAL_CONFIG, UnrealCallbackService, UnrealCommunicatorService, UnrealEffects, UnrealSceneComponent, UnrealStatusMessage, VideoService, VideoStatsComponent, WSCloseCode_CIRRUS_ABNORMAL_CLOSURE, WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR, WSCloseCode_CIRRUS_PLAYER_DISCONNECTED, WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER, WSCloseCode_FORCE_CIRRUS_CLOSE, WSCloseCode_NORMAL_AFK_TIMEOUT, WSCloseCode_NORMAL_CLOSURE, WSCloseCode_NORMAL_MANUAL_DISCONNECT, WSCloseCode_UNKNOWN, WSCloseCodes, WS_OPEN_STATE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, abortEstablishingConnection, answerSent, changeStatusMainVideoOnScene, changeStreamResolutionAction, changeStreamResolutionSuccessAction, commandCompleted, commandStarted, commandsFeature, commandsReducer, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, dropDC, dropPC, floatToSmoothPercents, forceResizeViewport, fromResizeObserver, getActiveUrl, getImageFromVideoStream, getResizeStudioValues, getResizeStudioValuesOld, getResizeValuesUniversal, getResizeValuesUniversalOld, getRtcErrorMessage, iceConnectionFailed, initSignalling, instanceReady, keepMaxUntilReset, makeEven, pollingEnded, pollingStarted, provideUnrealModule, qpToQuality, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, regionPingFetchEnd, regionPingFetchStart, regionResolved, resetAfk, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetWarnTimeout, saveAnalyticsEvent, selectCirrusConnectionId, selectClientAndViewIds, selectCommandProgress, selectCommandsInProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsLoaderScreenVisible, selectIsVideoPlayingAndDataChannelConnected, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectWarnTimeout, setAfkTimeout, setAfkTimerCountdown, setAfkTimerHide, setAfkTimerVisible, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setOrchestrationContext, setOrchestrationMessage, setOrchestrationParameters, setOrchestrationProgress, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealPlaywrightConfig, setViewportNotReady, setViewportReady, showAfkTimeoutPopup, showLoadingProgress, showResumeStreamPopup, showUnrealErrorMessage, smoothTransition, startStream, trackMixpanelEvent, trackTelemetryData, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
2708
+ export { AFKService, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, CommandTelemetryService, CommandsEffects, ConfigHandler, ConsoleExtensionsService, ControlScheme, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DEFAULT_RECONNECT_DELAY_MS, DEFAULT_RECONNECT_ENABLED, DEFAULT_RECONNECT_MAX_ATTEMPTS, DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE, DEFAULT_RECONNECT_ON_ICE_FAILURE, DESTROY_DISCONNECT_REASONS, DataFlowMonitor, DevModeService, DisconnectReason, FULL_HD_HEIGHT, FULL_HD_WIDTH, FileHandlerService, FileReceiverService, FilterSettingsComponent, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, KalmanFilter1D, LatencyTimings, LoadingProgressService, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MIN_CONTAINER_SIZE, MessageType, MouseButton, MouseButtonsMask, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PingHandler, PlayerCountHandler, RegionsPingService, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_AUDIO_ID, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryService, StreamStatusTelemetryService2, SubService, ToClientMessage, UNREAL_CONFIG, UnrealCallbackService, UnrealCommunicatorService, UnrealEffects, UnrealSceneComponent, UnrealStatusMessage, VideoService, VideoStatsComponent, WSCloseCode_CIRRUS_ABNORMAL_CLOSURE, WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR, WSCloseCode_CIRRUS_PLAYER_DISCONNECTED, WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER, WSCloseCode_FORCE_CIRRUS_CLOSE, WSCloseCode_NORMAL_AFK_TIMEOUT, WSCloseCode_NORMAL_CLOSURE, WSCloseCode_NORMAL_MANUAL_DISCONNECT, WSCloseCode_UNKNOWN, WSCloseCodes, WS_OPEN_STATE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, abortEstablishingConnection, answerSent, changeStatusMainVideoOnScene, changeStreamResolutionAction, changeStreamResolutionSuccessAction, commandCompleted, commandStarted, commandsFeature, commandsReducer, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, dropDC, dropPC, floatToSmoothPercents, forceResizeViewport, fromResizeObserver, getActiveUrl, getImageFromVideoStream, getResizeStudioValues, getResizeValuesUniversal, getRtcErrorMessage, iceConnectionFailed, initSignalling, instanceReady, keepMaxUntilReset, makeEven, pollingEnded, pollingStarted, provideUnrealModule, qpToQuality, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, regionPingFetchEnd, regionPingFetchStart, regionResolved, resetAfk, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetUserInactivityTimeout, resetWarnTimeout, saveAnalyticsEvent, selectCirrusConnectionId, selectClientAndViewIds, selectCommandProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsFullyConnected, selectIsLoaderScreenVisible, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectWarnTimeout, setAfkTimerCountdown, setAfkTimerHide, setAfkTimerVisible, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setOrchestrationContext, setOrchestrationMessage, setOrchestrationParameters, setOrchestrationProgress, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealPlaywrightConfig, setUserInactivityTimeout, setViewportNotReady, setViewportReady, showLoadingProgress, showResumeStreamPopup, showUnrealErrorMessage, showUserInactivityTimeoutPopup, smoothTransition, startStream, trackMixpanelEvent, trackTelemetryData, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
2716
2709
  export type { AggregatedStat, AnySignalingMessage, AwsInstance, CandidateMessage, CloseReason, ConfigMessage, ConnectionError, ControlSchemeValues, DataFlowCheckResult, DisconnectReasonType, EmittedMilestone, ForceClientDisconnect, FreezeFrameMessage, InboundVideoStats, InputProps, InstanceReady, InstanceReserved, InterruptClientStream, ListStreamersMessage, MessageBase, MessageTypeValues, NormalizeAndQuantizeSignedValue, NormalizeAndQuantizeUnsignedValue, OrchestrationErrorMessage, OrchestrationMessageType, P2PEstablishedMessage, PhaseOverlay, PhaseParam, PingMessage, PlayerCountMessage, PollingOrchestrationMessage, Quality, ReceivedFile, ReconnectConfig, RequestStream, SSInfo, SelectedIceCandidatePair, SignalingData, SignalingMessageHandler, SignalingMessageMap, StreamConfig, StreamRequestContext, StreamResolutionProps, StreamerListMessage, TelemetryType, UnknownFields, UnquantizeAndDenormalizeUnsignedValue, UnrealCallbackDescriptor, UnrealCallbackEventMap, UnrealCallbackJson, UnrealCallbackJsonWrapped, UnrealCommandsState, UnrealInitialConfig, UnrealState, WSCloseCodesValues, streamPreparedForUserInteractionMessage };