@3dsource/angular-unreal-module 0.0.166 → 0.0.168

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 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,this.parked.pollingUrl=s,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,pollingUrl: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()})();
1
+ "use strict";(()=>{"use strict";const g=/metabox-configurator\/(modular|basic)\//i,m="features",k="overrideSignallingUrl",w="3dsource:region-ping",y="assets/config.json",f="https://datacenter.3dsource.com/signallingserver",b="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 S(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 r=document.getElementsByTagName("script");return r[r.length-1]})(),t=e&&e.dataset||{};this.configUrl=t.configUrl||y,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(){this.mark("prefetch_start"),this.region=this.readRegion()||"",n("region from cache:",this.region||"(none)");const e=this.readSignallingUrlOverride();return(e||this.skipRouteCheck?Promise.resolve(null):this.fetchConfig()).then(i=>{let r;if(e)n("signalling URL overridden via localStorage",e),r={type:"polling",url:e};else if(i){if(r=this.chooseEndpoint(i),r&&!this.isAllowedEndpoint(r.url)){n("skip \u2014 signalling URL not sanctioned for prefetch",r.url),this.fail("endpoint-not-allowed");return}}else if(this.fallbackPollingUrl)c("no app config \u2014 falling back to polling",this.fallbackPollingUrl),r={type:"polling",url:this.fallbackPollingUrl};else{this.fail("no-config");return}if(!r){this.fail("no-endpoint");return}n("endpoint chosen",{type:r.type,url:r.url});const s=this.adaptUrlToRegion(r.url);return this.pollOrchestration(s).then(a=>{if(!a){this.fail("no-ws-url");return}return this.parked.machineId=a,this.parked.pollingUrl=s,n("opening socket",a),this.openSocket(a)})})}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||"",S(`${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,r=new WebSocket(i);r.binaryType="arraybuffer",this.ws=r,this.parked.ws=r,this.wsTimeoutId=setTimeout(()=>{r.readyState!==WebSocket.OPEN&&this.fail("ws-timeout")},this.config.ws_timeout),r.onopen=()=>{clearTimeout(this.wsTimeoutId),this.mark("ws_open"),n("WS open \u2014 waiting for config",{region:this.region,streamRequestId:t||"(none)"})},r.onmessage=s=>this.onWsMessage(s),r.onerror=s=>{u("WS error",s),this.fail("ws-error")},r.onclose=s=>{!this.settled&&this.parked.state!=="ready"&&(c("WS closed before ready",{code:s&&s.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;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=r=>{r.candidate&&this.send({type:"iceCandidate",candidate:r.candidate})},i.ondatachannel=r=>this.wireDataChannel(r.channel),i.ontrack=r=>{r.track&&r.track.kind==="video"&&r.streams[0]&&(n("video track received"),this.stream=r.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,pollingUrl: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 r=this.state;Promise.resolve().then(()=>i(r));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,b);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
+ `),r=[];for(const s of i)if(s.startsWith("a=fmtp:")&&s.toLowerCase().includes(`profile-level-id=${t}`)){const a=s.split(":")[1]&&s.split(":")[1].split(" ")[0];a&&r.push(a)}return r.length===0?e:i.map(s=>{if(!s.startsWith("m=video"))return s;const a=s.split(" "),I=a.slice(0,3),p=a.slice(3),R=[...r.filter(d=>p.includes(d)),...p.filter(d=>!r.includes(d))];return[...I,...R].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}}readSignallingUrlOverride(){try{const e=localStorage.getItem(k);if(!e)return"";const t=e.charAt(0)==='"'?JSON.parse(e):e;return typeof t=="string"?t.trim():""}catch{return""}}readRegion(){try{const e=localStorage.getItem(w);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 r=new AbortController;t.signal=r.signal;const s=setTimeout(()=>r.abort(),i);return fetch(e,t).finally(()=>clearTimeout(s))}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()})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@3dsource/angular-unreal-module",
3
- "version": "0.0.166",
3
+ "version": "0.0.168",
4
4
  "description": "Angular integration for Unreal Engine Pixel Streaming",
5
5
  "keywords": [
6
6
  "3dsource",
@@ -19,7 +19,6 @@
19
19
  "tslib": "^2.8.1"
20
20
  },
21
21
  "peerDependencies": {
22
- "@3dsource/source-ui-native": ">=1.0.9",
23
22
  "@3dsource/types-unreal": ">=0.0.7",
24
23
  "@3dsource/utils": ">=1.0.21",
25
24
  "@angular/cdk": ">=19.0.0 <23.0.0",
@@ -716,6 +716,12 @@ interface BootstrapInfo {
716
716
  * `track()`; the server buckets files under `data/<userId>/<sessionId>`. */
717
717
  interface TelemetryEventEnvelope {
718
718
  readonly userId: string;
719
+ /**
720
+ * The stream's connection id (`selectCirrusConnectionId`) — the id Cirrus
721
+ * runs this player under, shown as "Connection Id" in the debug overlay. Falls
722
+ * back to a locally generated uuid only when the attempt never got one.
723
+ * Stamped centrally by `track()`, so the value the emitters pass is ignored.
724
+ */
719
725
  readonly sessionId: string;
720
726
  }
721
727
  /** Lifecycle events additionally carry a phase-local `duration` — ms since
@@ -1640,6 +1646,8 @@ declare class StreamStatusTelemetryService2 {
1640
1646
  /** Streamer identity for the adopted signaling phase params. */
1641
1647
  private readonly ssData$;
1642
1648
  private readonly awsInstance$;
1649
+ /** The session's connection id — shipped as `sessionId` on every event. */
1650
+ private readonly connectionId$;
1643
1651
  private session;
1644
1652
  /**
1645
1653
  * Whether a session has already started during the current page lifetime.
@@ -1687,6 +1695,15 @@ declare class StreamStatusTelemetryService2 {
1687
1695
  private init;
1688
1696
  private startSession;
1689
1697
  private endSession;
1698
+ /**
1699
+ * Adopt the stream's connection id as this session's wire id and release the
1700
+ * queue. The id becomes a file name on the collector, so anything that isn't
1701
+ * a plain `[A-Za-z0-9_-]{1,64}` token is rejected (the collector answers 400
1702
+ * to those — that would drop the whole session) and the local uuid is kept.
1703
+ */
1704
+ private resolveWireId;
1705
+ /** Emit every queued event under `sessionId`, in emission order. */
1706
+ private flushOutbox;
1690
1707
  /**
1691
1708
  * Emit a lifecycle event with a `duration` field — ms between the
1692
1709
  * previous lifecycle event and now (phase-local, NOT anchor-relative).
@@ -1728,7 +1745,9 @@ declare class StreamStatusTelemetryService2 {
1728
1745
  */
1729
1746
  private emitAdoptedPhase;
1730
1747
  /** Streamer identity params for the adopted signaling phase — mirrors the
1731
- * `ssinfo-received` closer's shape (client / instanceName / …ssData). */
1748
+ * `ssinfo-received` closer's shape (client / instanceName / …ssData /
1749
+ * connectionId). For an adopted stream `ssData` is the one the prefetch
1750
+ * captured and `streamAdopted` hydrated into the store. */
1732
1751
  private adoptedSignalingParams;
1733
1752
  /** Read the region-ping cache the prefetch reused (localStorage), so the
1734
1753
  * adopted region phase can still report the winning region + samples. */
@@ -1774,7 +1793,15 @@ declare class StreamStatusTelemetryService2 {
1774
1793
  */
1775
1794
  private collectResourceTotals;
1776
1795
  private aggregate;
1796
+ /**
1797
+ * Ship one event — or queue it when the session id isn't resolved yet.
1798
+ *
1799
+ * `sessionId` written by the callers is the local fallback; the value that
1800
+ * goes on the wire is always the resolved one ({@link SessionState.wireId}),
1801
+ * stamped here so every event of a session shares a single id.
1802
+ */
1777
1803
  private track;
1804
+ private emit;
1778
1805
  static ɵfac: i0.ɵɵFactoryDeclaration<StreamStatusTelemetryService2, never>;
1779
1806
  static ɵprov: i0.ɵɵInjectableDeclaration<StreamStatusTelemetryService2>;
1780
1807
  }
@@ -3258,7 +3285,21 @@ declare const selectIsExistMatchUrls: _ngrx_store.MemoizedSelector<Record<string
3258
3285
  declare const selectIsAutostart: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: _3dsource_angular_unreal_module.StreamConfig) => boolean>;
3259
3286
  declare const selectShowReconnectPopup: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
3260
3287
  declare const selectShowLoader: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
3261
- declare const selectSignalingParameters: _ngrx_store.MemoizedSelector<Record<string, any>, string, (s1: _3dsource_angular_unreal_module.SignalingData | null, s2: _3dsource_angular_unreal_module.AwsInstance) => string>;
3288
+ /**
3289
+ * The connection id of the current stream session.
3290
+ *
3291
+ * The id is issued on the Cirrus side and reaches us either as the
3292
+ * orchestration's `streamRequestId` (polling response / `instanceReserved` /
3293
+ * `instanceReady`) or, when the backend issues none, in the `ssInfo` message
3294
+ * once Cirrus generated it itself. Inside the player it is ONE value —
3295
+ * `connectionId` — and this selector is where the two arrival paths collapse
3296
+ * into it. It names the session everywhere: the debug overlay ("Connection Id")
3297
+ * and the stream telemetry's `sessionId`.
3298
+ *
3299
+ * Also used by external consumers (e.g., metabox). Do not remove.
3300
+ */
3301
+ declare const selectCirrusConnectionId: _ngrx_store.MemoizedSelector<Record<string, any>, string | undefined, (s1: _3dsource_angular_unreal_module.AwsInstance, s2: _3dsource_angular_unreal_module.SignalingData | null) => string | undefined>;
3302
+ declare const selectSignalingParameters: _ngrx_store.MemoizedSelector<Record<string, any>, string, (s1: _3dsource_angular_unreal_module.SignalingData | null, s2: _3dsource_angular_unreal_module.AwsInstance, s3: string | undefined) => string>;
3262
3303
  declare const selectClientAndViewIds: _ngrx_store.MemoizedSelector<Record<string, any>, {
3263
3304
  clientId: string | null;
3264
3305
  viewId: string | null;
@@ -3280,19 +3321,6 @@ declare const selectIsLoaderScreenVisible: _ngrx_store.MemoizedSelector<Record<s
3280
3321
  * producing a small visual step that indicates the WS handshake succeeded.
3281
3322
  */
3282
3323
  declare const selectTotalProgress: _ngrx_store.MemoizedSelector<Record<string, any>, number, (s1: number | null, s2: number, s3: _3dsource_angular_unreal_module.AwsInstance, s4: boolean) => number>;
3283
- /**
3284
- * The connection id of the current stream session.
3285
- *
3286
- * Primary source is the orchestration, which issues it as `streamRequestId` —
3287
- * in the polling response (legacy flow) or in `instanceReserved`/`instanceReady`
3288
- * (new orchestration) — and the browser hands it to Cirrus on the WS upgrade
3289
- * URL. `ssData.connectionId` (the `ssInfo` message) is the fallback for
3290
- * backends that don't issue one yet: Cirrus then generates it itself and
3291
- * reports it back here.
3292
- *
3293
- * Used by external consumers (e.g., metabox). Do not remove.
3294
- */
3295
- declare const selectCirrusConnectionId: _ngrx_store.MemoizedSelector<Record<string, any>, string | undefined, (s1: _3dsource_angular_unreal_module.AwsInstance, s2: _3dsource_angular_unreal_module.SignalingData | null) => string | undefined>;
3296
3324
  /** Used by external consumers (e.g., metabox). Do not remove. */
3297
3325
  declare const selectUserInactivityDetected: _ngrx_store.MemoizedSelector<Record<string, any>, {
3298
3326
  remainingSecondsToDisconnect: number;