diff --git a/apps/electron-backend/src/app/events/external-player-process.spec.ts b/apps/electron-backend/src/app/events/external-player-process.spec.ts index 2329e36bf..eaaa1561d 100644 --- a/apps/electron-backend/src/app/events/external-player-process.spec.ts +++ b/apps/electron-backend/src/app/events/external-player-process.spec.ts @@ -15,6 +15,26 @@ function createMockChildProcess(): ChildProcess { } describe('external player process teardown', () => { + it('accepts close as confirmed termination after a spawn error', async () => { + const child = createMockChildProcess(); + child.on('error', () => undefined); + let settled = false; + const exit = waitForExternalPlayerProcessExit(child).then(() => { + settled = true; + }); + + child.emit( + 'error', + Object.assign(new Error('spawn failed'), { code: 'ENOENT' }) + ); + await Promise.resolve(); + expect(settled).toBe(false); + + child.emit('close', -2, null); + + await expect(exit).resolves.toBeUndefined(); + }); + it('does not treat a process error as confirmed exit', async () => { const child = createMockChildProcess(); child.on('error', () => undefined); diff --git a/apps/electron-backend/src/app/events/external-player-process.ts b/apps/electron-backend/src/app/events/external-player-process.ts index 8126eaee2..90b9e04c9 100644 --- a/apps/electron-backend/src/app/events/external-player-process.ts +++ b/apps/electron-backend/src/app/events/external-player-process.ts @@ -14,9 +14,11 @@ export function waitForExternalPlayerProcessExit( return new Promise((resolve) => { const complete = () => { child.off('exit', complete); + child.off('close', complete); resolve(); }; child.once('exit', complete); + child.once('close', complete); }); }