@3dsource/angular-unreal-module 0.0.167 → 0.0.169
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.
package/README.md
CHANGED
|
@@ -75,7 +75,8 @@ Available configuration fields:
|
|
|
75
75
|
| `commandTelemetryReceiver` | Command telemetry endpoint |
|
|
76
76
|
| `streamTelemetryV2Url` | Stream lifecycle telemetry endpoint |
|
|
77
77
|
| `screenLockerContainerId` | Container used by the screen-locker overlay |
|
|
78
|
-
| `
|
|
78
|
+
| `mode` | `'metabox'` (default) — full Metabox command protocol; `'default'` — stock Pixel Streaming app, the module sends no Metabox commands of its own |
|
|
79
|
+
| `fpsMonitor` | Enables FPS monitoring (currently off — the service is not instantiated) |
|
|
79
80
|
| `autoHighResolution` | Raises resolution after the scene becomes idle |
|
|
80
81
|
| `playwright` | Enables the test-specific service behaviour |
|
|
81
82
|
|
|
@@ -1204,6 +1204,16 @@ function getResizeValuesUniversal(params) {
|
|
|
1204
1204
|
return { w: makeEven(w), h: makeEven(h), x: 0, y: 0, scale: w / maxSpace.w };
|
|
1205
1205
|
}
|
|
1206
1206
|
|
|
1207
|
+
/**
|
|
1208
|
+
* `'metabox'` — the default when `UNREAL_CONFIG` omits `mode` — speaks the full
|
|
1209
|
+
* Metabox command protocol. `'default'` targets a stock Pixel Streaming
|
|
1210
|
+
* application, which understands no `MetaBoxCommand` packet, so the module
|
|
1211
|
+
* sends none of its own.
|
|
1212
|
+
*/
|
|
1213
|
+
function isMetaboxMode(config) {
|
|
1214
|
+
return (config?.mode ?? 'metabox') === 'metabox';
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1207
1217
|
/**
|
|
1208
1218
|
* Fraction of commands completed (0–1). Drives the second half of the
|
|
1209
1219
|
* loading bar, after signaling reaches `SIGNALLING_PERCENT_VALUE`.
|
|
@@ -1222,7 +1232,21 @@ const selectIsExistMatchUrls = createSelector(unrealFeature.selectMatchUrls, (ur
|
|
|
1222
1232
|
const selectIsAutostart = createSelector(selectStreamConfig, (config) => config?.autoStart);
|
|
1223
1233
|
const selectShowReconnectPopup = createSelector(unrealFeature.selectCirrusConnected, unrealFeature.selectEstablishingConnection, (cirrusConnected, establishingConnection) => !cirrusConnected && !establishingConnection);
|
|
1224
1234
|
const selectShowLoader = createSelector(selectShowReconnectPopup, unrealFeature.selectViewportReady, (showPopup, viewportReady) => !showPopup && !viewportReady);
|
|
1225
|
-
|
|
1235
|
+
/**
|
|
1236
|
+
* The connection id of the current stream session.
|
|
1237
|
+
*
|
|
1238
|
+
* The id is issued on the Cirrus side and reaches us either as the
|
|
1239
|
+
* orchestration's `streamRequestId` (polling response / `instanceReserved` /
|
|
1240
|
+
* `instanceReady`) or, when the backend issues none, in the `ssInfo` message
|
|
1241
|
+
* once Cirrus generated it itself. Inside the player it is ONE value —
|
|
1242
|
+
* `connectionId` — and this selector is where the two arrival paths collapse
|
|
1243
|
+
* into it. It names the session everywhere: the debug overlay ("Connection Id")
|
|
1244
|
+
* and the stream telemetry's `sessionId`.
|
|
1245
|
+
*
|
|
1246
|
+
* Also used by external consumers (e.g., metabox). Do not remove.
|
|
1247
|
+
*/
|
|
1248
|
+
const selectCirrusConnectionId = createSelector(unrealFeature.selectAwsInstance, unrealFeature.selectSsData, (awsInstance, ssData) => awsInstance?.streamRequestId ?? ssData?.connectionId);
|
|
1249
|
+
const selectSignalingParameters = createSelector(unrealFeature.selectSsData, unrealFeature.selectAwsInstance, selectCirrusConnectionId, (data, instance, connectionId) => {
|
|
1226
1250
|
const info = [];
|
|
1227
1251
|
if (data) {
|
|
1228
1252
|
info.push(`${data.cirrusVersion}, ${data.branchInfo}, ${data.instanceType}`);
|
|
@@ -1233,6 +1257,10 @@ const selectSignalingParameters = createSelector(unrealFeature.selectSsData, unr
|
|
|
1233
1257
|
// flow, a `wss://` orchestration URL in the other.
|
|
1234
1258
|
info.push(`Orchestration: ${instance.pollingUrl}`);
|
|
1235
1259
|
info.push(`WS: ${instance.wsUrl}`);
|
|
1260
|
+
// The stream's `connectionId` — the telemetry ships it as its `sessionId`
|
|
1261
|
+
// (a file name on the collector), and the viewer labels it `Connection Id`
|
|
1262
|
+
// too, so the same value is named the same thing everywhere.
|
|
1263
|
+
info.push(`Connection Id: ${connectionId ?? '—'}`);
|
|
1236
1264
|
return info.join('<br>');
|
|
1237
1265
|
});
|
|
1238
1266
|
const selectClientAndViewIds = createSelector(unrealFeature.selectStreamClientCompanyId, unrealFeature.selectStreamViewId, (clientId, viewId) => ({ clientId, viewId }));
|
|
@@ -1276,19 +1304,6 @@ const selectTotalProgress = createSelector(unrealFeature.selectStatusPercentSign
|
|
|
1276
1304
|
const progressRest = lerp(0, 1 - splitPoint, commandProgress);
|
|
1277
1305
|
return clampf(0, 1, progressSignaling + progressRest);
|
|
1278
1306
|
});
|
|
1279
|
-
/**
|
|
1280
|
-
* The connection id of the current stream session.
|
|
1281
|
-
*
|
|
1282
|
-
* Primary source is the orchestration, which issues it as `streamRequestId` —
|
|
1283
|
-
* in the polling response (legacy flow) or in `instanceReserved`/`instanceReady`
|
|
1284
|
-
* (new orchestration) — and the browser hands it to Cirrus on the WS upgrade
|
|
1285
|
-
* URL. `ssData.connectionId` (the `ssInfo` message) is the fallback for
|
|
1286
|
-
* backends that don't issue one yet: Cirrus then generates it itself and
|
|
1287
|
-
* reports it back here.
|
|
1288
|
-
*
|
|
1289
|
-
* Used by external consumers (e.g., metabox). Do not remove.
|
|
1290
|
-
*/
|
|
1291
|
-
const selectCirrusConnectionId = createSelector(unrealFeature.selectAwsInstance, unrealFeature.selectSsData, (awsInstance, ssData) => awsInstance?.streamRequestId ?? ssData?.connectionId);
|
|
1292
1307
|
/** Used by external consumers (e.g., metabox). Do not remove. */
|
|
1293
1308
|
const selectUserInactivityDetected = createSelector(unrealFeature.selectAfkCountdown, unrealFeature.selectIsAfkTimerVisible, (remainingSecondsToDisconnect, countdownVisible) => ({
|
|
1294
1309
|
remainingSecondsToDisconnect,
|
|
@@ -4343,7 +4358,14 @@ class UnrealEffects {
|
|
|
4343
4358
|
return this.actions$.pipe(ofType(dataChannelConnected), withLatestFrom(this.store.select(unrealFeature.selectIsReconnecting)), filter(([, isReconnecting]) => !isReconnecting), exhaustMap(() => concat(of(dataChannelReady()), NEVER).pipe(takeUntil(sessionEnded$))));
|
|
4344
4359
|
});
|
|
4345
4360
|
this.initAppByDataChannelReady$ = createEffect(() => {
|
|
4346
|
-
return this.actions$.pipe(ofType(dataChannelReady),
|
|
4361
|
+
return this.actions$.pipe(ofType(dataChannelReady), switchMap(() => {
|
|
4362
|
+
// 'default' mode drives a stock Pixel Streaming application: it
|
|
4363
|
+
// understands no MetaBoxCommand, so the boot commands and the loopback
|
|
4364
|
+
// handshake are skipped and the viewport is ready as soon as the data
|
|
4365
|
+
// channel is.
|
|
4366
|
+
if (!isMetaboxMode(this.unrealInitialConfig)) {
|
|
4367
|
+
return of(setLoopBackCommandIsCompleted());
|
|
4368
|
+
}
|
|
4347
4369
|
this.commandsSender.sendCommandToUnreal({
|
|
4348
4370
|
command: MetaBoxCommand.FSetFreezeFrameQualityCommand,
|
|
4349
4371
|
payload: { value: '95' },
|
|
@@ -4353,13 +4375,13 @@ class UnrealEffects {
|
|
|
4353
4375
|
payload: { value: this.isDevMode },
|
|
4354
4376
|
});
|
|
4355
4377
|
this.commandTelemetryService.trackStartCommand('EXT-SetViewportReady');
|
|
4356
|
-
|
|
4357
|
-
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
4378
|
+
// Wait for initial commands to be sent before sending the loopback.
|
|
4379
|
+
// commandStarted fires for each sent command; debounce ensures
|
|
4380
|
+
// we proceed only after no more commands are started for 50 ms.
|
|
4381
|
+
return this.actions$.pipe(ofType(commandStarted), debounceTime(50), take(1), switchMap(() => this.unrealCallbackService.observeCommandResponse({ command: MetaBoxCommand.FLoopBackCommand }, (data) => this.commandsSender.sendCommandToUnreal(data))), switchMap(() => this.videoService.videoStats$), filter(({ aggregatedStats: s }) => !!s.framesPerSecond &&
|
|
4382
|
+
s.framesPerSecond > MINIMAL_FPS &&
|
|
4383
|
+
(s.framesDecoded ?? 0) > 15), take(1), map(() => setLoopBackCommandIsCompleted()));
|
|
4384
|
+
}));
|
|
4363
4385
|
});
|
|
4364
4386
|
this.setViewportReadyBySetLoopBackCommandIsCompleted$ = createEffect(() => {
|
|
4365
4387
|
return this.actions$.pipe(ofType(setLoopBackCommandIsCompleted, reconnectPeerSuccess), tap(() => this.commandTelemetryService.trackStopCommand('EXT-SetViewportReady', false, { ready: true })), map(() => setViewportReady()));
|
|
@@ -4469,7 +4491,9 @@ class UnrealEffects {
|
|
|
4469
4491
|
})));
|
|
4470
4492
|
});
|
|
4471
4493
|
this.setMaxFps$ = createEffect(() => {
|
|
4472
|
-
return this.actions$.pipe(ofType(setMaxFps),
|
|
4494
|
+
return this.actions$.pipe(ofType(setMaxFps),
|
|
4495
|
+
// No Metabox commands in 'default' mode.
|
|
4496
|
+
filter(() => isMetaboxMode(this.unrealInitialConfig)), tap(({ maxFps }) => {
|
|
4473
4497
|
this.commandsSender.sendCommandToUnreal({
|
|
4474
4498
|
command: MetaBoxCommand.FSetMaxFPSCommand,
|
|
4475
4499
|
payload: { value: maxFps },
|
|
@@ -5790,9 +5814,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
5790
5814
|
* - `stream.fps_low` — when the window FPS p50 < 70% of the target
|
|
5791
5815
|
* - `stream.session_ended` — once per session, on disconnect/pagehide/restart
|
|
5792
5816
|
*
|
|
5793
|
-
* Every event carries `sessionId` + `userId`.
|
|
5794
|
-
* `
|
|
5795
|
-
* —
|
|
5817
|
+
* Every event carries `sessionId` + `userId`. The `sessionId` IS the stream's
|
|
5818
|
+
* connection id (`selectCirrusConnectionId`) — the same value the debug overlay
|
|
5819
|
+
* shows as "Connection Id" — so a telemetry session can be matched to a Cirrus
|
|
5820
|
+
* player session by id. Since that id only exists once the orchestration
|
|
5821
|
+
* answered, the first events are queued and flushed with it (see
|
|
5822
|
+
* {@link SessionState.wireId}); a session that never got one falls back to a
|
|
5823
|
+
* locally generated uuid. Samples carry a monotonic `seq` for server-side
|
|
5824
|
+
* ordering & dedup. Durations use `performance.now()` — immune to wall-clock
|
|
5825
|
+
* jumps.
|
|
5796
5826
|
*
|
|
5797
5827
|
* NOTE: For `stream.session_ended` on the tab close to survive teardown,
|
|
5798
5828
|
* the Mixpanel client must be configured with `api_transport: 'sendBeacon'`.
|
|
@@ -5869,6 +5899,8 @@ class StreamStatusTelemetryService2 {
|
|
|
5869
5899
|
/** Streamer identity for the adopted signaling phase params. */
|
|
5870
5900
|
this.ssData$ = this.store.selectSignal(unrealFeature.selectSsData);
|
|
5871
5901
|
this.awsInstance$ = this.store.selectSignal(unrealFeature.selectAwsInstance);
|
|
5902
|
+
/** The session's connection id — shipped as `sessionId` on every event. */
|
|
5903
|
+
this.connectionId$ = this.store.selectSignal(selectCirrusConnectionId);
|
|
5872
5904
|
this.session = null;
|
|
5873
5905
|
/**
|
|
5874
5906
|
* Whether a session has already started during the current page lifetime.
|
|
@@ -5995,12 +6027,18 @@ class StreamStatusTelemetryService2 {
|
|
|
5995
6027
|
event: this.actions$.pipe(ofType(instanceReady)),
|
|
5996
6028
|
},
|
|
5997
6029
|
this.configReceivedEntry,
|
|
6030
|
+
// CLOSER — streamer identity from the `ssInfo` message (`cirrusVersion`
|
|
6031
|
+
// / `branchInfo` / `instanceType` / `streamerVersion` / `streamPath` /
|
|
6032
|
+
// `streamApp` / `connectionId`) plus the endpoint that served it. The
|
|
6033
|
+
// `connectionId` param is the session id every event of this session
|
|
6034
|
+
// is shipped under — see {@link SessionState.wireId}.
|
|
5998
6035
|
{
|
|
5999
6036
|
id: 'ssinfo-received',
|
|
6000
|
-
event: this.store.select(unrealFeature.selectSsData).pipe(filter$1(Boolean), take(1), withLatestFrom$1(this.store.select(unrealFeature.selectAwsInstance)), map(([ssData, aws]) => ({
|
|
6037
|
+
event: this.store.select(unrealFeature.selectSsData).pipe(filter$1(Boolean), take(1), withLatestFrom$1(this.store.select(unrealFeature.selectAwsInstance), this.store.select(selectCirrusConnectionId)), map(([ssData, aws, connectionId]) => ({
|
|
6001
6038
|
client: aws.wsUrl,
|
|
6002
6039
|
instanceName: aws.instanceName,
|
|
6003
6040
|
...ssData,
|
|
6041
|
+
connectionId,
|
|
6004
6042
|
}))),
|
|
6005
6043
|
},
|
|
6006
6044
|
],
|
|
@@ -6030,15 +6068,13 @@ class StreamStatusTelemetryService2 {
|
|
|
6030
6068
|
event: this.signallingService.onWebRtcIce$.pipe(filter$1(Boolean)),
|
|
6031
6069
|
mode: 'last',
|
|
6032
6070
|
},
|
|
6033
|
-
// CLOSER — snaps negotiation diagnostics
|
|
6034
|
-
// streamer identity (`ssData`, reliably populated by DC-open
|
|
6035
|
-
// time) into phase-3 params:
|
|
6071
|
+
// CLOSER — snaps negotiation diagnostics into phase-3 params:
|
|
6036
6072
|
// - `iceCandidateCount` (total ICE candidates from server — too
|
|
6037
6073
|
// few hints at a restrictive network)
|
|
6038
6074
|
// - `handshakeFlow` (server-offer vs. client-offer; we only use
|
|
6039
6075
|
// server-offer today, but the detector stays in place)
|
|
6040
|
-
//
|
|
6041
|
-
//
|
|
6076
|
+
// The streamer identity (`connectionId` & co) rides the phase-2
|
|
6077
|
+
// `ssinfo-received` closer, not this one.
|
|
6042
6078
|
{
|
|
6043
6079
|
id: 'datachannel-connected',
|
|
6044
6080
|
event: this.store
|
|
@@ -6191,6 +6227,8 @@ class StreamStatusTelemetryService2 {
|
|
|
6191
6227
|
const times = new Map();
|
|
6192
6228
|
this.session = {
|
|
6193
6229
|
id,
|
|
6230
|
+
wireId: null,
|
|
6231
|
+
outbox: [],
|
|
6194
6232
|
startedAt,
|
|
6195
6233
|
startedAtPerf,
|
|
6196
6234
|
anchorPerf,
|
|
@@ -6209,6 +6247,14 @@ class StreamStatusTelemetryService2 {
|
|
|
6209
6247
|
commandCount: 0,
|
|
6210
6248
|
times,
|
|
6211
6249
|
};
|
|
6250
|
+
// Resolve the wire session id from the stream's connection id, then flush
|
|
6251
|
+
// everything queued so far. Subscribed FIRST so the id is in place before
|
|
6252
|
+
// any closer can fire (a `select` replays the current state synchronously —
|
|
6253
|
+
// an adopted stream already has its id in the store at this point).
|
|
6254
|
+
sub.add(this.store
|
|
6255
|
+
.select(selectCirrusConnectionId)
|
|
6256
|
+
.pipe(filter$1(Boolean), take(1))
|
|
6257
|
+
.subscribe((connectionId) => this.resolveWireId(connectionId)));
|
|
6212
6258
|
// Side-channel counters for WebRTC negotiation diagnostics — shown
|
|
6213
6259
|
// as phase-3 params on the `datachannel_connected` closer. Kept
|
|
6214
6260
|
// imperative (session-scoped) so no RxJS hot-stream plumbing is
|
|
@@ -6334,7 +6380,8 @@ class StreamStatusTelemetryService2 {
|
|
|
6334
6380
|
endSession(reason) {
|
|
6335
6381
|
if (!this.session)
|
|
6336
6382
|
return;
|
|
6337
|
-
const
|
|
6383
|
+
const session = this.session;
|
|
6384
|
+
const { id, sub } = session;
|
|
6338
6385
|
// Granular cause + message read from current store state. The
|
|
6339
6386
|
// unreal reducer updates these synchronously when the originating
|
|
6340
6387
|
// action (`disconnectStream` / `destroyRemoteConnections`) fires,
|
|
@@ -6363,9 +6410,35 @@ class StreamStatusTelemetryService2 {
|
|
|
6363
6410
|
: {}),
|
|
6364
6411
|
timestamp: new Date().toISOString(),
|
|
6365
6412
|
});
|
|
6413
|
+
// The stream never reached Cirrus (failed connect / abandoned attempt), so
|
|
6414
|
+
// no connection id ever arrived — ship the queue under the local fallback
|
|
6415
|
+
// id rather than dropping it. A no-op once `wireId` resolved.
|
|
6416
|
+
this.flushOutbox(session, id);
|
|
6366
6417
|
sub.unsubscribe();
|
|
6367
6418
|
this.session = null;
|
|
6368
6419
|
}
|
|
6420
|
+
/**
|
|
6421
|
+
* Adopt the stream's connection id as this session's wire id and release the
|
|
6422
|
+
* queue. The id becomes a file name on the collector, so anything that isn't
|
|
6423
|
+
* a plain `[A-Za-z0-9_-]{1,64}` token is rejected (the collector answers 400
|
|
6424
|
+
* to those — that would drop the whole session) and the local uuid is kept.
|
|
6425
|
+
*/
|
|
6426
|
+
resolveWireId(connectionId) {
|
|
6427
|
+
const session = this.session;
|
|
6428
|
+
if (!session || session.wireId)
|
|
6429
|
+
return;
|
|
6430
|
+
if (!/^[A-Za-z0-9_-]{1,64}$/.test(connectionId))
|
|
6431
|
+
return;
|
|
6432
|
+
session.wireId = connectionId;
|
|
6433
|
+
this.flushOutbox(session, connectionId);
|
|
6434
|
+
}
|
|
6435
|
+
/** Emit every queued event under `sessionId`, in emission order. */
|
|
6436
|
+
flushOutbox(session, sessionId) {
|
|
6437
|
+
const queued = session.outbox.splice(0);
|
|
6438
|
+
for (const { event, data } of queued) {
|
|
6439
|
+
this.emit(event, { ...data, sessionId });
|
|
6440
|
+
}
|
|
6441
|
+
}
|
|
6369
6442
|
/**
|
|
6370
6443
|
* Emit a lifecycle event with a `duration` field — ms between the
|
|
6371
6444
|
* previous lifecycle event and now (phase-local, NOT anchor-relative).
|
|
@@ -6504,7 +6577,9 @@ class StreamStatusTelemetryService2 {
|
|
|
6504
6577
|
});
|
|
6505
6578
|
}
|
|
6506
6579
|
/** Streamer identity params for the adopted signaling phase — mirrors the
|
|
6507
|
-
* `ssinfo-received` closer's shape (client / instanceName / …ssData
|
|
6580
|
+
* `ssinfo-received` closer's shape (client / instanceName / …ssData /
|
|
6581
|
+
* connectionId). For an adopted stream `ssData` is the one the prefetch
|
|
6582
|
+
* captured and `streamAdopted` hydrated into the store. */
|
|
6508
6583
|
adoptedSignalingParams() {
|
|
6509
6584
|
const aws = this.awsInstance$();
|
|
6510
6585
|
const ssData = this.ssData$();
|
|
@@ -6512,6 +6587,7 @@ class StreamStatusTelemetryService2 {
|
|
|
6512
6587
|
client: aws?.wsUrl ?? null,
|
|
6513
6588
|
instanceName: aws?.instanceName ?? null,
|
|
6514
6589
|
...(ssData ?? {}),
|
|
6590
|
+
connectionId: this.connectionId$(),
|
|
6515
6591
|
};
|
|
6516
6592
|
}
|
|
6517
6593
|
/** Read the region-ping cache the prefetch reused (localStorage), so the
|
|
@@ -6794,14 +6870,30 @@ class StreamStatusTelemetryService2 {
|
|
|
6794
6870
|
max: sorted[sorted.length - 1],
|
|
6795
6871
|
};
|
|
6796
6872
|
}
|
|
6873
|
+
/**
|
|
6874
|
+
* Ship one event — or queue it when the session id isn't resolved yet.
|
|
6875
|
+
*
|
|
6876
|
+
* `sessionId` written by the callers is the local fallback; the value that
|
|
6877
|
+
* goes on the wire is always the resolved one ({@link SessionState.wireId}),
|
|
6878
|
+
* stamped here so every event of a session shares a single id.
|
|
6879
|
+
*/
|
|
6797
6880
|
track(event, data) {
|
|
6798
6881
|
// `userId` is attached to every event, so the server can bucket files
|
|
6799
6882
|
// under `data/<userId>/<sessionId>.jsonl` without maintaining a
|
|
6800
6883
|
// session→user index.
|
|
6801
|
-
this.
|
|
6802
|
-
|
|
6803
|
-
|
|
6804
|
-
|
|
6884
|
+
const enriched = { userId: this.userId, ...data };
|
|
6885
|
+
const session = this.session;
|
|
6886
|
+
if (session && !session.wireId) {
|
|
6887
|
+
session.outbox.push({ event, data: enriched });
|
|
6888
|
+
return;
|
|
6889
|
+
}
|
|
6890
|
+
this.emit(event, {
|
|
6891
|
+
...enriched,
|
|
6892
|
+
...(session?.wireId ? { sessionId: session.wireId } : {}),
|
|
6893
|
+
});
|
|
6894
|
+
}
|
|
6895
|
+
emit(event, data) {
|
|
6896
|
+
this.store.dispatch(trackTelemetryData({ event, data }));
|
|
6805
6897
|
}
|
|
6806
6898
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: StreamStatusTelemetryService2, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
6807
6899
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: StreamStatusTelemetryService2, providedIn: 'root' }); }
|
|
@@ -7984,7 +8076,8 @@ class UnrealSceneComponent {
|
|
|
7984
8076
|
}
|
|
7985
8077
|
sendResize(size) {
|
|
7986
8078
|
const video = this.videoService.video;
|
|
7987
|
-
|
|
8079
|
+
// No Metabox commands in 'default' mode.
|
|
8080
|
+
if (!video || !isMetaboxMode(this.unrealConfig)) {
|
|
7988
8081
|
return;
|
|
7989
8082
|
}
|
|
7990
8083
|
this.commandsSender.sendCommandToUnreal({
|
|
@@ -8059,7 +8152,9 @@ function provideUnrealModule() {
|
|
|
8059
8152
|
inject(AFKService);
|
|
8060
8153
|
inject(FreezeFrameService);
|
|
8061
8154
|
inject(AnalyticsService);
|
|
8062
|
-
|
|
8155
|
+
// FpsMonitorService is intentionally not instantiated — adaptive FPS
|
|
8156
|
+
// control is disabled for now. Re-add `inject(FpsMonitorService)` here
|
|
8157
|
+
// (and set `fpsMonitor: true` in UNREAL_CONFIG) to turn it back on.
|
|
8063
8158
|
}),
|
|
8064
8159
|
]);
|
|
8065
8160
|
}
|
|
@@ -8068,5 +8163,5 @@ function provideUnrealModule() {
|
|
|
8068
8163
|
* Generated bundle index. Do not edit.
|
|
8069
8164
|
*/
|
|
8070
8165
|
|
|
8071
|
-
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, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, INNER_RETRY_LIMIT, INSTANCE_READY_TIMEOUT, 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, 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, startStream, streamAdopted, trackMixpanelEvent, trackTelemetryData, uint8ToBase64, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
|
|
8166
|
+
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, FpsMonitorService, FreezeFrameComponent, FreezeFrameService, INNER_RETRY_LIMIT, INSTANCE_READY_TIMEOUT, 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, 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, isMetaboxMode, 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, startStream, streamAdopted, trackMixpanelEvent, trackTelemetryData, uint8ToBase64, unrealCommandCallback, unrealFeature, unrealReducer, updateCirrusInfo, videoAdaptedToContainer, videoStreamInitialized };
|
|
8072
8167
|
//# sourceMappingURL=3dsource-angular-unreal-module.mjs.map
|