Handle renewal restart failures
This commit is contained in:
@@ -227,7 +227,15 @@ export default class AudioManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.renewTimer = setTimeout(() => {
|
this.renewTimer = setTimeout(() => {
|
||||||
void this.start();
|
void this.start().catch(() => {
|
||||||
|
this.clearRenewTimer();
|
||||||
|
this.stopCurrentPlayback();
|
||||||
|
this.audioPlayer.stop(true);
|
||||||
|
this.connection?.disconnect();
|
||||||
|
this.connection?.destroy();
|
||||||
|
this.connection = undefined;
|
||||||
|
this.playbackState = 'stopped';
|
||||||
|
});
|
||||||
}, renewIntervalMs);
|
}, renewIntervalMs);
|
||||||
|
|
||||||
if (typeof this.renewTimer.unref === 'function') {
|
if (typeof this.renewTimer.unref === 'function') {
|
||||||
|
|||||||
@@ -298,6 +298,27 @@ describe('AudioManager', () => {
|
|||||||
expect(startSpy).toHaveBeenCalledTimes(1);
|
expect(startSpy).toHaveBeenCalledTimes(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('cleans up when renewal restart fails', async () => {
|
||||||
|
jest.useFakeTimers();
|
||||||
|
|
||||||
|
const manager = new AudioManager({
|
||||||
|
connection: connectionOptions,
|
||||||
|
source: liveStreamSource,
|
||||||
|
renewIntervalMs: 10_000,
|
||||||
|
});
|
||||||
|
const startSpy = jest.spyOn(manager, 'start').mockRejectedValue(new Error('renewal failed'));
|
||||||
|
|
||||||
|
await manager.connect();
|
||||||
|
jest.advanceTimersByTime(10_000);
|
||||||
|
await Promise.resolve();
|
||||||
|
|
||||||
|
expect(startSpy).toHaveBeenCalledTimes(1);
|
||||||
|
expect(mockAudioPlayer.stop).toHaveBeenCalledWith(true);
|
||||||
|
expect(mockConnection.destroy).toHaveBeenCalled();
|
||||||
|
expect(manager.state).toBe('stopped');
|
||||||
|
expect(jest.getTimerCount()).toBe(0);
|
||||||
|
});
|
||||||
|
|
||||||
it('clears existing renewal timer before reconnecting', async () => {
|
it('clears existing renewal timer before reconnecting', async () => {
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user