@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
- // Note: do NOT call videoService.setContainer(null) here.
1278
- // This effect runs asynchronously and would race with a new
1279
- // UnrealSceneComponent that already set its container via
1280
- // afterNextRender. The container's children are cleaned by
1281
- // VideoService.destroy() which is triggered via disconnect$.
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.unrealInitialConfig = inject(UNREAL_CONFIG, {
2094
+ this.unrealConfig = inject(UNREAL_CONFIG, {
2091
2095
  optional: true,
2092
2096
  });
2093
2097
  this.init();
2094
2098
  }
2095
2099
  init() {
2096
- if (!this.unrealInitialConfig?.commandTelemetryReceiver) {
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.unrealInitialConfig?.commandTelemetryReceiver || '', out)
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.unrealInitialConfig = inject(UNREAL_CONFIG);
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.unrealInitialConfig?.screenLockerContainerId ||
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 = inject(HttpClient);
3592
- #commandsSender = inject(UnrealCommunicatorService);
3593
- #isDevMode = inject(DevModeService).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 = inject(Store);
4377
- #videoService = inject(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 already reconnecting
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
- class AfkPlaywrightService extends AFKService {
4965
- init() {
4966
- return;
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 SignallingPlaywrightService extends SignallingService {
5010
+ class FileHandlerService {
4976
5011
  constructor() {
4977
- super();
4978
- }
4979
- init() {
4980
- return;
5012
+ this.fileService = inject(FileReceiverService);
5013
+ this.fileHandlers = {
5014
+ [ReceivedMimeTypes.ApplicationJson]: this.handleJsonFile.bind(this),
5015
+ };
4981
5016
  }
4982
- connectToSignaling() {
4983
- this.store.dispatch(setUnrealPlaywrightConfig());
4984
- this.store.dispatch(dataChannelConnected({
4985
- statusMessage: 'Playwright set data channel connected',
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
- sendCommandToUnreal() {
5001
- return;
5002
- }
5003
- sendInputData() {
5004
- return;
5005
- }
5006
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCommunicatorPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
5007
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCommunicatorPlaywrightService }); }
5008
- }
5009
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: UnrealCommunicatorPlaywrightService, decorators: [{
5010
- type: Injectable
5011
- }] });
5012
-
5013
- class AggregatorPlaywrightService extends AggregatorService {
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: FreezeFramePlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
5029
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: FreezeFramePlaywrightService }); }
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: FreezeFramePlaywrightService, decorators: [{
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 CommandTelemetryPlaywrightService extends CommandTelemetryService {
5036
- init() {
5037
- return;
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
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandTelemetryPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
5040
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandTelemetryPlaywrightService }); }
5041
- }
5042
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CommandTelemetryPlaywrightService, decorators: [{
5043
- type: Injectable
5044
- }] });
5045
-
5046
- class StreamStatusTelemetryPlaywrightService extends StreamStatusTelemetryService {
5047
- init() {
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
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: StreamStatusTelemetryPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
5051
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: StreamStatusTelemetryPlaywrightService }); }
5052
- }
5053
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: StreamStatusTelemetryPlaywrightService, decorators: [{
5054
- type: Injectable
5055
- }] });
5056
-
5057
- class ConsoleExtensionsPlaywrightService extends ConsoleExtensionsService {
5058
- init() {
5059
- return;
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: ConsoleExtensionsPlaywrightService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
5062
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: ConsoleExtensionsPlaywrightService }); }
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: ConsoleExtensionsPlaywrightService, decorators: [{
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(config) {
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
- useClass: config?.newWebRtcConnector
6545
- ? WebRtcPlayerService2
6546
- : WebRtcPlayerService,
6547
- },
6548
- {
6549
- provide: FpsMonitorService,
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, 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, FpsMonitorEmptyService, 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, 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 };
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