Skip to content

Commit abe135c

Browse files
committed
chore: update path for catch (err: unknown)
1 parent 160e7ed commit abe135c

2 files changed

Lines changed: 37 additions & 2 deletions

File tree

src/media/local-stream.spec.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,9 @@ describe('LocalStream', () => {
213213

214214
const inputTrack = audioStream.getTracks()[0];
215215
jest.spyOn(inputTrack, 'getSettings').mockReturnValue(audioSettings);
216+
jest.spyOn(inputTrack, 'stop').mockImplementation(() => {
217+
(inputTrack as { readyState: string }).readyState = 'ended';
218+
});
216219

217220
const eventHandlers = new Map<string, (...args: unknown[]) => void>();
218221
effect = {
@@ -397,6 +400,10 @@ describe('LocalStream', () => {
397400
expect.hasAssertions();
398401

399402
const endedSpy = jest.spyOn(audioLocalStream[StreamEventNames.Ended], 'emit');
403+
const outputTrackChangeSpy = jest.spyOn(
404+
audioLocalStream[LocalStreamEventNames.OutputTrackChange],
405+
'emit'
406+
);
400407

401408
getUserMediaSpy
402409
.mockRejectedValueOnce(new Error('OverconstrainedError'))
@@ -406,6 +413,28 @@ describe('LocalStream', () => {
406413

407414
expect(getUserMediaSpy).toHaveBeenCalledTimes(2);
408415
expect(endedSpy).toHaveBeenCalledWith();
416+
expect(outputTrackChangeSpy).not.toHaveBeenCalled();
417+
});
418+
419+
it('should fall back to raw mic track when replaceInputTrack fails', async () => {
420+
expect.hasAssertions();
421+
422+
const endedSpy = jest.spyOn(audioLocalStream[StreamEventNames.Ended], 'emit');
423+
424+
(effect.replaceInputTrack as jest.Mock).mockRejectedValueOnce(
425+
new Error('AudioContext closed')
426+
);
427+
428+
(newAudioTrack as { readyState: string }).readyState = 'live';
429+
430+
(audioStream.addTrack as jest.Mock).mockImplementation((track: MediaStreamTrack) => {
431+
(audioStream.getTracks as jest.Mock).mockReturnValue([track]);
432+
});
433+
434+
await constraintsHandler({ autoGainControl: false });
435+
436+
expect(endedSpy).not.toHaveBeenCalled();
437+
expect(effect.replaceInputTrack).toHaveBeenCalledWith(newAudioTrack);
409438
});
410439

411440
it('should preserve the enabled state of the track after re-acquisition', async () => {

src/media/local-stream.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,9 +376,15 @@ abstract class _LocalStream extends Stream {
376376
this[LocalStreamEventNames.ConstraintsChange].emit();
377377
logger.log(`Effect constraints applied via track re-acquisition.`);
378378
} catch (err: unknown) {
379-
logger.error(`Failed to re-acquire track after constraint change:`, err);
380379
savedTrackSettings = {};
381-
this[StreamEventNames.Ended].emit();
380+
381+
if (this.inputTrack.readyState === 'live') {
382+
this.changeOutputTrack(this.inputTrack);
383+
logger.warn(`Effect wiring failed, continuing with raw mic track:`, err);
384+
} else {
385+
logger.error(`Failed to re-acquire mic track, stream ended:`, err);
386+
this[StreamEventNames.Ended].emit();
387+
}
382388
}
383389
};
384390

0 commit comments

Comments
 (0)