@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.
@@ -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 e=Math.random()*16|0;return(o==="x"?e:e&3|8).toString(16)})}function b(o){return o.replace("http://","ws://").replace("https://","wss://")}const h="[stream-prefetch]",n=(...o)=>console.log(h,...o),c=(...o)=>console.warn(h,...o),u=(...o)=>console.error(h,...o);class T{constructor(){const e=document.currentScript||(()=>{const s=document.getElementsByTagName("script");return s[s.length-1]})(),t=e&&e.dataset||{};this.configUrl=t.configUrl||w,this.fallbackPollingUrl=t.fallbackUrl||"",this.skipRouteCheck=this.boolOr(t.skipRouteCheck,!1),this.config={ws_timeout:this.numberOr(t.wsTimeout,6e3),poll_timeout:this.numberOr(t.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()){n("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(e=>this.fail("exception",e));return}if(!g.test(window.location.href)){n("skip \u2014 not a metabox-configurator/{modular|basic} route");return}n("start",{ids:this.ids}),this.publishParked("connecting"),this.connect().catch(e=>this.fail("exception",e))}}connect(){return this.mark("prefetch_start"),this.region=this.readRegion()||"",n("region from cache:",this.region||"(none)"),(this.skipRouteCheck?Promise.resolve(null):this.fetchConfig()).then(t=>{let i;if(t){if(i=this.chooseEndpoint(t),i&&!this.isAllowedEndpoint(i.url)){n("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}n("endpoint chosen",{type:i.type,url:i.url});const s=this.adaptUrlToRegion(i.url);return this.pollOrchestration(s).then(r=>{if(!r){this.fail("no-ws-url");return}return this.parked.machineId=r,n("opening socket",r),this.openSocket(r)})})}fetchConfig(){const e=new URL(this.configUrl,window.location.origin).href;return this.fetchWithTimeout(e,{credentials:"omit"},this.config.poll_timeout).then(t=>t.ok?t.json().catch(()=>null):null).catch(()=>null)}chooseEndpoint(e){const t=e.signalling,i=this.firstVersionUrl(t&&t.versions);return i?{type:"polling",url:i}:null}isAllowedEndpoint(e){if(typeof e!="string")return!1;const t=e.replace(/\/+$/,"");return t===f||t.startsWith(f+"/")}firstVersionUrl(e){if(!e||typeof e!="object")return"";for(const t of Object.keys(e))if(e[t])return e[t];return""}pollOrchestration(e){const t=`${e}${this.ids.clientId}/${this.ids.viewId}`;return this.fetchWithTimeout(t,{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(e){return this.region&&e.indexOf(":region")===-1?e.replace(/signallingserver/gi,`signallingserver/region:${this.region}`):e}openSocket(e){const t=this.ids.streamRequestId,i=t?e+(e.indexOf("?")===-1?"?":"&")+"streamRequestId="+encodeURIComponent(t):e,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"),n("WS open \u2014 waiting for config",{region:this.region,streamRequestId:t||"(none)"})},s.onmessage=r=>this.onWsMessage(r),s.onerror=r=>{u("WS error",r),this.fail("ws-error")},s.onclose=r=>{!this.settled&&this.parked.state!=="ready"&&(c("WS closed before ready",{code:r&&r.code}),this.fail("ws-closed"))}}onWsMessage(e){let t;try{const i=typeof e.data=="string"?e.data:null;if(i===null)return;t=JSON.parse(i)}catch{return}switch(n("WS \u2190",t.type),t.type){case"ssInfo":this.parked.ssData=t.data;break;case"config":this.onConfig(t);break;case"offer":this.onOffer(t);break;case"answer":this.onAnswer(t);break;case"iceCandidate":this.onIceCandidate(t.candidate);break;case"ping":this.send({type:"pong",source:"front"});break;case"streamerDisconnected":case"playerDisconnected":this.fail("streamer-disconnected");break;case"error":this.fail("orchestration-error");break;default:break}}onConfig(e){if(this.pc)return;const t=Object.assign({},e.peerConnectionOptions);this.forceTURN&&(t.iceTransportPolicy="relay"),t.bundlePolicy=this.forceMaxBundle?"max-bundle":"balanced",t.iceCandidatePoolSize=1,this.parked.config=t;const i=new RTCPeerConnection(t);this.pc=i,this.parked.pc=i,n("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]&&(n("video track received"),this.stream=s.streams[0],this.parked.stream=this.stream,this.maybeReady())}}onOffer(e){return this.pc?(this.remoteDescriptionSet=!1,this.iceBuffer.length=0,this.pc.setRemoteDescription(e).then(()=>(this.remoteDescriptionSet=!0,this.flushIce(),this.pc.createAnswer())).then(t=>(t.sdp=this.mungeSDP(t.sdp||""),this.pc.setLocalDescription(t).then(()=>{n("WS \u2192 answer sent"),this.send(t)}))).catch(t=>this.fail("offer-failed",t))):Promise.resolve()}onAnswer(e){return this.pc?this.pc.setRemoteDescription(e).then(()=>{this.remoteDescriptionSet=!0,this.flushIce()}).catch(t=>this.fail("answer-failed",t)):Promise.resolve()}onIceCandidate(e){e&&(this.forceTURN&&String(e.candidate).indexOf("relay")<0||(this.remoteDescriptionSet&&this.pc?this.pc.addIceCandidate(e).catch(()=>{}):this.iceBuffer.push(e)))}flushIce(){for(const e of this.iceBuffer)this.pc.addIceCandidate(e).catch(()=>{});this.iceBuffer.length=0}wireDataChannel(e){e.binaryType="arraybuffer",this.dc=e,this.parked.dc=e,e.onmessage=t=>{this.parked.dcBuffer.push(t.data)},e.onopen=()=>{n("DataChannel open"),this.mark("dc_open"),this.maybeReady()},e.onclose=()=>{!this.settled&&this.parked.state!=="ready"&&(c("DataChannel closed before ready"),this.fail("dc-closed"))},e.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",n("READY \u2014 parked on window.__stream",this.parked.timings),this.fireSettled())}publishParked(e){const t=this;this.parked={state:e,pc:null,dc:null,stream:null,ws:null,ssData:void 0,machineId:void 0,config:void 0,ids:this.ids,dcBuffer:[],timings:{},adopt(){return t.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}t.settledCb=i}}},window.__stream=this.parked}fireSettled(){const e=this.settledCb;if(e){this.settledCb=null;try{e(this.parked.state)}catch{}}}clearTimers(){this.wsTimeoutId&&(clearTimeout(this.wsTimeoutId),this.wsTimeoutId=null)}fail(e,t){if(!(this.parked&&(this.parked.state==="adopted"||this.parked.state==="failed"))){u("FAILED:",e,t||""),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=e,t&&(this.parked.failError=String(t&&t.message||t)),this.fireSettled())}}mungeSDP(e){let t=this.prioritizeH264Profile(e,y);t=t.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",t=t.replace("useinbandfec=1",i),t}prioritizeH264Profile(e,t){const i=e.split(`\r
3
- `),s=[];for(const r of i)if(r.startsWith("a=fmtp:")&&r.toLowerCase().includes(`profile-level-id=${t}`)){const a=r.split(":")[1]&&r.split(":")[1].split(" ")[0];a&&s.push(a)}return s.length===0?e:i.map(r=>{if(!r.startsWith("m=video"))return r;const a=r.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(e){const t=typeof e=="string"?e:JSON.stringify(e);if(this.ws&&this.ws.readyState===WebSocket.OPEN)try{this.ws.send(t)}catch{}}mark(e){this.parked&&(this.parked.timings[e]=performance.now())}isNewOrchestrationEnabled(){try{const e=localStorage.getItem(m);if(!e)return!1;const t=JSON.parse(e);return!!(t&&t.newOrchestration===!0)}catch{return!1}}readRegion(){try{const e=localStorage.getItem(k);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.region_code}catch{return null}}fetchWithTimeout(e,t,i){const s=new AbortController;t.signal=s.signal;const r=setTimeout(()=>s.abort(),i);return fetch(e,t).finally(()=>clearTimeout(r))}numberOr(e,t){const i=Number(e);return e!=null&&e!==""&&!Number.isNaN(i)?i:t}boolOr(e,t){return e==="true"||e===""?!0:e==="false"?!1:t}}new T().run()})();
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3dsource/angular-unreal-module",
3
- "version": "0.0.163",
3
+ "version": "0.0.164",
4
4
  "description": "Angular integration for Unreal Engine Pixel Streaming",
5
5
  "keywords": [
6
6
  "3dsource",
@@ -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 for connecting to the Cirrus (polling mode) or Orchestration (direct mode).
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 streamWs;
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 getAwsInstance}, open WS via {@link connectToCirrus},
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
- * Resolve one URL to an `AwsInstance`. Dispatches to
1370
- * {@link directWsInstance} for `ws://` / `wss://` URLs, otherwise
1371
- * to {@link pollOrchestration}.
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 getAwsInstance;
1402
+ private waitForClientAndViewIds;
1374
1403
  /**
1375
- * Direct `ws://` / `wss://` short-circuit — no HTTP orchestration.
1376
- * Waits for `clientId` and `viewId` to be truthy in the store, then
1377
- * emits a `Direct Connection` `AwsInstance` and completes.
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 directWsInstance;
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 pollOrchestration;
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 connection with the signaling server
1447
- * @param data
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
- * Send player signalling (offer/answer/iceCandidate/pong/p2pEstablished/
1454
- * subscribe) over the ACTIVE signalling socket: the stream-machine socket in
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
- sendPlayerSignal(data: AnySignalingMessage): void;
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
- private setHandlersFromStream;
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
- * Check if the ACTIVE player-signalling socket is open and ready. Mirrors
1465
- * {@link sendPlayerSignal}'s socket choice so peer-reconnect gating is correct
1466
- * in both flows:
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$: rxjs.Observable<{
3051
+ destroyConnections$: Observable<{
2985
3052
  reason: _3dsource_angular_unreal_module.DisconnectReasonType;
2986
3053
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2987
- refreshRegionCache$: rxjs.Observable<{
3054
+ refreshRegionCache$: Observable<{
2988
3055
  region_code: string;
2989
3056
  result: number[];
2990
3057
  } | null> & _ngrx_effects.CreateEffectMetadata;
2991
- abortEstablishingConnection$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2992
- resetAfk$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
2993
- iframeMessaging$: rxjs.Observable<string | null> & _ngrx_effects.CreateEffectMetadata;
2994
- setSignalingTo100$: rxjs.Observable<{
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$: rxjs.Observable<{
3064
+ setOrchestrationParameters$: Observable<{
2998
3065
  progressComplete: number;
2999
3066
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3000
- setDataChannelTimeoutCheck$: rxjs.Observable<{
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$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3020
- resetCirrusOnDestroy$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3021
- destroyRemoteConnections$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3022
- destroyConnectionAndRestart$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3023
- showUnrealError$: rxjs.Observable<{
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$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3044
- initAppByDataChannelReady$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3045
- setViewportReadyBySetLoopBackCommandIsCompleted$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3046
- startStream$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3047
- resetAfkOnPausedVideoInit$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
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$: rxjs.Observable<{
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$: rxjs.Observable<{
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$: rxjs.Observable<false> & _ngrx_effects.CreateEffectMetadata;
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$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
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$: rxjs.Observable<_ngrx_store.Action<string> | ({
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$: rxjs.Observable<{
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$: rxjs.Observable<{
3172
+ setMaxFps$: Observable<{
3106
3173
  maxFps: number;
3107
3174
  } & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
3108
- sendStatisticsToUnreal$: rxjs.Observable<Object> & _ngrx_effects.CreateEffectMetadata;
3109
- listenUnrealCallbackByInitSignalling$: rxjs.Observable<{
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$: rxjs.Observable<{
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, PingHandler, 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 };
3293
- export type { AggregatedStat, AnySignalingMessage, AwsInstance, BootstrapInfo, CandidateMessage, CloseReason, CommandInProgress, ConfigMessage, ConnectionError, ControlSchemeValues, DisconnectReasonType, EmittedMilestone, EventId, ForceClientDisconnect, FpsLowData, FreezeFrameMessage, InboundVideoStats, InputProps, InstanceReady, InstanceReserved, InterruptClientStream, ListStreamersMessage, MessageBase, MessageTypeValues, OrchestrationErrorMessage, OrchestrationMessageType, P2PEstablishedMessage, ParkedStream, PhaseEndedData, PhaseOverlay, PhaseParam, PingMessage, 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 };
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 };