@3dsource/angular-unreal-module 0.0.100 → 0.0.101-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -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,
|
|
@@ -671,320 +861,146 @@ class LatencyTimings {
|
|
|
671
861
|
this.FrameDisplayDeltaTimeMs = null;
|
|
672
862
|
}
|
|
673
863
|
// 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 }) => {
|
|
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>');
|
|
987
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);
|
|
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,87 @@ 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 }) => 'commandCallback' in json ? json.commandCallback : json), filter((json) => json.correlationId === correlationId), timeout(timeOut), catchError(() => dispatchOnTimeout
|
|
4704
|
+
? of({ command: 'timeout', correlationId: 'timeout' })
|
|
4705
|
+
: of(null)), take(1), tapLog('Command Response Observer'), filter(Truthy), map$1((data) => ({
|
|
4706
|
+
command: data.command,
|
|
4707
|
+
payload: 'payload' in data ? data.payload : null,
|
|
4708
|
+
})));
|
|
4709
|
+
setTimeout(() => sender({ ...data, correlationId }), 0);
|
|
4710
|
+
return observable;
|
|
4711
|
+
}
|
|
4712
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCallbackService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4713
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCallbackService }); }
|
|
4714
|
+
}
|
|
4715
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealCallbackService, decorators: [{
|
|
4716
|
+
type: Injectable
|
|
4717
|
+
}] });
|
|
4718
|
+
|
|
4682
4719
|
class AfkTimeoutModalComponent {
|
|
4683
4720
|
constructor() {
|
|
4684
4721
|
this.#store = inject(Store);
|
|
@@ -4691,10 +4728,10 @@ class AfkTimeoutModalComponent {
|
|
|
4691
4728
|
resetAfk() {
|
|
4692
4729
|
this.#afkService.reset();
|
|
4693
4730
|
}
|
|
4694
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4695
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
4731
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkTimeoutModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4732
|
+
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
4733
|
}
|
|
4697
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4734
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: AfkTimeoutModalComponent, decorators: [{
|
|
4698
4735
|
type: Component,
|
|
4699
4736
|
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
4737
|
}] });
|
|
@@ -4706,10 +4743,10 @@ class FreezeFrameComponent {
|
|
|
4706
4743
|
this.combinedFreeze = this.#store.selectSignal(selectFreezeFrameCombinedDataUrl);
|
|
4707
4744
|
}
|
|
4708
4745
|
#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.
|
|
4746
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4747
|
+
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
4748
|
}
|
|
4712
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4749
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FreezeFrameComponent, decorators: [{
|
|
4713
4750
|
type: Component,
|
|
4714
4751
|
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
4752
|
}] });
|
|
@@ -4737,10 +4774,10 @@ class SafePipe {
|
|
|
4737
4774
|
throw new Error(`Invalid safe type specified: ${type}`);
|
|
4738
4775
|
}
|
|
4739
4776
|
}
|
|
4740
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4741
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.
|
|
4777
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SafePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
4778
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "21.2.0", ngImport: i0, type: SafePipe, isStandalone: true, name: "safe" }); }
|
|
4742
4779
|
}
|
|
4743
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4780
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: SafePipe, decorators: [{
|
|
4744
4781
|
type: Pipe,
|
|
4745
4782
|
args: [{
|
|
4746
4783
|
name: 'safe',
|
|
@@ -4754,10 +4791,10 @@ class LowBandwidthModalComponent {
|
|
|
4754
4791
|
close(value) {
|
|
4755
4792
|
this.dialogRef.close(value || false);
|
|
4756
4793
|
}
|
|
4757
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4758
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.
|
|
4794
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4795
|
+
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
4796
|
}
|
|
4760
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4797
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthModalComponent, decorators: [{
|
|
4761
4798
|
type: Component,
|
|
4762
4799
|
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
4800
|
}] });
|
|
@@ -4769,10 +4806,10 @@ class ImageLoadingSrcComponent {
|
|
|
4769
4806
|
this.imageLoadingSrc = this.#store.selectSignal(unrealFeature.selectImageLoadingSrc);
|
|
4770
4807
|
}
|
|
4771
4808
|
#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.
|
|
4809
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImageLoadingSrcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4810
|
+
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
4811
|
}
|
|
4775
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4812
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ImageLoadingSrcComponent, decorators: [{
|
|
4776
4813
|
type: Component,
|
|
4777
4814
|
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
4815
|
}] });
|
|
@@ -4845,10 +4882,10 @@ class StatGraphComponent {
|
|
|
4845
4882
|
}
|
|
4846
4883
|
this.draw();
|
|
4847
4884
|
}
|
|
4848
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4849
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.
|
|
4885
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StatGraphComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4886
|
+
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
4887
|
}
|
|
4851
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4888
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: StatGraphComponent, decorators: [{
|
|
4852
4889
|
type: Component,
|
|
4853
4890
|
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
4891
|
}], 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 +4966,10 @@ class UnrealStatusComponent {
|
|
|
4929
4966
|
// Fails silently if the iframe's content window cannot be accessed
|
|
4930
4967
|
}
|
|
4931
4968
|
}
|
|
4932
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
4933
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
4969
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4970
|
+
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
4971
|
}
|
|
4935
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
4972
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealStatusComponent, decorators: [{
|
|
4936
4973
|
type: Component,
|
|
4937
4974
|
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
4975
|
}] });
|
|
@@ -5061,10 +5098,10 @@ class VideoStatsComponent {
|
|
|
5061
5098
|
elements: this.elementsToShow,
|
|
5062
5099
|
}));
|
|
5063
5100
|
}
|
|
5064
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5065
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5101
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoStatsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5102
|
+
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
5103
|
}
|
|
5067
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5104
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: VideoStatsComponent, decorators: [{
|
|
5068
5105
|
type: Component,
|
|
5069
5106
|
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
5107
|
}], ctorParameters: () => [] });
|
|
@@ -5105,10 +5142,10 @@ class ResumeStreamButtonComponent {
|
|
|
5105
5142
|
onDisconnect() {
|
|
5106
5143
|
this.isSecondStart.set(true);
|
|
5107
5144
|
}
|
|
5108
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5109
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5145
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ResumeStreamButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5146
|
+
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
5147
|
}
|
|
5111
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5148
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ResumeStreamButtonComponent, decorators: [{
|
|
5112
5149
|
type: Component,
|
|
5113
5150
|
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
5151
|
}] });
|
|
@@ -5165,10 +5202,10 @@ class IntroSrcComponent {
|
|
|
5165
5202
|
videoElement.innerHTML += 'Browser not supported';
|
|
5166
5203
|
videoContainer.appendChild(videoElement);
|
|
5167
5204
|
}
|
|
5168
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5169
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5205
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IntroSrcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5206
|
+
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
5207
|
}
|
|
5171
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5208
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: IntroSrcComponent, decorators: [{
|
|
5172
5209
|
type: Component,
|
|
5173
5210
|
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
5211
|
}], ctorParameters: () => [], propDecorators: { videoElement: [{ type: i0.ViewChild, args: ['videoPlayerCover', { isSignal: true }] }] } });
|
|
@@ -5358,10 +5395,10 @@ class UnrealSceneComponent {
|
|
|
5358
5395
|
makeEven(value) {
|
|
5359
5396
|
return Math.floor((value + 1) / 2) * 2;
|
|
5360
5397
|
}
|
|
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 }); }
|
|
5398
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealSceneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5399
|
+
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
5400
|
}
|
|
5364
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5401
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: UnrealSceneComponent, decorators: [{
|
|
5365
5402
|
type: Component,
|
|
5366
5403
|
args: [{ selector: 'app-unreal-scene', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
5367
5404
|
AfkTimeoutModalComponent,
|
|
@@ -5400,16 +5437,17 @@ class WebrtcErrorModalComponent {
|
|
|
5400
5437
|
this.close();
|
|
5401
5438
|
});
|
|
5402
5439
|
}
|
|
5403
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5404
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.
|
|
5440
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebrtcErrorModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5441
|
+
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
5442
|
}
|
|
5406
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5443
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: WebrtcErrorModalComponent, decorators: [{
|
|
5407
5444
|
type: Component,
|
|
5408
5445
|
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
5446
|
}] });
|
|
5410
5447
|
|
|
5411
5448
|
class FilterSettingsComponent {
|
|
5412
5449
|
constructor() {
|
|
5450
|
+
this.store = inject(Store);
|
|
5413
5451
|
this.storageKey = 'LBMFilterSettings';
|
|
5414
5452
|
this.defaultFilterModel = { ...DefaultFilterModel };
|
|
5415
5453
|
this.settings = { ...DefaultFilterModel };
|
|
@@ -5430,16 +5468,16 @@ class FilterSettingsComponent {
|
|
|
5430
5468
|
}, {});
|
|
5431
5469
|
this.dispatch({ ...DefaultFilterModel, ...valid });
|
|
5432
5470
|
}
|
|
5433
|
-
dispatch(
|
|
5471
|
+
dispatch(settings) {
|
|
5434
5472
|
try {
|
|
5435
|
-
localStorage.setItem(this.storageKey, JSON.stringify(
|
|
5473
|
+
localStorage.setItem(this.storageKey, JSON.stringify(settings));
|
|
5436
5474
|
}
|
|
5437
5475
|
catch (e) {
|
|
5438
5476
|
Logger.error('Storage not available, Error saving filter settings:', e);
|
|
5439
5477
|
}
|
|
5440
|
-
Object.assign(this.settings,
|
|
5441
|
-
Object.assign(FilterModel,
|
|
5442
|
-
|
|
5478
|
+
Object.assign(this.settings, settings);
|
|
5479
|
+
Object.assign(FilterModel, settings);
|
|
5480
|
+
this.store.dispatch(setKalmanSettings({ settings }));
|
|
5443
5481
|
}
|
|
5444
5482
|
reset() {
|
|
5445
5483
|
this.dispatch({
|
|
@@ -5447,10 +5485,10 @@ class FilterSettingsComponent {
|
|
|
5447
5485
|
panelOpen: this.settings.panelOpen,
|
|
5448
5486
|
});
|
|
5449
5487
|
}
|
|
5450
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5451
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5488
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FilterSettingsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5489
|
+
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
5490
|
}
|
|
5453
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5491
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: FilterSettingsComponent, decorators: [{
|
|
5454
5492
|
type: Component,
|
|
5455
5493
|
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
5494
|
}] });
|
|
@@ -5555,18 +5593,19 @@ class LowBandwidthDetectorComponent {
|
|
|
5555
5593
|
this.store.dispatch(changeLowBandwidth({ lowBandwidth: false }));
|
|
5556
5594
|
});
|
|
5557
5595
|
}
|
|
5558
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
5559
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.
|
|
5596
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthDetectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5597
|
+
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
5598
|
}
|
|
5561
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
5599
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: LowBandwidthDetectorComponent, decorators: [{
|
|
5562
5600
|
type: Component,
|
|
5563
5601
|
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
5602
|
}] });
|
|
5565
5603
|
|
|
5566
5604
|
function provideAngularUnrealModule(config) {
|
|
5567
5605
|
return makeEnvironmentProviders([
|
|
5606
|
+
provideState(commandsFeature),
|
|
5568
5607
|
provideState(unrealFeature),
|
|
5569
|
-
provideEffects([UnrealEffects]),
|
|
5608
|
+
provideEffects([CommandsEffects, UnrealEffects]),
|
|
5570
5609
|
ConsoleExtensionsService,
|
|
5571
5610
|
InputService,
|
|
5572
5611
|
VideoService,
|
|
@@ -5576,6 +5615,7 @@ function provideAngularUnrealModule(config) {
|
|
|
5576
5615
|
FileHandlerService,
|
|
5577
5616
|
FpsMonitorService,
|
|
5578
5617
|
AnalyticsService,
|
|
5618
|
+
UnrealCallbackService,
|
|
5579
5619
|
{
|
|
5580
5620
|
provide: StreamStatusTelemetryService,
|
|
5581
5621
|
useClass: config?.playwright
|
|
@@ -5645,5 +5685,5 @@ function provideAngularUnrealModule(config) {
|
|
|
5645
5685
|
* Generated bundle index. Do not edit.
|
|
5646
5686
|
*/
|
|
5647
5687
|
|
|
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,
|
|
5688
|
+
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
5689
|
//# sourceMappingURL=3dsource-angular-unreal-module.mjs.map
|