@livedigital/client 3.25.4 → 3.25.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@livedigital/client",
3
3
  "author": "vlprojects",
4
4
  "license": "MIT",
5
- "version": "3.25.4",
5
+ "version": "3.25.6",
6
6
  "private": false,
7
7
  "bugs": {
8
8
  "url": "https://github.com/vlprojects/livedigital-sdk/issues"
@@ -1,4 +1,5 @@
1
1
  import { serializeError } from 'serialize-error';
2
+ import Peer from '../Peer';
2
3
  import { LogMessageHandler, TrackLabel } from '../../types/common';
3
4
  import Engine from '../index';
4
5
  import Logger from '../Logger';
@@ -14,6 +15,10 @@ class ChannelAudioObserverEventHandler {
14
15
 
15
16
  private readonly logger: Logger;
16
17
 
18
+ private currentActiveSpeaker: Peer | undefined;
19
+
20
+ private prevActiveSpeaker: Peer | undefined;
21
+
17
22
  constructor(params: { engine: Engine, onLogMessage?: LogMessageHandler }) {
18
23
  const { engine, onLogMessage } = params;
19
24
  this.engine = engine;
@@ -23,6 +28,7 @@ class ChannelAudioObserverEventHandler {
23
28
  onLogMessage,
24
29
  sendAnalytics: engine.sendAnalytics,
25
30
  });
31
+ this.watchPeersLeaves();
26
32
  }
27
33
 
28
34
  public handle(data: string): void {
@@ -56,13 +62,26 @@ class ChannelAudioObserverEventHandler {
56
62
  private handleDominantSpeaker(payload: DominantSpeakerEvent): void {
57
63
  const { peerId } = payload.data;
58
64
  const peer = this.engine.getPeerById(peerId);
65
+ this.currentActiveSpeaker = peer;
66
+ this.prevActiveSpeaker = peer;
59
67
  this.engine.setActiveSpeakerPeer(peer);
60
68
  }
61
69
 
62
70
  private handlePeerVolumes(payload: PeersVolumesEvent): void {
63
71
  payload.volumes.forEach((item) => {
64
72
  const { peerId, trackLabel, value } = item;
65
- const track = this.engine.getPeerById(peerId)?.tracks.get(trackLabel);
73
+ const peer = this.engine.getPeerById(peerId);
74
+
75
+ if (!peer) {
76
+ return;
77
+ }
78
+
79
+ if (value > 0 && !this.currentActiveSpeaker && peer.id === this.prevActiveSpeaker?.id) {
80
+ this.currentActiveSpeaker = peer;
81
+ this.engine.setActiveSpeakerPeer(peer);
82
+ }
83
+
84
+ const track = peer.tracks.get(trackLabel);
66
85
  if (!track) {
67
86
  return;
68
87
  }
@@ -74,6 +93,7 @@ class ChannelAudioObserverEventHandler {
74
93
  private handleSilence(): void {
75
94
  const tracks = this.engine.peers.flatMap((peer) => Array.from(peer.tracks.values()));
76
95
  tracks.forEach((track) => track.setVolume(0));
96
+ this.currentActiveSpeaker = undefined;
77
97
  this.engine.setActiveSpeakerPeer(undefined);
78
98
  }
79
99
 
@@ -122,6 +142,14 @@ class ChannelAudioObserverEventHandler {
122
142
  }
123
143
  }
124
144
 
145
+ private watchPeersLeaves(): void {
146
+ this.engine.clientEventEmitter.on('peer-left', (peerId) => {
147
+ if (peerId === this.currentActiveSpeaker?.id) {
148
+ this.engine.setActiveSpeakerPeer(undefined);
149
+ }
150
+ });
151
+ }
152
+
125
153
  static throwInvalidPayload(): void {
126
154
  throw new InvalidPayloadError('Invalid channel audio observer event handler payload');
127
155
  }
@@ -64,7 +64,7 @@ class Network {
64
64
 
65
65
  public receiveTransport?: Transport<TransportAppData>;
66
66
 
67
- private preferRelay: boolean = false;
67
+ private preferRelay?: boolean;
68
68
 
69
69
  readonly #iceIntervalTimeouts: IceIntervalTimeouts = {
70
70
  send: undefined,
@@ -376,7 +376,7 @@ class Network {
376
376
  }
377
377
 
378
378
  public getPreferRelay(): boolean {
379
- return this.preferRelay;
379
+ return this.preferRelay ?? false;
380
380
  }
381
381
 
382
382
  public async getChannelPeers(role?: Role): Promise<{ peers: PeerResponse[] }> {