@3dsource/angular-unreal-module 0.0.101-dev.5 → 0.0.101-dev.6
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.
|
@@ -979,7 +979,7 @@ const selectSignalingParameters = createSelector(unrealFeature.selectSsData, unr
|
|
|
979
979
|
* Returns Scene load progress as a float value in between 0-1
|
|
980
980
|
*/
|
|
981
981
|
const selectTotalProgress = createSelector(unrealFeature.selectStatusPercentSignallingServer, selectCommandProgress, unrealFeature.selectAwsInstance, unrealFeature.selectDataChannelConnected, (statusPercentSignallingServer, commandProgress, awsInstance, dataChannelConnected) => {
|
|
982
|
-
//TODO make better mechanism to detect is new orchestration
|
|
982
|
+
// TODO make better mechanism to detect is new orchestration
|
|
983
983
|
const isNewOrchestration = String(awsInstance?.wsUrl).match(/^wss:\/\/orchestration-websocket/i);
|
|
984
984
|
const newOrchestrationProgressComplete = dataChannelConnected
|
|
985
985
|
? 100
|
|
@@ -1378,7 +1378,7 @@ class CommandsEffects {
|
|
|
1378
1378
|
this.listenUnrealCallbackByInitSignalling$ = createEffect(() => {
|
|
1379
1379
|
return this.actions$.pipe(ofType(initSignalling), filter(() => !this.unrealInitialConfig?.playwright), switchMap(() => this.actions$.pipe(ofType(unrealCommandCallback), map(({ json }) => 'commandCallback' in json
|
|
1380
1380
|
? json.commandCallback?.correlationId
|
|
1381
|
-
: json?.correlationId), filter(Truthy),
|
|
1381
|
+
: json?.correlationId), filter(Truthy), map((id) => commandCompleted({ id })))));
|
|
1382
1382
|
});
|
|
1383
1383
|
}
|
|
1384
1384
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandsEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
@@ -2113,8 +2113,13 @@ function createWebSocket(wsUrl) {
|
|
|
2113
2113
|
Logger.info('Creating socket', wsUrl);
|
|
2114
2114
|
return defer(() => new Observable((observer) => {
|
|
2115
2115
|
const ws = new WebSocket(wsUrl);
|
|
2116
|
+
let opened = false;
|
|
2117
|
+
let emitted = false;
|
|
2116
2118
|
const onOpen = () => {
|
|
2119
|
+
opened = true;
|
|
2120
|
+
emitted = true;
|
|
2117
2121
|
observer.next(ws); // connection established
|
|
2122
|
+
observer.complete(); // single-value observable — done
|
|
2118
2123
|
};
|
|
2119
2124
|
const onError = (ev) => {
|
|
2120
2125
|
const err = ev && 'error' in ev && ev?.error instanceof Error
|
|
@@ -2123,7 +2128,7 @@ function createWebSocket(wsUrl) {
|
|
|
2123
2128
|
observer.error(err);
|
|
2124
2129
|
};
|
|
2125
2130
|
const onClose = (ev) => {
|
|
2126
|
-
if (
|
|
2131
|
+
if (!opened) {
|
|
2127
2132
|
observer.error(new Error(`WebSocket closed before open (code ${ev.code})`));
|
|
2128
2133
|
}
|
|
2129
2134
|
};
|
|
@@ -2134,6 +2139,14 @@ function createWebSocket(wsUrl) {
|
|
|
2134
2139
|
ws.removeEventListener('open', onOpen);
|
|
2135
2140
|
ws.removeEventListener('error', onError);
|
|
2136
2141
|
ws.removeEventListener('close', onClose);
|
|
2142
|
+
// Only close the socket if it was never delivered to the consumer.
|
|
2143
|
+
// Once emitted, the consumer owns the socket (e.g. connectToCirrus
|
|
2144
|
+
// attaches its own handlers). Closing here would break downstream.
|
|
2145
|
+
if (!emitted &&
|
|
2146
|
+
(ws.readyState === WebSocket.CONNECTING ||
|
|
2147
|
+
ws.readyState === WebSocket.OPEN)) {
|
|
2148
|
+
ws.close();
|
|
2149
|
+
}
|
|
2137
2150
|
};
|
|
2138
2151
|
})).pipe(timeout$1({
|
|
2139
2152
|
first: WS_TIMEOUT, // fail if no 'open' event in this window
|
|
@@ -2231,7 +2244,7 @@ class SignallingService extends SubService {
|
|
|
2231
2244
|
this.correlationId = generateUuid();
|
|
2232
2245
|
this.commandTelemetryService.reset();
|
|
2233
2246
|
this.startEstablishingConnection();
|
|
2234
|
-
return defer(() => this.getRegion().pipe(tap((region) => this.region.set(region ?? '')), map$1((region) => this.adaptUrlsToRegion(urlList, region)), switchMap((urls) => this.getAwsInstance(urls).pipe(take(1))), tap((awsInstance) => this.store.dispatch(setAwsInstance(awsInstance))), switchMap(({ wsUrl }) => this.connectToCirrus(wsUrl ?? '')
|
|
2247
|
+
return defer(() => this.getRegion().pipe(tap((region) => this.region.set(region ?? '')), map$1((region) => this.adaptUrlsToRegion(urlList, region)), switchMap((urls) => this.getAwsInstance(urls).pipe(take(1))), tap((awsInstance) => this.store.dispatch(setAwsInstance(awsInstance))), switchMap(({ wsUrl }) => this.connectToCirrus(wsUrl ?? '').pipe(filter(Truthy), take(1))), takeUntil(this.abort$))).pipe(
|
|
2235
2248
|
// Retry the whole attempt on error, advancing to the next URL each time.
|
|
2236
2249
|
retry({
|
|
2237
2250
|
delay: (err, attempt) => {
|
|
@@ -5497,7 +5510,7 @@ class UnrealStatusComponent {
|
|
|
5497
5510
|
* A subscription that merges various status observables and emits debounced status via postMessage.
|
|
5498
5511
|
*/
|
|
5499
5512
|
merge(nullifyObs$, cirrusConnected$, signalingStatus$, streamToggle$)
|
|
5500
|
-
.pipe(
|
|
5513
|
+
.pipe(tapLog('STATUS=>'), debounceTime$1(0), takeUntilDestroyed(this.destroyRef))
|
|
5501
5514
|
.subscribe((status) => this.sendMessageToIndex(status));
|
|
5502
5515
|
}
|
|
5503
5516
|
/**
|
|
@@ -5652,11 +5665,11 @@ class VideoStatsComponent {
|
|
|
5652
5665
|
}));
|
|
5653
5666
|
}
|
|
5654
5667
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoStatsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5655
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: VideoStatsComponent, isStandalone: true, selector: "app-video-stats", ngImport: i0, template: "@if (videoStatus() && viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Stats
|
|
5668
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: VideoStatsComponent, isStandalone: true, selector: "app-video-stats", ngImport: i0, template: "@if (videoStatus() && viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Stats</button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed()\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [stat]=\"fpsTick()!\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [stat]=\"videoQP()!\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <li>\n <app-stat-graph\n [stat]=\"bitrateTick()!\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [stat]=\"(graph.stat | async)!\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed()) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n}\n", styles: [".settings-container{position:absolute;top:65px;left:10px;z-index:1000;bottom:10px}.gear-button{left:0;width:50px;position:absolute;background:none;cursor:pointer;font-size:10px;font-weight:500;border:1px solid;border-radius:9px;background:#0162cc;color:#fff;padding:4px}.gear-button>*{color:#fff;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}#aggregatedStats{max-height:calc(100% - 25px);overflow-y:auto;margin-top:25px;left:20px;z-index:31;max-width:400px;padding:10px;background-color:#fff3;border:1px solid grey}#aggregatedStats>*{color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}#aggregatedStats:empty{display:none}#aggregatedStats button{position:absolute;right:5px;top:5px}#aggregatedStats.min{display:none}#aggregatedStats .forNerds{width:100%}#aggregatedStats .forNerds li{list-style-type:none;height:60px}#aggregatedStats .forNerds li app-stat-graph{display:block;width:100%;height:100%}#aggregatedStats .stat span{font-weight:700}#aggregatedStats .stat,#aggregatedStats .graph{cursor:pointer}#aggregatedStats .static{pointer-events:all}.ssInfo{position:absolute;top:0;left:50%;transform:translate(-50%);color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000;text-align:center;width:80%;pointer-events:none}\n"], dependencies: [{ kind: "component", type: StatGraphComponent, selector: "app-stat-graph", inputs: ["label", "stat", "color", "tickStep"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "pipe", type: SafePipe, name: "safe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5656
5669
|
}
|
|
5657
5670
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoStatsComponent, decorators: [{
|
|
5658
5671
|
type: Component,
|
|
5659
|
-
args: [{ selector: 'app-video-stats', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StatGraphComponent, AsyncPipe, JsonPipe, SafePipe], template: "@if (videoStatus() && viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Stats
|
|
5672
|
+
args: [{ selector: 'app-video-stats', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StatGraphComponent, AsyncPipe, JsonPipe, SafePipe], template: "@if (videoStatus() && viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Stats</button>\n <div (click)=\"toggle()\" [class.min]=\"collapsed()\" id=\"aggregatedStats\">\n <div class=\"forNerds\">\n <div (click)=\"$event.stopPropagation()\" class=\"static\">\n <li>\n <app-stat-graph\n [stat]=\"fpsTick()!\"\n label=\"FPS (higher is better)\"\n />\n </li>\n <li>\n <app-stat-graph\n [stat]=\"videoQP()!\"\n label=\"QP (lower is better)\"\n color=\"#D5ff07\"\n />\n </li>\n <li>\n <app-stat-graph\n [stat]=\"bitrateTick()!\"\n label=\"Bitrate\"\n color=\"#D57F07\"\n />\n </li>\n </div>\n <div>\n @for (graph of graphList$ | async; track graph) {\n <li (click)=\"toggleGraph($event, graph.key, 0)\" class=\"graph\">\n <app-stat-graph\n [label]=\"graph.key\"\n [stat]=\"(graph.stat | async)!\"\n [color]=\"graph.color\"\n />\n </li>\n }\n </div>\n </div>\n\n @for (el of videoStatus(); track el.key + $index) {\n <div (click)=\"toggleGraph($event, el.key, el.value)\" class=\"stat\">\n <span>{{ el.key }}: </span>{{ el.value | json }}\n </div>\n }\n </div>\n </div>\n @if (!collapsed()) {\n <div [innerHTML]=\"ssInfo() | safe: 'html'\" class=\"ssInfo\"></div>\n }\n}\n", styles: [".settings-container{position:absolute;top:65px;left:10px;z-index:1000;bottom:10px}.gear-button{left:0;width:50px;position:absolute;background:none;cursor:pointer;font-size:10px;font-weight:500;border:1px solid;border-radius:9px;background:#0162cc;color:#fff;padding:4px}.gear-button>*{color:#fff;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}#aggregatedStats{max-height:calc(100% - 25px);overflow-y:auto;margin-top:25px;left:20px;z-index:31;max-width:400px;padding:10px;background-color:#fff3;border:1px solid grey}#aggregatedStats>*{color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}#aggregatedStats:empty{display:none}#aggregatedStats button{position:absolute;right:5px;top:5px}#aggregatedStats.min{display:none}#aggregatedStats .forNerds{width:100%}#aggregatedStats .forNerds li{list-style-type:none;height:60px}#aggregatedStats .forNerds li app-stat-graph{display:block;width:100%;height:100%}#aggregatedStats .stat span{font-weight:700}#aggregatedStats .stat,#aggregatedStats .graph{cursor:pointer}#aggregatedStats .static{pointer-events:all}.ssInfo{position:absolute;top:0;left:50%;transform:translate(-50%);color:#fff;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000;text-align:center;width:80%;pointer-events:none}\n"] }]
|
|
5660
5673
|
}], ctorParameters: () => [] });
|
|
5661
5674
|
|
|
5662
5675
|
class ResumeStreamButtonComponent {
|