@3dsource/angular-unreal-module 0.0.156 → 0.0.158
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { ElementRef, Signal, InjectionToken, DestroyRef,
|
|
2
|
+
import { ElementRef, Signal, InjectionToken, DestroyRef, PipeTransform } from '@angular/core';
|
|
3
|
+
import * as _ngrx_store from '@ngrx/store';
|
|
4
|
+
import { Store } from '@ngrx/store';
|
|
3
5
|
import * as _3dsource_angular_unreal_module from '@3dsource/angular-unreal-module';
|
|
4
6
|
import * as rxjs from 'rxjs';
|
|
5
7
|
import { Subject, Observable, Subscription, OperatorFunction } from 'rxjs';
|
|
6
|
-
import * as _ngrx_store from '@ngrx/store';
|
|
7
|
-
import { Store } from '@ngrx/store';
|
|
8
8
|
import * as _ngrx_effects from '@ngrx/effects';
|
|
9
9
|
import { Actions } from '@ngrx/effects';
|
|
10
10
|
import { IKeyCode, ImageOutputValues, Area } from '@3dsource/utils';
|
|
@@ -30,13 +30,6 @@ declare class FreezeFrameComponent {
|
|
|
30
30
|
static ɵcmp: i0.ɵɵComponentDeclaration<FreezeFrameComponent, "app-freeze-frame", never, {}, {}, never, never, true, never>;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
declare class LowBandwidthModalComponent {
|
|
34
|
-
#private;
|
|
35
|
-
close(value?: boolean): void;
|
|
36
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<LowBandwidthModalComponent, never>;
|
|
37
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<LowBandwidthModalComponent, "app-low-bandwidth-modal", never, {}, {}, never, never, true, never>;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
33
|
declare class ImageLoadingSrcComponent {
|
|
41
34
|
#private;
|
|
42
35
|
readonly isLoaderScreenVisible: i0.Signal<boolean>;
|
|
@@ -149,7 +142,7 @@ declare class VideoStatsComponent {
|
|
|
149
142
|
}>;
|
|
150
143
|
readonly videoStatus: Signal<{
|
|
151
144
|
key: string;
|
|
152
|
-
value: string | number | Record<string, string> |
|
|
145
|
+
value: string | number | Record<string, string> | {
|
|
153
146
|
local: {
|
|
154
147
|
type: string;
|
|
155
148
|
url: string;
|
|
@@ -183,6 +176,81 @@ declare class WebrtcErrorModalComponent {
|
|
|
183
176
|
static ɵcmp: i0.ɵɵComponentDeclaration<WebrtcErrorModalComponent, "app-webrtc-error-modal", never, {}, {}, never, never, true, never>;
|
|
184
177
|
}
|
|
185
178
|
|
|
179
|
+
declare const SpecialKeyCodes: {
|
|
180
|
+
BackSpace: number;
|
|
181
|
+
Shift: number;
|
|
182
|
+
Control: number;
|
|
183
|
+
Alt: number;
|
|
184
|
+
RightShift: number;
|
|
185
|
+
RightControl: number;
|
|
186
|
+
RightAlt: number;
|
|
187
|
+
};
|
|
188
|
+
declare const MouseButton: {
|
|
189
|
+
MainButton: number;
|
|
190
|
+
AuxiliaryButton: number;
|
|
191
|
+
SecondaryButton: number;
|
|
192
|
+
FourthButton: number;
|
|
193
|
+
FifthButton: number;
|
|
194
|
+
};
|
|
195
|
+
declare const MouseButtonsMask: {
|
|
196
|
+
PrimaryButton: number;
|
|
197
|
+
SecondaryButton: number;
|
|
198
|
+
AuxiliaryButton: number;
|
|
199
|
+
FourthButton: number;
|
|
200
|
+
FifthButton: number;
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
declare const ControlScheme: {
|
|
204
|
+
readonly LockedMouse: 0;
|
|
205
|
+
readonly HoveringMouse: 1;
|
|
206
|
+
readonly Default: 2;
|
|
207
|
+
};
|
|
208
|
+
type ControlSchemeValues = (typeof ControlScheme)[keyof typeof ControlScheme];
|
|
209
|
+
|
|
210
|
+
declare const MessageType: {
|
|
211
|
+
readonly IFrameRequest: 0;
|
|
212
|
+
readonly RequestQualityControl: 1;
|
|
213
|
+
readonly MaxFpsRequest: 2;
|
|
214
|
+
readonly AverageBitrateRequest: 3;
|
|
215
|
+
readonly StartStreaming: 4;
|
|
216
|
+
readonly StopStreaming: 5;
|
|
217
|
+
readonly LatencyTest: 6;
|
|
218
|
+
readonly RequestInitialSettings: 7;
|
|
219
|
+
readonly UIInteraction: 50;
|
|
220
|
+
readonly Command: 51;
|
|
221
|
+
readonly KeyDown: 60;
|
|
222
|
+
readonly KeyUp: 61;
|
|
223
|
+
readonly KeyPress: 62;
|
|
224
|
+
readonly MouseEnter: 70;
|
|
225
|
+
readonly MouseLeave: 71;
|
|
226
|
+
readonly MouseDown: 72;
|
|
227
|
+
readonly MouseUp: 73;
|
|
228
|
+
readonly MouseMove: 74;
|
|
229
|
+
readonly MouseWheel: 75;
|
|
230
|
+
readonly TouchStart: 80;
|
|
231
|
+
readonly TouchEnd: 81;
|
|
232
|
+
readonly TouchMove: 82;
|
|
233
|
+
};
|
|
234
|
+
type MessageTypeValues = (typeof MessageType)[keyof typeof MessageType];
|
|
235
|
+
|
|
236
|
+
declare const ToClientMessage: {
|
|
237
|
+
readonly QualityControlOwnership: 0;
|
|
238
|
+
readonly Response: 1;
|
|
239
|
+
readonly Command: 2;
|
|
240
|
+
readonly FreezeFrame: 3;
|
|
241
|
+
readonly UnfreezeFrame: 4;
|
|
242
|
+
readonly VideoEncoderAvgQP: 5;
|
|
243
|
+
readonly LatencyTest: 6;
|
|
244
|
+
readonly InitialSettings: 7;
|
|
245
|
+
readonly FileExtension: 8;
|
|
246
|
+
readonly FileMimeType: 9;
|
|
247
|
+
readonly FileContents: 10;
|
|
248
|
+
readonly TestEcho: 11;
|
|
249
|
+
readonly InputControlOwnership: 12;
|
|
250
|
+
readonly GamepadResponse: 13;
|
|
251
|
+
readonly Protocol: 255;
|
|
252
|
+
};
|
|
253
|
+
|
|
186
254
|
declare const WSCloseCode_NORMAL_CLOSURE = 3000;
|
|
187
255
|
declare const WSCloseCode_NORMAL_AFK_TIMEOUT = 3001;
|
|
188
256
|
declare const WSCloseCode_NORMAL_MANUAL_DISCONNECT = 3002;
|
|
@@ -298,123 +366,6 @@ declare global {
|
|
|
298
366
|
}
|
|
299
367
|
}
|
|
300
368
|
|
|
301
|
-
declare const SpecialKeyCodes: {
|
|
302
|
-
BackSpace: number;
|
|
303
|
-
Shift: number;
|
|
304
|
-
Control: number;
|
|
305
|
-
Alt: number;
|
|
306
|
-
RightShift: number;
|
|
307
|
-
RightControl: number;
|
|
308
|
-
RightAlt: number;
|
|
309
|
-
};
|
|
310
|
-
declare const MouseButton: {
|
|
311
|
-
MainButton: number;
|
|
312
|
-
AuxiliaryButton: number;
|
|
313
|
-
SecondaryButton: number;
|
|
314
|
-
FourthButton: number;
|
|
315
|
-
FifthButton: number;
|
|
316
|
-
};
|
|
317
|
-
declare const MouseButtonsMask: {
|
|
318
|
-
PrimaryButton: number;
|
|
319
|
-
SecondaryButton: number;
|
|
320
|
-
AuxiliaryButton: number;
|
|
321
|
-
FourthButton: number;
|
|
322
|
-
FifthButton: number;
|
|
323
|
-
};
|
|
324
|
-
|
|
325
|
-
declare const ControlScheme: {
|
|
326
|
-
readonly LockedMouse: 0;
|
|
327
|
-
readonly HoveringMouse: 1;
|
|
328
|
-
readonly Default: 2;
|
|
329
|
-
};
|
|
330
|
-
type ControlSchemeValues = (typeof ControlScheme)[keyof typeof ControlScheme];
|
|
331
|
-
|
|
332
|
-
declare const MessageType: {
|
|
333
|
-
readonly IFrameRequest: 0;
|
|
334
|
-
readonly RequestQualityControl: 1;
|
|
335
|
-
readonly MaxFpsRequest: 2;
|
|
336
|
-
readonly AverageBitrateRequest: 3;
|
|
337
|
-
readonly StartStreaming: 4;
|
|
338
|
-
readonly StopStreaming: 5;
|
|
339
|
-
readonly LatencyTest: 6;
|
|
340
|
-
readonly RequestInitialSettings: 7;
|
|
341
|
-
readonly UIInteraction: 50;
|
|
342
|
-
readonly Command: 51;
|
|
343
|
-
readonly KeyDown: 60;
|
|
344
|
-
readonly KeyUp: 61;
|
|
345
|
-
readonly KeyPress: 62;
|
|
346
|
-
readonly MouseEnter: 70;
|
|
347
|
-
readonly MouseLeave: 71;
|
|
348
|
-
readonly MouseDown: 72;
|
|
349
|
-
readonly MouseUp: 73;
|
|
350
|
-
readonly MouseMove: 74;
|
|
351
|
-
readonly MouseWheel: 75;
|
|
352
|
-
readonly TouchStart: 80;
|
|
353
|
-
readonly TouchEnd: 81;
|
|
354
|
-
readonly TouchMove: 82;
|
|
355
|
-
};
|
|
356
|
-
type MessageTypeValues = (typeof MessageType)[keyof typeof MessageType];
|
|
357
|
-
|
|
358
|
-
declare const ToClientMessage: {
|
|
359
|
-
readonly QualityControlOwnership: 0;
|
|
360
|
-
readonly Response: 1;
|
|
361
|
-
readonly Command: 2;
|
|
362
|
-
readonly FreezeFrame: 3;
|
|
363
|
-
readonly UnfreezeFrame: 4;
|
|
364
|
-
readonly VideoEncoderAvgQP: 5;
|
|
365
|
-
readonly LatencyTest: 6;
|
|
366
|
-
readonly InitialSettings: 7;
|
|
367
|
-
readonly FileExtension: 8;
|
|
368
|
-
readonly FileMimeType: 9;
|
|
369
|
-
readonly FileContents: 10;
|
|
370
|
-
readonly TestEcho: 11;
|
|
371
|
-
readonly InputControlOwnership: 12;
|
|
372
|
-
readonly GamepadResponse: 13;
|
|
373
|
-
readonly Protocol: 255;
|
|
374
|
-
};
|
|
375
|
-
|
|
376
|
-
declare const UNREAL_CONFIG: InjectionToken<UnrealInitialConfig>;
|
|
377
|
-
|
|
378
|
-
declare const InputOptions: InputProps;
|
|
379
|
-
|
|
380
|
-
/** Disconnect reasons that should trigger remote connection cleanup. */
|
|
381
|
-
declare const DESTROY_DISCONNECT_REASONS: DisconnectReasonType[];
|
|
382
|
-
|
|
383
|
-
declare const DEBOUNCE_TO_MANY_RESIZE_CALLS = 100;
|
|
384
|
-
declare const AUTO_HIGH_RESOLUTION_IDLE_MS = 5000;
|
|
385
|
-
declare const SAME_SIZE_THRESHOLD = 1.01;
|
|
386
|
-
declare const MIN_CONTAINER_SIZE = 2;
|
|
387
|
-
declare const MINIMAL_FPS = 6;
|
|
388
|
-
declare const STREAMING_VIDEO_ID = "streamingVideo";
|
|
389
|
-
declare const STREAMING_AUDIO_ID = "streamingAudio";
|
|
390
|
-
declare const FULL_HD_WIDTH = 1920;
|
|
391
|
-
declare const FULL_HD_HEIGHT = 1080;
|
|
392
|
-
declare const WS_TIMEOUT = 6000;
|
|
393
|
-
declare const POLLING_TIME = 4000;
|
|
394
|
-
declare const INNER_RETRY_LIMIT = 3;
|
|
395
|
-
declare const OUTER_RETRY_DELAY: number;
|
|
396
|
-
declare const WS_RETRY_PER_INSTANCE = 1;
|
|
397
|
-
declare const WS_OPEN_STATE = 1;
|
|
398
|
-
declare const DEFAULT_AFK_TIMEOUT_PERIOD = 15;
|
|
399
|
-
declare const DEFAULT_AFK_TIMEOUT = 300;
|
|
400
|
-
declare const DATA_CHANNEL_CONNECTION_TIMEOUT = 8000;
|
|
401
|
-
declare const SIGNALLING_PERCENT_VALUE = 56;
|
|
402
|
-
declare const SCREEN_LOCKER_CONTAINER_ID = "3dsource_start_screen";
|
|
403
|
-
declare const REGION_PING_CACHE_KEY = "3dsource:region-ping";
|
|
404
|
-
declare const REGION_PING_CACHE_TTL_MS: number;
|
|
405
|
-
declare const REGION_PING_ACCURATE_SAMPLES = 3;
|
|
406
|
-
declare const REGION_PING_WARMUP_DEADLINE_MS = 1500;
|
|
407
|
-
declare const REGION_PING_BACKGROUND_REFRESH_DELAY_MS = 5000;
|
|
408
|
-
declare const RECONNECT_CONFIG: {
|
|
409
|
-
readonly enabled: true;
|
|
410
|
-
readonly maxAttempts: 3;
|
|
411
|
-
readonly delayMs: 1000;
|
|
412
|
-
};
|
|
413
|
-
declare const UnrealStatusMessage: {
|
|
414
|
-
readonly CONNECTING_TO_SESSION: "Connecting to session.";
|
|
415
|
-
readonly STARTING_YOUR_SESSION: "Starting your session";
|
|
416
|
-
};
|
|
417
|
-
|
|
418
369
|
interface InputProps {
|
|
419
370
|
controlScheme: ControlSchemeValues;
|
|
420
371
|
suppressBrowserKeys: boolean;
|
|
@@ -620,8 +571,378 @@ interface StreamResolutionProps {
|
|
|
620
571
|
height: number | null;
|
|
621
572
|
}
|
|
622
573
|
|
|
574
|
+
/**
|
|
575
|
+
* Wire contract for every event `StreamStatusTelemetryService2` dispatches
|
|
576
|
+
* through `trackTelemetryData`.
|
|
577
|
+
*
|
|
578
|
+
* This file is the **single source of truth** for the producer side. The
|
|
579
|
+
* consumer side lives in the telemetry viewer
|
|
580
|
+
* (`253.StreamTelemetry/src/app/telemetry/models/telemetry.types.ts`) — any
|
|
581
|
+
* change here needs a paired edit there.
|
|
582
|
+
*
|
|
583
|
+
* Event taxonomy (8 names, 6 payload shapes):
|
|
584
|
+
* | event | payload |
|
|
585
|
+
* |----------------------------|------------------------------------|
|
|
586
|
+
* | `stream.session_started` | {@link SessionStartedData} |
|
|
587
|
+
* | `stream.phase_ended` | {@link PhaseEndedData} |
|
|
588
|
+
* | `stream.session_ended` | {@link SessionEndedData} |
|
|
589
|
+
* | `stream.sample` | {@link SampleData} |
|
|
590
|
+
* | `stream.quality_degraded` | {@link QualityAnomalyData} |
|
|
591
|
+
* | `stream.quality_recovered` | {@link QualityAnomalyData} |
|
|
592
|
+
* | `stream.fps_low` | {@link FpsLowData} |
|
|
593
|
+
* | `stream.signaling_retry` | {@link SignalingRetryData} |
|
|
594
|
+
*/
|
|
595
|
+
/**
|
|
596
|
+
* Every stable id the service can put on the wire — phases, milestones,
|
|
597
|
+
* overlays. The viewer's vocabulary maps each member to a human label, so
|
|
598
|
+
* every id added here needs a paired vocabulary row in the viewer
|
|
599
|
+
* (`telemetry-vocabulary.ts`).
|
|
600
|
+
*/
|
|
601
|
+
type EventId = 'region-resolving' | 'signaling-connection' | 'webrtc-negotiation' | 'unreal-communication' | 'region-ping-fetch-start' | 'region-ping-fetch-end' | 'region-resolved' | 'polling-started' | 'polling-ended' | 'aws-instance-resolved' | 'signaling-ws-connected' | 'instance-reserved' | 'instance-ready' | 'config-received' | 'ssinfo-received' | 'offer-received' | 'answer-sent' | 'answer-received' | 'first-ice-candidate' | 'last-ice-candidate' | 'datachannel-connected' | 'first-command-started' | 'loopback-sent' | 'loopback-received' | 'viewport-ready' | 'polling-to-instance' | 'signaling-handshake' | 'stabilization-warmup';
|
|
602
|
+
/**
|
|
603
|
+
* High-level cause of `stream.session_ended`.
|
|
604
|
+
* - `disconnected` — Cirrus/WebRTC dropped us mid-stream (granular cause
|
|
605
|
+
* rides in {@link SessionEndedData.disconnectReason}).
|
|
606
|
+
* - `pagehide` — tab closed / evicted to bfcache.
|
|
607
|
+
* - `restart` — a new connection attempt superseded this session.
|
|
608
|
+
* - `destroy` — the scene component was torn down (route change).
|
|
609
|
+
*/
|
|
610
|
+
type SessionEndReason = 'disconnected' | 'pagehide' | 'restart' | 'destroy';
|
|
611
|
+
/** Which retry loop in `SignallingService` fired. Mirrors the
|
|
612
|
+
* `signalingRetryAttempted` action's `kind`. */
|
|
613
|
+
type SignalingRetryKind = 'ws-retry' | 'connect' | 'orchestration' | 'region-cycle';
|
|
614
|
+
/**
|
|
615
|
+
* Statistical summary of a time-series metric (bitrate, fps, qp, jitter,
|
|
616
|
+
* rtt) over one aggregation window (5 s, ~20 samples at 250 ms).
|
|
617
|
+
*
|
|
618
|
+
* - `p50` — the typical tick; robust to outliers, primary dashboard signal.
|
|
619
|
+
* - `p95` — the bad tail users actually perceive; preferred for SLOs.
|
|
620
|
+
* - `min` — worst single tick (freeze detection).
|
|
621
|
+
* - `max` — best single tick (did we ever reach the target?).
|
|
622
|
+
*/
|
|
623
|
+
interface WindowAggregate {
|
|
624
|
+
readonly p50: number;
|
|
625
|
+
readonly p95: number;
|
|
626
|
+
readonly min: number;
|
|
627
|
+
readonly max: number;
|
|
628
|
+
}
|
|
629
|
+
/** Milestone pin inside a phase. `id` is stable and kebab-case; the human
|
|
630
|
+
* label lives in the viewer's vocabulary. `time` is anchor-relative ms. */
|
|
631
|
+
interface EmittedMilestone {
|
|
632
|
+
readonly id: EventId;
|
|
633
|
+
readonly time: number;
|
|
634
|
+
}
|
|
635
|
+
/** Display key/value row, rendered verbatim in the viewer's phase tooltip.
|
|
636
|
+
* Always primitives — structured values are pre-formatted by the phase
|
|
637
|
+
* closer before flattening. */
|
|
638
|
+
interface PhaseParam {
|
|
639
|
+
readonly key: string;
|
|
640
|
+
readonly value: string;
|
|
641
|
+
}
|
|
642
|
+
/** Diagonal-striped region inside a phase bar. Endpoints are
|
|
643
|
+
* anchor-relative ms, already resolved by the producer. */
|
|
644
|
+
interface PhaseOverlay {
|
|
645
|
+
readonly fromMs: number;
|
|
646
|
+
readonly toMs: number;
|
|
647
|
+
readonly id: EventId;
|
|
648
|
+
}
|
|
649
|
+
/** Selected WebRTC ICE candidate pair, read off `AggregatedStat`. Flattened
|
|
650
|
+
* to `localCandidate` / `remoteCandidate` params by the viewport closer. */
|
|
651
|
+
interface SelectedIceCandidatePair {
|
|
652
|
+
readonly local: {
|
|
653
|
+
type: string;
|
|
654
|
+
url: string;
|
|
655
|
+
};
|
|
656
|
+
readonly remote: {
|
|
657
|
+
type: string;
|
|
658
|
+
url: string;
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
/** Resource Timing totals for one `initiatorType` (or the grand total).
|
|
662
|
+
* `durationMs` is the SUM across the bucket — with `count` it yields the
|
|
663
|
+
* average per request, and `maxDurationMs` the slowest single one. */
|
|
664
|
+
interface ResourceBucket {
|
|
665
|
+
readonly count: number;
|
|
666
|
+
/** `transferSize === 0 && decodedBodySize > 0` — served from HTTP cache. */
|
|
667
|
+
readonly cachedCount: number;
|
|
668
|
+
readonly transferSize: number;
|
|
669
|
+
readonly encodedBodySize: number;
|
|
670
|
+
readonly decodedBodySize: number;
|
|
671
|
+
readonly durationMs: number;
|
|
672
|
+
readonly maxDurationMs: number;
|
|
673
|
+
}
|
|
674
|
+
interface ResourceTotals extends ResourceBucket {
|
|
675
|
+
readonly byType: Record<string, ResourceBucket>;
|
|
676
|
+
}
|
|
677
|
+
/** One entry of {@link BootstrapInfo.slowestResources}. */
|
|
678
|
+
interface SlowResource {
|
|
679
|
+
/** Path only — origin and query stripped (short, stable, no PII). */
|
|
680
|
+
readonly name: string;
|
|
681
|
+
/** Resource Timing `initiatorType`: 'script' | 'css' | 'img' | 'fetch' | … */
|
|
682
|
+
readonly type: string;
|
|
683
|
+
/** `responseEnd − startTime`, ms. */
|
|
684
|
+
readonly durationMs: number;
|
|
685
|
+
/** Bytes over the wire (0 = served from cache). */
|
|
686
|
+
readonly transferKb: number;
|
|
687
|
+
/** Fetched after `window.load` (lazy route chunk) vs. during page load. */
|
|
688
|
+
readonly lazy: boolean;
|
|
689
|
+
}
|
|
690
|
+
/** Navigation / page-load context explaining the "app bootstrap →
|
|
691
|
+
* session_started" waterfall row. `null` when the Navigation Timing entry
|
|
692
|
+
* is unavailable. */
|
|
693
|
+
interface BootstrapInfo {
|
|
694
|
+
/** `'navigate' | 'reload' | 'back_forward' | 'prerender'`. */
|
|
695
|
+
readonly type: NavigationTimingType;
|
|
696
|
+
/** `nextHopProtocol` — 'h2' / 'h3' / 'http/1.1'. */
|
|
697
|
+
readonly protocol: string | null;
|
|
698
|
+
readonly firstByteMs: number;
|
|
699
|
+
readonly domInteractiveMs: number;
|
|
700
|
+
readonly domContentLoadedMs: number;
|
|
701
|
+
readonly loadEventMs: number;
|
|
702
|
+
readonly navigationTransferSize: number | null;
|
|
703
|
+
readonly navigationEncodedBodySize: number | null;
|
|
704
|
+
readonly navigationDecodedBodySize: number | null;
|
|
705
|
+
/** Resources fetched **before** `loadEventEnd` — page weight. */
|
|
706
|
+
readonly resources: ResourceTotals | null;
|
|
707
|
+
/** Resources fetched **after** `loadEventEnd` — typically lazy chunks for
|
|
708
|
+
* the route the streamer lives on. */
|
|
709
|
+
readonly lazyResources: ResourceTotals | null;
|
|
710
|
+
/** Top-8 slowest individual resources, so the viewer can name the
|
|
711
|
+
* offending file / endpoint. */
|
|
712
|
+
readonly slowestResources: readonly SlowResource[];
|
|
713
|
+
}
|
|
714
|
+
/** Fields present on EVERY event. `userId` is attached centrally by
|
|
715
|
+
* `track()`; the server buckets files under `data/<userId>/<sessionId>`. */
|
|
716
|
+
interface TelemetryEventEnvelope {
|
|
717
|
+
readonly userId: string;
|
|
718
|
+
readonly sessionId: string;
|
|
719
|
+
}
|
|
720
|
+
/** Lifecycle events additionally carry a phase-local `duration` — ms since
|
|
721
|
+
* the previous lifecycle event, NOT anchor-relative. */
|
|
722
|
+
interface TelemetryLifecycleEnvelope extends TelemetryEventEnvelope {
|
|
723
|
+
readonly duration: number;
|
|
724
|
+
}
|
|
725
|
+
/** `stream.session_started` — once per real connection attempt.
|
|
726
|
+
* `duration` = full page-load elapsed on the first session, 0 on resume. */
|
|
727
|
+
interface SessionStartedData extends TelemetryLifecycleEnvelope {
|
|
728
|
+
readonly startTimeUtc: string;
|
|
729
|
+
readonly pixelRatio: number;
|
|
730
|
+
/** `window.innerWidth/innerHeight` at session start — the container that
|
|
731
|
+
* gates rendered video resolution, not the physical screen. */
|
|
732
|
+
readonly browserInnerSize: {
|
|
733
|
+
readonly width: number;
|
|
734
|
+
readonly height: number;
|
|
735
|
+
};
|
|
736
|
+
readonly userAgent: string;
|
|
737
|
+
readonly sampleWindowMs: number;
|
|
738
|
+
/** `location.href` — the server-observed `Referer` is origin-truncated. */
|
|
739
|
+
readonly pageUrl: string;
|
|
740
|
+
readonly bootstrapInfo?: BootstrapInfo;
|
|
741
|
+
}
|
|
742
|
+
/** `stream.phase_ended` — once per phase closer in the service's catalog.
|
|
743
|
+
* No display text on the wire; the viewer's vocabulary resolves every id. */
|
|
744
|
+
interface PhaseEndedData extends TelemetryLifecycleEnvelope {
|
|
745
|
+
/** Stable 1-based catalog index — the viewer orders phases by this. */
|
|
746
|
+
readonly phaseNo: number;
|
|
747
|
+
readonly id: EventId;
|
|
748
|
+
/** CSS hex color for the bar fill. */
|
|
749
|
+
readonly color: string;
|
|
750
|
+
readonly milestones: readonly EmittedMilestone[];
|
|
751
|
+
readonly params: readonly PhaseParam[];
|
|
752
|
+
readonly overlays: readonly PhaseOverlay[];
|
|
753
|
+
/** Set on the connection phases of an ADOPTED prefetched stream: the
|
|
754
|
+
* handshake ran in parallel with page load, so the bar is positioned at
|
|
755
|
+
* {@link spanStartMs} (left-shifted) instead of sequentially. */
|
|
756
|
+
readonly prefetched?: boolean;
|
|
757
|
+
/** Anchor-relative start (ms) of a {@link prefetched} phase's bar. */
|
|
758
|
+
readonly spanStartMs?: number;
|
|
759
|
+
/** Anchor-relative moment Angular adopted the prefetched connection — the
|
|
760
|
+
* sequential timeline resumes here. */
|
|
761
|
+
readonly adoptionAtMs?: number;
|
|
762
|
+
}
|
|
763
|
+
/** `stream.session_ended` — once per session, on disconnect / pagehide /
|
|
764
|
+
* restart / destroy. Requires `api_transport: 'sendBeacon'` to survive a
|
|
765
|
+
* tab close. */
|
|
766
|
+
interface SessionEndedData extends TelemetryLifecycleEnvelope {
|
|
767
|
+
readonly reason: SessionEndReason;
|
|
768
|
+
/** Granular cause read from store state. Omitted when state is clean. */
|
|
769
|
+
readonly disconnectReason?: DisconnectReasonType;
|
|
770
|
+
/** Free-text message paired with {@link disconnectReason}, only when the
|
|
771
|
+
* originating action carried one (e.g. `"Manual Console Drop"`). */
|
|
772
|
+
readonly disconnectMessage?: string;
|
|
773
|
+
readonly timestamp: string;
|
|
774
|
+
}
|
|
775
|
+
/** `stream.sample` — every 5 s, window-aggregated. `seq` is monotonic per
|
|
776
|
+
* session for server-side ordering & dedup. */
|
|
777
|
+
interface SampleData extends TelemetryEventEnvelope {
|
|
778
|
+
readonly seq: number;
|
|
779
|
+
readonly timestamp: string;
|
|
780
|
+
readonly sampleCount: number;
|
|
781
|
+
readonly visibilityState: DocumentVisibilityState;
|
|
782
|
+
readonly bitrate: WindowAggregate;
|
|
783
|
+
readonly fps: WindowAggregate;
|
|
784
|
+
readonly qp: WindowAggregate;
|
|
785
|
+
readonly jitter: WindowAggregate;
|
|
786
|
+
readonly rtt: WindowAggregate;
|
|
787
|
+
readonly packetsLost?: number;
|
|
788
|
+
readonly viewPort: {
|
|
789
|
+
readonly width?: number;
|
|
790
|
+
readonly height?: number;
|
|
791
|
+
};
|
|
792
|
+
}
|
|
793
|
+
/** `stream.quality_degraded` / `stream.quality_recovered` — QP p50 crossing
|
|
794
|
+
* the red threshold (35) in either direction. */
|
|
795
|
+
interface QualityAnomalyData extends TelemetryEventEnvelope {
|
|
796
|
+
readonly seq: number;
|
|
797
|
+
readonly timestamp: string;
|
|
798
|
+
readonly qpP50: number;
|
|
799
|
+
readonly qpP95: number;
|
|
800
|
+
}
|
|
801
|
+
/** `stream.fps_low` — window FPS p50 dropped below 70% of the target. */
|
|
802
|
+
interface FpsLowData extends TelemetryEventEnvelope {
|
|
803
|
+
readonly seq: number;
|
|
804
|
+
readonly timestamp: string;
|
|
805
|
+
/** Requested `maxFps`; `0` means unlimited. */
|
|
806
|
+
readonly target: number;
|
|
807
|
+
/** Target actually compared against (60 when `target === 0`). */
|
|
808
|
+
readonly referenceTarget: number;
|
|
809
|
+
readonly fpsP50: number;
|
|
810
|
+
readonly fpsP95: number;
|
|
811
|
+
}
|
|
812
|
+
/** `stream.signaling_retry` — one per `retry({ delay })` fire in
|
|
813
|
+
* `SignallingService`. Surfaced in the viewer's Anomalies table. */
|
|
814
|
+
interface SignalingRetryData extends TelemetryEventEnvelope {
|
|
815
|
+
readonly seq: number;
|
|
816
|
+
readonly timestamp: string;
|
|
817
|
+
readonly attempt: number;
|
|
818
|
+
readonly reason: string;
|
|
819
|
+
readonly kind: SignalingRetryKind;
|
|
820
|
+
}
|
|
821
|
+
/** Event name → payload. The authoritative index of the wire taxonomy. */
|
|
822
|
+
interface StreamTelemetryEventMap {
|
|
823
|
+
'stream.session_started': SessionStartedData;
|
|
824
|
+
'stream.phase_ended': PhaseEndedData;
|
|
825
|
+
'stream.session_ended': SessionEndedData;
|
|
826
|
+
'stream.sample': SampleData;
|
|
827
|
+
'stream.quality_degraded': QualityAnomalyData;
|
|
828
|
+
'stream.quality_recovered': QualityAnomalyData;
|
|
829
|
+
'stream.fps_low': FpsLowData;
|
|
830
|
+
'stream.signaling_retry': SignalingRetryData;
|
|
831
|
+
}
|
|
832
|
+
type StreamTelemetryEventName = keyof StreamTelemetryEventMap;
|
|
833
|
+
/** Names emitted via `emitLifecycle` — the three `duration`-carrying events. */
|
|
834
|
+
type StreamTelemetryLifecycleEventName = 'stream.session_started' | 'stream.phase_ended' | 'stream.session_ended';
|
|
835
|
+
/** Discriminated union of every `trackTelemetryData` envelope. */
|
|
836
|
+
type StreamTelemetryEvent = {
|
|
837
|
+
[K in StreamTelemetryEventName]: {
|
|
838
|
+
readonly event: K;
|
|
839
|
+
readonly data: StreamTelemetryEventMap[K];
|
|
840
|
+
};
|
|
841
|
+
}[StreamTelemetryEventName];
|
|
842
|
+
/** Payload a caller supplies to `track()` — `userId` is added centrally. */
|
|
843
|
+
type StreamTelemetryTrackData<K extends StreamTelemetryEventName> = Omit<StreamTelemetryEventMap[K], 'userId'>;
|
|
844
|
+
/** Payload a caller supplies to `emitLifecycle()` — `duration` is computed. */
|
|
845
|
+
type StreamTelemetryLifecycleData<K extends StreamTelemetryLifecycleEventName> = Omit<StreamTelemetryEventMap[K], 'userId' | 'duration'>;
|
|
846
|
+
|
|
623
847
|
type TelemetryType = 'commandSent' | 'commandStop';
|
|
624
848
|
|
|
849
|
+
interface AggregatedStat {
|
|
850
|
+
quality: Quality;
|
|
851
|
+
aggregatedStats: InboundVideoStats;
|
|
852
|
+
}
|
|
853
|
+
interface InboundVideoStats extends RTCInboundRtpStreamStats {
|
|
854
|
+
VideoEncoderQP: number;
|
|
855
|
+
runTime: number;
|
|
856
|
+
pixelRatio: number;
|
|
857
|
+
bytesReceivedStart: number;
|
|
858
|
+
framesDecodedStart: number;
|
|
859
|
+
timestampStart: number;
|
|
860
|
+
videoCodec: string;
|
|
861
|
+
avgBitrate: number;
|
|
862
|
+
avgFrameRate: number;
|
|
863
|
+
selectedPair: {
|
|
864
|
+
local: {
|
|
865
|
+
type: string;
|
|
866
|
+
url: string;
|
|
867
|
+
};
|
|
868
|
+
remote: {
|
|
869
|
+
type: string;
|
|
870
|
+
url: string;
|
|
871
|
+
};
|
|
872
|
+
} | null;
|
|
873
|
+
currentRoundTripTime: number;
|
|
874
|
+
codecs: Record<string, string>;
|
|
875
|
+
receiveToCompositeMs: number;
|
|
876
|
+
bitrate: number;
|
|
877
|
+
}
|
|
878
|
+
interface AwsInstance {
|
|
879
|
+
/**
|
|
880
|
+
* WebSocket URL for connecting to the Cirrus (polling mode) or Orchestration (direct mode).
|
|
881
|
+
*/
|
|
882
|
+
wsUrl: string | null;
|
|
883
|
+
pollingUrl: string | null;
|
|
884
|
+
instanceName: string | null;
|
|
885
|
+
/**
|
|
886
|
+
* Unique identifier for the streaming request.
|
|
887
|
+
* Coming with a new orchestration message "instanceReserved".
|
|
888
|
+
*/
|
|
889
|
+
streamRequestId?: string;
|
|
890
|
+
/**
|
|
891
|
+
* Estimated time of arrival (in seconds) for the instance to be ready.
|
|
892
|
+
* Coming with a new orchestration message "instanceReserved".
|
|
893
|
+
*/
|
|
894
|
+
eta?: number;
|
|
895
|
+
/**
|
|
896
|
+
* Progress of completion for the instance launch (0-1).
|
|
897
|
+
* Based on ETA time comes from the backend with new orchestration.
|
|
898
|
+
* If eta is not provided, this value will be undefined.
|
|
899
|
+
*/
|
|
900
|
+
progressComplete?: number;
|
|
901
|
+
message?: string;
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
declare const UNREAL_CONFIG: InjectionToken<UnrealInitialConfig>;
|
|
905
|
+
|
|
906
|
+
declare const InputOptions: InputProps;
|
|
907
|
+
|
|
908
|
+
/** Disconnect reasons that should trigger remote connection cleanup. */
|
|
909
|
+
declare const DESTROY_DISCONNECT_REASONS: DisconnectReasonType[];
|
|
910
|
+
|
|
911
|
+
declare const DEBOUNCE_TO_MANY_RESIZE_CALLS = 100;
|
|
912
|
+
declare const AUTO_HIGH_RESOLUTION_IDLE_MS = 5000;
|
|
913
|
+
declare const SAME_SIZE_THRESHOLD = 1.01;
|
|
914
|
+
declare const MIN_CONTAINER_SIZE = 2;
|
|
915
|
+
declare const MINIMAL_FPS = 6;
|
|
916
|
+
declare const STREAMING_VIDEO_ID = "streamingVideo";
|
|
917
|
+
declare const STREAMING_AUDIO_ID = "streamingAudio";
|
|
918
|
+
declare const FULL_HD_WIDTH = 1920;
|
|
919
|
+
declare const FULL_HD_HEIGHT = 1080;
|
|
920
|
+
declare const WS_TIMEOUT = 6000;
|
|
921
|
+
declare const POLLING_TIME = 4000;
|
|
922
|
+
declare const INNER_RETRY_LIMIT = 3;
|
|
923
|
+
declare const OUTER_RETRY_DELAY: number;
|
|
924
|
+
declare const WS_RETRY_PER_INSTANCE = 1;
|
|
925
|
+
declare const WS_OPEN_STATE = 1;
|
|
926
|
+
declare const DEFAULT_AFK_TIMEOUT_PERIOD = 15;
|
|
927
|
+
declare const DEFAULT_AFK_TIMEOUT = 300;
|
|
928
|
+
declare const DATA_CHANNEL_CONNECTION_TIMEOUT = 8000;
|
|
929
|
+
declare const SIGNALLING_PERCENT_VALUE = 56;
|
|
930
|
+
declare const SCREEN_LOCKER_CONTAINER_ID = "3dsource_start_screen";
|
|
931
|
+
declare const REGION_PING_CACHE_KEY = "3dsource:region-ping";
|
|
932
|
+
declare const REGION_PING_CACHE_TTL_MS: number;
|
|
933
|
+
declare const REGION_PING_ACCURATE_SAMPLES = 3;
|
|
934
|
+
declare const REGION_PING_WARMUP_DEADLINE_MS = 1500;
|
|
935
|
+
declare const REGION_PING_BACKGROUND_REFRESH_DELAY_MS = 5000;
|
|
936
|
+
declare const RECONNECT_CONFIG: {
|
|
937
|
+
readonly enabled: true;
|
|
938
|
+
readonly maxAttempts: 3;
|
|
939
|
+
readonly delayMs: 1000;
|
|
940
|
+
};
|
|
941
|
+
declare const UnrealStatusMessage: {
|
|
942
|
+
readonly CONNECTING_TO_SESSION: "Connecting to session.";
|
|
943
|
+
readonly STARTING_YOUR_SESSION: "Starting your session";
|
|
944
|
+
};
|
|
945
|
+
|
|
625
946
|
declare class SubService {
|
|
626
947
|
protected readonly destroyRef: DestroyRef;
|
|
627
948
|
protected readonly destroy$: Subject<void>;
|
|
@@ -1142,51 +1463,6 @@ declare class StreamStatusTelemetryService extends SubService {
|
|
|
1142
1463
|
static ɵprov: i0.ɵɵInjectableDeclaration<StreamStatusTelemetryService>;
|
|
1143
1464
|
}
|
|
1144
1465
|
|
|
1145
|
-
/**
|
|
1146
|
-
* Every stable id this service can emit on the wire — phases,
|
|
1147
|
-
* milestones, overlays. The viewer's vocabulary maps each member to a
|
|
1148
|
-
* human label, so every id added here needs a paired vocabulary row
|
|
1149
|
-
* in the viewer (`telemetry-vocabulary.ts`).
|
|
1150
|
-
*/
|
|
1151
|
-
type EventId = 'region-resolving' | 'signaling-connection' | 'webrtc-negotiation' | 'unreal-communication' | 'region-ping-fetch-start' | 'region-ping-fetch-end' | 'region-resolved' | 'polling-started' | 'polling-ended' | 'aws-instance-resolved' | 'signaling-ws-connected' | 'instance-reserved' | 'instance-ready' | 'config-received' | 'ssinfo-received' | 'offer-received' | 'answer-sent' | 'answer-received' | 'first-ice-candidate' | 'last-ice-candidate' | 'datachannel-connected' | 'first-command-started' | 'loopback-sent' | 'loopback-received' | 'viewport-ready' | 'polling-to-instance' | 'signaling-handshake' | 'stabilization-warmup';
|
|
1152
|
-
/** Wire-format milestone — minimal by design. `id` is a stable
|
|
1153
|
-
* kebab-case identifier; the viewer maps it to a human label via its
|
|
1154
|
-
* vocabulary. */
|
|
1155
|
-
interface EmittedMilestone {
|
|
1156
|
-
readonly id: EventId;
|
|
1157
|
-
readonly time: number;
|
|
1158
|
-
}
|
|
1159
|
-
/**
|
|
1160
|
-
* Selected WebRTC ICE candidate pair, pulled off {@link AggregatedStat}.
|
|
1161
|
-
* The closer for the viewport phase flattens this to two `PhaseParam`
|
|
1162
|
-
* rows (`localCandidate`, `remoteCandidate`) before emission.
|
|
1163
|
-
*/
|
|
1164
|
-
interface SelectedIceCandidatePair {
|
|
1165
|
-
local: {
|
|
1166
|
-
type: string;
|
|
1167
|
-
url: string;
|
|
1168
|
-
};
|
|
1169
|
-
remote: {
|
|
1170
|
-
type: string;
|
|
1171
|
-
url: string;
|
|
1172
|
-
};
|
|
1173
|
-
}
|
|
1174
|
-
/**
|
|
1175
|
-
* Wire-format display key/value pair — rendered verbatim in the viewer's
|
|
1176
|
-
* phase tooltip. Nested or structured values should be pre-formatted by
|
|
1177
|
-
* the catalog closer's `map(...)` (string/number/boolean only).
|
|
1178
|
-
*/
|
|
1179
|
-
interface PhaseParam {
|
|
1180
|
-
readonly key: string;
|
|
1181
|
-
readonly value: string;
|
|
1182
|
-
}
|
|
1183
|
-
/** Resolved overlay region sent on the wire. `id` is a stable
|
|
1184
|
-
* kebab-case identifier mapped to a title by the viewer's vocabulary. */
|
|
1185
|
-
interface PhaseOverlay {
|
|
1186
|
-
readonly fromMs: number;
|
|
1187
|
-
readonly toMs: number;
|
|
1188
|
-
readonly id: EventId;
|
|
1189
|
-
}
|
|
1190
1466
|
declare class StreamStatusTelemetryService2 {
|
|
1191
1467
|
private readonly store;
|
|
1192
1468
|
private readonly actions$;
|
|
@@ -1405,7 +1681,6 @@ declare class VideoService extends SubService {
|
|
|
1405
1681
|
private videoTrack$;
|
|
1406
1682
|
private VideoEncoderQP;
|
|
1407
1683
|
private aggregatedStats;
|
|
1408
|
-
kalmanFilter1D: KalmanFilter1D;
|
|
1409
1684
|
/**
|
|
1410
1685
|
* Aggregate video stats and emit it as videoStats$
|
|
1411
1686
|
*/
|
|
@@ -1979,26 +2254,6 @@ declare const getImageFromVideoStream: (takeSizeFrom?: "video" | "constant", ima
|
|
|
1979
2254
|
*/
|
|
1980
2255
|
declare function getActiveUrl(urls: string[]): Generator<string, void, unknown>;
|
|
1981
2256
|
|
|
1982
|
-
declare class KalmanFilter1D {
|
|
1983
|
-
private estimate;
|
|
1984
|
-
private uncertainty;
|
|
1985
|
-
private processNoise;
|
|
1986
|
-
private measurementNoise;
|
|
1987
|
-
/**
|
|
1988
|
-
* @param initialEstimate Initial guess of the state.
|
|
1989
|
-
* @param initialUncertainty Initial uncertainty in the guess.
|
|
1990
|
-
* @param processNoise Process variance (Q) representing model uncertainty.
|
|
1991
|
-
* @param measurementNoise Measurement variance (R) representing noise in measurements.
|
|
1992
|
-
*/
|
|
1993
|
-
constructor(initialEstimate: number, initialUncertainty: number, processNoise: number, measurementNoise: number);
|
|
1994
|
-
/**
|
|
1995
|
-
* Incorporates a new measurement and returns the updated estimate.
|
|
1996
|
-
* @param measurement The new measurement value.
|
|
1997
|
-
*/
|
|
1998
|
-
update(measurement: number): number;
|
|
1999
|
-
config(data: FilterSettings): void;
|
|
2000
|
-
}
|
|
2001
|
-
|
|
2002
2257
|
declare class LatencyTimings {
|
|
2003
2258
|
TestStartTimeMs: number | null;
|
|
2004
2259
|
UEReceiptTimeMs: number | null;
|
|
@@ -2106,214 +2361,6 @@ declare function getResizeValuesUniversal(params: {
|
|
|
2106
2361
|
*/
|
|
2107
2362
|
declare function makeEven(value: number): number;
|
|
2108
2363
|
|
|
2109
|
-
interface AggregatedStat {
|
|
2110
|
-
quality: Quality;
|
|
2111
|
-
aggregatedStats: InboundVideoStats;
|
|
2112
|
-
}
|
|
2113
|
-
interface InboundVideoStats extends RTCInboundRtpStreamStats {
|
|
2114
|
-
VideoEncoderQP: number;
|
|
2115
|
-
runTime: number;
|
|
2116
|
-
pixelRatio: number;
|
|
2117
|
-
bytesReceivedStart: number;
|
|
2118
|
-
framesDecodedStart: number;
|
|
2119
|
-
timestampStart: number;
|
|
2120
|
-
videoCodec: string;
|
|
2121
|
-
avgBitrate: number;
|
|
2122
|
-
avgFrameRate: number;
|
|
2123
|
-
selectedPair: {
|
|
2124
|
-
local: {
|
|
2125
|
-
type: string;
|
|
2126
|
-
url: string;
|
|
2127
|
-
};
|
|
2128
|
-
remote: {
|
|
2129
|
-
type: string;
|
|
2130
|
-
url: string;
|
|
2131
|
-
};
|
|
2132
|
-
} | null;
|
|
2133
|
-
currentRoundTripTime: number;
|
|
2134
|
-
codecs: Record<string, string>;
|
|
2135
|
-
receiveToCompositeMs: number;
|
|
2136
|
-
bitrate: number;
|
|
2137
|
-
kalmanBitrate: number;
|
|
2138
|
-
bitrateDrop: number;
|
|
2139
|
-
dataFlowCheckResult: DataFlowCheckResult;
|
|
2140
|
-
dataFlowBitrate: DataFlowCheckResult;
|
|
2141
|
-
}
|
|
2142
|
-
interface AwsInstance {
|
|
2143
|
-
/**
|
|
2144
|
-
* WebSocket URL for connecting to the Cirrus (polling mode) or Orchestration (direct mode).
|
|
2145
|
-
*/
|
|
2146
|
-
wsUrl: string | null;
|
|
2147
|
-
pollingUrl: string | null;
|
|
2148
|
-
instanceName: string | null;
|
|
2149
|
-
/**
|
|
2150
|
-
* Unique identifier for the streaming request.
|
|
2151
|
-
* Coming with a new orchestration message "instanceReserved".
|
|
2152
|
-
*/
|
|
2153
|
-
streamRequestId?: string;
|
|
2154
|
-
/**
|
|
2155
|
-
* Estimated time of arrival (in seconds) for the instance to be ready.
|
|
2156
|
-
* Coming with a new orchestration message "instanceReserved".
|
|
2157
|
-
*/
|
|
2158
|
-
eta?: number;
|
|
2159
|
-
/**
|
|
2160
|
-
* Progress of completion for the instance launch (0-1).
|
|
2161
|
-
* Based on ETA time comes from the backend with new orchestration.
|
|
2162
|
-
* If eta is not provided, this value will be undefined.
|
|
2163
|
-
*/
|
|
2164
|
-
progressComplete?: number;
|
|
2165
|
-
message?: string;
|
|
2166
|
-
}
|
|
2167
|
-
|
|
2168
|
-
interface DataFlowCheckResult {
|
|
2169
|
-
isDropDetected: boolean;
|
|
2170
|
-
dropPercentage: number;
|
|
2171
|
-
activeMedian: number;
|
|
2172
|
-
quality: Quality;
|
|
2173
|
-
message: string;
|
|
2174
|
-
/** Optional diagnostic snapshot — only populated on demand to avoid a
|
|
2175
|
-
* per-tick array copy on this 4 Hz hot path. */
|
|
2176
|
-
dataHistory?: number[];
|
|
2177
|
-
config: {
|
|
2178
|
-
yellowFlagThresholdPercentage: number;
|
|
2179
|
-
redFlagThresholdPercentage: number;
|
|
2180
|
-
historyBufferLength: number;
|
|
2181
|
-
splitPoint: number;
|
|
2182
|
-
};
|
|
2183
|
-
}
|
|
2184
|
-
declare class DataFlowMonitor {
|
|
2185
|
-
protected yellowFlagThresholdPercentage: number;
|
|
2186
|
-
protected redFlagThresholdPercentage: number;
|
|
2187
|
-
protected historyBufferLength: number;
|
|
2188
|
-
protected splitPoint: number;
|
|
2189
|
-
protected dataHistory: number[];
|
|
2190
|
-
/**
|
|
2191
|
-
* Initializes the DataFlowMonitor monitor.
|
|
2192
|
-
* @param yellowFlagThresholdPercentage - The percentage drop to trigger a YELLOW warning (default: 15%).
|
|
2193
|
-
* @param redFlagThresholdPercentage - The percentage drop to trigger a RED warning (default: 30%).
|
|
2194
|
-
* @param historyBufferLength - buffer length (default: 100).
|
|
2195
|
-
* @param splitPoint - The point at which to split the history buffer into two halves (default: 0.5).
|
|
2196
|
-
*/
|
|
2197
|
-
constructor(yellowFlagThresholdPercentage?: number, redFlagThresholdPercentage?: number, historyBufferLength?: number, splitPoint?: number);
|
|
2198
|
-
reset(): void;
|
|
2199
|
-
config(data: FilterSettings): void;
|
|
2200
|
-
/**
|
|
2201
|
-
* Adds a new bitrate measurement and checks for significant drops.
|
|
2202
|
-
* @param currentValue - The current bitrate in kbps.
|
|
2203
|
-
* @returns BitrateCheckResult indicating if a drop was detected.
|
|
2204
|
-
*/
|
|
2205
|
-
addValue(currentValue: number): DataFlowCheckResult;
|
|
2206
|
-
}
|
|
2207
|
-
|
|
2208
|
-
interface FilterSettings {
|
|
2209
|
-
/**
|
|
2210
|
-
* Minimum number of kilobits per second to trigger low bandwidth
|
|
2211
|
-
*/
|
|
2212
|
-
minimumBitrate: number;
|
|
2213
|
-
/**
|
|
2214
|
-
* Amount of a percentage drop to trigger a yellow warning
|
|
2215
|
-
*/
|
|
2216
|
-
yellowFlag: number;
|
|
2217
|
-
/**
|
|
2218
|
-
* Amount of a percentage drop to trigger a red warning
|
|
2219
|
-
*/
|
|
2220
|
-
redFlag: number;
|
|
2221
|
-
/**
|
|
2222
|
-
* Minimum number of frames per second to trigger low bandwidth
|
|
2223
|
-
*/
|
|
2224
|
-
minimumFps: number;
|
|
2225
|
-
/**
|
|
2226
|
-
* Time to wait before checking if we can switch to low bandwidth
|
|
2227
|
-
*/
|
|
2228
|
-
monitoringDelayTime: number;
|
|
2229
|
-
initialBitrateEstimate: number;
|
|
2230
|
-
initialErrorCovariance: number;
|
|
2231
|
-
processNoise: number;
|
|
2232
|
-
measurementNoise: number;
|
|
2233
|
-
panelOpen: boolean;
|
|
2234
|
-
}
|
|
2235
|
-
|
|
2236
|
-
declare class FilterSettingsComponent implements OnInit {
|
|
2237
|
-
private readonly storageKey;
|
|
2238
|
-
readonly defaultFilterModel: {
|
|
2239
|
-
minimumBitrate: number;
|
|
2240
|
-
yellowFlag: number;
|
|
2241
|
-
redFlag: number;
|
|
2242
|
-
minimumFps: number;
|
|
2243
|
-
monitoringDelayTime: number;
|
|
2244
|
-
initialBitrateEstimate: number;
|
|
2245
|
-
initialErrorCovariance: number;
|
|
2246
|
-
processNoise: number;
|
|
2247
|
-
measurementNoise: number;
|
|
2248
|
-
panelOpen: boolean;
|
|
2249
|
-
};
|
|
2250
|
-
settings: {
|
|
2251
|
-
minimumBitrate: number;
|
|
2252
|
-
yellowFlag: number;
|
|
2253
|
-
redFlag: number;
|
|
2254
|
-
minimumFps: number;
|
|
2255
|
-
monitoringDelayTime: number;
|
|
2256
|
-
initialBitrateEstimate: number;
|
|
2257
|
-
initialErrorCovariance: number;
|
|
2258
|
-
processNoise: number;
|
|
2259
|
-
measurementNoise: number;
|
|
2260
|
-
panelOpen: boolean;
|
|
2261
|
-
};
|
|
2262
|
-
ngOnInit(): void;
|
|
2263
|
-
togglePanel(): void;
|
|
2264
|
-
saveSettings(): void;
|
|
2265
|
-
dispatch(settings: FilterSettings): void;
|
|
2266
|
-
reset(): void;
|
|
2267
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<FilterSettingsComponent, never>;
|
|
2268
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<FilterSettingsComponent, "app-filter-settings", never, {}, {}, never, never, true, never>;
|
|
2269
|
-
}
|
|
2270
|
-
|
|
2271
|
-
declare class LowBandwidthDetectorComponent implements OnInit {
|
|
2272
|
-
#private;
|
|
2273
|
-
private readonly dialog;
|
|
2274
|
-
private readonly destroyRef;
|
|
2275
|
-
private readonly videoService;
|
|
2276
|
-
private readonly lowBandwidthState;
|
|
2277
|
-
readonly isDevMode: boolean;
|
|
2278
|
-
private readonly viewportReady$;
|
|
2279
|
-
private readonly isLowBandwidth$;
|
|
2280
|
-
private readonly lowBandwidthTrigger$;
|
|
2281
|
-
private readonly highBandwidthTrigger$;
|
|
2282
|
-
private readonly viewPortDestroyedTrigger$;
|
|
2283
|
-
private readonly aggregatedStats$;
|
|
2284
|
-
private readonly nativeQuality$;
|
|
2285
|
-
private readonly monitoringTrigger$;
|
|
2286
|
-
private readonly reTrigger$;
|
|
2287
|
-
private readonly canSwitchToLowBand$;
|
|
2288
|
-
private readonly videoQuality$;
|
|
2289
|
-
private readonly fps$;
|
|
2290
|
-
private readonly bitrateDrop$;
|
|
2291
|
-
readonly fps: i0.Signal<number>;
|
|
2292
|
-
readonly nativeQuality: i0.Signal<Quality | undefined>;
|
|
2293
|
-
readonly isLowBandwidth: i0.Signal<boolean>;
|
|
2294
|
-
readonly aggregatedStats: i0.Signal<_3dsource_angular_unreal_module.InboundVideoStats | undefined>;
|
|
2295
|
-
readonly isReducedQuality: i0.WritableSignal<boolean>;
|
|
2296
|
-
readonly isIndicatorExpanded: i0.WritableSignal<boolean>;
|
|
2297
|
-
readonly isIndicatorExpandedTrigger$: rxjs.Observable<false>;
|
|
2298
|
-
ngOnInit(): void;
|
|
2299
|
-
private trySetLowBandwidth;
|
|
2300
|
-
toggleIndicator(value: boolean): void;
|
|
2301
|
-
hideIndicatorAfterDelay(): void;
|
|
2302
|
-
openLBMDialog(): void;
|
|
2303
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<LowBandwidthDetectorComponent, never>;
|
|
2304
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<LowBandwidthDetectorComponent, "app-low-bandwidth-detector", never, {}, {}, never, never, true, never>;
|
|
2305
|
-
}
|
|
2306
|
-
|
|
2307
|
-
declare class LowBandwidthStateService {
|
|
2308
|
-
#private;
|
|
2309
|
-
readonly isLowBandwidth: i0.Signal<boolean>;
|
|
2310
|
-
readonly isLowBandwidth$: rxjs.Observable<boolean>;
|
|
2311
|
-
enterLowBandwidthMode(): void;
|
|
2312
|
-
exitLowBandwidthMode(): void;
|
|
2313
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<LowBandwidthStateService, never>;
|
|
2314
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<LowBandwidthStateService>;
|
|
2315
|
-
}
|
|
2316
|
-
|
|
2317
2364
|
declare class SafePipe implements PipeTransform {
|
|
2318
2365
|
private sanitizer;
|
|
2319
2366
|
transform(value: string, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl;
|
|
@@ -2810,6 +2857,22 @@ declare class UnrealEffects {
|
|
|
2810
2857
|
code: number | null;
|
|
2811
2858
|
error?: string;
|
|
2812
2859
|
} & _ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
2860
|
+
/**
|
|
2861
|
+
* `dataChannelReady` is a ONCE-PER-SESSION signal: it starts app init
|
|
2862
|
+
* (console commands → loopback → viewport) and makes `SignallingService`
|
|
2863
|
+
* send `p2pEstablished`. Neither is idempotent, so a second
|
|
2864
|
+
* `dataChannelConnected` inside the same session must not re-emit it.
|
|
2865
|
+
*
|
|
2866
|
+
* That second announcement is real in the prefetch flow: `adopt()` declares
|
|
2867
|
+
* the already-open channel manually, while the transport it adopted can
|
|
2868
|
+
* still produce its own `dataChannelConnected` afterwards — the effect used
|
|
2869
|
+
* to turn both into `dataChannelReady`.
|
|
2870
|
+
*
|
|
2871
|
+
* `exhaustMap` over an inner stream that emits once and then idles keeps the
|
|
2872
|
+
* gate shut until the session actually ends; `takeUntil` re-opens it on a
|
|
2873
|
+
* cirrus drop, a scene destroy, or the start of a peer reconnect (which is
|
|
2874
|
+
* where the pre-existing `isReconnecting` filter hands over).
|
|
2875
|
+
*/
|
|
2813
2876
|
unrealReceiverReady$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
2814
2877
|
initAppByDataChannelReady$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
2815
2878
|
setViewportReadyBySetLoopBackCommandIsCompleted$: rxjs.Observable<_ngrx_store.Action<string>> & _ngrx_effects.CreateEffectMetadata;
|
|
@@ -3048,5 +3111,5 @@ declare const selectUserInactivityDetected: _ngrx_store.MemoizedSelector<Record<
|
|
|
3048
3111
|
/** Used by external consumers (e.g., metabox). Do not remove. */
|
|
3049
3112
|
declare const selectIsVideoPlayingAndDataChannelConnected: _ngrx_store.MemoizedSelector<Record<string, any>, boolean, (s1: boolean, s2: boolean) => boolean>;
|
|
3050
3113
|
|
|
3051
|
-
export { AFKService, AUTO_HIGH_RESOLUTION_IDLE_MS, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CommandTelemetryService, ConfigHandler, ConsoleExtensionsService, ControlScheme, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DESTROY_DISCONNECT_REASONS,
|
|
3052
|
-
export type { AggregatedStat, AnySignalingMessage, AwsInstance, CandidateMessage, CloseReason, CommandInProgress, ConfigMessage, ConnectionError, ControlSchemeValues,
|
|
3114
|
+
export { AFKService, AUTO_HIGH_RESOLUTION_IDLE_MS, AfkTimeoutModalComponent, AggregatorService, AnalyticsService, AnswerHandler, CommandTelemetryService, ConfigHandler, ConsoleExtensionsService, ControlScheme, DATA_CHANNEL_CONNECTION_TIMEOUT, DEBOUNCE_TO_MANY_RESIZE_CALLS, DEFAULT_AFK_TIMEOUT, DEFAULT_AFK_TIMEOUT_PERIOD, DESTROY_DISCONNECT_REASONS, DevModeService, DisconnectReason, FULL_HD_HEIGHT, FULL_HD_WIDTH, FileHandlerService, FileReceiverService, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, INNER_RETRY_LIMIT, IceCandidateHandler, ImageLoadingSrcComponent, InputOptions, InputService, InstanceReadyHandler, InstanceReservedHandler, IntroSrcComponent, LatencyTimings, LoadingProgressService, MINIMAL_FPS, MIN_CONTAINER_SIZE, MessageType, MouseButton, MouseButtonsMask, OUTER_RETRY_DELAY, OnCloseHandler, OnErrorHandler, OnMessageHandler, OnOpenHandler, OrchestrationMessageTypes, POLLING_TIME, PingHandler, PlayerCountHandler, RECONNECT_CONFIG, REGION_PING_ACCURATE_SAMPLES, REGION_PING_BACKGROUND_REFRESH_DELAY_MS, REGION_PING_CACHE_KEY, REGION_PING_CACHE_TTL_MS, REGION_PING_WARMUP_DEADLINE_MS, RegionsPingService, SAME_SIZE_THRESHOLD, SCREEN_LOCKER_CONTAINER_ID, SIGNALLING_PERCENT_VALUE, SSInfoHandler, STREAMING_AUDIO_ID, STREAMING_VIDEO_ID, SafePipe, SignallingService, SpecialKeyCodes, StatGraphComponent, StreamAdoptionService, StreamStatusTelemetryService, StreamStatusTelemetryService2, 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_RETRY_PER_INSTANCE, WS_TIMEOUT, WebRtcPlayerService, WebrtcErrorModalComponent, abortEstablishingConnection, answerSent, changeStatusMainVideoOnScene, changeStreamResolutionAction, commandCompleted, commandStarted, dataChannelConnected, dataChannelReady, decodeData, destroyRemoteConnections, destroyUnrealScene, disconnectStream, dispatchResize, dropConnection, dropDC, dropPC, floatToPercents, floatToSmoothPercents, forceResizeViewport, fromResizeObserver, getActiveUrl, getImageFromVideoStream, getResizeStudioValues, getResizeValuesUniversal, getRtcErrorMessage, iceConnectionFailed, initSignalling, instanceReady, keepMaxUntilReset, makeEven, pollingEnded, pollingStarted, provideUnrealModule, provideUnrealState, qpToQuality, reconnectPeer, reconnectPeerFailed, reconnectPeerSuccess, regionPingFetchEnd, regionPingFetchStart, regionResolved, resetAfk, resetConfig, resetDataChannelForReconnect, resetIntroSrc, resetUserInactivityTimeout, resetWarnTimeout, saveAnalyticsEvent, selectCirrusConnectionId, selectClientAndViewIds, selectCommandProgress, selectFreezeFrameCombinedDataUrl, selectFreezeFrameDataUrl, selectFreezeFrameDataUrlFromVideo, selectFreezeFrameProgressMessageFromVideo, selectIsAutostart, selectIsExistMatchUrls, selectIsFreezeFrameLoading, selectIsFullyConnected, selectIsLoaderScreenVisible, selectIsVideoPlayingAndDataChannelConnected, selectShowLoader, selectShowReconnectPopup, selectSignalingParameters, selectStreamConfig, selectTotalProgress, selectUserInactivityDetected, selectWarnTimeout, setAfkTimerCountdown, setAfkTimerHide, setAfkTimerVisible, setAwsInstance, setCirrusConnected, setCirrusDisconnected, setConfig, setEstablishingConnection, setFreezeFrame, setFreezeFrameFromVideo, setIntroImageSrc, setIntroVideoSrc, setLoadingImageSrc, setLoopBackCommandIsCompleted, setMaxFps, setOrchestrationContext, setOrchestrationMessage, setOrchestrationParameters, setOrchestrationProgress, setSignalingName, setStatusMessage, setStatusPercentSignallingServer, setStreamClientCompanyId, setStreamViewId, setUnrealPlaywrightConfig, setUserInactivityTimeout, setViewportNotReady, setViewportReady, showLoadingProgress, showResumeStreamPopup, showUnrealErrorMessage, showUserInactivityTimeoutPopup, signalingRetryAttempted, smoothTransition, startStream, streamAdopted, trackMixpanelEvent, trackTelemetryData, uint8ToBase64, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
|
|
3115
|
+
export type { AggregatedStat, AnySignalingMessage, AwsInstance, BootstrapInfo, CandidateMessage, CloseReason, CommandInProgress, ConfigMessage, ConnectionError, ControlSchemeValues, DisconnectReasonType, EmittedMilestone, EventId, ForceClientDisconnect, FpsLowData, FreezeFrameMessage, InboundVideoStats, InputProps, InstanceReady, InstanceReserved, InterruptClientStream, ListStreamersMessage, MessageBase, MessageTypeValues, OrchestrationErrorMessage, OrchestrationMessageType, P2PEstablishedMessage, ParkedStream, PhaseEndedData, PhaseOverlay, PhaseParam, PingMessage, PlayerCountMessage, PollingOrchestrationMessage, Quality, QualityAnomalyData, ReceivedFile, RequestStream, ResourceBucket, ResourceTotals, SSInfo, SampleData, SelectedIceCandidatePair, SessionEndReason, SessionEndedData, SessionStartedData, SignalingData, SignalingMessageHandler, SignalingMessageMap, SignalingRetryData, SignalingRetryKind, SlowResource, StreamConfig, StreamRequestContext, StreamResolutionProps, StreamTelemetryEvent, StreamTelemetryEventMap, StreamTelemetryEventName, StreamTelemetryLifecycleData, StreamTelemetryLifecycleEventName, StreamTelemetryTrackData, StreamerListMessage, TelemetryEventEnvelope, TelemetryLifecycleEnvelope, TelemetryType, UnknownFields, UnrealCallbackDescriptor, UnrealCallbackEventMap, UnrealCallbackJson, UnrealCallbackJsonWrapped, UnrealInitialConfig, UnrealState, WSCloseCodesValues, WindowAggregate, streamPreparedForUserInteractionMessage };
|