@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.
@@ -0,0 +1 @@
1
+ "use strict";(()=>{"use strict";const o="3dsource:region-ping",u="https://datacenter.3dsource.com/regions/";class a{constructor(e){this.max=Math.max(1,e),this.count=0,this.queue=[]}acquire(){return this.count<this.max?(this.count++,Promise.resolve()):new Promise(e=>this.queue.push(e))}release(){this.count--;const e=this.queue.shift();e&&(this.count++,e())}}class l{constructor(){const e=document.currentScript||(()=>{const n=document.getElementsByTagName("script");return n[n.length-1]})(),t=e&&e.dataset||{},r=window.REGION_PING_CONFIG||{};this.regionsPingUrl=r.regionsPingUrl||t.regionsUrl||u,this.config={accurate_samples:this.numberOr(r.accurateSamples,t.accurateSamples,3),ping_timeout:this.numberOr(r.pingTimeout,t.pingTimeout,2e3),warmup_deadline:this.numberOr(r.warmupDeadline,t.warmupDeadline,1500),max_parallel_requests:this.numberOr(r.maxParallel,t.maxParallel,10),bust_cache:this.boolOr(r.bustCache,t.bustCache,!0)}}run(){this.regionsPingUrl&&(this.readFreshCache()||this.prefetch().catch(()=>{}))}prefetch(){return fetch(this.regionsPingUrl,{credentials:"omit"}).then(e=>e.json()).then(e=>{const t=e&&e.regions||[],r=e&&e.timeout||this.config.ping_timeout;return this.warmUpAll(t,r).then(()=>this.measureAll(t,r))}).then(e=>{e&&this.writeCache(e.region_code,e.result)})}warmUpAll(e,t){const r=new a(this.config.max_parallel_requests),n=e.map(s=>r.acquire().then(()=>this.singlePing(s.url,s.timeout||t).catch(()=>{}).finally(()=>r.release())));return Promise.race([Promise.all(n),this.delay(this.config.warmup_deadline)])}measureAll(e,t){const r=new a(this.config.max_parallel_requests),n=e.map(s=>r.acquire().then(()=>this.checkLatency(s.url,s.timeout||t)).then(i=>(r.release(),i.length>=2?{region_code:s.region_code,result:i}:null)).catch(()=>(r.release(),null)));return Promise.all(n).then(s=>this.pickByMedian(s.filter(Boolean)))}checkLatency(e,t){const r=[];let n=0;const s=()=>{if(n>=this.config.accurate_samples)return Promise.resolve(r);n++;const i=performance.now();return this.singlePing(e,t).catch(()=>{}).then(()=>(r.push(Math.round(performance.now()-i)),s()))};return s()}singlePing(e,t){const r=e.indexOf("?")!==-1?"&":"?",n=this.config.bust_cache?`${e}${r}cache_buster=${performance.now()}`:e;return this.fetchWithTimeout(n,{method:"GET",mode:"no-cors",headers:{"Cache-Control":"no-cache, no-store, must-revalidate",Pragma:"no-cache",Expires:"0"},credentials:"omit"},t)}fetchWithTimeout(e,t,r){const n=new AbortController;t.signal=n.signal;const s=setTimeout(()=>n.abort(),r);return fetch(e,t).finally(()=>clearTimeout(s))}pickByMedian(e){let t=null,r=1/0,n=1/0;for(const s of e){const i=this.median(s.result),c=Math.min(...s.result);(i<r||i===r&&c<n)&&(r=i,n=c,t=s)}return t}median(e){const t=e.slice().sort((n,s)=>n-s),r=Math.floor(t.length/2);return t.length%2?t[r]:(t[r-1]+t[r])/2}delay(e){return new Promise(t=>setTimeout(t,e))}readFreshCache(){try{const e=localStorage.getItem(o);if(!e)return null;const t=JSON.parse(e);return!t||typeof t.region_code!="string"||typeof t.ts!="number"||Date.now()-t.ts>=2592e6?null:t}catch{return null}}writeCache(e,t){try{localStorage.setItem(o,JSON.stringify({region_code:e,result:t,ts:Date.now()}))}catch{}}numberOr(e,t,r){for(const n of[e,t]){const s=Number(n);if(n!=null&&n!==""&&!Number.isNaN(s))return s}return r}boolOr(e,t,r){for(const n of[e,t]){if(typeof n=="boolean")return n;if(n==="true")return!0;if(n==="false")return!1}return r}}new l().run()})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3dsource/angular-unreal-module",
3
- "version": "0.0.143-dev.2",
3
+ "version": "0.0.143-dev.8",
4
4
  "description": "Unreal module for connect with unreal engine stream",
5
5
  "keywords": [
6
6
  "3dsource",
@@ -245,14 +245,13 @@ interface ReconnectConfig {
245
245
  onDataChannelClose?: boolean;
246
246
  }
247
247
  interface UnrealInitialConfig {
248
+ playwright?: boolean;
248
249
  customErrorsEndpoint?: string;
249
250
  commandTelemetryReceiver?: string;
250
251
  regionsPingUrl?: string;
251
252
  screenLockerContainerId?: string;
252
253
  dataChannelConnectionTimeout?: number;
253
254
  fpsMonitor?: boolean;
254
- playwright?: boolean;
255
- streamTelemetryV2?: boolean;
256
255
  streamTelemetryV2Url?: string;
257
256
  autoHighResolution?: boolean;
258
257
  /** Configuration for auto-reconnection behavior */
@@ -364,6 +363,11 @@ declare const DEFAULT_AFK_TIMEOUT = 300;
364
363
  declare const DATA_CHANNEL_CONNECTION_TIMEOUT = 8000;
365
364
  declare const SIGNALLING_PERCENT_VALUE = 56;
366
365
  declare const SCREEN_LOCKER_CONTAINER_ID = "3dsource_start_screen";
366
+ declare const REGION_PING_CACHE_KEY = "3dsource:region-ping";
367
+ declare const REGION_PING_CACHE_TTL_MS: number;
368
+ declare const REGION_PING_ACCURATE_SAMPLES = 3;
369
+ declare const REGION_PING_WARMUP_DEADLINE_MS = 1500;
370
+ declare const REGION_PING_BACKGROUND_REFRESH_DELAY_MS = 5000;
367
371
  declare const DEFAULT_RECONNECT_ENABLED = true;
368
372
  declare const DEFAULT_RECONNECT_MAX_ATTEMPTS = 3;
369
373
  declare const DEFAULT_RECONNECT_DELAY_MS = 1000;
@@ -894,6 +898,40 @@ declare class RegionsPingService {
894
898
  };
895
899
  constructor();
896
900
  getFastest(regionListUrl?: string): node_modules_rxjs_dist_types.Observable<string | undefined>;
901
+ /**
902
+ * Read the prefetched winner from `localStorage`, returning it only if the
903
+ * entry is well-formed and still within {@link REGION_PING_CACHE_TTL_MS}.
904
+ * All access is guarded — `localStorage` can throw (private mode, disabled
905
+ * storage) or be absent (non-browser).
906
+ */
907
+ private readCachedWinner;
908
+ private writeCachedWinner;
909
+ /**
910
+ * Accurate, OFF-critical-path refresh of the region cache. Mirrors the
911
+ * prefetch script: warm up every region in parallel (barrier), then measure
912
+ * {@link REGION_PING_ACCURATE_SAMPLES} probes each and pick the lowest
913
+ * MEDIAN RTT (tie-break: min). Writes the winner to `localStorage` ONLY — it
914
+ * does NOT dispatch `regionResolved` or touch current-session state, since
915
+ * the connection is already established on a region; this just improves the
916
+ * pick for the NEXT connection.
917
+ *
918
+ * Invoked from an effect a few seconds after the data channel is ready (see
919
+ * `REGION_PING_BACKGROUND_REFRESH_DELAY_MS`), so it never competes with the
920
+ * connection handshake. Aborts with the injector via `destroyController`.
921
+ */
922
+ refreshCacheInBackground(regionListUrl?: string): node_modules_rxjs_dist_types.Observable<{
923
+ region_code: string;
924
+ result: number[];
925
+ } | null>;
926
+ private measureAccurate;
927
+ /**
928
+ * Phase 1 of the accurate measure: one throwaway probe to every region in
929
+ * parallel to pay the DNS/TCP/TLS cold-start. Resolves once all settle OR
930
+ * the warm-up deadline elapses, whichever is first.
931
+ */
932
+ private warmUpAll;
933
+ private pickByMedian;
934
+ private median;
897
935
  getPingResult(providers: ProvidersData): node_modules_rxjs_dist_types.Observable<{
898
936
  region_code: string;
899
937
  result: number[];
@@ -2528,6 +2566,7 @@ declare class UnrealEffects {
2528
2566
  private readonly webRtcPlayerService;
2529
2567
  private readonly commandsSender;
2530
2568
  private readonly commandTelemetryService;
2569
+ private readonly regionsPingService;
2531
2570
  private readonly signallingService;
2532
2571
  private readonly videoService;
2533
2572
  private readonly unrealCallbackService;
@@ -2537,6 +2576,10 @@ declare class UnrealEffects {
2537
2576
  destroyConnections$: node_modules_rxjs_dist_types.Observable<{
2538
2577
  reason: _3dsource_angular_unreal_module.DisconnectReasonType;
2539
2578
  } & node_modules__ngrx_store_types_ngrx_store.Action<string>> & node_modules__ngrx_effects_types_ngrx_effects.CreateEffectMetadata;
2579
+ refreshRegionCache$: node_modules_rxjs_dist_types.Observable<{
2580
+ region_code: string;
2581
+ result: number[];
2582
+ } | null> & node_modules__ngrx_effects_types_ngrx_effects.CreateEffectMetadata;
2540
2583
  abortEstablishingConnection$: node_modules_rxjs_dist_types.Observable<node_modules__ngrx_store_types_ngrx_store.Action<string>> & node_modules__ngrx_effects_types_ngrx_effects.CreateEffectMetadata;
2541
2584
  resetAfk$: node_modules_rxjs_dist_types.Observable<node_modules__ngrx_store_types_ngrx_store.Action<string>> & node_modules__ngrx_effects_types_ngrx_effects.CreateEffectMetadata;
2542
2585
  iframeMessaging$: node_modules_rxjs_dist_types.Observable<string | null> & node_modules__ngrx_effects_types_ngrx_effects.CreateEffectMetadata;
@@ -2801,5 +2844,5 @@ declare const selectUserInactivityDetected: node_modules__ngrx_store_types_ngrx_
2801
2844
  /** Used by external consumers (e.g., metabox). Do not remove. */
2802
2845
  declare const selectIsVideoPlayingAndDataChannelConnected: node_modules__ngrx_store_types_ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
2803
2846
 
2804
- 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 };
2847
+ 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 };
2805
2848
  export type { AggregatedStat, AnySignalingMessage, AwsInstance, CandidateMessage, CloseReason, CommandInProgress, ConfigMessage, ConnectionError, ControlSchemeValues, DataFlowCheckResult, DisconnectReasonType, EmittedMilestone, EventId, 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, UnrealInitialConfig, UnrealState, WSCloseCodesValues, streamPreparedForUserInteractionMessage };