Skip to content

Commit fe0b727

Browse files
committed
chore: update addEffect
1 parent 3ec0623 commit fe0b727

2 files changed

Lines changed: 27 additions & 7 deletions

File tree

src/media/local-audio-stream.spec.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,23 @@ describe('LocalAudioStream', () => {
310310
expect(effect.replaceInputTrack).not.toHaveBeenCalled();
311311
});
312312

313+
it('should not register duplicate constraint handlers when addEffect is called with the same effect', async () => {
314+
expect.hasAssertions();
315+
316+
const onCalls = (effect.on as jest.Mock).mock.calls;
317+
const initialConstraintsRequiredCount = onCalls.filter(
318+
([event]: [string]) => event === 'constraints-required'
319+
).length;
320+
321+
await audioLocalStream.addEffect(effect);
322+
323+
const afterConstraintsRequiredCount = onCalls.filter(
324+
([event]: [string]) => event === 'constraints-required'
325+
).length;
326+
327+
expect(afterConstraintsRequiredCount).toBe(initialConstraintsRequiredCount);
328+
});
329+
313330
it('should not register audio constraint handlers for video tracks', async () => {
314331
expect.hasAssertions();
315332

src/media/local-audio-stream.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@ export class LocalAudioStream extends LocalStream {
1818
* @inheritdoc
1919
*/
2020
async addEffect(effect: TrackEffect): Promise<void> {
21-
await super.addEffect(effect);
21+
if (this.effects.some((e) => e.id === effect.id)) {
22+
return;
23+
}
2224
this.addConstraintHandlers(effect);
25+
await super.addEffect(effect);
2326
}
2427

2528
/**
@@ -186,13 +189,13 @@ export class LocalAudioStream extends LocalStream {
186189
* The base class handles its own listener cleanup separately.
187190
*/
188191
const removeConstraintHandlers = () => {
189-
effect.off('constraints-required' as EffectEvent, handleConstraintsRequired);
190-
effect.off('constraints-released' as EffectEvent, handleConstraintsReleased);
191-
effect.off('disposed' as EffectEvent, removeConstraintHandlers);
192+
effect.off('constraints-required' as EffectEvent, handleConstraintsRequired as never);
193+
effect.off('constraints-released' as EffectEvent, handleConstraintsReleased as never);
194+
effect.off('disposed' as EffectEvent, removeConstraintHandlers as never);
192195
};
193196

194-
effect.on('constraints-required' as EffectEvent, handleConstraintsRequired);
195-
effect.on('constraints-released' as EffectEvent, handleConstraintsReleased);
196-
effect.on('disposed' as EffectEvent, removeConstraintHandlers);
197+
effect.on('constraints-required' as EffectEvent, handleConstraintsRequired as never);
198+
effect.on('constraints-released' as EffectEvent, handleConstraintsReleased as never);
199+
effect.on('disposed' as EffectEvent, removeConstraintHandlers as never);
197200
}
198201
}

0 commit comments

Comments
 (0)