@3dsource/angular-unreal-module 0.0.160 → 0.0.162
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/LICENSE +14 -14
- package/README.md +221 -212
- package/fesm2022/3dsource-angular-unreal-module.mjs +347 -88
- package/fesm2022/3dsource-angular-unreal-module.mjs.map +1 -1
- package/js/stream-prefetch.js +4 -4
- package/package.json +1 -1
- package/types/3dsource-angular-unreal-module.d.ts +102 -19
package/js/stream-prefetch.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";(()=>{"use strict";const g=/metabox-configurator\/(modular|basic)\//i,m="3dsource:region-ping",
|
|
2
|
-
`);let i="maxaveragebitrate=510000;";return i+=this.forceMonoAudio?"stereo=0;":"stereo=1;",i+="useinbandfec=1",
|
|
3
|
-
`),s=[];for(const r of i)if(r.startsWith("a=fmtp:")&&r.toLowerCase().includes(`profile-level-id=${
|
|
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]",n=(...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()},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(t=>this.fail("exception",t));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(t=>this.fail("exception",t))}}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(e=>{let i;if(e){if(i=this.chooseEndpoint(e),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 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?b(`${window.location.protocol}//${i.signallingServer}`):null).catch(()=>null)}adaptUrlToRegion(t){return this.region&&t.indexOf(":region")===-1?t.replace(/signallingserver/gi,`signallingserver/region:${this.region}`):t}openSocket(t){const e=new WebSocket(t);e.binaryType="arraybuffer",this.ws=e,this.parked.ws=e,this.wsTimeoutId=setTimeout(()=>{e.readyState!==WebSocket.OPEN&&this.fail("ws-timeout")},this.config.ws_timeout),e.onopen=()=>{clearTimeout(this.wsTimeoutId),this.mark("ws_open"),n("WS open \u2014 waiting for config",{region:this.region})},e.onmessage=i=>this.onWsMessage(i),e.onerror=i=>{u("WS error",i),this.fail("ws-error")},e.onclose=i=>{!this.settled&&this.parked.state!=="ready"&&(c("WS closed before ready",{code:i&&i.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(n("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;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(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,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(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(()=>{n("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=()=>{n("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",n("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 r of i)if(r.startsWith("a=fmtp:")&&r.toLowerCase().includes(`profile-level-id=${e}`)){const a=r.split(":")[1]&&r.split(":")[1].split(" ")[0];a&&s.push(a)}return s.length===0?t: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(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 r=setTimeout(()=>s.abort(),i);return fetch(t,e).finally(()=>clearTimeout(r))}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
|
@@ -389,12 +389,19 @@ declare const OrchestrationMessageTypes: {
|
|
|
389
389
|
readonly p2pEstablished: "p2pEstablished";
|
|
390
390
|
readonly instanceReserved: "instanceReserved";
|
|
391
391
|
readonly playerDisconnected: "playerDisconnected";
|
|
392
|
-
readonly streamPreparedForUserInteraction: "streamPreparedForUserInteraction";
|
|
393
392
|
readonly streamerDisconnected: "streamerDisconnected";
|
|
394
393
|
readonly interruptClientStream: "interruptClientStream";
|
|
395
394
|
};
|
|
396
|
-
interface InstanceReady extends
|
|
395
|
+
interface InstanceReady extends MessageBase {
|
|
397
396
|
type: 'instanceReady';
|
|
397
|
+
correlationId: string;
|
|
398
|
+
payload: {
|
|
399
|
+
instanceId: string;
|
|
400
|
+
originInstanceId: string;
|
|
401
|
+
ipAddress: string;
|
|
402
|
+
streamRequestId: string;
|
|
403
|
+
originInstanceUri: string;
|
|
404
|
+
};
|
|
398
405
|
}
|
|
399
406
|
interface InstanceReserved extends InstanceMessageBase {
|
|
400
407
|
type: 'instanceReserved';
|
|
@@ -464,10 +471,6 @@ interface P2PEstablishedMessage extends MessageBase {
|
|
|
464
471
|
source: string;
|
|
465
472
|
sessionId: string;
|
|
466
473
|
}
|
|
467
|
-
interface streamPreparedForUserInteractionMessage extends MessageBase {
|
|
468
|
-
type: 'streamPreparedForUserInteraction';
|
|
469
|
-
correlationId: string;
|
|
470
|
-
}
|
|
471
474
|
interface RequestStream extends MessageBase {
|
|
472
475
|
type: 'requestStream';
|
|
473
476
|
correlationId: string;
|
|
@@ -542,7 +545,6 @@ interface SignalingMessageMap {
|
|
|
542
545
|
[OrchestrationMessageTypes.p2pEstablished]: P2PEstablishedMessage;
|
|
543
546
|
[OrchestrationMessageTypes.instanceReserved]: InstanceReserved;
|
|
544
547
|
[OrchestrationMessageTypes.playerDisconnected]: ForceClientDisconnect;
|
|
545
|
-
[OrchestrationMessageTypes.streamPreparedForUserInteraction]: streamPreparedForUserInteractionMessage;
|
|
546
548
|
[OrchestrationMessageTypes.streamerDisconnected]: ForceClientDisconnect;
|
|
547
549
|
[OrchestrationMessageTypes.interruptClientStream]: InterruptClientStream;
|
|
548
550
|
}
|
|
@@ -1115,6 +1117,18 @@ declare class ConsoleExtensionsService extends SubService {
|
|
|
1115
1117
|
private readonly unrealConfig;
|
|
1116
1118
|
constructor();
|
|
1117
1119
|
protected init(): void;
|
|
1120
|
+
/**
|
|
1121
|
+
* Hammer the reconnect paths: repeatedly drop the DataChannel / PeerConnection
|
|
1122
|
+
* (and rapid combos) and assert the stream recovers each time. Recovery is
|
|
1123
|
+
* measured off the store's `dataChannelConnected` flag (the source of truth,
|
|
1124
|
+
* regardless of transport flow — old relay or new stream socket).
|
|
1125
|
+
*
|
|
1126
|
+
* Console: await stressTest() · await stressTest({ iterations: 100 })
|
|
1127
|
+
*/
|
|
1128
|
+
private stressTest;
|
|
1129
|
+
/** Resolve true once `dataChannelConnected` reaches `target`, or false on timeout. */
|
|
1130
|
+
private waitDataChannel;
|
|
1131
|
+
private sleep;
|
|
1118
1132
|
private unrealHelp;
|
|
1119
1133
|
static ɵfac: i0.ɵɵFactoryDeclaration<ConsoleExtensionsService, never>;
|
|
1120
1134
|
static ɵprov: i0.ɵɵInjectableDeclaration<ConsoleExtensionsService>;
|
|
@@ -1232,9 +1246,11 @@ declare class RegionsPingService {
|
|
|
1232
1246
|
* All access is guarded — `localStorage` can throw (private mode, disabled
|
|
1233
1247
|
* storage) or be absent (non-browser).
|
|
1234
1248
|
*
|
|
1235
|
-
* Public so adopted connections (which skip `getFastest`) can
|
|
1249
|
+
* Public so adopted connections (which skip `getFastest`) can still report a
|
|
1236
1250
|
* region-resolving telemetry phase from the same cached winner — see
|
|
1237
|
-
* `
|
|
1251
|
+
* `StreamStatusTelemetryService2.emitAdoptedConnection`. Returns `null` when
|
|
1252
|
+
* the region-ping prefetch never ran or its cache expired; that phase then
|
|
1253
|
+
* carries no region and no ping samples.
|
|
1238
1254
|
*/
|
|
1239
1255
|
readCachedWinner(): {
|
|
1240
1256
|
region_code: string;
|
|
@@ -1306,6 +1322,10 @@ declare class SignallingService extends SubService {
|
|
|
1306
1322
|
onWebRtcAnswer$: Subject<RTCSessionDescriptionInit | null>;
|
|
1307
1323
|
abort$: Observable<_ngrx_store.Action<string>>;
|
|
1308
1324
|
private ws;
|
|
1325
|
+
private streamWs;
|
|
1326
|
+
private streamMachineConnected;
|
|
1327
|
+
private streamMachineRetryCount;
|
|
1328
|
+
private streamWsSub?;
|
|
1309
1329
|
orchestrationRetrySub?: Subscription;
|
|
1310
1330
|
private wsMsgHandlers;
|
|
1311
1331
|
protected correlationId: string;
|
|
@@ -1321,6 +1341,16 @@ declare class SignallingService extends SubService {
|
|
|
1321
1341
|
* retry which re-pings the region.
|
|
1322
1342
|
*/
|
|
1323
1343
|
private connectAttempt;
|
|
1344
|
+
/**
|
|
1345
|
+
* Status message for the connect branch. It does NOT dispatch
|
|
1346
|
+
* `setEstablishingConnection` — `UnrealEffects.connectToSignaling$` already
|
|
1347
|
+
* emits that once per logical attempt via `startWith(...)`, covering BOTH
|
|
1348
|
+
* branches (prefetch adoption and a fresh connect). Dispatching it here as
|
|
1349
|
+
* well fired the boundary twice on every cold start, and since
|
|
1350
|
+
* `StreamStatusTelemetryService2` starts a session on that boundary, the
|
|
1351
|
+
* first session was killed 2 ms in as `restart` — losing the only honest
|
|
1352
|
+
* page-load measurement and the prefetch adoption with it.
|
|
1353
|
+
*/
|
|
1324
1354
|
protected startEstablishingConnection(): void;
|
|
1325
1355
|
private adaptUrlsToRegion;
|
|
1326
1356
|
/**
|
|
@@ -1361,6 +1391,8 @@ declare class SignallingService extends SubService {
|
|
|
1361
1391
|
private pollLoop;
|
|
1362
1392
|
private connectToCirrus;
|
|
1363
1393
|
private addWsHandlers;
|
|
1394
|
+
private onOrchestrationClose;
|
|
1395
|
+
private onOrchestrationError;
|
|
1364
1396
|
/**
|
|
1365
1397
|
* Adopt a live signalling socket opened by the `stream-prefetch.js`
|
|
1366
1398
|
* head-script. The socket is already OPEN and `requestStream` was already
|
|
@@ -1370,18 +1402,54 @@ declare class SignallingService extends SubService {
|
|
|
1370
1402
|
* `correlationId` so subsequent correlated messages line up.
|
|
1371
1403
|
*/
|
|
1372
1404
|
adoptSocket(ws: WebSocket, correlationId: string): void;
|
|
1405
|
+
/**
|
|
1406
|
+
* Open the SECOND socket, directly to the stream machine's Cirrus
|
|
1407
|
+
* (`originInstanceUri` from `instanceReady`). The whole WebRTC signalling
|
|
1408
|
+
* (config/offer/answer/iceCandidate/ping) flows over this socket; the
|
|
1409
|
+
* orchestration socket (`this.ws`) stays open for control/lifecycle.
|
|
1410
|
+
*
|
|
1411
|
+
* "Just connect" — nothing is sent on open (the machine is already reserved
|
|
1412
|
+
* for this session): Cirrus pushes `config` and Unreal sends the `offer`.
|
|
1413
|
+
*/
|
|
1414
|
+
connectToStreamMachine(originInstanceUri: string): void;
|
|
1415
|
+
/**
|
|
1416
|
+
* The stream-machine (Cirrus) connection failed. Re-request a machine over
|
|
1417
|
+
* the still-open orchestration socket: orchestration issues a new
|
|
1418
|
+
* streamRequestId and a fresh `instanceReady(originInstanceUri)`, which calls
|
|
1419
|
+
* {@link connectToStreamMachine} again on a different machine. Bounded by
|
|
1420
|
+
* {@link INNER_RETRY_LIMIT}; on exhaustion the stream is dropped.
|
|
1421
|
+
*/
|
|
1422
|
+
private retryStreamMachine;
|
|
1423
|
+
private addStreamWsHandlers;
|
|
1424
|
+
private teardownStreamWs;
|
|
1373
1425
|
private showStatusMessage;
|
|
1374
1426
|
/**
|
|
1375
1427
|
* Close the connection with the signaling server
|
|
1376
1428
|
* @param data
|
|
1377
1429
|
*/
|
|
1378
1430
|
close(data: CloseReason): void;
|
|
1431
|
+
private teardownSocket;
|
|
1379
1432
|
send(data: AnySignalingMessage): void;
|
|
1433
|
+
/**
|
|
1434
|
+
* Send player signalling (offer/answer/iceCandidate/pong/p2pEstablished/
|
|
1435
|
+
* subscribe) over the ACTIVE signalling socket: the stream-machine socket in
|
|
1436
|
+
* the new flow (once connected), or the orchestration/relay socket in the old
|
|
1437
|
+
* polling flow (where there is no separate stream socket).
|
|
1438
|
+
*/
|
|
1439
|
+
sendPlayerSignal(data: AnySignalingMessage): void;
|
|
1440
|
+
private sendTo;
|
|
1380
1441
|
protected handleMessage(msg: MessageBase): void;
|
|
1381
1442
|
private setHandlersFromStream;
|
|
1382
1443
|
protected sendRequestStream(): void;
|
|
1383
1444
|
/**
|
|
1384
|
-
* Check if the
|
|
1445
|
+
* Check if the ACTIVE player-signalling socket is open and ready. Mirrors
|
|
1446
|
+
* {@link sendPlayerSignal}'s socket choice so peer-reconnect gating is correct
|
|
1447
|
+
* in both flows:
|
|
1448
|
+
* - NEW flow (`streamMachineConnected`): the stream-machine socket
|
|
1449
|
+
* (`streamWs`). The orchestration socket (`this.ws`) is intentionally
|
|
1450
|
+
* closed after occupancy, so checking it would wrongly report "not
|
|
1451
|
+
* connected" and block reconnect.
|
|
1452
|
+
* - OLD polling flow: the single relay socket (`this.ws`) — unchanged.
|
|
1385
1453
|
*/
|
|
1386
1454
|
isConnected(): boolean;
|
|
1387
1455
|
private getRegion;
|
|
@@ -1420,11 +1488,12 @@ declare class StreamAdoptionService {
|
|
|
1420
1488
|
*
|
|
1421
1489
|
* Wrapped in `defer` so the `tryAdopt()` side effect (which dispatches
|
|
1422
1490
|
* `streamAdopted`) runs at SUBSCRIPTION time, not when the observable is
|
|
1423
|
-
* built. The effect prepends `startWith(setEstablishingConnection(true))
|
|
1424
|
-
*
|
|
1425
|
-
*
|
|
1426
|
-
* `
|
|
1427
|
-
* exist yet and is lost. `defer`
|
|
1491
|
+
* built. The effect prepends `startWith(setEstablishingConnection(true))` —
|
|
1492
|
+
* the single dispatch site for that boundary — which starts the telemetry
|
|
1493
|
+
* session and subscribes its phase catalog; that must happen BEFORE
|
|
1494
|
+
* `streamAdopted`, or `emitAdoptedConnection` fires into a session that does
|
|
1495
|
+
* not exist yet and the whole connection waterfall is lost. `defer`
|
|
1496
|
+
* guarantees that ordering.
|
|
1428
1497
|
*/
|
|
1429
1498
|
awaitAndAdopt$(): Observable<boolean>;
|
|
1430
1499
|
/**
|
|
@@ -2231,7 +2300,7 @@ declare function IceCandidateHandler(this: SignallingService, msg: {
|
|
|
2231
2300
|
candidate: RTCIceCandidate;
|
|
2232
2301
|
}): void;
|
|
2233
2302
|
|
|
2234
|
-
declare function InstanceReadyHandler(this: SignallingService): void;
|
|
2303
|
+
declare function InstanceReadyHandler(this: SignallingService, msg: InstanceReady): void;
|
|
2235
2304
|
|
|
2236
2305
|
declare function InstanceReservedHandler(this: SignallingService, msg: InstanceReserved): void;
|
|
2237
2306
|
|
|
@@ -2604,9 +2673,23 @@ declare const setOrchestrationParameters: _ngrx_store.ActionCreator<string, (pro
|
|
|
2604
2673
|
/**
|
|
2605
2674
|
* Dispatched when the orchestration server signals that the reserved
|
|
2606
2675
|
* instance is ready to serve the stream (`instanceReady` WS message).
|
|
2607
|
-
*
|
|
2676
|
+
* Carries the stream-machine coordinates — `originInstanceUri` is used to
|
|
2677
|
+
* open the second (stream-machine) signalling socket. Also consumed by
|
|
2678
|
+
* telemetry as a phase marker.
|
|
2608
2679
|
*/
|
|
2609
|
-
declare const instanceReady: _ngrx_store.ActionCreator<string, (
|
|
2680
|
+
declare const instanceReady: _ngrx_store.ActionCreator<string, (props: {
|
|
2681
|
+
instanceId: string;
|
|
2682
|
+
originInstanceId: string;
|
|
2683
|
+
ipAddress: string;
|
|
2684
|
+
streamRequestId: string;
|
|
2685
|
+
originInstanceUri: string;
|
|
2686
|
+
}) => {
|
|
2687
|
+
instanceId: string;
|
|
2688
|
+
originInstanceId: string;
|
|
2689
|
+
ipAddress: string;
|
|
2690
|
+
streamRequestId: string;
|
|
2691
|
+
originInstanceUri: string;
|
|
2692
|
+
} & _ngrx_store.Action<string>>;
|
|
2610
2693
|
/**
|
|
2611
2694
|
* Dispatched when `RegionsPingService.getFastest()` begins — right
|
|
2612
2695
|
* before the region-list HTTP request goes out. Bookends the entire
|
|
@@ -3151,4 +3234,4 @@ declare const selectUserInactivityDetected: _ngrx_store.MemoizedSelector<Record<
|
|
|
3151
3234
|
declare const selectIsVideoPlayingAndDataChannelConnected: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
|
|
3152
3235
|
|
|
3153
3236
|
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 };
|
|
3154
|
-
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
|
|
3237
|
+
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 };
|