fix: guard scene director callbacks

This commit is contained in:
dufferdeepu committed 2026-10-17 19:40:12 +05:30
1 parent d2de6258ae
commit abf2ce1c9a
2 files changed
+15 -1

No files matched your search

+5 -1
View File
@@ -95,7 +95,11 @@ export async function playSceneQueue(
try { try {
await adapter.releaseScene(toRelease); await adapter.releaseScene(toRelease);
} catch (error) { } catch (error) {
if (!runError) throw error; if (runError) {
console.warn('[Scenes] Scene release failed:', error);
} else {
throw error;
}
} }
} }
} }
+10
View File
@@ -200,6 +200,10 @@ test('a cleanup failure rejects for the caller to restore its own controls', asy
test('a phase failure is preserved when final scene release also throws', async () => { test('a phase failure is preserved when final scene release also throws', async () => {
const phaseError = new Error('travel failed'); const phaseError = new Error('travel failed');
const releaseError = new Error('release failed'); const releaseError = new Error('release failed');
const warnings = [];
const origWarn = console.warn;
console.warn = (...args) => warnings.push(args);
try {
const f = fixture({ const f = fixture({
travel: async () => { travel: async () => {
throw phaseError; throw phaseError;
@@ -212,6 +216,12 @@ test('a phase failure is preserved when final scene release also throws', async
playSceneQueue(buildPlaybackQueue(scenes, 'a', { single: true }), f), playSceneQueue(buildPlaybackQueue(scenes, 'a', { single: true }), f),
(error) => error === phaseError, (error) => error === phaseError,
); );
assert.equal(warnings.length, 1);
assert.equal(warnings[0][0], '[Scenes] Scene release failed:');
assert.equal(warnings[0][1], releaseError);
} finally {
console.warn = origWarn;
}
}); });
test('a failing inter-scene release releases the active scene only once', async () => { test('a failing inter-scene release releases the active scene only once', async () => {