@3dsource/angular-unreal-module 0.0.100 → 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,12 +1,12 @@
|
|
|
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';
|
|
@@ -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`);
|
|
@@ -215,6 +218,9 @@ const iceConnectionFailed = createAction(scoped `ice connection failed`, props()
|
|
|
215
218
|
const forceResizeViewport = createAction(scoped `force resize viewport`);
|
|
216
219
|
const videoAdaptedToContainer = createAction(scoped `video adapted to container`);
|
|
217
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`);
|
|
218
224
|
|
|
219
225
|
const WSCloseCode_NORMAL_CLOSURE = 3000;
|
|
220
226
|
const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;
|
|
@@ -279,9 +285,246 @@ const OrchestrationMessageTypes = {
|
|
|
279
285
|
interruptClientStream: 'interruptClientStream',
|
|
280
286
|
};
|
|
281
287
|
|
|
282
|
-
const
|
|
283
|
-
|
|
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,
|
|
284
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
|
+
});
|
|
285
528
|
|
|
286
529
|
function AnswerHandler(msg) {
|
|
287
530
|
this.onWebRtcAnswer$.next(msg);
|
|
@@ -377,25 +620,6 @@ const keepMaxUntilReset = (reset$) => {
|
|
|
377
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));
|
|
378
621
|
};
|
|
379
622
|
|
|
380
|
-
function observeCommandResponse(data, sender, timeOut = 60000, dispatchOnTimeout = true) {
|
|
381
|
-
const correlationId = generateUuid();
|
|
382
|
-
const out = { ...data, correlationId };
|
|
383
|
-
const observable = fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(map$1(({ json }) => {
|
|
384
|
-
// Some callbacks do not have commandCallback wrapper,
|
|
385
|
-
// so first we check if it exists,
|
|
386
|
-
// then fall back to JSON itself
|
|
387
|
-
return 'commandCallback' in json
|
|
388
|
-
? { json }
|
|
389
|
-
: { json: { commandCallback: json } };
|
|
390
|
-
}), filter(({ json }) => {
|
|
391
|
-
return json.commandCallback.correlationId === correlationId;
|
|
392
|
-
}), timeout(timeOut), catchError(() => dispatchOnTimeout
|
|
393
|
-
? of({ json: { commandCallback: { correlationId: 'timeout' } } })
|
|
394
|
-
: of(null)), take(1), tapLog('Command Response Observer'), filter(Truthy));
|
|
395
|
-
setTimeout(() => sender(out), 0);
|
|
396
|
-
return observable;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
623
|
function decodeData(anyData) {
|
|
400
624
|
try {
|
|
401
625
|
return new TextDecoder('utf-16').decode(anyData);
|
|
@@ -500,40 +724,6 @@ function getRtcErrorMessage(code) {
|
|
|
500
724
|
return errorCodes[`code${code}`];
|
|
501
725
|
}
|
|
502
726
|
|
|
503
|
-
/**
|
|
504
|
-
* UnrealInternalSignalEvents commands list wrapper listener
|
|
505
|
-
* @param event
|
|
506
|
-
*/
|
|
507
|
-
function fromSignal(event) {
|
|
508
|
-
return Signal.on(event).pipe(map$1((data) => data && typeof data === 'object' && 'detail' in data ? data.detail : ''));
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* UnrealInternalSignalEvents commands list wrapper sender
|
|
512
|
-
* @param event
|
|
513
|
-
* @param args
|
|
514
|
-
*/
|
|
515
|
-
function sendSignal(event, ...args) {
|
|
516
|
-
Signal.broadcast(event, { detail: args?.[0] || null });
|
|
517
|
-
}
|
|
518
|
-
function fromUnrealCallBackSignal(command) {
|
|
519
|
-
return fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(map$1((data) => data?.json), map$1((json) => {
|
|
520
|
-
if ('commandCallback' in json) {
|
|
521
|
-
return json?.commandCallback;
|
|
522
|
-
}
|
|
523
|
-
return json;
|
|
524
|
-
}), filter((json) => json.command === command), map$1((data) => data), map$1((data) => {
|
|
525
|
-
if ('payload' in data) {
|
|
526
|
-
return {
|
|
527
|
-
command: data.command,
|
|
528
|
-
payload: data?.payload,
|
|
529
|
-
};
|
|
530
|
-
}
|
|
531
|
-
return {
|
|
532
|
-
command: data.command,
|
|
533
|
-
};
|
|
534
|
-
}));
|
|
535
|
-
}
|
|
536
|
-
|
|
537
727
|
const floatToSmoothPercents = () => {
|
|
538
728
|
return (source) => source.pipe(scan((acc, value) => ({
|
|
539
729
|
previous: acc.current,
|
|
@@ -669,322 +859,148 @@ class LatencyTimings {
|
|
|
669
859
|
this.UETransmissionTimeMs = null;
|
|
670
860
|
this.BrowserReceiptTimeMs = null;
|
|
671
861
|
this.FrameDisplayDeltaTimeMs = null;
|
|
672
|
-
}
|
|
673
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
674
|
-
SetUETimings(UETimings) {
|
|
675
|
-
this.UEReceiptTimeMs = UETimings.ReceiptTimeMs;
|
|
676
|
-
this.UEEncodeMs = UETimings.EncodeMs;
|
|
677
|
-
this.UECaptureToSendMs = UETimings.CaptureToSendMs;
|
|
678
|
-
this.UETransmissionTimeMs = UETimings.TransmissionTimeMs;
|
|
679
|
-
this.BrowserReceiptTimeMs = Date.now();
|
|
680
|
-
}
|
|
681
|
-
SetFrameDisplayDeltaTime(DeltaTimeMs) {
|
|
682
|
-
if (this.FrameDisplayDeltaTimeMs == null) {
|
|
683
|
-
this.FrameDisplayDeltaTimeMs = Math.round(DeltaTimeMs);
|
|
684
|
-
}
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
function qpToQuality(VideoEncoderQP) {
|
|
689
|
-
const orangeQP = 26;
|
|
690
|
-
const redQP = 35;
|
|
691
|
-
let quality = 'lime';
|
|
692
|
-
if (VideoEncoderQP > redQP) {
|
|
693
|
-
quality = 'red';
|
|
694
|
-
}
|
|
695
|
-
else if (VideoEncoderQP > orangeQP) {
|
|
696
|
-
quality = 'orange';
|
|
697
|
-
}
|
|
698
|
-
return quality;
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
});
|
|
713
|
-
out.totalCommandsCompleted
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
isFirstSuccessLoad: false,
|
|
732
|
-
isAfkTimerVisible: false,
|
|
733
|
-
afkCountdown: 0,
|
|
734
|
-
lowBandwidth: false,
|
|
735
|
-
cirrusConnected: false,
|
|
736
|
-
establishingConnection: false,
|
|
737
|
-
isReconnecting: false,
|
|
738
|
-
viewportReady: false,
|
|
739
|
-
dataChannelConnected: false,
|
|
740
|
-
isVideoPlaying: false,
|
|
741
|
-
statusPercentSignallingServer: null,
|
|
742
|
-
statusMessage: null,
|
|
743
|
-
errorMessage: null,
|
|
744
|
-
ssInfo: null,
|
|
745
|
-
ssData: null,
|
|
746
|
-
streamResolution: { width: null, height: null },
|
|
747
|
-
freezeFrameFromVideo: { dataUrl: null, progress: null },
|
|
748
|
-
freezeFrame: { dataUrl: null, progress: null },
|
|
749
|
-
disconnectReason: DisconnectReason.None,
|
|
750
|
-
awsInstance: {
|
|
751
|
-
wsUrl: null,
|
|
752
|
-
instanceName: null,
|
|
753
|
-
pollingUrl: null,
|
|
754
|
-
progressComplete: 0,
|
|
755
|
-
},
|
|
756
|
-
streamConfig: {
|
|
757
|
-
autoStart: true,
|
|
758
|
-
warnTimeout: DEFAULT_AFK_TIMEOUT,
|
|
759
|
-
},
|
|
760
|
-
loaderCommands: {
|
|
761
|
-
commandsInProgress: [],
|
|
762
|
-
totalCommandsStarted: 0,
|
|
763
|
-
totalCommandsCompleted: 0,
|
|
764
|
-
},
|
|
765
|
-
matchUrls: [],
|
|
766
|
-
streamClientCompanyId: '',
|
|
767
|
-
streamViewId: 'default',
|
|
768
|
-
videoIntroSrc: null,
|
|
769
|
-
imageIntroSrc: null,
|
|
770
|
-
imageLoadingSrc: '',
|
|
771
|
-
analyticsEvent: null,
|
|
772
|
-
};
|
|
773
|
-
const unrealReducer = createReducer(initialState, on(changeLowBandwidth, (state, { lowBandwidth, stats }) => ({
|
|
774
|
-
...state,
|
|
775
|
-
lowBandwidth: lowBandwidth,
|
|
776
|
-
lowBandwidthStats: lowBandwidth ? stats : undefined,
|
|
777
|
-
})), on(changeStatusMainVideoOnScene, (state, { isVideoPlaying }) => {
|
|
778
|
-
return { ...state, isVideoPlaying: isVideoPlaying };
|
|
779
|
-
}), on(setAwsInstance, (state, { instanceName, wsUrl, pollingUrl }) => {
|
|
780
|
-
return { ...state, awsInstance: { instanceName, wsUrl, pollingUrl } };
|
|
781
|
-
}), on(setViewportReady, (state) => {
|
|
782
|
-
return {
|
|
783
|
-
...state,
|
|
784
|
-
viewportReady: true,
|
|
785
|
-
statusMessage: null,
|
|
786
|
-
errorMessage: null,
|
|
787
|
-
};
|
|
788
|
-
}), on(setViewportNotReady, (state) => {
|
|
789
|
-
return { ...state, viewportReady: false };
|
|
790
|
-
}), on(updateCirrusInfo, (state, { ssInfo, ssData }) => {
|
|
791
|
-
return {
|
|
792
|
-
...state,
|
|
793
|
-
ssInfo: ssInfo, // For back compatibility
|
|
794
|
-
ssData: ssData, // Contains all the data from the ssInfo as an object
|
|
795
|
-
};
|
|
796
|
-
}), on(changeStreamResolutionSuccessAction, (state, { width, height }) => {
|
|
797
|
-
return { ...state, streamResolution: { width: width, height: height } };
|
|
798
|
-
}), on(setFreezeFrame, (state, freezeFrame) => {
|
|
799
|
-
return {
|
|
800
|
-
...state,
|
|
801
|
-
freezeFrame: {
|
|
802
|
-
dataUrl: freezeFrame.progress === 0 ||
|
|
803
|
-
freezeFrame.progress === 1 ||
|
|
804
|
-
freezeFrame.progress === null
|
|
805
|
-
? freezeFrame.dataUrl
|
|
806
|
-
: state.freezeFrame.dataUrl,
|
|
807
|
-
progress: freezeFrame.progress || null,
|
|
808
|
-
},
|
|
809
|
-
};
|
|
810
|
-
}), on(disconnectStream, (state, errorMessage) => {
|
|
811
|
-
if (state.dataChannelConnected ||
|
|
812
|
-
state.disconnectReason === DisconnectReason.Destroy) {
|
|
813
|
-
return state;
|
|
814
|
-
}
|
|
815
|
-
return {
|
|
816
|
-
...state,
|
|
817
|
-
errorMessage,
|
|
818
|
-
statusMessage: null,
|
|
819
|
-
wasInitialized: true,
|
|
820
|
-
};
|
|
821
|
-
}), on(setFreezeFrameFromVideo, (state, freezeFrameFromVideo) => {
|
|
822
|
-
return {
|
|
823
|
-
...state,
|
|
824
|
-
freezeFrameFromVideo: {
|
|
825
|
-
dataUrl: freezeFrameFromVideo.dataUrl,
|
|
826
|
-
progress: freezeFrameFromVideo.progress || null,
|
|
827
|
-
},
|
|
828
|
-
};
|
|
829
|
-
}), on(setStatusMessage, (state, { statusMessage }) => {
|
|
830
|
-
return { ...state, statusMessage };
|
|
831
|
-
}), on(setEstablishingConnection, (state, { value }) => {
|
|
832
|
-
return { ...state, establishingConnection: value };
|
|
833
|
-
}), on(setStatusPercentSignallingServer, (state, { percent }) => {
|
|
834
|
-
return { ...state, statusPercentSignallingServer: percent };
|
|
835
|
-
}), on(dataChannelConnected, (state, { statusMessage }) => {
|
|
836
|
-
return {
|
|
837
|
-
...state,
|
|
838
|
-
statusMessage,
|
|
839
|
-
dataChannelConnected: true,
|
|
840
|
-
establishingConnection: false,
|
|
841
|
-
wasInitialized: true,
|
|
842
|
-
};
|
|
843
|
-
}), on(setConfig, startStream, (state, { config }) => {
|
|
844
|
-
return { ...state, streamConfig: { ...state.streamConfig, ...config } };
|
|
845
|
-
}), on(resetConfig, (state) => {
|
|
846
|
-
return { ...state, streamConfig: initialState.streamConfig };
|
|
847
|
-
}), on(resetWarnTimeout, (state) => {
|
|
848
|
-
return {
|
|
849
|
-
...state,
|
|
850
|
-
streamConfig: { ...state.streamConfig, warnTimeout: DEFAULT_AFK_TIMEOUT },
|
|
851
|
-
};
|
|
852
|
-
}), on(initSignalling, (state, { resetDisconnectionReason = true }) => {
|
|
853
|
-
return {
|
|
854
|
-
...state,
|
|
855
|
-
disconnectReason: resetDisconnectionReason
|
|
856
|
-
? DisconnectReason.None
|
|
857
|
-
: state.disconnectReason,
|
|
858
|
-
};
|
|
859
|
-
}), on(destroyRemoteConnections, (state, { reason }) => {
|
|
860
|
-
if (state.disconnectReason === DisconnectReason.Destroy) {
|
|
861
|
-
return state;
|
|
862
|
-
}
|
|
863
|
-
return { ...state, disconnectReason: reason };
|
|
864
|
-
}), on(reconnectPeerSuccess, (state) => {
|
|
865
|
-
return { ...state, isReconnecting: false };
|
|
866
|
-
}), on(setSignalingName, (state, { instanceName }) => {
|
|
867
|
-
return { ...state, awsInstance: { ...state.awsInstance, instanceName } };
|
|
868
|
-
}), on(setOrchestrationParameters, (state, { instanceName, streamRequestId, eta }) => {
|
|
869
|
-
return {
|
|
870
|
-
...state,
|
|
871
|
-
awsInstance: {
|
|
872
|
-
...state.awsInstance,
|
|
873
|
-
message: undefined,
|
|
874
|
-
instanceName,
|
|
875
|
-
streamRequestId,
|
|
876
|
-
eta,
|
|
877
|
-
},
|
|
878
|
-
};
|
|
879
|
-
}), on(setOrchestrationProgress, (state, { progressComplete }) => {
|
|
880
|
-
return {
|
|
881
|
-
...state,
|
|
882
|
-
awsInstance: {
|
|
883
|
-
...state.awsInstance,
|
|
884
|
-
progressComplete,
|
|
885
|
-
},
|
|
886
|
-
};
|
|
887
|
-
}), on(setOrchestrationMessage, (state, { message }) => {
|
|
888
|
-
return {
|
|
889
|
-
...state,
|
|
890
|
-
awsInstance: {
|
|
891
|
-
...state.awsInstance,
|
|
892
|
-
message,
|
|
893
|
-
},
|
|
894
|
-
};
|
|
895
|
-
}), on(setLoopBackCommandIsCompleted, (state) => {
|
|
896
|
-
return { ...state, isFirstSuccessLoad: true };
|
|
897
|
-
}), on(setAfkTimerCountdown, (state, { countdown }) => {
|
|
898
|
-
return { ...state, afkCountdown: countdown };
|
|
899
|
-
}), on(setAfkTimerVisible, (state) => {
|
|
900
|
-
return { ...state, isAfkTimerVisible: true };
|
|
901
|
-
}), on(setAfkTimerHide, (state) => {
|
|
902
|
-
return { ...state, isAfkTimerVisible: false, afkCountdown: 0 };
|
|
903
|
-
}), on(setOrchestrationContext, (state, { urls, environmentId, streamRequestContext }) => {
|
|
904
|
-
return {
|
|
905
|
-
...state,
|
|
906
|
-
matchUrls: urls,
|
|
907
|
-
environmentId,
|
|
908
|
-
streamRequestContext,
|
|
909
|
-
};
|
|
910
|
-
}), on(setStreamClientCompanyId, (state, { id }) => {
|
|
911
|
-
return { ...state, streamClientCompanyId: id };
|
|
912
|
-
}), on(setStreamViewId, (state, { id }) => {
|
|
913
|
-
return { ...state, streamViewId: id };
|
|
914
|
-
}), on(setIntroImageSrc, (state, { src }) => {
|
|
915
|
-
return { ...state, imageIntroSrc: src };
|
|
916
|
-
}), on(setLoadingImageSrc, (state, { src }) => {
|
|
917
|
-
return { ...state, imageLoadingSrc: src };
|
|
918
|
-
}), on(setIntroVideoSrc, (state, { src }) => {
|
|
919
|
-
return { ...state, videoIntroSrc: src };
|
|
920
|
-
}), on(resetIntroSrc, (state) => {
|
|
921
|
-
return { ...state, imageIntroSrc: '', videoIntroSrc: '' };
|
|
922
|
-
}), on(saveAnalyticsEvent, (state, { event }) => {
|
|
923
|
-
return { ...state, analyticsEvent: event };
|
|
924
|
-
}), on(commandStarted, (state, { id, command }) => {
|
|
862
|
+
}
|
|
863
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
864
|
+
SetUETimings(UETimings) {
|
|
865
|
+
this.UEReceiptTimeMs = UETimings.ReceiptTimeMs;
|
|
866
|
+
this.UEEncodeMs = UETimings.EncodeMs;
|
|
867
|
+
this.UECaptureToSendMs = UETimings.CaptureToSendMs;
|
|
868
|
+
this.UETransmissionTimeMs = UETimings.TransmissionTimeMs;
|
|
869
|
+
this.BrowserReceiptTimeMs = Date.now();
|
|
870
|
+
}
|
|
871
|
+
SetFrameDisplayDeltaTime(DeltaTimeMs) {
|
|
872
|
+
if (this.FrameDisplayDeltaTimeMs == null) {
|
|
873
|
+
this.FrameDisplayDeltaTimeMs = Math.round(DeltaTimeMs);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
function qpToQuality(VideoEncoderQP) {
|
|
879
|
+
const orangeQP = 26;
|
|
880
|
+
const redQP = 35;
|
|
881
|
+
let quality = 'lime';
|
|
882
|
+
if (VideoEncoderQP > redQP) {
|
|
883
|
+
quality = 'red';
|
|
884
|
+
}
|
|
885
|
+
else if (VideoEncoderQP > orangeQP) {
|
|
886
|
+
quality = 'orange';
|
|
887
|
+
}
|
|
888
|
+
return quality;
|
|
889
|
+
}
|
|
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
|
+
|
|
899
|
+
const removeExileCommands = (state, idToRemove) => {
|
|
900
|
+
const exileTimeout = 10000;
|
|
901
|
+
const out = { ...state };
|
|
902
|
+
out.commandsInProgress = out.commandsInProgress.filter(whereNot({ id: idToRemove }));
|
|
903
|
+
out.totalCommandsCompleted++;
|
|
904
|
+
const time = new Date().getTime();
|
|
905
|
+
const markForDelete = [];
|
|
906
|
+
Object.entries(out.commandsInProgress).forEach(([, { id, timeStamp }]) => {
|
|
907
|
+
if (time - timeStamp > exileTimeout) {
|
|
908
|
+
markForDelete.push(id);
|
|
909
|
+
}
|
|
910
|
+
});
|
|
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 }) => {
|
|
925
921
|
return {
|
|
926
922
|
...state,
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
{ id, command, timeStamp: new Date().getTime() },
|
|
933
|
-
],
|
|
934
|
-
},
|
|
923
|
+
totalCommandsStarted: state.totalCommandsStarted + 1,
|
|
924
|
+
commandsInProgress: [
|
|
925
|
+
...state.commandsInProgress,
|
|
926
|
+
{ id, command, timeStamp: new Date().getTime() },
|
|
927
|
+
],
|
|
935
928
|
};
|
|
936
929
|
}), on(commandCompleted, (state, { id }) => {
|
|
937
930
|
return {
|
|
938
931
|
...state,
|
|
939
|
-
|
|
940
|
-
};
|
|
941
|
-
}), on(setCirrusConnected, (state) => {
|
|
942
|
-
return { ...state, cirrusConnected: true };
|
|
943
|
-
}), on(setCirrusDisconnected, (state) => {
|
|
944
|
-
return {
|
|
945
|
-
...initialState,
|
|
946
|
-
establishingConnection: state.establishingConnection,
|
|
947
|
-
disconnectReason: state.disconnectReason,
|
|
948
|
-
wasInitialized: state.wasInitialized,
|
|
949
|
-
isFirstSuccessLoad: state.isFirstSuccessLoad,
|
|
950
|
-
matchUrls: state.matchUrls,
|
|
951
|
-
streamClientCompanyId: state.streamClientCompanyId,
|
|
952
|
-
streamViewId: state.streamViewId,
|
|
953
|
-
imageIntroSrc: state.imageIntroSrc,
|
|
954
|
-
videoIntroSrc: state.videoIntroSrc,
|
|
955
|
-
imageLoadingSrc: state.imageLoadingSrc,
|
|
956
|
-
environmentId: state.environmentId,
|
|
957
|
-
streamRequestContext: state.streamRequestContext,
|
|
958
|
-
streamConfig: state.streamConfig,
|
|
959
|
-
};
|
|
960
|
-
}), on(dropConnection, (state) => {
|
|
961
|
-
return { ...state, establishingConnection: false };
|
|
962
|
-
}), on(resetDataChannelForReconnect, (state) => {
|
|
963
|
-
return {
|
|
964
|
-
...state,
|
|
965
|
-
isReconnecting: true,
|
|
966
|
-
dataChannelConnected: false,
|
|
967
|
-
viewportReady: false,
|
|
968
|
-
statusMessage: 'Reconnecting...',
|
|
969
|
-
};
|
|
970
|
-
}), on(setUnrealPlaywrightConfig, (state) => {
|
|
971
|
-
return {
|
|
972
|
-
...state,
|
|
973
|
-
wasInitialized: true,
|
|
974
|
-
isFirstSuccessLoad: true,
|
|
975
|
-
cirrusConnected: true,
|
|
976
|
-
viewportReady: true,
|
|
977
|
-
dataChannelConnected: true,
|
|
978
|
-
isVideoPlaying: true,
|
|
932
|
+
...removeExileCommands(state, id),
|
|
979
933
|
};
|
|
980
|
-
}), on(destroyUnrealScene, () => {
|
|
934
|
+
}), on(destroyUnrealScene, setCirrusDisconnected, () => {
|
|
981
935
|
return initialState;
|
|
982
936
|
}));
|
|
983
937
|
|
|
984
|
-
const
|
|
985
|
-
name: '
|
|
986
|
-
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);
|
|
987
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);
|
|
988
1004
|
|
|
989
1005
|
class UnrealErrorModalComponent {
|
|
990
1006
|
constructor() {
|
|
@@ -995,10 +1011,10 @@ class UnrealErrorModalComponent {
|
|
|
995
1011
|
close() {
|
|
996
1012
|
this.#dialogRef.close();
|
|
997
1013
|
}
|
|
998
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
999
|
-
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 }); }
|
|
1000
1016
|
}
|
|
1001
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1017
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealErrorModalComponent, decorators: [{
|
|
1002
1018
|
type: Component,
|
|
1003
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"] }]
|
|
1004
1020
|
}] });
|
|
@@ -1017,6 +1033,7 @@ class UnrealEffects {
|
|
|
1017
1033
|
this.commandTelemetryService = inject(CommandTelemetryService);
|
|
1018
1034
|
this.signallingService = inject(SignallingService);
|
|
1019
1035
|
this.videoService = inject(VideoService);
|
|
1036
|
+
this.unrealCallbackService = inject(UnrealCallbackService);
|
|
1020
1037
|
this.dataChannelConnectionTimeout = this.unrealInitialConfig?.dataChannelConnectionTimeout ??
|
|
1021
1038
|
DATA_CHANNEL_CONNECTION_TIMEOUT;
|
|
1022
1039
|
this.connectionCompleted$ = this.store
|
|
@@ -1214,7 +1231,7 @@ class UnrealEffects {
|
|
|
1214
1231
|
});
|
|
1215
1232
|
this.commandTelemetryService.trackStartCommand('EXT-SetViewportReady');
|
|
1216
1233
|
}), switchMap(() => this.store.select(selectCommandsInProgress).pipe(debounceTime(100), // !IMPORTANT last command detection time
|
|
1217
|
-
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 &&
|
|
1218
1235
|
videoStats.aggregatedStats.framesPerSecond > MINIMAL_FPS &&
|
|
1219
1236
|
(videoStats.aggregatedStats.framesDecoded || 0) > 15), take(1), map(() => setLoopBackCommandIsCompleted()))));
|
|
1220
1237
|
});
|
|
@@ -1224,10 +1241,6 @@ class UnrealEffects {
|
|
|
1224
1241
|
this.startStream$ = createEffect(() => {
|
|
1225
1242
|
return this.actions$.pipe(ofType(startStream), map(() => initSignalling()));
|
|
1226
1243
|
});
|
|
1227
|
-
this.listenUnrealCallbackByInitSignalling$ = createEffect(() => {
|
|
1228
|
-
return this.actions$.pipe(ofType(initSignalling), filter(() => !this.unrealInitialConfig?.playwright), switchMap(() => fromSignal(UnrealInternalSignalEvents.UnrealCallback).pipe(map(({ json }) => json?.commandCallback
|
|
1229
|
-
?.correlationId), filter(Truthy), map((id) => commandCompleted({ id })))));
|
|
1230
|
-
});
|
|
1231
1244
|
this.connectToSignaling$ = createEffect(() => {
|
|
1232
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]) => {
|
|
1233
1246
|
if (cirrusConnected) {
|
|
@@ -1351,80 +1364,29 @@ class UnrealEffects {
|
|
|
1351
1364
|
}));
|
|
1352
1365
|
}, { dispatch: false });
|
|
1353
1366
|
}
|
|
1354
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1355
|
-
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 }); }
|
|
1356
1369
|
}
|
|
1357
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1370
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealEffects, decorators: [{
|
|
1358
1371
|
type: Injectable
|
|
1359
1372
|
}] });
|
|
1360
1373
|
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
const selectIsExistMatchUrls = createSelector(unrealFeature.selectMatchUrls, (urls) => urls?.length > 0);
|
|
1371
|
-
const selectIsAutostart = createSelector(selectStreamConfig, (config) => config?.autoStart);
|
|
1372
|
-
const selectIsShowPopupWithoutAutoStart = createSelector(selectStreamConfig, unrealFeature.selectWasInitialized, (config, wasInitialized) => !config.autoStart && !wasInitialized);
|
|
1373
|
-
const selectShowReconnectPopup = createSelector(unrealFeature.selectCirrusConnected, unrealFeature.selectEstablishingConnection, (connected, establishing) => !connected && !establishing);
|
|
1374
|
-
const selectShowLoader = createSelector(selectShowReconnectPopup, unrealFeature.selectViewportReady, (showPopup, viewportReady) => !showPopup && !viewportReady);
|
|
1375
|
-
const selectIsVideoPlayingAndDataChannelConnected = createSelector(unrealFeature.selectIsVideoPlaying, unrealFeature.selectDataChannelConnected, (isVideoPlaying, isDataChannelConnected) => isVideoPlaying && isDataChannelConnected);
|
|
1376
|
-
const selectSignalingParameters = createSelector(unrealFeature.selectSsData, unrealFeature.selectAwsInstance, unrealFeature.selectSsInfo, (data, instance, ssInfo) => {
|
|
1377
|
-
const info = [];
|
|
1378
|
-
if (data) {
|
|
1379
|
-
info.push(`${data.cirrusVersion}, ${data.branchInfo}, ${data.instanceType}`);
|
|
1380
|
-
info.push(`Unreal App Version: ${data.streamerVersion}`);
|
|
1381
|
-
info.push(`APP: ${data.streamPath}${data.streamApp}`);
|
|
1382
|
-
}
|
|
1383
|
-
else {
|
|
1384
|
-
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
|
+
});
|
|
1385
1383
|
}
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
const selectCommandProgress = createSelector(selectLoaderCommands, (loaderCommands) => {
|
|
1393
|
-
if (loaderCommands.totalCommandsStarted > 0) {
|
|
1394
|
-
return (loaderCommands.totalCommandsCompleted /
|
|
1395
|
-
loaderCommands.totalCommandsStarted);
|
|
1396
|
-
}
|
|
1397
|
-
return 0;
|
|
1398
|
-
});
|
|
1399
|
-
const selectLastCommandInProgress = createSelector(selectLoaderCommands, (loaderCommands) => loaderCommands.commandsInProgress?.length
|
|
1400
|
-
? loaderCommands.commandsInProgress[loaderCommands.commandsInProgress.length - 1]
|
|
1401
|
-
: null);
|
|
1402
|
-
/**
|
|
1403
|
-
* Returns Scene load progress as a float value in between 0-1
|
|
1404
|
-
*/
|
|
1405
|
-
const selectTotalProgress = createSelector(unrealFeature.selectStatusPercentSignallingServer, selectCommandProgress, unrealFeature.selectAwsInstance, unrealFeature.selectDataChannelConnected, (statusPercentSignallingServer, commandProgress, awsInstance, dataChannelConnected) => {
|
|
1406
|
-
//TODO make better mechanism to detect is new orchestration
|
|
1407
|
-
const isNewOrchestration = String(awsInstance?.wsUrl).match(/^wss:\/\/orchestration-websocket/i);
|
|
1408
|
-
const newOrchestrationProgressComplete = dataChannelConnected
|
|
1409
|
-
? 100
|
|
1410
|
-
: (awsInstance?.progressComplete || 0) * 100;
|
|
1411
|
-
/**
|
|
1412
|
-
* Set 57% {@link SIGNALLING_PERCENT_VALUE} immediately when signalingServer?.signalingUrl is available
|
|
1413
|
-
* Up to 56% {@link SIGNALLING_PERCENT_VALUE} - 1 of the progress is reserved for signaling server polling
|
|
1414
|
-
*/
|
|
1415
|
-
const signalingPercentValue = isNewOrchestration
|
|
1416
|
-
? newOrchestrationProgressComplete
|
|
1417
|
-
: statusPercentSignallingServer;
|
|
1418
|
-
const SIGNALLING_MAX = SIGNALLING_PERCENT_VALUE / 100;
|
|
1419
|
-
const splitPoint = awsInstance?.wsUrl
|
|
1420
|
-
? SIGNALLING_MAX + 0.01
|
|
1421
|
-
: SIGNALLING_MAX;
|
|
1422
|
-
const progressSignaling = lerp(0.001, splitPoint, (signalingPercentValue ?? 0) / 100);
|
|
1423
|
-
const progressRest = lerp(0, 1 - splitPoint, commandProgress);
|
|
1424
|
-
return clampf(0, 1, progressSignaling + progressRest);
|
|
1425
|
-
});
|
|
1426
|
-
const selectClientAndViewIds = createSelector(unrealFeature.selectStreamClientCompanyId, unrealFeature.selectStreamViewId, (clientId, viewId) => ({ clientId, viewId }));
|
|
1427
|
-
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
|
+
}] });
|
|
1428
1390
|
|
|
1429
1391
|
class SubService {
|
|
1430
1392
|
constructor() {
|
|
@@ -1527,10 +1489,10 @@ class AFKService extends SubService {
|
|
|
1527
1489
|
}
|
|
1528
1490
|
}, 1000);
|
|
1529
1491
|
}
|
|
1530
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1531
|
-
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 }); }
|
|
1532
1494
|
}
|
|
1533
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1495
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AFKService, decorators: [{
|
|
1534
1496
|
type: Injectable
|
|
1535
1497
|
}], ctorParameters: () => [] });
|
|
1536
1498
|
|
|
@@ -1611,10 +1573,10 @@ class FreezeFrameService extends SubService {
|
|
|
1611
1573
|
progress: 1,
|
|
1612
1574
|
}));
|
|
1613
1575
|
}
|
|
1614
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1615
|
-
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 }); }
|
|
1616
1578
|
}
|
|
1617
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1579
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameService, decorators: [{
|
|
1618
1580
|
type: Injectable
|
|
1619
1581
|
}], ctorParameters: () => [] });
|
|
1620
1582
|
|
|
@@ -1665,9 +1627,9 @@ class VideoService extends SubService {
|
|
|
1665
1627
|
this.init();
|
|
1666
1628
|
}
|
|
1667
1629
|
init() {
|
|
1668
|
-
|
|
1669
|
-
this.kalmanFilter1D.config(
|
|
1670
|
-
BITRATE_MONITOR.config(
|
|
1630
|
+
this.actions$.pipe(ofType(setKalmanSettings)).subscribe(({ settings }) => {
|
|
1631
|
+
this.kalmanFilter1D.config(settings);
|
|
1632
|
+
BITRATE_MONITOR.config(settings);
|
|
1671
1633
|
});
|
|
1672
1634
|
}
|
|
1673
1635
|
setContainer(container = null) {
|
|
@@ -1913,15 +1875,17 @@ class VideoService extends SubService {
|
|
|
1913
1875
|
error: () => ({}),
|
|
1914
1876
|
});
|
|
1915
1877
|
}
|
|
1916
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
1917
|
-
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 }); }
|
|
1918
1880
|
}
|
|
1919
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
1881
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoService, decorators: [{
|
|
1920
1882
|
type: Injectable
|
|
1921
1883
|
}], ctorParameters: () => [] });
|
|
1922
1884
|
|
|
1923
1885
|
class CommandTelemetryService {
|
|
1924
1886
|
constructor() {
|
|
1887
|
+
this.actions$ = inject(Actions);
|
|
1888
|
+
this.store = inject(Store);
|
|
1925
1889
|
this.appId = 'metabox-telemetry';
|
|
1926
1890
|
this.commandsSent = {};
|
|
1927
1891
|
this.exileTimeout = 60000;
|
|
@@ -2061,8 +2025,8 @@ class CommandTelemetryService {
|
|
|
2061
2025
|
* that have exceeded the timeout limit.
|
|
2062
2026
|
*/
|
|
2063
2027
|
listenCallbacks() {
|
|
2064
|
-
|
|
2065
|
-
.pipe(filter(({ json }) => {
|
|
2028
|
+
this.actions$
|
|
2029
|
+
.pipe(ofType(unrealCommandCallback), filter(({ json }) => {
|
|
2066
2030
|
const callback = 'commandCallback' in json ? json.commandCallback : json;
|
|
2067
2031
|
return Truthy(callback?.trackingId);
|
|
2068
2032
|
}))
|
|
@@ -2120,10 +2084,10 @@ class CommandTelemetryService {
|
|
|
2120
2084
|
this.trackTime(out);
|
|
2121
2085
|
funcToDecorate(out);
|
|
2122
2086
|
}
|
|
2123
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
2124
|
-
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 }); }
|
|
2125
2089
|
}
|
|
2126
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
2090
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandTelemetryService, decorators: [{
|
|
2127
2091
|
type: Injectable
|
|
2128
2092
|
}], ctorParameters: () => [] });
|
|
2129
2093
|
|
|
@@ -2551,10 +2515,10 @@ class SignallingService extends SubService {
|
|
|
2551
2515
|
Logger.log('Start Getting Region');
|
|
2552
2516
|
return this.regionsPingService.getFastest().pipe(take(1));
|
|
2553
2517
|
}
|
|
2554
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
2555
|
-
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 }); }
|
|
2556
2520
|
}
|
|
2557
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
2521
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SignallingService, decorators: [{
|
|
2558
2522
|
type: Injectable
|
|
2559
2523
|
}], ctorParameters: () => [] });
|
|
2560
2524
|
|
|
@@ -2571,8 +2535,8 @@ class WebRtcPlayerService extends SubService {
|
|
|
2571
2535
|
this.forceMonoAudio = false;
|
|
2572
2536
|
this.isReconnecting = this.store.selectSignal(unrealFeature.selectIsReconnecting);
|
|
2573
2537
|
this.init();
|
|
2574
|
-
|
|
2575
|
-
|
|
2538
|
+
this.actions$.pipe(ofType(dropDC)).subscribe(() => this.dcClient?.close());
|
|
2539
|
+
this.actions$.pipe(ofType(dropPC)).subscribe(() => this.pcClient?.close());
|
|
2576
2540
|
}
|
|
2577
2541
|
init() {
|
|
2578
2542
|
const iceCandidateBuffer = [];
|
|
@@ -2949,10 +2913,10 @@ class WebRtcPlayerService extends SubService {
|
|
|
2949
2913
|
Logger.error("Couldn't create offer");
|
|
2950
2914
|
}
|
|
2951
2915
|
}
|
|
2952
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
2953
|
-
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 }); }
|
|
2954
2918
|
}
|
|
2955
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
2919
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebRtcPlayerService, decorators: [{
|
|
2956
2920
|
type: Injectable
|
|
2957
2921
|
}], ctorParameters: () => [] });
|
|
2958
2922
|
|
|
@@ -3198,7 +3162,7 @@ class AggregatorService extends SubService {
|
|
|
3198
3162
|
else {
|
|
3199
3163
|
this.showMessageFromUnreal(json);
|
|
3200
3164
|
previousJson = json;
|
|
3201
|
-
|
|
3165
|
+
this.store.dispatch(unrealCommandCallback({ json }));
|
|
3202
3166
|
}
|
|
3203
3167
|
}
|
|
3204
3168
|
else {
|
|
@@ -3293,10 +3257,10 @@ class AggregatorService extends SubService {
|
|
|
3293
3257
|
Logger.warn(`unrecognized data received, packet ID ${view[0]}`);
|
|
3294
3258
|
}
|
|
3295
3259
|
}
|
|
3296
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
3297
|
-
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 }); }
|
|
3298
3262
|
}
|
|
3299
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
3263
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AggregatorService, decorators: [{
|
|
3300
3264
|
type: Injectable
|
|
3301
3265
|
}], ctorParameters: () => [] });
|
|
3302
3266
|
|
|
@@ -3320,11 +3284,11 @@ class ConsoleExtensionsService extends SubService {
|
|
|
3320
3284
|
return true;
|
|
3321
3285
|
};
|
|
3322
3286
|
window.dropDC = () => {
|
|
3323
|
-
|
|
3287
|
+
this.store.dispatch(dropDC());
|
|
3324
3288
|
return true;
|
|
3325
3289
|
};
|
|
3326
3290
|
window.dropPC = () => {
|
|
3327
|
-
|
|
3291
|
+
this.store.dispatch(dropPC());
|
|
3328
3292
|
return true;
|
|
3329
3293
|
};
|
|
3330
3294
|
window.setResolution = ({ w, h }) => {
|
|
@@ -3365,10 +3329,10 @@ class ConsoleExtensionsService extends SubService {
|
|
|
3365
3329
|
Logger.info('setWarnTime() => set time to appear the AFK window.');
|
|
3366
3330
|
Logger.info('emitCommand(command) => send command to Unreal Engine.');
|
|
3367
3331
|
}
|
|
3368
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
3369
|
-
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 }); }
|
|
3370
3334
|
}
|
|
3371
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
3335
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ConsoleExtensionsService, decorators: [{
|
|
3372
3336
|
type: Injectable
|
|
3373
3337
|
}], ctorParameters: () => [] });
|
|
3374
3338
|
|
|
@@ -3379,10 +3343,10 @@ class DevModeService {
|
|
|
3379
3343
|
setDevMode(value) {
|
|
3380
3344
|
return localStorage.setItem('devMode', value.toString());
|
|
3381
3345
|
}
|
|
3382
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
3383
|
-
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' }); }
|
|
3384
3348
|
}
|
|
3385
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
3349
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: DevModeService, decorators: [{
|
|
3386
3350
|
type: Injectable,
|
|
3387
3351
|
args: [{
|
|
3388
3352
|
providedIn: 'root',
|
|
@@ -3472,10 +3436,10 @@ class UnrealCommunicatorService {
|
|
|
3472
3436
|
requestQualityControl() {
|
|
3473
3437
|
this.sendInputData(new Uint8Array([MessageType.RequestQualityControl]).buffer);
|
|
3474
3438
|
}
|
|
3475
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
3476
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
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 }); }
|
|
3477
3441
|
}
|
|
3478
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
3442
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCommunicatorService, decorators: [{
|
|
3479
3443
|
type: Injectable
|
|
3480
3444
|
}], ctorParameters: () => [] });
|
|
3481
3445
|
|
|
@@ -4053,10 +4017,10 @@ class RegionsPingService {
|
|
|
4053
4017
|
throw error;
|
|
4054
4018
|
}
|
|
4055
4019
|
}
|
|
4056
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4057
|
-
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 }); }
|
|
4058
4022
|
}
|
|
4059
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4023
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: RegionsPingService, decorators: [{
|
|
4060
4024
|
type: Injectable
|
|
4061
4025
|
}], ctorParameters: () => [] });
|
|
4062
4026
|
|
|
@@ -4093,10 +4057,10 @@ class StreamStatusTelemetryService {
|
|
|
4093
4057
|
trackEventToMixPanel(data) {
|
|
4094
4058
|
this.#store.dispatch(trackMixpanelEvent({ event: 'streamStatus', data }));
|
|
4095
4059
|
}
|
|
4096
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4097
|
-
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 }); }
|
|
4098
4062
|
}
|
|
4099
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4063
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StreamStatusTelemetryService, decorators: [{
|
|
4100
4064
|
type: Injectable
|
|
4101
4065
|
}], ctorParameters: () => [] });
|
|
4102
4066
|
|
|
@@ -4104,10 +4068,10 @@ class AfkPlaywrightService extends AFKService {
|
|
|
4104
4068
|
init() {
|
|
4105
4069
|
return;
|
|
4106
4070
|
}
|
|
4107
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4108
|
-
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 }); }
|
|
4109
4073
|
}
|
|
4110
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4074
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkPlaywrightService, decorators: [{
|
|
4111
4075
|
type: Injectable
|
|
4112
4076
|
}] });
|
|
4113
4077
|
|
|
@@ -4125,10 +4089,10 @@ class SignallingPlaywrightService extends SignallingService {
|
|
|
4125
4089
|
}));
|
|
4126
4090
|
return EMPTY;
|
|
4127
4091
|
}
|
|
4128
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4129
|
-
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 }); }
|
|
4130
4094
|
}
|
|
4131
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4095
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SignallingPlaywrightService, decorators: [{
|
|
4132
4096
|
type: Injectable
|
|
4133
4097
|
}], ctorParameters: () => [] });
|
|
4134
4098
|
|
|
@@ -4142,10 +4106,10 @@ class UnrealCommunicatorPlaywrightService extends UnrealCommunicatorService {
|
|
|
4142
4106
|
sendInputData() {
|
|
4143
4107
|
return;
|
|
4144
4108
|
}
|
|
4145
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4146
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.
|
|
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 }); }
|
|
4147
4111
|
}
|
|
4148
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCommunicatorPlaywrightService, decorators: [{
|
|
4149
4113
|
type: Injectable
|
|
4150
4114
|
}] });
|
|
4151
4115
|
|
|
@@ -4153,10 +4117,10 @@ class AggregatorPlaywrightService extends AggregatorService {
|
|
|
4153
4117
|
init() {
|
|
4154
4118
|
return;
|
|
4155
4119
|
}
|
|
4156
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4157
|
-
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 }); }
|
|
4158
4122
|
}
|
|
4159
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4123
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AggregatorPlaywrightService, decorators: [{
|
|
4160
4124
|
type: Injectable
|
|
4161
4125
|
}] });
|
|
4162
4126
|
|
|
@@ -4164,10 +4128,10 @@ class FreezeFramePlaywrightService extends FreezeFrameService {
|
|
|
4164
4128
|
init() {
|
|
4165
4129
|
return;
|
|
4166
4130
|
}
|
|
4167
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4168
|
-
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 }); }
|
|
4169
4133
|
}
|
|
4170
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4134
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFramePlaywrightService, decorators: [{
|
|
4171
4135
|
type: Injectable
|
|
4172
4136
|
}] });
|
|
4173
4137
|
|
|
@@ -4175,10 +4139,10 @@ class CommandTelemetryPlaywrightService extends CommandTelemetryService {
|
|
|
4175
4139
|
init() {
|
|
4176
4140
|
return;
|
|
4177
4141
|
}
|
|
4178
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4179
|
-
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 }); }
|
|
4180
4144
|
}
|
|
4181
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: CommandTelemetryPlaywrightService, decorators: [{
|
|
4182
4146
|
type: Injectable
|
|
4183
4147
|
}] });
|
|
4184
4148
|
|
|
@@ -4186,10 +4150,10 @@ class StreamStatusTelemetryPlaywrightService extends StreamStatusTelemetryServic
|
|
|
4186
4150
|
init() {
|
|
4187
4151
|
return;
|
|
4188
4152
|
}
|
|
4189
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4190
|
-
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 }); }
|
|
4191
4155
|
}
|
|
4192
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StreamStatusTelemetryPlaywrightService, decorators: [{
|
|
4193
4157
|
type: Injectable
|
|
4194
4158
|
}] });
|
|
4195
4159
|
|
|
@@ -4197,10 +4161,10 @@ class ConsoleExtensionsPlaywrightService extends ConsoleExtensionsService {
|
|
|
4197
4161
|
init() {
|
|
4198
4162
|
return;
|
|
4199
4163
|
}
|
|
4200
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4201
|
-
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 }); }
|
|
4202
4166
|
}
|
|
4203
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ConsoleExtensionsPlaywrightService, decorators: [{
|
|
4204
4168
|
type: Injectable
|
|
4205
4169
|
}] });
|
|
4206
4170
|
|
|
@@ -4214,10 +4178,10 @@ class InputPlaywrightService extends InputService {
|
|
|
4214
4178
|
init() {
|
|
4215
4179
|
return;
|
|
4216
4180
|
}
|
|
4217
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4218
|
-
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 }); }
|
|
4219
4183
|
}
|
|
4220
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4184
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: InputPlaywrightService, decorators: [{
|
|
4221
4185
|
type: Injectable
|
|
4222
4186
|
}] });
|
|
4223
4187
|
|
|
@@ -4242,8 +4206,7 @@ class FileHandlerService {
|
|
|
4242
4206
|
const correlationId = generateUuid();
|
|
4243
4207
|
const out = { ...data, correlationId };
|
|
4244
4208
|
const observable = this.fileService.fileComplete$.pipe(switchMap((data) => {
|
|
4245
|
-
|
|
4246
|
-
if (valid && this.fileHandlers[mimetype]) {
|
|
4209
|
+
if (data.valid && this.fileHandlers[mimetype]) {
|
|
4247
4210
|
return this.fileHandlers[mimetype](data, correlationId).pipe(filter(Truthy));
|
|
4248
4211
|
}
|
|
4249
4212
|
return of(null);
|
|
@@ -4254,10 +4217,10 @@ class FileHandlerService {
|
|
|
4254
4217
|
setTimeout(() => sender(out), 0);
|
|
4255
4218
|
return observable;
|
|
4256
4219
|
}
|
|
4257
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4258
|
-
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 }); }
|
|
4259
4222
|
}
|
|
4260
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4223
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FileHandlerService, decorators: [{
|
|
4261
4224
|
type: Injectable
|
|
4262
4225
|
}] });
|
|
4263
4226
|
|
|
@@ -4344,10 +4307,10 @@ class AnalyticsService {
|
|
|
4344
4307
|
});
|
|
4345
4308
|
});
|
|
4346
4309
|
}
|
|
4347
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4348
|
-
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 }); }
|
|
4349
4312
|
}
|
|
4350
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4313
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AnalyticsService, decorators: [{
|
|
4351
4314
|
type: Injectable
|
|
4352
4315
|
}], ctorParameters: () => [] });
|
|
4353
4316
|
|
|
@@ -4421,7 +4384,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
4421
4384
|
* ## FPS dispatch
|
|
4422
4385
|
*
|
|
4423
4386
|
* FPS changes are dispatched via the NgRx `setMaxFps` action, which triggers
|
|
4424
|
-
* the existing `
|
|
4387
|
+
* the existing `CommandsEffects.setMaxFps$` effect that sends the
|
|
4425
4388
|
* `t.MaxFPS <value>` console command to Unreal Engine.
|
|
4426
4389
|
*/
|
|
4427
4390
|
class FpsMonitorService {
|
|
@@ -4672,13 +4635,92 @@ class FpsMonitorService {
|
|
|
4672
4635
|
}
|
|
4673
4636
|
return { fps: fps / len, bitrate: bitrate / len, qp: qp / len };
|
|
4674
4637
|
}
|
|
4675
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4676
|
-
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 }); }
|
|
4677
4640
|
}
|
|
4678
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4641
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FpsMonitorService, decorators: [{
|
|
4679
4642
|
type: Injectable
|
|
4680
4643
|
}], ctorParameters: () => [] });
|
|
4681
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
|
+
|
|
4682
4724
|
class AfkTimeoutModalComponent {
|
|
4683
4725
|
constructor() {
|
|
4684
4726
|
this.#store = inject(Store);
|
|
@@ -4691,10 +4733,10 @@ class AfkTimeoutModalComponent {
|
|
|
4691
4733
|
resetAfk() {
|
|
4692
4734
|
this.#afkService.reset();
|
|
4693
4735
|
}
|
|
4694
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4695
|
-
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 }); }
|
|
4696
4738
|
}
|
|
4697
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4739
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkTimeoutModalComponent, decorators: [{
|
|
4698
4740
|
type: Component,
|
|
4699
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"] }]
|
|
4700
4742
|
}] });
|
|
@@ -4706,10 +4748,10 @@ class FreezeFrameComponent {
|
|
|
4706
4748
|
this.combinedFreeze = this.#store.selectSignal(selectFreezeFrameCombinedDataUrl);
|
|
4707
4749
|
}
|
|
4708
4750
|
#store;
|
|
4709
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4710
|
-
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 }); }
|
|
4711
4753
|
}
|
|
4712
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4754
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameComponent, decorators: [{
|
|
4713
4755
|
type: Component,
|
|
4714
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"] }]
|
|
4715
4757
|
}] });
|
|
@@ -4737,10 +4779,10 @@ class SafePipe {
|
|
|
4737
4779
|
throw new Error(`Invalid safe type specified: ${type}`);
|
|
4738
4780
|
}
|
|
4739
4781
|
}
|
|
4740
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4741
|
-
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" }); }
|
|
4742
4784
|
}
|
|
4743
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4785
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SafePipe, decorators: [{
|
|
4744
4786
|
type: Pipe,
|
|
4745
4787
|
args: [{
|
|
4746
4788
|
name: 'safe',
|
|
@@ -4754,10 +4796,10 @@ class LowBandwidthModalComponent {
|
|
|
4754
4796
|
close(value) {
|
|
4755
4797
|
this.dialogRef.close(value || false);
|
|
4756
4798
|
}
|
|
4757
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4758
|
-
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 }); }
|
|
4759
4801
|
}
|
|
4760
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4802
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthModalComponent, decorators: [{
|
|
4761
4803
|
type: Component,
|
|
4762
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"] }]
|
|
4763
4805
|
}] });
|
|
@@ -4769,10 +4811,10 @@ class ImageLoadingSrcComponent {
|
|
|
4769
4811
|
this.imageLoadingSrc = this.#store.selectSignal(unrealFeature.selectImageLoadingSrc);
|
|
4770
4812
|
}
|
|
4771
4813
|
#store;
|
|
4772
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4773
|
-
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 }); }
|
|
4774
4816
|
}
|
|
4775
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4817
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImageLoadingSrcComponent, decorators: [{
|
|
4776
4818
|
type: Component,
|
|
4777
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"] }]
|
|
4778
4820
|
}] });
|
|
@@ -4845,10 +4887,10 @@ class StatGraphComponent {
|
|
|
4845
4887
|
}
|
|
4846
4888
|
this.draw();
|
|
4847
4889
|
}
|
|
4848
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4849
|
-
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 }); }
|
|
4850
4892
|
}
|
|
4851
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4893
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StatGraphComponent, decorators: [{
|
|
4852
4894
|
type: Component,
|
|
4853
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"] }]
|
|
4854
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: [{
|
|
@@ -4929,10 +4971,10 @@ class UnrealStatusComponent {
|
|
|
4929
4971
|
// Fails silently if the iframe's content window cannot be accessed
|
|
4930
4972
|
}
|
|
4931
4973
|
}
|
|
4932
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4933
|
-
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 }); }
|
|
4934
4976
|
}
|
|
4935
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4977
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealStatusComponent, decorators: [{
|
|
4936
4978
|
type: Component,
|
|
4937
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"] }]
|
|
4938
4980
|
}] });
|
|
@@ -5061,10 +5103,10 @@ 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
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: () => [] });
|
|
@@ -5105,10 +5147,10 @@ class ResumeStreamButtonComponent {
|
|
|
5105
5147
|
onDisconnect() {
|
|
5106
5148
|
this.isSecondStart.set(true);
|
|
5107
5149
|
}
|
|
5108
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5109
|
-
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 }); }
|
|
5110
5152
|
}
|
|
5111
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5153
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ResumeStreamButtonComponent, decorators: [{
|
|
5112
5154
|
type: Component,
|
|
5113
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"] }]
|
|
5114
5156
|
}] });
|
|
@@ -5165,10 +5207,10 @@ class IntroSrcComponent {
|
|
|
5165
5207
|
videoElement.innerHTML += 'Browser not supported';
|
|
5166
5208
|
videoContainer.appendChild(videoElement);
|
|
5167
5209
|
}
|
|
5168
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5169
|
-
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 }); }
|
|
5170
5212
|
}
|
|
5171
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5213
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IntroSrcComponent, decorators: [{
|
|
5172
5214
|
type: Component,
|
|
5173
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"] }]
|
|
5174
5216
|
}], ctorParameters: () => [], propDecorators: { videoElement: [{ type: i0.ViewChild, args: ['videoPlayerCover', { isSignal: true }] }] } });
|
|
@@ -5358,10 +5400,10 @@ class UnrealSceneComponent {
|
|
|
5358
5400
|
makeEven(value) {
|
|
5359
5401
|
return Math.floor((value + 1) / 2) * 2;
|
|
5360
5402
|
}
|
|
5361
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5362
|
-
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 }); }
|
|
5363
5405
|
}
|
|
5364
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5406
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealSceneComponent, decorators: [{
|
|
5365
5407
|
type: Component,
|
|
5366
5408
|
args: [{ selector: 'app-unreal-scene', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
5367
5409
|
AfkTimeoutModalComponent,
|
|
@@ -5400,16 +5442,17 @@ class WebrtcErrorModalComponent {
|
|
|
5400
5442
|
this.close();
|
|
5401
5443
|
});
|
|
5402
5444
|
}
|
|
5403
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5404
|
-
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 }); }
|
|
5405
5447
|
}
|
|
5406
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5448
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebrtcErrorModalComponent, decorators: [{
|
|
5407
5449
|
type: Component,
|
|
5408
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"] }]
|
|
5409
5451
|
}] });
|
|
5410
5452
|
|
|
5411
5453
|
class FilterSettingsComponent {
|
|
5412
5454
|
constructor() {
|
|
5455
|
+
this.store = inject(Store);
|
|
5413
5456
|
this.storageKey = 'LBMFilterSettings';
|
|
5414
5457
|
this.defaultFilterModel = { ...DefaultFilterModel };
|
|
5415
5458
|
this.settings = { ...DefaultFilterModel };
|
|
@@ -5430,16 +5473,16 @@ class FilterSettingsComponent {
|
|
|
5430
5473
|
}, {});
|
|
5431
5474
|
this.dispatch({ ...DefaultFilterModel, ...valid });
|
|
5432
5475
|
}
|
|
5433
|
-
dispatch(
|
|
5476
|
+
dispatch(settings) {
|
|
5434
5477
|
try {
|
|
5435
|
-
localStorage.setItem(this.storageKey, JSON.stringify(
|
|
5478
|
+
localStorage.setItem(this.storageKey, JSON.stringify(settings));
|
|
5436
5479
|
}
|
|
5437
5480
|
catch (e) {
|
|
5438
5481
|
Logger.error('Storage not available, Error saving filter settings:', e);
|
|
5439
5482
|
}
|
|
5440
|
-
Object.assign(this.settings,
|
|
5441
|
-
Object.assign(FilterModel,
|
|
5442
|
-
|
|
5483
|
+
Object.assign(this.settings, settings);
|
|
5484
|
+
Object.assign(FilterModel, settings);
|
|
5485
|
+
this.store.dispatch(setKalmanSettings({ settings }));
|
|
5443
5486
|
}
|
|
5444
5487
|
reset() {
|
|
5445
5488
|
this.dispatch({
|
|
@@ -5447,10 +5490,10 @@ class FilterSettingsComponent {
|
|
|
5447
5490
|
panelOpen: this.settings.panelOpen,
|
|
5448
5491
|
});
|
|
5449
5492
|
}
|
|
5450
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5451
|
-
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 }); }
|
|
5452
5495
|
}
|
|
5453
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5496
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FilterSettingsComponent, decorators: [{
|
|
5454
5497
|
type: Component,
|
|
5455
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"] }]
|
|
5456
5499
|
}] });
|
|
@@ -5555,18 +5598,19 @@ class LowBandwidthDetectorComponent {
|
|
|
5555
5598
|
this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));
|
|
5556
5599
|
});
|
|
5557
5600
|
}
|
|
5558
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5559
|
-
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 }); }
|
|
5560
5603
|
}
|
|
5561
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthDetectorComponent, decorators: [{
|
|
5562
5605
|
type: Component,
|
|
5563
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"] }]
|
|
5564
5607
|
}] });
|
|
5565
5608
|
|
|
5566
5609
|
function provideAngularUnrealModule(config) {
|
|
5567
5610
|
return makeEnvironmentProviders([
|
|
5611
|
+
provideState(commandsFeature),
|
|
5568
5612
|
provideState(unrealFeature),
|
|
5569
|
-
provideEffects([UnrealEffects]),
|
|
5613
|
+
provideEffects([CommandsEffects, UnrealEffects]),
|
|
5570
5614
|
ConsoleExtensionsService,
|
|
5571
5615
|
InputService,
|
|
5572
5616
|
VideoService,
|
|
@@ -5576,6 +5620,7 @@ function provideAngularUnrealModule(config) {
|
|
|
5576
5620
|
FileHandlerService,
|
|
5577
5621
|
FpsMonitorService,
|
|
5578
5622
|
AnalyticsService,
|
|
5623
|
+
UnrealCallbackService,
|
|
5579
5624
|
{
|
|
5580
5625
|
provide: StreamStatusTelemetryService,
|
|
5581
5626
|
useClass: config?.playwright
|
|
@@ -5645,5 +5690,5 @@ function provideAngularUnrealModule(config) {
|
|
|
5645
5690
|
* Generated bundle index. Do not edit.
|
|
5646
5691
|
*/
|
|
5647
5692
|
|
|
5648
|
-
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 };
|
|
5649
5694
|
//# sourceMappingURL=3dsource-angular-unreal-module.mjs.map
|