fix: enforce first-frame timeout and nav labels

This commit is contained in:
2026-09-02 08:22:40 +03:00
parent 5edddb8781
commit 1734003172
10 changed files with 217 additions and 40 deletions

View File

@@ -64,9 +64,9 @@ export function useSceneController(sources: SceneControllerSources): SceneContro
const reconcile = async (): Promise<void> => {
if (!mounted) return;
const allowed = sources.policy.value.allowSceneRequest && sources.quality.value !== 'static';
const requestedQuality = sources.quality.value;
const canvas = sources.canvas.value;
if (!allowed) {
if (!sources.policy.value.allowSceneRequest || requestedQuality === 'static') {
if (sources.policy.value.reason === 'visitor-pause' && controller !== null) {
controller.pause();
publish();
@@ -105,25 +105,19 @@ export function useSceneController(sources: SceneControllerSources): SceneContro
error.value = false;
state.value = 'loading';
try {
if (TEST_BUILD && isTestFault('F1-scene-chunk')) {
recordTestFaultEvent('scene-chunk-rejected');
throw new Error('Injected scene chunk failure');
}
const { createProceduralSceneGeneration } = await import('@/scene/world/environment');
if (
abort.signal.aborted
|| !mounted
|| currentGeneration !== generation
|| !sources.policy.value.allowSceneRequest
|| sources.quality.value === 'static'
|| sources.canvas.value !== canvas
) return;
let next!: SceneController;
next = createSceneController({
canvas,
quality: sources.quality.value,
build: createProceduralSceneGeneration,
quality: requestedQuality,
build: async (context) => {
if (TEST_BUILD && isTestFault('F1-scene-chunk')) {
recordTestFaultEvent('scene-chunk-rejected');
throw new Error('Injected scene chunk failure');
}
const { createProceduralSceneGeneration } = await import('@/scene/world/environment');
if (context.signal.aborted) throw new DOMException('Scene build aborted', 'AbortError');
return createProceduralSceneGeneration(context);
},
motionAllowed: () => sources.policy.value.allowSceneRequest,
onFrameRendered: sources.sampleFrame,
onStateChange: (nextState) => {
@@ -145,16 +139,6 @@ export function useSceneController(sources: SceneControllerSources): SceneContro
const kind = next.snapshot().state.kind;
error.value = kind === 'static';
publish();
if (TEST_BUILD && isTestFault('F2-first-frame-timeout')) {
window.setTimeout(() => {
if (controller === next && next.snapshot().state.kind === 'running') {
recordTestFaultEvent('first-frame-deadline');
next.setStatic('first-frame-timeout');
error.value = true;
publish();
}
}, 5_000);
}
} catch {
if (!abort.signal.aborted && currentGeneration === generation) {
error.value = true;