@3dsource/angular-unreal-module 0.0.106-dev.0 → 0.0.106-dev.2
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.
|
@@ -1274,11 +1274,7 @@ class UnrealEffects {
|
|
|
1274
1274
|
this.destroyConnections$ = createEffect(() => {
|
|
1275
1275
|
return this.actions$.pipe(ofType(destroyUnrealScene), tap(() => {
|
|
1276
1276
|
this.commandsSender.destroy();
|
|
1277
|
-
|
|
1278
|
-
// This effect runs asynchronously and would race with a new
|
|
1279
|
-
// UnrealSceneComponent that already set its container via
|
|
1280
|
-
// afterNextRender. The container's children are cleaned by
|
|
1281
|
-
// VideoService.destroy() which is triggered via disconnect$.
|
|
1277
|
+
this.videoService.setContainer(null);
|
|
1282
1278
|
}), map(() => destroyRemoteConnections({ reason: DisconnectReason.Destroy })));
|
|
1283
1279
|
});
|
|
1284
1280
|
this.destroyRemoteConnections$ = createEffect(() => {
|
|
@@ -1622,10 +1618,14 @@ class AFKService extends SubService {
|
|
|
1622
1618
|
this.countdown = 0; // The inactivity warning overlay has a countdown to show time until disconnect.
|
|
1623
1619
|
this.selectWarnTimeout = this.store.selectSignal(selectWarnTimeout);
|
|
1624
1620
|
this.isViewportReady = this.store.selectSignal(unrealFeature.selectViewportReady);
|
|
1621
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
1625
1622
|
this.destroyRef.onDestroy(() => this.clearTimers());
|
|
1626
1623
|
this.init();
|
|
1627
1624
|
}
|
|
1628
1625
|
init() {
|
|
1626
|
+
if (this.unrealConfig?.playwright) {
|
|
1627
|
+
return;
|
|
1628
|
+
}
|
|
1629
1629
|
merge(this.store.select(selectWarnTimeout), this.actions$.pipe(ofType(resetAfk)))
|
|
1630
1630
|
.pipe(withLatestFrom(this.store.select(unrealFeature.selectViewportReady)), filter(([, viewportReady]) => viewportReady), takeUntil(this.destroy$))
|
|
1631
1631
|
.subscribe(() => this.resetAfkWarningTimer());
|
|
@@ -1717,9 +1717,13 @@ class FreezeFrameService extends SubService {
|
|
|
1717
1717
|
this.receiving = false;
|
|
1718
1718
|
this.size = 0;
|
|
1719
1719
|
this.freezeFrameOverlay = new Image();
|
|
1720
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
1720
1721
|
this.init();
|
|
1721
1722
|
}
|
|
1722
1723
|
init() {
|
|
1724
|
+
if (this.unrealConfig?.playwright) {
|
|
1725
|
+
return;
|
|
1726
|
+
}
|
|
1723
1727
|
this.store
|
|
1724
1728
|
.select(unrealFeature.selectViewportReady)
|
|
1725
1729
|
.pipe(filter(Truthy), takeUntil(this.destroy$))
|
|
@@ -2087,13 +2091,14 @@ class CommandTelemetryService {
|
|
|
2087
2091
|
this.commandSequenceNumber = 0;
|
|
2088
2092
|
this.payloads = [];
|
|
2089
2093
|
this.httpClient = inject(HttpClient);
|
|
2090
|
-
this.
|
|
2094
|
+
this.unrealConfig = inject(UNREAL_CONFIG, {
|
|
2091
2095
|
optional: true,
|
|
2092
2096
|
});
|
|
2093
2097
|
this.init();
|
|
2094
2098
|
}
|
|
2095
2099
|
init() {
|
|
2096
|
-
if (!this.
|
|
2100
|
+
if (!this.unrealConfig?.commandTelemetryReceiver ||
|
|
2101
|
+
this.unrealConfig?.playwright) {
|
|
2097
2102
|
return;
|
|
2098
2103
|
}
|
|
2099
2104
|
this.reset();
|
|
@@ -2205,7 +2210,7 @@ class CommandTelemetryService {
|
|
|
2205
2210
|
};
|
|
2206
2211
|
const lastIndex = payload[payload.length - 1].commandSequenceNumber;
|
|
2207
2212
|
this.httpClient
|
|
2208
|
-
.post(this.
|
|
2213
|
+
.post(this.unrealConfig?.commandTelemetryReceiver || '', out)
|
|
2209
2214
|
.pipe(catchError(() => of(null)), take(1))
|
|
2210
2215
|
.subscribe(() => {
|
|
2211
2216
|
this.payloads = this.payloads.filter((p) => p.commandSequenceNumber > lastIndex);
|
|
@@ -2510,6 +2515,7 @@ class SignallingService extends SubService {
|
|
|
2510
2515
|
this.httpClient = inject(HttpClient);
|
|
2511
2516
|
this.regionsPingService = inject(RegionsPingService);
|
|
2512
2517
|
this.commandTelemetryService = inject(CommandTelemetryService);
|
|
2518
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
2513
2519
|
this.region = signal('', ...(ngDevMode ? [{ debugName: "region" }] : /* istanbul ignore next */ []));
|
|
2514
2520
|
this.selectClientAndViewIds = this.store.selectSignal(selectClientAndViewIds);
|
|
2515
2521
|
this.environmentId = this.store.selectSignal(unrealFeature.selectEnvironmentId);
|
|
@@ -2526,6 +2532,9 @@ class SignallingService extends SubService {
|
|
|
2526
2532
|
this.init();
|
|
2527
2533
|
}
|
|
2528
2534
|
init() {
|
|
2535
|
+
if (this.unrealConfig?.playwright) {
|
|
2536
|
+
return;
|
|
2537
|
+
}
|
|
2529
2538
|
this.setHandlersFromStream();
|
|
2530
2539
|
this.action$.pipe(ofType(dataChannelReady)).subscribe(() => {
|
|
2531
2540
|
this.send({
|
|
@@ -2546,6 +2555,13 @@ class SignallingService extends SubService {
|
|
|
2546
2555
|
});
|
|
2547
2556
|
}
|
|
2548
2557
|
connectToSignaling(urlList) {
|
|
2558
|
+
if (this.unrealConfig?.playwright) {
|
|
2559
|
+
this.store.dispatch(setUnrealPlaywrightConfig());
|
|
2560
|
+
this.store.dispatch(dataChannelConnected({
|
|
2561
|
+
statusMessage: 'Playwright set data channel connected',
|
|
2562
|
+
}));
|
|
2563
|
+
return EMPTY;
|
|
2564
|
+
}
|
|
2549
2565
|
Logger.log('CONNECT TO SIGNALLING');
|
|
2550
2566
|
// Preparation for WebSocket Orchestration
|
|
2551
2567
|
this.correlationId = generateUuid();
|
|
@@ -3297,9 +3313,13 @@ class FileReceiverService extends SubService {
|
|
|
3297
3313
|
this.receiving = false;
|
|
3298
3314
|
this.extension = '';
|
|
3299
3315
|
this.data = [];
|
|
3316
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3300
3317
|
this.init();
|
|
3301
3318
|
}
|
|
3302
3319
|
init() {
|
|
3320
|
+
if (this.unrealConfig?.playwright) {
|
|
3321
|
+
return;
|
|
3322
|
+
}
|
|
3303
3323
|
this.store
|
|
3304
3324
|
.select(unrealFeature.selectViewportReady)
|
|
3305
3325
|
.pipe(filter(Truthy))
|
|
@@ -3408,11 +3428,14 @@ class AggregatorService extends SubService {
|
|
|
3408
3428
|
this.webrtcPlayer = inject(WebRtcPlayerService);
|
|
3409
3429
|
this.freezeFrame = inject(FreezeFrameService);
|
|
3410
3430
|
this.fileReceiver = inject(FileReceiverService);
|
|
3411
|
-
this.
|
|
3431
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3412
3432
|
this.responseEventListeners = new Map();
|
|
3413
3433
|
this.init();
|
|
3414
3434
|
}
|
|
3415
3435
|
init() {
|
|
3436
|
+
if (this.unrealConfig?.playwright) {
|
|
3437
|
+
return;
|
|
3438
|
+
}
|
|
3416
3439
|
this.listenWebRTC();
|
|
3417
3440
|
this.initialize();
|
|
3418
3441
|
}
|
|
@@ -3464,7 +3487,7 @@ class AggregatorService extends SubService {
|
|
|
3464
3487
|
}
|
|
3465
3488
|
removeLoadScreen() {
|
|
3466
3489
|
document
|
|
3467
|
-
.getElementById(this.
|
|
3490
|
+
.getElementById(this.unrealConfig?.screenLockerContainerId ||
|
|
3468
3491
|
SCREEN_LOCKER_CONTAINER_ID)
|
|
3469
3492
|
?.remove();
|
|
3470
3493
|
}
|
|
@@ -3588,11 +3611,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
3588
3611
|
}], ctorParameters: () => [] });
|
|
3589
3612
|
|
|
3590
3613
|
class ConsoleExtensionsService extends SubService {
|
|
3591
|
-
#httpClient
|
|
3592
|
-
#commandsSender
|
|
3593
|
-
#isDevMode
|
|
3614
|
+
#httpClient;
|
|
3615
|
+
#commandsSender;
|
|
3616
|
+
#isDevMode;
|
|
3594
3617
|
constructor() {
|
|
3595
3618
|
super();
|
|
3619
|
+
this.#httpClient = inject(HttpClient);
|
|
3620
|
+
this.#commandsSender = inject(UnrealCommunicatorService);
|
|
3621
|
+
this.#isDevMode = inject(DevModeService).isDevMode;
|
|
3622
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3596
3623
|
this.init();
|
|
3597
3624
|
// Clean up window properties on destroyRef
|
|
3598
3625
|
this.destroyRef.onDestroy(() => {
|
|
@@ -3611,7 +3638,7 @@ class ConsoleExtensionsService extends SubService {
|
|
|
3611
3638
|
});
|
|
3612
3639
|
}
|
|
3613
3640
|
init() {
|
|
3614
|
-
if (!this.#isDevMode) {
|
|
3641
|
+
if (!this.#isDevMode || this.unrealConfig?.playwright) {
|
|
3615
3642
|
return;
|
|
3616
3643
|
}
|
|
3617
3644
|
window.dropConnection = () => {
|
|
@@ -3702,11 +3729,13 @@ class UnrealCommunicatorService {
|
|
|
3702
3729
|
this.actions$ = inject(Actions);
|
|
3703
3730
|
this.commandTelemetryService = inject(CommandTelemetryService);
|
|
3704
3731
|
this.webRtcPlayerService = inject(WebRtcPlayerService);
|
|
3732
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3705
3733
|
this.destroy$ = new Subject();
|
|
3706
3734
|
this.cirrusConnected = this.store.selectSignal(unrealFeature.selectCirrusConnected);
|
|
3707
3735
|
this.init();
|
|
3708
3736
|
}
|
|
3709
3737
|
init() {
|
|
3738
|
+
this.isPlaywrightMode();
|
|
3710
3739
|
this.emitUIInteraction = this.commandTelemetryService.decorate(this.emitUIInteraction.bind(this));
|
|
3711
3740
|
// Listen to the dataChannelConnected ACTION (point-in-time event) instead
|
|
3712
3741
|
// of the store selector. The selector reads the current state and can fire on
|
|
@@ -3724,6 +3753,7 @@ class UnrealCommunicatorService {
|
|
|
3724
3753
|
this.destroy$ = new Subject();
|
|
3725
3754
|
}
|
|
3726
3755
|
sendCommandToUnreal(data) {
|
|
3756
|
+
this.isPlaywrightMode();
|
|
3727
3757
|
if (this.webRtcPlayerService.canSend()) {
|
|
3728
3758
|
const uniqId = data?.correlationId ?? generateUuid();
|
|
3729
3759
|
const sendData = { ...data, correlationId: uniqId };
|
|
@@ -3750,6 +3780,7 @@ class UnrealCommunicatorService {
|
|
|
3750
3780
|
this.emitDescriptor(MessageType.Command, descriptor);
|
|
3751
3781
|
}
|
|
3752
3782
|
sendInputData(data) {
|
|
3783
|
+
this.isPlaywrightMode();
|
|
3753
3784
|
try {
|
|
3754
3785
|
this.store.dispatch(resetAfk());
|
|
3755
3786
|
this.webRtcPlayerService.send(data);
|
|
@@ -3760,6 +3791,11 @@ class UnrealCommunicatorService {
|
|
|
3760
3791
|
}
|
|
3761
3792
|
}
|
|
3762
3793
|
}
|
|
3794
|
+
isPlaywrightMode() {
|
|
3795
|
+
if (this.unrealConfig?.playwright) {
|
|
3796
|
+
return;
|
|
3797
|
+
}
|
|
3798
|
+
}
|
|
3763
3799
|
emitDescriptor(messageType, descriptor) {
|
|
3764
3800
|
// Convert the descriptor object into a JSON string.
|
|
3765
3801
|
const descriptorAsString = JSON.stringify(descriptor);
|
|
@@ -3797,6 +3833,7 @@ class InputService extends SubService {
|
|
|
3797
3833
|
this.commandsSender = inject(UnrealCommunicatorService);
|
|
3798
3834
|
this.isDevMode = inject(DevModeService).isDevMode;
|
|
3799
3835
|
this.videoService = inject(VideoService);
|
|
3836
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
3800
3837
|
this.defaultKeys = [
|
|
3801
3838
|
KeyboardNumericCode.KeyW,
|
|
3802
3839
|
KeyboardNumericCode.KeyS,
|
|
@@ -3830,6 +3867,9 @@ class InputService extends SubService {
|
|
|
3830
3867
|
this.init();
|
|
3831
3868
|
}
|
|
3832
3869
|
init() {
|
|
3870
|
+
if (this.unrealConfig?.playwright) {
|
|
3871
|
+
return;
|
|
3872
|
+
}
|
|
3833
3873
|
const visibilityHiddenTrigger$ = fromEvent(document, 'visibilitychange').pipe(map$1(() => document.visibilityState === 'hidden'), filter(Truthy));
|
|
3834
3874
|
const visibilityVisibleTrigger$ = fromEvent(document, 'visibilitychange').pipe(map$1(() => document.visibilityState === 'visible'), filter(Truthy), startWith(true));
|
|
3835
3875
|
this.deactivatedVideoTrigger$ = merge(this.disconnect$, this.reInit$, visibilityHiddenTrigger$);
|
|
@@ -4373,12 +4413,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
4373
4413
|
}] });
|
|
4374
4414
|
|
|
4375
4415
|
class StreamStatusTelemetryService {
|
|
4376
|
-
#store
|
|
4377
|
-
#videoService
|
|
4416
|
+
#store;
|
|
4417
|
+
#videoService;
|
|
4378
4418
|
constructor() {
|
|
4419
|
+
this.#store = inject(Store);
|
|
4420
|
+
this.#videoService = inject(VideoService);
|
|
4421
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
4379
4422
|
this.init();
|
|
4380
4423
|
}
|
|
4381
4424
|
init() {
|
|
4425
|
+
if (this.unrealConfig?.playwright) {
|
|
4426
|
+
return;
|
|
4427
|
+
}
|
|
4382
4428
|
this.#videoService.videoStats$
|
|
4383
4429
|
.pipe(withLatestFrom(this.#store.select(unrealFeature.selectAwsInstance), this.#store.select(unrealFeature.selectLowBandwidth), this.#store.select(unrealFeature.selectLowBandwidthStats), this.#store.select(unrealFeature.selectCirrusConnected)), auditTime(5000), filter(([, , , , cirrusConnected]) => cirrusConnected), map$1(([data, signalingServer, isLowBandwidth, lbmStats]) => this.mapEventData(data, signalingServer, isLowBandwidth, lbmStats)))
|
|
4384
4430
|
.subscribe((data) => this.trackEventToMixPanel(data));
|
|
@@ -4412,10 +4458,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
4412
4458
|
type: Injectable
|
|
4413
4459
|
}], ctorParameters: () => [] });
|
|
4414
4460
|
|
|
4415
|
-
/*
|
|
4416
|
-
* Copyright (c) 2026.
|
|
4417
|
-
* 3DSource.com. Sergii Karanda steve@3dsource.com. All Rights Reserved.
|
|
4418
|
-
*/
|
|
4419
4461
|
class WebRtcPlayerService2 extends SubService {
|
|
4420
4462
|
constructor() {
|
|
4421
4463
|
super();
|
|
@@ -4469,7 +4511,7 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4469
4511
|
* Creates a new peer connection, applies the remote offer,
|
|
4470
4512
|
* then responds with an SDP answer.
|
|
4471
4513
|
*
|
|
4472
|
-
* The DataChannel is NOT created here — the server creates it
|
|
4514
|
+
* The DataChannel is NOT created here — the server creates it,
|
|
4473
4515
|
* and we receive it via the `datachannel` event on the peer connection.
|
|
4474
4516
|
*/
|
|
4475
4517
|
async handleServerOffer(offer) {
|
|
@@ -4688,13 +4730,13 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4688
4730
|
}
|
|
4689
4731
|
else {
|
|
4690
4732
|
Logger.colored('black', 'yellow', `DataChannel connection not prepared or in state: ${this.dcClient?.readyState}`);
|
|
4691
|
-
// Trigger peer reconnection if DC is not open and we're not
|
|
4733
|
+
// Trigger peer reconnection if DC is not open and we're not yet reconnecting
|
|
4692
4734
|
this.tryReconnectOnSendFailure();
|
|
4693
4735
|
}
|
|
4694
4736
|
}
|
|
4695
4737
|
/**
|
|
4696
4738
|
* Attempts to reconnect the peer when send fails due to DataChannel not being open.
|
|
4697
|
-
* This handles cases where the DC connection is broken but no error events are fired.
|
|
4739
|
+
* This handles cases where the DC connection is broken, but no error events are fired.
|
|
4698
4740
|
*/
|
|
4699
4741
|
tryReconnectOnSendFailure() {
|
|
4700
4742
|
// Skip if already reconnecting or signaling is not connected
|
|
@@ -4923,7 +4965,7 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4923
4965
|
this.store.dispatch(dataChannelConnected({ statusMessage }));
|
|
4924
4966
|
}
|
|
4925
4967
|
/**
|
|
4926
|
-
* Creates an SDP offer, applies SDP munging, sets it as local description,
|
|
4968
|
+
* Creates an SDP offer, applies SDP munging, sets it as a local description,
|
|
4927
4969
|
* and sends it to the server via signaling.
|
|
4928
4970
|
* Transceivers already configure media directions, so deprecated
|
|
4929
4971
|
* offerToReceive* options are not used.
|
|
@@ -4940,7 +4982,7 @@ class WebRtcPlayerService2 extends SubService {
|
|
|
4940
4982
|
}
|
|
4941
4983
|
}
|
|
4942
4984
|
/**
|
|
4943
|
-
* Creates an SDP answer, applies SDP munging, sets it as local description,
|
|
4985
|
+
* Creates an SDP answer, applies SDP munging, sets it as a local description,
|
|
4944
4986
|
* and sends it to the server via signaling.
|
|
4945
4987
|
*/
|
|
4946
4988
|
async createAnswer(pcClient) {
|
|
@@ -4961,115 +5003,136 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
4961
5003
|
type: Injectable
|
|
4962
5004
|
}], ctorParameters: () => [] });
|
|
4963
5005
|
|
|
4964
|
-
|
|
4965
|
-
|
|
4966
|
-
|
|
4967
|
-
}
|
|
4968
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AfkPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4969
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AfkPlaywrightService }); }
|
|
4970
|
-
}
|
|
4971
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AfkPlaywrightService, decorators: [{
|
|
4972
|
-
type: Injectable
|
|
4973
|
-
}] });
|
|
5006
|
+
const ReceivedMimeTypes = {
|
|
5007
|
+
ApplicationJson: 'application/json',
|
|
5008
|
+
};
|
|
4974
5009
|
|
|
4975
|
-
class
|
|
5010
|
+
class FileHandlerService {
|
|
4976
5011
|
constructor() {
|
|
4977
|
-
|
|
4978
|
-
|
|
4979
|
-
|
|
4980
|
-
|
|
5012
|
+
this.fileService = inject(FileReceiverService);
|
|
5013
|
+
this.fileHandlers = {
|
|
5014
|
+
[ReceivedMimeTypes.ApplicationJson]: this.handleJsonFile.bind(this),
|
|
5015
|
+
};
|
|
4981
5016
|
}
|
|
4982
|
-
|
|
4983
|
-
|
|
4984
|
-
|
|
4985
|
-
|
|
5017
|
+
handleJsonFile(data, correlationId) {
|
|
5018
|
+
const { blob } = data;
|
|
5019
|
+
return from(blob.text()).pipe(map$1((text) => JSON.parse(text)), filter(({ commandCallback }) => {
|
|
5020
|
+
return commandCallback.correlationId === correlationId;
|
|
4986
5021
|
}));
|
|
4987
|
-
return EMPTY;
|
|
4988
|
-
}
|
|
4989
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SignallingPlaywrightService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4990
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SignallingPlaywrightService }); }
|
|
4991
|
-
}
|
|
4992
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: SignallingPlaywrightService, decorators: [{
|
|
4993
|
-
type: Injectable
|
|
4994
|
-
}], ctorParameters: () => [] });
|
|
4995
|
-
|
|
4996
|
-
class UnrealCommunicatorPlaywrightService extends UnrealCommunicatorService {
|
|
4997
|
-
init() {
|
|
4998
|
-
return;
|
|
4999
5022
|
}
|
|
5000
|
-
|
|
5001
|
-
|
|
5002
|
-
|
|
5003
|
-
|
|
5004
|
-
|
|
5005
|
-
|
|
5006
|
-
|
|
5007
|
-
|
|
5008
|
-
}
|
|
5009
|
-
|
|
5010
|
-
|
|
5011
|
-
}
|
|
5012
|
-
|
|
5013
|
-
|
|
5014
|
-
init() {
|
|
5015
|
-
return;
|
|
5016
|
-
}
|
|
5017
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AggregatorPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5018
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AggregatorPlaywrightService }); }
|
|
5019
|
-
}
|
|
5020
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AggregatorPlaywrightService, decorators: [{
|
|
5021
|
-
type: Injectable
|
|
5022
|
-
}] });
|
|
5023
|
-
|
|
5024
|
-
class FreezeFramePlaywrightService extends FreezeFrameService {
|
|
5025
|
-
init() {
|
|
5026
|
-
return;
|
|
5023
|
+
observeFileResponse(mimetype, data, sender, timeOut = 60000) {
|
|
5024
|
+
const correlationId = generateUuid();
|
|
5025
|
+
const out = { ...data, correlationId };
|
|
5026
|
+
const observable = this.fileService.fileComplete$.pipe(switchMap((data) => {
|
|
5027
|
+
if (data.valid && this.fileHandlers[mimetype]) {
|
|
5028
|
+
return this.fileHandlers[mimetype](data, correlationId).pipe(filter(Truthy));
|
|
5029
|
+
}
|
|
5030
|
+
return of(null);
|
|
5031
|
+
}), timeout(timeOut), catchError((e) => {
|
|
5032
|
+
Logger.error(e);
|
|
5033
|
+
return of(null);
|
|
5034
|
+
}), take(1));
|
|
5035
|
+
setTimeout(() => sender(out), 0);
|
|
5036
|
+
return observable;
|
|
5027
5037
|
}
|
|
5028
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type:
|
|
5029
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type:
|
|
5038
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5039
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService }); }
|
|
5030
5040
|
}
|
|
5031
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type:
|
|
5041
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService, decorators: [{
|
|
5032
5042
|
type: Injectable
|
|
5033
5043
|
}] });
|
|
5034
5044
|
|
|
5035
|
-
class
|
|
5036
|
-
|
|
5037
|
-
|
|
5045
|
+
class AnalyticsService extends SubService {
|
|
5046
|
+
#store = inject(Store);
|
|
5047
|
+
/** Signals monitorMouse inner subscriptions to stop (viewport lost / new session). */
|
|
5048
|
+
#stopMouse$ = new Subject();
|
|
5049
|
+
sendEventToMixPanel(name, params = {}) {
|
|
5050
|
+
Logger.log('Analytics Event:', name, params);
|
|
5051
|
+
this.#store.dispatch(saveAnalyticsEvent({ event: { name, params } }));
|
|
5038
5052
|
}
|
|
5039
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5046
|
-
|
|
5047
|
-
|
|
5048
|
-
return;
|
|
5053
|
+
constructor() {
|
|
5054
|
+
super();
|
|
5055
|
+
const abortSignal$ = this.#store
|
|
5056
|
+
.select(unrealFeature.selectViewportReady)
|
|
5057
|
+
.pipe(filter$1(Falsy), map(() => void 0));
|
|
5058
|
+
this.#store
|
|
5059
|
+
.select(unrealFeature.selectViewportReady)
|
|
5060
|
+
.pipe(distinctUntilChanged(), filter$1(Truthy), tap(() => this.monitorMouse(abortSignal$)))
|
|
5061
|
+
.subscribe();
|
|
5049
5062
|
}
|
|
5050
|
-
|
|
5051
|
-
|
|
5052
|
-
|
|
5053
|
-
|
|
5054
|
-
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
|
|
5058
|
-
|
|
5059
|
-
|
|
5063
|
+
monitorMouse(abortSignal$) {
|
|
5064
|
+
this.#stopMouse$.next();
|
|
5065
|
+
const stop$ = merge(this.#stopMouse$.asObservable(), abortSignal$);
|
|
5066
|
+
const element = document.getElementById('streamingVideo');
|
|
5067
|
+
if (!element) {
|
|
5068
|
+
return;
|
|
5069
|
+
}
|
|
5070
|
+
// Monitor mousewheel events
|
|
5071
|
+
const mousewheel$ = fromEvent(element, 'wheel').pipe(takeUntil$1(stop$), throttleTime(1000));
|
|
5072
|
+
// Monitor mouse button states
|
|
5073
|
+
const mousedown$ = fromEvent(element, 'mousedown').pipe(takeUntil$1(stop$));
|
|
5074
|
+
const touchStart$ = fromEvent(element, 'touchstart').pipe(takeUntil$1(stop$));
|
|
5075
|
+
const touchMove$ = fromEvent(element, 'touchmove').pipe(takeUntil$1(stop$), throttleTime(200));
|
|
5076
|
+
// Track mouse movement while the left or right button is pressed
|
|
5077
|
+
mousedown$
|
|
5078
|
+
.pipe(filter$1((event) => event.button === 0 || event.button === 2), tap((downEvent) => {
|
|
5079
|
+
this.sendEventToMixPanel('mouse_interaction', {
|
|
5080
|
+
viewX: downEvent.clientX / element.clientWidth,
|
|
5081
|
+
viewY: downEvent.clientY / element.clientHeight,
|
|
5082
|
+
action: downEvent.button === 0 ? 'spinning' : 'panning',
|
|
5083
|
+
});
|
|
5084
|
+
}))
|
|
5085
|
+
.subscribe();
|
|
5086
|
+
// Track mouse movement while the left or right button is pressed
|
|
5087
|
+
touchStart$
|
|
5088
|
+
.pipe(tap((downEvent) => {
|
|
5089
|
+
const totalTouches = downEvent.touches.length;
|
|
5090
|
+
const touch = downEvent.touches[0];
|
|
5091
|
+
this.sendEventToMixPanel('touch_interaction', {
|
|
5092
|
+
viewX: touch.clientX / element.clientWidth,
|
|
5093
|
+
viewY: touch.clientY / element.clientHeight,
|
|
5094
|
+
action: totalTouches === 1 ? 'spinning' : 'panning',
|
|
5095
|
+
});
|
|
5096
|
+
}))
|
|
5097
|
+
.subscribe();
|
|
5098
|
+
let initialTouchDistance = 0;
|
|
5099
|
+
// Subscribe to mousewheel events
|
|
5100
|
+
touchMove$.subscribe((event) => {
|
|
5101
|
+
const totalTouches = event.touches.length;
|
|
5102
|
+
if (totalTouches < 2) {
|
|
5103
|
+
return;
|
|
5104
|
+
}
|
|
5105
|
+
// Calculate the current distance between two touches
|
|
5106
|
+
const touch1 = event.touches[0];
|
|
5107
|
+
const touch2 = event.touches[1];
|
|
5108
|
+
const currentDistance = Math.sqrt(Math.pow(touch2.clientX - touch1.clientX, 2) +
|
|
5109
|
+
Math.pow(touch2.clientY - touch1.clientY, 2));
|
|
5110
|
+
// Determine if zooming in or out based on distance change
|
|
5111
|
+
const deltaDistance = currentDistance - initialTouchDistance;
|
|
5112
|
+
const isZoomingIn = deltaDistance > 0;
|
|
5113
|
+
// Only send event if there's a significant change (avoid noise)
|
|
5114
|
+
if (Math.abs(deltaDistance) > 10) {
|
|
5115
|
+
this.sendEventToMixPanel('touch_zoom_interaction', {
|
|
5116
|
+
delta: isZoomingIn ? 1 : -1,
|
|
5117
|
+
action: isZoomingIn ? 'zoomin' : 'zoomout',
|
|
5118
|
+
});
|
|
5119
|
+
// Update initial distance for next comparison
|
|
5120
|
+
initialTouchDistance = currentDistance;
|
|
5121
|
+
}
|
|
5122
|
+
});
|
|
5123
|
+
mousewheel$.subscribe((event) => {
|
|
5124
|
+
this.sendEventToMixPanel('mouse_zoom_interaction', {
|
|
5125
|
+
delta: -(event.deltaY / Math.abs(event.deltaY)),
|
|
5126
|
+
action: event.deltaY < 0 ? 'zoomin' : 'zoomout',
|
|
5127
|
+
});
|
|
5128
|
+
});
|
|
5060
5129
|
}
|
|
5061
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type:
|
|
5062
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type:
|
|
5130
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5131
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService }); }
|
|
5063
5132
|
}
|
|
5064
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type:
|
|
5133
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService, decorators: [{
|
|
5065
5134
|
type: Injectable
|
|
5066
|
-
}] });
|
|
5067
|
-
|
|
5068
|
-
class FileReceiverPlaywrightService extends FileReceiverService {
|
|
5069
|
-
init() {
|
|
5070
|
-
return;
|
|
5071
|
-
}
|
|
5072
|
-
}
|
|
5135
|
+
}], ctorParameters: () => [] });
|
|
5073
5136
|
|
|
5074
5137
|
/**
|
|
5075
5138
|
* Adaptive FPS controller that monitors the incoming WebRTC video stream
|
|
@@ -5148,6 +5211,7 @@ class FpsMonitorService {
|
|
|
5148
5211
|
constructor() {
|
|
5149
5212
|
this.videoService = inject(VideoService);
|
|
5150
5213
|
this.store = inject(Store);
|
|
5214
|
+
this.unrealConfig = inject(UNREAL_CONFIG, { optional: true });
|
|
5151
5215
|
/** Discrete FPS targets the controller can switch between (ascending order). */
|
|
5152
5216
|
this.FPS_STEPS = [30, 40, 50, 60];
|
|
5153
5217
|
/** Reference ceiling for bitrate (bits/sec) used to normalize a bitrate load to 0..1. */
|
|
@@ -5185,6 +5249,9 @@ class FpsMonitorService {
|
|
|
5185
5249
|
this.init();
|
|
5186
5250
|
}
|
|
5187
5251
|
init() {
|
|
5252
|
+
if (this.unrealConfig?.playwright || !this.unrealConfig?.fpsMonitor) {
|
|
5253
|
+
return;
|
|
5254
|
+
}
|
|
5188
5255
|
// Reset mutable state and re-subscribe when a new session starts
|
|
5189
5256
|
this.store
|
|
5190
5257
|
.select(unrealFeature.selectViewportReady)
|
|
@@ -5426,159 +5493,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
5426
5493
|
type: Injectable
|
|
5427
5494
|
}], ctorParameters: () => [] });
|
|
5428
5495
|
|
|
5429
|
-
class FpsMonitorEmptyService extends FpsMonitorService {
|
|
5430
|
-
init() {
|
|
5431
|
-
return;
|
|
5432
|
-
}
|
|
5433
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FpsMonitorEmptyService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5434
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FpsMonitorEmptyService }); }
|
|
5435
|
-
}
|
|
5436
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FpsMonitorEmptyService, decorators: [{
|
|
5437
|
-
type: Injectable
|
|
5438
|
-
}] });
|
|
5439
|
-
|
|
5440
|
-
class InputPlaywrightService extends InputService {
|
|
5441
|
-
init() {
|
|
5442
|
-
return;
|
|
5443
|
-
}
|
|
5444
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: InputPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5445
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: InputPlaywrightService }); }
|
|
5446
|
-
}
|
|
5447
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: InputPlaywrightService, decorators: [{
|
|
5448
|
-
type: Injectable
|
|
5449
|
-
}] });
|
|
5450
|
-
|
|
5451
|
-
const ReceivedMimeTypes = {
|
|
5452
|
-
ApplicationJson: 'application/json',
|
|
5453
|
-
};
|
|
5454
|
-
|
|
5455
|
-
class FileHandlerService {
|
|
5456
|
-
constructor() {
|
|
5457
|
-
this.fileService = inject(FileReceiverService);
|
|
5458
|
-
this.fileHandlers = {
|
|
5459
|
-
[ReceivedMimeTypes.ApplicationJson]: this.handleJsonFile.bind(this),
|
|
5460
|
-
};
|
|
5461
|
-
}
|
|
5462
|
-
handleJsonFile(data, correlationId) {
|
|
5463
|
-
const { blob } = data;
|
|
5464
|
-
return from(blob.text()).pipe(map$1((text) => JSON.parse(text)), filter(({ commandCallback }) => {
|
|
5465
|
-
return commandCallback.correlationId === correlationId;
|
|
5466
|
-
}));
|
|
5467
|
-
}
|
|
5468
|
-
observeFileResponse(mimetype, data, sender, timeOut = 60000) {
|
|
5469
|
-
const correlationId = generateUuid();
|
|
5470
|
-
const out = { ...data, correlationId };
|
|
5471
|
-
const observable = this.fileService.fileComplete$.pipe(switchMap((data) => {
|
|
5472
|
-
if (data.valid && this.fileHandlers[mimetype]) {
|
|
5473
|
-
return this.fileHandlers[mimetype](data, correlationId).pipe(filter(Truthy));
|
|
5474
|
-
}
|
|
5475
|
-
return of(null);
|
|
5476
|
-
}), timeout(timeOut), catchError((e) => {
|
|
5477
|
-
Logger.error(e);
|
|
5478
|
-
return of(null);
|
|
5479
|
-
}), take(1));
|
|
5480
|
-
setTimeout(() => sender(out), 0);
|
|
5481
|
-
return observable;
|
|
5482
|
-
}
|
|
5483
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5484
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService }); }
|
|
5485
|
-
}
|
|
5486
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FileHandlerService, decorators: [{
|
|
5487
|
-
type: Injectable
|
|
5488
|
-
}] });
|
|
5489
|
-
|
|
5490
|
-
class AnalyticsService extends SubService {
|
|
5491
|
-
#store = inject(Store);
|
|
5492
|
-
/** Signals monitorMouse inner subscriptions to stop (viewport lost / new session). */
|
|
5493
|
-
#stopMouse$ = new Subject();
|
|
5494
|
-
sendEventToMixPanel(name, params = {}) {
|
|
5495
|
-
Logger.log('Analytics Event:', name, params);
|
|
5496
|
-
this.#store.dispatch(saveAnalyticsEvent({ event: { name, params } }));
|
|
5497
|
-
}
|
|
5498
|
-
constructor() {
|
|
5499
|
-
super();
|
|
5500
|
-
const abortSignal$ = this.#store
|
|
5501
|
-
.select(unrealFeature.selectViewportReady)
|
|
5502
|
-
.pipe(filter$1(Falsy), map(() => void 0));
|
|
5503
|
-
this.#store
|
|
5504
|
-
.select(unrealFeature.selectViewportReady)
|
|
5505
|
-
.pipe(distinctUntilChanged(), filter$1(Truthy), tap(() => this.monitorMouse(abortSignal$)))
|
|
5506
|
-
.subscribe();
|
|
5507
|
-
}
|
|
5508
|
-
monitorMouse(abortSignal$) {
|
|
5509
|
-
this.#stopMouse$.next();
|
|
5510
|
-
const stop$ = merge(this.#stopMouse$.asObservable(), abortSignal$);
|
|
5511
|
-
const element = document.getElementById('streamingVideo');
|
|
5512
|
-
if (!element) {
|
|
5513
|
-
return;
|
|
5514
|
-
}
|
|
5515
|
-
// Monitor mousewheel events
|
|
5516
|
-
const mousewheel$ = fromEvent(element, 'wheel').pipe(takeUntil$1(stop$), throttleTime(1000));
|
|
5517
|
-
// Monitor mouse button states
|
|
5518
|
-
const mousedown$ = fromEvent(element, 'mousedown').pipe(takeUntil$1(stop$));
|
|
5519
|
-
const touchStart$ = fromEvent(element, 'touchstart').pipe(takeUntil$1(stop$));
|
|
5520
|
-
const touchMove$ = fromEvent(element, 'touchmove').pipe(takeUntil$1(stop$), throttleTime(200));
|
|
5521
|
-
// Track mouse movement while the left or right button is pressed
|
|
5522
|
-
mousedown$
|
|
5523
|
-
.pipe(filter$1((event) => event.button === 0 || event.button === 2), tap((downEvent) => {
|
|
5524
|
-
this.sendEventToMixPanel('mouse_interaction', {
|
|
5525
|
-
viewX: downEvent.clientX / element.clientWidth,
|
|
5526
|
-
viewY: downEvent.clientY / element.clientHeight,
|
|
5527
|
-
action: downEvent.button === 0 ? 'spinning' : 'panning',
|
|
5528
|
-
});
|
|
5529
|
-
}))
|
|
5530
|
-
.subscribe();
|
|
5531
|
-
// Track mouse movement while the left or right button is pressed
|
|
5532
|
-
touchStart$
|
|
5533
|
-
.pipe(tap((downEvent) => {
|
|
5534
|
-
const totalTouches = downEvent.touches.length;
|
|
5535
|
-
const touch = downEvent.touches[0];
|
|
5536
|
-
this.sendEventToMixPanel('touch_interaction', {
|
|
5537
|
-
viewX: touch.clientX / element.clientWidth,
|
|
5538
|
-
viewY: touch.clientY / element.clientHeight,
|
|
5539
|
-
action: totalTouches === 1 ? 'spinning' : 'panning',
|
|
5540
|
-
});
|
|
5541
|
-
}))
|
|
5542
|
-
.subscribe();
|
|
5543
|
-
let initialTouchDistance = 0;
|
|
5544
|
-
// Subscribe to mousewheel events
|
|
5545
|
-
touchMove$.subscribe((event) => {
|
|
5546
|
-
const totalTouches = event.touches.length;
|
|
5547
|
-
if (totalTouches < 2) {
|
|
5548
|
-
return;
|
|
5549
|
-
}
|
|
5550
|
-
// Calculate the current distance between two touches
|
|
5551
|
-
const touch1 = event.touches[0];
|
|
5552
|
-
const touch2 = event.touches[1];
|
|
5553
|
-
const currentDistance = Math.sqrt(Math.pow(touch2.clientX - touch1.clientX, 2) +
|
|
5554
|
-
Math.pow(touch2.clientY - touch1.clientY, 2));
|
|
5555
|
-
// Determine if zooming in or out based on distance change
|
|
5556
|
-
const deltaDistance = currentDistance - initialTouchDistance;
|
|
5557
|
-
const isZoomingIn = deltaDistance > 0;
|
|
5558
|
-
// Only send event if there's a significant change (avoid noise)
|
|
5559
|
-
if (Math.abs(deltaDistance) > 10) {
|
|
5560
|
-
this.sendEventToMixPanel('touch_zoom_interaction', {
|
|
5561
|
-
delta: isZoomingIn ? 1 : -1,
|
|
5562
|
-
action: isZoomingIn ? 'zoomin' : 'zoomout',
|
|
5563
|
-
});
|
|
5564
|
-
// Update initial distance for next comparison
|
|
5565
|
-
initialTouchDistance = currentDistance;
|
|
5566
|
-
}
|
|
5567
|
-
});
|
|
5568
|
-
mousewheel$.subscribe((event) => {
|
|
5569
|
-
this.sendEventToMixPanel('mouse_zoom_interaction', {
|
|
5570
|
-
delta: -(event.deltaY / Math.abs(event.deltaY)),
|
|
5571
|
-
action: event.deltaY < 0 ? 'zoomin' : 'zoomout',
|
|
5572
|
-
});
|
|
5573
|
-
});
|
|
5574
|
-
}
|
|
5575
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5576
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService }); }
|
|
5577
|
-
}
|
|
5578
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: AnalyticsService, decorators: [{
|
|
5579
|
-
type: Injectable
|
|
5580
|
-
}], ctorParameters: () => [] });
|
|
5581
|
-
|
|
5582
5496
|
class UnrealCallbackService {
|
|
5583
5497
|
constructor() {
|
|
5584
5498
|
this.actions$ = inject(Actions);
|
|
@@ -6197,10 +6111,7 @@ class UnrealSceneComponent {
|
|
|
6197
6111
|
this.videoService = inject(VideoService);
|
|
6198
6112
|
this.element = inject(ElementRef);
|
|
6199
6113
|
this.destroyRef = inject(DestroyRef);
|
|
6200
|
-
this.destroyRef.onDestroy(() =>
|
|
6201
|
-
console.log('DEBUG: UnrealSceneComponent destroyed');
|
|
6202
|
-
this.#store.dispatch(destroyUnrealScene());
|
|
6203
|
-
});
|
|
6114
|
+
this.destroyRef.onDestroy(() => this.#store.dispatch(destroyUnrealScene()));
|
|
6204
6115
|
effect(() => {
|
|
6205
6116
|
const videoElement = this.videoElement();
|
|
6206
6117
|
const isExistMatchUrls = this.isExistMatchUrls();
|
|
@@ -6526,7 +6437,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
6526
6437
|
args: [{ selector: 'app-low-bandwidth-detector', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FilterSettingsComponent], template: "@if (isReducedQuality() || isLowBandwidth()) {\n <div\n [class.expanded]=\"isIndicatorExpanded() && isLowBandwidth()\"\n class=\"lbm-indicator freeze-loader\"\n >\n <div (click)=\"toggleIndicator(true)\" class=\"lbm-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 20 20\">\n <path\n fill=\"#85888E\"\n d=\"M7.189 3.605c-.73.145-1.438.35-2.126.614A14.412 14.412 0 0 0 .896 6.666a1.08 1.08 0 0 0-.375.844c0 .34.118.629.354.865s.524.36.865.375c.34.014.65-.09.927-.313a11.89 11.89 0 0 1 3.385-1.916 10.94 10.94 0 0 1 1.235-.375l-.098-2.541ZM7.385 8.708a9.107 9.107 0 0 0-2.906 1.48c-.264.194-.402.464-.416.812-.014.347.104.646.354.896.236.236.524.364.864.385.34.02.664-.073.97-.281.422-.29.878-.53 1.368-.721a2.545 2.545 0 0 1-.166-.814l-.068-1.757ZM12.386 11.267c.094-.25.15-.52.161-.802l.068-1.755a9.019 9.019 0 0 1 2.927 1.52c.264.193.4.46.406.801.007.34-.114.635-.364.885a1.213 1.213 0 0 1-.865.365A1.614 1.614 0 0 1 13.77 12a6.574 6.574 0 0 0-1.385-.733ZM12.713 6.146l.098-2.542c.73.146 1.438.351 2.127.615 1.541.59 2.93 1.406 4.166 2.447.25.223.379.5.386.834.007.333-.115.625-.365.875a1.253 1.253 0 0 1-.864.375c-.34.014-.65-.09-.927-.313a11.892 11.892 0 0 0-3.386-1.916 10.94 10.94 0 0 0-1.235-.375ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n />\n <path\n fill=\"#fff\"\n fill-rule=\"evenodd\"\n d=\"M10 .833c-.91 0-1.637.756-1.602 1.665l.304 7.92a1.299 1.299 0 0 0 2.596 0l.305-7.92A1.604 1.604 0 0 0 10 .833ZM8.813 16.187c.32.32.715.48 1.187.48.472 0 .868-.16 1.188-.48.32-.32.479-.715.479-1.187 0-.473-.16-.868-.48-1.188-.319-.32-.715-.479-1.187-.479-.472 0-.868.16-1.187.48-.32.319-.48.714-.48 1.187 0 .472.16.868.48 1.187Z\"\n clip-rule=\"evenodd\"\n />\n </svg>\n </div>\n\n <div\n [class.lbm-message--open]=\"isLowBandwidth() && isIndicatorExpanded()\"\n class=\"lbm-message\"\n >\n <p class=\"lbm-description\">\n Fluid Interactivity Modes were disabled due to an unstable connection.\n\n <button\n (click)=\"openLBMDialog()\"\n [attr.data-testid]=\"'learn-more-lbm'\"\n type=\"button\"\n class=\"lbm-learn-more\"\n >\n Learn more\n </button>\n </p>\n <button\n (click)=\"toggleIndicator(false)\"\n [attr.data-testid]=\"'close-lbm-indicator'\"\n type=\"button\"\n class=\"lbm-close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M10.0001 11.2289L6.68618 14.5428C6.51951 14.7095 6.31818 14.7895 6.08218 14.7828C5.84618 14.7755 5.64485 14.6885 5.47818 14.5218C5.31151 14.3552 5.22818 14.1505 5.22818 13.9078C5.22818 13.6645 5.31151 13.4595 5.47818 13.2928L8.77107 9.99992L5.45718 6.68603C5.29051 6.51936 5.21051 6.3147 5.21718 6.07203C5.22451 5.8287 5.31151 5.6237 5.47818 5.45703C5.64485 5.29036 5.84951 5.20703 6.09218 5.20703C6.33551 5.20703 6.54051 5.29036 6.70718 5.45703L10.0001 8.77092L13.314 5.45703C13.4806 5.29036 13.6853 5.20703 13.928 5.20703C14.1713 5.20703 14.3763 5.29036 14.543 5.45703C14.7096 5.6237 14.793 5.8287 14.793 6.07203C14.793 6.3147 14.7096 6.51936 14.543 6.68603L11.2291 9.99992L14.543 13.3138C14.7096 13.4805 14.793 13.6818 14.793 13.9178C14.793 14.1538 14.7096 14.3552 14.543 14.5218C14.3763 14.6885 14.1713 14.7718 13.928 14.7718C13.6853 14.7718 13.4806 14.6885 13.314 14.5218L10.0001 11.2289Z\"\n fill=\"white\"\n />\n </svg>\n </button>\n </div>\n </div>\n}\n\n@if (isDevMode) {\n <app-filter-settings />\n}\n", styles: [".freeze-loader,.lbm-indicator{--lbmPositionTop: 18px;--lbmPositionLeft: 18px;--lbmPositionRight: 18px;--lbmIndicatorSize: 36px;--lbmIndicatorBorderRadius: 8px;--lbmIndicatorCloseSize: 20px;--lbmPadding: 10px;--lbmTextSize: 13px;--lbmLineHeight: 20px;--lbmTextColor: #ffffff;--lbmBackgroundColor: rgba(17, 24, 39, .7);position:absolute;top:var(--lbmPositionTop);left:var(--lbmPositionLeft);z-index:10;display:flex;justify-content:center;align-items:flex-start;min-width:var(--lbmIndicatorSize);min-height:var(--lbmIndicatorSize);overflow:hidden}.freeze-loader.expanded,.lbm-indicator.expanded{--lbmPositionTop: 8px;--lbmPositionLeft: 8px;--lbmPositionRight: 8px;width:auto;max-width:calc(100% - var(--lbmPositionLeft) - var(--lbmPositionRight));padding:var(--lbmPadding);background:var(--lbmBackgroundColor);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:var(--lbmIndicatorBorderRadius);gap:12px}.freeze-loader .lbm-icon,.lbm-indicator .lbm-icon{display:flex;width:var(--lbmIndicatorSize);height:var(--lbmIndicatorSize);padding:8px;color:#fff;background-color:var(--lbmBackgroundColor);border-radius:50%;flex-shrink:0;cursor:pointer}.freeze-loader .lbm-icon svg,.freeze-loader .lbm-icon img,.lbm-indicator .lbm-icon svg,.lbm-indicator .lbm-icon img{width:100%;height:100%}.freeze-loader .lbm-close,.lbm-indicator .lbm-close{position:absolute;top:0;right:0;width:var(--lbmIndicatorCloseSize);height:var(--lbmIndicatorCloseSize);background-color:transparent;border:none;padding:0;cursor:pointer}.freeze-loader .lbm-message,.lbm-indicator .lbm-message{position:relative;opacity:0;height:0;max-width:0;padding-right:24px;pointer-events:none;visibility:hidden;animation:closeMessage .3s forwards}.freeze-loader .lbm-message--open,.lbm-indicator .lbm-message--open{position:relative;visibility:visible;display:flex;align-items:center;align-self:center;pointer-events:all;gap:12px;max-width:fit-content;height:auto;opacity:1;animation:openMessage .3s forwards}.freeze-loader .lbm-description,.lbm-indicator .lbm-description{margin:0;font-size:var(--lbmTextSize);font-weight:400;line-height:var(--lbmLineHeight);color:var(--lbmTextColor)}.freeze-loader .lbm-learn-more,.lbm-indicator .lbm-learn-more{display:inline-flex;padding:0;font-size:var(--lbmTextSize);font-weight:400;line-height:var(--lbmLineHeight);color:var(--lbmTextColor);text-decoration-line:underline;background-color:transparent;border:none;cursor:pointer}.freeze-loader .lbm-learn-more:hover,.lbm-indicator .lbm-learn-more:hover{text-decoration:none}@keyframes openMessage{0%{opacity:0;max-width:0;height:0}10%{height:auto;max-width:fit-content}to{opacity:1;height:auto;max-width:fit-content}}@keyframes closeMessage{0%{opacity:1;max-width:fit-content}to{opacity:0;max-width:0}}\n"] }]
|
|
6527
6438
|
}] });
|
|
6528
6439
|
|
|
6529
|
-
function provideUnrealModule(
|
|
6440
|
+
function provideUnrealModule() {
|
|
6530
6441
|
return makeEnvironmentProviders([
|
|
6531
6442
|
provideState(commandsFeature),
|
|
6532
6443
|
provideState(unrealFeature),
|
|
@@ -6539,69 +6450,22 @@ function provideUnrealModule(config) {
|
|
|
6539
6450
|
FileHandlerService,
|
|
6540
6451
|
AnalyticsService,
|
|
6541
6452
|
UnrealCallbackService,
|
|
6453
|
+
CommandTelemetryService,
|
|
6454
|
+
AggregatorService,
|
|
6455
|
+
FreezeFrameService,
|
|
6456
|
+
UnrealCommunicatorService,
|
|
6457
|
+
AFKService,
|
|
6458
|
+
SignallingService,
|
|
6459
|
+
StreamStatusTelemetryService,
|
|
6460
|
+
FpsMonitorService,
|
|
6542
6461
|
{
|
|
6543
6462
|
provide: WebRtcPlayerService,
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
useClass: config?.playwright || !config?.fpsMonitor
|
|
6551
|
-
? FpsMonitorEmptyService
|
|
6552
|
-
: FpsMonitorService,
|
|
6553
|
-
},
|
|
6554
|
-
{
|
|
6555
|
-
provide: StreamStatusTelemetryService,
|
|
6556
|
-
useClass: config?.playwright
|
|
6557
|
-
? StreamStatusTelemetryPlaywrightService
|
|
6558
|
-
: StreamStatusTelemetryService,
|
|
6559
|
-
},
|
|
6560
|
-
{
|
|
6561
|
-
provide: CommandTelemetryService,
|
|
6562
|
-
useClass: config?.playwright
|
|
6563
|
-
? CommandTelemetryPlaywrightService
|
|
6564
|
-
: CommandTelemetryService,
|
|
6565
|
-
},
|
|
6566
|
-
{
|
|
6567
|
-
provide: AggregatorService,
|
|
6568
|
-
useClass: config?.playwright
|
|
6569
|
-
? AggregatorPlaywrightService
|
|
6570
|
-
: AggregatorService,
|
|
6571
|
-
},
|
|
6572
|
-
{
|
|
6573
|
-
provide: FreezeFrameService,
|
|
6574
|
-
useClass: config?.playwright
|
|
6575
|
-
? FreezeFramePlaywrightService
|
|
6576
|
-
: FreezeFrameService,
|
|
6577
|
-
},
|
|
6578
|
-
{
|
|
6579
|
-
provide: UnrealCommunicatorService,
|
|
6580
|
-
useClass: config?.playwright
|
|
6581
|
-
? UnrealCommunicatorPlaywrightService
|
|
6582
|
-
: UnrealCommunicatorService,
|
|
6583
|
-
},
|
|
6584
|
-
{
|
|
6585
|
-
provide: AFKService,
|
|
6586
|
-
useClass: config?.playwright ? AfkPlaywrightService : AFKService,
|
|
6587
|
-
},
|
|
6588
|
-
{
|
|
6589
|
-
provide: SignallingService,
|
|
6590
|
-
useClass: config?.playwright
|
|
6591
|
-
? SignallingPlaywrightService
|
|
6592
|
-
: SignallingService,
|
|
6593
|
-
},
|
|
6594
|
-
{
|
|
6595
|
-
provide: ConsoleExtensionsService,
|
|
6596
|
-
useClass: config?.playwright
|
|
6597
|
-
? ConsoleExtensionsPlaywrightService
|
|
6598
|
-
: ConsoleExtensionsService,
|
|
6599
|
-
},
|
|
6600
|
-
{
|
|
6601
|
-
provide: FileReceiverService,
|
|
6602
|
-
useClass: config?.playwright
|
|
6603
|
-
? FileReceiverPlaywrightService
|
|
6604
|
-
: FileReceiverService,
|
|
6463
|
+
useFactory: () => {
|
|
6464
|
+
const config = inject(UNREAL_CONFIG, { optional: true });
|
|
6465
|
+
return config?.newWebRtcConnector
|
|
6466
|
+
? new WebRtcPlayerService2()
|
|
6467
|
+
: new WebRtcPlayerService();
|
|
6468
|
+
},
|
|
6605
6469
|
},
|
|
6606
6470
|
provideEnvironmentInitializer(() => {
|
|
6607
6471
|
inject(AggregatorService);
|
|
@@ -6620,5 +6484,5 @@ function provideUnrealModule(config) {
|
|
|
6620
6484
|
* Generated bundle index. Do not edit.
|
|
6621
6485
|
*/
|
|
6622
6486
|
|
|
6623
|
-
export { AFKService,
|
|
6487
|
+
export { AFKService, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CONSOLE_COMMAND_DISABLE_MESSAGES, CONSOLE_COMMAND_ENABLE_MESSAGES, CONSOLE_COMMAND_PIXEL_QUALITY, CommandTelemetryService, CommandsEffects, ConfigHandler, ConsoleExtensionsService, ControlScheme, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DEFAULT_RECONNECT_DELAY_MS, DEFAULT_RECONNECT_ENABLED, DEFAULT_RECONNECT_MAX_ATTEMPTS, DEFAULT_RECONNECT_ON_DATACHANNEL_CLOSE, DEFAULT_RECONNECT_ON_ICE_FAILURE, DataFlowMonitor, DevModeService, DisconnectReason, FULL_HD_HEIGHT, FULL_HD_WIDTH, FileHandlerService, FileReceiverService, FilterSettingsComponent, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, KalmanFilter1D, LatencyTimings, LowBandwidthDetectorComponent, LowBandwidthModalComponent, MINIMAL_FPS, MessageType, MouseButton, MouseButtonsMask, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PingHandler, PlayerCountHandler, RegionsPingService, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamStatusTelemetryService, SubService, ToClientMessage, UNREAL_CONFIG, UnrealCallbackService, UnrealCommunicatorService, UnrealEffects, UnrealSceneComponent, UnrealStatusMessage, VideoService, VideoStatsComponent, WSCloseCode_CIRRUS_ABNORMAL_CLOSURE, WSCloseCode_CIRRUS_MAX_PLAYERS_ERROR, WSCloseCode_CIRRUS_PLAYER_DISCONNECTED, WSCloseCode_CIRRUS_STREAMER_KIKED_PLAYER, WSCloseCode_FORCE_CIRRUS_CLOSE, WSCloseCode_NORMAL_AFK_TIMEOUT, WSCloseCode_NORMAL_CLOSURE, WSCloseCode_NORMAL_MANUAL_DISCONNECT, WSCloseCode_UNKNOWN, WSCloseCodes, WS_OPEN_STATE, WS_TIMEOUT, WebRtcPlayerService, WebRtcPlayerService2, WebrtcErrorModalComponent, abortEstablishingConnection, changeLowBandwidth, changeStatusMainVideoOnScene, changeStreamResolutionAction, changeStreamResolutionSuccessAction, commandCompleted, commandStarted, commandsFeature, commandsReducer, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, dropDC, dropPC, floatToSmoothPercents, forceResizeViewport, fromResizeObserver, getActiveUrl, getImageFromVideoStream, getResizeStudioValues, getResizeStudioValuesOld, getResizeValuesUniversal, getResizeValuesUniversalOld, getRtcErrorMessage, iceConnectionFailed, initSignalling, keepMaxUntilReset, makeEven, provideUnrealModule, qpToQuality, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, resetAfk, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetWarnTimeout, saveAnalyticsEvent, selectClientAndViewIds, selectCommandProgress, selectCommandsInProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsLoaderScreenVisible, selectIsVideoPlayingAndDataChannelConnected, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectWarnTimeout, setAfkTimerCountdown, setAfkTimerHide, setAfkTimerVisible, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setDataChannelConnected, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setKalmanSettings, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setOrchestrationContext, setOrchestrationMessage, setOrchestrationParameters, setOrchestrationProgress, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealPlaywrightConfig, setViewportNotReady, setViewportReady, showUnrealErrorMessage, smoothTransition, startStream, trackMixpanelEvent, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
|
|
6624
6488
|
//# sourceMappingURL=3dsource-angular-unreal-module.mjs.map
|