diff --git a/deps/cloudxr/.env.default b/deps/cloudxr/.env.default index a4de5e6079..66caf4acb0 100644 --- a/deps/cloudxr/.env.default +++ b/deps/cloudxr/.env.default @@ -6,7 +6,7 @@ # CloudXR Docker Images and Configs ########################################################### CXR_RUNTIME_SDK_VERSION=6.4.0 -CXR_WEB_SDK_VERSION=6.3.0 +CXR_WEB_SDK_VERSION=6.4.1-isaaccapture CXR_HOST_VOLUME_PATH=$HOME/.cloudxr ########################################################### diff --git a/deps/cloudxr/webxr_client/helpers/react/CloudXRComponent.tsx b/deps/cloudxr/webxr_client/helpers/react/CloudXRComponent.tsx index ec403c9802..071ae147a4 100644 --- a/deps/cloudxr/webxr_client/helpers/react/CloudXRComponent.tsx +++ b/deps/cloudxr/webxr_client/helpers/react/CloudXRComponent.tsx @@ -74,23 +74,23 @@ const WARMUP_COMPLETE_LOG_PATTERN = // override via the streamAttachTimeoutMs prop, not by lowering this default. const STREAM_ATTACH_BASE_TIMEOUT_MS = 120000; // 2 minutes -// Debug log for each keep-alive "idle" frame the server sends while no OpenXR app is submitting -// frames. Not currently emitted by CloudXR.js: until a release that emits it is consumed, and the -// session logLevel includes Debug, none of the idle-frame handling below runs. +// Info log for each keep-alive "idle" frame the server sends while no OpenXR app is submitting +// frames. Emitted by CloudXR.js 6.4.1-isaaccapture and later; with an older SDK none of the +// idle-frame handling below runs. const IDLE_FRAME_LOG_MESSAGE = 'Received idle frame'; // Idle frames are sent about every 250 ms; this long with none means real frames have started // (or the stream stalled), so the warm-up watchdogs resume. const IDLE_FRAMES_QUIET_MS = 1000; -// Defaults for the warmupBeginTimeoutMs/warmupEndTimeoutMs props below. 0 disables warm-up -// detection: a CloudXR runtime with no OpenXR app streams idle frames that count as warm-up -// frames, so a fixed deadline can tear down a healthy session that is only waiting for an app. -// Callers that want detection (e.g. tests) set the props. Neither deadline grows per reconnect -// attempt (see armWarmupBeginTimer/armWarmupEndTimer). Split into two because "no warm-up signal -// at all since attaching" and "warm-up started but never finishes" are different failure modes -// worth distinguishing in the synthetic error message. -const WARMUP_BEGIN_BASE_TIMEOUT_MS = 0; // disabled; first warm-up log since onStreamStarted -const WARMUP_END_BASE_TIMEOUT_MS = 0; // disabled; completion since warm-up began +// Defaults for the warmupBeginTimeoutMs/warmupEndTimeoutMs props below. Both shorter than +// STREAM_ATTACH_BASE_TIMEOUT_MS and, unlike it, neither grows per reconnect attempt (see +// armWarmupBeginTimer/armWarmupEndTimer): once the stream has attached at all, decoder warm-up +// is a fast, bounded startup step (server encoder priming), not something that legitimately +// takes longer on a slow network the way the initial attach can. Split into two deadlines +// because "no warm-up signal at all since attaching" and "warm-up started but never finishes" +// are different failure modes worth distinguishing in the synthetic error message. +const WARMUP_BEGIN_BASE_TIMEOUT_MS = 10000; // 10 seconds - first warm-up log since onStreamStarted +const WARMUP_END_BASE_TIMEOUT_MS = 30000; // 30 seconds - completion since warm-up began // setTimeout's delay is stored as a 32-bit signed int internally; a value above this overflows // and fires (almost) immediately instead of waiting - the opposite of what a long configured @@ -115,7 +115,7 @@ export interface WarmupStatus { /** * Server keep-alive ("idle") frame status for the current connection attempt, derived from the - * SDK's 'Received idle frame' debug log (see IDLE_FRAME_LOG_MESSAGE). Idle frames mean the server + * SDK's 'Received idle frame' log (see IDLE_FRAME_LOG_MESSAGE). Idle frames mean the server * is alive but no OpenXR app is submitting frames. Reset at the start of each connection attempt. */ export interface IdleStatus { @@ -189,7 +189,7 @@ interface CloudXRComponentProps { * message. Like warmupEndTimeoutMs, does NOT grow per reconnect attempt - warm-up is a fast, * bounded server-side priming step once the stream has attached at all, not something that * legitimately takes longer under retry the way the initial attach can. Defaults to - * WARMUP_BEGIN_BASE_TIMEOUT_MS (0, disabled). A value <= 0 disables this detection, as does + * WARMUP_BEGIN_BASE_TIMEOUT_MS (10 seconds). A value <= 0 disables this detection, as does * warmupEndTimeoutMs <= 0. */ warmupBeginTimeoutMs?: number; @@ -200,7 +200,7 @@ interface CloudXRComponentProps { * the first warm-up log arrives and cleared by WARMUP_COMPLETE_LOG_PATTERN). See * warmupBeginTimeoutMs's doc comment for why this is a separate deadline. Does NOT grow per * reconnect attempt, for the same reason warmupBeginTimeoutMs doesn't. Defaults to - * WARMUP_END_BASE_TIMEOUT_MS (0, disabled). A value <= 0 disables this detection and + * WARMUP_END_BASE_TIMEOUT_MS (30 seconds). A value <= 0 disables this detection and * warmupBeginTimeoutMs too (all warm-up detection); stream-attach detection is unaffected. */ warmupEndTimeoutMs?: number; @@ -749,7 +749,7 @@ export default function CloudXRComponent({ telemetry: { enabled: true, appInfo: { - version: '6.3.0', + version: '6.4.1-isaaccapture', product: applicationName, }, }, diff --git a/deps/cloudxr/webxr_client/package.json b/deps/cloudxr/webxr_client/package.json index b904bec03a..5ba28f7cb7 100644 --- a/deps/cloudxr/webxr_client/package.json +++ b/deps/cloudxr/webxr_client/package.json @@ -1,6 +1,6 @@ { "name": "cloudxr-isaac-lab-teleop", - "version": "6.3.0", + "version": "6.4.1-isaaccapture", "private": true, "description": "NVIDIA Isaac Teleop Web Client", "author": "NVIDIA Corporation", @@ -54,7 +54,7 @@ ] }, "dependencies": { - "@nvidia/cloudxr": "file:../nvidia-cloudxr-6.3.0.tgz", + "@nvidia/cloudxr": "file:../nvidia-cloudxr-6.4.1-isaaccapture.tgz", "@preact/signals-react": "^3.10.0", "@react-three/drei": "^10.7.7", "@react-three/fiber": "^9.6.0", diff --git a/deps/cloudxr/webxr_client/src/CloudXR2DUI.tsx b/deps/cloudxr/webxr_client/src/CloudXR2DUI.tsx index fadaffbd27..77cb2351ad 100644 --- a/deps/cloudxr/webxr_client/src/CloudXR2DUI.tsx +++ b/deps/cloudxr/webxr_client/src/CloudXR2DUI.tsx @@ -599,8 +599,8 @@ export class CloudXR2DUI { reconnectMaxAttempts: 3, reconnectDelayMs: 3000, streamAttachTimeoutMs: 120000, - warmupBeginTimeoutMs: 0, - warmupEndTimeoutMs: 0, + warmupBeginTimeoutMs: 10000, + warmupEndTimeoutMs: 30000, teleopPath: DEFAULT_TELEOP_PATH, }; } diff --git a/deps/cloudxr/webxr_client/src/index.html b/deps/cloudxr/webxr_client/src/index.html index fb797d070f..511ddab93e 100644 --- a/deps/cloudxr/webxr_client/src/index.html +++ b/deps/cloudxr/webxr_client/src/index.html @@ -1570,7 +1570,7 @@

Advanced settings

Warm-up Begin Timeout (ms, default: 10000 / 10 seconds) Advanced settings step="1000" placeholder="Warm-up begin timeout in ms" spellcheck="false" - value="0" + value="10000" />
How long to wait, after the stream attaches, for the first sign that decoder @@ -1592,7 +1592,7 @@

Advanced settings

Warm-up End Timeout (ms, default: 30000 / 30 seconds) Advanced settings step="1000" placeholder="Warm-up end timeout in ms" spellcheck="false" - value="0" + value="30000" />
How long to wait for decoder warm-up to finish once it has begun before treating diff --git a/deps/cloudxr/webxr_client/tests/mock/MockCloudXR.ts b/deps/cloudxr/webxr_client/tests/mock/MockCloudXR.ts index 02b03ea18c..d3cc4058a3 100644 --- a/deps/cloudxr/webxr_client/tests/mock/MockCloudXR.ts +++ b/deps/cloudxr/webxr_client/tests/mock/MockCloudXR.ts @@ -378,6 +378,10 @@ export class MockCloudXR implements CloudXR.Session { throw new Error('MockCloudXR does not support sendServerMessage(); use a real session'); } + getDeveloperSettings(): CloudXR.DeveloperSettings { + throw new Error('MockCloudXR does not support getDeveloperSettings(); use a real session'); + } + setMicEnabled(enabled: boolean): boolean { if (this.sessionState !== CloudXR.SessionState.Connected) { return false; diff --git a/deps/cloudxr/webxr_client/webpack.common.js b/deps/cloudxr/webxr_client/webpack.common.js index 5503d4d043..d51ffc15ea 100644 --- a/deps/cloudxr/webxr_client/webpack.common.js +++ b/deps/cloudxr/webxr_client/webpack.common.js @@ -38,8 +38,16 @@ try { } catch {} // Source of truth for the CloudXR SDK is deps/cloudxr/.env.default's // CXR_WEB_SDK_VERSION (also controls which tarball `npm install` -// consumes); package.json.version is just a local-dev fallback. -const CLIENT_SDK_VERSION = process.env.SDK_VERSION || require('./package.json').version; +// consumes). Local builds that don't set SDK_VERSION report the installed SDK's own version; +// this package's version is not the SDK's. +function installedSdkVersion() { + try { + return require('@nvidia/cloudxr/package.json').version; + } catch { + return 'unknown'; + } +} +const CLIENT_SDK_VERSION = process.env.SDK_VERSION || installedSdkVersion(); const CLIENT_GIT_REF = process.env.CLIENT_GIT_REF || git('rev-parse --abbrev-ref HEAD') || 'unknown'; const CLIENT_GIT_SHA = (process.env.CLIENT_GIT_SHA || git('rev-parse HEAD') || 'unknown').slice(