@3dsource/angular-unreal-module 0.0.170 → 0.0.172

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3dsource/angular-unreal-module",
3
- "version": "0.0.170",
3
+ "version": "0.0.172",
4
4
  "description": "Angular integration for Unreal Engine Pixel Streaming",
5
5
  "keywords": [
6
6
  "3dsource",
@@ -1,8 +1,8 @@
1
+ import * as _3dsource_angular_unreal_module from '@3dsource/angular-unreal-module';
1
2
  import * as i0 from '@angular/core';
2
- import { ElementRef, Signal, InjectionToken, DestroyRef, PipeTransform } from '@angular/core';
3
+ import { Signal, TemplateRef, ElementRef, InjectionToken, DestroyRef, PipeTransform } from '@angular/core';
3
4
  import * as _ngrx_store from '@ngrx/store';
4
5
  import { Store } from '@ngrx/store';
5
- import * as _3dsource_angular_unreal_module from '@3dsource/angular-unreal-module';
6
6
  import * as rxjs from 'rxjs';
7
7
  import { Subject, Observable, Subscription, OperatorFunction } from 'rxjs';
8
8
  import * as _ngrx_effects from '@ngrx/effects';
@@ -11,15 +11,68 @@ import { IKeyCode, ImageOutputValues, Area } from '@3dsource/utils';
11
11
  import { SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';
12
12
  import { MetaBoxCommandPacket, MetaBoxCommandList, MetaBoxCallbackList, FOnSceneStateCallback, FOnFocusObjectCallback, FCameraChangedCallback, FOnObjectTransformChangedCallback, FOnChangeSequenceChangedCallback, FOnFinishSequenceChangedCallback } from '@3dsource/types-unreal';
13
13
 
14
+ /**
15
+ * What a slot template receives as `let-ctx`. `ngTemplateOutletContext` is keyed,
16
+ * so the payload travels under `$implicit`.
17
+ */
18
+ interface UnrealSlotTemplateContext<T> {
19
+ $implicit: T;
20
+ }
21
+ /**
22
+ * Values handed to a host template. Everything reactive is a Signal, so the
23
+ * context object itself is created once and never replaced.
24
+ */
25
+ interface UnrealResumeSlotContext {
26
+ isSecondStart: Signal<boolean | undefined>;
27
+ isAfkDisconnect: Signal<boolean>;
28
+ start(): void;
29
+ }
30
+ interface UnrealAfkSlotContext {
31
+ /** Seconds left before the session times out. */
32
+ countdown: Signal<number>;
33
+ reset(): void;
34
+ }
35
+ interface UnrealStatusSlotContext {
36
+ /** Smoothed loading percentage; undefined until the first value arrives. */
37
+ percents: Signal<number | undefined>;
38
+ message: Signal<string | undefined>;
39
+ }
40
+
41
+ declare class UnrealResumeSlotDirective {
42
+ readonly template: TemplateRef<UnrealSlotTemplateContext<UnrealResumeSlotContext>>;
43
+ static ngTemplateContextGuard(_dir: UnrealResumeSlotDirective, _ctx: unknown): _ctx is UnrealSlotTemplateContext<UnrealResumeSlotContext>;
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<UnrealResumeSlotDirective, never>;
45
+ static ɵdir: i0.ɵɵDirectiveDeclaration<UnrealResumeSlotDirective, "ng-template[unrealResumeSlot]", never, {}, {}, never, never, true, never>;
46
+ }
47
+ declare class UnrealAfkSlotDirective {
48
+ readonly template: TemplateRef<UnrealSlotTemplateContext<UnrealAfkSlotContext>>;
49
+ static ngTemplateContextGuard(_dir: UnrealAfkSlotDirective, _ctx: unknown): _ctx is UnrealSlotTemplateContext<UnrealAfkSlotContext>;
50
+ static ɵfac: i0.ɵɵFactoryDeclaration<UnrealAfkSlotDirective, never>;
51
+ static ɵdir: i0.ɵɵDirectiveDeclaration<UnrealAfkSlotDirective, "ng-template[unrealAfkSlot]", never, {}, {}, never, never, true, never>;
52
+ }
53
+ declare class UnrealStatusSlotDirective {
54
+ readonly template: TemplateRef<UnrealSlotTemplateContext<UnrealStatusSlotContext>>;
55
+ static ngTemplateContextGuard(_dir: UnrealStatusSlotDirective, _ctx: unknown): _ctx is UnrealSlotTemplateContext<UnrealStatusSlotContext>;
56
+ static ɵfac: i0.ɵɵFactoryDeclaration<UnrealStatusSlotDirective, never>;
57
+ static ɵdir: i0.ɵɵDirectiveDeclaration<UnrealStatusSlotDirective, "ng-template[unrealStatusSlot]", never, {}, {}, never, never, true, never>;
58
+ }
59
+
60
+ type AfkSlotTemplate = TemplateRef<UnrealSlotTemplateContext<UnrealAfkSlotContext>>;
14
61
  declare class AfkTimeoutModalComponent {
15
62
  #private;
16
63
  readonly isAfkTimerVisible: i0.Signal<boolean>;
17
64
  readonly showAfkTimeoutPopup: i0.Signal<boolean>;
18
65
  readonly afkCountdown: i0.Signal<number>;
19
66
  readonly isShowAfkPopup: i0.Signal<boolean>;
67
+ readonly uiClasses: i0.InputSignal<Partial<Record<_3dsource_angular_unreal_module.UnrealUiPart, string | string[]>>>;
68
+ readonly contentTemplate: i0.InputSignal<AfkSlotTemplate | null>;
69
+ protected readonly scrimSkin: i0.Signal<string | string[]>;
70
+ protected readonly cardSkin: i0.Signal<string | string[]>;
71
+ protected readonly buttonSkin: i0.Signal<string | string[]>;
72
+ protected readonly slotContext: UnrealAfkSlotContext;
20
73
  resetAfk(): void;
21
74
  static ɵfac: i0.ɵɵFactoryDeclaration<AfkTimeoutModalComponent, never>;
22
- static ɵcmp: i0.ɵɵComponentDeclaration<AfkTimeoutModalComponent, "app-afk-timeout-modal", never, {}, {}, never, never, true, never>;
75
+ static ɵcmp: i0.ɵɵComponentDeclaration<AfkTimeoutModalComponent, "app-afk-timeout-modal", never, { "uiClasses": { "alias": "uiClasses"; "required": false; "isSignal": true; }; "contentTemplate": { "alias": "contentTemplate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
23
76
  }
24
77
 
25
78
  declare class FreezeFrameComponent {
@@ -72,6 +125,11 @@ declare class UnrealSceneComponent {
72
125
  height: number;
73
126
  }>;
74
127
  readonly changeMouseOverScene: i0.OutputEmitterRef<boolean>;
128
+ /** Host classes replacing the built-in decoration of the scene overlays. */
129
+ readonly uiClasses: i0.InputSignal<Partial<Record<_3dsource_angular_unreal_module.UnrealUiPart, string | string[]>>>;
130
+ protected readonly resumeSlot: i0.Signal<UnrealResumeSlotDirective | undefined>;
131
+ protected readonly afkSlot: i0.Signal<UnrealAfkSlotDirective | undefined>;
132
+ protected readonly statusSlot: i0.Signal<UnrealStatusSlotDirective | undefined>;
75
133
  readonly videoElement: i0.Signal<ElementRef<HTMLDivElement> | undefined>;
76
134
  private readonly resolutionValues$;
77
135
  private width;
@@ -100,7 +158,7 @@ declare class UnrealSceneComponent {
100
158
  private getResizeStudioValues;
101
159
  private sendResize;
102
160
  static ɵfac: i0.ɵɵFactoryDeclaration<UnrealSceneComponent, never>;
103
- 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>;
161
+ 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; }; "uiClasses": { "alias": "uiClasses"; "required": false; "isSignal": true; }; }, { "changeMouseOverScene": "changeMouseOverScene"; }, ["resumeSlot", "afkSlot", "statusSlot"], ["app-pdf", "app-show-case"], true, never>;
104
162
  }
105
163
 
106
164
  declare class IntroSrcComponent {
@@ -860,6 +918,15 @@ type StreamTelemetryTrackData<K extends StreamTelemetryEventName> = Omit<StreamT
860
918
  /** Payload a caller supplies to `emitLifecycle()` — `duration` is computed. */
861
919
  type StreamTelemetryLifecycleData<K extends StreamTelemetryLifecycleEventName> = Omit<StreamTelemetryEventMap[K], 'userId' | 'duration'>;
862
920
 
921
+ /**
922
+ * Parts of the module UI a host application can restyle by supplying its own
923
+ * class. Each part has a built-in "skin" class that the host class REPLACES —
924
+ * the positioning class next to it always stays, so the scene layout cannot be
925
+ * broken from the outside.
926
+ */
927
+ type UnrealUiPart = 'resumeCard' | 'resumeText' | 'resumeButton' | 'afkScrim' | 'afkCard' | 'afkButton' | 'statusCard' | 'statusMessage';
928
+ type UnrealUiClasses = Partial<Record<UnrealUiPart, string | string[]>>;
929
+
863
930
  type TelemetryType = 'commandSent' | 'commandStop';
864
931
 
865
932
  interface AggregatedStat {
@@ -1362,6 +1429,7 @@ declare class SignallingService extends SubService {
1362
1429
  abort$: Observable<_ngrx_store.Action<string>>;
1363
1430
  private ws;
1364
1431
  private controlWs;
1432
+ private handedOverControlWs;
1365
1433
  orchestrationRetrySub?: Subscription;
1366
1434
  orchestrationRetryCount: number;
1367
1435
  private wsMsgHandlers;
@@ -1370,43 +1438,26 @@ declare class SignallingService extends SubService {
1370
1438
  protected init(): void;
1371
1439
  connectToSignaling(urlList: string[]): Observable<WebSocket>;
1372
1440
  /**
1373
- * One inner cycle: rotate `urlGen` over the pool, resolve via
1374
- * {@link requestCirrus}, open WS via {@link connectToCirrus},
1375
- * retry up to {@link INNER_RETRY_LIMIT} on any hard failure. The
1376
- * urlGen lives in this closure so retries advance through the
1377
- * pool. Exhaustion bubbles to {@link connectToSignaling}'s outer
1378
- * retry which re-pings the region.
1441
+ * One inner cycle: {@link requestCirrus} → {@link connectToCirrus}, retried up to
1442
+ * {@link INNER_RETRY_LIMIT}. `urlGen` lives in this closure so retries advance
1443
+ * through the pool; exhaustion bubbles to the outer region-repick retry.
1379
1444
  */
1380
1445
  private connectAttempt;
1381
1446
  /**
1382
- * Status message for the connect branch. It does NOT dispatch
1383
- * `setEstablishingConnection` — `UnrealEffects.connectToSignaling$` already
1384
- * emits that once per logical attempt via `startWith(...)`, covering BOTH
1385
- * branches (prefetch adoption and a fresh connect). Dispatching it here as
1386
- * well fired the boundary twice on every cold start, and since
1387
- * `StreamStatusTelemetryService2` starts a session on that boundary, the
1388
- * first session was killed 2 ms in as `restart` — losing the only honest
1389
- * page-load measurement and the prefetch adoption with it.
1447
+ * Status message only — must NOT dispatch `setEstablishingConnection`, which
1448
+ * `UnrealEffects.connectToSignaling$` already emits once per logical attempt for
1449
+ * both branches. Dispatching it here too fired that boundary twice on cold start,
1450
+ * and `StreamStatusTelemetryService2` starts a session on it — so the first
1451
+ * session died 2 ms in as `restart`, taking the page-load measurement with it.
1390
1452
  */
1391
1453
  protected startEstablishingConnection(): void;
1392
1454
  private adaptUrlsToRegion;
1393
1455
  /**
1394
- * Ask the orchestration for a Cirrus to connect to. All three
1395
- * implementations answer the same question — "which Cirrus, and with which
1396
- * `streamRequestId`?" — and emit ONE `AwsInstance` whose `wsUrl` is a Cirrus
1397
- * address. What differs is only how the answer is obtained and therefore how
1398
- * it can fail:
1399
- *
1400
- * | Method | Transport | Fails on |
1401
- * | -------------------------- | -------------------- | ------------------------------ |
1402
- * | {@link requestCirrusViaPolling} | HTTP poll loop | HTTP 4xx (dead URL) |
1403
- * | {@link requestCirrusViaSocket} | control WS | socket drop / no `instanceReady` in {@link INSTANCE_READY_TIMEOUT} |
1404
- * | {@link requestCirrusDirect} | none (dev) | never — nothing is requested |
1405
- *
1406
- * Whatever they return goes through the SAME downstream in
1407
- * {@link connectAttempt}: `setAwsInstance` → `connectToCirrus` → the WS-only
1408
- * and URL-rotating retry tiers. A failure inside any of them is just an
1409
- * error on this observable, so those tiers handle it uniformly.
1456
+ * Ask the orchestration for a Cirrus to connect to. All three implementations
1457
+ * answer the same question — which Cirrus, with which `streamRequestId` — and emit
1458
+ * ONE `AwsInstance` whose `wsUrl` is a Cirrus address, so {@link connectAttempt}
1459
+ * treats them uniformly: a failure in any of them is just an error here, which its
1460
+ * retry tiers already handle. Per-transport failure surface: SIGNALLING.md.
1410
1461
  */
1411
1462
  private requestCirrus;
1412
1463
  /** True when `requestStream` can be composed → new orchestration. */
@@ -1423,38 +1474,32 @@ declare class SignallingService extends SubService {
1423
1474
  */
1424
1475
  private requestCirrusDirect;
1425
1476
  /**
1426
- * HTTP-orchestration path. Brackets {@link pollLoop} with the
1427
- * `pollingStarted`/`pollingEnded` actions and the `EXT-getSignaling`
1428
- * telemetry span (start in `defer`, stop in `finalize` with the
1429
- * last response captured in the closure). Maps the final ready
1430
- * response to an `AwsInstance`.
1477
+ * HTTP-orchestration path. Brackets {@link pollLoop} with `pollingStarted`/
1478
+ * `pollingEnded` and the `EXT-getSignaling` telemetry span (started in `defer`,
1479
+ * stopped in `finalize` with the last response from the closure).
1431
1480
  */
1432
1481
  private requestCirrusViaPolling;
1433
1482
  /**
1434
- * WS-orchestration path — the socket-transport twin of
1435
- * {@link requestCirrusViaPolling}. Opens the control socket, sends
1436
- * `requestStream` and waits for `instanceReady`, whose `originInstanceUri`
1437
- * IS the Cirrus address.
1483
+ * WS-orchestration path — the socket twin of {@link requestCirrusViaPolling}.
1484
+ * Opens the control socket, sends `requestStream`, waits for `instanceReady`
1485
+ * whose `originInstanceUri` IS the Cirrus address.
1438
1486
  *
1439
- * Failure modes are handled here so they surface as a plain error and reach
1440
- * `connectAttempt`'s retry tiers (previously this branch lived outside them
1441
- * and a dead control socket silently hung the session):
1442
- * - control socket closes/errors before `instanceReady` → error
1443
- * - no `instanceReady` within {@link INSTANCE_READY_TIMEOUT} → error
1444
- *
1445
- * The control socket lives exactly as long as this wait — see
1446
- * {@link awaitInstanceReady}.
1487
+ * Both failure modes — socket drop before `instanceReady`, or no `instanceReady`
1488
+ * within {@link INSTANCE_READY_TIMEOUT} — must surface as a plain error so
1489
+ * `connectAttempt`'s retry tiers see them; without that a dead control socket
1490
+ * hangs the session silently. See {@link awaitInstanceReady}.
1447
1491
  */
1448
1492
  private requestCirrusViaSocket;
1449
1493
  /**
1450
1494
  * Send `requestStream` on the freshly opened control socket and resolve with
1451
1495
  * the machine coordinates from `instanceReady`.
1452
1496
  *
1453
- * The socket lives exactly as long as this wait: its close/error are HARD
1454
- * failures of the request, and on resolution it is closed with every handler
1455
- * detached (the backend does not use it after the handover). So the control
1456
- * socket has no post-handover state at all — nothing that could report a stale
1457
- * "disconnect" against a live stream.
1497
+ * A race between one answer and two failure signals — until `instanceReady` the
1498
+ * socket's close/error are HARD failures of the request. On success it is handed
1499
+ * over, not closed: {@link handOverControlWs}.
1500
+ *
1501
+ * `on*` properties rather than `fromEvent`: that is how the rest of the file
1502
+ * attaches, and how `teardownSocket` detaches.
1458
1503
  */
1459
1504
  private awaitInstanceReady;
1460
1505
  /**
@@ -1468,38 +1513,49 @@ declare class SignallingService extends SubService {
1468
1513
  * | HTTP 4xx (except 429) | ❌ Hard | Re-throw → caller rotates URL |
1469
1514
  * | HTTP 5xx / 429 / timeout / network | ⚠️ Soft | `EMPTY` → `repeat` same URL |
1470
1515
  *
1471
- * `data.error` is NOT treated as fatal — the backend reuses it for
1472
- * progress strings like `"Ready in ~2m 23s"`. The only fatal exits
1473
- * are HTTP 4xx and `abort$` upstream.
1516
+ * `data.error` is NOT fatal — the backend reuses it for progress strings like
1517
+ * `"Ready in ~2m 23s"`. Only HTTP 4xx and upstream `abort$` are fatal.
1474
1518
  */
1475
1519
  private pollLoop;
1476
1520
  private connectToCirrus;
1477
1521
  /**
1478
- * Handlers for the CIRRUS socket — the only long-lived socket. Its close/error
1479
- * are real stream events (`setCirrusDisconnected` / `dropConnection`), unlike
1480
- * the control socket's, which never outlives {@link awaitInstanceReady}.
1522
+ * Handlers for the CIRRUS socket — the only socket whose close/error are real
1523
+ * stream events (`setCirrusDisconnected` / `dropConnection`). The control socket
1524
+ * outlives {@link awaitInstanceReady} too, but with a log-only `onclose`.
1481
1525
  */
1482
1526
  private addWsHandlers;
1483
1527
  /**
1484
- * Adopt a live signalling socket opened by the `stream-prefetch.js`
1485
- * head-script. The socket is already OPEN and `requestStream` was already
1486
- * sent, so — unlike {@link addWsHandlers} — we attach message/close/error
1487
- * handlers but deliberately skip {@link OnOpenHandler} (which would
1488
- * `setCirrusConnected` + re-`sendRequestStream`). Reuses the head-script's
1489
- * `correlationId` so subsequent correlated messages line up.
1528
+ * Adopt a live socket from the `stream-prefetch.js` head-script. Already OPEN with
1529
+ * `requestStream` sent, so unlike {@link addWsHandlers} this skips
1530
+ * {@link OnOpenHandler} (which would re-`setCirrusConnected`). Reuses the
1531
+ * head-script's `correlationId` so correlated messages line up.
1490
1532
  */
1491
1533
  adoptSocket(ws: WebSocket, correlationId: string): void;
1492
1534
  private showStatusMessage;
1493
1535
  /**
1494
- * Close everything: the Cirrus socket AND the orchestration control socket.
1495
- * Used on abort/teardown. A new connection attempt inside a live cycle uses
1496
- * {@link closeCirrus} instead, so it does not kill the control socket that
1497
- * produced the address it is about to connect to.
1536
+ * Abort/teardown: closes the Cirrus socket AND the control one, handed over or
1537
+ * not (`abort$` fans in `setCirrusDisconnected` / `dropConnection` /
1538
+ * `destroyUnrealScene`). A new attempt inside a live cycle uses
1539
+ * {@link closeCirrus}, so it does not kill the socket that produced the address
1540
+ * it is about to connect to.
1498
1541
  */
1499
1542
  close(data: CloseReason): void;
1500
1543
  /** Close only the Cirrus signalling socket. */
1501
1544
  private closeCirrus;
1545
+ /**
1546
+ * No control socket survives this — the live one AND one left open by a handover,
1547
+ * so callers need no extra knowledge about which state it is in.
1548
+ */
1502
1549
  private teardownControlWs;
1550
+ /**
1551
+ * Handover, not teardown: strip the handlers, leave the socket OPEN for
1552
+ * orchestration to close (SIGNALLING.md). Moving it out of `controlWs` is what
1553
+ * closes the send path; dropping `onmessage` is what stops a late `error`
1554
+ * (4001/4002) from arming a resend and reserving a second machine.
1555
+ *
1556
+ * Takes the socket explicitly so it is provably the caller's.
1557
+ */
1558
+ private handOverControlWs;
1503
1559
  private teardownSocket;
1504
1560
  /**
1505
1561
  * Player signalling (offer/answer/iceCandidate/pong/p2pEstablished/subscribe)
@@ -1511,31 +1567,28 @@ declare class SignallingService extends SubService {
1511
1567
  private sendTo;
1512
1568
  protected handleMessage(msg: MessageBase): void;
1513
1569
  /**
1514
- * One handler map shared by both sockets — `handleMessage` dispatches purely by
1515
- * message type. Which socket a type can arrive on is fixed, so registration is
1516
- * split by origin: {@link setOrchestrationHandlers} (control socket) and
1517
- * {@link setStreamHandlers} (Cirrus).
1570
+ * One map shared by both sockets — `handleMessage` dispatches purely by type, so
1571
+ * registration is split by origin only for readability.
1518
1572
  *
1519
- * Keepalive is deliberately absent: both servers ping at the WS **protocol**
1520
- * level (`ws.ping()`), which the browser answers on its own — the page never
1521
- * sees a ping and must never reply with an application-level `pong`. An
1522
- * unregistered type is dropped silently by `handleMessage`, so a `ping` from a
1523
- * not-yet-updated backend is simply ignored.
1573
+ * Keepalive is deliberately absent: both servers ping at the WS **protocol** level,
1574
+ * which the browser answers itself, so the page must never reply with an
1575
+ * application-level `pong`. An unregistered type is dropped silently, so a `ping`
1576
+ * from a not-yet-updated backend is simply ignored.
1524
1577
  */
1525
1578
  private setMessageHandlers;
1526
1579
  /**
1527
1580
  * Messages from the ORCHESTRATION control socket. Only reachable during the
1528
- * provisioning wait — `requestCirrusViaSocket` closes that socket the moment
1529
- * `instanceReady` lands.
1581
+ * provisioning wait: the socket outlives `instanceReady`, but `handOverControlWs`
1582
+ * drops its `onmessage`, so nothing routes here afterwards.
1530
1583
  */
1531
1584
  private setOrchestrationHandlers;
1532
1585
  /** Messages from the CIRRUS socket — the actual stream signalling. */
1533
1586
  private setStreamHandlers;
1534
1587
  protected sendRequestStream(): void;
1535
1588
  /**
1536
- * Is the player-signalling socket open? Always the Cirrus socket — the
1537
- * control socket's state is irrelevant to the stream (orchestration closes it
1538
- * once the instance is occupied), so it must not be part of this gate.
1589
+ * Cirrus only — the control socket's state says nothing about the stream
1590
+ * (orchestration closes it once the instance is occupied), so it must stay out
1591
+ * of this gate.
1539
1592
  */
1540
1593
  isConnected(): boolean;
1541
1594
  private getRegion;
@@ -2533,6 +2586,13 @@ declare function makeEven(value: number): number;
2533
2586
  */
2534
2587
  declare function isMetaboxMode(config: UnrealInitialConfig | null | undefined): boolean;
2535
2588
 
2589
+ /**
2590
+ * Picks the class that carries the decoration of a UI part: the host class when
2591
+ * one is supplied, the built-in one otherwise. An empty string counts as "not
2592
+ * supplied" so a part never ends up with no styling at all.
2593
+ */
2594
+ declare function resolveSkin(classes: UnrealUiClasses, part: UnrealUiPart, fallback: string): string | string[];
2595
+
2536
2596
  declare class SafePipe implements PipeTransform {
2537
2597
  private sanitizer;
2538
2598
  transform(value: string, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl;
@@ -3189,9 +3249,9 @@ declare const unrealFeature: {
3189
3249
  reducer: _ngrx_store.ActionReducer<_3dsource_angular_unreal_module.UnrealState, _ngrx_store.Action<string>>;
3190
3250
  selectUnrealFeatureState: _ngrx_store.MemoizedSelector<Record<string, any>, _3dsource_angular_unreal_module.UnrealState, (featureState: _3dsource_angular_unreal_module.UnrealState) => _3dsource_angular_unreal_module.UnrealState>;
3191
3251
  selectAdopted: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (featureState: _3dsource_angular_unreal_module.UnrealState) => boolean>;
3252
+ selectStatusMessage: _ngrx_store.MemoizedSelector<Record<string, any>, string | null, (featureState: _3dsource_angular_unreal_module.UnrealState) => string | null>;
3192
3253
  selectFreezeFrame: _ngrx_store.MemoizedSelector<Record<string, any>, _3dsource_angular_unreal_module.FreezeFrameMessage, (featureState: _3dsource_angular_unreal_module.UnrealState) => _3dsource_angular_unreal_module.FreezeFrameMessage>;
3193
3254
  selectIsVideoPlaying: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (featureState: _3dsource_angular_unreal_module.UnrealState) => boolean>;
3194
- selectStatusMessage: _ngrx_store.MemoizedSelector<Record<string, any>, string | null, (featureState: _3dsource_angular_unreal_module.UnrealState) => string | null>;
3195
3255
  selectEnvironmentId: _ngrx_store.MemoizedSelector<Record<string, any>, string | null, (featureState: _3dsource_angular_unreal_module.UnrealState) => string | null>;
3196
3256
  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>;
3197
3257
  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>;
@@ -3349,5 +3409,5 @@ declare const selectUserInactivityDetected: _ngrx_store.MemoizedSelector<Record<
3349
3409
  /** Used by external consumers (e.g., metabox). Do not remove. */
3350
3410
  declare const selectIsVideoPlayingAndDataChannelConnected: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
3351
3411
 
3352
- export { AFKService, AUTO_HIGH_RESOLUTION_IDLE_MS, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CommandTelemetryService, ConfigHandler, ConsoleExtensionsService, ControlScheme, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DESTROY_DISCONNECT_REASONS, DevModeService, DisconnectReason, FULL_HD_HEIGHT, FULL_HD_WIDTH, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, INNER_RETRY_LIMIT, INSTANCE_READY_TIMEOUT, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, LatencyTimings, LoadingProgressService, MINIMAL_FPS, MIN_CONTAINER_SIZE, MessageType, MouseButton, MouseButtonsMask, OUTER_RETRY_DELAY, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PlayerCountHandler, RECONNECT_CONFIG, REGION_PING_ACCURATE_SAMPLES, REGION_PING_BACKGROUND_REFRESH_DELAY_MS, REGION_PING_CACHE_KEY, REGION_PING_CACHE_TTL_MS, REGION_PING_WARMUP_DEADLINE_MS, RegionsPingService, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_AUDIO_ID, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamAdoptionService, 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_RETRY_PER_INSTANCE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, abortEstablishingConnection, answerSent, changeStatusMainVideoOnScene, changeStreamResolutionAction, commandCompleted, commandStarted, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, dropDC, dropPC, floatToPercents, floatToSmoothPercents, forceResizeViewport, fromResizeObserver, getActiveUrl, getImageFromVideoStream, getResizeStudioValues, getResizeValuesUniversal, getRtcErrorMessage, iceConnectionFailed, initSignalling, instanceReady, isMetaboxMode, keepMaxUntilReset, makeEven, pollingEnded, pollingStarted, provideUnrealModule, provideUnrealState, 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, selectIsVideoPlayingAndDataChannelConnected, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectUserInactivityDetected, 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, signalingRetryAttempted, startStream, streamAdopted, trackMixpanelEvent, trackTelemetryData, uint8ToBase64, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
3353
- export type { AggregatedStat, AnySignalingMessage, AwsInstance, BootstrapInfo, CandidateMessage, CirrusRequestKind, CloseReason, CommandInProgress, ConfigMessage, ConnectionError, ControlSchemeValues, DisconnectReasonType, EmittedMilestone, EventId, FpsLowData, FreezeFrameMessage, InboundVideoStats, InputProps, InstanceReady, InstanceReserved, InterruptClientStream, ListStreamersMessage, MessageBase, MessageTypeValues, OrchestrationErrorMessage, OrchestrationMessageType, P2PEstablishedMessage, ParkedStream, PhaseEndedData, PhaseOverlay, PhaseParam, PlayerCountMessage, PollingOrchestrationMessage, Quality, QualityAnomalyData, RequestStream, ResourceBucket, ResourceTotals, SSInfo, SampleData, SelectedIceCandidatePair, SessionEndReason, SessionEndedData, SessionStartedData, SignalingData, SignalingMessageHandler, SignalingMessageMap, SignalingRetryData, SignalingRetryKind, SlowResource, StreamConfig, StreamRequestContext, StreamResolutionProps, StreamTelemetryEvent, StreamTelemetryEventMap, StreamTelemetryEventName, StreamTelemetryLifecycleData, StreamTelemetryLifecycleEventName, StreamTelemetryTrackData, StreamerListMessage, TelemetryEventEnvelope, TelemetryLifecycleEnvelope, TelemetryType, UnknownFields, UnrealCallbackDescriptor, UnrealCallbackEventMap, UnrealCallbackJson, UnrealCallbackJsonWrapped, UnrealInitialConfig, UnrealMode, UnrealState, WSCloseCodesValues, WindowAggregate };
3412
+ export { AFKService, AUTO_HIGH_RESOLUTION_IDLE_MS, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CommandTelemetryService, ConfigHandler, ConsoleExtensionsService, ControlScheme, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DESTROY_DISCONNECT_REASONS, DevModeService, DisconnectReason, FULL_HD_HEIGHT, FULL_HD_WIDTH, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, INNER_RETRY_LIMIT, INSTANCE_READY_TIMEOUT, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, LatencyTimings, LoadingProgressService, MINIMAL_FPS, MIN_CONTAINER_SIZE, MessageType, MouseButton, MouseButtonsMask, OUTER_RETRY_DELAY, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PlayerCountHandler, RECONNECT_CONFIG, REGION_PING_ACCURATE_SAMPLES, REGION_PING_BACKGROUND_REFRESH_DELAY_MS, REGION_PING_CACHE_KEY, REGION_PING_CACHE_TTL_MS, REGION_PING_WARMUP_DEADLINE_MS, RegionsPingService, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_AUDIO_ID, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamAdoptionService, StreamStatusTelemetryService, StreamStatusTelemetryService2, SubService, ToClientMessage, UNREAL_CONFIG, UnrealAfkSlotDirective, UnrealCallbackService, UnrealCommunicatorService, UnrealEffects, UnrealResumeSlotDirective, UnrealSceneComponent, UnrealStatusMessage, UnrealStatusSlotDirective, 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_RETRY_PER_INSTANCE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, abortEstablishingConnection, answerSent, changeStatusMainVideoOnScene, changeStreamResolutionAction, commandCompleted, commandStarted, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, dropDC, dropPC, floatToPercents, floatToSmoothPercents, forceResizeViewport, fromResizeObserver, getActiveUrl, getImageFromVideoStream, getResizeStudioValues, getResizeValuesUniversal, getRtcErrorMessage, iceConnectionFailed, initSignalling, instanceReady, isMetaboxMode, keepMaxUntilReset, makeEven, pollingEnded, pollingStarted, provideUnrealModule, provideUnrealState, qpToQuality, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, regionPingFetchEnd, regionPingFetchStart, regionResolved, resetAfk, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetUserInactivityTimeout, resetWarnTimeout, resolveSkin, saveAnalyticsEvent, selectCirrusConnectionId, selectClientAndViewIds, selectCommandProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsFullyConnected, selectIsLoaderScreenVisible, selectIsVideoPlayingAndDataChannelConnected, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectUserInactivityDetected, 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, signalingRetryAttempted, startStream, streamAdopted, trackMixpanelEvent, trackTelemetryData, uint8ToBase64, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
3413
+ export type { AggregatedStat, AnySignalingMessage, AwsInstance, BootstrapInfo, CandidateMessage, CirrusRequestKind, CloseReason, CommandInProgress, ConfigMessage, ConnectionError, ControlSchemeValues, DisconnectReasonType, EmittedMilestone, EventId, FpsLowData, FreezeFrameMessage, InboundVideoStats, InputProps, InstanceReady, InstanceReserved, InterruptClientStream, ListStreamersMessage, MessageBase, MessageTypeValues, OrchestrationErrorMessage, OrchestrationMessageType, P2PEstablishedMessage, ParkedStream, PhaseEndedData, PhaseOverlay, PhaseParam, PlayerCountMessage, PollingOrchestrationMessage, Quality, QualityAnomalyData, RequestStream, ResourceBucket, ResourceTotals, SSInfo, SampleData, SelectedIceCandidatePair, SessionEndReason, SessionEndedData, SessionStartedData, SignalingData, SignalingMessageHandler, SignalingMessageMap, SignalingRetryData, SignalingRetryKind, SlowResource, StreamConfig, StreamRequestContext, StreamResolutionProps, StreamTelemetryEvent, StreamTelemetryEventMap, StreamTelemetryEventName, StreamTelemetryLifecycleData, StreamTelemetryLifecycleEventName, StreamTelemetryTrackData, StreamerListMessage, TelemetryEventEnvelope, TelemetryLifecycleEnvelope, TelemetryType, UnknownFields, UnrealAfkSlotContext, UnrealCallbackDescriptor, UnrealCallbackEventMap, UnrealCallbackJson, UnrealCallbackJsonWrapped, UnrealInitialConfig, UnrealMode, UnrealResumeSlotContext, UnrealSlotTemplateContext, UnrealState, UnrealStatusSlotContext, UnrealUiClasses, UnrealUiPart, WSCloseCodesValues, WindowAggregate };