@3dsource/angular-unreal-module 0.0.143-dev.2 → 0.0.143-dev.8

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,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, DestroyRef, ChangeDetectionStrategy, Component, Injectable, signal, effect, untracked, computed, Pipe, input, ElementRef, viewChild, afterNextRender, HostListener, output, makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';
3
3
  import { SourceButtonComponent, SourceLoadingComponent } from '@3dsource/source-ui-native';
4
- import { Subject, skip, share, merge, map, scan, timestamp, startWith, pairwise, concatMap, of, animationFrameScheduler, interval, Observable, timer, take, defer, switchMap, from, throwError, EMPTY, retry, timeout as timeout$1, repeat, takeUntil as takeUntil$1, fromEvent, tap as tap$1, throttleTime, concat, delay, debounceTime, mergeMap, shareReplay, NEVER, asyncScheduler, filter as filter$1, withLatestFrom as withLatestFrom$1, Subscription, bufferTime, combineLatestWith, distinctUntilChanged as distinctUntilChanged$1 } from 'rxjs';
4
+ import { Subject, skip, share, merge, map, scan, timestamp, startWith, pairwise, concatMap, of, animationFrameScheduler, interval, Observable, timer, take, defer, switchMap, from, throwError, EMPTY, retry, timeout as timeout$1, repeat, takeUntil as takeUntil$1, fromEvent, tap as tap$1, throttleTime, delay, concat, debounceTime, mergeMap, shareReplay, NEVER, asyncScheduler, filter as filter$1, withLatestFrom as withLatestFrom$1, Subscription, bufferTime, combineLatestWith, distinctUntilChanged as distinctUntilChanged$1 } from 'rxjs';
5
5
  import { createAction, props, createReducer, on, createFeature, Store, createSelector, provideState } from '@ngrx/store';
6
6
  import { whereNot, Falsy, Logger, calculateMedian, clampf, lerp, getCanvasCached, getSnapshot, fitIntoRectangle, generateUuid, Truthy, tapLog, Semaphore, COLOR_CODES, where, KeyboardNumericCode, InvertedKeyMap, HEXtoRGB, RGBtoHSV, inverseLerp, HSVtoRGB, RGBtoHEX, fpIsASameAsB } from '@3dsource/utils';
7
7
  import { filter, map as map$1, distinctUntilChanged, takeWhile, takeUntil, catchError, tap, timeout, finalize, first, switchMap as switchMap$1, withLatestFrom, exhaustMap, debounceTime as debounceTime$1, take as take$1, startWith as startWith$1 } from 'rxjs/operators';
@@ -239,6 +239,31 @@ const DEFAULT_AFK_TIMEOUT = 300; // 5 minutes
239
239
  const DATA_CHANNEL_CONNECTION_TIMEOUT = 8000; //ms;
240
240
  const SIGNALLING_PERCENT_VALUE = 56;
241
241
  const SCREEN_LOCKER_CONTAINER_ID = '3dsource_start_screen';
242
+ // Region-ping prefetch cache. A standalone script
243
+ // (`src/js/region-ping-prefetch.js`) pings the regions the same way
244
+ // `RegionsPingService` does and stores the winner here, so the service can
245
+ // skip live pinging right before a connection. The script CANNOT import these
246
+ // constants (it is framework-free, loaded straight into the host page), so it
247
+ // hardcodes the same literals — keep all three in sync if you change them.
248
+ const REGION_PING_CACHE_KEY = '3dsource:region-ping';
249
+ // 1 month. Beyond this the cached winner is considered stale and the service
250
+ // falls back to live pinging.
251
+ const REGION_PING_CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
252
+ // Accurate (background / prefetch) measurement: number of post-warm-up probes
253
+ // per region. The winner is chosen by the MEDIAN of these (tie-break: min),
254
+ // which is robust to jitter — unlike the fast `getFastest` race that just
255
+ // takes the first region to finish.
256
+ const REGION_PING_ACCURATE_SAMPLES = 3;
257
+ // Upper bound on the parallel warm-up phase (DNS/TCP/TLS for every region at
258
+ // once). Generous on purpose: warm-up runs OFF the connection critical path
259
+ // (page-load prefetch + post-connection refresh), so accuracy beats speed —
260
+ // a slow-cold-start region must finish warming before it is measured, else it
261
+ // is unfairly penalised (e.g. a 737 ms cold start hiding a 34 ms real RTT).
262
+ const REGION_PING_WARMUP_DEADLINE_MS = 1500;
263
+ // Delay after the data channel is ready before the background accurate refresh
264
+ // runs — lets the stream stabilise so the ping sweep does not compete with the
265
+ // freshly-started media for bandwidth.
266
+ const REGION_PING_BACKGROUND_REFRESH_DELAY_MS = 5000;
242
267
  // Reconnection defaults
243
268
  const DEFAULT_RECONNECT_ENABLED = true;
244
269
  const DEFAULT_RECONNECT_MAX_ATTEMPTS = 3;
@@ -1580,12 +1605,157 @@ class RegionsPingService {
1580
1605
  // straight from `PingResult.result` — no aggregation.
1581
1606
  return defer(() => {
1582
1607
  this.store.dispatch(regionPingFetchStart());
1583
- return this.getProviders(regionListUrl).pipe(tap(() => this.store.dispatch(regionPingFetchEnd())), switchMap((providers) => this.getPingResult(providers)), catchError(() => of(null)), tapLog('PingResult'), tap((data) => this.store.dispatch(regionResolved({
1608
+ // Cache hit: a standalone prefetch script
1609
+ // (`src/js/region-ping-prefetch.js`) may already have pinged the
1610
+ // regions and stored the winner. If that entry is still fresh, skip
1611
+ // the HTTP fetch + live ping sweep entirely — this is the whole point
1612
+ // of the prefetch: keep the ping cost off the connection critical path.
1613
+ const cached = this.readCachedWinner();
1614
+ if (cached) {
1615
+ // Bookend the waterfall the same way the live path does so observers
1616
+ // see start → end → resolved even though discovery was instant.
1617
+ // Dispatches are split across operators (not fired back-to-back) to
1618
+ // keep the same shape as the live pipe below.
1619
+ return of(cached).pipe(tap(() => this.store.dispatch(regionPingFetchEnd())), tap((data) => this.store.dispatch(regionResolved({
1620
+ region: data.region_code,
1621
+ pingsMs: data.result,
1622
+ }))), map$1((data) => data.region_code));
1623
+ }
1624
+ return this.getProviders(regionListUrl).pipe(tap(() => this.store.dispatch(regionPingFetchEnd())), switchMap((providers) => this.getPingResult(providers)), catchError(() => of(null)), tapLog('PingResult'),
1625
+ // Warm the cache with the live result so the next connection (and any
1626
+ // reload within the TTL) can skip pinging even if the prefetch script
1627
+ // never ran.
1628
+ tap((data) => {
1629
+ if (data?.region_code) {
1630
+ this.writeCachedWinner(data.region_code, data.result);
1631
+ }
1632
+ }), tap((data) => this.store.dispatch(regionResolved({
1584
1633
  region: data?.region_code ?? '',
1585
1634
  pingsMs: data?.result ?? [],
1586
1635
  }))), map$1((data) => data?.region_code));
1587
1636
  });
1588
1637
  }
1638
+ /**
1639
+ * Read the prefetched winner from `localStorage`, returning it only if the
1640
+ * entry is well-formed and still within {@link REGION_PING_CACHE_TTL_MS}.
1641
+ * All access is guarded — `localStorage` can throw (private mode, disabled
1642
+ * storage) or be absent (non-browser).
1643
+ */
1644
+ readCachedWinner() {
1645
+ try {
1646
+ if (typeof localStorage === 'undefined')
1647
+ return null;
1648
+ const raw = localStorage.getItem(REGION_PING_CACHE_KEY);
1649
+ if (!raw)
1650
+ return null;
1651
+ const parsed = JSON.parse(raw);
1652
+ if (typeof parsed?.region_code !== 'string' ||
1653
+ !Array.isArray(parsed.result) ||
1654
+ typeof parsed.ts !== 'number' ||
1655
+ Date.now() - parsed.ts >= REGION_PING_CACHE_TTL_MS) {
1656
+ return null;
1657
+ }
1658
+ return { region_code: parsed.region_code, result: parsed.result };
1659
+ }
1660
+ catch {
1661
+ return null;
1662
+ }
1663
+ }
1664
+ writeCachedWinner(regionCode, result = []) {
1665
+ try {
1666
+ if (typeof localStorage === 'undefined')
1667
+ return;
1668
+ localStorage.setItem(REGION_PING_CACHE_KEY, JSON.stringify({ region_code: regionCode, result, ts: Date.now() }));
1669
+ }
1670
+ catch {
1671
+ // Storage unavailable — cache stays cold, live ping still works.
1672
+ }
1673
+ }
1674
+ /**
1675
+ * Accurate, OFF-critical-path refresh of the region cache. Mirrors the
1676
+ * prefetch script: warm up every region in parallel (barrier), then measure
1677
+ * {@link REGION_PING_ACCURATE_SAMPLES} probes each and pick the lowest
1678
+ * MEDIAN RTT (tie-break: min). Writes the winner to `localStorage` ONLY — it
1679
+ * does NOT dispatch `regionResolved` or touch current-session state, since
1680
+ * the connection is already established on a region; this just improves the
1681
+ * pick for the NEXT connection.
1682
+ *
1683
+ * Invoked from an effect a few seconds after the data channel is ready (see
1684
+ * `REGION_PING_BACKGROUND_REFRESH_DELAY_MS`), so it never competes with the
1685
+ * connection handshake. Aborts with the injector via `destroyController`.
1686
+ */
1687
+ refreshCacheInBackground(regionListUrl = this.unrealConfig?.regionsPingUrl || '') {
1688
+ return defer(() => this.getProviders(regionListUrl)).pipe(switchMap((providers) => from(this.measureAccurate(providers.regions, providers.timeout ?? this.config.ping_timeout))), tap((winner) => {
1689
+ if (winner) {
1690
+ this.writeCachedWinner(winner.region_code, winner.result);
1691
+ }
1692
+ }), catchError(() => of(null)));
1693
+ }
1694
+ async measureAccurate(endpoints, defaultTimeout) {
1695
+ const signal = this.destroyController.signal;
1696
+ await this.warmUpAll(endpoints, defaultTimeout, signal);
1697
+ if (signal.aborted)
1698
+ return null;
1699
+ const semaphore = new Semaphore(this.config.max_parallel_requests);
1700
+ const tasks = endpoints.map(async ({ region_code, url, timeout }) => {
1701
+ await semaphore.acquire();
1702
+ try {
1703
+ const result = await this.checkLatency(url, timeout ?? defaultTimeout, signal, REGION_PING_ACCURATE_SAMPLES);
1704
+ return result.length >= 2 ? { region_code, result } : null;
1705
+ }
1706
+ catch {
1707
+ return null;
1708
+ }
1709
+ finally {
1710
+ semaphore.release();
1711
+ }
1712
+ });
1713
+ const results = (await Promise.all(tasks)).filter((r) => r !== null);
1714
+ return this.pickByMedian(results);
1715
+ }
1716
+ /**
1717
+ * Phase 1 of the accurate measure: one throwaway probe to every region in
1718
+ * parallel to pay the DNS/TCP/TLS cold-start. Resolves once all settle OR
1719
+ * the warm-up deadline elapses, whichever is first.
1720
+ */
1721
+ async warmUpAll(endpoints, defaultTimeout, signal) {
1722
+ const semaphore = new Semaphore(this.config.max_parallel_requests);
1723
+ const warmups = endpoints.map(async ({ url, timeout }) => {
1724
+ await semaphore.acquire();
1725
+ try {
1726
+ await this.checkLatency(url, timeout ?? defaultTimeout, signal, 1);
1727
+ }
1728
+ finally {
1729
+ semaphore.release();
1730
+ }
1731
+ });
1732
+ await Promise.race([
1733
+ Promise.allSettled(warmups),
1734
+ new Promise((resolve) => setTimeout(resolve, REGION_PING_WARMUP_DEADLINE_MS)),
1735
+ ]);
1736
+ }
1737
+ pickByMedian(results) {
1738
+ let best = null;
1739
+ let bestMedian = Infinity;
1740
+ let bestMin = Infinity;
1741
+ for (const r of results) {
1742
+ const med = this.median(r.result);
1743
+ const min = Math.min(...r.result);
1744
+ if (med < bestMedian || (med === bestMedian && min < bestMin)) {
1745
+ bestMedian = med;
1746
+ bestMin = min;
1747
+ best = r;
1748
+ }
1749
+ }
1750
+ return best;
1751
+ }
1752
+ median(samples) {
1753
+ const sorted = [...samples].sort((a, b) => a - b);
1754
+ const mid = Math.floor(sorted.length / 2);
1755
+ return sorted.length % 2
1756
+ ? sorted[mid]
1757
+ : (sorted[mid - 1] + sorted[mid]) / 2;
1758
+ }
1589
1759
  getPingResult(providers) {
1590
1760
  const defaultTimeout = providers.timeout ?? this.config.ping_timeout;
1591
1761
  return from(this.startPinging(providers.regions, defaultTimeout));
@@ -1641,10 +1811,10 @@ class RegionsPingService {
1641
1811
  }
1642
1812
  }
1643
1813
  }
1644
- async checkLatency(endpoint, timeout, abortSignal) {
1814
+ async checkLatency(endpoint, timeout, abortSignal, count = this.config.ping_count) {
1645
1815
  const pingResults = [];
1646
1816
  const sep = endpoint.includes('?') ? '&' : '?';
1647
- for (let i = 0; i < this.config.ping_count; i++) {
1817
+ for (let i = 0; i < count; i++) {
1648
1818
  // Bail out as soon as another region's task has won — no point
1649
1819
  // burning further `ping_timeout` budget here.
1650
1820
  if (abortSignal?.aborted) {
@@ -3514,6 +3684,7 @@ class UnrealEffects {
3514
3684
  this.webRtcPlayerService = inject(WebRtcPlayerService);
3515
3685
  this.commandsSender = inject(UnrealCommunicatorService);
3516
3686
  this.commandTelemetryService = inject(CommandTelemetryService);
3687
+ this.regionsPingService = inject(RegionsPingService);
3517
3688
  this.signallingService = inject(SignallingService);
3518
3689
  this.videoService = inject(VideoService);
3519
3690
  this.unrealCallbackService = inject(UnrealCallbackService);
@@ -3536,6 +3707,18 @@ class UnrealEffects {
3536
3707
  this.destroyConnections$ = createEffect(() => {
3537
3708
  return this.actions$.pipe(ofType(destroyUnrealScene), map(() => destroyRemoteConnections({ reason: DisconnectReason.Destroy })));
3538
3709
  });
3710
+ // Stage 3 — accurate region re-ping in the background once the stream is up.
3711
+ // A few seconds after the data channel is ready (so it doesn't compete with
3712
+ // the connection handshake) we re-measure regions with the accurate
3713
+ // warm-up + median method and refresh the localStorage cache, improving the
3714
+ // pick for the NEXT connection. `switchMap` cancels a previous run if the
3715
+ // channel re-opens; `takeUntil(destroyUnrealScene)` tears it down on exit.
3716
+ // `dispatch: false` — it only writes the cache, no store change.
3717
+ this.refreshRegionCache$ = createEffect(() => {
3718
+ return this.actions$.pipe(ofType(dataChannelReady), delay(REGION_PING_BACKGROUND_REFRESH_DELAY_MS), switchMap(() => this.regionsPingService
3719
+ .refreshCacheInBackground()
3720
+ .pipe(takeUntil(this.actions$.pipe(ofType(destroyUnrealScene))))));
3721
+ }, { dispatch: false });
3539
3722
  // Fan-in for "cancel an in-flight signaling attempt". One named action so
3540
3723
  // both `SignallingService.abort$` and `setDataChannelTimeoutCheck$.abort$`
3541
3724
  // subscribe to single intent (and it shows up as a distinct entry in the
@@ -5389,8 +5572,7 @@ class StreamStatusTelemetryService2 {
5389
5572
  this.destroy$.next();
5390
5573
  this.destroy$.complete();
5391
5574
  });
5392
- if (this.unrealConfig?.playwright ||
5393
- !this.unrealConfig?.streamTelemetryV2) {
5575
+ if (this.unrealConfig?.playwright) {
5394
5576
  return;
5395
5577
  }
5396
5578
  this.init();
@@ -7403,5 +7585,5 @@ function provideUnrealModule() {
7403
7585
  * Generated bundle index. Do not edit.
7404
7586
  */
7405
7587
 
7406
- export { AFKService, AUTO_HIGH_RESOLUTION_IDLE_MS, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, CommandTelemetryService, 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, INNER_RETRY_LIMIT, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, KalmanFilter1D, LatencyTimings, LoadingProgressService, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MIN_CONTAINER_SIZE, MessageType, MouseButton, MouseButtonsMask, OUTER_RETRY_DELAY, 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_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, 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, smoothTransition, startStream, trackMixpanelEvent, trackTelemetryData, uint8ToBase64, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
7588
+ export { AFKService, AUTO_HIGH_RESOLUTION_IDLE_MS, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, CommandTelemetryService, 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, INNER_RETRY_LIMIT, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, KalmanFilter1D, LatencyTimings, LoadingProgressService, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MIN_CONTAINER_SIZE, MessageType, MouseButton, MouseButtonsMask, OUTER_RETRY_DELAY, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PingHandler, PlayerCountHandler, 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, 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, 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, smoothTransition, startStream, trackMixpanelEvent, trackTelemetryData, uint8ToBase64, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
7407
7589
  //# sourceMappingURL=3dsource-angular-unreal-module.mjs.map