@livedigital/client 3.2.0 → 3.3.0

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.2.0",
5
+ "version": "3.3.0",
6
6
  "private": false,
7
7
  "bugs": {
8
8
  "url": "https://github.com/vlprojects/livedigital-sdk/issues"
@@ -13,7 +13,6 @@ export const LogLevels = {
13
13
  };
14
14
 
15
15
  export const CONSUMER_CHECK_STATE_TIMEOUT = 4500;
16
- export const PRODUCER_CHECK_STATE_TIMEOUT = 3000;
17
16
 
18
17
  export const PEER_APP_DATA_MAX_SIZE_BYTES = 1024;
19
18
 
@@ -4,16 +4,14 @@ import { Mutex } from 'async-mutex';
4
4
  import {
5
5
  BaseTrackInfo,
6
6
  EncoderConfig,
7
- SocketResponse, Timeout,
7
+ SocketResponse,
8
8
  TrackLabel,
9
9
  TrackOutboundStats,
10
10
  TrackProduceParams,
11
11
  } from '../../../types/common';
12
12
  import Logger from '../../Logger';
13
13
  import Engine from '../../index';
14
- import PeerConsumer from '../../PeerConsumer';
15
- import { PRODUCER_CHECK_STATE_TIMEOUT } from '../../../constants/common';
16
- import { CLIENT_EVENTS, INTERNAL_CLIENT_EVENTS, MEDIASOUP_EVENTS } from '../../../constants/events';
14
+ import { INTERNAL_CLIENT_EVENTS, MEDIASOUP_EVENTS } from '../../../constants/events';
17
15
  import EnhancedEventEmitter from '../../../EnhancedEventEmitter';
18
16
  import filterStatsCodecs from '../../../helpers/filterStatsCodecs';
19
17
  import MediaStreamTrackManager from './MediaStreamTrackManager';
@@ -32,12 +30,6 @@ class DefaultBaseTrack implements BaseTrack {
32
30
 
33
31
  readonly #engine: Engine;
34
32
 
35
- #selfConsumer?: PeerConsumer;
36
-
37
- #checkStateTimeout?: Timeout;
38
-
39
- #producerRestarted = false;
40
-
41
33
  readonly #clientEventEmitter: EnhancedEventEmitter;
42
34
 
43
35
  #closed = false;
@@ -170,133 +162,6 @@ class DefaultBaseTrack implements BaseTrack {
170
162
  this.mediaStreamTrack.dispatchEvent(new Event('ended'));
171
163
  }
172
164
 
173
- private async checkProducerState(): Promise<void> {
174
- try {
175
- if (this.#closed || this.kind === 'audio') {
176
- return;
177
- }
178
-
179
- this.logger.debug('checkProducerState()', { track: this });
180
- await this.createSelfConsumer();
181
-
182
- const isCodecsMatched = await this.isCodecsMatched();
183
- if (this.#producerRestarted && !isCodecsMatched) {
184
- await this.closeSelfConsumer();
185
- this.clientEventEmitter.emit(CLIENT_EVENTS.trackPublishingFailed, this);
186
- this.logger.debug('trackPublishingFail()', { track: this });
187
- return;
188
- }
189
-
190
- await this.closeSelfConsumer();
191
- if (isCodecsMatched || this.#closed) {
192
- return;
193
- }
194
-
195
- await this.restartProducer();
196
- } catch (error) {
197
- this.logger.warn('checkProducerState()', { track: this, error });
198
- }
199
- }
200
-
201
- private async createSelfConsumer(): Promise<void> {
202
- if (!this.producer) {
203
- throw new Error('Producer missing');
204
- }
205
-
206
- this.logger.debug('createSelfConsumer()', { track: this });
207
- const { consumer } = await this.#engine.network.createConsumer({
208
- producerId: this.producer.id,
209
- rtpCapabilities: this.#engine.media.mediasoupDevice.rtpCapabilities,
210
- producerPeerId: this.producer.appData.peerId,
211
- appId: this.#engine.appId,
212
- channelId: this.#engine.channelId,
213
- });
214
-
215
- await this.#engine.network.resumeRemoteConsumer(consumer.id);
216
- consumer.resume();
217
- this.#selfConsumer = new PeerConsumer({
218
- consumer,
219
- logLevel: this.#engine.logLevel,
220
- });
221
- }
222
-
223
- private async closeSelfConsumer(): Promise<void> {
224
- if (!this.#selfConsumer) {
225
- return;
226
- }
227
-
228
- this.logger.debug('closeSelfConsumer()', { track: this });
229
- this.#selfConsumer.close();
230
- await this.#engine.network.closeRemoteConsumer(this.#selfConsumer.id);
231
- this.#selfConsumer = undefined;
232
- }
233
-
234
- private async restartProducer(): Promise<void> {
235
- if (!this.producer || this.#closed) {
236
- return;
237
- }
238
-
239
- const {
240
- appData: {
241
- encodings,
242
- codecOptions,
243
- trackTransformParams,
244
- preferredCodec,
245
- keyFrameRequestDelay,
246
- },
247
- } = this.producer;
248
-
249
- await this.closeProducer(false);
250
- this.#producerRestarted = true;
251
- await this.produce({
252
- encodings,
253
- codecOptions,
254
- transformParams: trackTransformParams,
255
- preferredCodec,
256
- keyFrameRequestDelay,
257
- });
258
-
259
- this.logger.debug('restartProducer()', { track: this });
260
- }
261
-
262
- private async isCodecsMatched(): Promise<boolean> {
263
- if (!this.#selfConsumer || this.#closed) {
264
- this.logger.debug('isCodecsMatched()', { message: 'selfConsumer is missed', track: this });
265
- return false;
266
- }
267
-
268
- return new Promise((resolve) => {
269
- this.#checkStateTimeout = setTimeout(async () => {
270
- try {
271
- if (!this.#selfConsumer) {
272
- resolve(false);
273
- return;
274
- }
275
-
276
- const { decoderImplementation } = await this.#selfConsumer.getInboundRTPStreamStats();
277
- if (decoderImplementation === 'unknown') {
278
- resolve(false);
279
- return;
280
- }
281
-
282
- resolve(true);
283
- } catch (error) {
284
- this.logger.debug('isCodecsMatched()', { error, track: this });
285
- resolve(false);
286
- }
287
- }, PRODUCER_CHECK_STATE_TIMEOUT);
288
- });
289
- }
290
-
291
- private async cancelProducerCheckState(): Promise<void> {
292
- this.logger.debug('cancelProducerCheckState()', { track: this });
293
- if (this.#checkStateTimeout) {
294
- clearTimeout(this.#checkStateTimeout);
295
- }
296
-
297
- await this.closeSelfConsumer();
298
- }
299
-
300
165
  async produce({
301
166
  encodings,
302
167
  codecOptions,
@@ -356,7 +221,6 @@ class DefaultBaseTrack implements BaseTrack {
356
221
  }
357
222
 
358
223
  this.setProducer(producer);
359
- this.checkProducerState();
360
224
 
361
225
  if (this.kind === 'video') {
362
226
  await producer.setMaxSpatialLayer(maxSpatialLayer);
@@ -387,7 +251,6 @@ class DefaultBaseTrack implements BaseTrack {
387
251
  return;
388
252
  }
389
253
 
390
- await this.cancelProducerCheckState();
391
254
  await this.closeProducer();
392
255
  this.stopMediaStreamTrack();
393
256
  this.clientEventEmitter.emit(INTERNAL_CLIENT_EVENTS.trackUnproduced, this);
@@ -416,7 +279,6 @@ class DefaultBaseTrack implements BaseTrack {
416
279
  }
417
280
 
418
281
  try {
419
- await this.cancelProducerCheckState();
420
282
  await this.pauseRemoteProducer(this.producer.id);
421
283
  this.producer.pause();
422
284
  this.logger.debug('pause()', { track: this });