@3dsource/angular-unreal-module 0.0.105 → 0.0.106-dev.1
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 +369 -369
- package/fesm2022/3dsource-angular-unreal-module.mjs +538 -602
- package/fesm2022/3dsource-angular-unreal-module.mjs.map +1 -1
- package/package.json +1 -1
- package/types/3dsource-angular-unreal-module.d.ts +72 -141
- package/types/3dsource-angular-unreal-module.d.ts.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, ChangeDetectionStrategy, Component, Injectable, signal, Pipe, input, ElementRef, viewChild, effect, afterNextRender, HostListener,
|
|
2
|
+
import { InjectionToken, inject, ChangeDetectionStrategy, Component, Injectable, DestroyRef, signal, Pipe, input, ElementRef, viewChild, effect, untracked, afterNextRender, HostListener, computed, output, makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';
|
|
3
3
|
import { SourceButtonComponent, SourceLoadingComponent } from '@3dsource/source-ui-native';
|
|
4
4
|
import { map as map$1, distinctUntilChanged, takeWhile, filter, tap, withLatestFrom, exhaustMap, catchError, takeUntil, switchMap as switchMap$1, timeout as timeout$1, debounceTime as debounceTime$1, delay, skip as skip$1 } from 'rxjs/operators';
|
|
5
5
|
import { Logger, calculateMedian, clampf, lerp, getCanvasCached, getSnapshot, fitIntoRectangle, whereNot, Truthy, Falsy, tapLog, generateUuid, COLOR_CODES, where, KeyboardNumericCode, InvertedKeyMap, Semaphore, HEXtoRGB, RGBtoHSV, inverseLerp, HSVtoRGB, RGBtoHEX, fpIsASameAsB } from '@3dsource/utils';
|
|
6
|
-
import { merge, map, scan, concatMap, of, animationFrameScheduler, interval, Observable, debounceTime, switchMap, take, fromEvent, EMPTY, timer, timeout, mergeMap, skip, share,
|
|
6
|
+
import { merge, map, scan, concatMap, of, animationFrameScheduler, interval, Observable, debounceTime, switchMap, take, fromEvent, EMPTY, timer, timeout, mergeMap, Subject, skip, share, from, throwError, defer, retry, tap as tap$1, startWith, takeUntil as takeUntil$1, auditTime, filter as filter$1, throttleTime, BehaviorSubject, combineLatestWith, distinctUntilChanged as distinctUntilChanged$1, concat } from 'rxjs';
|
|
7
7
|
import { createAction, props, createReducer, on, createFeature, createSelector, Store, provideState } from '@ngrx/store';
|
|
8
8
|
import { Actions, createEffect, ofType, provideEffects } from '@ngrx/effects';
|
|
9
9
|
import { concatLatestFrom } from '@ngrx/operators';
|
|
@@ -128,7 +128,7 @@ const WS_TIMEOUT = 2000;
|
|
|
128
128
|
const POLLING_TIME = 4000;
|
|
129
129
|
const WS_OPEN_STATE = 1;
|
|
130
130
|
const DEFAULT_AFK_TIMEOUT_PERIOD = 15;
|
|
131
|
-
const DEFAULT_AFK_TIMEOUT =
|
|
131
|
+
const DEFAULT_AFK_TIMEOUT = 10;
|
|
132
132
|
const DATA_CHANNEL_CONNECTION_TIMEOUT = 8000; //ms;
|
|
133
133
|
const SIGNALLING_PERCENT_VALUE = 56;
|
|
134
134
|
const SCREEN_LOCKER_CONTAINER_ID = '3dsource_start_screen';
|
|
@@ -291,7 +291,6 @@ const initialState$1 = {
|
|
|
291
291
|
streamRequestContext: null,
|
|
292
292
|
environmentId: null,
|
|
293
293
|
lowBandwidthStats: undefined,
|
|
294
|
-
wasInitialized: false,
|
|
295
294
|
isFirstSuccessLoad: false,
|
|
296
295
|
isAfkTimerVisible: false,
|
|
297
296
|
afkCountdown: 0,
|
|
@@ -375,7 +374,6 @@ const unrealReducer = createReducer(initialState$1, on(changeLowBandwidth, (stat
|
|
|
375
374
|
...state,
|
|
376
375
|
errorMessage,
|
|
377
376
|
statusMessage: null,
|
|
378
|
-
wasInitialized: true,
|
|
379
377
|
};
|
|
380
378
|
}), on(setFreezeFrameFromVideo, (state, freezeFrameFromVideo) => {
|
|
381
379
|
return {
|
|
@@ -397,7 +395,6 @@ const unrealReducer = createReducer(initialState$1, on(changeLowBandwidth, (stat
|
|
|
397
395
|
statusMessage,
|
|
398
396
|
dataChannelConnected: true,
|
|
399
397
|
establishingConnection: false,
|
|
400
|
-
wasInitialized: true,
|
|
401
398
|
};
|
|
402
399
|
}), on(setConfig, startStream, (state, { config }) => {
|
|
403
400
|
return { ...state, streamConfig: { ...state.streamConfig, ...config } };
|
|
@@ -487,7 +484,6 @@ const unrealReducer = createReducer(initialState$1, on(changeLowBandwidth, (stat
|
|
|
487
484
|
...initialState$1,
|
|
488
485
|
establishingConnection: state.establishingConnection,
|
|
489
486
|
disconnectReason: state.disconnectReason,
|
|
490
|
-
wasInitialized: state.wasInitialized,
|
|
491
487
|
isFirstSuccessLoad: state.isFirstSuccessLoad,
|
|
492
488
|
matchUrls: state.matchUrls,
|
|
493
489
|
streamClientCompanyId: state.streamClientCompanyId,
|
|
@@ -512,7 +508,6 @@ const unrealReducer = createReducer(initialState$1, on(changeLowBandwidth, (stat
|
|
|
512
508
|
}), on(setUnrealPlaywrightConfig, (state) => {
|
|
513
509
|
return {
|
|
514
510
|
...state,
|
|
515
|
-
wasInitialized: true,
|
|
516
511
|
isFirstSuccessLoad: true,
|
|
517
512
|
cirrusConnected: true,
|
|
518
513
|
viewportReady: true,
|
|
@@ -1119,9 +1114,6 @@ const commandsFeature = createFeature({
|
|
|
1119
1114
|
|
|
1120
1115
|
const selectCommandsInProgress = createSelector(commandsFeature.selectCommandsInProgress, (commandsInProgress) => commandsInProgress?.length ?? 0);
|
|
1121
1116
|
const selectCommandProgress = createSelector(commandsFeature.selectTotalCommandsStarted, commandsFeature.selectTotalCommandsCompleted, (totalCommandsStarted, totalCommandsCompleted) => totalCommandsStarted ? totalCommandsCompleted / totalCommandsStarted : 0);
|
|
1122
|
-
const selectLastCommandInProgress = createSelector(commandsFeature.selectCommandsInProgress, (commandsInProgress) => commandsInProgress?.length
|
|
1123
|
-
? commandsInProgress[commandsInProgress.length - 1]
|
|
1124
|
-
: null);
|
|
1125
1117
|
|
|
1126
1118
|
const selectFreezeFrameDataUrlFromVideo = createSelector(unrealFeature.selectFreezeFrameFromVideo, unrealFeature.selectLowBandwidth, (freezeFrameFromVideo, isLow) => isLow ? null : freezeFrameFromVideo?.dataUrl || null);
|
|
1127
1119
|
const selectFreezeFrameProgressMessageFromVideo = createSelector(unrealFeature.selectFreezeFrameFromVideo, unrealFeature.selectLowBandwidth, (freezeFrameFromVideo, isLow) => isLow ? null : freezeFrameFromVideo?.progress || null);
|
|
@@ -1134,7 +1126,6 @@ const selectStreamConfig = createSelector(unrealFeature.selectStreamConfig, (con
|
|
|
1134
1126
|
const selectWarnTimeout = createSelector(selectStreamConfig, (config) => config?.warnTimeout || DEFAULT_AFK_TIMEOUT);
|
|
1135
1127
|
const selectIsExistMatchUrls = createSelector(unrealFeature.selectMatchUrls, (urls) => urls?.length > 0);
|
|
1136
1128
|
const selectIsAutostart = createSelector(selectStreamConfig, (config) => config?.autoStart);
|
|
1137
|
-
const selectIsShowPopupWithoutAutoStart = createSelector(selectStreamConfig, unrealFeature.selectWasInitialized, (config, wasInitialized) => !config.autoStart && !wasInitialized);
|
|
1138
1129
|
const selectShowReconnectPopup = createSelector(unrealFeature.selectCirrusConnected, unrealFeature.selectEstablishingConnection, (connected, establishing) => !connected && !establishing);
|
|
1139
1130
|
const selectShowLoader = createSelector(selectShowReconnectPopup, unrealFeature.selectViewportReady, (showPopup, viewportReady) => !showPopup && !viewportReady);
|
|
1140
1131
|
const selectIsVideoPlayingAndDataChannelConnected = createSelector(unrealFeature.selectIsVideoPlaying, unrealFeature.selectDataChannelConnected, (isVideoPlaying, isDataChannelConnected) => isVideoPlaying && isDataChannelConnected);
|
|
@@ -1188,14 +1179,38 @@ class UnrealErrorModalComponent {
|
|
|
1188
1179
|
close() {
|
|
1189
1180
|
this.#dialogRef.close();
|
|
1190
1181
|
}
|
|
1191
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1192
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
1182
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1183
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: UnrealErrorModalComponent, isStandalone: true, selector: "app-unreal-error-modal", ngImport: i0, template: "<div class=\"src-modal src-modal--small\">\n <header class=\"src-modal__header\">\n <div\n [attr.data-testid]=\"'unreal-error-header-title'\"\n class=\"src-modal__title\"\n >\n Warning\n </div>\n </header>\n <div class=\"src-modal__body\">\n <div>{{ dialogData.content }}</div>\n </div>\n <div class=\"src-modal__footer\">\n <src-button (onClick)=\"close()\">Ok</src-button>\n </div>\n</div>\n", styles: [".src-modal__header{padding:16px 24px 0}\n"], dependencies: [{ kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "weight", "size", "context", "customClass", "isFullWidth", "isPressed", "isDisabled", "isLoading", "isInverted", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1193
1184
|
}
|
|
1194
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1185
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealErrorModalComponent, decorators: [{
|
|
1195
1186
|
type: Component,
|
|
1196
|
-
args: [{ selector: 'app-unreal-error-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "<div class=\"src-modal src-modal--small\">\
|
|
1187
|
+
args: [{ selector: 'app-unreal-error-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "<div class=\"src-modal src-modal--small\">\n <header class=\"src-modal__header\">\n <div\n [attr.data-testid]=\"'unreal-error-header-title'\"\n class=\"src-modal__title\"\n >\n Warning\n </div>\n </header>\n <div class=\"src-modal__body\">\n <div>{{ dialogData.content }}</div>\n </div>\n <div class=\"src-modal__footer\">\n <src-button (onClick)=\"close()\">Ok</src-button>\n </div>\n</div>\n", styles: [".src-modal__header{padding:16px 24px 0}\n"] }]
|
|
1197
1188
|
}] });
|
|
1198
1189
|
|
|
1190
|
+
/**
|
|
1191
|
+
* Default LBM Filter Parameters
|
|
1192
|
+
*/
|
|
1193
|
+
const DefaultFilterModel = {
|
|
1194
|
+
minimumBitrate: 1600,
|
|
1195
|
+
yellowFlag: 30,
|
|
1196
|
+
redFlag: 50,
|
|
1197
|
+
minimumFps: 5,
|
|
1198
|
+
monitoringDelayTime: 5000,
|
|
1199
|
+
initialBitrateEstimate: 1600,
|
|
1200
|
+
initialErrorCovariance: 1,
|
|
1201
|
+
processNoise: 3,
|
|
1202
|
+
measurementNoise: 500,
|
|
1203
|
+
panelOpen: false,
|
|
1204
|
+
};
|
|
1205
|
+
/**
|
|
1206
|
+
* Global LBM Filter Parameters
|
|
1207
|
+
*/
|
|
1208
|
+
const FilterModel = { ...DefaultFilterModel };
|
|
1209
|
+
/**
|
|
1210
|
+
* Bitrate Monitor Static Class
|
|
1211
|
+
*/
|
|
1212
|
+
const BITRATE_MONITOR = new DataFlowMonitor(FilterModel.yellowFlag, FilterModel.redFlag, 20);
|
|
1213
|
+
|
|
1199
1214
|
class UnrealEffects {
|
|
1200
1215
|
constructor() {
|
|
1201
1216
|
this.actions$ = inject(Actions);
|
|
@@ -1259,7 +1274,11 @@ class UnrealEffects {
|
|
|
1259
1274
|
this.destroyConnections$ = createEffect(() => {
|
|
1260
1275
|
return this.actions$.pipe(ofType(destroyUnrealScene), tap(() => {
|
|
1261
1276
|
this.commandsSender.destroy();
|
|
1262
|
-
|
|
1277
|
+
// Note: do NOT call videoService.setContainer(null) here.
|
|
1278
|
+
// This effect runs asynchronously and would race with a new
|
|
1279
|
+
// UnrealSceneComponent that already set its container via
|
|
1280
|
+
// afterNextRender. The container's children are cleaned by
|
|
1281
|
+
// VideoService.destroy() which is triggered via disconnect$.
|
|
1263
1282
|
}), map(() => destroyRemoteConnections({ reason: DisconnectReason.Destroy })));
|
|
1264
1283
|
});
|
|
1265
1284
|
this.destroyRemoteConnections$ = createEffect(() => {
|
|
@@ -1289,21 +1308,20 @@ class UnrealEffects {
|
|
|
1289
1308
|
this.resetFreezeFrameOnLowBandwidthTriggered$ = createEffect(() => {
|
|
1290
1309
|
return this.actions$.pipe(ofType(changeLowBandwidth), map(({ lowBandwidth }) => lowBandwidth), distinctUntilChanged(), map(() => setFreezeFrame({ dataUrl: null, progress: null })));
|
|
1291
1310
|
});
|
|
1292
|
-
this.
|
|
1293
|
-
.select(unrealFeature.
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
.subscribe();
|
|
1311
|
+
this.sendLbmStatistics$ = createEffect(() => {
|
|
1312
|
+
return this.actions$.pipe(ofType(changeLowBandwidth), filter(({ lowBandwidth }) => lowBandwidth), withLatestFrom(this.store.select(unrealFeature.selectAwsInstance), this.store.select(unrealFeature.selectStreamClientCompanyId), this.store.select(unrealFeature.selectStreamViewId)), take(1), exhaustMap(([, instance, companyId, viewId]) => this.http
|
|
1313
|
+
.post(this.unrealInitialConfig?.customErrorsEndpoint || '', {
|
|
1314
|
+
message: {
|
|
1315
|
+
type: 'front',
|
|
1316
|
+
error: 'low_bandwidth_mode',
|
|
1317
|
+
signalling: instance.pollingUrl,
|
|
1318
|
+
},
|
|
1319
|
+
client: instance.pollingUrl,
|
|
1320
|
+
session_uuid: companyId,
|
|
1321
|
+
session_uuid2: viewId,
|
|
1322
|
+
})
|
|
1323
|
+
.pipe(catchError(() => EMPTY))));
|
|
1324
|
+
}, { dispatch: false });
|
|
1307
1325
|
this.resetAfk$ = createEffect(() => {
|
|
1308
1326
|
return this.actions$.pipe(ofType(setConfig, resetWarnTimeout, resetConfig), map(() => resetAfk()));
|
|
1309
1327
|
});
|
|
@@ -1322,6 +1340,12 @@ class UnrealEffects {
|
|
|
1322
1340
|
});
|
|
1323
1341
|
}));
|
|
1324
1342
|
}, { dispatch: false });
|
|
1343
|
+
this.setKalmanSettings$ = createEffect(() => {
|
|
1344
|
+
return this.actions$.pipe(ofType(setKalmanSettings), tap(({ settings }) => {
|
|
1345
|
+
this.videoService.kalmanFilter1D.config(settings);
|
|
1346
|
+
BITRATE_MONITOR.config(settings);
|
|
1347
|
+
}));
|
|
1348
|
+
}, { dispatch: false });
|
|
1325
1349
|
this.setSignalingTo100$ = createEffect(() => {
|
|
1326
1350
|
return this.actions$.pipe(ofType(setAwsInstance), map(() => setStatusPercentSignallingServer({ percent: 100 })));
|
|
1327
1351
|
});
|
|
@@ -1362,7 +1386,7 @@ class UnrealEffects {
|
|
|
1362
1386
|
Logger.error('Error sending timeout info:', postError);
|
|
1363
1387
|
return of(null);
|
|
1364
1388
|
}),
|
|
1365
|
-
// map response to the destroy action
|
|
1389
|
+
// map response to the destroy action that ngrx will dispatch
|
|
1366
1390
|
map(() => disconnectStream({
|
|
1367
1391
|
reason: DisconnectReason.DataChannelTimeout,
|
|
1368
1392
|
message: 'Data Channel Timeout',
|
|
@@ -1548,10 +1572,10 @@ class UnrealEffects {
|
|
|
1548
1572
|
}));
|
|
1549
1573
|
}, { dispatch: false });
|
|
1550
1574
|
}
|
|
1551
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1552
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
1575
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1576
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealEffects }); }
|
|
1553
1577
|
}
|
|
1554
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1578
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealEffects, decorators: [{
|
|
1555
1579
|
type: Injectable
|
|
1556
1580
|
}] });
|
|
1557
1581
|
|
|
@@ -1565,20 +1589,26 @@ class CommandsEffects {
|
|
|
1565
1589
|
: json?.correlationId), filter(Truthy), map((id) => commandCompleted({ id })))));
|
|
1566
1590
|
});
|
|
1567
1591
|
}
|
|
1568
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1569
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
1592
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandsEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1593
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandsEffects }); }
|
|
1570
1594
|
}
|
|
1571
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1595
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandsEffects, decorators: [{
|
|
1572
1596
|
type: Injectable
|
|
1573
1597
|
}] });
|
|
1574
1598
|
|
|
1575
1599
|
class SubService {
|
|
1576
1600
|
constructor() {
|
|
1601
|
+
this.destroyRef = inject(DestroyRef);
|
|
1602
|
+
this.destroy$ = new Subject();
|
|
1577
1603
|
this.actions$ = inject(Actions);
|
|
1578
1604
|
this.store = inject(Store);
|
|
1579
1605
|
this.disconnect$ = this.store
|
|
1580
1606
|
.select(unrealFeature.selectCirrusConnected)
|
|
1581
1607
|
.pipe(skip(1), filter(Falsy), share());
|
|
1608
|
+
this._destroy = this.destroyRef.onDestroy(() => {
|
|
1609
|
+
this.destroy$.next();
|
|
1610
|
+
this.destroy$.complete();
|
|
1611
|
+
});
|
|
1582
1612
|
}
|
|
1583
1613
|
}
|
|
1584
1614
|
|
|
@@ -1592,15 +1622,20 @@ class AFKService extends SubService {
|
|
|
1592
1622
|
this.countdown = 0; // The inactivity warning overlay has a countdown to show time until disconnect.
|
|
1593
1623
|
this.selectWarnTimeout = this.store.selectSignal(selectWarnTimeout);
|
|
1594
1624
|
this.isViewportReady = this.store.selectSignal(unrealFeature.selectViewportReady);
|
|
1625
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
1626
|
+
this.destroyRef.onDestroy(() => this.clearTimers());
|
|
1595
1627
|
this.init();
|
|
1596
1628
|
}
|
|
1597
1629
|
init() {
|
|
1630
|
+
if (this.unrealConfig?.playwright) {
|
|
1631
|
+
return;
|
|
1632
|
+
}
|
|
1598
1633
|
merge(this.store.select(selectWarnTimeout), this.actions$.pipe(ofType(resetAfk)))
|
|
1599
|
-
.pipe(withLatestFrom(this.store.select(unrealFeature.selectViewportReady)), filter(([, viewportReady]) => viewportReady))
|
|
1634
|
+
.pipe(withLatestFrom(this.store.select(unrealFeature.selectViewportReady)), filter(([, viewportReady]) => viewportReady), takeUntil(this.destroy$))
|
|
1600
1635
|
.subscribe(() => this.resetAfkWarningTimer());
|
|
1601
1636
|
this.store
|
|
1602
1637
|
.select(unrealFeature.selectViewportReady)
|
|
1603
|
-
.pipe(distinctUntilChanged(), filter(Truthy))
|
|
1638
|
+
.pipe(distinctUntilChanged(), filter(Truthy), takeUntil(this.destroy$))
|
|
1604
1639
|
.subscribe(() => this.startAfkWarningTimer());
|
|
1605
1640
|
this.disconnect$.subscribe(() => this.stop());
|
|
1606
1641
|
}
|
|
@@ -1622,7 +1657,7 @@ class AFKService extends SubService {
|
|
|
1622
1657
|
this.clearTimers();
|
|
1623
1658
|
this.warnTimer = setTimeout(() => {
|
|
1624
1659
|
this.showAfkOverlay();
|
|
1625
|
-
}, this.selectWarnTimeout() * 1000);
|
|
1660
|
+
}, (this.selectWarnTimeout() ?? 0) * 1000);
|
|
1626
1661
|
}
|
|
1627
1662
|
}
|
|
1628
1663
|
/**
|
|
@@ -1673,10 +1708,10 @@ class AFKService extends SubService {
|
|
|
1673
1708
|
}
|
|
1674
1709
|
}, 1000);
|
|
1675
1710
|
}
|
|
1676
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1677
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
1711
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AFKService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1712
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AFKService }); }
|
|
1678
1713
|
}
|
|
1679
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1714
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AFKService, decorators: [{
|
|
1680
1715
|
type: Injectable
|
|
1681
1716
|
}], ctorParameters: () => [] });
|
|
1682
1717
|
|
|
@@ -1686,15 +1721,19 @@ class FreezeFrameService extends SubService {
|
|
|
1686
1721
|
this.receiving = false;
|
|
1687
1722
|
this.size = 0;
|
|
1688
1723
|
this.freezeFrameOverlay = new Image();
|
|
1724
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
1689
1725
|
this.init();
|
|
1690
1726
|
}
|
|
1691
1727
|
init() {
|
|
1728
|
+
if (this.unrealConfig?.playwright) {
|
|
1729
|
+
return;
|
|
1730
|
+
}
|
|
1692
1731
|
this.store
|
|
1693
1732
|
.select(unrealFeature.selectViewportReady)
|
|
1694
|
-
.pipe(filter(Truthy))
|
|
1733
|
+
.pipe(filter(Truthy), takeUntil(this.destroy$))
|
|
1695
1734
|
.subscribe(() => this.invalidate());
|
|
1696
1735
|
this.actions$
|
|
1697
|
-
.pipe(ofType(videoStreamInitialized))
|
|
1736
|
+
.pipe(ofType(videoStreamInitialized), takeUntil(this.destroy$))
|
|
1698
1737
|
.subscribe(() => this.invalidate());
|
|
1699
1738
|
}
|
|
1700
1739
|
setData(view) {
|
|
@@ -1742,6 +1781,9 @@ class FreezeFrameService extends SubService {
|
|
|
1742
1781
|
}
|
|
1743
1782
|
}
|
|
1744
1783
|
invalidate() {
|
|
1784
|
+
if (!this.jpeg) {
|
|
1785
|
+
return;
|
|
1786
|
+
}
|
|
1745
1787
|
this.store.dispatch(setFreezeFrame({ dataUrl: null, progress: null }));
|
|
1746
1788
|
this.jpeg = undefined;
|
|
1747
1789
|
this.receiving = false;
|
|
@@ -1757,40 +1799,16 @@ class FreezeFrameService extends SubService {
|
|
|
1757
1799
|
progress: 1,
|
|
1758
1800
|
}));
|
|
1759
1801
|
}
|
|
1760
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
1761
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
1802
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FreezeFrameService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1803
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FreezeFrameService }); }
|
|
1762
1804
|
}
|
|
1763
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
1805
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FreezeFrameService, decorators: [{
|
|
1764
1806
|
type: Injectable
|
|
1765
1807
|
}], ctorParameters: () => [] });
|
|
1766
1808
|
|
|
1767
|
-
/**
|
|
1768
|
-
* Default LBM Filter Parameters
|
|
1769
|
-
*/
|
|
1770
|
-
const DefaultFilterModel = {
|
|
1771
|
-
minimumBitrate: 1600,
|
|
1772
|
-
yellowFlag: 30,
|
|
1773
|
-
redFlag: 50,
|
|
1774
|
-
minimumFps: 5,
|
|
1775
|
-
monitoringDelayTime: 5000,
|
|
1776
|
-
initialBitrateEstimate: 1600,
|
|
1777
|
-
initialErrorCovariance: 1,
|
|
1778
|
-
processNoise: 3,
|
|
1779
|
-
measurementNoise: 500,
|
|
1780
|
-
panelOpen: false,
|
|
1781
|
-
};
|
|
1782
|
-
/**
|
|
1783
|
-
* Global LBM Filter Parameters
|
|
1784
|
-
*/
|
|
1785
|
-
const FilterModel = { ...DefaultFilterModel };
|
|
1786
|
-
/**
|
|
1787
|
-
* Bitrate Monitor Static Class
|
|
1788
|
-
*/
|
|
1789
|
-
const BITRATE_MONITOR = new DataFlowMonitor(FilterModel.yellowFlag, FilterModel.redFlag, 20);
|
|
1790
|
-
|
|
1791
1809
|
class VideoService extends SubService {
|
|
1792
1810
|
constructor() {
|
|
1793
|
-
super();
|
|
1811
|
+
super(...arguments);
|
|
1794
1812
|
this.video = null;
|
|
1795
1813
|
this.audio = null;
|
|
1796
1814
|
this.container = null;
|
|
@@ -1808,13 +1826,6 @@ class VideoService extends SubService {
|
|
|
1808
1826
|
? // IMPORTANT! DO NOT CHANGE THOSE NUMBERS, LBM Stats are based on those values
|
|
1809
1827
|
interval(250).pipe(map(() => track.pcClient), switchMap$1((pcClient) => from(this.getStats(pcClient))), filter(Truthy))
|
|
1810
1828
|
: of(null)), filter(Truthy), share());
|
|
1811
|
-
this.init();
|
|
1812
|
-
}
|
|
1813
|
-
init() {
|
|
1814
|
-
this.actions$.pipe(ofType(setKalmanSettings)).subscribe(({ settings }) => {
|
|
1815
|
-
this.kalmanFilter1D.config(settings);
|
|
1816
|
-
BITRATE_MONITOR.config(settings);
|
|
1817
|
-
});
|
|
1818
1829
|
}
|
|
1819
1830
|
setContainer(container = null) {
|
|
1820
1831
|
this.container = container;
|
|
@@ -2018,9 +2029,17 @@ class VideoService extends SubService {
|
|
|
2018
2029
|
};
|
|
2019
2030
|
}
|
|
2020
2031
|
destroy() {
|
|
2032
|
+
if (!this.video) {
|
|
2033
|
+
return;
|
|
2034
|
+
}
|
|
2021
2035
|
this.video = null;
|
|
2022
2036
|
this.audio = null;
|
|
2023
2037
|
this.videoTrack$.next(null);
|
|
2038
|
+
// Reset stat state to prevent stale deltas on next session
|
|
2039
|
+
this.aggregatedStats = {};
|
|
2040
|
+
this.VideoEncoderQP = 0;
|
|
2041
|
+
this.kalmanFilter1D = new KalmanFilter1D(FilterModel.initialBitrateEstimate, FilterModel.initialErrorCovariance, FilterModel.processNoise, FilterModel.measurementNoise);
|
|
2042
|
+
BITRATE_MONITOR.reset();
|
|
2024
2043
|
while (this.container?.firstChild) {
|
|
2025
2044
|
this.container.removeChild(this.container.firstChild);
|
|
2026
2045
|
}
|
|
@@ -2059,17 +2078,16 @@ class VideoService extends SubService {
|
|
|
2059
2078
|
error: () => ({}),
|
|
2060
2079
|
});
|
|
2061
2080
|
}
|
|
2062
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2063
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
2081
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: VideoService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2082
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: VideoService }); }
|
|
2064
2083
|
}
|
|
2065
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2084
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: VideoService, decorators: [{
|
|
2066
2085
|
type: Injectable
|
|
2067
|
-
}]
|
|
2086
|
+
}] });
|
|
2068
2087
|
|
|
2069
2088
|
class CommandTelemetryService {
|
|
2070
2089
|
constructor() {
|
|
2071
2090
|
this.actions$ = inject(Actions);
|
|
2072
|
-
this.store = inject(Store);
|
|
2073
2091
|
this.appId = 'metabox-telemetry';
|
|
2074
2092
|
this.commandsSent = {};
|
|
2075
2093
|
this.exileTimeout = 60000;
|
|
@@ -2077,13 +2095,14 @@ class CommandTelemetryService {
|
|
|
2077
2095
|
this.commandSequenceNumber = 0;
|
|
2078
2096
|
this.payloads = [];
|
|
2079
2097
|
this.httpClient = inject(HttpClient);
|
|
2080
|
-
this.
|
|
2098
|
+
this.unrealConfig = inject(UNREAL_CONFIG, {
|
|
2081
2099
|
optional: true,
|
|
2082
2100
|
});
|
|
2083
2101
|
this.init();
|
|
2084
2102
|
}
|
|
2085
2103
|
init() {
|
|
2086
|
-
if (!this.
|
|
2104
|
+
if (!this.unrealConfig?.commandTelemetryReceiver ||
|
|
2105
|
+
this.unrealConfig?.playwright) {
|
|
2087
2106
|
return;
|
|
2088
2107
|
}
|
|
2089
2108
|
this.reset();
|
|
@@ -2195,7 +2214,7 @@ class CommandTelemetryService {
|
|
|
2195
2214
|
};
|
|
2196
2215
|
const lastIndex = payload[payload.length - 1].commandSequenceNumber;
|
|
2197
2216
|
this.httpClient
|
|
2198
|
-
.post(this.
|
|
2217
|
+
.post(this.unrealConfig?.commandTelemetryReceiver || '', out)
|
|
2199
2218
|
.pipe(catchError(() => of(null)), take(1))
|
|
2200
2219
|
.subscribe(() => {
|
|
2201
2220
|
this.payloads = this.payloads.filter((p) => p.commandSequenceNumber > lastIndex);
|
|
@@ -2268,10 +2287,10 @@ class CommandTelemetryService {
|
|
|
2268
2287
|
this.trackTime(out);
|
|
2269
2288
|
funcToDecorate(out);
|
|
2270
2289
|
}
|
|
2271
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2272
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
2290
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandTelemetryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2291
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandTelemetryService }); }
|
|
2273
2292
|
}
|
|
2274
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2293
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandTelemetryService, decorators: [{
|
|
2275
2294
|
type: Injectable
|
|
2276
2295
|
}], ctorParameters: () => [] });
|
|
2277
2296
|
|
|
@@ -2451,10 +2470,6 @@ function createWebSocket(wsUrl) {
|
|
|
2451
2470
|
}));
|
|
2452
2471
|
}
|
|
2453
2472
|
|
|
2454
|
-
/*
|
|
2455
|
-
* Copyright (c) 2024.
|
|
2456
|
-
* Sergii Karanda - All Rights Reserved
|
|
2457
|
-
*/
|
|
2458
2473
|
function PlayerDisconnectHandler() {
|
|
2459
2474
|
this.store.dispatch(disconnectStream({
|
|
2460
2475
|
reason: DisconnectReason.OrchestrationPlayerDisconnected,
|
|
@@ -2504,6 +2519,7 @@ class SignallingService extends SubService {
|
|
|
2504
2519
|
this.httpClient = inject(HttpClient);
|
|
2505
2520
|
this.regionsPingService = inject(RegionsPingService);
|
|
2506
2521
|
this.commandTelemetryService = inject(CommandTelemetryService);
|
|
2522
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
2507
2523
|
this.region = signal('', ...(ngDevMode ? [{ debugName: "region" }] : /* istanbul ignore next */ []));
|
|
2508
2524
|
this.selectClientAndViewIds = this.store.selectSignal(selectClientAndViewIds);
|
|
2509
2525
|
this.environmentId = this.store.selectSignal(unrealFeature.selectEnvironmentId);
|
|
@@ -2520,6 +2536,9 @@ class SignallingService extends SubService {
|
|
|
2520
2536
|
this.init();
|
|
2521
2537
|
}
|
|
2522
2538
|
init() {
|
|
2539
|
+
if (this.unrealConfig?.playwright) {
|
|
2540
|
+
return;
|
|
2541
|
+
}
|
|
2523
2542
|
this.setHandlersFromStream();
|
|
2524
2543
|
this.action$.pipe(ofType(dataChannelReady)).subscribe(() => {
|
|
2525
2544
|
this.send({
|
|
@@ -2540,6 +2559,13 @@ class SignallingService extends SubService {
|
|
|
2540
2559
|
});
|
|
2541
2560
|
}
|
|
2542
2561
|
connectToSignaling(urlList) {
|
|
2562
|
+
if (this.unrealConfig?.playwright) {
|
|
2563
|
+
this.store.dispatch(setUnrealPlaywrightConfig());
|
|
2564
|
+
this.store.dispatch(dataChannelConnected({
|
|
2565
|
+
statusMessage: 'Playwright set data channel connected',
|
|
2566
|
+
}));
|
|
2567
|
+
return EMPTY;
|
|
2568
|
+
}
|
|
2543
2569
|
Logger.log('CONNECT TO SIGNALLING');
|
|
2544
2570
|
// Preparation for WebSocket Orchestration
|
|
2545
2571
|
this.correlationId = generateUuid();
|
|
@@ -2838,10 +2864,10 @@ class SignallingService extends SubService {
|
|
|
2838
2864
|
Logger.log('Start Getting Region');
|
|
2839
2865
|
return this.regionsPingService.getFastest().pipe(take(1));
|
|
2840
2866
|
}
|
|
2841
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
2842
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
2867
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SignallingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2868
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SignallingService }); }
|
|
2843
2869
|
}
|
|
2844
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
2870
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SignallingService, decorators: [{
|
|
2845
2871
|
type: Injectable
|
|
2846
2872
|
}], ctorParameters: () => [] });
|
|
2847
2873
|
|
|
@@ -2885,9 +2911,7 @@ class WebRtcPlayerService extends SubService {
|
|
|
2885
2911
|
this.signallingSrv.onWebRtcIce$
|
|
2886
2912
|
.pipe(withLatestFrom(this.signallingSrv.onWebRtcAnswer$))
|
|
2887
2913
|
.subscribe(([candidate, answerEstablished]) => {
|
|
2888
|
-
this.commandTelemetryService.trackStopCommand('EXT-iceCandidate', true, {
|
|
2889
|
-
multi: true,
|
|
2890
|
-
});
|
|
2914
|
+
this.commandTelemetryService.trackStopCommand('EXT-iceCandidate', true, { multi: true });
|
|
2891
2915
|
iceCandidateBuffer.push(candidate);
|
|
2892
2916
|
if (answerEstablished) {
|
|
2893
2917
|
processBuffer();
|
|
@@ -2977,13 +3001,13 @@ class WebRtcPlayerService extends SubService {
|
|
|
2977
3001
|
}
|
|
2978
3002
|
else {
|
|
2979
3003
|
Logger.colored('black', 'yellow', `DataChannel connection not prepared or in state: ${this.dcClient?.readyState}`);
|
|
2980
|
-
// Trigger peer reconnection if DC is not open and we're not
|
|
3004
|
+
// Trigger peer reconnection if DC is not open and we're not yet reconnecting
|
|
2981
3005
|
this.tryReconnectOnSendFailure();
|
|
2982
3006
|
}
|
|
2983
3007
|
}
|
|
2984
3008
|
/**
|
|
2985
3009
|
* Attempts to reconnect the peer when send fails due to DataChannel not being open.
|
|
2986
|
-
* This handles cases where the DC connection is broken but no error events are fired.
|
|
3010
|
+
* This handles cases where the DC connection is broken, but no error events are fired.
|
|
2987
3011
|
*/
|
|
2988
3012
|
tryReconnectOnSendFailure() {
|
|
2989
3013
|
// Skip if already reconnecting or signaling is not connected
|
|
@@ -3236,10 +3260,10 @@ class WebRtcPlayerService extends SubService {
|
|
|
3236
3260
|
Logger.error("Couldn't create offer");
|
|
3237
3261
|
}
|
|
3238
3262
|
}
|
|
3239
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3240
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
3263
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WebRtcPlayerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3264
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WebRtcPlayerService }); }
|
|
3241
3265
|
}
|
|
3242
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3266
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WebRtcPlayerService, decorators: [{
|
|
3243
3267
|
type: Injectable
|
|
3244
3268
|
}], ctorParameters: () => [] });
|
|
3245
3269
|
|
|
@@ -3292,11 +3316,14 @@ class FileReceiverService extends SubService {
|
|
|
3292
3316
|
this.mimetype = '';
|
|
3293
3317
|
this.receiving = false;
|
|
3294
3318
|
this.extension = '';
|
|
3295
|
-
this.timestampStart = 0;
|
|
3296
3319
|
this.data = [];
|
|
3320
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3297
3321
|
this.init();
|
|
3298
3322
|
}
|
|
3299
3323
|
init() {
|
|
3324
|
+
if (this.unrealConfig?.playwright) {
|
|
3325
|
+
return;
|
|
3326
|
+
}
|
|
3300
3327
|
this.store
|
|
3301
3328
|
.select(unrealFeature.selectViewportReady)
|
|
3302
3329
|
.pipe(filter(Truthy))
|
|
@@ -3309,8 +3336,6 @@ class FileReceiverService extends SubService {
|
|
|
3309
3336
|
this.valid = false;
|
|
3310
3337
|
this.chunks = 0;
|
|
3311
3338
|
this.data = [];
|
|
3312
|
-
this.timestampStart = new Date().getTime();
|
|
3313
|
-
// Logger.info('Received file state');
|
|
3314
3339
|
}
|
|
3315
3340
|
resetOnStart() {
|
|
3316
3341
|
this.reset();
|
|
@@ -3397,6 +3422,9 @@ const filteredLogs = [
|
|
|
3397
3422
|
},
|
|
3398
3423
|
];
|
|
3399
3424
|
class AggregatorService extends SubService {
|
|
3425
|
+
/**
|
|
3426
|
+
* Never called for now
|
|
3427
|
+
*/
|
|
3400
3428
|
constructor() {
|
|
3401
3429
|
super();
|
|
3402
3430
|
this.selectStreamConfig = this.store.selectSignal(selectStreamConfig);
|
|
@@ -3404,15 +3432,14 @@ class AggregatorService extends SubService {
|
|
|
3404
3432
|
this.webrtcPlayer = inject(WebRtcPlayerService);
|
|
3405
3433
|
this.freezeFrame = inject(FreezeFrameService);
|
|
3406
3434
|
this.fileReceiver = inject(FileReceiverService);
|
|
3407
|
-
this.
|
|
3435
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3408
3436
|
this.responseEventListeners = new Map();
|
|
3409
|
-
/**
|
|
3410
|
-
* Never called for now
|
|
3411
|
-
*/
|
|
3412
|
-
this.destroy$ = new Subject();
|
|
3413
3437
|
this.init();
|
|
3414
3438
|
}
|
|
3415
3439
|
init() {
|
|
3440
|
+
if (this.unrealConfig?.playwright) {
|
|
3441
|
+
return;
|
|
3442
|
+
}
|
|
3416
3443
|
this.listenWebRTC();
|
|
3417
3444
|
this.initialize();
|
|
3418
3445
|
}
|
|
@@ -3464,7 +3491,7 @@ class AggregatorService extends SubService {
|
|
|
3464
3491
|
}
|
|
3465
3492
|
removeLoadScreen() {
|
|
3466
3493
|
document
|
|
3467
|
-
.getElementById(this.
|
|
3494
|
+
.getElementById(this.unrealConfig?.screenLockerContainerId ||
|
|
3468
3495
|
SCREEN_LOCKER_CONTAINER_ID)
|
|
3469
3496
|
?.remove();
|
|
3470
3497
|
}
|
|
@@ -3580,23 +3607,42 @@ class AggregatorService extends SubService {
|
|
|
3580
3607
|
Logger.warn(`unrecognized data received, packet ID ${view[0]}`);
|
|
3581
3608
|
}
|
|
3582
3609
|
}
|
|
3583
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3584
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
3610
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AggregatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3611
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AggregatorService }); }
|
|
3585
3612
|
}
|
|
3586
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3613
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AggregatorService, decorators: [{
|
|
3587
3614
|
type: Injectable
|
|
3588
3615
|
}], ctorParameters: () => [] });
|
|
3589
3616
|
|
|
3590
3617
|
class ConsoleExtensionsService extends SubService {
|
|
3591
|
-
#httpClient
|
|
3592
|
-
#commandsSender
|
|
3593
|
-
#isDevMode
|
|
3618
|
+
#httpClient;
|
|
3619
|
+
#commandsSender;
|
|
3620
|
+
#isDevMode;
|
|
3594
3621
|
constructor() {
|
|
3595
3622
|
super();
|
|
3623
|
+
this.#httpClient = inject(HttpClient);
|
|
3624
|
+
this.#commandsSender = inject(UnrealCommunicatorService);
|
|
3625
|
+
this.#isDevMode = inject(DevModeService).isDevMode;
|
|
3626
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3596
3627
|
this.init();
|
|
3628
|
+
// Clean up window properties on destroyRef
|
|
3629
|
+
this.destroyRef.onDestroy(() => {
|
|
3630
|
+
if (!this.#isDevMode) {
|
|
3631
|
+
return;
|
|
3632
|
+
}
|
|
3633
|
+
window.dropConnection = undefined;
|
|
3634
|
+
window.dropDC = undefined;
|
|
3635
|
+
window.dropPC = undefined;
|
|
3636
|
+
window.setResolution = undefined;
|
|
3637
|
+
window.toggleBandwidth = undefined;
|
|
3638
|
+
window.setMaxFps = undefined;
|
|
3639
|
+
window.restartApp = undefined;
|
|
3640
|
+
window.unrealHelp = undefined;
|
|
3641
|
+
window.setWarnTime = undefined;
|
|
3642
|
+
});
|
|
3597
3643
|
}
|
|
3598
3644
|
init() {
|
|
3599
|
-
if (!this.#isDevMode) {
|
|
3645
|
+
if (!this.#isDevMode || this.unrealConfig?.playwright) {
|
|
3600
3646
|
return;
|
|
3601
3647
|
}
|
|
3602
3648
|
window.dropConnection = () => {
|
|
@@ -3652,10 +3698,10 @@ class ConsoleExtensionsService extends SubService {
|
|
|
3652
3698
|
Logger.info('setWarnTime() => set time to appear the AFK window.');
|
|
3653
3699
|
Logger.info('emitCommand(command) => send command to Unreal Engine.');
|
|
3654
3700
|
}
|
|
3655
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3656
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
3701
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ConsoleExtensionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3702
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ConsoleExtensionsService }); }
|
|
3657
3703
|
}
|
|
3658
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3704
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ConsoleExtensionsService, decorators: [{
|
|
3659
3705
|
type: Injectable
|
|
3660
3706
|
}], ctorParameters: () => [] });
|
|
3661
3707
|
|
|
@@ -3671,10 +3717,10 @@ class DevModeService {
|
|
|
3671
3717
|
localStorage.removeItem('devMode');
|
|
3672
3718
|
}
|
|
3673
3719
|
}
|
|
3674
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3675
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
3720
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DevModeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3721
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DevModeService, providedIn: 'root' }); }
|
|
3676
3722
|
}
|
|
3677
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3723
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: DevModeService, decorators: [{
|
|
3678
3724
|
type: Injectable,
|
|
3679
3725
|
args: [{
|
|
3680
3726
|
providedIn: 'root',
|
|
@@ -3684,27 +3730,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
3684
3730
|
class UnrealCommunicatorService {
|
|
3685
3731
|
constructor() {
|
|
3686
3732
|
this.store = inject(Store);
|
|
3733
|
+
this.actions$ = inject(Actions);
|
|
3687
3734
|
this.commandTelemetryService = inject(CommandTelemetryService);
|
|
3688
3735
|
this.webRtcPlayerService = inject(WebRtcPlayerService);
|
|
3736
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3689
3737
|
this.destroy$ = new Subject();
|
|
3690
3738
|
this.cirrusConnected = this.store.selectSignal(unrealFeature.selectCirrusConnected);
|
|
3691
3739
|
this.init();
|
|
3692
3740
|
}
|
|
3693
3741
|
init() {
|
|
3742
|
+
this.isPlaywrightMode();
|
|
3694
3743
|
this.emitUIInteraction = this.commandTelemetryService.decorate(this.emitUIInteraction.bind(this));
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3744
|
+
// Listen to the dataChannelConnected ACTION (point-in-time event) instead
|
|
3745
|
+
// of the store selector. The selector reads the current state and can fire on
|
|
3746
|
+
// stale `true` from a previous session when switching components (Angular
|
|
3747
|
+
// creates the new component before destroying the old one).
|
|
3748
|
+
this.actions$.pipe(ofType(dataChannelConnected)).subscribe(() => {
|
|
3699
3749
|
this.requestInitialSettings();
|
|
3700
3750
|
this.requestQualityControl();
|
|
3701
3751
|
});
|
|
3702
3752
|
}
|
|
3703
3753
|
destroy() {
|
|
3704
3754
|
this.destroy$.next();
|
|
3705
|
-
|
|
3755
|
+
// Recreate the Subject so it remains usable for the next session.
|
|
3756
|
+
// A completed Subject silently ignores all future next/complete calls.
|
|
3757
|
+
this.destroy$ = new Subject();
|
|
3706
3758
|
}
|
|
3707
3759
|
sendCommandToUnreal(data) {
|
|
3760
|
+
this.isPlaywrightMode();
|
|
3708
3761
|
if (this.webRtcPlayerService.canSend()) {
|
|
3709
3762
|
const uniqId = data?.correlationId ?? generateUuid();
|
|
3710
3763
|
const sendData = { ...data, correlationId: uniqId };
|
|
@@ -3731,6 +3784,7 @@ class UnrealCommunicatorService {
|
|
|
3731
3784
|
this.emitDescriptor(MessageType.Command, descriptor);
|
|
3732
3785
|
}
|
|
3733
3786
|
sendInputData(data) {
|
|
3787
|
+
this.isPlaywrightMode();
|
|
3734
3788
|
try {
|
|
3735
3789
|
this.store.dispatch(resetAfk());
|
|
3736
3790
|
this.webRtcPlayerService.send(data);
|
|
@@ -3741,6 +3795,11 @@ class UnrealCommunicatorService {
|
|
|
3741
3795
|
}
|
|
3742
3796
|
}
|
|
3743
3797
|
}
|
|
3798
|
+
isPlaywrightMode() {
|
|
3799
|
+
if (this.unrealConfig?.playwright) {
|
|
3800
|
+
return;
|
|
3801
|
+
}
|
|
3802
|
+
}
|
|
3744
3803
|
emitDescriptor(messageType, descriptor) {
|
|
3745
3804
|
// Convert the descriptor object into a JSON string.
|
|
3746
3805
|
const descriptorAsString = JSON.stringify(descriptor);
|
|
@@ -3764,19 +3823,21 @@ class UnrealCommunicatorService {
|
|
|
3764
3823
|
requestQualityControl() {
|
|
3765
3824
|
this.sendInputData(new Uint8Array([MessageType.RequestQualityControl]).buffer);
|
|
3766
3825
|
}
|
|
3767
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
3768
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
3826
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCommunicatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3827
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCommunicatorService }); }
|
|
3769
3828
|
}
|
|
3770
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
3829
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCommunicatorService, decorators: [{
|
|
3771
3830
|
type: Injectable
|
|
3772
3831
|
}], ctorParameters: () => [] });
|
|
3773
3832
|
|
|
3833
|
+
const INITIAL_FINGER_IDS = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
|
|
3774
3834
|
class InputService extends SubService {
|
|
3775
3835
|
constructor() {
|
|
3776
3836
|
super();
|
|
3777
3837
|
this.commandsSender = inject(UnrealCommunicatorService);
|
|
3778
3838
|
this.isDevMode = inject(DevModeService).isDevMode;
|
|
3779
3839
|
this.videoService = inject(VideoService);
|
|
3840
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3780
3841
|
this.defaultKeys = [
|
|
3781
3842
|
KeyboardNumericCode.KeyW,
|
|
3782
3843
|
KeyboardNumericCode.KeyS,
|
|
@@ -3798,7 +3859,7 @@ class InputService extends SubService {
|
|
|
3798
3859
|
this.videoBoundingRect = new DOMRect(0, 0, 1, 1);
|
|
3799
3860
|
this.fingerIds = new Map();
|
|
3800
3861
|
this.maxByteValue = 255;
|
|
3801
|
-
this.fingers = [
|
|
3862
|
+
this.fingers = [...INITIAL_FINGER_IDS];
|
|
3802
3863
|
this.offsetParams = {
|
|
3803
3864
|
scaleX: 1,
|
|
3804
3865
|
scaleY: 1,
|
|
@@ -3810,10 +3871,15 @@ class InputService extends SubService {
|
|
|
3810
3871
|
this.init();
|
|
3811
3872
|
}
|
|
3812
3873
|
init() {
|
|
3874
|
+
if (this.unrealConfig?.playwright) {
|
|
3875
|
+
return;
|
|
3876
|
+
}
|
|
3813
3877
|
const visibilityHiddenTrigger$ = fromEvent(document, 'visibilitychange').pipe(map$1(() => document.visibilityState === 'hidden'), filter(Truthy));
|
|
3814
3878
|
const visibilityVisibleTrigger$ = fromEvent(document, 'visibilitychange').pipe(map$1(() => document.visibilityState === 'visible'), filter(Truthy), startWith(true));
|
|
3815
3879
|
this.deactivatedVideoTrigger$ = merge(this.disconnect$, this.reInit$, visibilityHiddenTrigger$);
|
|
3816
|
-
merge(visibilityVisibleTrigger$, this.store.select(unrealFeature.selectViewportReady).pipe(filter(Truthy)))
|
|
3880
|
+
merge(visibilityVisibleTrigger$, this.store.select(unrealFeature.selectViewportReady).pipe(filter(Truthy)))
|
|
3881
|
+
.pipe(filter(() => !!this.video))
|
|
3882
|
+
.subscribe(() => this.setup());
|
|
3817
3883
|
}
|
|
3818
3884
|
useKeyboardKeys(keys) {
|
|
3819
3885
|
this.availableKeys = keys || [];
|
|
@@ -3826,9 +3892,11 @@ class InputService extends SubService {
|
|
|
3826
3892
|
if (!video) {
|
|
3827
3893
|
return;
|
|
3828
3894
|
}
|
|
3829
|
-
Logger.log('DEBUG: video initialized: ', video);
|
|
3830
3895
|
this.options = InputOptions;
|
|
3831
3896
|
this.reInit$.next();
|
|
3897
|
+
// Reset touch state to prevent stale identifiers across sessions
|
|
3898
|
+
this.fingerIds.clear();
|
|
3899
|
+
this.fingers = [...INITIAL_FINGER_IDS];
|
|
3832
3900
|
merge(fromResizeObserver(video), this.actions$.pipe(ofType(videoAdaptedToContainer)))
|
|
3833
3901
|
.pipe(debounceTime$1(300), takeUntil$1(this.deactivatedVideoTrigger$))
|
|
3834
3902
|
.subscribe(() => this.setupNormalizeAndQuantize(video));
|
|
@@ -4191,7 +4259,10 @@ class InputService extends SubService {
|
|
|
4191
4259
|
}
|
|
4192
4260
|
startListenKeys(_filter) {
|
|
4193
4261
|
const filter = _filter ?? (() => false);
|
|
4194
|
-
|
|
4262
|
+
// Use RxJS fromEvent with takeUntil to properly clean up subscriptions
|
|
4263
|
+
fromEvent(document, 'keydown')
|
|
4264
|
+
.pipe(takeUntil$1(this.deactivatedVideoTrigger$))
|
|
4265
|
+
.subscribe((e) => {
|
|
4195
4266
|
if (filter(e)) {
|
|
4196
4267
|
return;
|
|
4197
4268
|
}
|
|
@@ -4209,17 +4280,19 @@ class InputService extends SubService {
|
|
|
4209
4280
|
// Backspace is not considered a keypress in JavaScript, but we need it
|
|
4210
4281
|
// to be so characters may be deleted in a UE4 text entry field.
|
|
4211
4282
|
if (e.keyCode === SpecialKeyCodes.BackSpace) {
|
|
4212
|
-
|
|
4213
|
-
|
|
4214
|
-
|
|
4215
|
-
|
|
4283
|
+
const data = new DataView(new ArrayBuffer(3));
|
|
4284
|
+
data.setUint8(0, MessageType.KeyPress);
|
|
4285
|
+
data.setUint16(1, SpecialKeyCodes.BackSpace, true);
|
|
4286
|
+
this.sendInputData(data.buffer);
|
|
4216
4287
|
}
|
|
4217
4288
|
if (this.options.suppressBrowserKeys &&
|
|
4218
4289
|
this.isKeyCodeBrowserKey(e.keyCode)) {
|
|
4219
4290
|
e.preventDefault();
|
|
4220
4291
|
}
|
|
4221
|
-
};
|
|
4222
|
-
document
|
|
4292
|
+
});
|
|
4293
|
+
fromEvent(document, 'keyup')
|
|
4294
|
+
.pipe(takeUntil$1(this.deactivatedVideoTrigger$))
|
|
4295
|
+
.subscribe((e) => {
|
|
4223
4296
|
if (filter(e)) {
|
|
4224
4297
|
return;
|
|
4225
4298
|
}
|
|
@@ -4228,8 +4301,10 @@ class InputService extends SubService {
|
|
|
4228
4301
|
this.isKeyCodeBrowserKey(e.keyCode)) {
|
|
4229
4302
|
e.preventDefault();
|
|
4230
4303
|
}
|
|
4231
|
-
};
|
|
4232
|
-
document
|
|
4304
|
+
});
|
|
4305
|
+
fromEvent(document, 'keypress')
|
|
4306
|
+
.pipe(takeUntil$1(this.deactivatedVideoTrigger$))
|
|
4307
|
+
.subscribe((e) => {
|
|
4233
4308
|
if (filter(e)) {
|
|
4234
4309
|
return;
|
|
4235
4310
|
}
|
|
@@ -4237,7 +4312,7 @@ class InputService extends SubService {
|
|
|
4237
4312
|
data.setUint8(0, MessageType.KeyPress);
|
|
4238
4313
|
data.setUint16(1, e.charCode, true);
|
|
4239
4314
|
this.sendInputData(data.buffer);
|
|
4240
|
-
};
|
|
4315
|
+
});
|
|
4241
4316
|
}
|
|
4242
4317
|
}
|
|
4243
4318
|
|
|
@@ -4251,9 +4326,6 @@ class RegionsPingService {
|
|
|
4251
4326
|
max_parallel_requests: 10,
|
|
4252
4327
|
bust_cache: true,
|
|
4253
4328
|
};
|
|
4254
|
-
if (!this.unrealInitialConfig?.regionsPingUrl) {
|
|
4255
|
-
return;
|
|
4256
|
-
}
|
|
4257
4329
|
}
|
|
4258
4330
|
getFastest(regionListUrl = this.unrealInitialConfig?.regionsPingUrl || '') {
|
|
4259
4331
|
return this.getProviders(regionListUrl).pipe(switchMap((providers) => this.getPingResult(providers)), catchError(() => of(null)), tapLog('PingResult'), map$1((data) => data?.region_code));
|
|
@@ -4337,20 +4409,26 @@ class RegionsPingService {
|
|
|
4337
4409
|
throw error;
|
|
4338
4410
|
}
|
|
4339
4411
|
}
|
|
4340
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
4341
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
4412
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RegionsPingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4413
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RegionsPingService }); }
|
|
4342
4414
|
}
|
|
4343
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
4415
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: RegionsPingService, decorators: [{
|
|
4344
4416
|
type: Injectable
|
|
4345
|
-
}]
|
|
4417
|
+
}] });
|
|
4346
4418
|
|
|
4347
4419
|
class StreamStatusTelemetryService {
|
|
4348
|
-
#store
|
|
4349
|
-
#videoService
|
|
4420
|
+
#store;
|
|
4421
|
+
#videoService;
|
|
4350
4422
|
constructor() {
|
|
4423
|
+
this.#store = inject(Store);
|
|
4424
|
+
this.#videoService = inject(VideoService);
|
|
4425
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
4351
4426
|
this.init();
|
|
4352
4427
|
}
|
|
4353
4428
|
init() {
|
|
4429
|
+
if (this.unrealConfig?.playwright) {
|
|
4430
|
+
return;
|
|
4431
|
+
}
|
|
4354
4432
|
this.#videoService.videoStats$
|
|
4355
4433
|
.pipe(withLatestFrom(this.#store.select(unrealFeature.selectAwsInstance), this.#store.select(unrealFeature.selectLowBandwidth), this.#store.select(unrealFeature.selectLowBandwidthStats), this.#store.select(unrealFeature.selectCirrusConnected)), auditTime(5000), filter(([, , , , cirrusConnected]) => cirrusConnected), map$1(([data, signalingServer, isLowBandwidth, lbmStats]) => this.mapEventData(data, signalingServer, isLowBandwidth, lbmStats)))
|
|
4356
4434
|
.subscribe((data) => this.trackEventToMixPanel(data));
|
|
@@ -4377,17 +4455,13 @@ class StreamStatusTelemetryService {
|
|
|
4377
4455
|
trackEventToMixPanel(data) {
|
|
4378
4456
|
this.#store.dispatch(trackMixpanelEvent({ event: 'streamStatus', data }));
|
|
4379
4457
|
}
|
|
4380
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
4381
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
4458
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: StreamStatusTelemetryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4459
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: StreamStatusTelemetryService }); }
|
|
4382
4460
|
}
|
|
4383
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
4461
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: StreamStatusTelemetryService, decorators: [{
|
|
4384
4462
|
type: Injectable
|
|
4385
4463
|
}], ctorParameters: () => [] });
|
|
4386
4464
|
|
|
4387
|
-
/*
|
|
4388
|
-
* Copyright (c) 2026.
|
|
4389
|
-
* 3DSource.com. Sergii Karanda steve@3dsource.com. All Rights Reserved.
|
|
4390
|
-
*/
|
|
4391
4465
|
class WebRtcPlayerService2 extends SubService {
|
|
4392
4466
|
constructor() {
|
|
4393
4467
|
super();
|
|
@@ -4441,7 +4515,7 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4441
4515
|
* Creates a new peer connection, applies the remote offer,
|
|
4442
4516
|
* then responds with an SDP answer.
|
|
4443
4517
|
*
|
|
4444
|
-
* The DataChannel is NOT created here — the server creates it
|
|
4518
|
+
* The DataChannel is NOT created here — the server creates it,
|
|
4445
4519
|
* and we receive it via the `datachannel` event on the peer connection.
|
|
4446
4520
|
*/
|
|
4447
4521
|
async handleServerOffer(offer) {
|
|
@@ -4453,7 +4527,7 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4453
4527
|
this.setupPeerConnection(this.cfg);
|
|
4454
4528
|
}
|
|
4455
4529
|
// Offer already defines media transceivers — don't add extras
|
|
4456
|
-
await this.pcClient
|
|
4530
|
+
await this.pcClient?.setRemoteDescription(offer);
|
|
4457
4531
|
this.remoteDescriptionSet = true;
|
|
4458
4532
|
this.flushIceCandidateBuffer();
|
|
4459
4533
|
await this.createAnswer(this.pcClient);
|
|
@@ -4660,13 +4734,13 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4660
4734
|
}
|
|
4661
4735
|
else {
|
|
4662
4736
|
Logger.colored('black', 'yellow', `DataChannel connection not prepared or in state: ${this.dcClient?.readyState}`);
|
|
4663
|
-
// Trigger peer reconnection if DC is not open and we're not
|
|
4737
|
+
// Trigger peer reconnection if DC is not open and we're not yet reconnecting
|
|
4664
4738
|
this.tryReconnectOnSendFailure();
|
|
4665
4739
|
}
|
|
4666
4740
|
}
|
|
4667
4741
|
/**
|
|
4668
4742
|
* Attempts to reconnect the peer when send fails due to DataChannel not being open.
|
|
4669
|
-
* This handles cases where the DC connection is broken but no error events are fired.
|
|
4743
|
+
* This handles cases where the DC connection is broken, but no error events are fired.
|
|
4670
4744
|
*/
|
|
4671
4745
|
tryReconnectOnSendFailure() {
|
|
4672
4746
|
// Skip if already reconnecting or signaling is not connected
|
|
@@ -4895,7 +4969,7 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4895
4969
|
this.store.dispatch(dataChannelConnected({ statusMessage }));
|
|
4896
4970
|
}
|
|
4897
4971
|
/**
|
|
4898
|
-
* Creates an SDP offer, applies SDP munging, sets it as local description,
|
|
4972
|
+
* Creates an SDP offer, applies SDP munging, sets it as a local description,
|
|
4899
4973
|
* and sends it to the server via signaling.
|
|
4900
4974
|
* Transceivers already configure media directions, so deprecated
|
|
4901
4975
|
* offerToReceive* options are not used.
|
|
@@ -4912,7 +4986,7 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4912
4986
|
}
|
|
4913
4987
|
}
|
|
4914
4988
|
/**
|
|
4915
|
-
* Creates an SDP answer, applies SDP munging, sets it as local description,
|
|
4989
|
+
* Creates an SDP answer, applies SDP munging, sets it as a local description,
|
|
4916
4990
|
* and sends it to the server via signaling.
|
|
4917
4991
|
*/
|
|
4918
4992
|
async createAnswer(pcClient) {
|
|
@@ -4926,122 +5000,143 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4926
5000
|
Logger.error("Couldn't create answer", e);
|
|
4927
5001
|
}
|
|
4928
5002
|
}
|
|
4929
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
4930
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
5003
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WebRtcPlayerService2, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5004
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WebRtcPlayerService2 }); }
|
|
4931
5005
|
}
|
|
4932
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5006
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WebRtcPlayerService2, decorators: [{
|
|
4933
5007
|
type: Injectable
|
|
4934
5008
|
}], ctorParameters: () => [] });
|
|
4935
5009
|
|
|
4936
|
-
|
|
4937
|
-
|
|
4938
|
-
|
|
4939
|
-
}
|
|
4940
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AfkPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4941
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AfkPlaywrightService }); }
|
|
4942
|
-
}
|
|
4943
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AfkPlaywrightService, decorators: [{
|
|
4944
|
-
type: Injectable
|
|
4945
|
-
}] });
|
|
5010
|
+
const ReceivedMimeTypes = {
|
|
5011
|
+
ApplicationJson: 'application/json',
|
|
5012
|
+
};
|
|
4946
5013
|
|
|
4947
|
-
class
|
|
5014
|
+
class FileHandlerService {
|
|
4948
5015
|
constructor() {
|
|
4949
|
-
|
|
4950
|
-
|
|
4951
|
-
|
|
4952
|
-
|
|
5016
|
+
this.fileService = inject(FileReceiverService);
|
|
5017
|
+
this.fileHandlers = {
|
|
5018
|
+
[ReceivedMimeTypes.ApplicationJson]: this.handleJsonFile.bind(this),
|
|
5019
|
+
};
|
|
4953
5020
|
}
|
|
4954
|
-
|
|
4955
|
-
|
|
4956
|
-
|
|
4957
|
-
|
|
5021
|
+
handleJsonFile(data, correlationId) {
|
|
5022
|
+
const { blob } = data;
|
|
5023
|
+
return from(blob.text()).pipe(map$1((text) => JSON.parse(text)), filter(({ commandCallback }) => {
|
|
5024
|
+
return commandCallback.correlationId === correlationId;
|
|
4958
5025
|
}));
|
|
4959
|
-
return EMPTY;
|
|
4960
|
-
}
|
|
4961
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SignallingPlaywrightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4962
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SignallingPlaywrightService }); }
|
|
4963
|
-
}
|
|
4964
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: SignallingPlaywrightService, decorators: [{
|
|
4965
|
-
type: Injectable
|
|
4966
|
-
}], ctorParameters: () => [] });
|
|
4967
|
-
|
|
4968
|
-
class UnrealCommunicatorPlaywrightService extends UnrealCommunicatorService {
|
|
4969
|
-
init() {
|
|
4970
|
-
return;
|
|
4971
|
-
}
|
|
4972
|
-
sendCommandToUnreal() {
|
|
4973
|
-
return;
|
|
4974
|
-
}
|
|
4975
|
-
sendInputData() {
|
|
4976
|
-
return;
|
|
4977
5026
|
}
|
|
4978
|
-
|
|
4979
|
-
|
|
4980
|
-
}
|
|
4981
|
-
|
|
4982
|
-
|
|
4983
|
-
|
|
4984
|
-
|
|
4985
|
-
|
|
4986
|
-
|
|
4987
|
-
|
|
4988
|
-
|
|
4989
|
-
|
|
4990
|
-
|
|
4991
|
-
|
|
4992
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AggregatorPlaywrightService, decorators: [{
|
|
4993
|
-
type: Injectable
|
|
4994
|
-
}] });
|
|
4995
|
-
|
|
4996
|
-
class FreezeFramePlaywrightService extends FreezeFrameService {
|
|
4997
|
-
init() {
|
|
4998
|
-
return;
|
|
5027
|
+
observeFileResponse(mimetype, data, sender, timeOut = 60000) {
|
|
5028
|
+
const correlationId = generateUuid();
|
|
5029
|
+
const out = { ...data, correlationId };
|
|
5030
|
+
const observable = this.fileService.fileComplete$.pipe(switchMap((data) => {
|
|
5031
|
+
if (data.valid && this.fileHandlers[mimetype]) {
|
|
5032
|
+
return this.fileHandlers[mimetype](data, correlationId).pipe(filter(Truthy));
|
|
5033
|
+
}
|
|
5034
|
+
return of(null);
|
|
5035
|
+
}), timeout(timeOut), catchError((e) => {
|
|
5036
|
+
Logger.error(e);
|
|
5037
|
+
return of(null);
|
|
5038
|
+
}), take(1));
|
|
5039
|
+
setTimeout(() => sender(out), 0);
|
|
5040
|
+
return observable;
|
|
4999
5041
|
}
|
|
5000
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5001
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
5042
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5043
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService }); }
|
|
5002
5044
|
}
|
|
5003
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5045
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService, decorators: [{
|
|
5004
5046
|
type: Injectable
|
|
5005
5047
|
}] });
|
|
5006
5048
|
|
|
5007
|
-
class
|
|
5008
|
-
|
|
5009
|
-
|
|
5049
|
+
class AnalyticsService extends SubService {
|
|
5050
|
+
#store = inject(Store);
|
|
5051
|
+
/** Signals monitorMouse inner subscriptions to stop (viewport lost / new session). */
|
|
5052
|
+
#stopMouse$ = new Subject();
|
|
5053
|
+
sendEventToMixPanel(name, params = {}) {
|
|
5054
|
+
Logger.log('Analytics Event:', name, params);
|
|
5055
|
+
this.#store.dispatch(saveAnalyticsEvent({ event: { name, params } }));
|
|
5010
5056
|
}
|
|
5011
|
-
|
|
5012
|
-
|
|
5013
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
return;
|
|
5057
|
+
constructor() {
|
|
5058
|
+
super();
|
|
5059
|
+
const abortSignal$ = this.#store
|
|
5060
|
+
.select(unrealFeature.selectViewportReady)
|
|
5061
|
+
.pipe(filter$1(Falsy), map(() => void 0));
|
|
5062
|
+
this.#store
|
|
5063
|
+
.select(unrealFeature.selectViewportReady)
|
|
5064
|
+
.pipe(distinctUntilChanged(), filter$1(Truthy), tap(() => this.monitorMouse(abortSignal$)))
|
|
5065
|
+
.subscribe();
|
|
5021
5066
|
}
|
|
5022
|
-
|
|
5023
|
-
|
|
5024
|
-
|
|
5025
|
-
|
|
5026
|
-
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5067
|
+
monitorMouse(abortSignal$) {
|
|
5068
|
+
this.#stopMouse$.next();
|
|
5069
|
+
const stop$ = merge(this.#stopMouse$.asObservable(), abortSignal$);
|
|
5070
|
+
const element = document.getElementById('streamingVideo');
|
|
5071
|
+
if (!element) {
|
|
5072
|
+
return;
|
|
5073
|
+
}
|
|
5074
|
+
// Monitor mousewheel events
|
|
5075
|
+
const mousewheel$ = fromEvent(element, 'wheel').pipe(takeUntil$1(stop$), throttleTime(1000));
|
|
5076
|
+
// Monitor mouse button states
|
|
5077
|
+
const mousedown$ = fromEvent(element, 'mousedown').pipe(takeUntil$1(stop$));
|
|
5078
|
+
const touchStart$ = fromEvent(element, 'touchstart').pipe(takeUntil$1(stop$));
|
|
5079
|
+
const touchMove$ = fromEvent(element, 'touchmove').pipe(takeUntil$1(stop$), throttleTime(200));
|
|
5080
|
+
// Track mouse movement while the left or right button is pressed
|
|
5081
|
+
mousedown$
|
|
5082
|
+
.pipe(filter$1((event) => event.button === 0 || event.button === 2), tap((downEvent) => {
|
|
5083
|
+
this.sendEventToMixPanel('mouse_interaction', {
|
|
5084
|
+
viewX: downEvent.clientX / element.clientWidth,
|
|
5085
|
+
viewY: downEvent.clientY / element.clientHeight,
|
|
5086
|
+
action: downEvent.button === 0 ? 'spinning' : 'panning',
|
|
5087
|
+
});
|
|
5088
|
+
}))
|
|
5089
|
+
.subscribe();
|
|
5090
|
+
// Track mouse movement while the left or right button is pressed
|
|
5091
|
+
touchStart$
|
|
5092
|
+
.pipe(tap((downEvent) => {
|
|
5093
|
+
const totalTouches = downEvent.touches.length;
|
|
5094
|
+
const touch = downEvent.touches[0];
|
|
5095
|
+
this.sendEventToMixPanel('touch_interaction', {
|
|
5096
|
+
viewX: touch.clientX / element.clientWidth,
|
|
5097
|
+
viewY: touch.clientY / element.clientHeight,
|
|
5098
|
+
action: totalTouches === 1 ? 'spinning' : 'panning',
|
|
5099
|
+
});
|
|
5100
|
+
}))
|
|
5101
|
+
.subscribe();
|
|
5102
|
+
let initialTouchDistance = 0;
|
|
5103
|
+
// Subscribe to mousewheel events
|
|
5104
|
+
touchMove$.subscribe((event) => {
|
|
5105
|
+
const totalTouches = event.touches.length;
|
|
5106
|
+
if (totalTouches < 2) {
|
|
5107
|
+
return;
|
|
5108
|
+
}
|
|
5109
|
+
// Calculate the current distance between two touches
|
|
5110
|
+
const touch1 = event.touches[0];
|
|
5111
|
+
const touch2 = event.touches[1];
|
|
5112
|
+
const currentDistance = Math.sqrt(Math.pow(touch2.clientX - touch1.clientX, 2) +
|
|
5113
|
+
Math.pow(touch2.clientY - touch1.clientY, 2));
|
|
5114
|
+
// Determine if zooming in or out based on distance change
|
|
5115
|
+
const deltaDistance = currentDistance - initialTouchDistance;
|
|
5116
|
+
const isZoomingIn = deltaDistance > 0;
|
|
5117
|
+
// Only send event if there's a significant change (avoid noise)
|
|
5118
|
+
if (Math.abs(deltaDistance) > 10) {
|
|
5119
|
+
this.sendEventToMixPanel('touch_zoom_interaction', {
|
|
5120
|
+
delta: isZoomingIn ? 1 : -1,
|
|
5121
|
+
action: isZoomingIn ? 'zoomin' : 'zoomout',
|
|
5122
|
+
});
|
|
5123
|
+
// Update initial distance for next comparison
|
|
5124
|
+
initialTouchDistance = currentDistance;
|
|
5125
|
+
}
|
|
5126
|
+
});
|
|
5127
|
+
mousewheel$.subscribe((event) => {
|
|
5128
|
+
this.sendEventToMixPanel('mouse_zoom_interaction', {
|
|
5129
|
+
delta: -(event.deltaY / Math.abs(event.deltaY)),
|
|
5130
|
+
action: event.deltaY < 0 ? 'zoomin' : 'zoomout',
|
|
5131
|
+
});
|
|
5132
|
+
});
|
|
5032
5133
|
}
|
|
5033
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5034
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
5134
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5135
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService }); }
|
|
5035
5136
|
}
|
|
5036
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5137
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService, decorators: [{
|
|
5037
5138
|
type: Injectable
|
|
5038
|
-
}] });
|
|
5039
|
-
|
|
5040
|
-
class FileReceiverPlaywrightService extends FileReceiverService {
|
|
5041
|
-
init() {
|
|
5042
|
-
return;
|
|
5043
|
-
}
|
|
5044
|
-
}
|
|
5139
|
+
}], ctorParameters: () => [] });
|
|
5045
5140
|
|
|
5046
5141
|
/**
|
|
5047
5142
|
* Adaptive FPS controller that monitors the incoming WebRTC video stream
|
|
@@ -5120,13 +5215,14 @@ class FpsMonitorService {
|
|
|
5120
5215
|
constructor() {
|
|
5121
5216
|
this.videoService = inject(VideoService);
|
|
5122
5217
|
this.store = inject(Store);
|
|
5218
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
5123
5219
|
/** Discrete FPS targets the controller can switch between (ascending order). */
|
|
5124
5220
|
this.FPS_STEPS = [30, 40, 50, 60];
|
|
5125
|
-
/** Reference ceiling for bitrate (bits/sec) used to
|
|
5221
|
+
/** Reference ceiling for bitrate (bits/sec) used to normalize a bitrate load to 0..1. */
|
|
5126
5222
|
this.MAX_BITRATE = 20_000_000;
|
|
5127
5223
|
/**
|
|
5128
5224
|
* Cooldown (ms) for any decision (increase or decrease) following an increase.
|
|
5129
|
-
* After an increase the system should react faster.
|
|
5225
|
+
* After an increase, the system should react faster.
|
|
5130
5226
|
*/
|
|
5131
5227
|
this.COOLDOWN_AFTER_INCREASE_MS = 2_000;
|
|
5132
5228
|
/**
|
|
@@ -5140,22 +5236,52 @@ class FpsMonitorService {
|
|
|
5140
5236
|
this.COOLDOWN_INCREASE_AFTER_DECREASE_MS = 10_000;
|
|
5141
5237
|
/**
|
|
5142
5238
|
* Number of videoStats$ ticks to accumulate before evaluating.
|
|
5143
|
-
* At 250 ms per tick this gives a ~2 s sliding evaluation window,
|
|
5239
|
+
* At 250 ms per tick, this gives a ~2 s sliding evaluation window,
|
|
5144
5240
|
* long enough to smooth out single-frame jitter.
|
|
5145
5241
|
*/
|
|
5146
5242
|
this.SAMPLE_WINDOW = 8;
|
|
5243
|
+
/** Emits when the session ends, cancelling the current stats' subscription. */
|
|
5244
|
+
this.session$ = new Subject();
|
|
5147
5245
|
/** Current FPS target; starts at max (60 FPS) and adapts downward/upward. */
|
|
5148
5246
|
this.currentFpsTarget = this.FPS_STEPS[this.FPS_STEPS.length - 1];
|
|
5149
5247
|
this.samples = [];
|
|
5150
5248
|
this.lastDecisionTime = Date.now();
|
|
5151
5249
|
this.lastUpgrade = 'hold';
|
|
5250
|
+
this.disconnect$ = this.store
|
|
5251
|
+
.select(unrealFeature.selectCirrusConnected)
|
|
5252
|
+
.pipe(skip(1), filter(Falsy));
|
|
5152
5253
|
this.init();
|
|
5153
5254
|
}
|
|
5154
5255
|
init() {
|
|
5256
|
+
if (this.unrealConfig?.playwright || !this.unrealConfig?.fpsMonitor) {
|
|
5257
|
+
return;
|
|
5258
|
+
}
|
|
5259
|
+
// Reset mutable state and re-subscribe when a new session starts
|
|
5260
|
+
this.store
|
|
5261
|
+
.select(unrealFeature.selectViewportReady)
|
|
5262
|
+
.pipe(filter(Boolean))
|
|
5263
|
+
.subscribe(() => this.startSession());
|
|
5264
|
+
// Reset mutable state when session ends
|
|
5265
|
+
this.disconnect$.subscribe(() => this.resetSession());
|
|
5266
|
+
}
|
|
5267
|
+
startSession() {
|
|
5268
|
+
// Tear down previous stats subscription if any
|
|
5269
|
+
this.session$.next();
|
|
5270
|
+
this.resetMutableState();
|
|
5155
5271
|
this.videoService.videoStats$
|
|
5156
|
-
.pipe(withLatestFrom(this.store.select(unrealFeature.selectViewportReady)), filter(([, viewportReady]) => viewportReady))
|
|
5272
|
+
.pipe(withLatestFrom(this.store.select(unrealFeature.selectViewportReady)), filter(([, viewportReady]) => viewportReady), takeUntil(this.session$))
|
|
5157
5273
|
.subscribe(([stats]) => this.processTick(stats));
|
|
5158
5274
|
}
|
|
5275
|
+
resetSession() {
|
|
5276
|
+
this.session$.next();
|
|
5277
|
+
this.resetMutableState();
|
|
5278
|
+
}
|
|
5279
|
+
resetMutableState() {
|
|
5280
|
+
this.currentFpsTarget = this.FPS_STEPS[this.FPS_STEPS.length - 1];
|
|
5281
|
+
this.samples = [];
|
|
5282
|
+
this.lastDecisionTime = Date.now();
|
|
5283
|
+
this.lastUpgrade = 'hold';
|
|
5284
|
+
}
|
|
5159
5285
|
/**
|
|
5160
5286
|
* Called on every videoStats$ emission (~250 ms).
|
|
5161
5287
|
* Accumulates samples and evaluates once per SAMPLE_WINDOW.
|
|
@@ -5364,161 +5490,10 @@ class FpsMonitorService {
|
|
|
5364
5490
|
}
|
|
5365
5491
|
return { fps: fps / len, bitrate: bitrate / len, qp: qp / len };
|
|
5366
5492
|
}
|
|
5367
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5368
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
5369
|
-
}
|
|
5370
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FpsMonitorService, decorators: [{
|
|
5371
|
-
type: Injectable
|
|
5372
|
-
}], ctorParameters: () => [] });
|
|
5373
|
-
|
|
5374
|
-
class FpsMonitorEmptyService extends FpsMonitorService {
|
|
5375
|
-
init() {
|
|
5376
|
-
return;
|
|
5377
|
-
}
|
|
5378
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FpsMonitorEmptyService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5379
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FpsMonitorEmptyService }); }
|
|
5380
|
-
}
|
|
5381
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FpsMonitorEmptyService, decorators: [{
|
|
5382
|
-
type: Injectable
|
|
5383
|
-
}] });
|
|
5384
|
-
|
|
5385
|
-
class InputPlaywrightService extends InputService {
|
|
5386
|
-
init() {
|
|
5387
|
-
return;
|
|
5388
|
-
}
|
|
5389
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: InputPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5390
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: InputPlaywrightService }); }
|
|
5391
|
-
}
|
|
5392
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: InputPlaywrightService, decorators: [{
|
|
5393
|
-
type: Injectable
|
|
5394
|
-
}] });
|
|
5395
|
-
|
|
5396
|
-
const ReceivedMimeTypes = {
|
|
5397
|
-
ApplicationJson: 'application/json',
|
|
5398
|
-
};
|
|
5399
|
-
|
|
5400
|
-
class FileHandlerService {
|
|
5401
|
-
constructor() {
|
|
5402
|
-
this.fileService = inject(FileReceiverService);
|
|
5403
|
-
this.fileHandlers = {
|
|
5404
|
-
[ReceivedMimeTypes.ApplicationJson]: this.handleJsonFile.bind(this),
|
|
5405
|
-
};
|
|
5406
|
-
}
|
|
5407
|
-
handleJsonFile(data, correlationId) {
|
|
5408
|
-
const { blob } = data;
|
|
5409
|
-
return from(blob.text()).pipe(map$1((text) => JSON.parse(text)), filter(({ commandCallback }) => {
|
|
5410
|
-
return commandCallback.correlationId === correlationId;
|
|
5411
|
-
}));
|
|
5412
|
-
}
|
|
5413
|
-
observeFileResponse(mimetype, data, sender, timeOut = 60000) {
|
|
5414
|
-
const correlationId = generateUuid();
|
|
5415
|
-
const out = { ...data, correlationId };
|
|
5416
|
-
const observable = this.fileService.fileComplete$.pipe(switchMap((data) => {
|
|
5417
|
-
if (data.valid && this.fileHandlers[mimetype]) {
|
|
5418
|
-
return this.fileHandlers[mimetype](data, correlationId).pipe(filter(Truthy));
|
|
5419
|
-
}
|
|
5420
|
-
return of(null);
|
|
5421
|
-
}), timeout(timeOut), catchError((e) => {
|
|
5422
|
-
Logger.error(e);
|
|
5423
|
-
return of(null);
|
|
5424
|
-
}), take(1));
|
|
5425
|
-
setTimeout(() => sender(out), 0);
|
|
5426
|
-
return observable;
|
|
5427
|
-
}
|
|
5428
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FileHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5429
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FileHandlerService }); }
|
|
5430
|
-
}
|
|
5431
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: FileHandlerService, decorators: [{
|
|
5432
|
-
type: Injectable
|
|
5433
|
-
}] });
|
|
5434
|
-
|
|
5435
|
-
class AnalyticsService {
|
|
5436
|
-
#store = inject(Store);
|
|
5437
|
-
#destroy$ = new Subject();
|
|
5438
|
-
sendEventToMixPanel(name, params = {}) {
|
|
5439
|
-
Logger.log('Analytics Event:', name, params);
|
|
5440
|
-
this.#store.dispatch(saveAnalyticsEvent({ event: { name, params } }));
|
|
5441
|
-
}
|
|
5442
|
-
constructor() {
|
|
5443
|
-
const abortSignal$ = this.#store
|
|
5444
|
-
.select(unrealFeature.selectViewportReady)
|
|
5445
|
-
.pipe(filter$1(Falsy), map(() => void 0));
|
|
5446
|
-
this.#store
|
|
5447
|
-
.select(unrealFeature.selectViewportReady)
|
|
5448
|
-
.pipe(distinctUntilChanged(), filter$1(Truthy), tap(() => this.monitorMouse(abortSignal$)))
|
|
5449
|
-
.subscribe();
|
|
5450
|
-
}
|
|
5451
|
-
monitorMouse(abortSignal$) {
|
|
5452
|
-
this.#destroy$.next();
|
|
5453
|
-
const stop$ = merge(this.#destroy$.asObservable(), abortSignal$);
|
|
5454
|
-
const element = document.getElementById('streamingVideo');
|
|
5455
|
-
if (!element) {
|
|
5456
|
-
return;
|
|
5457
|
-
}
|
|
5458
|
-
// Monitor mousewheel events
|
|
5459
|
-
const mousewheel$ = fromEvent(element, 'wheel').pipe(takeUntil$1(stop$), throttleTime(1000));
|
|
5460
|
-
// Monitor mouse button states
|
|
5461
|
-
const mousedown$ = fromEvent(element, 'mousedown').pipe(takeUntil$1(stop$));
|
|
5462
|
-
const touchStart$ = fromEvent(element, 'touchstart').pipe(takeUntil$1(stop$));
|
|
5463
|
-
const touchMove$ = fromEvent(element, 'touchmove').pipe(takeUntil$1(stop$), throttleTime(200));
|
|
5464
|
-
// Track mouse movement while the left or right button is pressed
|
|
5465
|
-
mousedown$
|
|
5466
|
-
.pipe(filter$1((event) => event.button === 0 || event.button === 2), tap((downEvent) => {
|
|
5467
|
-
this.sendEventToMixPanel('mouse_interaction', {
|
|
5468
|
-
viewX: downEvent.clientX / element.clientWidth,
|
|
5469
|
-
viewY: downEvent.clientY / element.clientHeight,
|
|
5470
|
-
action: downEvent.button === 0 ? 'spinning' : 'panning',
|
|
5471
|
-
});
|
|
5472
|
-
}))
|
|
5473
|
-
.subscribe();
|
|
5474
|
-
// Track mouse movement while the left or right button is pressed
|
|
5475
|
-
touchStart$
|
|
5476
|
-
.pipe(tap((downEvent) => {
|
|
5477
|
-
const totalTouches = downEvent.touches.length;
|
|
5478
|
-
const touch = downEvent.touches[0];
|
|
5479
|
-
this.sendEventToMixPanel('touch_interaction', {
|
|
5480
|
-
viewX: touch.clientX / element.clientWidth,
|
|
5481
|
-
viewY: touch.clientY / element.clientHeight,
|
|
5482
|
-
action: totalTouches === 1 ? 'spinning' : 'panning',
|
|
5483
|
-
});
|
|
5484
|
-
}))
|
|
5485
|
-
.subscribe();
|
|
5486
|
-
let initialTouchDistance = 0;
|
|
5487
|
-
// Subscribe to mousewheel events
|
|
5488
|
-
touchMove$.subscribe((event) => {
|
|
5489
|
-
const totalTouches = event.touches.length;
|
|
5490
|
-
if (totalTouches < 2) {
|
|
5491
|
-
return;
|
|
5492
|
-
}
|
|
5493
|
-
// Calculate the current distance between two touches
|
|
5494
|
-
const touch1 = event.touches[0];
|
|
5495
|
-
const touch2 = event.touches[1];
|
|
5496
|
-
const currentDistance = Math.sqrt(Math.pow(touch2.clientX - touch1.clientX, 2) +
|
|
5497
|
-
Math.pow(touch2.clientY - touch1.clientY, 2));
|
|
5498
|
-
// Determine if zooming in or out based on distance change
|
|
5499
|
-
const deltaDistance = currentDistance - initialTouchDistance;
|
|
5500
|
-
const isZoomingIn = deltaDistance > 0;
|
|
5501
|
-
// Only send event if there's a significant change (avoid noise)
|
|
5502
|
-
if (Math.abs(deltaDistance) > 10) {
|
|
5503
|
-
this.sendEventToMixPanel('touch_zoom_interaction', {
|
|
5504
|
-
delta: isZoomingIn ? 1 : -1,
|
|
5505
|
-
action: isZoomingIn ? 'zoomin' : 'zoomout',
|
|
5506
|
-
});
|
|
5507
|
-
// Update initial distance for next comparison
|
|
5508
|
-
initialTouchDistance = currentDistance;
|
|
5509
|
-
}
|
|
5510
|
-
});
|
|
5511
|
-
mousewheel$.subscribe((event) => {
|
|
5512
|
-
this.sendEventToMixPanel('mouse_zoom_interaction', {
|
|
5513
|
-
delta: -(event.deltaY / Math.abs(event.deltaY)),
|
|
5514
|
-
action: event.deltaY < 0 ? 'zoomin' : 'zoomout',
|
|
5515
|
-
});
|
|
5516
|
-
});
|
|
5517
|
-
}
|
|
5518
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5519
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.6", ngImport: i0, type: AnalyticsService }); }
|
|
5493
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FpsMonitorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5494
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FpsMonitorService }); }
|
|
5520
5495
|
}
|
|
5521
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5496
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FpsMonitorService, decorators: [{
|
|
5522
5497
|
type: Injectable
|
|
5523
5498
|
}], ctorParameters: () => [] });
|
|
5524
5499
|
|
|
@@ -5589,10 +5564,10 @@ class UnrealCallbackService {
|
|
|
5589
5564
|
setTimeout(() => sender({ ...data, correlationId }), 0);
|
|
5590
5565
|
return observable;
|
|
5591
5566
|
}
|
|
5592
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5593
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.
|
|
5567
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCallbackService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5568
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCallbackService }); }
|
|
5594
5569
|
}
|
|
5595
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5570
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCallbackService, decorators: [{
|
|
5596
5571
|
type: Injectable
|
|
5597
5572
|
}] });
|
|
5598
5573
|
|
|
@@ -5608,12 +5583,12 @@ class AfkTimeoutModalComponent {
|
|
|
5608
5583
|
resetAfk() {
|
|
5609
5584
|
this.#afkService.reset();
|
|
5610
5585
|
}
|
|
5611
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5612
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
5586
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AfkTimeoutModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5587
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: AfkTimeoutModalComponent, isStandalone: true, selector: "app-afk-timeout-modal", ngImport: i0, template: "@if (isAfkTimerVisible()) {\n <div (click)=\"resetAfk()\" class=\"clickableState\" id=\"videoPlayOverlay\">\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"afkCountdown()\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [isFullWidth]=\"true\"\n [data-testid]=\"'continue-session'\"\n weight=\"primary\"\n size=\"lg\"\n >\n Continue\n </src-button>\n </div>\n </div>\n}\n", styles: ["#videoPlayOverlay{position:absolute;z-index:30;top:0;width:100%;height:100%;font-size:1.8em;font-family:var(--src-font-family-body);background-color:#646464b3}.clickableState{display:flex;justify-content:center;align-items:center;cursor:pointer}.textDisplayState{display:flex}.hiddenState{display:none}.resume-box{width:340px;padding:32px 20px 20px;flex-direction:column;align-items:center;border-radius:var(--src-border-rounded-parent, 8px);background:var(--src-surface-container-main, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box .resume-box__pic{width:72px;height:72px;margin:0 auto 22px;border-radius:48px;background:#ecf0f2;padding:12px;display:flex;align-items:center;justify-content:center}.resume-box .resume-box__pic .text-number{color:var(--src-colors-text-default, #1f2937);text-align:center;font-family:var(--src-font-family-body);font-size:30px;font-style:normal;font-weight:400;line-height:24px}.resume-box__text{margin-bottom:18px}.resume-box__text p{text-align:center;font-family:var(--src-font-family-body);font-size:var(--src-font-size-sm, 14px);font-style:normal;font-weight:400;line-height:24px;color:var(--src-text-body-secondary, #6b7280)}.resume-box__text .resume-box__heading{color:var(--src-text-body-main, #1f2937);text-align:center;font-family:var(--src-font-family-body);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}\n"], dependencies: [{ kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "weight", "size", "context", "customClass", "isFullWidth", "isPressed", "isDisabled", "isLoading", "isInverted", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5613
5588
|
}
|
|
5614
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5589
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AfkTimeoutModalComponent, decorators: [{
|
|
5615
5590
|
type: Component,
|
|
5616
|
-
args: [{ selector: 'app-afk-timeout-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "@if (isAfkTimerVisible()) {\
|
|
5591
|
+
args: [{ selector: 'app-afk-timeout-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "@if (isAfkTimerVisible()) {\n <div (click)=\"resetAfk()\" class=\"clickableState\" id=\"videoPlayOverlay\">\n <div class=\"resume-box\">\n <div aria-hidden=\"true\" class=\"resume-box__pic\" role=\"presentation\">\n <div [innerHTML]=\"afkCountdown()\" class=\"text-number\"></div>\n </div>\n <div class=\"resume-box__text\">\n <h3 class=\"resume-box__heading\">Session will time out soon</h3>\n <p>\n No activity detected. Press 'Continue' if you wish to keep your\n session active\n </p>\n </div>\n <src-button\n [isFullWidth]=\"true\"\n [data-testid]=\"'continue-session'\"\n weight=\"primary\"\n size=\"lg\"\n >\n Continue\n </src-button>\n </div>\n </div>\n}\n", styles: ["#videoPlayOverlay{position:absolute;z-index:30;top:0;width:100%;height:100%;font-size:1.8em;font-family:var(--src-font-family-body);background-color:#646464b3}.clickableState{display:flex;justify-content:center;align-items:center;cursor:pointer}.textDisplayState{display:flex}.hiddenState{display:none}.resume-box{width:340px;padding:32px 20px 20px;flex-direction:column;align-items:center;border-radius:var(--src-border-rounded-parent, 8px);background:var(--src-surface-container-main, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box .resume-box__pic{width:72px;height:72px;margin:0 auto 22px;border-radius:48px;background:#ecf0f2;padding:12px;display:flex;align-items:center;justify-content:center}.resume-box .resume-box__pic .text-number{color:var(--src-colors-text-default, #1f2937);text-align:center;font-family:var(--src-font-family-body);font-size:30px;font-style:normal;font-weight:400;line-height:24px}.resume-box__text{margin-bottom:18px}.resume-box__text p{text-align:center;font-family:var(--src-font-family-body);font-size:var(--src-font-size-sm, 14px);font-style:normal;font-weight:400;line-height:24px;color:var(--src-text-body-secondary, #6b7280)}.resume-box__text .resume-box__heading{color:var(--src-text-body-main, #1f2937);text-align:center;font-family:var(--src-font-family-body);font-size:18px;font-style:normal;font-weight:500;line-height:26px;margin-bottom:8px}\n"] }]
|
|
5617
5592
|
}] });
|
|
5618
5593
|
|
|
5619
5594
|
class FreezeFrameComponent {
|
|
@@ -5623,12 +5598,12 @@ class FreezeFrameComponent {
|
|
|
5623
5598
|
this.combinedFreeze = this.#store.selectSignal(selectFreezeFrameCombinedDataUrl);
|
|
5624
5599
|
}
|
|
5625
5600
|
#store;
|
|
5626
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5627
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
5601
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FreezeFrameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5602
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: FreezeFrameComponent, isStandalone: true, selector: "app-freeze-frame", ngImport: i0, template: "@let image = combinedFreeze();\n@let progress = freezeFrameProgressMessageFromVideo();\n\n<div class=\"freeze-images\">\n @if (image) {\n <img [src]=\"image\" class=\"videoStillImage\" alt=\"freezeFrameImage\" />\n }\n\n @if (progress) {\n <div class=\"progress-status\">\n {{ progress }}\n </div>\n }\n</div>\n", styles: [".freeze-images{pointer-events:none;position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.freeze-images .freezeFrameOverlay{top:0;left:0;width:100%;height:100%;position:absolute;object-fit:cover;object-position:center}.freeze-images .videoStillImage{position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;object-fit:cover}.freeze-images .progress-status{position:absolute;top:50%;left:50%;z-index:1;display:flex;flex-direction:column;justify-content:center;align-items:center;width:auto;height:auto;margin:0;padding:10px;background-color:#ffffffb3;border:1px solid grey;transform:translate(-50%,-50%)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5628
5603
|
}
|
|
5629
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FreezeFrameComponent, decorators: [{
|
|
5630
5605
|
type: Component,
|
|
5631
|
-
args: [{ selector: 'app-freeze-frame', changeDetection: ChangeDetectionStrategy.OnPush, template: "@let image = combinedFreeze();\
|
|
5606
|
+
args: [{ selector: 'app-freeze-frame', changeDetection: ChangeDetectionStrategy.OnPush, template: "@let image = combinedFreeze();\n@let progress = freezeFrameProgressMessageFromVideo();\n\n<div class=\"freeze-images\">\n @if (image) {\n <img [src]=\"image\" class=\"videoStillImage\" alt=\"freezeFrameImage\" />\n }\n\n @if (progress) {\n <div class=\"progress-status\">\n {{ progress }}\n </div>\n }\n</div>\n", styles: [".freeze-images{pointer-events:none;position:absolute;left:0;top:0;width:100%;height:100%;z-index:1}.freeze-images .freezeFrameOverlay{top:0;left:0;width:100%;height:100%;position:absolute;object-fit:cover;object-position:center}.freeze-images .videoStillImage{position:absolute;z-index:1;top:0;left:0;width:100%;height:100%;object-fit:cover}.freeze-images .progress-status{position:absolute;top:50%;left:50%;z-index:1;display:flex;flex-direction:column;justify-content:center;align-items:center;width:auto;height:auto;margin:0;padding:10px;background-color:#ffffffb3;border:1px solid grey;transform:translate(-50%,-50%)}\n"] }]
|
|
5632
5607
|
}] });
|
|
5633
5608
|
|
|
5634
5609
|
class SafePipe {
|
|
@@ -5654,10 +5629,10 @@ class SafePipe {
|
|
|
5654
5629
|
throw new Error(`Invalid safe type specified: ${type}`);
|
|
5655
5630
|
}
|
|
5656
5631
|
}
|
|
5657
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5658
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.
|
|
5632
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SafePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
5633
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.8", ngImport: i0, type: SafePipe, isStandalone: true, name: "safe" }); }
|
|
5659
5634
|
}
|
|
5660
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5635
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SafePipe, decorators: [{
|
|
5661
5636
|
type: Pipe,
|
|
5662
5637
|
args: [{
|
|
5663
5638
|
name: 'safe',
|
|
@@ -5665,18 +5640,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
5665
5640
|
}] });
|
|
5666
5641
|
|
|
5667
5642
|
class LowBandwidthModalComponent {
|
|
5668
|
-
|
|
5669
|
-
this.dialogRef = inject(DialogRef);
|
|
5670
|
-
}
|
|
5643
|
+
#dialogRef = inject(DialogRef);
|
|
5671
5644
|
close(value) {
|
|
5672
|
-
this
|
|
5645
|
+
this.#dialogRef.close(value || false);
|
|
5673
5646
|
}
|
|
5674
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5675
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
5647
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LowBandwidthModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5648
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: LowBandwidthModalComponent, isStandalone: true, selector: "app-low-bandwidth-modal", ngImport: i0, template: "<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n weight=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n", styles: [".src-modal--lbm{width:360px}.src-modal--lbm .src-modal__body{font-size:14px;line-height:24px}.src-modal--lbm .src-modal__buttons{display:flex;gap:8px}\n"], dependencies: [{ kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "weight", "size", "context", "customClass", "isFullWidth", "isPressed", "isDisabled", "isLoading", "isInverted", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }, { kind: "pipe", type: SafePipe, name: "safe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5676
5649
|
}
|
|
5677
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5650
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LowBandwidthModalComponent, decorators: [{
|
|
5678
5651
|
type: Component,
|
|
5679
|
-
args: [{ selector: 'app-low-bandwidth-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SafePipe, SourceButtonComponent], template: "<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\
|
|
5652
|
+
args: [{ selector: 'app-low-bandwidth-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SafePipe, SourceButtonComponent], template: "<div [attr.data-testid]=\"'low-bandwidth'\" class=\"src-modal src-modal--lbm\">\n <header class=\"src-modal__header\">\n <h6 [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n Unstable Connection\n </h6>\n </header>\n <section class=\"src-modal__body\">\n <div\n [innerHtml]=\"\n 'Fluid Interactivity Modes were disabled due to an unstable connection. Showcase Gallery Mode is enabled. To regain full functionality, switch to Interactive Mode.'\n | safe: 'html'\n \"\n class=\"src-modal__scroll-box\"\n ></div>\n </section>\n <footer class=\"src-modal__footer\">\n <div class=\"src-modal__buttons\">\n <src-button\n (onClick)=\"close(true)\"\n [data-testid]=\"'switch-to-interactive-mode'\"\n >\n Switch\n </src-button>\n\n <src-button\n (onClick)=\"close()\"\n [data-testid]=\"'close-lbm-modal'\"\n weight=\"primary\"\n >\n Ok\n </src-button>\n </div>\n </footer>\n</div>\n", styles: [".src-modal--lbm{width:360px}.src-modal--lbm .src-modal__body{font-size:14px;line-height:24px}.src-modal--lbm .src-modal__buttons{display:flex;gap:8px}\n"] }]
|
|
5680
5653
|
}] });
|
|
5681
5654
|
|
|
5682
5655
|
class ImageLoadingSrcComponent {
|
|
@@ -5686,12 +5659,12 @@ class ImageLoadingSrcComponent {
|
|
|
5686
5659
|
this.imageLoadingSrc = this.#store.selectSignal(unrealFeature.selectImageLoadingSrc);
|
|
5687
5660
|
}
|
|
5688
5661
|
#store;
|
|
5689
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5690
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
5662
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ImageLoadingSrcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5663
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: ImageLoadingSrcComponent, isStandalone: true, selector: "app-image-loading-src", ngImport: i0, template: "@let image = imageLoadingSrc();\n@if (isLoaderScreenVisible()) {\n <div class=\"preload\">\n <div class=\"back\">\n @if (image) {\n <img [ngSrc]=\"image\" fill loading=\"lazy\" alt=\"image loading src\" />\n }\n </div>\n </div>\n}\n", styles: [".preload{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.preload .back{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%}.preload .back img{width:100%;height:100%;object-fit:cover}.preload .back{background-color:#fff}\n"], dependencies: [{ kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5691
5664
|
}
|
|
5692
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5665
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ImageLoadingSrcComponent, decorators: [{
|
|
5693
5666
|
type: Component,
|
|
5694
|
-
args: [{ selector: 'app-image-loading-src', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgOptimizedImage], template: "@let image = imageLoadingSrc();\
|
|
5667
|
+
args: [{ selector: 'app-image-loading-src', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgOptimizedImage], template: "@let image = imageLoadingSrc();\n@if (isLoaderScreenVisible()) {\n <div class=\"preload\">\n <div class=\"back\">\n @if (image) {\n <img [ngSrc]=\"image\" fill loading=\"lazy\" alt=\"image loading src\" />\n }\n </div>\n </div>\n}\n", styles: [".preload{position:absolute;top:0;left:0;width:100%;height:100%;text-align:center}.preload .back{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%}.preload .back img{width:100%;height:100%;object-fit:cover}.preload .back{background-color:#fff}\n"] }]
|
|
5695
5668
|
}] });
|
|
5696
5669
|
|
|
5697
5670
|
class StatGraphComponent {
|
|
@@ -5706,7 +5679,10 @@ class StatGraphComponent {
|
|
|
5706
5679
|
this.max = signal(0, ...(ngDevMode ? [{ debugName: "max" }] : /* istanbul ignore next */ []));
|
|
5707
5680
|
this.min = signal(0, ...(ngDevMode ? [{ debugName: "min" }] : /* istanbul ignore next */ []));
|
|
5708
5681
|
this.current = signal(0, ...(ngDevMode ? [{ debugName: "current" }] : /* istanbul ignore next */ []));
|
|
5709
|
-
effect(() =>
|
|
5682
|
+
effect(() => {
|
|
5683
|
+
const stat = this.stat();
|
|
5684
|
+
untracked(() => this.pushData(stat?.value ?? null));
|
|
5685
|
+
});
|
|
5710
5686
|
afterNextRender({
|
|
5711
5687
|
read: () => {
|
|
5712
5688
|
const graph = this.graph();
|
|
@@ -5762,12 +5738,12 @@ class StatGraphComponent {
|
|
|
5762
5738
|
}
|
|
5763
5739
|
this.draw();
|
|
5764
5740
|
}
|
|
5765
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5766
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.
|
|
5741
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: StatGraphComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5742
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.8", type: StatGraphComponent, isStandalone: true, selector: "app-stat-graph", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, stat: { classPropertyName: "stat", publicName: "stat", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, tickStep: { classPropertyName: "tickStep", publicName: "tickStep", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "window:resize": "resize()" } }, viewQueries: [{ propertyName: "graph", first: true, predicate: ["graph"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"content\">\n <p>{{ label() }}: {{ current() }} | Min:{{ min() }} | Max:{{ max() }}</p>\n <canvas #graph class=\"graph\"></canvas>\n</div>\n", styles: [".content{width:100%;height:100%}.content p{color:#fff;margin:5px 0 0;height:25px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5767
5743
|
}
|
|
5768
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5744
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: StatGraphComponent, decorators: [{
|
|
5769
5745
|
type: Component,
|
|
5770
|
-
args: [{ selector: 'app-stat-graph', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"content\">\
|
|
5746
|
+
args: [{ selector: 'app-stat-graph', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"content\">\n <p>{{ label() }}: {{ current() }} | Min:{{ min() }} | Max:{{ max() }}</p>\n <canvas #graph class=\"graph\"></canvas>\n</div>\n", styles: [".content{width:100%;height:100%}.content p{color:#fff;margin:5px 0 0;height:25px}\n"] }]
|
|
5771
5747
|
}], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], stat: [{ type: i0.Input, args: [{ isSignal: true, alias: "stat", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], tickStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "tickStep", required: false }] }], graph: [{ type: i0.ViewChild, args: ['graph', { isSignal: true }] }], resize: [{
|
|
5772
5748
|
type: HostListener,
|
|
5773
5749
|
args: ['window:resize']
|
|
@@ -5846,12 +5822,12 @@ class UnrealStatusComponent {
|
|
|
5846
5822
|
// Fails silently if the iframe's content window cannot be accessed
|
|
5847
5823
|
}
|
|
5848
5824
|
}
|
|
5849
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5850
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
5825
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5826
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: UnrealStatusComponent, isStandalone: true, selector: "app-unreal-status", ngImport: i0, template: "@if (showLoader()) {\n <div class=\"status-box\">\n @if (awsInstance()?.message) {\n <p>{{ awsInstance()?.message }}</p>\n } @else {\n <div class=\"status-box__message\">\n <src-loading\n [size]=\"30\"\n [backgroundStrokeColor]=\"'#E5E7EB'\"\n [progressStrokeColor]=\"'#1F2937'\"\n />\n {{ messagePercents() }}%\n </div>\n }\n </div>\n}\n", styles: ["app-stat-graph{height:30px;width:100%}.status-box{position:absolute;top:80%;left:50%;transform:translate(-50%,-50%);z-index:5;display:flex;justify-content:center;align-items:center;width:auto;max-width:500px;margin:0;background:var(--src-surface-container-main, #fff);border:none;border-radius:var(--src-border-rounded-full, 9999px);box-shadow:0 8px 20px #1718181f,0 3px 6px #17181814;pointer-events:none}.status-box p{padding:10px 15px;margin:0;text-align:center}.status-box__message{display:flex;align-items:center;padding:12px 20px 12px 16px;color:var(--src-text-body-main, #1f2937);font-size:16px;font-weight:400;line-height:24px}.status-box__message .status-box__message_text{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.status-box__message src-loading{margin-right:12px}\n"], dependencies: [{ kind: "component", type: SourceLoadingComponent, selector: "src-loading", inputs: ["size", "progress", "lineCap", "backgroundStrokeColor", "progressStrokeColor", "strokeWidth", "data-testid", "role", "ariaLabel", "ariaValueNow", "ariaValueMin", "ariaValueMax"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5851
5827
|
}
|
|
5852
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5828
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealStatusComponent, decorators: [{
|
|
5853
5829
|
type: Component,
|
|
5854
|
-
args: [{ selector: 'app-unreal-status', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceLoadingComponent], template: "@if (showLoader()) {\
|
|
5830
|
+
args: [{ selector: 'app-unreal-status', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceLoadingComponent], template: "@if (showLoader()) {\n <div class=\"status-box\">\n @if (awsInstance()?.message) {\n <p>{{ awsInstance()?.message }}</p>\n } @else {\n <div class=\"status-box__message\">\n <src-loading\n [size]=\"30\"\n [backgroundStrokeColor]=\"'#E5E7EB'\"\n [progressStrokeColor]=\"'#1F2937'\"\n />\n {{ messagePercents() }}%\n </div>\n }\n </div>\n}\n", styles: ["app-stat-graph{height:30px;width:100%}.status-box{position:absolute;top:80%;left:50%;transform:translate(-50%,-50%);z-index:5;display:flex;justify-content:center;align-items:center;width:auto;max-width:500px;margin:0;background:var(--src-surface-container-main, #fff);border:none;border-radius:var(--src-border-rounded-full, 9999px);box-shadow:0 8px 20px #1718181f,0 3px 6px #17181814;pointer-events:none}.status-box p{padding:10px 15px;margin:0;text-align:center}.status-box__message{display:flex;align-items:center;padding:12px 20px 12px 16px;color:var(--src-text-body-main, #1f2937);font-size:16px;font-weight:400;line-height:24px}.status-box__message .status-box__message_text{display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.status-box__message src-loading{margin-right:12px}\n"] }]
|
|
5855
5831
|
}] });
|
|
5856
5832
|
|
|
5857
5833
|
class VideoStatsComponent {
|
|
@@ -5978,82 +5954,87 @@ class VideoStatsComponent {
|
|
|
5978
5954
|
elements: this.elementsToShow,
|
|
5979
5955
|
}));
|
|
5980
5956
|
}
|
|
5981
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
5982
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
5957
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: VideoStatsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5958
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", 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 }); }
|
|
5983
5959
|
}
|
|
5984
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
5960
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: VideoStatsComponent, decorators: [{
|
|
5985
5961
|
type: Component,
|
|
5986
|
-
args: [{ selector: 'app-video-stats', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StatGraphComponent, AsyncPipe, JsonPipe, SafePipe], template: "@if (videoStatus() && viewportReady()) {\
|
|
5962
|
+
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"] }]
|
|
5987
5963
|
}], ctorParameters: () => [] });
|
|
5988
5964
|
|
|
5989
5965
|
class ResumeStreamButtonComponent {
|
|
5990
5966
|
constructor() {
|
|
5991
5967
|
this.actions$ = inject(Actions);
|
|
5992
|
-
this
|
|
5993
|
-
this
|
|
5994
|
-
this
|
|
5995
|
-
this.showReconnectPopup = this
|
|
5996
|
-
this.isLoaderScreenVisible = this
|
|
5997
|
-
this.streamConfig = this
|
|
5998
|
-
this.isExistMatchUrls = this
|
|
5968
|
+
this.#store = inject(Store);
|
|
5969
|
+
this.#videoService = inject(VideoService);
|
|
5970
|
+
this.#destroyRef = inject(DestroyRef);
|
|
5971
|
+
this.showReconnectPopup = this.#store.selectSignal(selectShowReconnectPopup);
|
|
5972
|
+
this.isLoaderScreenVisible = this.#store.selectSignal(selectIsLoaderScreenVisible);
|
|
5973
|
+
this.streamConfig = this.#store.selectSignal(selectStreamConfig);
|
|
5974
|
+
this.isExistMatchUrls = this.#store.selectSignal(selectIsExistMatchUrls);
|
|
5999
5975
|
this.isSecondStart = signal(!!(this.streamConfig()?.autoStart && location.href.match(/^https/gi)), ...(ngDevMode ? [{ debugName: "isSecondStart" }] : /* istanbul ignore next */ []));
|
|
6000
5976
|
this.isShowResumeButton = computed(() => this.isLoaderScreenVisible() &&
|
|
6001
5977
|
this.showReconnectPopup() &&
|
|
6002
5978
|
this.isExistMatchUrls(), ...(ngDevMode ? [{ debugName: "isShowResumeButton" }] : /* istanbul ignore next */ []));
|
|
6003
5979
|
}
|
|
5980
|
+
#store;
|
|
5981
|
+
#videoService;
|
|
5982
|
+
#destroyRef;
|
|
6004
5983
|
ngOnInit() {
|
|
6005
|
-
this
|
|
5984
|
+
this.#store
|
|
6006
5985
|
.select(unrealFeature.selectCirrusConnected)
|
|
6007
|
-
.pipe(skip$1(1), filter(Falsy), takeUntilDestroyed(this
|
|
5986
|
+
.pipe(skip$1(1), filter(Falsy), takeUntilDestroyed(this.#destroyRef))
|
|
6008
5987
|
.subscribe(() => this.onDisconnect());
|
|
6009
5988
|
}
|
|
6010
5989
|
ngAfterViewInit() {
|
|
6011
5990
|
this.actions$
|
|
6012
|
-
.pipe(ofType(videoStreamInitialized), takeUntilDestroyed(this
|
|
5991
|
+
.pipe(ofType(videoStreamInitialized), takeUntilDestroyed(this.#destroyRef), filter(() => !!this.#videoService.video?.paused))
|
|
6013
5992
|
.subscribe(() => {
|
|
6014
5993
|
Logger.info('Simulate Press Play');
|
|
6015
|
-
this
|
|
6016
|
-
this
|
|
5994
|
+
this.#videoService.play();
|
|
5995
|
+
this.#store.dispatch(resetAfk());
|
|
6017
5996
|
});
|
|
6018
5997
|
}
|
|
6019
5998
|
connect() {
|
|
6020
|
-
this
|
|
5999
|
+
this.#store.dispatch(startStream({ config: { autoStart: true } }));
|
|
6021
6000
|
}
|
|
6022
6001
|
onDisconnect() {
|
|
6023
6002
|
this.isSecondStart.set(true);
|
|
6024
6003
|
}
|
|
6025
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
6026
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
6004
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ResumeStreamButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6005
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: ResumeStreamButtonComponent, isStandalone: true, selector: "app-resume-stream-button", ngImport: i0, template: "@if (isShowResumeButton()) {\n <div class=\"resume-box\">\n @if (isSecondStart()) {\n <div class=\"resume-box__text\">\n Your stream has been paused due to inactivity\n </div>\n }\n\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [data-testid]=\"'connect-button'\"\n size=\"lg\"\n weight=\"primary\"\n class=\"connect-button\"\n >\n {{ isSecondStart() ? 'Resume' : 'Start' }}\n </src-button>\n </div>\n}\n", styles: [".resume-box{padding:16px;position:absolute;bottom:0;left:50%;gap:12px;z-index:6;display:flex;transform:translate(-50%,-50%);flex-direction:column;align-items:center;border-radius:var(--src-border-rounded-parent, 8px);background:var(--src-surface-container-main, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box .connect-button{width:100%}.resume-box .resume-box__text{color:var(--src-color-grey-500, #6b7280);text-align:center;font-family:var(--src-font-family-body);font-size:14px;font-style:normal;font-weight:400;line-height:24px}\n"], dependencies: [{ kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "weight", "size", "context", "customClass", "isFullWidth", "isPressed", "isDisabled", "isLoading", "isInverted", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6027
6006
|
}
|
|
6028
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
6007
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ResumeStreamButtonComponent, decorators: [{
|
|
6029
6008
|
type: Component,
|
|
6030
|
-
args: [{ selector: 'app-resume-stream-button', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "@if (isShowResumeButton()) {\
|
|
6009
|
+
args: [{ selector: 'app-resume-stream-button', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "@if (isShowResumeButton()) {\n <div class=\"resume-box\">\n @if (isSecondStart()) {\n <div class=\"resume-box__text\">\n Your stream has been paused due to inactivity\n </div>\n }\n\n <src-button\n (onClick)=\"connect()\"\n [isFullWidth]=\"true\"\n [data-testid]=\"'connect-button'\"\n size=\"lg\"\n weight=\"primary\"\n class=\"connect-button\"\n >\n {{ isSecondStart() ? 'Resume' : 'Start' }}\n </src-button>\n </div>\n}\n", styles: [".resume-box{padding:16px;position:absolute;bottom:0;left:50%;gap:12px;z-index:6;display:flex;transform:translate(-50%,-50%);flex-direction:column;align-items:center;border-radius:var(--src-border-rounded-parent, 8px);background:var(--src-surface-container-main, #fff);box-shadow:0 26px 80px #0003,0 0 1px #0003}.resume-box .connect-button{width:100%}.resume-box .resume-box__text{color:var(--src-color-grey-500, #6b7280);text-align:center;font-family:var(--src-font-family-body);font-size:14px;font-style:normal;font-weight:400;line-height:24px}\n"] }]
|
|
6031
6010
|
}] });
|
|
6032
6011
|
|
|
6033
6012
|
class IntroSrcComponent {
|
|
6013
|
+
#store;
|
|
6034
6014
|
constructor() {
|
|
6035
6015
|
this.videoElement = viewChild('videoPlayerCover', ...(ngDevMode ? [{ debugName: "videoElement" }] : /* istanbul ignore next */ []));
|
|
6036
|
-
this
|
|
6037
|
-
this.imageIntroSrc = this
|
|
6038
|
-
this.videoIntroSrc = this
|
|
6039
|
-
this.viewportReady = this
|
|
6016
|
+
this.#store = inject(Store);
|
|
6017
|
+
this.imageIntroSrc = this.#store.selectSignal(unrealFeature.selectImageIntroSrc);
|
|
6018
|
+
this.videoIntroSrc = this.#store.selectSignal(unrealFeature.selectVideoIntroSrc);
|
|
6019
|
+
this.viewportReady = this.#store.selectSignal(unrealFeature.selectViewportReady);
|
|
6040
6020
|
effect(() => {
|
|
6041
6021
|
const viewportReady = this.viewportReady();
|
|
6042
6022
|
const videoIntroSrc = this.videoIntroSrc();
|
|
6043
6023
|
const imageIntroSrc = this.imageIntroSrc();
|
|
6044
6024
|
untracked(() => {
|
|
6045
6025
|
if (viewportReady && (videoIntroSrc || imageIntroSrc)) {
|
|
6046
|
-
this
|
|
6026
|
+
this.#store.dispatch(resetIntroSrc());
|
|
6047
6027
|
}
|
|
6048
6028
|
});
|
|
6049
6029
|
});
|
|
6050
6030
|
effect(() => {
|
|
6051
|
-
const videoIntroSrc = this.videoIntroSrc();
|
|
6052
6031
|
const videoElement = this.videoElement();
|
|
6053
|
-
|
|
6054
|
-
|
|
6055
|
-
|
|
6056
|
-
|
|
6032
|
+
const videoIntroSrc = this.videoIntroSrc();
|
|
6033
|
+
untracked(() => {
|
|
6034
|
+
if (videoElement && videoIntroSrc) {
|
|
6035
|
+
this.createVideo(videoIntroSrc, videoElement.nativeElement);
|
|
6036
|
+
}
|
|
6037
|
+
});
|
|
6057
6038
|
});
|
|
6058
6039
|
}
|
|
6059
6040
|
createVideo(src, videoContainer) {
|
|
@@ -6082,15 +6063,16 @@ class IntroSrcComponent {
|
|
|
6082
6063
|
videoElement.innerHTML += 'Browser not supported';
|
|
6083
6064
|
videoContainer.appendChild(videoElement);
|
|
6084
6065
|
}
|
|
6085
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
6086
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
6066
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: IntroSrcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6067
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: IntroSrcComponent, isStandalone: true, selector: "app-intro-src", viewQueries: [{ propertyName: "videoElement", first: true, predicate: ["videoPlayerCover"], descendants: true, isSignal: true }], ngImport: i0, template: "@let image = imageIntroSrc();\n@if (image) {\n <div class=\"backImage\">\n <img [ngSrc]=\"image\" fill alt=\"imageSrc\" />\n </div>\n} @else if (videoIntroSrc()) {\n <div #videoPlayerCover class=\"backVideo\"></div>\n}\n", styles: [".backVideo{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%;z-index:1}.backVideo video{position:absolute;width:100%;height:100%;object-fit:cover}.backImage{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%;z-index:1}.backImage img{position:absolute;width:100%;height:100%;object-fit:cover}\n"], dependencies: [{ kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6087
6068
|
}
|
|
6088
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
6069
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: IntroSrcComponent, decorators: [{
|
|
6089
6070
|
type: Component,
|
|
6090
|
-
args: [{ selector: 'app-intro-src', imports: [NgOptimizedImage], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let image = imageIntroSrc();\
|
|
6071
|
+
args: [{ selector: 'app-intro-src', imports: [NgOptimizedImage], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let image = imageIntroSrc();\n@if (image) {\n <div class=\"backImage\">\n <img [ngSrc]=\"image\" fill alt=\"imageSrc\" />\n </div>\n} @else if (videoIntroSrc()) {\n <div #videoPlayerCover class=\"backVideo\"></div>\n}\n", styles: [".backVideo{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%;z-index:1}.backVideo video{position:absolute;width:100%;height:100%;object-fit:cover}.backImage{position:absolute;top:0;left:0;display:flex;justify-content:center;align-items:center;width:100%;height:100%;z-index:1}.backImage img{position:absolute;width:100%;height:100%;object-fit:cover}\n"] }]
|
|
6091
6072
|
}], ctorParameters: () => [], propDecorators: { videoElement: [{ type: i0.ViewChild, args: ['videoPlayerCover', { isSignal: true }] }] } });
|
|
6092
6073
|
|
|
6093
6074
|
class UnrealSceneComponent {
|
|
6075
|
+
#store;
|
|
6094
6076
|
get resizeValues() {
|
|
6095
6077
|
if (this.isStudio()) {
|
|
6096
6078
|
return this.getResizeStudioValues();
|
|
@@ -6123,22 +6105,22 @@ class UnrealSceneComponent {
|
|
|
6123
6105
|
this.width = FULL_HD_WIDTH;
|
|
6124
6106
|
this.height = FULL_HD_HEIGHT;
|
|
6125
6107
|
this.actions$ = inject(Actions);
|
|
6126
|
-
this
|
|
6127
|
-
this.isExistMatchUrls = this
|
|
6108
|
+
this.#store = inject(Store);
|
|
6109
|
+
this.isExistMatchUrls = this.#store.selectSignal(selectIsExistMatchUrls);
|
|
6128
6110
|
this.isDevMode = inject(DevModeService).isDevMode;
|
|
6129
|
-
this.lightMode = this
|
|
6130
|
-
this.isFreezeFrameLoading = this
|
|
6111
|
+
this.lightMode = this.#store.selectSignal(unrealFeature.selectLowBandwidth);
|
|
6112
|
+
this.isFreezeFrameLoading = this.#store.selectSignal(selectIsFreezeFrameLoading);
|
|
6131
6113
|
this.maxResolution = Truthy(new URLSearchParams(location.search).get('maxresolution'));
|
|
6132
6114
|
this.commandsSender = inject(UnrealCommunicatorService);
|
|
6133
6115
|
this.videoService = inject(VideoService);
|
|
6134
6116
|
this.element = inject(ElementRef);
|
|
6135
6117
|
this.destroyRef = inject(DestroyRef);
|
|
6136
|
-
this.destroyRef.onDestroy(() => this
|
|
6118
|
+
this.destroyRef.onDestroy(() => this.#store.dispatch(destroyUnrealScene()));
|
|
6137
6119
|
effect(() => {
|
|
6138
6120
|
const videoElement = this.videoElement();
|
|
6139
6121
|
const isExistMatchUrls = this.isExistMatchUrls();
|
|
6140
6122
|
if (videoElement && isExistMatchUrls) {
|
|
6141
|
-
this
|
|
6123
|
+
this.#store.dispatch(initSignalling());
|
|
6142
6124
|
}
|
|
6143
6125
|
});
|
|
6144
6126
|
afterNextRender({
|
|
@@ -6175,11 +6157,11 @@ class UnrealSceneComponent {
|
|
|
6175
6157
|
}), map$1((key) => ({ key, ...this.resizeValues })), distinctUntilChanged((previous, current) => fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&
|
|
6176
6158
|
fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD) &&
|
|
6177
6159
|
previous.key === current.key), tap((size) => this.adaptVideo(size)), distinctUntilChanged((previous, current) => fpIsASameAsB(previous.w, current.w, SAME_SIZE_THRESHOLD) &&
|
|
6178
|
-
fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD)), combineLatestWith(this
|
|
6160
|
+
fpIsASameAsB(previous.h, current.h, SAME_SIZE_THRESHOLD)), combineLatestWith(this.#store
|
|
6179
6161
|
.select(unrealFeature.selectDataChannelConnected)
|
|
6180
6162
|
.pipe(filter(Truthy))), takeUntilDestroyed(this.destroyRef))
|
|
6181
6163
|
.subscribe(([size]) => {
|
|
6182
|
-
this
|
|
6164
|
+
this.#store.dispatch(changeStreamResolutionAction({ width: size.w, height: size.h }));
|
|
6183
6165
|
this.sendResize(size);
|
|
6184
6166
|
});
|
|
6185
6167
|
this.actions$
|
|
@@ -6200,7 +6182,7 @@ class UnrealSceneComponent {
|
|
|
6200
6182
|
video.style.height = `${video.height}px`;
|
|
6201
6183
|
}
|
|
6202
6184
|
}
|
|
6203
|
-
this
|
|
6185
|
+
this.#store.dispatch(videoAdaptedToContainer());
|
|
6204
6186
|
}
|
|
6205
6187
|
getResizeValuesUniversal() {
|
|
6206
6188
|
let containerWidth = window.innerWidth || 2;
|
|
@@ -6252,10 +6234,10 @@ class UnrealSceneComponent {
|
|
|
6252
6234
|
payload: { resolution: { x: size.w, y: size.h } },
|
|
6253
6235
|
});
|
|
6254
6236
|
}
|
|
6255
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
6256
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.6", type: UnrealSceneComponent, isStandalone: true, selector: "app-unreal-scene", inputs: { isStudio: { classPropertyName: "isStudio", publicName: "isStudio", isSignal: true, isRequired: false, transformFunction: null }, useContainerAsSizeProvider: { classPropertyName: "useContainerAsSizeProvider", publicName: "useContainerAsSizeProvider", isSignal: true, isRequired: false, transformFunction: null }, studioResolutionSize: { classPropertyName: "studioResolutionSize", publicName: "studioResolutionSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changeMouseOverScene: "changeMouseOverScene" }, host: { listeners: { "mouseover": "onMouseOver()", "mouseout": "onMouseOut()" } }, viewQueries: [{ propertyName: "videoElement", first: true, predicate: ["videoContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"frame unreal-container\">\r\n <div #videoContainer [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\r\n\r\n <app-intro-src />\r\n <app-image-loading-src />\r\n <app-resume-stream-button />\r\n <app-unreal-status />\r\n <app-freeze-frame />\r\n <app-afk-timeout-modal />\r\n\r\n <ng-content select=\"app-pdf\"></ng-content>\r\n <ng-content select=\"app-show-case\"></ng-content>\r\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\r\n\r\n @if (isDevMode) {\r\n <app-video-stats />\r\n }\r\n</div>\r\n", styles: [".unreal-container{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fff}.unreal-container #player{position:absolute;width:100%;height:100%;display:flex;justify-content:center;align-items:center;overflow:hidden}.unreal-container.select{cursor:url('data:image/svg+xml,<svg width=\"24\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.15 21.375a1.423 1.423 0 0 1-1.15.063 1.487 1.487 0 0 1-.85-.788l-3-6.45-2.325 3.25c-.283.4-.658.525-1.125.375-.467-.15-.7-.466-.7-.95V4.05c0-.417.188-.717.563-.9.375-.183.729-.142 1.062.125l10.1 7.95c.383.284.496.65.337 1.1-.158.45-.479.675-.962.675h-4.2l2.975 6.375c.183.384.204.767.063 1.15a1.487 1.487 0 0 1-.788.85Z\" fill=\"%23000\"/><path d=\"m12.697 20.861.002.005c.237.495.617.852 1.128 1.04.515.191 1.039.16 1.539-.08a1.987 1.987 0 0 0 1.04-1.128 1.922 1.922 0 0 0-.079-1.536v-.003L13.684 13.5H17.1c.32 0 .628-.075.89-.26.263-.184.438-.447.544-.749.106-.3.135-.617.04-.925a1.458 1.458 0 0 0-.545-.738L7.936 2.883a1.51 1.51 0 0 0-.768-.336 1.471 1.471 0 0 0-.825.154 1.495 1.495 0 0 0-.626.547 1.492 1.492 0 0 0-.217.802v12.825c0 .324.08.634.272.897.193.261.467.43.775.53.31.099.632.12.942.016.31-.103.555-.313.743-.578h.001l1.825-2.552 2.639 5.673Z\" stroke=\"%23fff\" stroke-opacity=\".7\"/></svg>') 6 2,auto}.unreal-container.orbit{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><path fill=\"%23000\" d=\"M11.998 21.6c-1.966 0-3.737-.53-5.312-1.588-1.575-1.058-2.738-2.437-3.488-4.137a.852.852 0 0 1 .013-.713.867.867 0 0 1 .512-.487.86.86 0 0 1 .688.037c.225.109.387.28.487.513.617 1.35 1.559 2.45 2.825 3.3 1.267.85 2.692 1.275 4.275 1.275 1.384 0 2.646-.33 3.788-.988a7.985 7.985 0 0 0 2.762-2.612h-.85a.873.873 0 0 1-.64-.257.863.863 0 0 1-.26-.638.88.88 0 0 1 .26-.643.864.864 0 0 1 .64-.262h3c.255 0 .47.086.642.259a.87.87 0 0 1 .258.64v3a.874.874 0 0 1-.257.642.863.863 0 0 1-.637.259.88.88 0 0 1-.643-.259.865.865 0 0 1-.263-.641v-.725a9.95 9.95 0 0 1-3.35 2.925c-1.35.733-2.833 1.1-4.45 1.1Zm0-17.4c-1.383 0-2.645.33-3.787.987A7.985 7.985 0 0 0 5.448 7.8h.85c.255 0 .47.086.642.257a.863.863 0 0 1 .258.638.88.88 0 0 1-.258.642.864.864 0 0 1-.642.263h-3a.87.87 0 0 1-.64-.259.87.87 0 0 1-.26-.641v-3c0-.255.086-.469.258-.641a.863.863 0 0 1 .637-.26.88.88 0 0 1 .643.26.864.864 0 0 1 .262.64v.726A9.95 9.95 0 0 1 7.548 3.5c1.35-.733 2.834-1.1 4.45-1.1 2 0 3.788.542 5.363 1.625 1.575 1.083 2.736 2.49 3.482 4.22a.724.724 0 0 1-.045.646.926.926 0 0 1-.525.437.87.87 0 0 1-.687-.04.977.977 0 0 1-.488-.513c-.616-1.35-1.558-2.45-2.825-3.3-1.266-.85-2.691-1.275-4.275-1.275Zm0 10.8a2.893 2.893 0 0 1-2.125-.875A2.893 2.893 0 0 1 8.998 12c0-.833.292-1.542.875-2.125A2.893 2.893 0 0 1 11.998 9c.834 0 1.542.292 2.125.875.584.583.875 1.292.875 2.125s-.291 1.542-.875 2.125a2.893 2.893 0 0 1-2.125.875Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"m2.739 16.072.002.005c.789 1.788 2.014 3.24 3.666 4.35 1.66 1.116 3.53 1.673 5.591 1.673 1.696 0 3.262-.386 4.69-1.16a10.54 10.54 0 0 0 2.714-2.097c.069.167.171.32.308.454.272.268.613.403.994.403.38 0 .722-.135.992-.406s.402-.614.402-.994v-3c0-.381-.134-.724-.405-.995a1.37 1.37 0 0 0-.995-.405h-3c-.383 0-.727.137-.997.411a1.38 1.38 0 0 0-.403.994c0 .38.135.723.407.992.238.237.532.369.858.397a7.552 7.552 0 0 1-2.027 1.685c-1.062.613-2.237.92-3.538.92-1.488 0-2.815-.397-3.996-1.19-1.19-.798-2.07-1.826-2.647-3.087-.147-.34-.393-.6-.727-.76a1.36 1.36 0 0 0-1.073-.058c-.37.133-.64.397-.8.754a1.351 1.351 0 0 0-.016 1.114Zm4.553-8.37a1.36 1.36 0 0 0-.858-.396A7.552 7.552 0 0 1 8.46 5.62c1.062-.613 2.237-.921 3.537-.921 1.489 0 2.816.398 3.997 1.19 1.19.8 2.07 1.827 2.646 3.088.148.34.394.6.728.76a1.37 1.37 0 0 0 1.068.063c.347-.12.62-.346.799-.668.187-.338.215-.71.072-1.072l-.003-.007-.003-.007c-.784-1.818-2.006-3.298-3.658-4.434C15.982 2.47 14.094 1.9 11.998 1.9c-1.695 0-3.261.385-4.688 1.16a10.536 10.536 0 0 0-2.715 2.096 1.364 1.364 0 0 0-.308-.453 1.38 1.38 0 0 0-.994-.403c-.38 0-.722.135-.992.406s-.403.614-.403.994v3c0 .38.135.724.406.995.27.27.614.405.994.405h3c.384 0 .727-.137.998-.412a1.38 1.38 0 0 0 .402-.993c0-.38-.135-.723-.406-.992ZM9.52 14.48a3.393 3.393 0 0 0 2.478 1.02c.965 0 1.8-.342 2.479-1.02a3.392 3.392 0 0 0 1.021-2.48c0-.963-.343-1.8-1.021-2.478A3.392 3.392 0 0 0 11.998 8.5c-.964 0-1.8.343-2.478 1.021A3.392 3.392 0 0 0 8.498 12c0 .964.344 1.8 1.022 2.479Z\"/></svg>') 12 12,auto}.unreal-container.pan{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><path fill=\"%23000\" d=\"M11.997 10.075a1.01 1.01 0 0 1-.738-.313 1.008 1.008 0 0 1-.312-.737V6.15l-.95.95a.998.998 0 0 1-.763.312 1.09 1.09 0 0 1-.763-.337 1.06 1.06 0 0 1-.324-.775c0-.3.108-.558.324-.775l2.776-2.775c.117-.116.237-.2.362-.25a1.04 1.04 0 0 1 .775 0c.125.05.246.134.363.25l2.8 2.8c.216.217.32.47.313.762a1.096 1.096 0 0 1-.338.763 1.058 1.058 0 0 1-.775.325c-.3 0-.558-.108-.775-.325l-.925-.925v2.875c0 .283-.104.53-.312.737a1.01 1.01 0 0 1-.738.313Zm0 11.5a1.04 1.04 0 0 1-.388-.075 1.103 1.103 0 0 1-.362-.25l-2.8-2.8a1.002 1.002 0 0 1-.313-.762c.009-.292.121-.546.337-.763.217-.217.475-.325.775-.325.3 0 .559.108.775.325l.926.925v-2.875c0-.283.104-.529.312-.737a1.01 1.01 0 0 1 .738-.313c.283 0 .529.104.738.313.208.208.312.454.312.737v2.875l.95-.95a.998.998 0 0 1 .762-.312c.292.008.546.12.763.337.216.217.324.475.324.775 0 .3-.108.559-.324.775l-2.775 2.775c-.117.116-.238.2-.363.25a1.04 1.04 0 0 1-.387.075Zm4.925-6.05a1.058 1.058 0 0 1-.326-.774c0-.3.109-.559.326-.776l.925-.925H14.97c-.283 0-.528-.104-.736-.312a1.01 1.01 0 0 1-.313-.738c0-.283.104-.53.313-.738.208-.208.453-.312.737-.312h2.875l-.95-.95a.998.998 0 0 1-.313-.762 1.09 1.09 0 0 1 .338-.764 1.06 1.06 0 0 1 .775-.324c.3 0 .558.108.775.324l2.774 2.776c.117.117.2.238.251.363a1.04 1.04 0 0 1 0 .775c-.05.124-.134.245-.25.362l-2.8 2.8c-.217.216-.471.32-.762.313a1.096 1.096 0 0 1-.763-.337Zm-11.4 0L2.746 12.75a1.103 1.103 0 0 1-.25-.362 1.04 1.04 0 0 1 0-.775c.05-.125.133-.246.25-.363l2.8-2.8c.216-.216.47-.32.762-.313.292.01.546.121.763.337.217.217.325.476.325.776 0 .3-.108.558-.325.775l-.925.925h2.875c.283 0 .529.104.737.312.208.209.313.455.313.738s-.105.53-.313.738a1.008 1.008 0 0 1-.737.312H6.147l.95.95c.217.217.32.471.312.762a1.09 1.09 0 0 1-.337.764 1.06 1.06 0 0 1-.775.324c-.3 0-.559-.108-.776-.324Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"M9.22 7.912c.436.013.821-.15 1.13-.458l.097-.097v1.668c0 .422.16.793.458 1.09.298.299.67.46 1.092.46.422 0 .793-.161 1.091-.46.298-.297.459-.668.459-1.09V7.357l.071.072c.309.308.693.471 1.13.471.435 0 .82-.163 1.128-.471.301-.303.47-.676.483-1.102v-.001a1.501 1.501 0 0 0-.46-1.13l-2.799-2.8a1.6 1.6 0 0 0-.528-.36l-.003-.001a1.54 1.54 0 0 0-1.145 0l-.002.001a1.6 1.6 0 0 0-.529.36L8.118 5.172l-.001.001a1.56 1.56 0 0 0-.47 1.128c0 .435.163.82.47 1.128.303.303.676.472 1.103.484Zm0 0 .014-.5-.015.5Zm-1.311 6.865a1.497 1.497 0 0 0-.458-1.13l-.097-.097h1.668c.421 0 .793-.16 1.09-.458.298-.299.46-.67.46-1.092a1.51 1.51 0 0 0-.46-1.091 1.507 1.507 0 0 0-1.09-.459H7.354l.071-.072c.309-.308.472-.692.472-1.128 0-.436-.163-.82-.472-1.13a1.596 1.596 0 0 0-1.101-.482h-.002a1.501 1.501 0 0 0-1.129.459l-2.8 2.8a1.6 1.6 0 0 0-.36.528l-.001.003a1.54 1.54 0 0 0 0 1.144v.003c.081.2.208.375.362.529l2.774 2.775c.309.308.693.47 1.129.47.435 0 .82-.162 1.128-.47.303-.302.472-.676.484-1.102Zm0 0-.5-.014.5.015v-.001Zm3.038-8.627-.5.5.5.207V6.15Zm.475 15.814.002.001a1.54 1.54 0 0 0 1.145 0h.002c.2-.081.375-.208.53-.362l2.775-2.774a1.56 1.56 0 0 0 .47-1.129c0-.435-.162-.82-.47-1.128a1.589 1.589 0 0 0-1.103-.484 1.497 1.497 0 0 0-1.13.458l-.096.097v-1.668c0-.421-.161-.793-.459-1.09a1.509 1.509 0 0 0-1.091-.46c-.422 0-.794.161-1.092.46a1.507 1.507 0 0 0-.458 1.09v1.668l-.072-.072a1.558 1.558 0 0 0-1.129-.471c-.436 0-.82.163-1.128.471l-.001.001c-.301.302-.47.675-.483 1.101v.001c-.012.437.151.821.46 1.13l2.8 2.8c.153.153.328.28.528.36Zm5.146-6.085c.303.302.676.47 1.102.484a1.5 1.5 0 0 0 1.13-.46l2.8-2.8a1.6 1.6 0 0 0 .36-.528l.002-.003a1.54 1.54 0 0 0 0-1.144l-.001-.003a1.6 1.6 0 0 0-.361-.529l-2.774-2.775h-.001a1.56 1.56 0 0 0-1.128-.47c-.436 0-.82.162-1.128.47h-.001a1.59 1.59 0 0 0-.484 1.102c-.012.437.15.822.459 1.13l.097.097h-1.668c-.422 0-.793.16-1.09.459-.299.298-.46.67-.46 1.091 0 .422.161.793.46 1.092.297.297.668.458 1.09.458h1.668l-.072.072a1.558 1.558 0 0 0-.472 1.129c0 .435.164.82.472 1.128ZM6.147 13.05l.5.5.207-.5h-.707Z\"/></svg>') 12 12,auto}.unreal-container.dolly{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><mask id=\"a\" width=\"24\" height=\"24\" x=\"0\" y=\"0\" maskUnits=\"userSpaceOnUse\" style=\"mask-type:alpha\"><path fill=\"%23127392\" d=\"M0 0h24v24H0z\"/></mask><g mask=\"url(%23a)\"><path fill=\"%23000\" d=\"M12.002 20.575a1.026 1.026 0 0 1-.75-.325l-2.55-2.55a.933.933 0 0 1-.287-.713c.008-.275.113-.513.313-.713.2-.2.441-.3.725-.3.283 0 .524.1.724.3l.776.776V6.95l-.8.8c-.2.2-.438.296-.712.288a1.018 1.018 0 0 1-.713-.312c-.2-.2-.3-.442-.3-.726s.1-.525.3-.725l2.524-2.525a1.026 1.026 0 0 1 1.5 0l2.55 2.55c.2.2.296.438.289.713a1.023 1.023 0 0 1-.314.713c-.2.2-.441.3-.724.3a.988.988 0 0 1-.725-.3l-.775-.776v10.1l.8-.8c.2-.2.437-.296.712-.288.275.008.512.112.712.312.2.2.3.442.3.726s-.1.525-.3.725l-2.524 2.525a1.026 1.026 0 0 1-.75.325Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"M13.553 8.153c.28.245.62.373 1 .373.415 0 .784-.153 1.078-.447.287-.287.446-.644.46-1.05v-.002a1.432 1.432 0 0 0-.435-1.08l-2.55-2.55-.354.353.354-.354a1.526 1.526 0 0 0-2.207 0L8.374 5.921A1.487 1.487 0 0 0 7.928 7c0 .416.152.785.446 1.08.288.287.645.446 1.052.457l4.127-.384Zm0 0v7.693m0-7.693a1.667 1.667 0 0 1-.079-.074l-3.021.075v7.693a1.482 1.482 0 0 0-1-.373c-.416 0-.785.153-1.079.447a1.522 1.522 0 0 0-.46 1.05v.002c-.011.417.14.786.435 1.08l2.55 2.55a1.527 1.527 0 0 0 2.207 0l2.525-2.524c.294-.294.446-.663.446-1.079 0-.416-.152-.785-.446-1.08a1.518 1.518 0 0 0-1.052-.457m0 0-.014.5.014-.5Zm0 0a1.424 1.424 0 0 0-1.027.383m0 0a1.583 1.583 0 0 0-.053.05l.354.354m-.3-.404v.104l.3.3m0 0-.3-.3v.6l.3-.3Z\"/></g></svg>%0D%0A') 12 12,auto}.unreal-container.disabled:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}#playerUI{position:absolute;z-index:10;width:100%}#statsContainer{display:none;text-align:left;background-color:#000c}#stats{padding:6px;font-weight:700;font-size:14px;color:#0f0}canvas{position:absolute;image-rendering:crisp-edges}#overlay{position:absolute;top:0;right:2%;z-index:100;padding:4px;border-top-width:0;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}.overlay{font-weight:lighter;font-family:var(--src-font-family-body)}#overlayButton:hover{cursor:pointer}#overlayButton{font-size:40px;text-align:right}#overlaySettings{display:none;width:300px;padding:4px}#videoMessageOverlay{position:absolute;z-index:20;width:100%;margin:auto;font-size:1.8em;font-family:var(--src-font-family-body)}#playButton{display:inline-block;height:auto}img#playButton{width:10%;max-width:241px}#UIInteraction{position:fixed}#UIInteractionButtonBoundary{padding:2px}#UIInteractionButton{cursor:pointer}#hiddenInput{position:absolute;left:-10%;width:0;opacity:0}#editTextButton{position:absolute;width:40px;height:40px}\n"], dependencies: [{ kind: "component", type: AfkTimeoutModalComponent, selector: "app-afk-timeout-modal" }, { kind: "component", type: UnrealStatusComponent, selector: "app-unreal-status" }, { kind: "component", type: FreezeFrameComponent, selector: "app-freeze-frame" }, { kind: "component", type: VideoStatsComponent, selector: "app-video-stats" }, { kind: "component", type: ResumeStreamButtonComponent, selector: "app-resume-stream-button" }, { kind: "component", type: ImageLoadingSrcComponent, selector: "app-image-loading-src" }, { kind: "component", type: IntroSrcComponent, selector: "app-intro-src" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6237
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealSceneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6238
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: UnrealSceneComponent, isStandalone: true, selector: "app-unreal-scene", inputs: { isStudio: { classPropertyName: "isStudio", publicName: "isStudio", isSignal: true, isRequired: false, transformFunction: null }, useContainerAsSizeProvider: { classPropertyName: "useContainerAsSizeProvider", publicName: "useContainerAsSizeProvider", isSignal: true, isRequired: false, transformFunction: null }, studioResolutionSize: { classPropertyName: "studioResolutionSize", publicName: "studioResolutionSize", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changeMouseOverScene: "changeMouseOverScene" }, host: { listeners: { "mouseover": "onMouseOver()", "mouseout": "onMouseOut()" } }, viewQueries: [{ propertyName: "videoElement", first: true, predicate: ["videoContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"frame unreal-container\">\n <div #videoContainer [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\n\n <app-intro-src />\n <app-image-loading-src />\n <app-resume-stream-button />\n <app-unreal-status />\n <app-freeze-frame />\n <app-afk-timeout-modal />\n\n <ng-content select=\"app-pdf\"></ng-content>\n <ng-content select=\"app-show-case\"></ng-content>\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\n\n @if (isDevMode) {\n <app-video-stats />\n }\n</div>\n", styles: [".unreal-container{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fff}.unreal-container #player{position:absolute;width:100%;height:100%;display:flex;justify-content:center;align-items:center;overflow:hidden}.unreal-container.select{cursor:url('data:image/svg+xml,<svg width=\"24\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.15 21.375a1.423 1.423 0 0 1-1.15.063 1.487 1.487 0 0 1-.85-.788l-3-6.45-2.325 3.25c-.283.4-.658.525-1.125.375-.467-.15-.7-.466-.7-.95V4.05c0-.417.188-.717.563-.9.375-.183.729-.142 1.062.125l10.1 7.95c.383.284.496.65.337 1.1-.158.45-.479.675-.962.675h-4.2l2.975 6.375c.183.384.204.767.063 1.15a1.487 1.487 0 0 1-.788.85Z\" fill=\"%23000\"/><path d=\"m12.697 20.861.002.005c.237.495.617.852 1.128 1.04.515.191 1.039.16 1.539-.08a1.987 1.987 0 0 0 1.04-1.128 1.922 1.922 0 0 0-.079-1.536v-.003L13.684 13.5H17.1c.32 0 .628-.075.89-.26.263-.184.438-.447.544-.749.106-.3.135-.617.04-.925a1.458 1.458 0 0 0-.545-.738L7.936 2.883a1.51 1.51 0 0 0-.768-.336 1.471 1.471 0 0 0-.825.154 1.495 1.495 0 0 0-.626.547 1.492 1.492 0 0 0-.217.802v12.825c0 .324.08.634.272.897.193.261.467.43.775.53.31.099.632.12.942.016.31-.103.555-.313.743-.578h.001l1.825-2.552 2.639 5.673Z\" stroke=\"%23fff\" stroke-opacity=\".7\"/></svg>') 6 2,auto}.unreal-container.orbit{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><path fill=\"%23000\" d=\"M11.998 21.6c-1.966 0-3.737-.53-5.312-1.588-1.575-1.058-2.738-2.437-3.488-4.137a.852.852 0 0 1 .013-.713.867.867 0 0 1 .512-.487.86.86 0 0 1 .688.037c.225.109.387.28.487.513.617 1.35 1.559 2.45 2.825 3.3 1.267.85 2.692 1.275 4.275 1.275 1.384 0 2.646-.33 3.788-.988a7.985 7.985 0 0 0 2.762-2.612h-.85a.873.873 0 0 1-.64-.257.863.863 0 0 1-.26-.638.88.88 0 0 1 .26-.643.864.864 0 0 1 .64-.262h3c.255 0 .47.086.642.259a.87.87 0 0 1 .258.64v3a.874.874 0 0 1-.257.642.863.863 0 0 1-.637.259.88.88 0 0 1-.643-.259.865.865 0 0 1-.263-.641v-.725a9.95 9.95 0 0 1-3.35 2.925c-1.35.733-2.833 1.1-4.45 1.1Zm0-17.4c-1.383 0-2.645.33-3.787.987A7.985 7.985 0 0 0 5.448 7.8h.85c.255 0 .47.086.642.257a.863.863 0 0 1 .258.638.88.88 0 0 1-.258.642.864.864 0 0 1-.642.263h-3a.87.87 0 0 1-.64-.259.87.87 0 0 1-.26-.641v-3c0-.255.086-.469.258-.641a.863.863 0 0 1 .637-.26.88.88 0 0 1 .643.26.864.864 0 0 1 .262.64v.726A9.95 9.95 0 0 1 7.548 3.5c1.35-.733 2.834-1.1 4.45-1.1 2 0 3.788.542 5.363 1.625 1.575 1.083 2.736 2.49 3.482 4.22a.724.724 0 0 1-.045.646.926.926 0 0 1-.525.437.87.87 0 0 1-.687-.04.977.977 0 0 1-.488-.513c-.616-1.35-1.558-2.45-2.825-3.3-1.266-.85-2.691-1.275-4.275-1.275Zm0 10.8a2.893 2.893 0 0 1-2.125-.875A2.893 2.893 0 0 1 8.998 12c0-.833.292-1.542.875-2.125A2.893 2.893 0 0 1 11.998 9c.834 0 1.542.292 2.125.875.584.583.875 1.292.875 2.125s-.291 1.542-.875 2.125a2.893 2.893 0 0 1-2.125.875Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"m2.739 16.072.002.005c.789 1.788 2.014 3.24 3.666 4.35 1.66 1.116 3.53 1.673 5.591 1.673 1.696 0 3.262-.386 4.69-1.16a10.54 10.54 0 0 0 2.714-2.097c.069.167.171.32.308.454.272.268.613.403.994.403.38 0 .722-.135.992-.406s.402-.614.402-.994v-3c0-.381-.134-.724-.405-.995a1.37 1.37 0 0 0-.995-.405h-3c-.383 0-.727.137-.997.411a1.38 1.38 0 0 0-.403.994c0 .38.135.723.407.992.238.237.532.369.858.397a7.552 7.552 0 0 1-2.027 1.685c-1.062.613-2.237.92-3.538.92-1.488 0-2.815-.397-3.996-1.19-1.19-.798-2.07-1.826-2.647-3.087-.147-.34-.393-.6-.727-.76a1.36 1.36 0 0 0-1.073-.058c-.37.133-.64.397-.8.754a1.351 1.351 0 0 0-.016 1.114Zm4.553-8.37a1.36 1.36 0 0 0-.858-.396A7.552 7.552 0 0 1 8.46 5.62c1.062-.613 2.237-.921 3.537-.921 1.489 0 2.816.398 3.997 1.19 1.19.8 2.07 1.827 2.646 3.088.148.34.394.6.728.76a1.37 1.37 0 0 0 1.068.063c.347-.12.62-.346.799-.668.187-.338.215-.71.072-1.072l-.003-.007-.003-.007c-.784-1.818-2.006-3.298-3.658-4.434C15.982 2.47 14.094 1.9 11.998 1.9c-1.695 0-3.261.385-4.688 1.16a10.536 10.536 0 0 0-2.715 2.096 1.364 1.364 0 0 0-.308-.453 1.38 1.38 0 0 0-.994-.403c-.38 0-.722.135-.992.406s-.403.614-.403.994v3c0 .38.135.724.406.995.27.27.614.405.994.405h3c.384 0 .727-.137.998-.412a1.38 1.38 0 0 0 .402-.993c0-.38-.135-.723-.406-.992ZM9.52 14.48a3.393 3.393 0 0 0 2.478 1.02c.965 0 1.8-.342 2.479-1.02a3.392 3.392 0 0 0 1.021-2.48c0-.963-.343-1.8-1.021-2.478A3.392 3.392 0 0 0 11.998 8.5c-.964 0-1.8.343-2.478 1.021A3.392 3.392 0 0 0 8.498 12c0 .964.344 1.8 1.022 2.479Z\"/></svg>') 12 12,auto}.unreal-container.pan{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><path fill=\"%23000\" d=\"M11.997 10.075a1.01 1.01 0 0 1-.738-.313 1.008 1.008 0 0 1-.312-.737V6.15l-.95.95a.998.998 0 0 1-.763.312 1.09 1.09 0 0 1-.763-.337 1.06 1.06 0 0 1-.324-.775c0-.3.108-.558.324-.775l2.776-2.775c.117-.116.237-.2.362-.25a1.04 1.04 0 0 1 .775 0c.125.05.246.134.363.25l2.8 2.8c.216.217.32.47.313.762a1.096 1.096 0 0 1-.338.763 1.058 1.058 0 0 1-.775.325c-.3 0-.558-.108-.775-.325l-.925-.925v2.875c0 .283-.104.53-.312.737a1.01 1.01 0 0 1-.738.313Zm0 11.5a1.04 1.04 0 0 1-.388-.075 1.103 1.103 0 0 1-.362-.25l-2.8-2.8a1.002 1.002 0 0 1-.313-.762c.009-.292.121-.546.337-.763.217-.217.475-.325.775-.325.3 0 .559.108.775.325l.926.925v-2.875c0-.283.104-.529.312-.737a1.01 1.01 0 0 1 .738-.313c.283 0 .529.104.738.313.208.208.312.454.312.737v2.875l.95-.95a.998.998 0 0 1 .762-.312c.292.008.546.12.763.337.216.217.324.475.324.775 0 .3-.108.559-.324.775l-2.775 2.775c-.117.116-.238.2-.363.25a1.04 1.04 0 0 1-.387.075Zm4.925-6.05a1.058 1.058 0 0 1-.326-.774c0-.3.109-.559.326-.776l.925-.925H14.97c-.283 0-.528-.104-.736-.312a1.01 1.01 0 0 1-.313-.738c0-.283.104-.53.313-.738.208-.208.453-.312.737-.312h2.875l-.95-.95a.998.998 0 0 1-.313-.762 1.09 1.09 0 0 1 .338-.764 1.06 1.06 0 0 1 .775-.324c.3 0 .558.108.775.324l2.774 2.776c.117.117.2.238.251.363a1.04 1.04 0 0 1 0 .775c-.05.124-.134.245-.25.362l-2.8 2.8c-.217.216-.471.32-.762.313a1.096 1.096 0 0 1-.763-.337Zm-11.4 0L2.746 12.75a1.103 1.103 0 0 1-.25-.362 1.04 1.04 0 0 1 0-.775c.05-.125.133-.246.25-.363l2.8-2.8c.216-.216.47-.32.762-.313.292.01.546.121.763.337.217.217.325.476.325.776 0 .3-.108.558-.325.775l-.925.925h2.875c.283 0 .529.104.737.312.208.209.313.455.313.738s-.105.53-.313.738a1.008 1.008 0 0 1-.737.312H6.147l.95.95c.217.217.32.471.312.762a1.09 1.09 0 0 1-.337.764 1.06 1.06 0 0 1-.775.324c-.3 0-.559-.108-.776-.324Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"M9.22 7.912c.436.013.821-.15 1.13-.458l.097-.097v1.668c0 .422.16.793.458 1.09.298.299.67.46 1.092.46.422 0 .793-.161 1.091-.46.298-.297.459-.668.459-1.09V7.357l.071.072c.309.308.693.471 1.13.471.435 0 .82-.163 1.128-.471.301-.303.47-.676.483-1.102v-.001a1.501 1.501 0 0 0-.46-1.13l-2.799-2.8a1.6 1.6 0 0 0-.528-.36l-.003-.001a1.54 1.54 0 0 0-1.145 0l-.002.001a1.6 1.6 0 0 0-.529.36L8.118 5.172l-.001.001a1.56 1.56 0 0 0-.47 1.128c0 .435.163.82.47 1.128.303.303.676.472 1.103.484Zm0 0 .014-.5-.015.5Zm-1.311 6.865a1.497 1.497 0 0 0-.458-1.13l-.097-.097h1.668c.421 0 .793-.16 1.09-.458.298-.299.46-.67.46-1.092a1.51 1.51 0 0 0-.46-1.091 1.507 1.507 0 0 0-1.09-.459H7.354l.071-.072c.309-.308.472-.692.472-1.128 0-.436-.163-.82-.472-1.13a1.596 1.596 0 0 0-1.101-.482h-.002a1.501 1.501 0 0 0-1.129.459l-2.8 2.8a1.6 1.6 0 0 0-.36.528l-.001.003a1.54 1.54 0 0 0 0 1.144v.003c.081.2.208.375.362.529l2.774 2.775c.309.308.693.47 1.129.47.435 0 .82-.162 1.128-.47.303-.302.472-.676.484-1.102Zm0 0-.5-.014.5.015v-.001Zm3.038-8.627-.5.5.5.207V6.15Zm.475 15.814.002.001a1.54 1.54 0 0 0 1.145 0h.002c.2-.081.375-.208.53-.362l2.775-2.774a1.56 1.56 0 0 0 .47-1.129c0-.435-.162-.82-.47-1.128a1.589 1.589 0 0 0-1.103-.484 1.497 1.497 0 0 0-1.13.458l-.096.097v-1.668c0-.421-.161-.793-.459-1.09a1.509 1.509 0 0 0-1.091-.46c-.422 0-.794.161-1.092.46a1.507 1.507 0 0 0-.458 1.09v1.668l-.072-.072a1.558 1.558 0 0 0-1.129-.471c-.436 0-.82.163-1.128.471l-.001.001c-.301.302-.47.675-.483 1.101v.001c-.012.437.151.821.46 1.13l2.8 2.8c.153.153.328.28.528.36Zm5.146-6.085c.303.302.676.47 1.102.484a1.5 1.5 0 0 0 1.13-.46l2.8-2.8a1.6 1.6 0 0 0 .36-.528l.002-.003a1.54 1.54 0 0 0 0-1.144l-.001-.003a1.6 1.6 0 0 0-.361-.529l-2.774-2.775h-.001a1.56 1.56 0 0 0-1.128-.47c-.436 0-.82.162-1.128.47h-.001a1.59 1.59 0 0 0-.484 1.102c-.012.437.15.822.459 1.13l.097.097h-1.668c-.422 0-.793.16-1.09.459-.299.298-.46.67-.46 1.091 0 .422.161.793.46 1.092.297.297.668.458 1.09.458h1.668l-.072.072a1.558 1.558 0 0 0-.472 1.129c0 .435.164.82.472 1.128ZM6.147 13.05l.5.5.207-.5h-.707Z\"/></svg>') 12 12,auto}.unreal-container.dolly{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><mask id=\"a\" width=\"24\" height=\"24\" x=\"0\" y=\"0\" maskUnits=\"userSpaceOnUse\" style=\"mask-type:alpha\"><path fill=\"%23127392\" d=\"M0 0h24v24H0z\"/></mask><g mask=\"url(%23a)\"><path fill=\"%23000\" d=\"M12.002 20.575a1.026 1.026 0 0 1-.75-.325l-2.55-2.55a.933.933 0 0 1-.287-.713c.008-.275.113-.513.313-.713.2-.2.441-.3.725-.3.283 0 .524.1.724.3l.776.776V6.95l-.8.8c-.2.2-.438.296-.712.288a1.018 1.018 0 0 1-.713-.312c-.2-.2-.3-.442-.3-.726s.1-.525.3-.725l2.524-2.525a1.026 1.026 0 0 1 1.5 0l2.55 2.55c.2.2.296.438.289.713a1.023 1.023 0 0 1-.314.713c-.2.2-.441.3-.724.3a.988.988 0 0 1-.725-.3l-.775-.776v10.1l.8-.8c.2-.2.437-.296.712-.288.275.008.512.112.712.312.2.2.3.442.3.726s-.1.525-.3.725l-2.524 2.525a1.026 1.026 0 0 1-.75.325Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"M13.553 8.153c.28.245.62.373 1 .373.415 0 .784-.153 1.078-.447.287-.287.446-.644.46-1.05v-.002a1.432 1.432 0 0 0-.435-1.08l-2.55-2.55-.354.353.354-.354a1.526 1.526 0 0 0-2.207 0L8.374 5.921A1.487 1.487 0 0 0 7.928 7c0 .416.152.785.446 1.08.288.287.645.446 1.052.457l4.127-.384Zm0 0v7.693m0-7.693a1.667 1.667 0 0 1-.079-.074l-3.021.075v7.693a1.482 1.482 0 0 0-1-.373c-.416 0-.785.153-1.079.447a1.522 1.522 0 0 0-.46 1.05v.002c-.011.417.14.786.435 1.08l2.55 2.55a1.527 1.527 0 0 0 2.207 0l2.525-2.524c.294-.294.446-.663.446-1.079 0-.416-.152-.785-.446-1.08a1.518 1.518 0 0 0-1.052-.457m0 0-.014.5.014-.5Zm0 0a1.424 1.424 0 0 0-1.027.383m0 0a1.583 1.583 0 0 0-.053.05l.354.354m-.3-.404v.104l.3.3m0 0-.3-.3v.6l.3-.3Z\"/></g></svg>%0A') 12 12,auto}.unreal-container.disabled:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}#playerUI{position:absolute;z-index:10;width:100%}#statsContainer{display:none;text-align:left;background-color:#000c}#stats{padding:6px;font-weight:700;font-size:14px;color:#0f0}canvas{position:absolute;image-rendering:crisp-edges}#overlay{position:absolute;top:0;right:2%;z-index:100;padding:4px;border-top-width:0;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}.overlay{font-weight:lighter;font-family:var(--src-font-family-body)}#overlayButton:hover{cursor:pointer}#overlayButton{font-size:40px;text-align:right}#overlaySettings{display:none;width:300px;padding:4px}#videoMessageOverlay{position:absolute;z-index:20;width:100%;margin:auto;font-size:1.8em;font-family:var(--src-font-family-body)}#playButton{display:inline-block;height:auto}img#playButton{width:10%;max-width:241px}#UIInteraction{position:fixed}#UIInteractionButtonBoundary{padding:2px}#UIInteractionButton{cursor:pointer}#hiddenInput{position:absolute;left:-10%;width:0;opacity:0}#editTextButton{position:absolute;width:40px;height:40px}\n"], dependencies: [{ kind: "component", type: AfkTimeoutModalComponent, selector: "app-afk-timeout-modal" }, { kind: "component", type: UnrealStatusComponent, selector: "app-unreal-status" }, { kind: "component", type: FreezeFrameComponent, selector: "app-freeze-frame" }, { kind: "component", type: VideoStatsComponent, selector: "app-video-stats" }, { kind: "component", type: ResumeStreamButtonComponent, selector: "app-resume-stream-button" }, { kind: "component", type: ImageLoadingSrcComponent, selector: "app-image-loading-src" }, { kind: "component", type: IntroSrcComponent, selector: "app-intro-src" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6257
6239
|
}
|
|
6258
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
6240
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealSceneComponent, decorators: [{
|
|
6259
6241
|
type: Component,
|
|
6260
6242
|
args: [{ selector: 'app-unreal-scene', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
6261
6243
|
AfkTimeoutModalComponent,
|
|
@@ -6265,7 +6247,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
6265
6247
|
ResumeStreamButtonComponent,
|
|
6266
6248
|
ImageLoadingSrcComponent,
|
|
6267
6249
|
IntroSrcComponent,
|
|
6268
|
-
], template: "<div class=\"frame unreal-container\">\r\n <div #videoContainer [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\r\n\r\n <app-intro-src />\r\n <app-image-loading-src />\r\n <app-resume-stream-button />\r\n <app-unreal-status />\r\n <app-freeze-frame />\r\n <app-afk-timeout-modal />\r\n\r\n <ng-content select=\"app-pdf\"></ng-content>\r\n <ng-content select=\"app-show-case\"></ng-content>\r\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\r\n\r\n @if (isDevMode) {\r\n <app-video-stats />\r\n }\r\n</div>\r\n", styles: [".unreal-container{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fff}.unreal-container #player{position:absolute;width:100%;height:100%;display:flex;justify-content:center;align-items:center;overflow:hidden}.unreal-container.select{cursor:url('data:image/svg+xml,<svg width=\"24\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.15 21.375a1.423 1.423 0 0 1-1.15.063 1.487 1.487 0 0 1-.85-.788l-3-6.45-2.325 3.25c-.283.4-.658.525-1.125.375-.467-.15-.7-.466-.7-.95V4.05c0-.417.188-.717.563-.9.375-.183.729-.142 1.062.125l10.1 7.95c.383.284.496.65.337 1.1-.158.45-.479.675-.962.675h-4.2l2.975 6.375c.183.384.204.767.063 1.15a1.487 1.487 0 0 1-.788.85Z\" fill=\"%23000\"/><path d=\"m12.697 20.861.002.005c.237.495.617.852 1.128 1.04.515.191 1.039.16 1.539-.08a1.987 1.987 0 0 0 1.04-1.128 1.922 1.922 0 0 0-.079-1.536v-.003L13.684 13.5H17.1c.32 0 .628-.075.89-.26.263-.184.438-.447.544-.749.106-.3.135-.617.04-.925a1.458 1.458 0 0 0-.545-.738L7.936 2.883a1.51 1.51 0 0 0-.768-.336 1.471 1.471 0 0 0-.825.154 1.495 1.495 0 0 0-.626.547 1.492 1.492 0 0 0-.217.802v12.825c0 .324.08.634.272.897.193.261.467.43.775.53.31.099.632.12.942.016.31-.103.555-.313.743-.578h.001l1.825-2.552 2.639 5.673Z\" stroke=\"%23fff\" stroke-opacity=\".7\"/></svg>') 6 2,auto}.unreal-container.orbit{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><path fill=\"%23000\" d=\"M11.998 21.6c-1.966 0-3.737-.53-5.312-1.588-1.575-1.058-2.738-2.437-3.488-4.137a.852.852 0 0 1 .013-.713.867.867 0 0 1 .512-.487.86.86 0 0 1 .688.037c.225.109.387.28.487.513.617 1.35 1.559 2.45 2.825 3.3 1.267.85 2.692 1.275 4.275 1.275 1.384 0 2.646-.33 3.788-.988a7.985 7.985 0 0 0 2.762-2.612h-.85a.873.873 0 0 1-.64-.257.863.863 0 0 1-.26-.638.88.88 0 0 1 .26-.643.864.864 0 0 1 .64-.262h3c.255 0 .47.086.642.259a.87.87 0 0 1 .258.64v3a.874.874 0 0 1-.257.642.863.863 0 0 1-.637.259.88.88 0 0 1-.643-.259.865.865 0 0 1-.263-.641v-.725a9.95 9.95 0 0 1-3.35 2.925c-1.35.733-2.833 1.1-4.45 1.1Zm0-17.4c-1.383 0-2.645.33-3.787.987A7.985 7.985 0 0 0 5.448 7.8h.85c.255 0 .47.086.642.257a.863.863 0 0 1 .258.638.88.88 0 0 1-.258.642.864.864 0 0 1-.642.263h-3a.87.87 0 0 1-.64-.259.87.87 0 0 1-.26-.641v-3c0-.255.086-.469.258-.641a.863.863 0 0 1 .637-.26.88.88 0 0 1 .643.26.864.864 0 0 1 .262.64v.726A9.95 9.95 0 0 1 7.548 3.5c1.35-.733 2.834-1.1 4.45-1.1 2 0 3.788.542 5.363 1.625 1.575 1.083 2.736 2.49 3.482 4.22a.724.724 0 0 1-.045.646.926.926 0 0 1-.525.437.87.87 0 0 1-.687-.04.977.977 0 0 1-.488-.513c-.616-1.35-1.558-2.45-2.825-3.3-1.266-.85-2.691-1.275-4.275-1.275Zm0 10.8a2.893 2.893 0 0 1-2.125-.875A2.893 2.893 0 0 1 8.998 12c0-.833.292-1.542.875-2.125A2.893 2.893 0 0 1 11.998 9c.834 0 1.542.292 2.125.875.584.583.875 1.292.875 2.125s-.291 1.542-.875 2.125a2.893 2.893 0 0 1-2.125.875Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"m2.739 16.072.002.005c.789 1.788 2.014 3.24 3.666 4.35 1.66 1.116 3.53 1.673 5.591 1.673 1.696 0 3.262-.386 4.69-1.16a10.54 10.54 0 0 0 2.714-2.097c.069.167.171.32.308.454.272.268.613.403.994.403.38 0 .722-.135.992-.406s.402-.614.402-.994v-3c0-.381-.134-.724-.405-.995a1.37 1.37 0 0 0-.995-.405h-3c-.383 0-.727.137-.997.411a1.38 1.38 0 0 0-.403.994c0 .38.135.723.407.992.238.237.532.369.858.397a7.552 7.552 0 0 1-2.027 1.685c-1.062.613-2.237.92-3.538.92-1.488 0-2.815-.397-3.996-1.19-1.19-.798-2.07-1.826-2.647-3.087-.147-.34-.393-.6-.727-.76a1.36 1.36 0 0 0-1.073-.058c-.37.133-.64.397-.8.754a1.351 1.351 0 0 0-.016 1.114Zm4.553-8.37a1.36 1.36 0 0 0-.858-.396A7.552 7.552 0 0 1 8.46 5.62c1.062-.613 2.237-.921 3.537-.921 1.489 0 2.816.398 3.997 1.19 1.19.8 2.07 1.827 2.646 3.088.148.34.394.6.728.76a1.37 1.37 0 0 0 1.068.063c.347-.12.62-.346.799-.668.187-.338.215-.71.072-1.072l-.003-.007-.003-.007c-.784-1.818-2.006-3.298-3.658-4.434C15.982 2.47 14.094 1.9 11.998 1.9c-1.695 0-3.261.385-4.688 1.16a10.536 10.536 0 0 0-2.715 2.096 1.364 1.364 0 0 0-.308-.453 1.38 1.38 0 0 0-.994-.403c-.38 0-.722.135-.992.406s-.403.614-.403.994v3c0 .38.135.724.406.995.27.27.614.405.994.405h3c.384 0 .727-.137.998-.412a1.38 1.38 0 0 0 .402-.993c0-.38-.135-.723-.406-.992ZM9.52 14.48a3.393 3.393 0 0 0 2.478 1.02c.965 0 1.8-.342 2.479-1.02a3.392 3.392 0 0 0 1.021-2.48c0-.963-.343-1.8-1.021-2.478A3.392 3.392 0 0 0 11.998 8.5c-.964 0-1.8.343-2.478 1.021A3.392 3.392 0 0 0 8.498 12c0 .964.344 1.8 1.022 2.479Z\"/></svg>') 12 12,auto}.unreal-container.pan{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><path fill=\"%23000\" d=\"M11.997 10.075a1.01 1.01 0 0 1-.738-.313 1.008 1.008 0 0 1-.312-.737V6.15l-.95.95a.998.998 0 0 1-.763.312 1.09 1.09 0 0 1-.763-.337 1.06 1.06 0 0 1-.324-.775c0-.3.108-.558.324-.775l2.776-2.775c.117-.116.237-.2.362-.25a1.04 1.04 0 0 1 .775 0c.125.05.246.134.363.25l2.8 2.8c.216.217.32.47.313.762a1.096 1.096 0 0 1-.338.763 1.058 1.058 0 0 1-.775.325c-.3 0-.558-.108-.775-.325l-.925-.925v2.875c0 .283-.104.53-.312.737a1.01 1.01 0 0 1-.738.313Zm0 11.5a1.04 1.04 0 0 1-.388-.075 1.103 1.103 0 0 1-.362-.25l-2.8-2.8a1.002 1.002 0 0 1-.313-.762c.009-.292.121-.546.337-.763.217-.217.475-.325.775-.325.3 0 .559.108.775.325l.926.925v-2.875c0-.283.104-.529.312-.737a1.01 1.01 0 0 1 .738-.313c.283 0 .529.104.738.313.208.208.312.454.312.737v2.875l.95-.95a.998.998 0 0 1 .762-.312c.292.008.546.12.763.337.216.217.324.475.324.775 0 .3-.108.559-.324.775l-2.775 2.775c-.117.116-.238.2-.363.25a1.04 1.04 0 0 1-.387.075Zm4.925-6.05a1.058 1.058 0 0 1-.326-.774c0-.3.109-.559.326-.776l.925-.925H14.97c-.283 0-.528-.104-.736-.312a1.01 1.01 0 0 1-.313-.738c0-.283.104-.53.313-.738.208-.208.453-.312.737-.312h2.875l-.95-.95a.998.998 0 0 1-.313-.762 1.09 1.09 0 0 1 .338-.764 1.06 1.06 0 0 1 .775-.324c.3 0 .558.108.775.324l2.774 2.776c.117.117.2.238.251.363a1.04 1.04 0 0 1 0 .775c-.05.124-.134.245-.25.362l-2.8 2.8c-.217.216-.471.32-.762.313a1.096 1.096 0 0 1-.763-.337Zm-11.4 0L2.746 12.75a1.103 1.103 0 0 1-.25-.362 1.04 1.04 0 0 1 0-.775c.05-.125.133-.246.25-.363l2.8-2.8c.216-.216.47-.32.762-.313.292.01.546.121.763.337.217.217.325.476.325.776 0 .3-.108.558-.325.775l-.925.925h2.875c.283 0 .529.104.737.312.208.209.313.455.313.738s-.105.53-.313.738a1.008 1.008 0 0 1-.737.312H6.147l.95.95c.217.217.32.471.312.762a1.09 1.09 0 0 1-.337.764 1.06 1.06 0 0 1-.775.324c-.3 0-.559-.108-.776-.324Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"M9.22 7.912c.436.013.821-.15 1.13-.458l.097-.097v1.668c0 .422.16.793.458 1.09.298.299.67.46 1.092.46.422 0 .793-.161 1.091-.46.298-.297.459-.668.459-1.09V7.357l.071.072c.309.308.693.471 1.13.471.435 0 .82-.163 1.128-.471.301-.303.47-.676.483-1.102v-.001a1.501 1.501 0 0 0-.46-1.13l-2.799-2.8a1.6 1.6 0 0 0-.528-.36l-.003-.001a1.54 1.54 0 0 0-1.145 0l-.002.001a1.6 1.6 0 0 0-.529.36L8.118 5.172l-.001.001a1.56 1.56 0 0 0-.47 1.128c0 .435.163.82.47 1.128.303.303.676.472 1.103.484Zm0 0 .014-.5-.015.5Zm-1.311 6.865a1.497 1.497 0 0 0-.458-1.13l-.097-.097h1.668c.421 0 .793-.16 1.09-.458.298-.299.46-.67.46-1.092a1.51 1.51 0 0 0-.46-1.091 1.507 1.507 0 0 0-1.09-.459H7.354l.071-.072c.309-.308.472-.692.472-1.128 0-.436-.163-.82-.472-1.13a1.596 1.596 0 0 0-1.101-.482h-.002a1.501 1.501 0 0 0-1.129.459l-2.8 2.8a1.6 1.6 0 0 0-.36.528l-.001.003a1.54 1.54 0 0 0 0 1.144v.003c.081.2.208.375.362.529l2.774 2.775c.309.308.693.47 1.129.47.435 0 .82-.162 1.128-.47.303-.302.472-.676.484-1.102Zm0 0-.5-.014.5.015v-.001Zm3.038-8.627-.5.5.5.207V6.15Zm.475 15.814.002.001a1.54 1.54 0 0 0 1.145 0h.002c.2-.081.375-.208.53-.362l2.775-2.774a1.56 1.56 0 0 0 .47-1.129c0-.435-.162-.82-.47-1.128a1.589 1.589 0 0 0-1.103-.484 1.497 1.497 0 0 0-1.13.458l-.096.097v-1.668c0-.421-.161-.793-.459-1.09a1.509 1.509 0 0 0-1.091-.46c-.422 0-.794.161-1.092.46a1.507 1.507 0 0 0-.458 1.09v1.668l-.072-.072a1.558 1.558 0 0 0-1.129-.471c-.436 0-.82.163-1.128.471l-.001.001c-.301.302-.47.675-.483 1.101v.001c-.012.437.151.821.46 1.13l2.8 2.8c.153.153.328.28.528.36Zm5.146-6.085c.303.302.676.47 1.102.484a1.5 1.5 0 0 0 1.13-.46l2.8-2.8a1.6 1.6 0 0 0 .36-.528l.002-.003a1.54 1.54 0 0 0 0-1.144l-.001-.003a1.6 1.6 0 0 0-.361-.529l-2.774-2.775h-.001a1.56 1.56 0 0 0-1.128-.47c-.436 0-.82.162-1.128.47h-.001a1.59 1.59 0 0 0-.484 1.102c-.012.437.15.822.459 1.13l.097.097h-1.668c-.422 0-.793.16-1.09.459-.299.298-.46.67-.46 1.091 0 .422.161.793.46 1.092.297.297.668.458 1.09.458h1.668l-.072.072a1.558 1.558 0 0 0-.472 1.129c0 .435.164.82.472 1.128ZM6.147 13.05l.5.5.207-.5h-.707Z\"/></svg>') 12 12,auto}.unreal-container.dolly{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><mask id=\"a\" width=\"24\" height=\"24\" x=\"0\" y=\"0\" maskUnits=\"userSpaceOnUse\" style=\"mask-type:alpha\"><path fill=\"%23127392\" d=\"M0 0h24v24H0z\"/></mask><g mask=\"url(%23a)\"><path fill=\"%23000\" d=\"M12.002 20.575a1.026 1.026 0 0 1-.75-.325l-2.55-2.55a.933.933 0 0 1-.287-.713c.008-.275.113-.513.313-.713.2-.2.441-.3.725-.3.283 0 .524.1.724.3l.776.776V6.95l-.8.8c-.2.2-.438.296-.712.288a1.018 1.018 0 0 1-.713-.312c-.2-.2-.3-.442-.3-.726s.1-.525.3-.725l2.524-2.525a1.026 1.026 0 0 1 1.5 0l2.55 2.55c.2.2.296.438.289.713a1.023 1.023 0 0 1-.314.713c-.2.2-.441.3-.724.3a.988.988 0 0 1-.725-.3l-.775-.776v10.1l.8-.8c.2-.2.437-.296.712-.288.275.008.512.112.712.312.2.2.3.442.3.726s-.1.525-.3.725l-2.524 2.525a1.026 1.026 0 0 1-.75.325Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"M13.553 8.153c.28.245.62.373 1 .373.415 0 .784-.153 1.078-.447.287-.287.446-.644.46-1.05v-.002a1.432 1.432 0 0 0-.435-1.08l-2.55-2.55-.354.353.354-.354a1.526 1.526 0 0 0-2.207 0L8.374 5.921A1.487 1.487 0 0 0 7.928 7c0 .416.152.785.446 1.08.288.287.645.446 1.052.457l4.127-.384Zm0 0v7.693m0-7.693a1.667 1.667 0 0 1-.079-.074l-3.021.075v7.693a1.482 1.482 0 0 0-1-.373c-.416 0-.785.153-1.079.447a1.522 1.522 0 0 0-.46 1.05v.002c-.011.417.14.786.435 1.08l2.55 2.55a1.527 1.527 0 0 0 2.207 0l2.525-2.524c.294-.294.446-.663.446-1.079 0-.416-.152-.785-.446-1.08a1.518 1.518 0 0 0-1.052-.457m0 0-.014.5.014-.5Zm0 0a1.424 1.424 0 0 0-1.027.383m0 0a1.583 1.583 0 0 0-.053.05l.354.354m-.3-.404v.104l.3.3m0 0-.3-.3v.6l.3-.3Z\"/></g></svg>%0D%0A') 12 12,auto}.unreal-container.disabled:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}#playerUI{position:absolute;z-index:10;width:100%}#statsContainer{display:none;text-align:left;background-color:#000c}#stats{padding:6px;font-weight:700;font-size:14px;color:#0f0}canvas{position:absolute;image-rendering:crisp-edges}#overlay{position:absolute;top:0;right:2%;z-index:100;padding:4px;border-top-width:0;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}.overlay{font-weight:lighter;font-family:var(--src-font-family-body)}#overlayButton:hover{cursor:pointer}#overlayButton{font-size:40px;text-align:right}#overlaySettings{display:none;width:300px;padding:4px}#videoMessageOverlay{position:absolute;z-index:20;width:100%;margin:auto;font-size:1.8em;font-family:var(--src-font-family-body)}#playButton{display:inline-block;height:auto}img#playButton{width:10%;max-width:241px}#UIInteraction{position:fixed}#UIInteractionButtonBoundary{padding:2px}#UIInteractionButton{cursor:pointer}#hiddenInput{position:absolute;left:-10%;width:0;opacity:0}#editTextButton{position:absolute;width:40px;height:40px}\n"] }]
|
|
6250
|
+
], template: "<div class=\"frame unreal-container\">\n <div #videoContainer [class.lightModeCursor]=\"lightMode()\" id=\"player\"></div>\n\n <app-intro-src />\n <app-image-loading-src />\n <app-resume-stream-button />\n <app-unreal-status />\n <app-freeze-frame />\n <app-afk-timeout-modal />\n\n <ng-content select=\"app-pdf\"></ng-content>\n <ng-content select=\"app-show-case\"></ng-content>\n <ng-content select=\"app-low-bandwidth-detector\"></ng-content>\n\n @if (isDevMode) {\n <app-video-stats />\n }\n</div>\n", styles: [".unreal-container{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fff}.unreal-container #player{position:absolute;width:100%;height:100%;display:flex;justify-content:center;align-items:center;overflow:hidden}.unreal-container.select{cursor:url('data:image/svg+xml,<svg width=\"24\" height=\"24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.15 21.375a1.423 1.423 0 0 1-1.15.063 1.487 1.487 0 0 1-.85-.788l-3-6.45-2.325 3.25c-.283.4-.658.525-1.125.375-.467-.15-.7-.466-.7-.95V4.05c0-.417.188-.717.563-.9.375-.183.729-.142 1.062.125l10.1 7.95c.383.284.496.65.337 1.1-.158.45-.479.675-.962.675h-4.2l2.975 6.375c.183.384.204.767.063 1.15a1.487 1.487 0 0 1-.788.85Z\" fill=\"%23000\"/><path d=\"m12.697 20.861.002.005c.237.495.617.852 1.128 1.04.515.191 1.039.16 1.539-.08a1.987 1.987 0 0 0 1.04-1.128 1.922 1.922 0 0 0-.079-1.536v-.003L13.684 13.5H17.1c.32 0 .628-.075.89-.26.263-.184.438-.447.544-.749.106-.3.135-.617.04-.925a1.458 1.458 0 0 0-.545-.738L7.936 2.883a1.51 1.51 0 0 0-.768-.336 1.471 1.471 0 0 0-.825.154 1.495 1.495 0 0 0-.626.547 1.492 1.492 0 0 0-.217.802v12.825c0 .324.08.634.272.897.193.261.467.43.775.53.31.099.632.12.942.016.31-.103.555-.313.743-.578h.001l1.825-2.552 2.639 5.673Z\" stroke=\"%23fff\" stroke-opacity=\".7\"/></svg>') 6 2,auto}.unreal-container.orbit{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><path fill=\"%23000\" d=\"M11.998 21.6c-1.966 0-3.737-.53-5.312-1.588-1.575-1.058-2.738-2.437-3.488-4.137a.852.852 0 0 1 .013-.713.867.867 0 0 1 .512-.487.86.86 0 0 1 .688.037c.225.109.387.28.487.513.617 1.35 1.559 2.45 2.825 3.3 1.267.85 2.692 1.275 4.275 1.275 1.384 0 2.646-.33 3.788-.988a7.985 7.985 0 0 0 2.762-2.612h-.85a.873.873 0 0 1-.64-.257.863.863 0 0 1-.26-.638.88.88 0 0 1 .26-.643.864.864 0 0 1 .64-.262h3c.255 0 .47.086.642.259a.87.87 0 0 1 .258.64v3a.874.874 0 0 1-.257.642.863.863 0 0 1-.637.259.88.88 0 0 1-.643-.259.865.865 0 0 1-.263-.641v-.725a9.95 9.95 0 0 1-3.35 2.925c-1.35.733-2.833 1.1-4.45 1.1Zm0-17.4c-1.383 0-2.645.33-3.787.987A7.985 7.985 0 0 0 5.448 7.8h.85c.255 0 .47.086.642.257a.863.863 0 0 1 .258.638.88.88 0 0 1-.258.642.864.864 0 0 1-.642.263h-3a.87.87 0 0 1-.64-.259.87.87 0 0 1-.26-.641v-3c0-.255.086-.469.258-.641a.863.863 0 0 1 .637-.26.88.88 0 0 1 .643.26.864.864 0 0 1 .262.64v.726A9.95 9.95 0 0 1 7.548 3.5c1.35-.733 2.834-1.1 4.45-1.1 2 0 3.788.542 5.363 1.625 1.575 1.083 2.736 2.49 3.482 4.22a.724.724 0 0 1-.045.646.926.926 0 0 1-.525.437.87.87 0 0 1-.687-.04.977.977 0 0 1-.488-.513c-.616-1.35-1.558-2.45-2.825-3.3-1.266-.85-2.691-1.275-4.275-1.275Zm0 10.8a2.893 2.893 0 0 1-2.125-.875A2.893 2.893 0 0 1 8.998 12c0-.833.292-1.542.875-2.125A2.893 2.893 0 0 1 11.998 9c.834 0 1.542.292 2.125.875.584.583.875 1.292.875 2.125s-.291 1.542-.875 2.125a2.893 2.893 0 0 1-2.125.875Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"m2.739 16.072.002.005c.789 1.788 2.014 3.24 3.666 4.35 1.66 1.116 3.53 1.673 5.591 1.673 1.696 0 3.262-.386 4.69-1.16a10.54 10.54 0 0 0 2.714-2.097c.069.167.171.32.308.454.272.268.613.403.994.403.38 0 .722-.135.992-.406s.402-.614.402-.994v-3c0-.381-.134-.724-.405-.995a1.37 1.37 0 0 0-.995-.405h-3c-.383 0-.727.137-.997.411a1.38 1.38 0 0 0-.403.994c0 .38.135.723.407.992.238.237.532.369.858.397a7.552 7.552 0 0 1-2.027 1.685c-1.062.613-2.237.92-3.538.92-1.488 0-2.815-.397-3.996-1.19-1.19-.798-2.07-1.826-2.647-3.087-.147-.34-.393-.6-.727-.76a1.36 1.36 0 0 0-1.073-.058c-.37.133-.64.397-.8.754a1.351 1.351 0 0 0-.016 1.114Zm4.553-8.37a1.36 1.36 0 0 0-.858-.396A7.552 7.552 0 0 1 8.46 5.62c1.062-.613 2.237-.921 3.537-.921 1.489 0 2.816.398 3.997 1.19 1.19.8 2.07 1.827 2.646 3.088.148.34.394.6.728.76a1.37 1.37 0 0 0 1.068.063c.347-.12.62-.346.799-.668.187-.338.215-.71.072-1.072l-.003-.007-.003-.007c-.784-1.818-2.006-3.298-3.658-4.434C15.982 2.47 14.094 1.9 11.998 1.9c-1.695 0-3.261.385-4.688 1.16a10.536 10.536 0 0 0-2.715 2.096 1.364 1.364 0 0 0-.308-.453 1.38 1.38 0 0 0-.994-.403c-.38 0-.722.135-.992.406s-.403.614-.403.994v3c0 .38.135.724.406.995.27.27.614.405.994.405h3c.384 0 .727-.137.998-.412a1.38 1.38 0 0 0 .402-.993c0-.38-.135-.723-.406-.992ZM9.52 14.48a3.393 3.393 0 0 0 2.478 1.02c.965 0 1.8-.342 2.479-1.02a3.392 3.392 0 0 0 1.021-2.48c0-.963-.343-1.8-1.021-2.478A3.392 3.392 0 0 0 11.998 8.5c-.964 0-1.8.343-2.478 1.021A3.392 3.392 0 0 0 8.498 12c0 .964.344 1.8 1.022 2.479Z\"/></svg>') 12 12,auto}.unreal-container.pan{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><path fill=\"%23000\" d=\"M11.997 10.075a1.01 1.01 0 0 1-.738-.313 1.008 1.008 0 0 1-.312-.737V6.15l-.95.95a.998.998 0 0 1-.763.312 1.09 1.09 0 0 1-.763-.337 1.06 1.06 0 0 1-.324-.775c0-.3.108-.558.324-.775l2.776-2.775c.117-.116.237-.2.362-.25a1.04 1.04 0 0 1 .775 0c.125.05.246.134.363.25l2.8 2.8c.216.217.32.47.313.762a1.096 1.096 0 0 1-.338.763 1.058 1.058 0 0 1-.775.325c-.3 0-.558-.108-.775-.325l-.925-.925v2.875c0 .283-.104.53-.312.737a1.01 1.01 0 0 1-.738.313Zm0 11.5a1.04 1.04 0 0 1-.388-.075 1.103 1.103 0 0 1-.362-.25l-2.8-2.8a1.002 1.002 0 0 1-.313-.762c.009-.292.121-.546.337-.763.217-.217.475-.325.775-.325.3 0 .559.108.775.325l.926.925v-2.875c0-.283.104-.529.312-.737a1.01 1.01 0 0 1 .738-.313c.283 0 .529.104.738.313.208.208.312.454.312.737v2.875l.95-.95a.998.998 0 0 1 .762-.312c.292.008.546.12.763.337.216.217.324.475.324.775 0 .3-.108.559-.324.775l-2.775 2.775c-.117.116-.238.2-.363.25a1.04 1.04 0 0 1-.387.075Zm4.925-6.05a1.058 1.058 0 0 1-.326-.774c0-.3.109-.559.326-.776l.925-.925H14.97c-.283 0-.528-.104-.736-.312a1.01 1.01 0 0 1-.313-.738c0-.283.104-.53.313-.738.208-.208.453-.312.737-.312h2.875l-.95-.95a.998.998 0 0 1-.313-.762 1.09 1.09 0 0 1 .338-.764 1.06 1.06 0 0 1 .775-.324c.3 0 .558.108.775.324l2.774 2.776c.117.117.2.238.251.363a1.04 1.04 0 0 1 0 .775c-.05.124-.134.245-.25.362l-2.8 2.8c-.217.216-.471.32-.762.313a1.096 1.096 0 0 1-.763-.337Zm-11.4 0L2.746 12.75a1.103 1.103 0 0 1-.25-.362 1.04 1.04 0 0 1 0-.775c.05-.125.133-.246.25-.363l2.8-2.8c.216-.216.47-.32.762-.313.292.01.546.121.763.337.217.217.325.476.325.776 0 .3-.108.558-.325.775l-.925.925h2.875c.283 0 .529.104.737.312.208.209.313.455.313.738s-.105.53-.313.738a1.008 1.008 0 0 1-.737.312H6.147l.95.95c.217.217.32.471.312.762a1.09 1.09 0 0 1-.337.764 1.06 1.06 0 0 1-.775.324c-.3 0-.559-.108-.776-.324Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"M9.22 7.912c.436.013.821-.15 1.13-.458l.097-.097v1.668c0 .422.16.793.458 1.09.298.299.67.46 1.092.46.422 0 .793-.161 1.091-.46.298-.297.459-.668.459-1.09V7.357l.071.072c.309.308.693.471 1.13.471.435 0 .82-.163 1.128-.471.301-.303.47-.676.483-1.102v-.001a1.501 1.501 0 0 0-.46-1.13l-2.799-2.8a1.6 1.6 0 0 0-.528-.36l-.003-.001a1.54 1.54 0 0 0-1.145 0l-.002.001a1.6 1.6 0 0 0-.529.36L8.118 5.172l-.001.001a1.56 1.56 0 0 0-.47 1.128c0 .435.163.82.47 1.128.303.303.676.472 1.103.484Zm0 0 .014-.5-.015.5Zm-1.311 6.865a1.497 1.497 0 0 0-.458-1.13l-.097-.097h1.668c.421 0 .793-.16 1.09-.458.298-.299.46-.67.46-1.092a1.51 1.51 0 0 0-.46-1.091 1.507 1.507 0 0 0-1.09-.459H7.354l.071-.072c.309-.308.472-.692.472-1.128 0-.436-.163-.82-.472-1.13a1.596 1.596 0 0 0-1.101-.482h-.002a1.501 1.501 0 0 0-1.129.459l-2.8 2.8a1.6 1.6 0 0 0-.36.528l-.001.003a1.54 1.54 0 0 0 0 1.144v.003c.081.2.208.375.362.529l2.774 2.775c.309.308.693.47 1.129.47.435 0 .82-.162 1.128-.47.303-.302.472-.676.484-1.102Zm0 0-.5-.014.5.015v-.001Zm3.038-8.627-.5.5.5.207V6.15Zm.475 15.814.002.001a1.54 1.54 0 0 0 1.145 0h.002c.2-.081.375-.208.53-.362l2.775-2.774a1.56 1.56 0 0 0 .47-1.129c0-.435-.162-.82-.47-1.128a1.589 1.589 0 0 0-1.103-.484 1.497 1.497 0 0 0-1.13.458l-.096.097v-1.668c0-.421-.161-.793-.459-1.09a1.509 1.509 0 0 0-1.091-.46c-.422 0-.794.161-1.092.46a1.507 1.507 0 0 0-.458 1.09v1.668l-.072-.072a1.558 1.558 0 0 0-1.129-.471c-.436 0-.82.163-1.128.471l-.001.001c-.301.302-.47.675-.483 1.101v.001c-.012.437.151.821.46 1.13l2.8 2.8c.153.153.328.28.528.36Zm5.146-6.085c.303.302.676.47 1.102.484a1.5 1.5 0 0 0 1.13-.46l2.8-2.8a1.6 1.6 0 0 0 .36-.528l.002-.003a1.54 1.54 0 0 0 0-1.144l-.001-.003a1.6 1.6 0 0 0-.361-.529l-2.774-2.775h-.001a1.56 1.56 0 0 0-1.128-.47c-.436 0-.82.162-1.128.47h-.001a1.59 1.59 0 0 0-.484 1.102c-.012.437.15.822.459 1.13l.097.097h-1.668c-.422 0-.793.16-1.09.459-.299.298-.46.67-.46 1.091 0 .422.161.793.46 1.092.297.297.668.458 1.09.458h1.668l-.072.072a1.558 1.558 0 0 0-.472 1.129c0 .435.164.82.472 1.128ZM6.147 13.05l.5.5.207-.5h-.707Z\"/></svg>') 12 12,auto}.unreal-container.dolly{cursor:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"none\"><mask id=\"a\" width=\"24\" height=\"24\" x=\"0\" y=\"0\" maskUnits=\"userSpaceOnUse\" style=\"mask-type:alpha\"><path fill=\"%23127392\" d=\"M0 0h24v24H0z\"/></mask><g mask=\"url(%23a)\"><path fill=\"%23000\" d=\"M12.002 20.575a1.026 1.026 0 0 1-.75-.325l-2.55-2.55a.933.933 0 0 1-.287-.713c.008-.275.113-.513.313-.713.2-.2.441-.3.725-.3.283 0 .524.1.724.3l.776.776V6.95l-.8.8c-.2.2-.438.296-.712.288a1.018 1.018 0 0 1-.713-.312c-.2-.2-.3-.442-.3-.726s.1-.525.3-.725l2.524-2.525a1.026 1.026 0 0 1 1.5 0l2.55 2.55c.2.2.296.438.289.713a1.023 1.023 0 0 1-.314.713c-.2.2-.441.3-.724.3a.988.988 0 0 1-.725-.3l-.775-.776v10.1l.8-.8c.2-.2.437-.296.712-.288.275.008.512.112.712.312.2.2.3.442.3.726s-.1.525-.3.725l-2.524 2.525a1.026 1.026 0 0 1-.75.325Z\"/><path stroke=\"%23fff\" stroke-opacity=\".7\" d=\"M13.553 8.153c.28.245.62.373 1 .373.415 0 .784-.153 1.078-.447.287-.287.446-.644.46-1.05v-.002a1.432 1.432 0 0 0-.435-1.08l-2.55-2.55-.354.353.354-.354a1.526 1.526 0 0 0-2.207 0L8.374 5.921A1.487 1.487 0 0 0 7.928 7c0 .416.152.785.446 1.08.288.287.645.446 1.052.457l4.127-.384Zm0 0v7.693m0-7.693a1.667 1.667 0 0 1-.079-.074l-3.021.075v7.693a1.482 1.482 0 0 0-1-.373c-.416 0-.785.153-1.079.447a1.522 1.522 0 0 0-.46 1.05v.002c-.011.417.14.786.435 1.08l2.55 2.55a1.527 1.527 0 0 0 2.207 0l2.525-2.524c.294-.294.446-.663.446-1.079 0-.416-.152-.785-.446-1.08a1.518 1.518 0 0 0-1.052-.457m0 0-.014.5.014-.5Zm0 0a1.424 1.424 0 0 0-1.027.383m0 0a1.583 1.583 0 0 0-.053.05l.354.354m-.3-.404v.104l.3.3m0 0-.3-.3v.6l.3-.3Z\"/></g></svg>%0A') 12 12,auto}.unreal-container.disabled:before{content:\"\";position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}#playerUI{position:absolute;z-index:10;width:100%}#statsContainer{display:none;text-align:left;background-color:#000c}#stats{padding:6px;font-weight:700;font-size:14px;color:#0f0}canvas{position:absolute;image-rendering:crisp-edges}#overlay{position:absolute;top:0;right:2%;z-index:100;padding:4px;border-top-width:0;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomright:5px;border-bottom-right-radius:5px;-webkit-border-bottom-left-radius:5px;-moz-border-radius-bottomleft:5px;border-bottom-left-radius:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none}.overlay{font-weight:lighter;font-family:var(--src-font-family-body)}#overlayButton:hover{cursor:pointer}#overlayButton{font-size:40px;text-align:right}#overlaySettings{display:none;width:300px;padding:4px}#videoMessageOverlay{position:absolute;z-index:20;width:100%;margin:auto;font-size:1.8em;font-family:var(--src-font-family-body)}#playButton{display:inline-block;height:auto}img#playButton{width:10%;max-width:241px}#UIInteraction{position:fixed}#UIInteractionButtonBoundary{padding:2px}#UIInteractionButton{cursor:pointer}#hiddenInput{position:absolute;left:-10%;width:0;opacity:0}#editTextButton{position:absolute;width:40px;height:40px}\n"] }]
|
|
6269
6251
|
}], ctorParameters: () => [], propDecorators: { isStudio: [{ type: i0.Input, args: [{ isSignal: true, alias: "isStudio", required: false }] }], useContainerAsSizeProvider: [{ type: i0.Input, args: [{ isSignal: true, alias: "useContainerAsSizeProvider", required: false }] }], studioResolutionSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "studioResolutionSize", required: false }] }], videoElement: [{ type: i0.ViewChild, args: ['videoContainer', { isSignal: true }] }], changeMouseOverScene: [{ type: i0.Output, args: ["changeMouseOverScene"] }], onMouseOver: [{
|
|
6270
6252
|
type: HostListener,
|
|
6271
6253
|
args: ['mouseover']
|
|
@@ -6275,40 +6257,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.6", ngImpor
|
|
|
6275
6257
|
}] } });
|
|
6276
6258
|
|
|
6277
6259
|
class WebrtcErrorModalComponent {
|
|
6278
|
-
|
|
6279
|
-
|
|
6260
|
+
constructor() {
|
|
6261
|
+
this.#dialogRef = inject(DialogRef);
|
|
6262
|
+
this.#store = inject(Store);
|
|
6263
|
+
this.isCirrusConnected = inject(Store).selectSignal(unrealFeature.selectCirrusConnected);
|
|
6264
|
+
}
|
|
6265
|
+
#dialogRef;
|
|
6266
|
+
#store;
|
|
6280
6267
|
close() {
|
|
6281
6268
|
this.#dialogRef.close();
|
|
6282
6269
|
}
|
|
6283
6270
|
closeModalWithCirrusDisconnect() {
|
|
6284
|
-
this
|
|
6285
|
-
.
|
|
6286
|
-
|
|
6287
|
-
|
|
6288
|
-
|
|
6289
|
-
|
|
6290
|
-
|
|
6291
|
-
message: 'Modal Drop Connection',
|
|
6292
|
-
}));
|
|
6293
|
-
}
|
|
6294
|
-
this.close();
|
|
6295
|
-
});
|
|
6271
|
+
if (!this.isCirrusConnected()) {
|
|
6272
|
+
this.#store.dispatch(disconnectStream({
|
|
6273
|
+
reason: DisconnectReason.DropConnection,
|
|
6274
|
+
message: 'Modal Drop Connection',
|
|
6275
|
+
}));
|
|
6276
|
+
}
|
|
6277
|
+
this.close();
|
|
6296
6278
|
}
|
|
6297
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
6298
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.
|
|
6279
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WebrtcErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6280
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: WebrtcErrorModalComponent, isStandalone: true, selector: "app-webrtc-error-modal", ngImport: i0, template: "<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\"></header>\n <section class=\"src-modal__body\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n weight=\"primary\"\n >\n Ok\n </src-button>\n </footer>\n</div>\n", styles: [".src-modal{--modalBodyPadding: 20px 8px 20px 20px;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) auto}.src-modal__body{width:100%}.src-modal__body p{color:var(--src-text-body-main, #1f2937);font-size:14px;font-style:normal;font-weight:400;line-height:24px;margin-top:0}.src-modal__body a{word-wrap:break-word;white-space:normal}\n"], dependencies: [{ kind: "component", type: SourceButtonComponent, selector: "src-button", inputs: ["type", "appearance", "weight", "size", "context", "customClass", "isFullWidth", "isPressed", "isDisabled", "isLoading", "isInverted", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6299
6281
|
}
|
|
6300
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
6282
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: WebrtcErrorModalComponent, decorators: [{
|
|
6301
6283
|
type: Component,
|
|
6302
|
-
args: [{ selector: 'app-webrtc-error-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\
|
|
6284
|
+
args: [{ selector: 'app-webrtc-error-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [SourceButtonComponent], template: "<div [attr.data-testid]=\"'webrtc-error-modal'\" class=\"src-modal\">\n <header class=\"src-modal__header\"></header>\n <section class=\"src-modal__body\">\n <div [attr.data-testid]=\"'title'\" class=\"src-modal__title\">\n WebRTC error\n </div>\n <div style=\"text-align: left\">\n An internet connection type (WebRTC) appears to be blocked either by your\n browser settings or your current network. If WebRTC is blocked on your\n browser you may be able to adjust these settings yourself based on\n instructions here:\n <a href=\"https://myownconference.com/blog/en/webrtc/\" target=\"blank\"\n >https://myownconference.com/blog/en/webrtc/</a\n >\n <br /><br />\n Trying a different web browser may help confirm this as well. If WebRTC is\n blocked by your network, try switching to a different network if possible\n or contact your network administrator.<br /><br />\n WebRTC is common, safe and increasingly utilised method for streaming real\n time 3D experiences via a web browser. It typically consumes no more\n bandwidth than streaming an HD video.\n </div>\n </section>\n <footer class=\"src-modal__footer\">\n <src-button\n (onClick)=\"closeModalWithCirrusDisconnect()\"\n [data-testid]=\"'close-webrtc-error-modal'\"\n weight=\"primary\"\n >\n Ok\n </src-button>\n </footer>\n</div>\n", styles: [".src-modal{--modalBodyPadding: 20px 8px 20px 20px;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto minmax(0,1fr) auto}.src-modal__body{width:100%}.src-modal__body p{color:var(--src-text-body-main, #1f2937);font-size:14px;font-style:normal;font-weight:400;line-height:24px;margin-top:0}.src-modal__body a{word-wrap:break-word;white-space:normal}\n"] }]
|
|
6303
6285
|
}] });
|
|
6304
6286
|
|
|
6305
6287
|
class FilterSettingsComponent {
|
|
6306
6288
|
constructor() {
|
|
6307
|
-
this
|
|
6289
|
+
this.#store = inject(Store);
|
|
6308
6290
|
this.storageKey = 'LBMFilterSettings';
|
|
6309
6291
|
this.defaultFilterModel = { ...DefaultFilterModel };
|
|
6310
6292
|
this.settings = { ...DefaultFilterModel };
|
|
6311
6293
|
}
|
|
6294
|
+
#store;
|
|
6312
6295
|
ngOnInit() {
|
|
6313
6296
|
const savedSettings = localStorage.getItem(this.storageKey);
|
|
6314
6297
|
if (savedSettings) {
|
|
@@ -6334,7 +6317,7 @@ class FilterSettingsComponent {
|
|
|
6334
6317
|
}
|
|
6335
6318
|
Object.assign(this.settings, settings);
|
|
6336
6319
|
Object.assign(FilterModel, settings);
|
|
6337
|
-
this
|
|
6320
|
+
this.#store.dispatch(setKalmanSettings({ settings }));
|
|
6338
6321
|
}
|
|
6339
6322
|
reset() {
|
|
6340
6323
|
this.dispatch({
|
|
@@ -6342,12 +6325,12 @@ class FilterSettingsComponent {
|
|
|
6342
6325
|
panelOpen: this.settings.panelOpen,
|
|
6343
6326
|
});
|
|
6344
6327
|
}
|
|
6345
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
6346
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
6328
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FilterSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6329
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: FilterSettingsComponent, isStandalone: true, selector: "app-filter-settings", ngImport: i0, template: "<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">LBM</button>\n @if (settings.panelOpen) {\n <div class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n }\n</div>\n", styles: [".settings-container{position:absolute;top:65px;right:10px;z-index:1000}.gear-button{right:0;width:50px;position:absolute;cursor:pointer;font-size:10px;background:none;font-weight:500;border:1px solid;border-radius:9px;background:#0162cc;color:#fff;padding:4px}.gear-button>*{color:#e6f419;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}.settings-panel{font-size:13px;background:#fff;border:1px solid #ccc;padding:15px;margin-top:25px;border-radius:4px;box-shadow:0 2px 8px #0003}.settings-panel h3{margin-top:0}.settings-panel form{display:flex;flex-direction:column}.settings-panel label{margin-bottom:10px;display:flex;flex-direction:column}.settings-panel input{padding:4px;margin-top:4px;border:1px solid #ccc;border-radius:2px}.apply-button-container{position:absolute;bottom:15px;right:15px}.apply-button-container button{padding:6px 12px;border:none;background-color:#1976d2;color:#fff;border-radius:4px;cursor:pointer;margin:2px}.apply-button-container button:hover{background-color:#1565c0}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6347
6330
|
}
|
|
6348
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
6331
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FilterSettingsComponent, decorators: [{
|
|
6349
6332
|
type: Component,
|
|
6350
|
-
args: [{ selector: 'app-filter-settings', imports: [FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"settings-container\">\
|
|
6333
|
+
args: [{ selector: 'app-filter-settings', imports: [FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"settings-container\">\n <button (click)=\"togglePanel()\" class=\"gear-button\">LBM</button>\n @if (settings.panelOpen) {\n <div class=\"settings-panel\">\n <h3>LBM Trigger Settings</h3>\n <h5>Data Flow Monitor</h5>\n <form>\n <label>\n Monitoring delay:\n <input\n [(ngModel)]=\"settings.monitoringDelayTime\"\n [placeholder]=\"defaultFilterModel.monitoringDelayTime\"\n type=\"number\"\n name=\"monitoringDelayTime\"\n />\n </label>\n\n <label>\n Minimum Bitrate (kbit/s):\n <input\n [(ngModel)]=\"settings.minimumBitrate\"\n [placeholder]=\"defaultFilterModel.minimumBitrate\"\n type=\"number\"\n name=\"minimumBitrate\"\n />\n </label>\n <label>\n Yellow Flag (%):\n <input\n [(ngModel)]=\"settings.yellowFlag\"\n [placeholder]=\"defaultFilterModel.yellowFlag\"\n type=\"number\"\n name=\"yellowFlag\"\n />\n </label>\n <label>\n Red Flag (%):\n <input\n [(ngModel)]=\"settings.redFlag\"\n [placeholder]=\"defaultFilterModel.redFlag\"\n type=\"number\"\n name=\"redFlag\"\n />\n </label>\n <label>\n Minimum FPS:\n <input\n [(ngModel)]=\"settings.minimumFps\"\n [placeholder]=\"defaultFilterModel.minimumFps\"\n type=\"number\"\n name=\"minimumFps\"\n />\n </label>\n <hr />\n <h5>Kalman Filter</h5>\n <label>\n Initial Bitrate Estimate (kbit/s):\n <input\n [(ngModel)]=\"settings.initialBitrateEstimate\"\n [placeholder]=\"defaultFilterModel.initialBitrateEstimate\"\n type=\"number\"\n name=\"initialBitrateEstimate\"\n />\n </label>\n <label>\n Initial Error Covariance:\n <input\n [(ngModel)]=\"settings.initialErrorCovariance\"\n [placeholder]=\"defaultFilterModel.initialErrorCovariance\"\n type=\"number\"\n name=\"initialErrorCovariance\"\n />\n </label>\n <label>\n Process Noise (Q):\n <input\n [(ngModel)]=\"settings.processNoise\"\n [placeholder]=\"defaultFilterModel.processNoise\"\n type=\"number\"\n name=\"processNoise\"\n />\n </label>\n <label>\n Measurement Noise (R):\n <input\n [(ngModel)]=\"settings.measurementNoise\"\n [placeholder]=\"defaultFilterModel.measurementNoise\"\n type=\"number\"\n name=\"measurementNoise\"\n />\n </label>\n </form>\n <br />\n <br />\n <div class=\"apply-button-container\">\n <button (click)=\"reset()\">Reset</button>\n <button (click)=\"saveSettings()\">Apply</button>\n </div>\n </div>\n }\n</div>\n", styles: [".settings-container{position:absolute;top:65px;right:10px;z-index:1000}.gear-button{right:0;width:50px;position:absolute;cursor:pointer;font-size:10px;background:none;font-weight:500;border:1px solid;border-radius:9px;background:#0162cc;color:#fff;padding:4px}.gear-button>*{color:#e6f419;filter:drop-shadow(1px 1px 1px rgb(0,0,0))}.settings-panel{font-size:13px;background:#fff;border:1px solid #ccc;padding:15px;margin-top:25px;border-radius:4px;box-shadow:0 2px 8px #0003}.settings-panel h3{margin-top:0}.settings-panel form{display:flex;flex-direction:column}.settings-panel label{margin-bottom:10px;display:flex;flex-direction:column}.settings-panel input{padding:4px;margin-top:4px;border:1px solid #ccc;border-radius:2px}.apply-button-container{position:absolute;bottom:15px;right:15px}.apply-button-container button{padding:6px 12px;border:none;background-color:#1976d2;color:#fff;border-radius:4px;cursor:pointer;margin:2px}.apply-button-container button:hover{background-color:#1565c0}\n"] }]
|
|
6351
6334
|
}] });
|
|
6352
6335
|
|
|
6353
6336
|
class LowBandwidthDetectorComponent {
|
|
@@ -6450,15 +6433,15 @@ class LowBandwidthDetectorComponent {
|
|
|
6450
6433
|
this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));
|
|
6451
6434
|
});
|
|
6452
6435
|
}
|
|
6453
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
6454
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
6436
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LowBandwidthDetectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6437
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: LowBandwidthDetectorComponent, isStandalone: true, selector: "app-low-bandwidth-detector", ngImport: i0, template: "@if (isReducedQuality() || isLowBandwidth()) {\n <div\n [class.expanded]=\"isIndicatorExpanded() && isLowBandwidth()\"\n class=\"lbm-indicator freeze-loader\"\n >\n <div (click)=\"toggleIndicator(true)\" class=\"lbm-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"#85888E\"\n d=\"M7.189 3.605c-.73.145-1.438.35-2.126.614A14.412 14.412 0 0 0 .896 6.666a1.08 1.08 0 0 0-.375.844c0 .34.118.629.354.865s.524.36.865.375c.34.014.65-.09.927-.313a11.89 11.89 0 0 1 3.385-1.916 10.94 10.94 0 0 1 1.235-.375l-.098-2.541ZM7.385 8.708a9.107 9.107 0 0 0-2.906 1.48c-.264.194-.402.464-.416.812-.014.347.104.646.354.896.236.236.524.364.864.385.34.02.664-.073.97-.281.422-.29.878-.53 1.368-.721a2.545 2.545 0 0 1-.166-.814l-.068-1.757ZM12.386 11.267c.094-.25.15-.52.161-.802l.068-1.755a9.019 9.019 0 0 1 2.927 1.52c.264.193.4.46.406.801.007.34-.114.635-.364.885a1.213 1.213 0 0 1-.865.365A1.614 1.614 0 0 1 13.77 12a6.574 6.574 0 0 0-1.385-.733ZM12.713 6.146l.098-2.542c.73.146 1.438.351 2.127.615 1.541.59 2.93 1.406 4.166 2.447.25.223.379.5.386.834.007.333-.115.625-.365.875a1.253 1.253 0 0 1-.864.375c-.34.014-.65-.09-.927-.313a11.892 11.892 0 0 0-3.386-1.916 10.94 10.94 0 0 0-1.235-.375ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n />\n <path\n fill=\"#fff\"\n fill-rule=\"evenodd\"\n d=\"M10 .833c-.91 0-1.637.756-1.602 1.665l.304 7.92a1.299 1.299 0 0 0 2.596 0l.305-7.92A1.604 1.604 0 0 0 10 .833ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div\n [class.lbm-message--open]=\"isLowBandwidth() && isIndicatorExpanded()\"\n class=\"lbm-message\"\n >\n <p class=\"lbm-description\">\n Fluid Interactivity Modes were disabled due to an unstable connection.\n\n <button\n (click)=\"openLBMDialog()\"\n [attr.data-testid]=\"'learn-more-lbm'\"\n type=\"button\"\n class=\"lbm-learn-more\"\n >\n Learn more\n </button>\n </p>\n <button\n (click)=\"toggleIndicator(false)\"\n [attr.data-testid]=\"'close-lbm-indicator'\"\n type=\"button\"\n class=\"lbm-close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 11.2289L6.68618 14.5428C6.51951 14.7095 6.31818 14.7895 6.08218 14.7828C5.84618 14.7755 5.64485 14.6885 5.47818 14.5218C5.31151 14.3552 5.22818 14.1505 5.22818 13.9078C5.22818 13.6645 5.31151 13.4595 5.47818 13.2928L8.77107 9.99992L5.45718 6.68603C5.29051 6.51936 5.21051 6.3147 5.21718 6.07203C5.22451 5.8287 5.31151 5.6237 5.47818 5.45703C5.64485 5.29036 5.84951 5.20703 6.09218 5.20703C6.33551 5.20703 6.54051 5.29036 6.70718 5.45703L10.0001 8.77092L13.314 5.45703C13.4806 5.29036 13.6853 5.20703 13.928 5.20703C14.1713 5.20703 14.3763 5.29036 14.543 5.45703C14.7096 5.6237 14.793 5.8287 14.793 6.07203C14.793 6.3147 14.7096 6.51936 14.543 6.68603L11.2291 9.99992L14.543 13.3138C14.7096 13.4805 14.793 13.6818 14.793 13.9178C14.793 14.1538 14.7096 14.3552 14.543 14.5218C14.3763 14.6885 14.1713 14.7718 13.928 14.7718C13.6853 14.7718 13.4806 14.6885 13.314 14.5218L10.0001 11.2289Z\"\n fill=\"white\"\n />\n </svg>\n </button>\n </div>\n </div>\n}\n\n@if (isDevMode) {\n <app-filter-settings />\n}\n", styles: [".freeze-loader,.lbm-indicator{--lbmPositionTop: 18px;--lbmPositionLeft: 18px;--lbmPositionRight: 18px;--lbmIndicatorSize: 36px;--lbmIndicatorBorderRadius: 8px;--lbmIndicatorCloseSize: 20px;--lbmPadding: 10px;--lbmTextSize: 13px;--lbmLineHeight: 20px;--lbmTextColor: #ffffff;--lbmBackgroundColor: rgba(17, 24, 39, .7);position:absolute;top:var(--lbmPositionTop);left:var(--lbmPositionLeft);z-index:10;display:flex;justify-content:center;align-items:flex-start;min-width:var(--lbmIndicatorSize);min-height:var(--lbmIndicatorSize);overflow:hidden}.freeze-loader.expanded,.lbm-indicator.expanded{--lbmPositionTop: 8px;--lbmPositionLeft: 8px;--lbmPositionRight: 8px;width:auto;max-width:calc(100% - var(--lbmPositionLeft) - var(--lbmPositionRight));padding:var(--lbmPadding);background:var(--lbmBackgroundColor);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:var(--lbmIndicatorBorderRadius);gap:12px}.freeze-loader .lbm-icon,.lbm-indicator .lbm-icon{display:flex;width:var(--lbmIndicatorSize);height:var(--lbmIndicatorSize);padding:8px;color:#fff;background-color:var(--lbmBackgroundColor);border-radius:50%;flex-shrink:0;cursor:pointer}.freeze-loader .lbm-icon svg,.freeze-loader .lbm-icon img,.lbm-indicator .lbm-icon svg,.lbm-indicator .lbm-icon img{width:100%;height:100%}.freeze-loader .lbm-close,.lbm-indicator .lbm-close{position:absolute;top:0;right:0;width:var(--lbmIndicatorCloseSize);height:var(--lbmIndicatorCloseSize);background-color:transparent;border:none;padding:0;cursor:pointer}.freeze-loader .lbm-message,.lbm-indicator .lbm-message{position:relative;opacity:0;height:0;max-width:0;padding-right:24px;pointer-events:none;visibility:hidden;animation:closeMessage .3s forwards}.freeze-loader .lbm-message--open,.lbm-indicator .lbm-message--open{position:relative;visibility:visible;display:flex;align-items:center;align-self:center;pointer-events:all;gap:12px;max-width:fit-content;height:auto;opacity:1;animation:openMessage .3s forwards}.freeze-loader .lbm-description,.lbm-indicator .lbm-description{margin:0;font-size:var(--lbmTextSize);font-weight:400;line-height:var(--lbmLineHeight);color:var(--lbmTextColor)}.freeze-loader .lbm-learn-more,.lbm-indicator .lbm-learn-more{display:inline-flex;padding:0;font-size:var(--lbmTextSize);font-weight:400;line-height:var(--lbmLineHeight);color:var(--lbmTextColor);text-decoration-line:underline;background-color:transparent;border:none;cursor:pointer}.freeze-loader .lbm-learn-more:hover,.lbm-indicator .lbm-learn-more:hover{text-decoration:none}@keyframes openMessage{0%{opacity:0;max-width:0;height:0}10%{height:auto;max-width:fit-content}to{opacity:1;height:auto;max-width:fit-content}}@keyframes closeMessage{0%{opacity:1;max-width:fit-content}to{opacity:0;max-width:0}}\n"], dependencies: [{ kind: "component", type: FilterSettingsComponent, selector: "app-filter-settings" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6455
6438
|
}
|
|
6456
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
6439
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: LowBandwidthDetectorComponent, decorators: [{
|
|
6457
6440
|
type: Component,
|
|
6458
|
-
args: [{ selector: 'app-low-bandwidth-detector', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FilterSettingsComponent], template: "@if (isReducedQuality() || isLowBandwidth()) {\
|
|
6441
|
+
args: [{ selector: 'app-low-bandwidth-detector', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FilterSettingsComponent], template: "@if (isReducedQuality() || isLowBandwidth()) {\n <div\n [class.expanded]=\"isIndicatorExpanded() && isLowBandwidth()\"\n class=\"lbm-indicator freeze-loader\"\n >\n <div (click)=\"toggleIndicator(true)\" class=\"lbm-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"#85888E\"\n d=\"M7.189 3.605c-.73.145-1.438.35-2.126.614A14.412 14.412 0 0 0 .896 6.666a1.08 1.08 0 0 0-.375.844c0 .34.118.629.354.865s.524.36.865.375c.34.014.65-.09.927-.313a11.89 11.89 0 0 1 3.385-1.916 10.94 10.94 0 0 1 1.235-.375l-.098-2.541ZM7.385 8.708a9.107 9.107 0 0 0-2.906 1.48c-.264.194-.402.464-.416.812-.014.347.104.646.354.896.236.236.524.364.864.385.34.02.664-.073.97-.281.422-.29.878-.53 1.368-.721a2.545 2.545 0 0 1-.166-.814l-.068-1.757ZM12.386 11.267c.094-.25.15-.52.161-.802l.068-1.755a9.019 9.019 0 0 1 2.927 1.52c.264.193.4.46.406.801.007.34-.114.635-.364.885a1.213 1.213 0 0 1-.865.365A1.614 1.614 0 0 1 13.77 12a6.574 6.574 0 0 0-1.385-.733ZM12.713 6.146l.098-2.542c.73.146 1.438.351 2.127.615 1.541.59 2.93 1.406 4.166 2.447.25.223.379.5.386.834.007.333-.115.625-.365.875a1.253 1.253 0 0 1-.864.375c-.34.014-.65-.09-.927-.313a11.892 11.892 0 0 0-3.386-1.916 10.94 10.94 0 0 0-1.235-.375ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n />\n <path\n fill=\"#fff\"\n fill-rule=\"evenodd\"\n d=\"M10 .833c-.91 0-1.637.756-1.602 1.665l.304 7.92a1.299 1.299 0 0 0 2.596 0l.305-7.92A1.604 1.604 0 0 0 10 .833ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div\n [class.lbm-message--open]=\"isLowBandwidth() && isIndicatorExpanded()\"\n class=\"lbm-message\"\n >\n <p class=\"lbm-description\">\n Fluid Interactivity Modes were disabled due to an unstable connection.\n\n <button\n (click)=\"openLBMDialog()\"\n [attr.data-testid]=\"'learn-more-lbm'\"\n type=\"button\"\n class=\"lbm-learn-more\"\n >\n Learn more\n </button>\n </p>\n <button\n (click)=\"toggleIndicator(false)\"\n [attr.data-testid]=\"'close-lbm-indicator'\"\n type=\"button\"\n class=\"lbm-close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 11.2289L6.68618 14.5428C6.51951 14.7095 6.31818 14.7895 6.08218 14.7828C5.84618 14.7755 5.64485 14.6885 5.47818 14.5218C5.31151 14.3552 5.22818 14.1505 5.22818 13.9078C5.22818 13.6645 5.31151 13.4595 5.47818 13.2928L8.77107 9.99992L5.45718 6.68603C5.29051 6.51936 5.21051 6.3147 5.21718 6.07203C5.22451 5.8287 5.31151 5.6237 5.47818 5.45703C5.64485 5.29036 5.84951 5.20703 6.09218 5.20703C6.33551 5.20703 6.54051 5.29036 6.70718 5.45703L10.0001 8.77092L13.314 5.45703C13.4806 5.29036 13.6853 5.20703 13.928 5.20703C14.1713 5.20703 14.3763 5.29036 14.543 5.45703C14.7096 5.6237 14.793 5.8287 14.793 6.07203C14.793 6.3147 14.7096 6.51936 14.543 6.68603L11.2291 9.99992L14.543 13.3138C14.7096 13.4805 14.793 13.6818 14.793 13.9178C14.793 14.1538 14.7096 14.3552 14.543 14.5218C14.3763 14.6885 14.1713 14.7718 13.928 14.7718C13.6853 14.7718 13.4806 14.6885 13.314 14.5218L10.0001 11.2289Z\"\n fill=\"white\"\n />\n </svg>\n </button>\n </div>\n </div>\n}\n\n@if (isDevMode) {\n <app-filter-settings />\n}\n", styles: [".freeze-loader,.lbm-indicator{--lbmPositionTop: 18px;--lbmPositionLeft: 18px;--lbmPositionRight: 18px;--lbmIndicatorSize: 36px;--lbmIndicatorBorderRadius: 8px;--lbmIndicatorCloseSize: 20px;--lbmPadding: 10px;--lbmTextSize: 13px;--lbmLineHeight: 20px;--lbmTextColor: #ffffff;--lbmBackgroundColor: rgba(17, 24, 39, .7);position:absolute;top:var(--lbmPositionTop);left:var(--lbmPositionLeft);z-index:10;display:flex;justify-content:center;align-items:flex-start;min-width:var(--lbmIndicatorSize);min-height:var(--lbmIndicatorSize);overflow:hidden}.freeze-loader.expanded,.lbm-indicator.expanded{--lbmPositionTop: 8px;--lbmPositionLeft: 8px;--lbmPositionRight: 8px;width:auto;max-width:calc(100% - var(--lbmPositionLeft) - var(--lbmPositionRight));padding:var(--lbmPadding);background:var(--lbmBackgroundColor);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:var(--lbmIndicatorBorderRadius);gap:12px}.freeze-loader .lbm-icon,.lbm-indicator .lbm-icon{display:flex;width:var(--lbmIndicatorSize);height:var(--lbmIndicatorSize);padding:8px;color:#fff;background-color:var(--lbmBackgroundColor);border-radius:50%;flex-shrink:0;cursor:pointer}.freeze-loader .lbm-icon svg,.freeze-loader .lbm-icon img,.lbm-indicator .lbm-icon svg,.lbm-indicator .lbm-icon img{width:100%;height:100%}.freeze-loader .lbm-close,.lbm-indicator .lbm-close{position:absolute;top:0;right:0;width:var(--lbmIndicatorCloseSize);height:var(--lbmIndicatorCloseSize);background-color:transparent;border:none;padding:0;cursor:pointer}.freeze-loader .lbm-message,.lbm-indicator .lbm-message{position:relative;opacity:0;height:0;max-width:0;padding-right:24px;pointer-events:none;visibility:hidden;animation:closeMessage .3s forwards}.freeze-loader .lbm-message--open,.lbm-indicator .lbm-message--open{position:relative;visibility:visible;display:flex;align-items:center;align-self:center;pointer-events:all;gap:12px;max-width:fit-content;height:auto;opacity:1;animation:openMessage .3s forwards}.freeze-loader .lbm-description,.lbm-indicator .lbm-description{margin:0;font-size:var(--lbmTextSize);font-weight:400;line-height:var(--lbmLineHeight);color:var(--lbmTextColor)}.freeze-loader .lbm-learn-more,.lbm-indicator .lbm-learn-more{display:inline-flex;padding:0;font-size:var(--lbmTextSize);font-weight:400;line-height:var(--lbmLineHeight);color:var(--lbmTextColor);text-decoration-line:underline;background-color:transparent;border:none;cursor:pointer}.freeze-loader .lbm-learn-more:hover,.lbm-indicator .lbm-learn-more:hover{text-decoration:none}@keyframes openMessage{0%{opacity:0;max-width:0;height:0}10%{height:auto;max-width:fit-content}to{opacity:1;height:auto;max-width:fit-content}}@keyframes closeMessage{0%{opacity:1;max-width:fit-content}to{opacity:0;max-width:0}}\n"] }]
|
|
6459
6442
|
}] });
|
|
6460
6443
|
|
|
6461
|
-
function
|
|
6444
|
+
function provideUnrealModule() {
|
|
6462
6445
|
return makeEnvironmentProviders([
|
|
6463
6446
|
provideState(commandsFeature),
|
|
6464
6447
|
provideState(unrealFeature),
|
|
@@ -6471,69 +6454,22 @@ function provideAngularUnrealModule(config) {
|
|
|
6471
6454
|
FileHandlerService,
|
|
6472
6455
|
AnalyticsService,
|
|
6473
6456
|
UnrealCallbackService,
|
|
6457
|
+
CommandTelemetryService,
|
|
6458
|
+
AggregatorService,
|
|
6459
|
+
FreezeFrameService,
|
|
6460
|
+
UnrealCommunicatorService,
|
|
6461
|
+
AFKService,
|
|
6462
|
+
SignallingService,
|
|
6463
|
+
StreamStatusTelemetryService,
|
|
6464
|
+
FpsMonitorService,
|
|
6474
6465
|
{
|
|
6475
6466
|
provide: WebRtcPlayerService,
|
|
6476
|
-
|
|
6477
|
-
|
|
6478
|
-
|
|
6479
|
-
|
|
6480
|
-
|
|
6481
|
-
|
|
6482
|
-
useClass: config?.playwright || !config?.fpsMonitor
|
|
6483
|
-
? FpsMonitorEmptyService
|
|
6484
|
-
: FpsMonitorService,
|
|
6485
|
-
},
|
|
6486
|
-
{
|
|
6487
|
-
provide: StreamStatusTelemetryService,
|
|
6488
|
-
useClass: config?.playwright
|
|
6489
|
-
? StreamStatusTelemetryPlaywrightService
|
|
6490
|
-
: StreamStatusTelemetryService,
|
|
6491
|
-
},
|
|
6492
|
-
{
|
|
6493
|
-
provide: CommandTelemetryService,
|
|
6494
|
-
useClass: config?.playwright
|
|
6495
|
-
? CommandTelemetryPlaywrightService
|
|
6496
|
-
: CommandTelemetryService,
|
|
6497
|
-
},
|
|
6498
|
-
{
|
|
6499
|
-
provide: AggregatorService,
|
|
6500
|
-
useClass: config?.playwright
|
|
6501
|
-
? AggregatorPlaywrightService
|
|
6502
|
-
: AggregatorService,
|
|
6503
|
-
},
|
|
6504
|
-
{
|
|
6505
|
-
provide: FreezeFrameService,
|
|
6506
|
-
useClass: config?.playwright
|
|
6507
|
-
? FreezeFramePlaywrightService
|
|
6508
|
-
: FreezeFrameService,
|
|
6509
|
-
},
|
|
6510
|
-
{
|
|
6511
|
-
provide: UnrealCommunicatorService,
|
|
6512
|
-
useClass: config?.playwright
|
|
6513
|
-
? UnrealCommunicatorPlaywrightService
|
|
6514
|
-
: UnrealCommunicatorService,
|
|
6515
|
-
},
|
|
6516
|
-
{
|
|
6517
|
-
provide: AFKService,
|
|
6518
|
-
useClass: config?.playwright ? AfkPlaywrightService : AFKService,
|
|
6519
|
-
},
|
|
6520
|
-
{
|
|
6521
|
-
provide: SignallingService,
|
|
6522
|
-
useClass: config?.playwright
|
|
6523
|
-
? SignallingPlaywrightService
|
|
6524
|
-
: SignallingService,
|
|
6525
|
-
},
|
|
6526
|
-
{
|
|
6527
|
-
provide: ConsoleExtensionsService,
|
|
6528
|
-
useClass: config?.playwright
|
|
6529
|
-
? ConsoleExtensionsPlaywrightService
|
|
6530
|
-
: ConsoleExtensionsService,
|
|
6531
|
-
},
|
|
6532
|
-
{
|
|
6533
|
-
provide: FileReceiverService,
|
|
6534
|
-
useClass: config?.playwright
|
|
6535
|
-
? FileReceiverPlaywrightService
|
|
6536
|
-
: FileReceiverService,
|
|
6467
|
+
useFactory: () => {
|
|
6468
|
+
const config = inject(UNREAL_CONFIG, { optional: true });
|
|
6469
|
+
return config?.newWebRtcConnector
|
|
6470
|
+
? new WebRtcPlayerService2()
|
|
6471
|
+
: new WebRtcPlayerService();
|
|
6472
|
+
},
|
|
6537
6473
|
},
|
|
6538
6474
|
provideEnvironmentInitializer(() => {
|
|
6539
6475
|
inject(AggregatorService);
|
|
@@ -6552,5 +6488,5 @@ function provideAngularUnrealModule(config) {
|
|
|
6552
6488
|
* Generated bundle index. Do not edit.
|
|
6553
6489
|
*/
|
|
6554
6490
|
|
|
6555
|
-
export { AFKService,
|
|
6491
|
+
export { AFKService, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, CommandTelemetryService, CommandsEffects, ConfigHandler, ConsoleExtensionsService, ControlScheme, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DEFAULT_RECONNECT_DELAY_MS, DEFAULT_RECONNECT_ENABLED, DEFAULT_RECONNECT_MAX_ATTEMPTS, DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE, DEFAULT_RECONNECT_ON_ICE_FAILURE, DataFlowMonitor, DevModeService, DisconnectReason, FULL_HD_HEIGHT, FULL_HD_WIDTH, FileHandlerService, FileReceiverService, FilterSettingsComponent, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, KalmanFilter1D, LatencyTimings, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MessageType, MouseButton, MouseButtonsMask, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PingHandler, PlayerCountHandler, RegionsPingService, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryService, 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_TIMEOUT, WebRtcPlayerService, WebRtcPlayerService2, WebrtcErrorModalComponent, abortEstablishingConnection, changeLowBandwidth, changeStatusMainVideoOnScene, changeStreamResolutionAction, changeStreamResolutionSuccessAction, commandCompleted, commandStarted, commandsFeature, commandsReducer, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, dropDC, dropPC, floatToSmoothPercents, forceResizeViewport, fromResizeObserver, getActiveUrl, getImageFromVideoStream, getResizeStudioValues, getResizeStudioValuesOld, getResizeValuesUniversal, getResizeValuesUniversalOld, getRtcErrorMessage, iceConnectionFailed, initSignalling, keepMaxUntilReset, makeEven, provideUnrealModule, qpToQuality, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, resetAfk, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetWarnTimeout, saveAnalyticsEvent, selectClientAndViewIds, selectCommandProgress, selectCommandsInProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsLoaderScreenVisible, selectIsVideoPlayingAndDataChannelConnected, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectWarnTimeout, setAfkTimerCountdown, setAfkTimerHide, setAfkTimerVisible, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setDataChannelConnected, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setKalmanSettings, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setOrchestrationContext, setOrchestrationMessage, setOrchestrationParameters, setOrchestrationProgress, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealPlaywrightConfig, setViewportNotReady, setViewportReady, showUnrealErrorMessage, smoothTransition, startStream, trackMixpanelEvent, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
|
|
6556
6492
|
//# sourceMappingURL=3dsource-angular-unreal-module.mjs.map
|