@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/dist/constants/common.d.ts +0 -1
- package/dist/constants/common.ts +0 -1
- package/dist/engine/media/tracks/DefaultBaseTrack.d.ts +0 -6
- package/dist/index.es.js +12 -12
- package/dist/index.js +12 -12
- package/package.json +1 -1
- package/src/constants/common.ts +0 -1
- package/src/engine/media/tracks/DefaultBaseTrack.ts +2 -140
package/package.json
CHANGED
package/src/constants/common.ts
CHANGED
|
@@ -4,16 +4,14 @@ import { Mutex } from 'async-mutex';
|
|
|
4
4
|
import {
|
|
5
5
|
BaseTrackInfo,
|
|
6
6
|
EncoderConfig,
|
|
7
|
-
SocketResponse,
|
|
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
|
|
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 });
|