@3dsource/angular-unreal-module 0.0.163 → 0.0.164
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/js/stream-prefetch.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{"use strict";const g=/metabox-configurator\/(modular|basic)\//i,m="features",k="3dsource:region-ping",w="assets/config.json",f="https://datacenter.3dsource.com/signallingserver",y="42e01f";function l(){return typeof crypto!="undefined"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,o=>{const
|
|
2
|
-
`);let i="maxaveragebitrate=510000;";return i+=this.forceMonoAudio?"stereo=0;":"stereo=1;",i+="useinbandfec=1",
|
|
3
|
-
`),s=[];for(const
|
|
4
|
-
`)}send(
|
|
1
|
+
"use strict";(()=>{"use strict";const g=/metabox-configurator\/(modular|basic)\//i,m="features",k="3dsource:region-ping",w="assets/config.json",f="https://datacenter.3dsource.com/signallingserver",y="42e01f";function l(){return typeof crypto!="undefined"&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,o=>{const t=Math.random()*16|0;return(o==="x"?t:t&3|8).toString(16)})}function b(o){return o.replace("http://","ws://").replace("https://","wss://")}const h="[stream-prefetch]",r=(...o)=>console.log(h,...o),c=(...o)=>console.warn(h,...o),u=(...o)=>console.error(h,...o);class T{constructor(){const t=document.currentScript||(()=>{const s=document.getElementsByTagName("script");return s[s.length-1]})(),e=t&&t.dataset||{};this.configUrl=e.configUrl||w,this.fallbackPollingUrl=e.fallbackUrl||"",this.skipRouteCheck=this.boolOr(e.skipRouteCheck,!1),this.config={ws_timeout:this.numberOr(e.wsTimeout,6e3),poll_timeout:this.numberOr(e.pollTimeout,4e3)};const i=new URLSearchParams(window.location.search);this.forceTURN=i.has("ForceTURN"),this.forceMaxBundle=i.has("ForceMaxBundle"),this.forceMonoAudio=i.has("forceMono"),this.ids={clientId:l(),viewId:l(),correlationId:l(),streamRequestId:""},this.region="",this.pc=null,this.dc=null,this.stream=null,this.ws=null,this.remoteDescriptionSet=!1,this.iceBuffer=[],this.wsTimeoutId=null,this.settled=!1}run(){if(!(typeof window=="undefined"||!("WebSocket"in window)||!("RTCPeerConnection"in window))){if(this.isNewOrchestrationEnabled()){r("skip \u2014 features.newOrchestration is enabled");return}if(this.skipRouteCheck){c("skipRouteCheck=true \u2014 ignoring URL gate; using fallback polling"),this.publishParked("connecting"),this.connect().catch(t=>this.fail("exception",t));return}if(!g.test(window.location.href)){r("skip \u2014 not a metabox-configurator/{modular|basic} route");return}r("start",{ids:this.ids}),this.publishParked("connecting"),this.connect().catch(t=>this.fail("exception",t))}}connect(){return this.mark("prefetch_start"),this.region=this.readRegion()||"",r("region from cache:",this.region||"(none)"),(this.skipRouteCheck?Promise.resolve(null):this.fetchConfig()).then(e=>{let i;if(e){if(i=this.chooseEndpoint(e),i&&!this.isAllowedEndpoint(i.url)){r("skip \u2014 signalling URL not sanctioned for prefetch",i.url),this.fail("endpoint-not-allowed");return}}else if(this.fallbackPollingUrl)c("no app config \u2014 falling back to polling",this.fallbackPollingUrl),i={type:"polling",url:this.fallbackPollingUrl};else{this.fail("no-config");return}if(!i){this.fail("no-endpoint");return}r("endpoint chosen",{type:i.type,url:i.url});const s=this.adaptUrlToRegion(i.url);return this.pollOrchestration(s).then(n=>{if(!n){this.fail("no-ws-url");return}return this.parked.machineId=n,r("opening socket",n),this.openSocket(n)})})}fetchConfig(){const t=new URL(this.configUrl,window.location.origin).href;return this.fetchWithTimeout(t,{credentials:"omit"},this.config.poll_timeout).then(e=>e.ok?e.json().catch(()=>null):null).catch(()=>null)}chooseEndpoint(t){const e=t.signalling,i=this.firstVersionUrl(e&&e.versions);return i?{type:"polling",url:i}:null}isAllowedEndpoint(t){if(typeof t!="string")return!1;const e=t.replace(/\/+$/,"");return e===f||e.startsWith(f+"/")}firstVersionUrl(t){if(!t||typeof t!="object")return"";for(const e of Object.keys(t))if(t[e])return t[e];return""}pollOrchestration(t){const e=`${t}${this.ids.clientId}/${this.ids.viewId}`;return this.fetchWithTimeout(e,{credentials:"omit"},this.config.poll_timeout).then(i=>i.ok?i.json().catch(()=>({})):null).then(i=>!i||!i.signallingServer?null:(this.ids.streamRequestId=i.streamRequestId||"",b(`${window.location.protocol}//${i.signallingServer}`))).catch(()=>null)}adaptUrlToRegion(t){return this.region&&t.indexOf(":region")===-1?t.replace(/signallingserver/gi,`signallingserver/region:${this.region}`):t}openSocket(t){const e=this.ids.streamRequestId,i=e?t+(t.indexOf("?")===-1?"?":"&")+"streamRequestId="+encodeURIComponent(e):t,s=new WebSocket(i);s.binaryType="arraybuffer",this.ws=s,this.parked.ws=s,this.wsTimeoutId=setTimeout(()=>{s.readyState!==WebSocket.OPEN&&this.fail("ws-timeout")},this.config.ws_timeout),s.onopen=()=>{clearTimeout(this.wsTimeoutId),this.mark("ws_open"),r("WS open \u2014 waiting for config",{region:this.region,streamRequestId:e||"(none)"})},s.onmessage=n=>this.onWsMessage(n),s.onerror=n=>{u("WS error",n),this.fail("ws-error")},s.onclose=n=>{!this.settled&&this.parked.state!=="ready"&&(c("WS closed before ready",{code:n&&n.code}),this.fail("ws-closed"))}}onWsMessage(t){let e;try{const i=typeof t.data=="string"?t.data:null;if(i===null)return;e=JSON.parse(i)}catch{return}switch(r("WS \u2190",e.type),e.type){case"ssInfo":this.parked.ssData=e.data;break;case"config":this.onConfig(e);break;case"offer":this.onOffer(e);break;case"answer":this.onAnswer(e);break;case"iceCandidate":this.onIceCandidate(e.candidate);break;default:break}}onConfig(t){if(this.pc)return;const e=Object.assign({},t.peerConnectionOptions);this.forceTURN&&(e.iceTransportPolicy="relay"),e.bundlePolicy=this.forceMaxBundle?"max-bundle":"balanced",e.iceCandidatePoolSize=1,this.parked.config=e;const i=new RTCPeerConnection(e);this.pc=i,this.parked.pc=i,r("PeerConnection created from config"),i.onicecandidate=s=>{s.candidate&&this.send({type:"iceCandidate",candidate:s.candidate})},i.ondatachannel=s=>this.wireDataChannel(s.channel),i.ontrack=s=>{s.track&&s.track.kind==="video"&&s.streams[0]&&(r("video track received"),this.stream=s.streams[0],this.parked.stream=this.stream,this.maybeReady())}}onOffer(t){return this.pc?(this.remoteDescriptionSet=!1,this.iceBuffer.length=0,this.pc.setRemoteDescription(t).then(()=>(this.remoteDescriptionSet=!0,this.flushIce(),this.pc.createAnswer())).then(e=>(e.sdp=this.mungeSDP(e.sdp||""),this.pc.setLocalDescription(e).then(()=>{r("WS \u2192 answer sent"),this.send(e)}))).catch(e=>this.fail("offer-failed",e))):Promise.resolve()}onAnswer(t){return this.pc?this.pc.setRemoteDescription(t).then(()=>{this.remoteDescriptionSet=!0,this.flushIce()}).catch(e=>this.fail("answer-failed",e)):Promise.resolve()}onIceCandidate(t){t&&(this.forceTURN&&String(t.candidate).indexOf("relay")<0||(this.remoteDescriptionSet&&this.pc?this.pc.addIceCandidate(t).catch(()=>{}):this.iceBuffer.push(t)))}flushIce(){for(const t of this.iceBuffer)this.pc.addIceCandidate(t).catch(()=>{});this.iceBuffer.length=0}wireDataChannel(t){t.binaryType="arraybuffer",this.dc=t,this.parked.dc=t,t.onmessage=e=>{this.parked.dcBuffer.push(e.data)},t.onopen=()=>{r("DataChannel open"),this.mark("dc_open"),this.maybeReady()},t.onclose=()=>{!this.settled&&this.parked.state!=="ready"&&(c("DataChannel closed before ready"),this.fail("dc-closed"))},t.readyState==="open"&&this.maybeReady()}maybeReady(){this.settled||!this.dc||this.dc.readyState!=="open"||this.stream&&(this.settled=!0,this.mark("ready"),this.parked.state="ready",r("READY \u2014 parked on window.__stream",this.parked.timings),this.fireSettled())}publishParked(t){const e=this;this.parked={state:t,pc:null,dc:null,stream:null,ws:null,ssData:void 0,machineId:void 0,config:void 0,ids:this.ids,dcBuffer:[],timings:{},adopt(){return e.clearTimers(),this.state="adopted",this},onSettled(i){if(typeof i=="function"){if(this.state!=="connecting"){const s=this.state;Promise.resolve().then(()=>i(s));return}e.settledCb=i}}},window.__stream=this.parked}fireSettled(){const t=this.settledCb;if(t){this.settledCb=null;try{t(this.parked.state)}catch{}}}clearTimers(){this.wsTimeoutId&&(clearTimeout(this.wsTimeoutId),this.wsTimeoutId=null)}fail(t,e){if(!(this.parked&&(this.parked.state==="adopted"||this.parked.state==="failed"))){u("FAILED:",t,e||""),this.settled=!0,this.clearTimers();try{this.dc&&this.dc.close()}catch{}try{this.pc&&this.pc.close()}catch{}try{this.ws&&this.ws.close()}catch{}this.parked&&(this.parked.state="failed",this.parked.failReason=t,e&&(this.parked.failError=String(e&&e.message||e)),this.fireSettled())}}mungeSDP(t){let e=this.prioritizeH264Profile(t,y);e=e.replace(/(a=fmtp:\d+ .*level-asymmetry-allowed=.*)\r\n/gm,`$1;x-google-start-bitrate=10000;x-google-max-bitrate=100000\r
|
|
2
|
+
`);let i="maxaveragebitrate=510000;";return i+=this.forceMonoAudio?"stereo=0;":"stereo=1;",i+="useinbandfec=1",e=e.replace("useinbandfec=1",i),e}prioritizeH264Profile(t,e){const i=t.split(`\r
|
|
3
|
+
`),s=[];for(const n of i)if(n.startsWith("a=fmtp:")&&n.toLowerCase().includes(`profile-level-id=${e}`)){const a=n.split(":")[1]&&n.split(":")[1].split(" ")[0];a&&s.push(a)}return s.length===0?t:i.map(n=>{if(!n.startsWith("m=video"))return n;const a=n.split(" "),x=a.slice(0,3),p=a.slice(3),S=[...s.filter(d=>p.includes(d)),...p.filter(d=>!s.includes(d))];return[...x,...S].join(" ")}).join(`\r
|
|
4
|
+
`)}send(t){const e=typeof t=="string"?t:JSON.stringify(t);if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(e)}catch{}}mark(t){this.parked&&(this.parked.timings[t]=performance.now())}isNewOrchestrationEnabled(){try{const t=localStorage.getItem(m);if(!t)return!1;const e=JSON.parse(t);return!!(e&&e.newOrchestration===!0)}catch{return!1}}readRegion(){try{const t=localStorage.getItem(k);if(!t)return null;const e=JSON.parse(t);return!e||typeof e.region_code!="string"||typeof e.ts!="number"||Date.now()-e.ts>=2592e6?null:e.region_code}catch{return null}}fetchWithTimeout(t,e,i){const s=new AbortController;e.signal=s.signal;const n=setTimeout(()=>s.abort(),i);return fetch(t,e).finally(()=>clearTimeout(n))}numberOr(t,e){const i=Number(t);return t!=null&&t!==""&&!Number.isNaN(i)?i:e}boolOr(t,e){return t==="true"||t===""?!0:t==="false"?!1:e}}new T().run()})();
|
package/package.json
CHANGED
|
@@ -380,7 +380,6 @@ interface InputProps {
|
|
|
380
380
|
type Quality = 'lime' | 'red' | 'orange';
|
|
381
381
|
|
|
382
382
|
declare const OrchestrationMessageTypes: {
|
|
383
|
-
readonly ping: "ping";
|
|
384
383
|
readonly error: "error";
|
|
385
384
|
readonly offer: "offer";
|
|
386
385
|
readonly answer: "answer";
|
|
@@ -394,8 +393,6 @@ declare const OrchestrationMessageTypes: {
|
|
|
394
393
|
readonly instanceReady: "instanceReady";
|
|
395
394
|
readonly p2pEstablished: "p2pEstablished";
|
|
396
395
|
readonly instanceReserved: "instanceReserved";
|
|
397
|
-
readonly playerDisconnected: "playerDisconnected";
|
|
398
|
-
readonly streamerDisconnected: "streamerDisconnected";
|
|
399
396
|
readonly interruptClientStream: "interruptClientStream";
|
|
400
397
|
};
|
|
401
398
|
interface InstanceReady extends MessageBase {
|
|
@@ -451,11 +448,6 @@ interface CandidateMessage extends MessageBase {
|
|
|
451
448
|
type: 'iceCandidate';
|
|
452
449
|
candidate: RTCIceCandidate;
|
|
453
450
|
}
|
|
454
|
-
interface PingMessage extends MessageBase {
|
|
455
|
-
type: 'ping';
|
|
456
|
-
playerId: string;
|
|
457
|
-
appConnectionCounter: number;
|
|
458
|
-
}
|
|
459
451
|
type UnknownFields = Record<string, unknown>;
|
|
460
452
|
interface InterruptClientStream extends MessageBase {
|
|
461
453
|
type: 'interruptClientStream';
|
|
@@ -464,10 +456,6 @@ interface InterruptClientStream extends MessageBase {
|
|
|
464
456
|
environmentId: string;
|
|
465
457
|
};
|
|
466
458
|
}
|
|
467
|
-
interface ForceClientDisconnect extends MessageBase {
|
|
468
|
-
type: 'streamerDisconnected' | 'playerDisconnected';
|
|
469
|
-
connectionId: string;
|
|
470
|
-
}
|
|
471
459
|
interface ListStreamersMessage extends MessageBase {
|
|
472
460
|
type: 'listStreamers';
|
|
473
461
|
correlationId: string;
|
|
@@ -536,7 +524,6 @@ interface MetaboxCustomApplicationContext {
|
|
|
536
524
|
}
|
|
537
525
|
type StreamRequestContext = MetaboxStudioContext | MetaboxProductContext | CustomApplicationContext | MetaboxCustomApplicationContext | MetaboxEnvironmentContext | MetaboxBasicConfiguratorContext | MetaboxModularConfiguratorContext;
|
|
538
526
|
interface SignalingMessageMap {
|
|
539
|
-
[OrchestrationMessageTypes.ping]: PingMessage;
|
|
540
527
|
[OrchestrationMessageTypes.offer]: RTCSessionDescriptionInit;
|
|
541
528
|
[OrchestrationMessageTypes.error]: OrchestrationErrorMessage;
|
|
542
529
|
[OrchestrationMessageTypes.ssInfo]: SSInfo;
|
|
@@ -550,8 +537,6 @@ interface SignalingMessageMap {
|
|
|
550
537
|
[OrchestrationMessageTypes.listStreamers]: ListStreamersMessage;
|
|
551
538
|
[OrchestrationMessageTypes.p2pEstablished]: P2PEstablishedMessage;
|
|
552
539
|
[OrchestrationMessageTypes.instanceReserved]: InstanceReserved;
|
|
553
|
-
[OrchestrationMessageTypes.playerDisconnected]: ForceClientDisconnect;
|
|
554
|
-
[OrchestrationMessageTypes.streamerDisconnected]: ForceClientDisconnect;
|
|
555
540
|
[OrchestrationMessageTypes.interruptClientStream]: InterruptClientStream;
|
|
556
541
|
}
|
|
557
542
|
type OrchestrationMessageType = keyof SignalingMessageMap;
|
|
@@ -889,11 +874,29 @@ interface InboundVideoStats extends RTCInboundRtpStreamStats {
|
|
|
889
874
|
receiveToCompositeMs: number;
|
|
890
875
|
bitrate: number;
|
|
891
876
|
}
|
|
877
|
+
/**
|
|
878
|
+
* Which orchestration transport was asked for the Cirrus endpoint:
|
|
879
|
+
* - `polling` — HTTP orchestration poll (`requestCirrusViaPolling`)
|
|
880
|
+
* - `socket` — orchestration control socket + `instanceReady`
|
|
881
|
+
* (`requestCirrusViaSocket`)
|
|
882
|
+
*
|
|
883
|
+
* Undefined when nothing was requested at all — a `ws://` URL that already points
|
|
884
|
+
* at Cirrus (`requestCirrusDirect`, dev/playwright) or an adopted prefetched
|
|
885
|
+
* stream. Those are not request kinds, they are the absence of a request.
|
|
886
|
+
*
|
|
887
|
+
* Replaces the previous hostname sniffing (`/^wss:\/\/orchestration-websocket/`)
|
|
888
|
+
* in `selectTotalProgress` — the flow is now stated, not guessed.
|
|
889
|
+
*/
|
|
890
|
+
type CirrusRequestKind = 'polling' | 'socket';
|
|
892
891
|
interface AwsInstance {
|
|
893
892
|
/**
|
|
894
|
-
* WebSocket URL
|
|
893
|
+
* WebSocket URL of the CIRRUS the player connects to. In the socket flow
|
|
894
|
+
* this is the stream machine's `originInstanceUri`, NOT the orchestration
|
|
895
|
+
* URL (the control socket is tracked separately by `SignallingService`).
|
|
895
896
|
*/
|
|
896
897
|
wsUrl: string | null;
|
|
898
|
+
/** See {@link CirrusRequestKind}. */
|
|
899
|
+
kind?: CirrusRequestKind;
|
|
897
900
|
pollingUrl: string | null;
|
|
898
901
|
instanceName: string | null;
|
|
899
902
|
/**
|
|
@@ -936,6 +939,7 @@ declare const POLLING_TIME = 4000;
|
|
|
936
939
|
declare const INNER_RETRY_LIMIT = 3;
|
|
937
940
|
declare const OUTER_RETRY_DELAY: number;
|
|
938
941
|
declare const WS_RETRY_PER_INSTANCE = 1;
|
|
942
|
+
declare const INSTANCE_READY_TIMEOUT = 180000;
|
|
939
943
|
declare const WS_OPEN_STATE = 1;
|
|
940
944
|
declare const DEFAULT_AFK_TIMEOUT_PERIOD = 15;
|
|
941
945
|
declare const DEFAULT_AFK_TIMEOUT = 300;
|
|
@@ -1332,13 +1336,18 @@ declare class SignallingService extends SubService {
|
|
|
1332
1336
|
onConfig$: Subject<ConfigMessage>;
|
|
1333
1337
|
onWebRtcIce$: Subject<RTCIceCandidate>;
|
|
1334
1338
|
onWebRtcAnswer$: Subject<RTCSessionDescriptionInit | null>;
|
|
1339
|
+
onInstanceReady$: Subject<{
|
|
1340
|
+
instanceId: string;
|
|
1341
|
+
originInstanceId: string;
|
|
1342
|
+
ipAddress: string;
|
|
1343
|
+
streamRequestId: string;
|
|
1344
|
+
originInstanceUri: string;
|
|
1345
|
+
}>;
|
|
1335
1346
|
abort$: Observable<_ngrx_store.Action<string>>;
|
|
1336
1347
|
private ws;
|
|
1337
|
-
private
|
|
1338
|
-
private streamMachineConnected;
|
|
1339
|
-
private streamMachineRetryCount;
|
|
1340
|
-
private streamWsSub?;
|
|
1348
|
+
private controlWs;
|
|
1341
1349
|
orchestrationRetrySub?: Subscription;
|
|
1350
|
+
orchestrationRetryCount: number;
|
|
1342
1351
|
private wsMsgHandlers;
|
|
1343
1352
|
protected correlationId: string;
|
|
1344
1353
|
constructor();
|
|
@@ -1346,7 +1355,7 @@ declare class SignallingService extends SubService {
|
|
|
1346
1355
|
connectToSignaling(urlList: string[]): Observable<WebSocket>;
|
|
1347
1356
|
/**
|
|
1348
1357
|
* One inner cycle: rotate `urlGen` over the pool, resolve via
|
|
1349
|
-
* {@link
|
|
1358
|
+
* {@link requestCirrus}, open WS via {@link connectToCirrus},
|
|
1350
1359
|
* retry up to {@link INNER_RETRY_LIMIT} on any hard failure. The
|
|
1351
1360
|
* urlGen lives in this closure so retries advance through the
|
|
1352
1361
|
* pool. Exhaustion bubbles to {@link connectToSignaling}'s outer
|
|
@@ -1366,17 +1375,37 @@ declare class SignallingService extends SubService {
|
|
|
1366
1375
|
protected startEstablishingConnection(): void;
|
|
1367
1376
|
private adaptUrlsToRegion;
|
|
1368
1377
|
/**
|
|
1369
|
-
*
|
|
1370
|
-
*
|
|
1371
|
-
*
|
|
1378
|
+
* Ask the orchestration for a Cirrus to connect to. All three
|
|
1379
|
+
* implementations answer the same question — "which Cirrus, and with which
|
|
1380
|
+
* `streamRequestId`?" — and emit ONE `AwsInstance` whose `wsUrl` is a Cirrus
|
|
1381
|
+
* address. What differs is only how the answer is obtained and therefore how
|
|
1382
|
+
* it can fail:
|
|
1383
|
+
*
|
|
1384
|
+
* | Method | Transport | Fails on |
|
|
1385
|
+
* | -------------------------- | -------------------- | ------------------------------ |
|
|
1386
|
+
* | {@link requestCirrusViaPolling} | HTTP poll loop | HTTP 4xx (dead URL) |
|
|
1387
|
+
* | {@link requestCirrusViaSocket} | control WS | socket drop / no `instanceReady` in {@link INSTANCE_READY_TIMEOUT} |
|
|
1388
|
+
* | {@link requestCirrusDirect} | none (dev) | never — nothing is requested |
|
|
1389
|
+
*
|
|
1390
|
+
* Whatever they return goes through the SAME downstream in
|
|
1391
|
+
* {@link connectAttempt}: `setAwsInstance` → `connectToCirrus` → the WS-only
|
|
1392
|
+
* and URL-rotating retry tiers. A failure inside any of them is just an
|
|
1393
|
+
* error on this observable, so those tiers handle it uniformly.
|
|
1394
|
+
*/
|
|
1395
|
+
private requestCirrus;
|
|
1396
|
+
/** True when `requestStream` can be composed → new orchestration. */
|
|
1397
|
+
private hasOrchestrationContext;
|
|
1398
|
+
/**
|
|
1399
|
+
* Wait until `clientId` and `viewId` are known — every request method needs
|
|
1400
|
+
* them before it may talk to the backend.
|
|
1372
1401
|
*/
|
|
1373
|
-
private
|
|
1402
|
+
private waitForClientAndViewIds;
|
|
1374
1403
|
/**
|
|
1375
|
-
* Direct `ws://` / `wss://` short-circuit — no
|
|
1376
|
-
*
|
|
1377
|
-
*
|
|
1404
|
+
* Direct `ws://` / `wss://` short-circuit — no orchestration at all, the URL
|
|
1405
|
+
* already points at Cirrus. Dev/playwright convenience, hence no
|
|
1406
|
+
* `kind`: nothing was requested.
|
|
1378
1407
|
*/
|
|
1379
|
-
private
|
|
1408
|
+
private requestCirrusDirect;
|
|
1380
1409
|
/**
|
|
1381
1410
|
* HTTP-orchestration path. Brackets {@link pollLoop} with the
|
|
1382
1411
|
* `pollingStarted`/`pollingEnded` actions and the `EXT-getSignaling`
|
|
@@ -1384,7 +1413,34 @@ declare class SignallingService extends SubService {
|
|
|
1384
1413
|
* last response captured in the closure). Maps the final ready
|
|
1385
1414
|
* response to an `AwsInstance`.
|
|
1386
1415
|
*/
|
|
1387
|
-
private
|
|
1416
|
+
private requestCirrusViaPolling;
|
|
1417
|
+
/**
|
|
1418
|
+
* WS-orchestration path — the socket-transport twin of
|
|
1419
|
+
* {@link requestCirrusViaPolling}. Opens the control socket, sends
|
|
1420
|
+
* `requestStream` and waits for `instanceReady`, whose `originInstanceUri`
|
|
1421
|
+
* IS the Cirrus address.
|
|
1422
|
+
*
|
|
1423
|
+
* Failure modes are handled here so they surface as a plain error and reach
|
|
1424
|
+
* `connectAttempt`'s retry tiers (previously this branch lived outside them
|
|
1425
|
+
* and a dead control socket silently hung the session):
|
|
1426
|
+
* - control socket closes/errors before `instanceReady` → error
|
|
1427
|
+
* - no `instanceReady` within {@link INSTANCE_READY_TIMEOUT} → error
|
|
1428
|
+
*
|
|
1429
|
+
* The control socket lives exactly as long as this wait — see
|
|
1430
|
+
* {@link awaitInstanceReady}.
|
|
1431
|
+
*/
|
|
1432
|
+
private requestCirrusViaSocket;
|
|
1433
|
+
/**
|
|
1434
|
+
* Send `requestStream` on the freshly opened control socket and resolve with
|
|
1435
|
+
* the machine coordinates from `instanceReady`.
|
|
1436
|
+
*
|
|
1437
|
+
* The socket lives exactly as long as this wait: its close/error are HARD
|
|
1438
|
+
* failures of the request, and on resolution it is closed with every handler
|
|
1439
|
+
* detached (the backend does not use it after the handover). So the control
|
|
1440
|
+
* socket has no post-handover state at all — nothing that could report a stale
|
|
1441
|
+
* "disconnect" against a live stream.
|
|
1442
|
+
*/
|
|
1443
|
+
private awaitInstanceReady;
|
|
1388
1444
|
/**
|
|
1389
1445
|
* Poll the SAME `url` until ready, or until HTTP 4xx says the URL
|
|
1390
1446
|
* is dead.
|
|
@@ -1402,9 +1458,12 @@ declare class SignallingService extends SubService {
|
|
|
1402
1458
|
*/
|
|
1403
1459
|
private pollLoop;
|
|
1404
1460
|
private connectToCirrus;
|
|
1461
|
+
/**
|
|
1462
|
+
* Handlers for the CIRRUS socket — the only long-lived socket. Its close/error
|
|
1463
|
+
* are real stream events (`setCirrusDisconnected` / `dropConnection`), unlike
|
|
1464
|
+
* the control socket's, which never outlives {@link awaitInstanceReady}.
|
|
1465
|
+
*/
|
|
1405
1466
|
private addWsHandlers;
|
|
1406
|
-
private onOrchestrationClose;
|
|
1407
|
-
private onOrchestrationError;
|
|
1408
1467
|
/**
|
|
1409
1468
|
* Adopt a live signalling socket opened by the `stream-prefetch.js`
|
|
1410
1469
|
* head-script. The socket is already OPEN and `requestStream` was already
|
|
@@ -1414,61 +1473,53 @@ declare class SignallingService extends SubService {
|
|
|
1414
1473
|
* `correlationId` so subsequent correlated messages line up.
|
|
1415
1474
|
*/
|
|
1416
1475
|
adoptSocket(ws: WebSocket, correlationId: string): void;
|
|
1417
|
-
/**
|
|
1418
|
-
* Open the SECOND socket, directly to the stream machine's Cirrus
|
|
1419
|
-
* (`originInstanceUri` from `instanceReady`). The whole WebRTC signalling
|
|
1420
|
-
* (config/offer/answer/iceCandidate/ping) flows over this socket; the
|
|
1421
|
-
* orchestration socket (`this.ws`) stays open for control/lifecycle.
|
|
1422
|
-
*
|
|
1423
|
-
* "Just connect" — nothing is sent on open (the machine is already reserved
|
|
1424
|
-
* for this session): Cirrus pushes `config` and Unreal sends the `offer`.
|
|
1425
|
-
*
|
|
1426
|
-
* The orchestration-issued `streamRequestId` (from the same `instanceReady`
|
|
1427
|
-
* payload) rides on this upgrade URL: in the new flow THIS is the Cirrus
|
|
1428
|
-
* socket, so it is the one that must carry the id (the first socket is
|
|
1429
|
-
* orchestration-only control and needs nothing). Without it the stream
|
|
1430
|
-
* machine's Cirrus falls back to its own `guid()` and the session can no
|
|
1431
|
-
* longer be correlated. Absent id → URL unchanged.
|
|
1432
|
-
*/
|
|
1433
|
-
connectToStreamMachine(originInstanceUri: string, streamRequestId?: string | null): void;
|
|
1434
|
-
/**
|
|
1435
|
-
* The stream-machine (Cirrus) connection failed. Re-request a machine over
|
|
1436
|
-
* the still-open orchestration socket: orchestration issues a new
|
|
1437
|
-
* streamRequestId and a fresh `instanceReady(originInstanceUri)`, which calls
|
|
1438
|
-
* {@link connectToStreamMachine} again on a different machine. Bounded by
|
|
1439
|
-
* {@link INNER_RETRY_LIMIT}; on exhaustion the stream is dropped.
|
|
1440
|
-
*/
|
|
1441
|
-
private retryStreamMachine;
|
|
1442
|
-
private addStreamWsHandlers;
|
|
1443
|
-
private teardownStreamWs;
|
|
1444
1476
|
private showStatusMessage;
|
|
1445
1477
|
/**
|
|
1446
|
-
* Close the
|
|
1447
|
-
*
|
|
1478
|
+
* Close everything: the Cirrus socket AND the orchestration control socket.
|
|
1479
|
+
* Used on abort/teardown. A new connection attempt inside a live cycle uses
|
|
1480
|
+
* {@link closeCirrus} instead, so it does not kill the control socket that
|
|
1481
|
+
* produced the address it is about to connect to.
|
|
1448
1482
|
*/
|
|
1449
1483
|
close(data: CloseReason): void;
|
|
1484
|
+
/** Close only the Cirrus signalling socket. */
|
|
1485
|
+
private closeCirrus;
|
|
1486
|
+
private teardownControlWs;
|
|
1450
1487
|
private teardownSocket;
|
|
1451
|
-
send(data: AnySignalingMessage): void;
|
|
1452
1488
|
/**
|
|
1453
|
-
*
|
|
1454
|
-
*
|
|
1455
|
-
* the new flow (once connected), or the orchestration/relay socket in the old
|
|
1456
|
-
* polling flow (where there is no separate stream socket).
|
|
1489
|
+
* Player signalling (offer/answer/iceCandidate/pong/p2pEstablished/subscribe)
|
|
1490
|
+
* — always the Cirrus socket, in every flow.
|
|
1457
1491
|
*/
|
|
1458
|
-
|
|
1492
|
+
send(data: AnySignalingMessage): void;
|
|
1493
|
+
/** Orchestration control messages (`requestStream`) — the control socket. */
|
|
1494
|
+
sendToOrchestration(data: AnySignalingMessage): void;
|
|
1459
1495
|
private sendTo;
|
|
1460
1496
|
protected handleMessage(msg: MessageBase): void;
|
|
1461
|
-
|
|
1497
|
+
/**
|
|
1498
|
+
* One handler map shared by both sockets — `handleMessage` dispatches purely by
|
|
1499
|
+
* message type. Which socket a type can arrive on is fixed, so registration is
|
|
1500
|
+
* split by origin: {@link setOrchestrationHandlers} (control socket) and
|
|
1501
|
+
* {@link setStreamHandlers} (Cirrus).
|
|
1502
|
+
*
|
|
1503
|
+
* Keepalive is deliberately absent: both servers ping at the WS **protocol**
|
|
1504
|
+
* level (`ws.ping()`), which the browser answers on its own — the page never
|
|
1505
|
+
* sees a ping and must never reply with an application-level `pong`. An
|
|
1506
|
+
* unregistered type is dropped silently by `handleMessage`, so a `ping` from a
|
|
1507
|
+
* not-yet-updated backend is simply ignored.
|
|
1508
|
+
*/
|
|
1509
|
+
private setMessageHandlers;
|
|
1510
|
+
/**
|
|
1511
|
+
* Messages from the ORCHESTRATION control socket. Only reachable during the
|
|
1512
|
+
* provisioning wait — `requestCirrusViaSocket` closes that socket the moment
|
|
1513
|
+
* `instanceReady` lands.
|
|
1514
|
+
*/
|
|
1515
|
+
private setOrchestrationHandlers;
|
|
1516
|
+
/** Messages from the CIRRUS socket — the actual stream signalling. */
|
|
1517
|
+
private setStreamHandlers;
|
|
1462
1518
|
protected sendRequestStream(): void;
|
|
1463
1519
|
/**
|
|
1464
|
-
*
|
|
1465
|
-
*
|
|
1466
|
-
*
|
|
1467
|
-
* - NEW flow (`streamMachineConnected`): the stream-machine socket
|
|
1468
|
-
* (`streamWs`). The orchestration socket (`this.ws`) is intentionally
|
|
1469
|
-
* closed after occupancy, so checking it would wrongly report "not
|
|
1470
|
-
* connected" and block reconnect.
|
|
1471
|
-
* - OLD polling flow: the single relay socket (`this.ws`) — unchanged.
|
|
1520
|
+
* Is the player-signalling socket open? Always the Cirrus socket — the
|
|
1521
|
+
* control socket's state is irrelevant to the stream (orchestration closes it
|
|
1522
|
+
* once the instance is occupied), so it must not be part of this gate.
|
|
1472
1523
|
*/
|
|
1473
1524
|
isConnected(): boolean;
|
|
1474
1525
|
private getRegion;
|
|
@@ -2323,8 +2374,6 @@ declare function InstanceReadyHandler(this: SignallingService, msg: InstanceRead
|
|
|
2323
2374
|
|
|
2324
2375
|
declare function InstanceReservedHandler(this: SignallingService, msg: InstanceReserved): void;
|
|
2325
2376
|
|
|
2326
|
-
declare function PingHandler(this: SignallingService): void;
|
|
2327
|
-
|
|
2328
2377
|
declare function PlayerCountHandler(this: SignallingService, msg: PlayerCountMessage): void;
|
|
2329
2378
|
|
|
2330
2379
|
declare function SSInfoHandler(this: SignallingService, msg: SSInfo): null;
|
|
@@ -2335,6 +2384,14 @@ declare function OnErrorHandler(this: SignallingService, e: Event): void;
|
|
|
2335
2384
|
|
|
2336
2385
|
declare function OnMessageHandler(this: SignallingService, e: MessageEvent<string | Blob>): void;
|
|
2337
2386
|
|
|
2387
|
+
/**
|
|
2388
|
+
* Open handler of the CIRRUS socket only (`addWsHandlers`), so
|
|
2389
|
+
* `setCirrusConnected` now means what it says. It used to also send
|
|
2390
|
+
* `requestStream` here, which made the flag fire on the orchestration control
|
|
2391
|
+
* socket — a whole provisioning wait (`eta`, ~150 s) before any Cirrus existed.
|
|
2392
|
+
* `requestStream` belongs to the control socket and is sent by
|
|
2393
|
+
* `requestCirrusViaSocket`.
|
|
2394
|
+
*/
|
|
2338
2395
|
declare function OnOpenHandler(this: SignallingService): void;
|
|
2339
2396
|
|
|
2340
2397
|
/**
|
|
@@ -2594,6 +2651,11 @@ declare const setAwsInstance: _ngrx_store.ActionCreator<string, (props: {
|
|
|
2594
2651
|
* `instanceReserved` → {@link setOrchestrationParameters}.
|
|
2595
2652
|
*/
|
|
2596
2653
|
streamRequestId?: string;
|
|
2654
|
+
/**
|
|
2655
|
+
* Which request method produced this endpoint. Stated by the service instead
|
|
2656
|
+
* of being guessed downstream from the URL's hostname.
|
|
2657
|
+
*/
|
|
2658
|
+
kind?: CirrusRequestKind;
|
|
2597
2659
|
}) => {
|
|
2598
2660
|
wsUrl: string | null;
|
|
2599
2661
|
pollingUrl: string | null;
|
|
@@ -2605,6 +2667,11 @@ declare const setAwsInstance: _ngrx_store.ActionCreator<string, (props: {
|
|
|
2605
2667
|
* `instanceReserved` → {@link setOrchestrationParameters}.
|
|
2606
2668
|
*/
|
|
2607
2669
|
streamRequestId?: string;
|
|
2670
|
+
/**
|
|
2671
|
+
* Which request method produced this endpoint. Stated by the service instead
|
|
2672
|
+
* of being guessed downstream from the URL's hostname.
|
|
2673
|
+
*/
|
|
2674
|
+
kind?: CirrusRequestKind;
|
|
2608
2675
|
} & _ngrx_store.Action<string>>;
|
|
2609
2676
|
declare const setStatusMessage: _ngrx_store.ActionCreator<string, (props: {
|
|
2610
2677
|
statusMessage: string | null;
|
|
@@ -2981,23 +3048,23 @@ declare class UnrealEffects {
|
|
|
2981
3048
|
private readonly unrealCallbackService;
|
|
2982
3049
|
private dataChannelConnectionTimeout;
|
|
2983
3050
|
private connectionCompleted$;
|
|
2984
|
-
destroyConnections$:
|
|
3051
|
+
destroyConnections$: Observable<{
|
|
2985
3052
|
reason: _3dsource_angular_unreal_module.DisconnectReasonType;
|
|
2986
3053
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
2987
|
-
refreshRegionCache$:
|
|
3054
|
+
refreshRegionCache$: Observable<{
|
|
2988
3055
|
region_code: string;
|
|
2989
3056
|
result: number[];
|
|
2990
3057
|
} | null> & _ngrx_effects.CreateEffectMetadata;
|
|
2991
|
-
abortEstablishingConnection$:
|
|
2992
|
-
resetAfk$:
|
|
2993
|
-
iframeMessaging$:
|
|
2994
|
-
setSignalingTo100$:
|
|
3058
|
+
abortEstablishingConnection$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3059
|
+
resetAfk$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3060
|
+
iframeMessaging$: Observable<string | null> & _ngrx_effects.CreateEffectMetadata;
|
|
3061
|
+
setSignalingTo100$: Observable<{
|
|
2995
3062
|
percent: number | null;
|
|
2996
3063
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
2997
|
-
setOrchestrationParameters$:
|
|
3064
|
+
setOrchestrationParameters$: Observable<{
|
|
2998
3065
|
progressComplete: number;
|
|
2999
3066
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3000
|
-
setDataChannelTimeoutCheck$:
|
|
3067
|
+
setDataChannelTimeoutCheck$: Observable<{
|
|
3001
3068
|
reason: _3dsource_angular_unreal_module.DisconnectReasonType;
|
|
3002
3069
|
message: string;
|
|
3003
3070
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
@@ -3016,11 +3083,11 @@ declare class UnrealEffects {
|
|
|
3016
3083
|
* Without this effect, the order of these events may cause
|
|
3017
3084
|
* a visible flicker (video flashing to black).
|
|
3018
3085
|
*/
|
|
3019
|
-
forceViewportNotReady$:
|
|
3020
|
-
resetCirrusOnDestroy$:
|
|
3021
|
-
destroyRemoteConnections$:
|
|
3022
|
-
destroyConnectionAndRestart$:
|
|
3023
|
-
showUnrealError$:
|
|
3086
|
+
forceViewportNotReady$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3087
|
+
resetCirrusOnDestroy$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3088
|
+
destroyRemoteConnections$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3089
|
+
destroyConnectionAndRestart$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3090
|
+
showUnrealError$: Observable<{
|
|
3024
3091
|
code: number | null;
|
|
3025
3092
|
error?: string;
|
|
3026
3093
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
@@ -3040,11 +3107,11 @@ declare class UnrealEffects {
|
|
|
3040
3107
|
* cirrus drop, a scene destroy, or the start of a peer reconnect (which is
|
|
3041
3108
|
* where the pre-existing `isReconnecting` filter hands over).
|
|
3042
3109
|
*/
|
|
3043
|
-
unrealReceiverReady$:
|
|
3044
|
-
initAppByDataChannelReady$:
|
|
3045
|
-
setViewportReadyBySetLoopBackCommandIsCompleted$:
|
|
3046
|
-
startStream$:
|
|
3047
|
-
resetAfkOnPausedVideoInit$:
|
|
3110
|
+
unrealReceiverReady$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3111
|
+
initAppByDataChannelReady$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3112
|
+
setViewportReadyBySetLoopBackCommandIsCompleted$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3113
|
+
startStream$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3114
|
+
resetAfkOnPausedVideoInit$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3048
3115
|
/**
|
|
3049
3116
|
* Effect: `disconnectReasonHandling$`
|
|
3050
3117
|
*
|
|
@@ -3057,7 +3124,7 @@ declare class UnrealEffects {
|
|
|
3057
3124
|
* Skip `DataChannelClosed` when peer reconnection can handle it — that
|
|
3058
3125
|
* path is owned by `handleDataChannelClosed$` instead.
|
|
3059
3126
|
*/
|
|
3060
|
-
disconnectReasonHandling$:
|
|
3127
|
+
disconnectReasonHandling$: Observable<{
|
|
3061
3128
|
reason: _3dsource_angular_unreal_module.DisconnectReasonType;
|
|
3062
3129
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3063
3130
|
/**
|
|
@@ -3067,25 +3134,25 @@ declare class UnrealEffects {
|
|
|
3067
3134
|
* Only triggers if reconnection is enabled and the signaling WebSocket
|
|
3068
3135
|
* is still connected.
|
|
3069
3136
|
*/
|
|
3070
|
-
handleDataChannelClosed$:
|
|
3137
|
+
handleDataChannelClosed$: Observable<{
|
|
3071
3138
|
attempt: number;
|
|
3072
3139
|
maxAttempts: number;
|
|
3073
3140
|
delay?: number;
|
|
3074
3141
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3075
|
-
webrtcErrorModalComponent$:
|
|
3142
|
+
webrtcErrorModalComponent$: Observable<false> & _ngrx_effects.CreateEffectMetadata;
|
|
3076
3143
|
/**
|
|
3077
3144
|
* Effect: `resetStateForPeerReconnect$`
|
|
3078
3145
|
*
|
|
3079
3146
|
* Resets the data channel state when peer reconnection starts.
|
|
3080
3147
|
*/
|
|
3081
|
-
resetStateForPeerReconnect$:
|
|
3148
|
+
resetStateForPeerReconnect$: Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3082
3149
|
/**
|
|
3083
3150
|
* Effect: `executePeerReconnect$`
|
|
3084
3151
|
*
|
|
3085
3152
|
* Executes the actual peer reconnection attempt.
|
|
3086
3153
|
* This only re-establishes the WebRTC connection, not the signaling.
|
|
3087
3154
|
*/
|
|
3088
|
-
executePeerReconnect$:
|
|
3155
|
+
executePeerReconnect$: Observable<_ngrx_store.Action<string> | ({
|
|
3089
3156
|
attempt: number;
|
|
3090
3157
|
maxAttempts: number;
|
|
3091
3158
|
delay?: number;
|
|
@@ -3098,19 +3165,19 @@ declare class UnrealEffects {
|
|
|
3098
3165
|
* Handles the case when all peer reconnection attempts have failed.
|
|
3099
3166
|
* Falls back to full disconnection which may trigger full reconnection.
|
|
3100
3167
|
*/
|
|
3101
|
-
handlePeerReconnectFailed$:
|
|
3168
|
+
handlePeerReconnectFailed$: Observable<{
|
|
3102
3169
|
reason: _3dsource_angular_unreal_module.DisconnectReasonType;
|
|
3103
3170
|
message: string;
|
|
3104
3171
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3105
|
-
setMaxFps$:
|
|
3172
|
+
setMaxFps$: Observable<{
|
|
3106
3173
|
maxFps: number;
|
|
3107
3174
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3108
|
-
sendStatisticsToUnreal$:
|
|
3109
|
-
listenUnrealCallbackByInitSignalling$:
|
|
3175
|
+
sendStatisticsToUnreal$: Observable<Object> & _ngrx_effects.CreateEffectMetadata;
|
|
3176
|
+
listenUnrealCallbackByInitSignalling$: Observable<{
|
|
3110
3177
|
id: string;
|
|
3111
3178
|
now: number;
|
|
3112
3179
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3113
|
-
connectToSignaling$:
|
|
3180
|
+
connectToSignaling$: Observable<{
|
|
3114
3181
|
value: boolean;
|
|
3115
3182
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
3116
3183
|
private canPeerReconnect;
|
|
@@ -3289,5 +3356,5 @@ declare const selectUserInactivityDetected: _ngrx_store.MemoizedSelector<Record<
|
|
|
3289
3356
|
/** Used by external consumers (e.g., metabox). Do not remove. */
|
|
3290
3357
|
declare const selectIsVideoPlayingAndDataChannelConnected: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
|
|
3291
3358
|
|
|
3292
|
-
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, FileHandlerService, FileReceiverService, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, INNER_RETRY_LIMIT, 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,
|
|
3293
|
-
export type { AggregatedStat, AnySignalingMessage, AwsInstance, BootstrapInfo, CandidateMessage, CloseReason, CommandInProgress, ConfigMessage, ConnectionError, ControlSchemeValues, DisconnectReasonType, EmittedMilestone, EventId,
|
|
3359
|
+
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, FileHandlerService, FileReceiverService, 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, 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, streamAdopted, trackMixpanelEvent, trackTelemetryData, uint8ToBase64, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
|
|
3360
|
+
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, ReceivedFile, 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, UnrealState, WSCloseCodesValues, WindowAggregate };
|