@3dsource/angular-unreal-module 0.0.99 → 0.0.101-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { InjectionToken, inject, ChangeDetectionStrategy, Component, Injectable, signal, Pipe, input, ElementRef, viewChild, effect, afterNextRender, HostListener, DestroyRef, computed, untracked, output, makeEnvironmentProviders, provideEnvironmentInitializer } from '@angular/core';
|
|
3
3
|
import { SourceButtonComponent, SourceLoadingComponent } from '@3dsource/source-ui-native';
|
|
4
|
-
import { map as map$1,
|
|
5
|
-
import { Logger,
|
|
6
|
-
import { merge, map, scan,
|
|
7
|
-
import { createAction, props, createReducer, on, createFeature,
|
|
8
|
-
import { concatLatestFrom } from '@ngrx/operators';
|
|
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
|
+
import { Logger, calculateMedian, clampf, lerp, getCanvasCached, getSnapshot, whereNot, Truthy, Falsy, tapLog, generateUuid, COLOR_CODES, where, KeyboardNumericCode, InvertedKeyMap, Semaphore, HEXtoRGB, RGBtoHSV, inverseLerp, HSVtoRGB, RGBtoHEX, fpIsASameAsB, fitIntoRectangle } from '@3dsource/utils';
|
|
6
|
+
import { merge, map, scan, concatMap, of, animationFrameScheduler, interval, Observable, debounceTime, switchMap, take, fromEvent, EMPTY, timer, timeout, mergeMap, skip, share, Subject, 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
|
+
import { createAction, props, createReducer, on, createFeature, createSelector, Store, provideState } from '@ngrx/store';
|
|
9
8
|
import { Actions, createEffect, ofType, provideEffects } from '@ngrx/effects';
|
|
9
|
+
import { concatLatestFrom } from '@ngrx/operators';
|
|
10
10
|
import { DialogRef, DIALOG_DATA, Dialog } from '@angular/cdk/dialog';
|
|
11
11
|
import { HttpClient } from '@angular/common/http';
|
|
12
12
|
import { ScrollStrategyOptions } from '@angular/cdk/overlay';
|
|
13
13
|
import { MetaBoxCommand } from '@3dsource/types-unreal';
|
|
14
14
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
15
|
-
import { NgOptimizedImage, JsonPipe } from '@angular/common';
|
|
15
|
+
import { NgOptimizedImage, AsyncPipe, JsonPipe } from '@angular/common';
|
|
16
16
|
import { toSignal, takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
17
17
|
import * as i1 from '@angular/forms';
|
|
18
18
|
import { FormsModule } from '@angular/forms';
|
|
@@ -143,6 +143,11 @@ const UnrealStatusMessage = {
|
|
|
143
143
|
STARTING_YOUR_SESSION: 'Starting your session',
|
|
144
144
|
};
|
|
145
145
|
|
|
146
|
+
const scoped$1 = (templateString) => `[UNREAL COMMANDS] ${templateString[0]}`;
|
|
147
|
+
const unrealCommandCallback = createAction(scoped$1 `unreal command callback`, props());
|
|
148
|
+
const commandStarted = createAction(scoped$1 `command started`, props());
|
|
149
|
+
const commandCompleted = createAction(scoped$1 `command completed`, props());
|
|
150
|
+
|
|
146
151
|
const scoped = (templateString) => `[UNREAL] ${templateString[0]}`;
|
|
147
152
|
const trackMixpanelEvent = createAction(scoped `track mixpanel event`, props());
|
|
148
153
|
const changeLowBandwidth = createAction(scoped `change low bandwidth`, props());
|
|
@@ -183,8 +188,6 @@ const setOrchestrationMessage = createAction(scoped `set orchestration message`,
|
|
|
183
188
|
const setOrchestrationProgress = createAction(scoped `set orchestration progress`, props());
|
|
184
189
|
const setOrchestrationContext = createAction(scoped `set orchestration params`, props());
|
|
185
190
|
const updateCirrusInfo = createAction(scoped `set unrealInfo`, props());
|
|
186
|
-
const commandStarted = createAction(scoped `command started`, props());
|
|
187
|
-
const commandCompleted = createAction(scoped `command completed`, props());
|
|
188
191
|
const setLoopBackCommandIsCompleted = createAction(scoped `set loopBack command is completed`);
|
|
189
192
|
const setAfkTimerVisible = createAction(scoped `set afk timer visible`);
|
|
190
193
|
const setAfkTimerHide = createAction(scoped `set afk timer hide`);
|
|
@@ -197,7 +200,7 @@ const initSignalling = createAction(scoped `init signalling`, (data = {
|
|
|
197
200
|
}));
|
|
198
201
|
const startStream = createAction(scoped `startStream`, props());
|
|
199
202
|
const resetConfig = createAction(scoped `reset config`);
|
|
200
|
-
const
|
|
203
|
+
const resetAfk = createAction(scoped `reset afk action`);
|
|
201
204
|
const resetWarnTimeout = createAction(scoped `reset config warn timeout`);
|
|
202
205
|
const abortEstablishingConnection = createAction(scoped `abortEstablishingConnection`);
|
|
203
206
|
const setUnrealPlaywrightConfig = createAction(scoped `set unreal playwright config`);
|
|
@@ -212,6 +215,12 @@ const reconnectPeerSuccess = createAction(scoped `reconnect peer success`);
|
|
|
212
215
|
const reconnectPeerFailed = createAction(scoped `reconnect peer failed`, props());
|
|
213
216
|
/** Action dispatched when ICE connection state changes to failed/disconnected */
|
|
214
217
|
const iceConnectionFailed = createAction(scoped `ice connection failed`, props());
|
|
218
|
+
const forceResizeViewport = createAction(scoped `force resize viewport`);
|
|
219
|
+
const videoAdaptedToContainer = createAction(scoped `video adapted to container`);
|
|
220
|
+
const videoStreamInitialized = createAction(scoped `video stream initialized`);
|
|
221
|
+
const setKalmanSettings = createAction(scoped `set kalman settings`, props());
|
|
222
|
+
const dropDC = createAction(scoped `drop data channel`);
|
|
223
|
+
const dropPC = createAction(scoped `drop peer connection`);
|
|
215
224
|
|
|
216
225
|
const WSCloseCode_NORMAL_CLOSURE = 3000;
|
|
217
226
|
const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;
|
|
@@ -276,15 +285,246 @@ const OrchestrationMessageTypes = {
|
|
|
276
285
|
interruptClientStream: 'interruptClientStream',
|
|
277
286
|
};
|
|
278
287
|
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
288
|
+
const initialState$1 = {
|
|
289
|
+
streamRequestContext: null,
|
|
290
|
+
environmentId: null,
|
|
291
|
+
lowBandwidthStats: undefined,
|
|
292
|
+
wasInitialized: false,
|
|
293
|
+
isFirstSuccessLoad: false,
|
|
294
|
+
isAfkTimerVisible: false,
|
|
295
|
+
afkCountdown: 0,
|
|
296
|
+
lowBandwidth: false,
|
|
297
|
+
cirrusConnected: false,
|
|
298
|
+
establishingConnection: false,
|
|
299
|
+
isReconnecting: false,
|
|
300
|
+
viewportReady: false,
|
|
301
|
+
dataChannelConnected: false,
|
|
302
|
+
isVideoPlaying: false,
|
|
303
|
+
statusPercentSignallingServer: null,
|
|
304
|
+
statusMessage: null,
|
|
305
|
+
errorMessage: null,
|
|
306
|
+
ssInfo: null,
|
|
307
|
+
ssData: null,
|
|
308
|
+
streamResolution: { width: null, height: null },
|
|
309
|
+
freezeFrameFromVideo: { dataUrl: null, progress: null },
|
|
310
|
+
freezeFrame: { dataUrl: null, progress: null },
|
|
311
|
+
disconnectReason: DisconnectReason.None,
|
|
312
|
+
awsInstance: {
|
|
313
|
+
wsUrl: null,
|
|
314
|
+
instanceName: null,
|
|
315
|
+
pollingUrl: null,
|
|
316
|
+
progressComplete: 0,
|
|
317
|
+
},
|
|
318
|
+
streamConfig: {
|
|
319
|
+
autoStart: true,
|
|
320
|
+
warnTimeout: DEFAULT_AFK_TIMEOUT,
|
|
321
|
+
},
|
|
322
|
+
matchUrls: [],
|
|
323
|
+
streamClientCompanyId: '',
|
|
324
|
+
streamViewId: 'default',
|
|
325
|
+
videoIntroSrc: null,
|
|
326
|
+
imageIntroSrc: null,
|
|
327
|
+
imageLoadingSrc: '',
|
|
328
|
+
analyticsEvent: null,
|
|
287
329
|
};
|
|
330
|
+
const unrealReducer = createReducer(initialState$1, on(changeLowBandwidth, (state, { lowBandwidth, stats }) => ({
|
|
331
|
+
...state,
|
|
332
|
+
lowBandwidth: lowBandwidth,
|
|
333
|
+
lowBandwidthStats: lowBandwidth ? stats : undefined,
|
|
334
|
+
})), on(changeStatusMainVideoOnScene, (state, { isVideoPlaying }) => {
|
|
335
|
+
return { ...state, isVideoPlaying: isVideoPlaying };
|
|
336
|
+
}), on(setAwsInstance, (state, { instanceName, wsUrl, pollingUrl }) => {
|
|
337
|
+
return { ...state, awsInstance: { instanceName, wsUrl, pollingUrl } };
|
|
338
|
+
}), on(setViewportReady, (state) => {
|
|
339
|
+
return {
|
|
340
|
+
...state,
|
|
341
|
+
viewportReady: true,
|
|
342
|
+
statusMessage: null,
|
|
343
|
+
errorMessage: null,
|
|
344
|
+
};
|
|
345
|
+
}), on(setViewportNotReady, (state) => {
|
|
346
|
+
return { ...state, viewportReady: false };
|
|
347
|
+
}), on(updateCirrusInfo, (state, { ssInfo, ssData }) => {
|
|
348
|
+
return {
|
|
349
|
+
...state,
|
|
350
|
+
ssInfo: ssInfo, // For back compatibility
|
|
351
|
+
ssData: ssData, // Contains all the data from the ssInfo as an object
|
|
352
|
+
};
|
|
353
|
+
}), on(changeStreamResolutionSuccessAction, (state, { width, height }) => {
|
|
354
|
+
return { ...state, streamResolution: { width: width, height: height } };
|
|
355
|
+
}), on(setFreezeFrame, (state, freezeFrame) => {
|
|
356
|
+
return {
|
|
357
|
+
...state,
|
|
358
|
+
freezeFrame: {
|
|
359
|
+
dataUrl: freezeFrame.progress === 0 ||
|
|
360
|
+
freezeFrame.progress === 1 ||
|
|
361
|
+
freezeFrame.progress === null
|
|
362
|
+
? freezeFrame.dataUrl
|
|
363
|
+
: state.freezeFrame.dataUrl,
|
|
364
|
+
progress: freezeFrame.progress || null,
|
|
365
|
+
},
|
|
366
|
+
};
|
|
367
|
+
}), on(disconnectStream, (state, errorMessage) => {
|
|
368
|
+
if (state.dataChannelConnected ||
|
|
369
|
+
state.disconnectReason === DisconnectReason.Destroy) {
|
|
370
|
+
return state;
|
|
371
|
+
}
|
|
372
|
+
return {
|
|
373
|
+
...state,
|
|
374
|
+
errorMessage,
|
|
375
|
+
statusMessage: null,
|
|
376
|
+
wasInitialized: true,
|
|
377
|
+
};
|
|
378
|
+
}), on(setFreezeFrameFromVideo, (state, freezeFrameFromVideo) => {
|
|
379
|
+
return {
|
|
380
|
+
...state,
|
|
381
|
+
freezeFrameFromVideo: {
|
|
382
|
+
dataUrl: freezeFrameFromVideo.dataUrl,
|
|
383
|
+
progress: freezeFrameFromVideo.progress || null,
|
|
384
|
+
},
|
|
385
|
+
};
|
|
386
|
+
}), on(setStatusMessage, (state, { statusMessage }) => {
|
|
387
|
+
return { ...state, statusMessage };
|
|
388
|
+
}), on(setEstablishingConnection, (state, { value }) => {
|
|
389
|
+
return { ...state, establishingConnection: value };
|
|
390
|
+
}), on(setStatusPercentSignallingServer, (state, { percent }) => {
|
|
391
|
+
return { ...state, statusPercentSignallingServer: percent };
|
|
392
|
+
}), on(dataChannelConnected, (state, { statusMessage }) => {
|
|
393
|
+
return {
|
|
394
|
+
...state,
|
|
395
|
+
statusMessage,
|
|
396
|
+
dataChannelConnected: true,
|
|
397
|
+
establishingConnection: false,
|
|
398
|
+
wasInitialized: true,
|
|
399
|
+
};
|
|
400
|
+
}), on(setConfig, startStream, (state, { config }) => {
|
|
401
|
+
return { ...state, streamConfig: { ...state.streamConfig, ...config } };
|
|
402
|
+
}), on(resetConfig, (state) => {
|
|
403
|
+
return { ...state, streamConfig: initialState$1.streamConfig };
|
|
404
|
+
}), on(resetWarnTimeout, (state) => {
|
|
405
|
+
return {
|
|
406
|
+
...state,
|
|
407
|
+
streamConfig: { ...state.streamConfig, warnTimeout: DEFAULT_AFK_TIMEOUT },
|
|
408
|
+
};
|
|
409
|
+
}), on(initSignalling, (state, { resetDisconnectionReason = true }) => {
|
|
410
|
+
return {
|
|
411
|
+
...state,
|
|
412
|
+
disconnectReason: resetDisconnectionReason
|
|
413
|
+
? DisconnectReason.None
|
|
414
|
+
: state.disconnectReason,
|
|
415
|
+
};
|
|
416
|
+
}), on(destroyRemoteConnections, (state, { reason }) => {
|
|
417
|
+
if (state.disconnectReason === DisconnectReason.Destroy) {
|
|
418
|
+
return state;
|
|
419
|
+
}
|
|
420
|
+
return { ...state, disconnectReason: reason };
|
|
421
|
+
}), on(reconnectPeerSuccess, (state) => {
|
|
422
|
+
return { ...state, isReconnecting: false };
|
|
423
|
+
}), on(setSignalingName, (state, { instanceName }) => {
|
|
424
|
+
return { ...state, awsInstance: { ...state.awsInstance, instanceName } };
|
|
425
|
+
}), on(setOrchestrationParameters, (state, { instanceName, streamRequestId, eta }) => {
|
|
426
|
+
return {
|
|
427
|
+
...state,
|
|
428
|
+
awsInstance: {
|
|
429
|
+
...state.awsInstance,
|
|
430
|
+
message: undefined,
|
|
431
|
+
instanceName,
|
|
432
|
+
streamRequestId,
|
|
433
|
+
eta,
|
|
434
|
+
},
|
|
435
|
+
};
|
|
436
|
+
}), on(setOrchestrationProgress, (state, { progressComplete }) => {
|
|
437
|
+
return {
|
|
438
|
+
...state,
|
|
439
|
+
awsInstance: {
|
|
440
|
+
...state.awsInstance,
|
|
441
|
+
progressComplete,
|
|
442
|
+
},
|
|
443
|
+
};
|
|
444
|
+
}), on(setOrchestrationMessage, (state, { message }) => {
|
|
445
|
+
return {
|
|
446
|
+
...state,
|
|
447
|
+
awsInstance: {
|
|
448
|
+
...state.awsInstance,
|
|
449
|
+
message,
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
}), on(setLoopBackCommandIsCompleted, (state) => {
|
|
453
|
+
return { ...state, isFirstSuccessLoad: true };
|
|
454
|
+
}), on(setAfkTimerCountdown, (state, { countdown }) => {
|
|
455
|
+
return { ...state, afkCountdown: countdown };
|
|
456
|
+
}), on(setAfkTimerVisible, (state) => {
|
|
457
|
+
return { ...state, isAfkTimerVisible: true };
|
|
458
|
+
}), on(setAfkTimerHide, (state) => {
|
|
459
|
+
return { ...state, isAfkTimerVisible: false, afkCountdown: 0 };
|
|
460
|
+
}), on(setOrchestrationContext, (state, { urls, environmentId, streamRequestContext }) => {
|
|
461
|
+
return {
|
|
462
|
+
...state,
|
|
463
|
+
matchUrls: urls,
|
|
464
|
+
environmentId,
|
|
465
|
+
streamRequestContext,
|
|
466
|
+
};
|
|
467
|
+
}), on(setStreamClientCompanyId, (state, { id }) => {
|
|
468
|
+
return { ...state, streamClientCompanyId: id };
|
|
469
|
+
}), on(setStreamViewId, (state, { id }) => {
|
|
470
|
+
return { ...state, streamViewId: id };
|
|
471
|
+
}), on(setIntroImageSrc, (state, { src }) => {
|
|
472
|
+
return { ...state, imageIntroSrc: src };
|
|
473
|
+
}), on(setLoadingImageSrc, (state, { src }) => {
|
|
474
|
+
return { ...state, imageLoadingSrc: src };
|
|
475
|
+
}), on(setIntroVideoSrc, (state, { src }) => {
|
|
476
|
+
return { ...state, videoIntroSrc: src };
|
|
477
|
+
}), on(resetIntroSrc, (state) => {
|
|
478
|
+
return { ...state, imageIntroSrc: '', videoIntroSrc: '' };
|
|
479
|
+
}), on(saveAnalyticsEvent, (state, { event }) => {
|
|
480
|
+
return { ...state, analyticsEvent: event };
|
|
481
|
+
}), on(setCirrusConnected, (state) => {
|
|
482
|
+
return { ...state, cirrusConnected: true };
|
|
483
|
+
}), on(setCirrusDisconnected, (state) => {
|
|
484
|
+
return {
|
|
485
|
+
...initialState$1,
|
|
486
|
+
establishingConnection: state.establishingConnection,
|
|
487
|
+
disconnectReason: state.disconnectReason,
|
|
488
|
+
wasInitialized: state.wasInitialized,
|
|
489
|
+
isFirstSuccessLoad: state.isFirstSuccessLoad,
|
|
490
|
+
matchUrls: state.matchUrls,
|
|
491
|
+
streamClientCompanyId: state.streamClientCompanyId,
|
|
492
|
+
streamViewId: state.streamViewId,
|
|
493
|
+
imageIntroSrc: state.imageIntroSrc,
|
|
494
|
+
videoIntroSrc: state.videoIntroSrc,
|
|
495
|
+
imageLoadingSrc: state.imageLoadingSrc,
|
|
496
|
+
environmentId: state.environmentId,
|
|
497
|
+
streamRequestContext: state.streamRequestContext,
|
|
498
|
+
streamConfig: state.streamConfig,
|
|
499
|
+
};
|
|
500
|
+
}), on(dropConnection, (state) => {
|
|
501
|
+
return { ...state, establishingConnection: false };
|
|
502
|
+
}), on(resetDataChannelForReconnect, (state) => {
|
|
503
|
+
return {
|
|
504
|
+
...state,
|
|
505
|
+
isReconnecting: true,
|
|
506
|
+
dataChannelConnected: false,
|
|
507
|
+
viewportReady: false,
|
|
508
|
+
statusMessage: 'Reconnecting...',
|
|
509
|
+
};
|
|
510
|
+
}), on(setUnrealPlaywrightConfig, (state) => {
|
|
511
|
+
return {
|
|
512
|
+
...state,
|
|
513
|
+
wasInitialized: true,
|
|
514
|
+
isFirstSuccessLoad: true,
|
|
515
|
+
cirrusConnected: true,
|
|
516
|
+
viewportReady: true,
|
|
517
|
+
dataChannelConnected: true,
|
|
518
|
+
isVideoPlaying: true,
|
|
519
|
+
};
|
|
520
|
+
}), on(destroyUnrealScene, () => {
|
|
521
|
+
return initialState$1;
|
|
522
|
+
}));
|
|
523
|
+
|
|
524
|
+
const unrealFeature = createFeature({
|
|
525
|
+
name: 'unrealFeature',
|
|
526
|
+
reducer: unrealReducer,
|
|
527
|
+
});
|
|
288
528
|
|
|
289
529
|
function AnswerHandler(msg) {
|
|
290
530
|
this.onWebRtcAnswer$.next(msg);
|
|
@@ -380,25 +620,6 @@ const keepMaxUntilReset = (reset$) => {
|
|
|
380
620
|
return (source$) => merge(source$.pipe(map((value) => ({ type: 'value', value }))), reset$.pipe(map(() => ({ type: 'reset' })))).pipe(scan((max, evt) => (evt.type === 'reset' ? 0 : Math.max(max, evt.value)), 0));
|
|
381
621
|
};
|
|
382
622
|
|
|
383
|
-
function observeCommandResponse(data, sender, timeOut = 60000, dispatchOnTimeout = true) {
|
|
384
|
-
const correlationId = generateUuid();
|
|
385
|
-
const out = { ...data, correlationId };
|
|
386
|
-
const observable = fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(map$1(({ json }) => {
|
|
387
|
-
// Some callbacks do not have commandCallback wrapper,
|
|
388
|
-
// so first we check if it exists,
|
|
389
|
-
// then fallback to JSON itself
|
|
390
|
-
return 'commandCallback' in json
|
|
391
|
-
? { json }
|
|
392
|
-
: { json: { commandCallback: json } };
|
|
393
|
-
}), filter(({ json }) => {
|
|
394
|
-
return json.commandCallback.correlationId === correlationId;
|
|
395
|
-
}), timeout(timeOut), catchError(() => dispatchOnTimeout
|
|
396
|
-
? of({ json: { commandCallback: { correlationId: 'timeout' } } })
|
|
397
|
-
: of(null)), take(1), tapLog('Command Response Observer'), filter(Truthy));
|
|
398
|
-
setTimeout(() => sender(out), 0);
|
|
399
|
-
return observable;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
623
|
function decodeData(anyData) {
|
|
403
624
|
try {
|
|
404
625
|
return new TextDecoder('utf-16').decode(anyData);
|
|
@@ -489,48 +710,9 @@ class DataFlowMonitor {
|
|
|
489
710
|
}
|
|
490
711
|
}
|
|
491
712
|
|
|
492
|
-
/**
|
|
493
|
-
* UnrealInternalSignalEvents commands list wrapper listener
|
|
494
|
-
* @param event
|
|
495
|
-
*/
|
|
496
|
-
function fromSignal(event) {
|
|
497
|
-
return Signal.on(event).pipe(
|
|
498
|
-
//tapLog('fromSignal', event), // <== for debugging, do not remove
|
|
499
|
-
map$1((data) => data && typeof data === 'object' && 'detail' in data ? data.detail : ''));
|
|
500
|
-
}
|
|
501
|
-
/**
|
|
502
|
-
* UnrealInternalSignalEvents commands list wrapper sender
|
|
503
|
-
* @param event
|
|
504
|
-
* @param args
|
|
505
|
-
*/
|
|
506
|
-
function sendSignal(event, ...args) {
|
|
507
|
-
Signal.broadcast(event, { detail: args?.[0] || null });
|
|
508
|
-
}
|
|
509
|
-
function fromUnrealCallBackSignal(command) {
|
|
510
|
-
return fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(map$1((data) => data?.json), map$1((json) => {
|
|
511
|
-
if ('commandCallback' in json) {
|
|
512
|
-
return json?.commandCallback;
|
|
513
|
-
}
|
|
514
|
-
return json;
|
|
515
|
-
}), filter((json) => json.command === command), map$1((data) => data), map$1((data) => {
|
|
516
|
-
if ('payload' in data) {
|
|
517
|
-
return {
|
|
518
|
-
command: data.command,
|
|
519
|
-
payload: data?.payload,
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
return {
|
|
523
|
-
command: data.command,
|
|
524
|
-
};
|
|
525
|
-
}));
|
|
526
|
-
}
|
|
527
|
-
|
|
528
713
|
const dispatchResize = () => {
|
|
529
714
|
window.dispatchEvent(new Event('resize'));
|
|
530
715
|
};
|
|
531
|
-
const forceResizeUnrealVideo = () => {
|
|
532
|
-
sendSignal(UnrealInternalSignalEvents.ForceResizeViewport);
|
|
533
|
-
};
|
|
534
716
|
|
|
535
717
|
const errorCodes = {
|
|
536
718
|
code404: 'Your asset is being synced on Metabox servers and is not yet available in Metabox Studio or Metabox Configurator. Please check again later after syncing is complete. ',
|
|
@@ -706,6 +888,14 @@ function qpToQuality(VideoEncoderQP) {
|
|
|
706
888
|
return quality;
|
|
707
889
|
}
|
|
708
890
|
|
|
891
|
+
function fromResizeObserver(elem) {
|
|
892
|
+
return new Observable((subscriber) => {
|
|
893
|
+
const observer = new window.ResizeObserver((entries) => subscriber.next(entries));
|
|
894
|
+
observer.observe(elem);
|
|
895
|
+
return () => observer.unobserve(elem);
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
|
|
709
899
|
const removeExileCommands = (state, idToRemove) => {
|
|
710
900
|
const exileTimeout = 10000;
|
|
711
901
|
const out = { ...state };
|
|
@@ -718,285 +908,99 @@ const removeExileCommands = (state, idToRemove) => {
|
|
|
718
908
|
markForDelete.push(id);
|
|
719
909
|
}
|
|
720
910
|
});
|
|
721
|
-
out.totalCommandsCompleted += markForDelete.length;
|
|
722
|
-
out.commandsInProgress = out.commandsInProgress.filter((command) => !markForDelete.includes(command.id));
|
|
723
|
-
return out;
|
|
724
|
-
};
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
return new Observable((subscriber) => {
|
|
732
|
-
const observer = new window.ResizeObserver((entries) => subscriber.next(entries));
|
|
733
|
-
observer.observe(elem);
|
|
734
|
-
return () => observer.unobserve(elem);
|
|
735
|
-
});
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
const initialState = {
|
|
739
|
-
streamRequestContext: null,
|
|
740
|
-
environmentId: null,
|
|
741
|
-
lowBandwidthStats: undefined,
|
|
742
|
-
wasInitialized: false,
|
|
743
|
-
isFirstSuccessLoad: false,
|
|
744
|
-
isAfkTimerVisible: false,
|
|
745
|
-
afkCountdown: 0,
|
|
746
|
-
lowBandwidth: false,
|
|
747
|
-
cirrusConnected: false,
|
|
748
|
-
establishingConnection: false,
|
|
749
|
-
isReconnecting: false,
|
|
750
|
-
viewportReady: false,
|
|
751
|
-
dataChannelConnected: false,
|
|
752
|
-
isVideoPlaying: false,
|
|
753
|
-
statusPercentSignallingServer: null,
|
|
754
|
-
statusMessage: null,
|
|
755
|
-
errorMessage: null,
|
|
756
|
-
ssInfo: null,
|
|
757
|
-
ssData: null,
|
|
758
|
-
streamResolution: { width: null, height: null },
|
|
759
|
-
freezeFrameFromVideo: { dataUrl: null, progress: null },
|
|
760
|
-
freezeFrame: { dataUrl: null, progress: null },
|
|
761
|
-
disconnectReason: DisconnectReason.None,
|
|
762
|
-
awsInstance: {
|
|
763
|
-
wsUrl: null,
|
|
764
|
-
instanceName: null,
|
|
765
|
-
pollingUrl: null,
|
|
766
|
-
progressComplete: 0,
|
|
767
|
-
},
|
|
768
|
-
streamConfig: {
|
|
769
|
-
autoStart: true,
|
|
770
|
-
warnTimeout: DEFAULT_AFK_TIMEOUT,
|
|
771
|
-
},
|
|
772
|
-
loaderCommands: {
|
|
773
|
-
commandsInProgress: [],
|
|
774
|
-
totalCommandsStarted: 0,
|
|
775
|
-
totalCommandsCompleted: 0,
|
|
776
|
-
},
|
|
777
|
-
matchUrls: [],
|
|
778
|
-
streamClientCompanyId: '',
|
|
779
|
-
streamViewId: 'default',
|
|
780
|
-
videoIntroSrc: null,
|
|
781
|
-
imageIntroSrc: null,
|
|
782
|
-
imageLoadingSrc: '',
|
|
783
|
-
analyticsEvent: null,
|
|
784
|
-
};
|
|
785
|
-
const unrealReducer = createReducer(initialState, on(changeLowBandwidth, (state, { lowBandwidth, stats }) => ({
|
|
786
|
-
...state,
|
|
787
|
-
lowBandwidth: lowBandwidth,
|
|
788
|
-
lowBandwidthStats: lowBandwidth ? stats : undefined,
|
|
789
|
-
})), on(changeStatusMainVideoOnScene, (state, { isVideoPlaying }) => {
|
|
790
|
-
return { ...state, isVideoPlaying: isVideoPlaying };
|
|
791
|
-
}), on(setAwsInstance, (state, { instanceName, wsUrl, pollingUrl }) => {
|
|
792
|
-
return { ...state, awsInstance: { instanceName, wsUrl, pollingUrl } };
|
|
793
|
-
}), on(setViewportReady, (state) => {
|
|
794
|
-
return {
|
|
795
|
-
...state,
|
|
796
|
-
viewportReady: true,
|
|
797
|
-
statusMessage: null,
|
|
798
|
-
errorMessage: null,
|
|
799
|
-
};
|
|
800
|
-
}), on(setViewportNotReady, (state) => {
|
|
801
|
-
return { ...state, viewportReady: false };
|
|
802
|
-
}), on(updateCirrusInfo, (state, { ssInfo, ssData }) => {
|
|
803
|
-
return {
|
|
804
|
-
...state,
|
|
805
|
-
ssInfo: ssInfo, // For back compatibility
|
|
806
|
-
ssData: ssData, // Contains all the data from the ssInfo as an object
|
|
807
|
-
};
|
|
808
|
-
}), on(changeStreamResolutionSuccessAction, (state, { width, height }) => {
|
|
809
|
-
return { ...state, streamResolution: { width: width, height: height } };
|
|
810
|
-
}), on(setFreezeFrame, (state, freezeFrame) => {
|
|
811
|
-
return {
|
|
812
|
-
...state,
|
|
813
|
-
freezeFrame: {
|
|
814
|
-
dataUrl: freezeFrame.progress === 0 ||
|
|
815
|
-
freezeFrame.progress === 1 ||
|
|
816
|
-
freezeFrame.progress === null
|
|
817
|
-
? freezeFrame.dataUrl
|
|
818
|
-
: state.freezeFrame.dataUrl,
|
|
819
|
-
progress: freezeFrame.progress || null,
|
|
820
|
-
},
|
|
821
|
-
};
|
|
822
|
-
}), on(disconnectStream, (state, errorMessage) => {
|
|
823
|
-
if (state.dataChannelConnected ||
|
|
824
|
-
state.disconnectReason === DisconnectReason.Destroy) {
|
|
825
|
-
return state;
|
|
826
|
-
}
|
|
827
|
-
return {
|
|
828
|
-
...state,
|
|
829
|
-
errorMessage,
|
|
830
|
-
statusMessage: null,
|
|
831
|
-
wasInitialized: true,
|
|
832
|
-
};
|
|
833
|
-
}), on(setFreezeFrameFromVideo, (state, freezeFrameFromVideo) => {
|
|
834
|
-
return {
|
|
835
|
-
...state,
|
|
836
|
-
freezeFrameFromVideo: {
|
|
837
|
-
dataUrl: freezeFrameFromVideo.dataUrl,
|
|
838
|
-
progress: freezeFrameFromVideo.progress || null,
|
|
839
|
-
},
|
|
840
|
-
};
|
|
841
|
-
}), on(setStatusMessage, (state, { statusMessage }) => {
|
|
842
|
-
return { ...state, statusMessage };
|
|
843
|
-
}), on(setEstablishingConnection, (state, { value }) => {
|
|
844
|
-
return { ...state, establishingConnection: value };
|
|
845
|
-
}), on(setStatusPercentSignallingServer, (state, { percent }) => {
|
|
846
|
-
return { ...state, statusPercentSignallingServer: percent };
|
|
847
|
-
}), on(dataChannelConnected, (state, { statusMessage }) => {
|
|
848
|
-
return {
|
|
849
|
-
...state,
|
|
850
|
-
statusMessage,
|
|
851
|
-
dataChannelConnected: true,
|
|
852
|
-
establishingConnection: false,
|
|
853
|
-
wasInitialized: true,
|
|
854
|
-
};
|
|
855
|
-
}), on(setConfig, startStream, (state, { config }) => {
|
|
856
|
-
return { ...state, streamConfig: { ...state.streamConfig, ...config } };
|
|
857
|
-
}), on(resetConfig, (state) => {
|
|
858
|
-
return { ...state, streamConfig: initialState.streamConfig };
|
|
859
|
-
}), on(resetWarnTimeout, (state) => {
|
|
860
|
-
return {
|
|
861
|
-
...state,
|
|
862
|
-
streamConfig: { ...state.streamConfig, warnTimeout: DEFAULT_AFK_TIMEOUT },
|
|
863
|
-
};
|
|
864
|
-
}), on(initSignalling, (state, { resetDisconnectionReason = true }) => {
|
|
865
|
-
return {
|
|
866
|
-
...state,
|
|
867
|
-
disconnectReason: resetDisconnectionReason
|
|
868
|
-
? DisconnectReason.None
|
|
869
|
-
: state.disconnectReason,
|
|
870
|
-
};
|
|
871
|
-
}), on(destroyRemoteConnections, (state, { reason }) => {
|
|
872
|
-
if (state.disconnectReason === DisconnectReason.Destroy) {
|
|
873
|
-
return state;
|
|
874
|
-
}
|
|
875
|
-
return { ...state, disconnectReason: reason };
|
|
876
|
-
}), on(reconnectPeerSuccess, (state) => {
|
|
877
|
-
return { ...state, isReconnecting: false };
|
|
878
|
-
}), on(setSignalingName, (state, { instanceName }) => {
|
|
879
|
-
return { ...state, awsInstance: { ...state.awsInstance, instanceName } };
|
|
880
|
-
}), on(setOrchestrationParameters, (state, { instanceName, streamRequestId, eta }) => {
|
|
881
|
-
return {
|
|
882
|
-
...state,
|
|
883
|
-
awsInstance: {
|
|
884
|
-
...state.awsInstance,
|
|
885
|
-
message: undefined,
|
|
886
|
-
instanceName,
|
|
887
|
-
streamRequestId,
|
|
888
|
-
eta,
|
|
889
|
-
},
|
|
890
|
-
};
|
|
891
|
-
}), on(setOrchestrationProgress, (state, { progressComplete }) => {
|
|
892
|
-
return {
|
|
893
|
-
...state,
|
|
894
|
-
awsInstance: {
|
|
895
|
-
...state.awsInstance,
|
|
896
|
-
progressComplete,
|
|
897
|
-
},
|
|
898
|
-
};
|
|
899
|
-
}), on(setOrchestrationMessage, (state, { message }) => {
|
|
900
|
-
return {
|
|
901
|
-
...state,
|
|
902
|
-
awsInstance: {
|
|
903
|
-
...state.awsInstance,
|
|
904
|
-
message,
|
|
905
|
-
},
|
|
906
|
-
};
|
|
907
|
-
}), on(setLoopBackCommandIsCompleted, (state) => {
|
|
908
|
-
return { ...state, isFirstSuccessLoad: true };
|
|
909
|
-
}), on(setAfkTimerCountdown, (state, { countdown }) => {
|
|
910
|
-
return { ...state, afkCountdown: countdown };
|
|
911
|
-
}), on(setAfkTimerVisible, (state) => {
|
|
912
|
-
return { ...state, isAfkTimerVisible: true };
|
|
913
|
-
}), on(setAfkTimerHide, (state) => {
|
|
914
|
-
return { ...state, isAfkTimerVisible: false, afkCountdown: 0 };
|
|
915
|
-
}), on(setOrchestrationContext, (state, { urls, environmentId, streamRequestContext }) => {
|
|
916
|
-
return {
|
|
917
|
-
...state,
|
|
918
|
-
matchUrls: urls,
|
|
919
|
-
environmentId,
|
|
920
|
-
streamRequestContext,
|
|
921
|
-
};
|
|
922
|
-
}), on(setStreamClientCompanyId, (state, { id }) => {
|
|
923
|
-
return { ...state, streamClientCompanyId: id };
|
|
924
|
-
}), on(setStreamViewId, (state, { id }) => {
|
|
925
|
-
return { ...state, streamViewId: id };
|
|
926
|
-
}), on(setIntroImageSrc, (state, { src }) => {
|
|
927
|
-
return { ...state, imageIntroSrc: src };
|
|
928
|
-
}), on(setLoadingImageSrc, (state, { src }) => {
|
|
929
|
-
return { ...state, imageLoadingSrc: src };
|
|
930
|
-
}), on(setIntroVideoSrc, (state, { src }) => {
|
|
931
|
-
return { ...state, videoIntroSrc: src };
|
|
932
|
-
}), on(resetIntroSrc, (state) => {
|
|
933
|
-
return { ...state, imageIntroSrc: '', videoIntroSrc: '' };
|
|
934
|
-
}), on(saveAnalyticsEvent, (state, { event }) => {
|
|
935
|
-
return { ...state, analyticsEvent: event };
|
|
936
|
-
}), on(commandStarted, (state, { id, command }) => {
|
|
911
|
+
out.totalCommandsCompleted += markForDelete.length;
|
|
912
|
+
out.commandsInProgress = out.commandsInProgress.filter((command) => !markForDelete.includes(command.id));
|
|
913
|
+
return out;
|
|
914
|
+
};
|
|
915
|
+
const initialState = {
|
|
916
|
+
commandsInProgress: [],
|
|
917
|
+
totalCommandsStarted: 0,
|
|
918
|
+
totalCommandsCompleted: 0,
|
|
919
|
+
};
|
|
920
|
+
const commandsReducer = createReducer(initialState, on(commandStarted, (state, { id, command }) => {
|
|
937
921
|
return {
|
|
938
922
|
...state,
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
{ id, command, timeStamp: new Date().getTime() },
|
|
945
|
-
],
|
|
946
|
-
},
|
|
923
|
+
totalCommandsStarted: state.totalCommandsStarted + 1,
|
|
924
|
+
commandsInProgress: [
|
|
925
|
+
...state.commandsInProgress,
|
|
926
|
+
{ id, command, timeStamp: new Date().getTime() },
|
|
927
|
+
],
|
|
947
928
|
};
|
|
948
929
|
}), on(commandCompleted, (state, { id }) => {
|
|
949
930
|
return {
|
|
950
931
|
...state,
|
|
951
|
-
|
|
952
|
-
};
|
|
953
|
-
}), on(setCirrusConnected, (state) => {
|
|
954
|
-
return { ...state, cirrusConnected: true };
|
|
955
|
-
}), on(setCirrusDisconnected, (state) => {
|
|
956
|
-
return {
|
|
957
|
-
...initialState,
|
|
958
|
-
establishingConnection: state.establishingConnection,
|
|
959
|
-
disconnectReason: state.disconnectReason,
|
|
960
|
-
wasInitialized: state.wasInitialized,
|
|
961
|
-
isFirstSuccessLoad: state.isFirstSuccessLoad,
|
|
962
|
-
matchUrls: state.matchUrls,
|
|
963
|
-
streamClientCompanyId: state.streamClientCompanyId,
|
|
964
|
-
streamViewId: state.streamViewId,
|
|
965
|
-
imageIntroSrc: state.imageIntroSrc,
|
|
966
|
-
videoIntroSrc: state.videoIntroSrc,
|
|
967
|
-
imageLoadingSrc: state.imageLoadingSrc,
|
|
968
|
-
environmentId: state.environmentId,
|
|
969
|
-
streamRequestContext: state.streamRequestContext,
|
|
970
|
-
streamConfig: state.streamConfig,
|
|
971
|
-
};
|
|
972
|
-
}), on(dropConnection, (state) => {
|
|
973
|
-
return { ...state, establishingConnection: false };
|
|
974
|
-
}), on(resetDataChannelForReconnect, (state) => {
|
|
975
|
-
return {
|
|
976
|
-
...state,
|
|
977
|
-
isReconnecting: true,
|
|
978
|
-
dataChannelConnected: false,
|
|
979
|
-
viewportReady: false,
|
|
980
|
-
statusMessage: 'Reconnecting...',
|
|
981
|
-
};
|
|
982
|
-
}), on(setUnrealPlaywrightConfig, (state) => {
|
|
983
|
-
return {
|
|
984
|
-
...state,
|
|
985
|
-
wasInitialized: true,
|
|
986
|
-
isFirstSuccessLoad: true,
|
|
987
|
-
cirrusConnected: true,
|
|
988
|
-
viewportReady: true,
|
|
989
|
-
dataChannelConnected: true,
|
|
990
|
-
isVideoPlaying: true,
|
|
932
|
+
...removeExileCommands(state, id),
|
|
991
933
|
};
|
|
992
|
-
}), on(destroyUnrealScene, () => {
|
|
934
|
+
}), on(destroyUnrealScene, setCirrusDisconnected, () => {
|
|
993
935
|
return initialState;
|
|
994
936
|
}));
|
|
995
937
|
|
|
996
|
-
const
|
|
997
|
-
name: '
|
|
998
|
-
reducer:
|
|
938
|
+
const commandsFeature = createFeature({
|
|
939
|
+
name: 'commandsFeature',
|
|
940
|
+
reducer: commandsReducer,
|
|
941
|
+
});
|
|
942
|
+
|
|
943
|
+
const selectCommandsInProgress = createSelector(commandsFeature.selectCommandsInProgress, (commandsInProgress) => commandsInProgress?.length ?? 0);
|
|
944
|
+
const selectCommandProgress = createSelector(commandsFeature.selectTotalCommandsStarted, commandsFeature.selectTotalCommandsCompleted, (totalCommandsStarted, totalCommandsCompleted) => totalCommandsStarted ? totalCommandsCompleted / totalCommandsStarted : 0);
|
|
945
|
+
const selectLastCommandInProgress = createSelector(commandsFeature.selectCommandsInProgress, (commandsInProgress) => commandsInProgress?.length
|
|
946
|
+
? commandsInProgress[commandsInProgress.length - 1]
|
|
947
|
+
: null);
|
|
948
|
+
|
|
949
|
+
const selectFreezeFrameDataUrlFromVideo = createSelector(unrealFeature.selectFreezeFrameFromVideo, unrealFeature.selectLowBandwidth, (freezeFrameFromVideo, isLow) => isLow ? null : freezeFrameFromVideo?.dataUrl || null);
|
|
950
|
+
const selectFreezeFrameProgressMessageFromVideo = createSelector(unrealFeature.selectFreezeFrameFromVideo, unrealFeature.selectLowBandwidth, (freezeFrameFromVideo, isLow) => isLow ? null : freezeFrameFromVideo?.progress || null);
|
|
951
|
+
const selectFreezeFrameDataUrl = createSelector(unrealFeature.selectFreezeFrame, unrealFeature.selectLowBandwidth, (freezeFrame, isLow) => freezeFrame?.dataUrl && isLow ? freezeFrame?.dataUrl : null);
|
|
952
|
+
const selectIsFreezeFrameLoading = createSelector(unrealFeature.selectFreezeFrame, (freezeFrame) => freezeFrame?.progress
|
|
953
|
+
? freezeFrame.progress > 0 && freezeFrame.progress < 1
|
|
954
|
+
: false);
|
|
955
|
+
const selectFreezeFrameCombinedDataUrl = createSelector(selectFreezeFrameDataUrlFromVideo, selectFreezeFrameDataUrl, (dataUrlFromVideo, remoteDataUrl) => dataUrlFromVideo || remoteDataUrl || null);
|
|
956
|
+
const selectStreamConfig = createSelector(unrealFeature.selectStreamConfig, (config) => config);
|
|
957
|
+
const selectWarnTimeout = createSelector(selectStreamConfig, (config) => config?.warnTimeout || DEFAULT_AFK_TIMEOUT);
|
|
958
|
+
const selectIsExistMatchUrls = createSelector(unrealFeature.selectMatchUrls, (urls) => urls?.length > 0);
|
|
959
|
+
const selectIsAutostart = createSelector(selectStreamConfig, (config) => config?.autoStart);
|
|
960
|
+
const selectIsShowPopupWithoutAutoStart = createSelector(selectStreamConfig, unrealFeature.selectWasInitialized, (config, wasInitialized) => !config.autoStart && !wasInitialized);
|
|
961
|
+
const selectShowReconnectPopup = createSelector(unrealFeature.selectCirrusConnected, unrealFeature.selectEstablishingConnection, (connected, establishing) => !connected && !establishing);
|
|
962
|
+
const selectShowLoader = createSelector(selectShowReconnectPopup, unrealFeature.selectViewportReady, (showPopup, viewportReady) => !showPopup && !viewportReady);
|
|
963
|
+
const selectIsVideoPlayingAndDataChannelConnected = createSelector(unrealFeature.selectIsVideoPlaying, unrealFeature.selectDataChannelConnected, (isVideoPlaying, isDataChannelConnected) => isVideoPlaying && isDataChannelConnected);
|
|
964
|
+
const selectSignalingParameters = createSelector(unrealFeature.selectSsData, unrealFeature.selectAwsInstance, unrealFeature.selectSsInfo, (data, instance, ssInfo) => {
|
|
965
|
+
const info = [];
|
|
966
|
+
if (data) {
|
|
967
|
+
info.push(`${data.cirrusVersion}, ${data.branchInfo}, ${data.instanceType}`);
|
|
968
|
+
info.push(`Unreal App Version: ${data.streamerVersion}`);
|
|
969
|
+
info.push(`APP: ${data.streamPath}${data.streamApp}`);
|
|
970
|
+
}
|
|
971
|
+
else {
|
|
972
|
+
info.push(ssInfo);
|
|
973
|
+
}
|
|
974
|
+
info.push(`Polling: ${instance.pollingUrl}`);
|
|
975
|
+
info.push(`WS: ${instance.wsUrl}`);
|
|
976
|
+
return info.join('<br>');
|
|
977
|
+
});
|
|
978
|
+
/**
|
|
979
|
+
* Returns Scene load progress as a float value in between 0-1
|
|
980
|
+
*/
|
|
981
|
+
const selectTotalProgress = createSelector(unrealFeature.selectStatusPercentSignallingServer, selectCommandProgress, unrealFeature.selectAwsInstance, unrealFeature.selectDataChannelConnected, (statusPercentSignallingServer, commandProgress, awsInstance, dataChannelConnected) => {
|
|
982
|
+
//TODO make better mechanism to detect is new orchestration
|
|
983
|
+
const isNewOrchestration = String(awsInstance?.wsUrl).match(/^wss:\/\/orchestration-websocket/i);
|
|
984
|
+
const newOrchestrationProgressComplete = dataChannelConnected
|
|
985
|
+
? 100
|
|
986
|
+
: (awsInstance?.progressComplete || 0) * 100;
|
|
987
|
+
/**
|
|
988
|
+
* Set 57% {@link SIGNALLING_PERCENT_VALUE} immediately when signalingServer?.signalingUrl is available
|
|
989
|
+
* Up to 56% {@link SIGNALLING_PERCENT_VALUE} - 1 of the progress is reserved for signaling server polling
|
|
990
|
+
*/
|
|
991
|
+
const signalingPercentValue = isNewOrchestration
|
|
992
|
+
? newOrchestrationProgressComplete
|
|
993
|
+
: statusPercentSignallingServer;
|
|
994
|
+
const SIGNALLING_MAX = SIGNALLING_PERCENT_VALUE / 100;
|
|
995
|
+
const splitPoint = awsInstance?.wsUrl
|
|
996
|
+
? SIGNALLING_MAX + 0.01
|
|
997
|
+
: SIGNALLING_MAX;
|
|
998
|
+
const progressSignaling = lerp(0.001, splitPoint, (signalingPercentValue ?? 0) / 100);
|
|
999
|
+
const progressRest = lerp(0, 1 - splitPoint, commandProgress);
|
|
1000
|
+
return clampf(0, 1, progressSignaling + progressRest);
|
|
999
1001
|
});
|
|
1002
|
+
const selectClientAndViewIds = createSelector(unrealFeature.selectStreamClientCompanyId, unrealFeature.selectStreamViewId, (clientId, viewId) => ({ clientId, viewId }));
|
|
1003
|
+
const selectIsLoaderScreenVisible = createSelector(unrealFeature.selectViewportReady, unrealFeature.selectDataChannelConnected, unrealFeature.selectCirrusConnected, (viewReady, cirrusConnected, dataChannelConnected) => !viewReady || !cirrusConnected || !dataChannelConnected);
|
|
1000
1004
|
|
|
1001
1005
|
class UnrealErrorModalComponent {
|
|
1002
1006
|
constructor() {
|
|
@@ -1007,10 +1011,10 @@ class UnrealErrorModalComponent {
|
|
|
1007
1011
|
close() {
|
|
1008
1012
|
this.#dialogRef.close();
|
|
1009
1013
|
}
|
|
1010
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1011
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.
|
|
1014
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1015
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", 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", "iconButton", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1012
1016
|
}
|
|
1013
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1017
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealErrorModalComponent, decorators: [{
|
|
1014
1018
|
type: Component,
|
|
1015
1019
|
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"] }]
|
|
1016
1020
|
}] });
|
|
@@ -1029,6 +1033,7 @@ class UnrealEffects {
|
|
|
1029
1033
|
this.commandTelemetryService = inject(CommandTelemetryService);
|
|
1030
1034
|
this.signallingService = inject(SignallingService);
|
|
1031
1035
|
this.videoService = inject(VideoService);
|
|
1036
|
+
this.unrealCallbackService = inject(UnrealCallbackService);
|
|
1032
1037
|
this.dataChannelConnectionTimeout = this.unrealInitialConfig?.dataChannelConnectionTimeout ??
|
|
1033
1038
|
DATA_CHANNEL_CONNECTION_TIMEOUT;
|
|
1034
1039
|
this.connectionCompleted$ = this.store
|
|
@@ -1099,7 +1104,7 @@ class UnrealEffects {
|
|
|
1099
1104
|
})));
|
|
1100
1105
|
});
|
|
1101
1106
|
this.forceLBMOff$ = createEffect(() => {
|
|
1102
|
-
return fromEvent(document, 'visibilitychange').pipe(map(() => document.visibilityState === 'visible'), filter(Truthy), withLatestFrom(this.store.select(unrealFeature.selectLowBandwidth)), filter(([, isLowBandwidth]) => isLowBandwidth),
|
|
1107
|
+
return fromEvent(document, 'visibilitychange').pipe(map(() => document.visibilityState === 'visible'), filter(Truthy), withLatestFrom(this.store.select(unrealFeature.selectLowBandwidth)), filter(([, isLowBandwidth]) => isLowBandwidth), map(() => changeLowBandwidth({ lowBandwidth: false })));
|
|
1103
1108
|
});
|
|
1104
1109
|
this.resetFreezeFrameOnLowBandwidthTriggered$ = createEffect(() => {
|
|
1105
1110
|
return this.actions$.pipe(ofType(changeLowBandwidth), map(({ lowBandwidth }) => lowBandwidth), distinctUntilChanged(), map(() => setFreezeFrame({ dataUrl: null, progress: null })));
|
|
@@ -1120,7 +1125,7 @@ class UnrealEffects {
|
|
|
1120
1125
|
.pipe(catchError(() => EMPTY))))))
|
|
1121
1126
|
.subscribe();
|
|
1122
1127
|
this.resetAfk$ = createEffect(() => {
|
|
1123
|
-
return this.actions$.pipe(ofType(setConfig, resetWarnTimeout, resetConfig), map(() =>
|
|
1128
|
+
return this.actions$.pipe(ofType(setConfig, resetWarnTimeout, resetConfig), map(() => resetAfk()));
|
|
1124
1129
|
});
|
|
1125
1130
|
this.abortEstablishingConnection$ = createEffect(() => {
|
|
1126
1131
|
const viewportReady$ = this.store
|
|
@@ -1137,9 +1142,6 @@ class UnrealEffects {
|
|
|
1137
1142
|
});
|
|
1138
1143
|
}));
|
|
1139
1144
|
}, { dispatch: false });
|
|
1140
|
-
this.resetAfkAction$ = createEffect(() => {
|
|
1141
|
-
return this.actions$.pipe(ofType(resetAfkAction), tap(() => resetAfk()));
|
|
1142
|
-
}, { dispatch: false });
|
|
1143
1145
|
this.setSignalingTo100$ = createEffect(() => {
|
|
1144
1146
|
return this.actions$.pipe(ofType(setAwsInstance), map(() => setStatusPercentSignallingServer({ percent: 100 })));
|
|
1145
1147
|
});
|
|
@@ -1229,7 +1231,7 @@ class UnrealEffects {
|
|
|
1229
1231
|
});
|
|
1230
1232
|
this.commandTelemetryService.trackStartCommand('EXT-SetViewportReady');
|
|
1231
1233
|
}), switchMap(() => this.store.select(selectCommandsInProgress).pipe(debounceTime(100), // !IMPORTANT last command detection time
|
|
1232
|
-
take(1), switchMap(() => observeCommandResponse({ command: MetaBoxCommand.FLoopBackCommand }, (data) => this.commandsSender.sendCommandToUnreal(data))), switchMap(() => this.videoService.videoStats$), filter((videoStats) => !!videoStats.aggregatedStats.framesPerSecond &&
|
|
1234
|
+
take(1), switchMap(() => this.unrealCallbackService.observeCommandResponse({ command: MetaBoxCommand.FLoopBackCommand }, (data) => this.commandsSender.sendCommandToUnreal(data))), switchMap(() => this.videoService.videoStats$), filter((videoStats) => !!videoStats.aggregatedStats.framesPerSecond &&
|
|
1233
1235
|
videoStats.aggregatedStats.framesPerSecond > MINIMAL_FPS &&
|
|
1234
1236
|
(videoStats.aggregatedStats.framesDecoded || 0) > 15), take(1), map(() => setLoopBackCommandIsCompleted()))));
|
|
1235
1237
|
});
|
|
@@ -1237,11 +1239,7 @@ class UnrealEffects {
|
|
|
1237
1239
|
return this.actions$.pipe(ofType(setLoopBackCommandIsCompleted, reconnectPeerSuccess), tap(() => this.commandTelemetryService.trackStopCommand('EXT-SetViewportReady', false, { ready: true })), map(() => setViewportReady()));
|
|
1238
1240
|
});
|
|
1239
1241
|
this.startStream$ = createEffect(() => {
|
|
1240
|
-
return this.actions$.pipe(ofType(startStream),
|
|
1241
|
-
});
|
|
1242
|
-
this.listenUnrealCallbackByInitSignalling$ = createEffect(() => {
|
|
1243
|
-
return this.actions$.pipe(ofType(initSignalling), filter(() => !this.unrealInitialConfig?.playwright), switchMap(() => fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(map(({ json }) => json?.commandCallback
|
|
1244
|
-
?.correlationId), filter(Truthy), map((id) => commandCompleted({ id })))));
|
|
1242
|
+
return this.actions$.pipe(ofType(startStream), map(() => initSignalling()));
|
|
1245
1243
|
});
|
|
1246
1244
|
this.connectToSignaling$ = createEffect(() => {
|
|
1247
1245
|
return this.actions$.pipe(ofType(initSignalling), withLatestFrom(this.store.select(unrealFeature.selectMatchUrls), this.store.select(selectIsAutostart), this.store.select(unrealFeature.selectCirrusConnected)), filter(([, , autoStart, cirrusConnected]) => {
|
|
@@ -1338,7 +1336,7 @@ class UnrealEffects {
|
|
|
1338
1336
|
}
|
|
1339
1337
|
}));
|
|
1340
1338
|
}),
|
|
1341
|
-
// Cancel if scene is destroyed
|
|
1339
|
+
// Cancel if a scene is destroyed
|
|
1342
1340
|
takeUntil(this.actions$.pipe(ofType(destroyUnrealScene), take(1))))));
|
|
1343
1341
|
});
|
|
1344
1342
|
/**
|
|
@@ -1366,83 +1364,33 @@ class UnrealEffects {
|
|
|
1366
1364
|
}));
|
|
1367
1365
|
}, { dispatch: false });
|
|
1368
1366
|
}
|
|
1369
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1370
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
1367
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1368
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealEffects }); }
|
|
1371
1369
|
}
|
|
1372
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1370
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealEffects, decorators: [{
|
|
1373
1371
|
type: Injectable
|
|
1374
1372
|
}] });
|
|
1375
1373
|
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
const selectIsExistMatchUrls = createSelector(unrealFeature.selectMatchUrls, (urls) => urls?.length > 0);
|
|
1386
|
-
const selectIsAutostart = createSelector(selectStreamConfig, (config) => config?.autoStart);
|
|
1387
|
-
const selectIsShowPopupWithoutAutoStart = createSelector(selectStreamConfig, unrealFeature.selectWasInitialized, (config, wasInitialized) => !config.autoStart && !wasInitialized);
|
|
1388
|
-
const selectShowReconnectPopup = createSelector(unrealFeature.selectCirrusConnected, unrealFeature.selectEstablishingConnection, (connected, establishing) => !connected && !establishing);
|
|
1389
|
-
const selectShowLoader = createSelector(selectShowReconnectPopup, unrealFeature.selectViewportReady, (showPopup, viewportReady) => !showPopup && !viewportReady);
|
|
1390
|
-
const selectIsVideoPlayingAndDataChannelConnected = createSelector(unrealFeature.selectIsVideoPlaying, unrealFeature.selectDataChannelConnected, (isVideoPlaying, isDataChannelConnected) => isVideoPlaying && isDataChannelConnected);
|
|
1391
|
-
const selectSignalingParameters = createSelector(unrealFeature.selectSsData, unrealFeature.selectAwsInstance, unrealFeature.selectSsInfo, (data, instance, ssInfo) => {
|
|
1392
|
-
const info = [];
|
|
1393
|
-
if (data) {
|
|
1394
|
-
info.push(`${data.cirrusVersion}, ${data.branchInfo}, ${data.instanceType}`);
|
|
1395
|
-
info.push(`Unreal App Version: ${data.streamerVersion}`);
|
|
1396
|
-
info.push(`APP: ${data.streamPath}${data.streamApp}`);
|
|
1397
|
-
}
|
|
1398
|
-
else {
|
|
1399
|
-
info.push(ssInfo);
|
|
1374
|
+
class CommandsEffects {
|
|
1375
|
+
constructor() {
|
|
1376
|
+
this.actions$ = inject(Actions);
|
|
1377
|
+
this.unrealInitialConfig = inject(UNREAL_CONFIG);
|
|
1378
|
+
this.listenUnrealCallbackByInitSignalling$ = createEffect(() => {
|
|
1379
|
+
return this.actions$.pipe(ofType(initSignalling), filter(() => !this.unrealInitialConfig?.playwright), switchMap(() => this.actions$.pipe(ofType(unrealCommandCallback), map(({ json }) => 'commandCallback' in json
|
|
1380
|
+
? json.commandCallback?.correlationId
|
|
1381
|
+
: json?.correlationId), filter(Truthy), tapLog('Unreal Command Callback'), map((id) => commandCompleted({ id })))));
|
|
1382
|
+
});
|
|
1400
1383
|
}
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
const selectCommandProgress = createSelector(selectLoaderCommands, (loaderCommands) => {
|
|
1408
|
-
if (loaderCommands.totalCommandsStarted > 0) {
|
|
1409
|
-
return (loaderCommands.totalCommandsCompleted /
|
|
1410
|
-
loaderCommands.totalCommandsStarted);
|
|
1411
|
-
}
|
|
1412
|
-
return 0;
|
|
1413
|
-
});
|
|
1414
|
-
const selectLastCommandInProgress = createSelector(selectLoaderCommands, (loaderCommands) => loaderCommands.commandsInProgress?.length
|
|
1415
|
-
? loaderCommands.commandsInProgress[loaderCommands.commandsInProgress.length - 1]
|
|
1416
|
-
: null);
|
|
1417
|
-
/**
|
|
1418
|
-
* Returns Scene load progress as a float value in between 0-1
|
|
1419
|
-
*/
|
|
1420
|
-
const selectTotalProgress = createSelector(unrealFeature.selectStatusPercentSignallingServer, selectCommandProgress, unrealFeature.selectAwsInstance, unrealFeature.selectDataChannelConnected, (statusPercentSignallingServer, commandProgress, awsInstance, dataChannelConnected) => {
|
|
1421
|
-
//TODO make better mechanism to detect is new orchestration
|
|
1422
|
-
const isNewOrchestration = String(awsInstance?.wsUrl).match(/^wss:\/\/orchestration-websocket/i);
|
|
1423
|
-
const newOrchestrationProgressComplete = dataChannelConnected
|
|
1424
|
-
? 100
|
|
1425
|
-
: (awsInstance?.progressComplete || 0) * 100;
|
|
1426
|
-
/**
|
|
1427
|
-
* Set 57% {@link SIGNALLING_PERCENT_VALUE} immediately when signalingServer?.signalingUrl is available
|
|
1428
|
-
* Up to 56% {@link SIGNALLING_PERCENT_VALUE} - 1 of the progress is reserved for signaling server polling
|
|
1429
|
-
*/
|
|
1430
|
-
const signalingPercentValue = isNewOrchestration
|
|
1431
|
-
? newOrchestrationProgressComplete
|
|
1432
|
-
: statusPercentSignallingServer;
|
|
1433
|
-
const SIGNALLING_MAX = SIGNALLING_PERCENT_VALUE / 100;
|
|
1434
|
-
const splitPoint = awsInstance?.wsUrl
|
|
1435
|
-
? SIGNALLING_MAX + 0.01
|
|
1436
|
-
: SIGNALLING_MAX;
|
|
1437
|
-
const progressSignaling = lerp(0.001, splitPoint, (signalingPercentValue ?? 0) / 100);
|
|
1438
|
-
const progressRest = lerp(0, 1 - splitPoint, commandProgress);
|
|
1439
|
-
return clampf(0, 1, progressSignaling + progressRest);
|
|
1440
|
-
});
|
|
1441
|
-
const selectClientAndViewIds = createSelector(unrealFeature.selectStreamClientCompanyId, unrealFeature.selectStreamViewId, (clientId, viewId) => ({ clientId, viewId }));
|
|
1442
|
-
const selectIsLoaderScreenVisible = createSelector(unrealFeature.selectViewportReady, unrealFeature.selectDataChannelConnected, unrealFeature.selectCirrusConnected, (viewReady, cirrusConnected, dataChannelConnected) => !viewReady || !cirrusConnected || !dataChannelConnected);
|
|
1384
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandsEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1385
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandsEffects }); }
|
|
1386
|
+
}
|
|
1387
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandsEffects, decorators: [{
|
|
1388
|
+
type: Injectable
|
|
1389
|
+
}] });
|
|
1443
1390
|
|
|
1444
1391
|
class SubService {
|
|
1445
1392
|
constructor() {
|
|
1393
|
+
this.actions$ = inject(Actions);
|
|
1446
1394
|
this.store = inject(Store);
|
|
1447
1395
|
this.disconnect$ = this.store
|
|
1448
1396
|
.select(unrealFeature.selectCirrusConnected)
|
|
@@ -1463,7 +1411,7 @@ class AFKService extends SubService {
|
|
|
1463
1411
|
this.init();
|
|
1464
1412
|
}
|
|
1465
1413
|
init() {
|
|
1466
|
-
merge(this.store.select(selectWarnTimeout),
|
|
1414
|
+
merge(this.store.select(selectWarnTimeout), this.actions$.pipe(ofType(resetAfk)))
|
|
1467
1415
|
.pipe(withLatestFrom(this.store.select(unrealFeature.selectViewportReady)), filter(([, viewportReady]) => viewportReady))
|
|
1468
1416
|
.subscribe(() => this.resetAfkWarningTimer());
|
|
1469
1417
|
this.store
|
|
@@ -1541,10 +1489,10 @@ class AFKService extends SubService {
|
|
|
1541
1489
|
}
|
|
1542
1490
|
}, 1000);
|
|
1543
1491
|
}
|
|
1544
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1545
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
1492
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AFKService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1493
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AFKService }); }
|
|
1546
1494
|
}
|
|
1547
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1495
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AFKService, decorators: [{
|
|
1548
1496
|
type: Injectable
|
|
1549
1497
|
}], ctorParameters: () => [] });
|
|
1550
1498
|
|
|
@@ -1561,6 +1509,9 @@ class FreezeFrameService extends SubService {
|
|
|
1561
1509
|
.select(unrealFeature.selectViewportReady)
|
|
1562
1510
|
.pipe(filter(Truthy))
|
|
1563
1511
|
.subscribe(() => this.invalidate());
|
|
1512
|
+
this.actions$
|
|
1513
|
+
.pipe(ofType(videoStreamInitialized))
|
|
1514
|
+
.subscribe(() => this.invalidate());
|
|
1564
1515
|
}
|
|
1565
1516
|
setData(view) {
|
|
1566
1517
|
view = view.slice(1 + 4);
|
|
@@ -1622,10 +1573,10 @@ class FreezeFrameService extends SubService {
|
|
|
1622
1573
|
progress: 1,
|
|
1623
1574
|
}));
|
|
1624
1575
|
}
|
|
1625
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1626
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
1576
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1577
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameService }); }
|
|
1627
1578
|
}
|
|
1628
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1579
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameService, decorators: [{
|
|
1629
1580
|
type: Injectable
|
|
1630
1581
|
}], ctorParameters: () => [] });
|
|
1631
1582
|
|
|
@@ -1676,9 +1627,9 @@ class VideoService extends SubService {
|
|
|
1676
1627
|
this.init();
|
|
1677
1628
|
}
|
|
1678
1629
|
init() {
|
|
1679
|
-
|
|
1680
|
-
this.kalmanFilter1D.config(
|
|
1681
|
-
BITRATE_MONITOR.config(
|
|
1630
|
+
this.actions$.pipe(ofType(setKalmanSettings)).subscribe(({ settings }) => {
|
|
1631
|
+
this.kalmanFilter1D.config(settings);
|
|
1632
|
+
BITRATE_MONITOR.config(settings);
|
|
1682
1633
|
});
|
|
1683
1634
|
}
|
|
1684
1635
|
setContainer(container = null) {
|
|
@@ -1907,7 +1858,7 @@ class VideoService extends SubService {
|
|
|
1907
1858
|
.pipe(take(1), filter((data) => this.video === data.target), tapLog('VideoService loadedmetadata:'))
|
|
1908
1859
|
.subscribe(() => {
|
|
1909
1860
|
if (this.video) {
|
|
1910
|
-
|
|
1861
|
+
this.store.dispatch(videoStreamInitialized());
|
|
1911
1862
|
}
|
|
1912
1863
|
});
|
|
1913
1864
|
}
|
|
@@ -1924,15 +1875,17 @@ class VideoService extends SubService {
|
|
|
1924
1875
|
error: () => ({}),
|
|
1925
1876
|
});
|
|
1926
1877
|
}
|
|
1927
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1928
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
1878
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1879
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoService }); }
|
|
1929
1880
|
}
|
|
1930
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1881
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoService, decorators: [{
|
|
1931
1882
|
type: Injectable
|
|
1932
1883
|
}], ctorParameters: () => [] });
|
|
1933
1884
|
|
|
1934
1885
|
class CommandTelemetryService {
|
|
1935
1886
|
constructor() {
|
|
1887
|
+
this.actions$ = inject(Actions);
|
|
1888
|
+
this.store = inject(Store);
|
|
1936
1889
|
this.appId = 'metabox-telemetry';
|
|
1937
1890
|
this.commandsSent = {};
|
|
1938
1891
|
this.exileTimeout = 60000;
|
|
@@ -2072,8 +2025,8 @@ class CommandTelemetryService {
|
|
|
2072
2025
|
* that have exceeded the timeout limit.
|
|
2073
2026
|
*/
|
|
2074
2027
|
listenCallbacks() {
|
|
2075
|
-
|
|
2076
|
-
.pipe(filter(({ json }) => {
|
|
2028
|
+
this.actions$
|
|
2029
|
+
.pipe(ofType(unrealCommandCallback), filter(({ json }) => {
|
|
2077
2030
|
const callback = 'commandCallback' in json ? json.commandCallback : json;
|
|
2078
2031
|
return Truthy(callback?.trackingId);
|
|
2079
2032
|
}))
|
|
@@ -2117,7 +2070,7 @@ class CommandTelemetryService {
|
|
|
2117
2070
|
* Finally, calls the provided function with the modified data object.
|
|
2118
2071
|
*
|
|
2119
2072
|
* @param {IToBeDecorated} funcToDecorate - The function to be decorated with telemetry tracking.
|
|
2120
|
-
* @param {
|
|
2073
|
+
* @param {MetaBoxCommandPacket} data - The data object to be passed to the function. It will be augmented with a unique tracking ID.
|
|
2121
2074
|
*/
|
|
2122
2075
|
wrapper(funcToDecorate, data) {
|
|
2123
2076
|
const out = { ...data, trackingId: generateUuid() };
|
|
@@ -2131,10 +2084,10 @@ class CommandTelemetryService {
|
|
|
2131
2084
|
this.trackTime(out);
|
|
2132
2085
|
funcToDecorate(out);
|
|
2133
2086
|
}
|
|
2134
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
2135
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
2087
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandTelemetryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2088
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandTelemetryService }); }
|
|
2136
2089
|
}
|
|
2137
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
2090
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandTelemetryService, decorators: [{
|
|
2138
2091
|
type: Injectable
|
|
2139
2092
|
}], ctorParameters: () => [] });
|
|
2140
2093
|
|
|
@@ -2562,10 +2515,10 @@ class SignallingService extends SubService {
|
|
|
2562
2515
|
Logger.log('Start Getting Region');
|
|
2563
2516
|
return this.regionsPingService.getFastest().pipe(take(1));
|
|
2564
2517
|
}
|
|
2565
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
2566
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
2518
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SignallingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2519
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SignallingService }); }
|
|
2567
2520
|
}
|
|
2568
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
2521
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SignallingService, decorators: [{
|
|
2569
2522
|
type: Injectable
|
|
2570
2523
|
}], ctorParameters: () => [] });
|
|
2571
2524
|
|
|
@@ -2582,8 +2535,8 @@ class WebRtcPlayerService extends SubService {
|
|
|
2582
2535
|
this.forceMonoAudio = false;
|
|
2583
2536
|
this.isReconnecting = this.store.selectSignal(unrealFeature.selectIsReconnecting);
|
|
2584
2537
|
this.init();
|
|
2585
|
-
|
|
2586
|
-
|
|
2538
|
+
this.actions$.pipe(ofType(dropDC)).subscribe(() => this.dcClient?.close());
|
|
2539
|
+
this.actions$.pipe(ofType(dropPC)).subscribe(() => this.pcClient?.close());
|
|
2587
2540
|
}
|
|
2588
2541
|
init() {
|
|
2589
2542
|
const iceCandidateBuffer = [];
|
|
@@ -2960,10 +2913,10 @@ class WebRtcPlayerService extends SubService {
|
|
|
2960
2913
|
Logger.error("Couldn't create offer");
|
|
2961
2914
|
}
|
|
2962
2915
|
}
|
|
2963
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
2964
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
2916
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebRtcPlayerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2917
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebRtcPlayerService }); }
|
|
2965
2918
|
}
|
|
2966
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
2919
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebRtcPlayerService, decorators: [{
|
|
2967
2920
|
type: Injectable
|
|
2968
2921
|
}], ctorParameters: () => [] });
|
|
2969
2922
|
|
|
@@ -3209,7 +3162,7 @@ class AggregatorService extends SubService {
|
|
|
3209
3162
|
else {
|
|
3210
3163
|
this.showMessageFromUnreal(json);
|
|
3211
3164
|
previousJson = json;
|
|
3212
|
-
|
|
3165
|
+
this.store.dispatch(unrealCommandCallback({ json }));
|
|
3213
3166
|
}
|
|
3214
3167
|
}
|
|
3215
3168
|
else {
|
|
@@ -3304,15 +3257,16 @@ class AggregatorService extends SubService {
|
|
|
3304
3257
|
Logger.warn(`unrecognized data received, packet ID ${view[0]}`);
|
|
3305
3258
|
}
|
|
3306
3259
|
}
|
|
3307
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
3308
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
3260
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AggregatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3261
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AggregatorService }); }
|
|
3309
3262
|
}
|
|
3310
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
3263
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AggregatorService, decorators: [{
|
|
3311
3264
|
type: Injectable
|
|
3312
3265
|
}], ctorParameters: () => [] });
|
|
3313
3266
|
|
|
3314
3267
|
class ConsoleExtensionsService extends SubService {
|
|
3315
3268
|
#httpClient = inject(HttpClient);
|
|
3269
|
+
#commandsSender = inject(UnrealCommunicatorService);
|
|
3316
3270
|
#isDevMode = inject(DevModeService).isDevMode;
|
|
3317
3271
|
constructor() {
|
|
3318
3272
|
super();
|
|
@@ -3329,6 +3283,21 @@ class ConsoleExtensionsService extends SubService {
|
|
|
3329
3283
|
}));
|
|
3330
3284
|
return true;
|
|
3331
3285
|
};
|
|
3286
|
+
window.dropDC = () => {
|
|
3287
|
+
this.store.dispatch(dropDC());
|
|
3288
|
+
return true;
|
|
3289
|
+
};
|
|
3290
|
+
window.dropPC = () => {
|
|
3291
|
+
this.store.dispatch(dropPC());
|
|
3292
|
+
return true;
|
|
3293
|
+
};
|
|
3294
|
+
window.setResolution = ({ w, h }) => {
|
|
3295
|
+
this.#commandsSender.sendCommandToUnreal({
|
|
3296
|
+
command: MetaBoxCommand.FChangeResolutionCommand,
|
|
3297
|
+
payload: { resolution: { x: w, y: h } },
|
|
3298
|
+
});
|
|
3299
|
+
return 'LowBandwidth => toggled';
|
|
3300
|
+
};
|
|
3332
3301
|
window.toggleBandwidth = () => {
|
|
3333
3302
|
this.store
|
|
3334
3303
|
.select(unrealFeature.selectLowBandwidth)
|
|
@@ -3343,7 +3312,7 @@ class ConsoleExtensionsService extends SubService {
|
|
|
3343
3312
|
window.restartApp = () => {
|
|
3344
3313
|
this.store
|
|
3345
3314
|
.select(unrealFeature.selectAwsInstance)
|
|
3346
|
-
.pipe(take(1), filter((data) => !!data.instanceName),
|
|
3315
|
+
.pipe(take(1), filter((data) => !!data.instanceName), switchMap((data) => this.#httpClient.get(`//${data.instanceName}/restartapp`)), catchError(() => of(null)))
|
|
3347
3316
|
.subscribe();
|
|
3348
3317
|
};
|
|
3349
3318
|
window.unrealHelp = () => this.unrealHelp();
|
|
@@ -3360,10 +3329,10 @@ class ConsoleExtensionsService extends SubService {
|
|
|
3360
3329
|
Logger.info('setWarnTime() => set time to appear the AFK window.');
|
|
3361
3330
|
Logger.info('emitCommand(command) => send command to Unreal Engine.');
|
|
3362
3331
|
}
|
|
3363
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
3364
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
3332
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ConsoleExtensionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3333
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ConsoleExtensionsService }); }
|
|
3365
3334
|
}
|
|
3366
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
3335
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ConsoleExtensionsService, decorators: [{
|
|
3367
3336
|
type: Injectable
|
|
3368
3337
|
}], ctorParameters: () => [] });
|
|
3369
3338
|
|
|
@@ -3374,10 +3343,10 @@ class DevModeService {
|
|
|
3374
3343
|
setDevMode(value) {
|
|
3375
3344
|
return localStorage.setItem('devMode', value.toString());
|
|
3376
3345
|
}
|
|
3377
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
3378
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
3346
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DevModeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3347
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DevModeService, providedIn: 'root' }); }
|
|
3379
3348
|
}
|
|
3380
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
3349
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DevModeService, decorators: [{
|
|
3381
3350
|
type: Injectable,
|
|
3382
3351
|
args: [{
|
|
3383
3352
|
providedIn: 'root',
|
|
@@ -3388,7 +3357,6 @@ class UnrealCommunicatorService {
|
|
|
3388
3357
|
constructor() {
|
|
3389
3358
|
this.store = inject(Store);
|
|
3390
3359
|
this.commandTelemetryService = inject(CommandTelemetryService);
|
|
3391
|
-
this.freezeFrameService = inject(FreezeFrameService);
|
|
3392
3360
|
this.webRtcPlayerService = inject(WebRtcPlayerService);
|
|
3393
3361
|
this.destroy$ = new Subject();
|
|
3394
3362
|
this.cirrusConnected = this.store.selectSignal(unrealFeature.selectCirrusConnected);
|
|
@@ -3396,7 +3364,6 @@ class UnrealCommunicatorService {
|
|
|
3396
3364
|
}
|
|
3397
3365
|
init() {
|
|
3398
3366
|
this.emitUIInteraction = this.commandTelemetryService.decorate(this.emitUIInteraction.bind(this));
|
|
3399
|
-
this.listenVideo();
|
|
3400
3367
|
this.store
|
|
3401
3368
|
.select(unrealFeature.selectDataChannelConnected)
|
|
3402
3369
|
.pipe(filter(Truthy))
|
|
@@ -3437,7 +3404,7 @@ class UnrealCommunicatorService {
|
|
|
3437
3404
|
}
|
|
3438
3405
|
sendInputData(data) {
|
|
3439
3406
|
try {
|
|
3440
|
-
resetAfk();
|
|
3407
|
+
this.store.dispatch(resetAfk());
|
|
3441
3408
|
this.webRtcPlayerService.send(data);
|
|
3442
3409
|
}
|
|
3443
3410
|
catch (error) {
|
|
@@ -3469,16 +3436,10 @@ class UnrealCommunicatorService {
|
|
|
3469
3436
|
requestQualityControl() {
|
|
3470
3437
|
this.sendInputData(new Uint8Array([MessageType.RequestQualityControl]).buffer);
|
|
3471
3438
|
}
|
|
3472
|
-
|
|
3473
|
-
|
|
3474
|
-
sendSignal(UnrealInternalSignalEvents.ShowPlayButton);
|
|
3475
|
-
this.freezeFrameService.invalidate();
|
|
3476
|
-
});
|
|
3477
|
-
}
|
|
3478
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: UnrealCommunicatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3479
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: UnrealCommunicatorService }); }
|
|
3439
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCommunicatorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
3440
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCommunicatorService }); }
|
|
3480
3441
|
}
|
|
3481
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
3442
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCommunicatorService, decorators: [{
|
|
3482
3443
|
type: Injectable
|
|
3483
3444
|
}], ctorParameters: () => [] });
|
|
3484
3445
|
|
|
@@ -3540,11 +3501,9 @@ class InputService extends SubService {
|
|
|
3540
3501
|
Logger.log('DEBUG: video initialized: ', video);
|
|
3541
3502
|
this.options = InputOptions;
|
|
3542
3503
|
this.reInit$.next();
|
|
3543
|
-
merge(fromResizeObserver(video),
|
|
3504
|
+
merge(fromResizeObserver(video), this.actions$.pipe(ofType(videoAdaptedToContainer)))
|
|
3544
3505
|
.pipe(debounceTime$1(300), takeUntil$1(this.deactivatedVideoTrigger$))
|
|
3545
|
-
.subscribe(() =>
|
|
3546
|
-
this.setupNormalizeAndQuantize(video);
|
|
3547
|
-
});
|
|
3506
|
+
.subscribe(() => this.setupNormalizeAndQuantize(video));
|
|
3548
3507
|
this.setupNormalizeAndQuantize(video);
|
|
3549
3508
|
this.registerInputs(video);
|
|
3550
3509
|
}
|
|
@@ -4058,10 +4017,10 @@ class RegionsPingService {
|
|
|
4058
4017
|
throw error;
|
|
4059
4018
|
}
|
|
4060
4019
|
}
|
|
4061
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4062
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4020
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RegionsPingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4021
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RegionsPingService }); }
|
|
4063
4022
|
}
|
|
4064
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4023
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RegionsPingService, decorators: [{
|
|
4065
4024
|
type: Injectable
|
|
4066
4025
|
}], ctorParameters: () => [] });
|
|
4067
4026
|
|
|
@@ -4098,10 +4057,10 @@ class StreamStatusTelemetryService {
|
|
|
4098
4057
|
trackEventToMixPanel(data) {
|
|
4099
4058
|
this.#store.dispatch(trackMixpanelEvent({ event: 'streamStatus', data }));
|
|
4100
4059
|
}
|
|
4101
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4102
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4060
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StreamStatusTelemetryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4061
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StreamStatusTelemetryService }); }
|
|
4103
4062
|
}
|
|
4104
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4063
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StreamStatusTelemetryService, decorators: [{
|
|
4105
4064
|
type: Injectable
|
|
4106
4065
|
}], ctorParameters: () => [] });
|
|
4107
4066
|
|
|
@@ -4109,10 +4068,10 @@ class AfkPlaywrightService extends AFKService {
|
|
|
4109
4068
|
init() {
|
|
4110
4069
|
return;
|
|
4111
4070
|
}
|
|
4112
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4113
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4071
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4072
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkPlaywrightService }); }
|
|
4114
4073
|
}
|
|
4115
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4074
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkPlaywrightService, decorators: [{
|
|
4116
4075
|
type: Injectable
|
|
4117
4076
|
}] });
|
|
4118
4077
|
|
|
@@ -4130,10 +4089,10 @@ class SignallingPlaywrightService extends SignallingService {
|
|
|
4130
4089
|
}));
|
|
4131
4090
|
return EMPTY;
|
|
4132
4091
|
}
|
|
4133
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4134
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4092
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SignallingPlaywrightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4093
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SignallingPlaywrightService }); }
|
|
4135
4094
|
}
|
|
4136
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4095
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SignallingPlaywrightService, decorators: [{
|
|
4137
4096
|
type: Injectable
|
|
4138
4097
|
}], ctorParameters: () => [] });
|
|
4139
4098
|
|
|
@@ -4147,13 +4106,10 @@ class UnrealCommunicatorPlaywrightService extends UnrealCommunicatorService {
|
|
|
4147
4106
|
sendInputData() {
|
|
4148
4107
|
return;
|
|
4149
4108
|
}
|
|
4150
|
-
|
|
4151
|
-
|
|
4152
|
-
}
|
|
4153
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: UnrealCommunicatorPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4154
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: UnrealCommunicatorPlaywrightService }); }
|
|
4109
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCommunicatorPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4110
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCommunicatorPlaywrightService }); }
|
|
4155
4111
|
}
|
|
4156
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCommunicatorPlaywrightService, decorators: [{
|
|
4157
4113
|
type: Injectable
|
|
4158
4114
|
}] });
|
|
4159
4115
|
|
|
@@ -4161,10 +4117,10 @@ class AggregatorPlaywrightService extends AggregatorService {
|
|
|
4161
4117
|
init() {
|
|
4162
4118
|
return;
|
|
4163
4119
|
}
|
|
4164
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4165
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4120
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AggregatorPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4121
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AggregatorPlaywrightService }); }
|
|
4166
4122
|
}
|
|
4167
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4123
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AggregatorPlaywrightService, decorators: [{
|
|
4168
4124
|
type: Injectable
|
|
4169
4125
|
}] });
|
|
4170
4126
|
|
|
@@ -4172,10 +4128,10 @@ class FreezeFramePlaywrightService extends FreezeFrameService {
|
|
|
4172
4128
|
init() {
|
|
4173
4129
|
return;
|
|
4174
4130
|
}
|
|
4175
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4176
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4131
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFramePlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4132
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFramePlaywrightService }); }
|
|
4177
4133
|
}
|
|
4178
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4134
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFramePlaywrightService, decorators: [{
|
|
4179
4135
|
type: Injectable
|
|
4180
4136
|
}] });
|
|
4181
4137
|
|
|
@@ -4183,10 +4139,10 @@ class CommandTelemetryPlaywrightService extends CommandTelemetryService {
|
|
|
4183
4139
|
init() {
|
|
4184
4140
|
return;
|
|
4185
4141
|
}
|
|
4186
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4187
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4142
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandTelemetryPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4143
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandTelemetryPlaywrightService }); }
|
|
4188
4144
|
}
|
|
4189
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandTelemetryPlaywrightService, decorators: [{
|
|
4190
4146
|
type: Injectable
|
|
4191
4147
|
}] });
|
|
4192
4148
|
|
|
@@ -4194,10 +4150,10 @@ class StreamStatusTelemetryPlaywrightService extends StreamStatusTelemetryServic
|
|
|
4194
4150
|
init() {
|
|
4195
4151
|
return;
|
|
4196
4152
|
}
|
|
4197
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4198
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4153
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StreamStatusTelemetryPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4154
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StreamStatusTelemetryPlaywrightService }); }
|
|
4199
4155
|
}
|
|
4200
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StreamStatusTelemetryPlaywrightService, decorators: [{
|
|
4201
4157
|
type: Injectable
|
|
4202
4158
|
}] });
|
|
4203
4159
|
|
|
@@ -4205,10 +4161,10 @@ class ConsoleExtensionsPlaywrightService extends ConsoleExtensionsService {
|
|
|
4205
4161
|
init() {
|
|
4206
4162
|
return;
|
|
4207
4163
|
}
|
|
4208
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4209
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4164
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ConsoleExtensionsPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4165
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ConsoleExtensionsPlaywrightService }); }
|
|
4210
4166
|
}
|
|
4211
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ConsoleExtensionsPlaywrightService, decorators: [{
|
|
4212
4168
|
type: Injectable
|
|
4213
4169
|
}] });
|
|
4214
4170
|
|
|
@@ -4222,10 +4178,10 @@ class InputPlaywrightService extends InputService {
|
|
|
4222
4178
|
init() {
|
|
4223
4179
|
return;
|
|
4224
4180
|
}
|
|
4225
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4226
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4181
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: InputPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4182
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: InputPlaywrightService }); }
|
|
4227
4183
|
}
|
|
4228
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4184
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: InputPlaywrightService, decorators: [{
|
|
4229
4185
|
type: Injectable
|
|
4230
4186
|
}] });
|
|
4231
4187
|
|
|
@@ -4250,8 +4206,7 @@ class FileHandlerService {
|
|
|
4250
4206
|
const correlationId = generateUuid();
|
|
4251
4207
|
const out = { ...data, correlationId };
|
|
4252
4208
|
const observable = this.fileService.fileComplete$.pipe(switchMap((data) => {
|
|
4253
|
-
|
|
4254
|
-
if (valid && this.fileHandlers[mimetype]) {
|
|
4209
|
+
if (data.valid && this.fileHandlers[mimetype]) {
|
|
4255
4210
|
return this.fileHandlers[mimetype](data, correlationId).pipe(filter(Truthy));
|
|
4256
4211
|
}
|
|
4257
4212
|
return of(null);
|
|
@@ -4262,10 +4217,10 @@ class FileHandlerService {
|
|
|
4262
4217
|
setTimeout(() => sender(out), 0);
|
|
4263
4218
|
return observable;
|
|
4264
4219
|
}
|
|
4265
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4266
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4220
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FileHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4221
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FileHandlerService }); }
|
|
4267
4222
|
}
|
|
4268
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4223
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FileHandlerService, decorators: [{
|
|
4269
4224
|
type: Injectable
|
|
4270
4225
|
}] });
|
|
4271
4226
|
|
|
@@ -4352,10 +4307,10 @@ class AnalyticsService {
|
|
|
4352
4307
|
});
|
|
4353
4308
|
});
|
|
4354
4309
|
}
|
|
4355
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4356
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4310
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4311
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AnalyticsService }); }
|
|
4357
4312
|
}
|
|
4358
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4313
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AnalyticsService, decorators: [{
|
|
4359
4314
|
type: Injectable
|
|
4360
4315
|
}], ctorParameters: () => [] });
|
|
4361
4316
|
|
|
@@ -4429,7 +4384,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4429
4384
|
* ## FPS dispatch
|
|
4430
4385
|
*
|
|
4431
4386
|
* FPS changes are dispatched via the NgRx `setMaxFps` action, which triggers
|
|
4432
|
-
* the existing `
|
|
4387
|
+
* the existing `CommandsEffects.setMaxFps$` effect that sends the
|
|
4433
4388
|
* `t.MaxFPS <value>` console command to Unreal Engine.
|
|
4434
4389
|
*/
|
|
4435
4390
|
class FpsMonitorService {
|
|
@@ -4680,13 +4635,92 @@ class FpsMonitorService {
|
|
|
4680
4635
|
}
|
|
4681
4636
|
return { fps: fps / len, bitrate: bitrate / len, qp: qp / len };
|
|
4682
4637
|
}
|
|
4683
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4684
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
4638
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FpsMonitorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4639
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FpsMonitorService }); }
|
|
4685
4640
|
}
|
|
4686
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4641
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FpsMonitorService, decorators: [{
|
|
4687
4642
|
type: Injectable
|
|
4688
4643
|
}], ctorParameters: () => [] });
|
|
4689
4644
|
|
|
4645
|
+
class UnrealCallbackService {
|
|
4646
|
+
constructor() {
|
|
4647
|
+
this.actions$ = inject(Actions);
|
|
4648
|
+
}
|
|
4649
|
+
/**
|
|
4650
|
+
* Listens for unreal command callbacks matching a specific command or event type.
|
|
4651
|
+
*
|
|
4652
|
+
* Supports both MetaBoxCommand keys (e.g. `MetaBoxCommand.FLoadProductCommand`)
|
|
4653
|
+
* and custom Unreal callback events (e.g. `'cameraChanged'`, `'onSceneState'`).
|
|
4654
|
+
*
|
|
4655
|
+
* @param command - The command or event key to filter callbacks by
|
|
4656
|
+
* @returns Observable that emits matching callback payloads
|
|
4657
|
+
*
|
|
4658
|
+
* @example
|
|
4659
|
+
* ```ts
|
|
4660
|
+
* // Listen for a MetaBox command callback
|
|
4661
|
+
* this.unrealCallbackService
|
|
4662
|
+
* .fromUnrealCallback(MetaBoxCommand.FLoadProductCommand)
|
|
4663
|
+
* .subscribe(data => console.log(data));
|
|
4664
|
+
*
|
|
4665
|
+
* // Listen for a custom Unreal event
|
|
4666
|
+
* this.unrealCallbackService
|
|
4667
|
+
* .fromUnrealCallback('cameraChanged')
|
|
4668
|
+
* .subscribe(data => console.log(data));
|
|
4669
|
+
* ```
|
|
4670
|
+
*/
|
|
4671
|
+
fromUnrealCallback(command) {
|
|
4672
|
+
return this.actions$.pipe(ofType(unrealCommandCallback), map$1(({ json }) => {
|
|
4673
|
+
if ('commandCallback' in json) {
|
|
4674
|
+
return json.commandCallback;
|
|
4675
|
+
}
|
|
4676
|
+
return json;
|
|
4677
|
+
}), filter((json) => json.command === command), map$1((data) => ({
|
|
4678
|
+
command: data.command,
|
|
4679
|
+
payload: 'payload' in data ? data.payload : null,
|
|
4680
|
+
})));
|
|
4681
|
+
}
|
|
4682
|
+
/**
|
|
4683
|
+
* Sends a command and observes the matching response by correlationId.
|
|
4684
|
+
* Replaces the old `observeCommandResponse` standalone function.
|
|
4685
|
+
*
|
|
4686
|
+
* @param data - The command data to send
|
|
4687
|
+
* @param sender - Function to send the command to Unreal
|
|
4688
|
+
* @param timeOut - Timeout in ms (default 60000)
|
|
4689
|
+
* @param dispatchOnTimeout - Whether to emit on timeout (default true)
|
|
4690
|
+
*
|
|
4691
|
+
* @example
|
|
4692
|
+
* ```ts
|
|
4693
|
+
* this.unrealCallbackService
|
|
4694
|
+
* .observeCommandResponse<FLoopBackCommand['command']>(
|
|
4695
|
+
* { command: MetaBoxCommand.FLoopBackCommand },
|
|
4696
|
+
* (data) => this.communicator.sendCommandToUnreal(data),
|
|
4697
|
+
* )
|
|
4698
|
+
* .subscribe();
|
|
4699
|
+
* ```
|
|
4700
|
+
*/
|
|
4701
|
+
observeCommandResponse(data, sender, timeOut = 60000, dispatchOnTimeout = true) {
|
|
4702
|
+
const correlationId = generateUuid();
|
|
4703
|
+
const observable = this.actions$.pipe(ofType(unrealCommandCallback), map$1(({ json }) => {
|
|
4704
|
+
// !!!IMPORTANT!!! ALL COMMANDS NEED TO CONTAIN COMMAND CALLBACKS
|
|
4705
|
+
// Some callbacks do not have commandCallback wrapper,
|
|
4706
|
+
// so first we check if it exists,
|
|
4707
|
+
// then fall back to JSON itself
|
|
4708
|
+
return 'commandCallback' in json
|
|
4709
|
+
? { json }
|
|
4710
|
+
: { json: { commandCallback: json } };
|
|
4711
|
+
}), filter(({ json }) => json.commandCallback.correlationId === correlationId), timeout(timeOut), catchError(() => dispatchOnTimeout
|
|
4712
|
+
? of({ json: { commandCallback: { correlationId: 'timeout' } } })
|
|
4713
|
+
: of(null)), take(1), tapLog('Command Response Observer'), filter(Truthy));
|
|
4714
|
+
setTimeout(() => sender({ ...data, correlationId }), 0);
|
|
4715
|
+
return observable;
|
|
4716
|
+
}
|
|
4717
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCallbackService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4718
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCallbackService }); }
|
|
4719
|
+
}
|
|
4720
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCallbackService, decorators: [{
|
|
4721
|
+
type: Injectable
|
|
4722
|
+
}] });
|
|
4723
|
+
|
|
4690
4724
|
class AfkTimeoutModalComponent {
|
|
4691
4725
|
constructor() {
|
|
4692
4726
|
this.#store = inject(Store);
|
|
@@ -4699,12 +4733,12 @@ class AfkTimeoutModalComponent {
|
|
|
4699
4733
|
resetAfk() {
|
|
4700
4734
|
this.#afkService.reset();
|
|
4701
4735
|
}
|
|
4702
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4703
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
4736
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkTimeoutModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4737
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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", "iconButton", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4704
4738
|
}
|
|
4705
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4739
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkTimeoutModalComponent, decorators: [{
|
|
4706
4740
|
type: Component,
|
|
4707
|
-
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-
|
|
4741
|
+
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"] }]
|
|
4708
4742
|
}] });
|
|
4709
4743
|
|
|
4710
4744
|
class FreezeFrameComponent {
|
|
@@ -4714,10 +4748,10 @@ class FreezeFrameComponent {
|
|
|
4714
4748
|
this.combinedFreeze = this.#store.selectSignal(selectFreezeFrameCombinedDataUrl);
|
|
4715
4749
|
}
|
|
4716
4750
|
#store;
|
|
4717
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4718
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
4751
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4752
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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 }); }
|
|
4719
4753
|
}
|
|
4720
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4754
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameComponent, decorators: [{
|
|
4721
4755
|
type: Component,
|
|
4722
4756
|
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"] }]
|
|
4723
4757
|
}] });
|
|
@@ -4745,10 +4779,10 @@ class SafePipe {
|
|
|
4745
4779
|
throw new Error(`Invalid safe type specified: ${type}`);
|
|
4746
4780
|
}
|
|
4747
4781
|
}
|
|
4748
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4749
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.
|
|
4782
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SafePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
4783
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.0", ngImport: i0, type: SafePipe, isStandalone: true, name: "safe" }); }
|
|
4750
4784
|
}
|
|
4751
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4785
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SafePipe, decorators: [{
|
|
4752
4786
|
type: Pipe,
|
|
4753
4787
|
args: [{
|
|
4754
4788
|
name: 'safe',
|
|
@@ -4762,10 +4796,10 @@ class LowBandwidthModalComponent {
|
|
|
4762
4796
|
close(value) {
|
|
4763
4797
|
this.dialogRef.close(value || false);
|
|
4764
4798
|
}
|
|
4765
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4766
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.
|
|
4799
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4800
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", 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", "iconButton", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }, { kind: "pipe", type: SafePipe, name: "safe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4767
4801
|
}
|
|
4768
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4802
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthModalComponent, decorators: [{
|
|
4769
4803
|
type: Component,
|
|
4770
4804
|
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"] }]
|
|
4771
4805
|
}] });
|
|
@@ -4777,30 +4811,27 @@ class ImageLoadingSrcComponent {
|
|
|
4777
4811
|
this.imageLoadingSrc = this.#store.selectSignal(unrealFeature.selectImageLoadingSrc);
|
|
4778
4812
|
}
|
|
4779
4813
|
#store;
|
|
4780
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4781
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
4814
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImageLoadingSrcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4815
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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 }); }
|
|
4782
4816
|
}
|
|
4783
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4817
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImageLoadingSrcComponent, decorators: [{
|
|
4784
4818
|
type: Component,
|
|
4785
4819
|
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"] }]
|
|
4786
4820
|
}] });
|
|
4787
4821
|
|
|
4788
4822
|
class StatGraphComponent {
|
|
4789
4823
|
constructor() {
|
|
4824
|
+
this.label = input.required(...(ngDevMode ? [{ debugName: "label" }] : []));
|
|
4790
4825
|
this.stat = input(...(ngDevMode ? [undefined, { debugName: "stat" }] : []));
|
|
4791
|
-
this.el = inject(ElementRef);
|
|
4792
|
-
this.graph = viewChild('graph', ...(ngDevMode ? [{ debugName: "graph" }] : []));
|
|
4793
4826
|
this.color = input('#417bc9', ...(ngDevMode ? [{ debugName: "color" }] : []));
|
|
4794
4827
|
this.tickStep = input(3, ...(ngDevMode ? [{ debugName: "tickStep" }] : []));
|
|
4795
|
-
this.
|
|
4828
|
+
this.el = inject(ElementRef);
|
|
4829
|
+
this.graph = viewChild('graph', ...(ngDevMode ? [{ debugName: "graph" }] : []));
|
|
4796
4830
|
this.data = [];
|
|
4797
4831
|
this.max = signal(0, ...(ngDevMode ? [{ debugName: "max" }] : []));
|
|
4798
4832
|
this.min = signal(0, ...(ngDevMode ? [{ debugName: "min" }] : []));
|
|
4799
4833
|
this.current = signal(0, ...(ngDevMode ? [{ debugName: "current" }] : []));
|
|
4800
|
-
effect(() =>
|
|
4801
|
-
const stat = this.stat();
|
|
4802
|
-
this.pushData(stat ?? null);
|
|
4803
|
-
});
|
|
4834
|
+
effect(() => this.pushData(this.stat()?.value ?? null));
|
|
4804
4835
|
afterNextRender({
|
|
4805
4836
|
read: () => {
|
|
4806
4837
|
const graph = this.graph();
|
|
@@ -4822,7 +4853,7 @@ class StatGraphComponent {
|
|
|
4822
4853
|
const all = this.data.filter((r) => r !== null && !isNaN(r));
|
|
4823
4854
|
this.max.set(Math.max(...all));
|
|
4824
4855
|
this.min.set(Math.min(...all));
|
|
4825
|
-
|
|
4856
|
+
const scaleY = this.canvas.height / (this.max() || 1);
|
|
4826
4857
|
this.current.set(all[all.length - 1] || 0);
|
|
4827
4858
|
this.ctx.save();
|
|
4828
4859
|
const bounds = this.el.nativeElement.getBoundingClientRect();
|
|
@@ -4830,7 +4861,7 @@ class StatGraphComponent {
|
|
|
4830
4861
|
this.canvas.height = bounds.height - 30; // -p height
|
|
4831
4862
|
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
4832
4863
|
[...this.data].reverse().forEach((val, index) => {
|
|
4833
|
-
const h = (val || 0) *
|
|
4864
|
+
const h = (val || 0) * scaleY;
|
|
4834
4865
|
this.ctx.fillStyle = this.getColor(this.color(), h);
|
|
4835
4866
|
this.ctx.fillRect(index * this.tickStep(), this.canvas.height - h, this.tickStep(), h);
|
|
4836
4867
|
});
|
|
@@ -4856,13 +4887,13 @@ class StatGraphComponent {
|
|
|
4856
4887
|
}
|
|
4857
4888
|
this.draw();
|
|
4858
4889
|
}
|
|
4859
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4860
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.
|
|
4890
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StatGraphComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4891
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.0", 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 }); }
|
|
4861
4892
|
}
|
|
4862
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4893
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StatGraphComponent, decorators: [{
|
|
4863
4894
|
type: Component,
|
|
4864
4895
|
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"] }]
|
|
4865
|
-
}], ctorParameters: () => [], propDecorators: {
|
|
4896
|
+
}], 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: [{
|
|
4866
4897
|
type: HostListener,
|
|
4867
4898
|
args: ['window:resize']
|
|
4868
4899
|
}] } });
|
|
@@ -4940,12 +4971,12 @@ class UnrealStatusComponent {
|
|
|
4940
4971
|
// Fails silently if the iframe's content window cannot be accessed
|
|
4941
4972
|
}
|
|
4942
4973
|
}
|
|
4943
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4944
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
4974
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4975
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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 }); }
|
|
4945
4976
|
}
|
|
4946
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4977
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealStatusComponent, decorators: [{
|
|
4947
4978
|
type: Component,
|
|
4948
|
-
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-
|
|
4979
|
+
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"] }]
|
|
4949
4980
|
}] });
|
|
4950
4981
|
|
|
4951
4982
|
class VideoStatsComponent {
|
|
@@ -4954,31 +4985,45 @@ class VideoStatsComponent {
|
|
|
4954
4985
|
this.store = inject(Store);
|
|
4955
4986
|
this.videoService = inject(VideoService);
|
|
4956
4987
|
this.isDevMode = inject(DevModeService).isDevMode;
|
|
4957
|
-
this.
|
|
4988
|
+
this.obs$ = this.videoService.videoStats$;
|
|
4958
4989
|
this.viewportReady = this.store.selectSignal(unrealFeature.selectViewportReady);
|
|
4959
4990
|
this.ssInfo = this.store.selectSignal(selectSignalingParameters);
|
|
4960
|
-
this.fpsTick =
|
|
4961
|
-
|
|
4962
|
-
|
|
4963
|
-
this.
|
|
4964
|
-
|
|
4965
|
-
|
|
4966
|
-
|
|
4967
|
-
|
|
4968
|
-
|
|
4969
|
-
|
|
4970
|
-
|
|
4971
|
-
|
|
4972
|
-
|
|
4973
|
-
|
|
4991
|
+
this.fpsTick = toSignal(this.obs$.pipe(map$1((stat) => ({
|
|
4992
|
+
value: stat.aggregatedStats.framesPerSecond || 0,
|
|
4993
|
+
}))));
|
|
4994
|
+
this.fpsAvgTick = toSignal(this.obs$.pipe(map$1((stat) => ({
|
|
4995
|
+
value: stat.aggregatedStats.avgFrameRate,
|
|
4996
|
+
}))));
|
|
4997
|
+
this.bitrateTick = toSignal(this.obs$.pipe(map$1((stat) => ({
|
|
4998
|
+
value: stat.aggregatedStats.bitrate,
|
|
4999
|
+
}))));
|
|
5000
|
+
this.videoQP = toSignal(this.obs$.pipe(map$1((stat) => ({
|
|
5001
|
+
value: stat.aggregatedStats.VideoEncoderQP,
|
|
5002
|
+
}))));
|
|
5003
|
+
this.bitrateAverageTick = toSignal(this.obs$.pipe(map$1((stat) => ({
|
|
5004
|
+
value: stat.aggregatedStats.avgBitrate,
|
|
5005
|
+
}))));
|
|
5006
|
+
this.videoStatus = toSignal(this.obs$.pipe(map$1((event) => this.isDevMode &&
|
|
5007
|
+
{
|
|
5008
|
+
...event.aggregatedStats,
|
|
5009
|
+
quality: event.quality,
|
|
5010
|
+
}), filter(Boolean), map$1((data) => {
|
|
5011
|
+
return this.fields
|
|
5012
|
+
.map((key) => {
|
|
5013
|
+
return {
|
|
4974
5014
|
key,
|
|
4975
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4976
5015
|
value: data[key],
|
|
4977
|
-
}
|
|
4978
|
-
|
|
4979
|
-
|
|
4980
|
-
|
|
4981
|
-
|
|
5016
|
+
};
|
|
5017
|
+
})
|
|
5018
|
+
.filter((r) => !this.elementsToShow.includes(r.key));
|
|
5019
|
+
})));
|
|
5020
|
+
this.graphList = [];
|
|
5021
|
+
this.idKey = 'com.source3d.unreal.stat';
|
|
5022
|
+
this.elementsToShow = [];
|
|
5023
|
+
this.trigger$ = new BehaviorSubject(undefined);
|
|
5024
|
+
this.getFields();
|
|
5025
|
+
}
|
|
5026
|
+
ngOnInit() {
|
|
4982
5027
|
this.fields = [
|
|
4983
5028
|
'kalmanBitrate',
|
|
4984
5029
|
'bitrateDrop',
|
|
@@ -5005,35 +5050,32 @@ class VideoStatsComponent {
|
|
|
5005
5050
|
//'pliCount',
|
|
5006
5051
|
//'sliCount',
|
|
5007
5052
|
//'transportId',
|
|
5008
|
-
//'id'
|
|
5053
|
+
//'id',
|
|
5009
5054
|
];
|
|
5010
|
-
this.graphList = signal([], ...(ngDevMode ? [{ debugName: "graphList" }] : []));
|
|
5011
|
-
this.idKey = 'com.source3d.unreal.stat';
|
|
5012
|
-
this.elementsToShow = [];
|
|
5013
|
-
this.getFields();
|
|
5014
|
-
}
|
|
5015
|
-
ngOnInit() {
|
|
5016
5055
|
this.updateGraph();
|
|
5017
5056
|
}
|
|
5018
5057
|
updateGraph() {
|
|
5019
|
-
this.graphList
|
|
5020
|
-
.map((
|
|
5058
|
+
this.graphList = this.fields.map((key) => {
|
|
5059
|
+
const stat = this.obs$.pipe(map$1((val) => {
|
|
5060
|
+
const value = val.aggregatedStats[key];
|
|
5061
|
+
return { value };
|
|
5062
|
+
}));
|
|
5021
5063
|
return {
|
|
5022
5064
|
key,
|
|
5023
5065
|
color: Math.floor(Math.random() * 16777216).toString(),
|
|
5024
|
-
stat
|
|
5066
|
+
stat,
|
|
5025
5067
|
};
|
|
5026
|
-
})
|
|
5027
|
-
|
|
5068
|
+
});
|
|
5069
|
+
this.graphList$ = of(this.graphList).pipe(combineLatestWith(this.trigger$), map$1(([graphList]) => graphList.filter((r) => this.elementsToShow.includes(r.key))));
|
|
5028
5070
|
}
|
|
5029
5071
|
toggle() {
|
|
5030
5072
|
this.collapsed.update((collapsed) => !collapsed);
|
|
5031
5073
|
this.writeFields();
|
|
5032
5074
|
}
|
|
5033
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5034
5075
|
toggleGraph($event, el, value) {
|
|
5035
5076
|
$event.stopPropagation();
|
|
5036
|
-
if ((value && typeof value !== 'number') ||
|
|
5077
|
+
if ((value && typeof value !== 'number') ||
|
|
5078
|
+
(typeof value === 'number' && isNaN(value))) {
|
|
5037
5079
|
return;
|
|
5038
5080
|
}
|
|
5039
5081
|
if (this.elementsToShow.includes(el)) {
|
|
@@ -5043,7 +5085,7 @@ class VideoStatsComponent {
|
|
|
5043
5085
|
this.elementsToShow.push(el);
|
|
5044
5086
|
}
|
|
5045
5087
|
this.writeFields();
|
|
5046
|
-
this.
|
|
5088
|
+
this.trigger$.next();
|
|
5047
5089
|
}
|
|
5048
5090
|
getFields() {
|
|
5049
5091
|
try {
|
|
@@ -5061,16 +5103,17 @@ class VideoStatsComponent {
|
|
|
5061
5103
|
elements: this.elementsToShow,
|
|
5062
5104
|
}));
|
|
5063
5105
|
}
|
|
5064
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5065
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5106
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoStatsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5107
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: VideoStatsComponent, isStandalone: true, selector: "app-video-stats", ngImport: i0, template: "@if (videoStatus() && viewportReady()) {\n <div class=\"settings-container\">\n <button (click)=\"toggle()\" class=\"gear-button\">Stats 2</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 }); }
|
|
5066
5108
|
}
|
|
5067
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoStatsComponent, decorators: [{
|
|
5068
5110
|
type: Component,
|
|
5069
|
-
args: [{ selector: 'app-video-stats', changeDetection: ChangeDetectionStrategy.OnPush, imports: [StatGraphComponent, 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
|
|
5111
|
+
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 2</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"] }]
|
|
5070
5112
|
}], ctorParameters: () => [] });
|
|
5071
5113
|
|
|
5072
5114
|
class ResumeStreamButtonComponent {
|
|
5073
5115
|
constructor() {
|
|
5116
|
+
this.actions$ = inject(Actions);
|
|
5074
5117
|
this.store = inject(Store);
|
|
5075
5118
|
this.videoService = inject(VideoService);
|
|
5076
5119
|
this.destroyRef = inject(DestroyRef);
|
|
@@ -5090,14 +5133,12 @@ class ResumeStreamButtonComponent {
|
|
|
5090
5133
|
.subscribe(() => this.onDisconnect());
|
|
5091
5134
|
}
|
|
5092
5135
|
ngAfterViewInit() {
|
|
5093
|
-
|
|
5094
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
5136
|
+
this.actions$
|
|
5137
|
+
.pipe(ofType(videoStreamInitialized), takeUntilDestroyed(this.destroyRef), filter(() => !!this.videoService.video?.paused))
|
|
5095
5138
|
.subscribe(() => {
|
|
5096
|
-
|
|
5097
|
-
|
|
5098
|
-
|
|
5099
|
-
resetAfk();
|
|
5100
|
-
}
|
|
5139
|
+
Logger.info('Simulate Press Play');
|
|
5140
|
+
this.videoService.play();
|
|
5141
|
+
this.store.dispatch(resetAfk());
|
|
5101
5142
|
});
|
|
5102
5143
|
}
|
|
5103
5144
|
connect() {
|
|
@@ -5106,12 +5147,12 @@ class ResumeStreamButtonComponent {
|
|
|
5106
5147
|
onDisconnect() {
|
|
5107
5148
|
this.isSecondStart.set(true);
|
|
5108
5149
|
}
|
|
5109
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5110
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5150
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ResumeStreamButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5151
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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", "iconButton", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5111
5152
|
}
|
|
5112
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5153
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ResumeStreamButtonComponent, decorators: [{
|
|
5113
5154
|
type: Component,
|
|
5114
|
-
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-
|
|
5155
|
+
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"] }]
|
|
5115
5156
|
}] });
|
|
5116
5157
|
|
|
5117
5158
|
class IntroSrcComponent {
|
|
@@ -5166,10 +5207,10 @@ class IntroSrcComponent {
|
|
|
5166
5207
|
videoElement.innerHTML += 'Browser not supported';
|
|
5167
5208
|
videoContainer.appendChild(videoElement);
|
|
5168
5209
|
}
|
|
5169
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5170
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5210
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IntroSrcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5211
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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 }); }
|
|
5171
5212
|
}
|
|
5172
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5213
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IntroSrcComponent, decorators: [{
|
|
5173
5214
|
type: Component,
|
|
5174
5215
|
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"] }]
|
|
5175
5216
|
}], ctorParameters: () => [], propDecorators: { videoElement: [{ type: i0.ViewChild, args: ['videoPlayerCover', { isSignal: true }] }] } });
|
|
@@ -5205,6 +5246,7 @@ class UnrealSceneComponent {
|
|
|
5205
5246
|
this.changeMouseOverScene = output();
|
|
5206
5247
|
this.width = FULL_HD_WIDTH;
|
|
5207
5248
|
this.height = FULL_HD_HEIGHT;
|
|
5249
|
+
this.actions$ = inject(Actions);
|
|
5208
5250
|
this.store = inject(Store);
|
|
5209
5251
|
this.isExistMatchUrls = this.store.selectSignal(selectIsExistMatchUrls);
|
|
5210
5252
|
this.isDevMode = inject(DevModeService).isDevMode;
|
|
@@ -5242,7 +5284,7 @@ class UnrealSceneComponent {
|
|
|
5242
5284
|
this.width = width;
|
|
5243
5285
|
this.height = height;
|
|
5244
5286
|
}));
|
|
5245
|
-
const resizeRequired$ = merge(
|
|
5287
|
+
const resizeRequired$ = merge(this.actions$.pipe(ofType(videoStreamInitialized)), fromEvent(window, 'resize'));
|
|
5246
5288
|
const videoStreamSizeChanged$ = this.videoService?.videoStats$.pipe(filter(() => !this.isFreezeFrameLoading()), map$1((stats) => ({
|
|
5247
5289
|
w: stats.aggregatedStats.frameWidth || 0,
|
|
5248
5290
|
h: stats.aggregatedStats.frameHeight || 0,
|
|
@@ -5263,11 +5305,9 @@ class UnrealSceneComponent {
|
|
|
5263
5305
|
this.store.dispatch(changeStreamResolutionAction({ width: size.w, height: size.h }));
|
|
5264
5306
|
this.sendResize(size);
|
|
5265
5307
|
});
|
|
5266
|
-
|
|
5267
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
5268
|
-
.subscribe(() =>
|
|
5269
|
-
this.sendResize(this.resizeValues);
|
|
5270
|
-
});
|
|
5308
|
+
this.actions$
|
|
5309
|
+
.pipe(ofType(forceResizeViewport), takeUntilDestroyed(this.destroyRef))
|
|
5310
|
+
.subscribe(() => this.sendResize(this.resizeValues));
|
|
5271
5311
|
}
|
|
5272
5312
|
adaptVideo(size) {
|
|
5273
5313
|
const video = this.videoService.video;
|
|
@@ -5283,7 +5323,7 @@ class UnrealSceneComponent {
|
|
|
5283
5323
|
video.style.height = `${video.height}px`;
|
|
5284
5324
|
}
|
|
5285
5325
|
}
|
|
5286
|
-
|
|
5326
|
+
this.store.dispatch(videoAdaptedToContainer());
|
|
5287
5327
|
}
|
|
5288
5328
|
/**
|
|
5289
5329
|
* This method calculates the dimensions for resizing a layout in a configurator stream.
|
|
@@ -5360,10 +5400,10 @@ class UnrealSceneComponent {
|
|
|
5360
5400
|
makeEven(value) {
|
|
5361
5401
|
return Math.floor((value + 1) / 2) * 2;
|
|
5362
5402
|
}
|
|
5363
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5364
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", 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 }); }
|
|
5403
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealSceneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5404
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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 }); }
|
|
5365
5405
|
}
|
|
5366
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5406
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealSceneComponent, decorators: [{
|
|
5367
5407
|
type: Component,
|
|
5368
5408
|
args: [{ selector: 'app-unreal-scene', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
5369
5409
|
AfkTimeoutModalComponent,
|
|
@@ -5402,16 +5442,17 @@ class WebrtcErrorModalComponent {
|
|
|
5402
5442
|
this.close();
|
|
5403
5443
|
});
|
|
5404
5444
|
}
|
|
5405
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5406
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.
|
|
5445
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebrtcErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5446
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.0", 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 ::ng-deep .ng-scroll-content{--_scrollbar-content-width: initial;--_viewport-padding-right: 12px}.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", "iconButton", "srcButtonConfig", "formID", "data-testid", "ariaLabel"], outputs: ["onClick", "onSubmit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5407
5447
|
}
|
|
5408
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5448
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebrtcErrorModalComponent, decorators: [{
|
|
5409
5449
|
type: Component,
|
|
5410
|
-
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 ::ng-deep .ng-scroll-content{--_scrollbar-content-width: initial;--_viewport-padding-right: 12px}.src-modal__body{width:100%}.src-modal__body p{color:var(--src-
|
|
5450
|
+
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 ::ng-deep .ng-scroll-content{--_scrollbar-content-width: initial;--_viewport-padding-right: 12px}.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"] }]
|
|
5411
5451
|
}] });
|
|
5412
5452
|
|
|
5413
5453
|
class FilterSettingsComponent {
|
|
5414
5454
|
constructor() {
|
|
5455
|
+
this.store = inject(Store);
|
|
5415
5456
|
this.storageKey = 'LBMFilterSettings';
|
|
5416
5457
|
this.defaultFilterModel = { ...DefaultFilterModel };
|
|
5417
5458
|
this.settings = { ...DefaultFilterModel };
|
|
@@ -5432,16 +5473,16 @@ class FilterSettingsComponent {
|
|
|
5432
5473
|
}, {});
|
|
5433
5474
|
this.dispatch({ ...DefaultFilterModel, ...valid });
|
|
5434
5475
|
}
|
|
5435
|
-
dispatch(
|
|
5476
|
+
dispatch(settings) {
|
|
5436
5477
|
try {
|
|
5437
|
-
localStorage.setItem(this.storageKey, JSON.stringify(
|
|
5478
|
+
localStorage.setItem(this.storageKey, JSON.stringify(settings));
|
|
5438
5479
|
}
|
|
5439
5480
|
catch (e) {
|
|
5440
5481
|
Logger.error('Storage not available, Error saving filter settings:', e);
|
|
5441
5482
|
}
|
|
5442
|
-
Object.assign(this.settings,
|
|
5443
|
-
Object.assign(FilterModel,
|
|
5444
|
-
|
|
5483
|
+
Object.assign(this.settings, settings);
|
|
5484
|
+
Object.assign(FilterModel, settings);
|
|
5485
|
+
this.store.dispatch(setKalmanSettings({ settings }));
|
|
5445
5486
|
}
|
|
5446
5487
|
reset() {
|
|
5447
5488
|
this.dispatch({
|
|
@@ -5449,10 +5490,10 @@ class FilterSettingsComponent {
|
|
|
5449
5490
|
panelOpen: this.settings.panelOpen,
|
|
5450
5491
|
});
|
|
5451
5492
|
}
|
|
5452
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5453
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5493
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FilterSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5494
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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 }); }
|
|
5454
5495
|
}
|
|
5455
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5496
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FilterSettingsComponent, decorators: [{
|
|
5456
5497
|
type: Component,
|
|
5457
5498
|
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"] }]
|
|
5458
5499
|
}] });
|
|
@@ -5475,7 +5516,7 @@ class LowBandwidthDetectorComponent {
|
|
|
5475
5516
|
.pipe(combineLatestWith(this.isLowBandwidth$), map(([viewPortReady, isLowBandwidth]) => viewPortReady && !isLowBandwidth))
|
|
5476
5517
|
.pipe(share());
|
|
5477
5518
|
this.reTrigger$ = this.monitoringTrigger$.pipe(map(() => ({ quality: 'lime' })));
|
|
5478
|
-
this.canSwitchToLowBand$ = this.monitoringTrigger$.pipe(debounceTime(100), switchMap((canSwitch) => concat(of(false), timer(FilterModel.monitoringDelayTime).pipe(map(() => canSwitch))).pipe(take(2), takeUntil$1(this.monitoringTrigger$))), distinctUntilChanged$1(),
|
|
5519
|
+
this.canSwitchToLowBand$ = this.monitoringTrigger$.pipe(debounceTime(100), switchMap((canSwitch) => concat(of(false), timer(FilterModel.monitoringDelayTime).pipe(map(() => canSwitch))).pipe(take(2), takeUntil$1(this.monitoringTrigger$))), distinctUntilChanged$1(), share());
|
|
5479
5520
|
this.videoQuality$ = merge(this.nativeQuality$, this.reTrigger$).pipe(share(), takeUntil$1(this.viewPortDestroyedTrigger$));
|
|
5480
5521
|
this.fps$ = this.aggregatedStats$.pipe(map((data) => data.framesPerSecond || 0));
|
|
5481
5522
|
this.bitrateDrop$ = this.aggregatedStats$.pipe(map((data) => data.dataFlowCheckResult), filter((br) => br.isDropDetected), takeUntil$1(merge(this.viewPortDestroyedTrigger$, this.reTrigger$)));
|
|
@@ -5557,18 +5598,19 @@ class LowBandwidthDetectorComponent {
|
|
|
5557
5598
|
this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));
|
|
5558
5599
|
});
|
|
5559
5600
|
}
|
|
5560
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5561
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5601
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthDetectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5602
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", 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);-webkit-text-decoration-line:underline;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 }); }
|
|
5562
5603
|
}
|
|
5563
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthDetectorComponent, decorators: [{
|
|
5564
5605
|
type: Component,
|
|
5565
5606
|
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);-webkit-text-decoration-line:underline;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"] }]
|
|
5566
5607
|
}] });
|
|
5567
5608
|
|
|
5568
5609
|
function provideAngularUnrealModule(config) {
|
|
5569
5610
|
return makeEnvironmentProviders([
|
|
5611
|
+
provideState(commandsFeature),
|
|
5570
5612
|
provideState(unrealFeature),
|
|
5571
|
-
provideEffects([UnrealEffects]),
|
|
5613
|
+
provideEffects([CommandsEffects, UnrealEffects]),
|
|
5572
5614
|
ConsoleExtensionsService,
|
|
5573
5615
|
InputService,
|
|
5574
5616
|
VideoService,
|
|
@@ -5578,6 +5620,7 @@ function provideAngularUnrealModule(config) {
|
|
|
5578
5620
|
FileHandlerService,
|
|
5579
5621
|
FpsMonitorService,
|
|
5580
5622
|
AnalyticsService,
|
|
5623
|
+
UnrealCallbackService,
|
|
5581
5624
|
{
|
|
5582
5625
|
provide: StreamStatusTelemetryService,
|
|
5583
5626
|
useClass: config?.playwright
|
|
@@ -5647,5 +5690,5 @@ function provideAngularUnrealModule(config) {
|
|
|
5647
5690
|
* Generated bundle index. Do not edit.
|
|
5648
5691
|
*/
|
|
5649
5692
|
|
|
5650
|
-
export { AFKService, AfkPlaywrightService, AfkTimeoutModalComponent, AggregatorPlaywrightService, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, CommandTelemetryPlaywrightService, CommandTelemetryService, ConfigHandler, ConsoleExtensionsPlaywrightService, 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, FileReceiverPlaywrightService, FileReceiverService, FilterSettingsComponent, FpsMonitorService, FreezeFrameComponent, FreezeFramePlaywrightService, FreezeFrameService, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputPlaywrightService, 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, SignallingPlaywrightService, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryPlaywrightService, StreamStatusTelemetryService, SubService, ToClientMessage, UNREAL_CONFIG, UnrealCommunicatorPlaywrightService, UnrealCommunicatorService, UnrealEffects,
|
|
5693
|
+
export { AFKService, AfkPlaywrightService, AfkTimeoutModalComponent, AggregatorPlaywrightService, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, CommandTelemetryPlaywrightService, CommandTelemetryService, CommandsEffects, ConfigHandler, ConsoleExtensionsPlaywrightService, 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, FileReceiverPlaywrightService, FileReceiverService, FilterSettingsComponent, FpsMonitorService, FreezeFrameComponent, FreezeFramePlaywrightService, FreezeFrameService, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputPlaywrightService, 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, SignallingPlaywrightService, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryPlaywrightService, StreamStatusTelemetryService, SubService, ToClientMessage, UNREAL_CONFIG, UnrealCallbackService, UnrealCommunicatorPlaywrightService, 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, 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, getRtcErrorMessage, iceConnectionFailed, initSignalling, keepMaxUntilReset, provideAngularUnrealModule, qpToQuality, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, resetAfk, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetWarnTimeout, saveAnalyticsEvent, selectClientAndViewIds, selectCommandProgress, selectCommandsInProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsLoaderScreenVisible, selectIsShowPopupWithoutAutoStart, selectIsVideoPlayingAndDataChannelConnected, selectLastCommandInProgress, 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 };
|
|
5651
5694
|
//# sourceMappingURL=3dsource-angular-unreal-module.mjs.map
|