@livedigital/client 2.0.0 → 2.1.1
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/engine/Peer.d.ts +4 -5
- package/dist/engine/PeerConsumer.d.ts +28 -0
- package/dist/index.es.js +1 -1
- package/dist/index.js +1 -1
- package/dist/types/common.d.ts +6 -0
- package/package.json +2 -2
- package/src/engine/Peer.ts +11 -18
- package/src/engine/PeerConsumer.ts +98 -0
- package/src/engine/network/index.ts +2 -2
- package/src/types/common.ts +7 -0
- package/dist/engine/media/Consumer.d.ts +0 -6
- package/dist/engine/media/VideoConsumer.d.ts +0 -14
- package/src/engine/media/Consumer.ts +0 -9
- package/src/engine/media/VideoConsumer.ts +0 -48
package/dist/types/common.d.ts
CHANGED
|
@@ -21,6 +21,12 @@ export declare type ProducerData = {
|
|
|
21
21
|
peerId: string;
|
|
22
22
|
label: TrackLabel;
|
|
23
23
|
};
|
|
24
|
+
export declare type ConsumerData = {
|
|
25
|
+
producerData: ProducerData;
|
|
26
|
+
peerId: string;
|
|
27
|
+
appId: string;
|
|
28
|
+
channelId: string;
|
|
29
|
+
};
|
|
24
30
|
export declare type Role = 'audience' | 'host';
|
|
25
31
|
export declare type PeerResponse = {
|
|
26
32
|
id: string;
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@livedigital/client",
|
|
3
3
|
"author": "vlprojects",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "2.
|
|
5
|
+
"version": "2.1.1",
|
|
6
6
|
"private": false,
|
|
7
7
|
"bugs": {
|
|
8
8
|
"url": "https://github.com/vlprojects/livedigital-sdk/issues"
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"axios": "^0.21.4",
|
|
45
45
|
"debug": "^4.3.1",
|
|
46
|
-
"mediasoup-client": "^3.6.
|
|
46
|
+
"mediasoup-client": "^3.6.50",
|
|
47
47
|
"qs": "^6.9.6",
|
|
48
48
|
"serialize-error": "^7.0.1",
|
|
49
49
|
"socket.io-client": "^4.3.0"
|
package/src/engine/Peer.ts
CHANGED
|
@@ -14,21 +14,20 @@ import {
|
|
|
14
14
|
ChangePreferredLayersPayload,
|
|
15
15
|
Role,
|
|
16
16
|
} from '../types/common';
|
|
17
|
-
import Consumer from './media/Consumer';
|
|
18
|
-
import VideoConsumer from './media/VideoConsumer';
|
|
19
17
|
import EnhancedEventEmitter from '../EnhancedEventEmitter';
|
|
20
18
|
import Engine from './index';
|
|
21
19
|
import { MEDIASOUP_EVENTS, PEER_EVENTS } from '../constants/events';
|
|
22
20
|
import Logger from './Logger';
|
|
23
21
|
import PeerProducer from './PeerProducer';
|
|
22
|
+
import PeerConsumer from './PeerConsumer';
|
|
24
23
|
|
|
25
24
|
interface PeerConstructor {
|
|
26
25
|
id: string;
|
|
27
26
|
channelIds: string[];
|
|
28
27
|
appId: string;
|
|
29
28
|
producers: ProducerData[],
|
|
30
|
-
videoConsumer?:
|
|
31
|
-
audioConsumer?:
|
|
29
|
+
videoConsumer?: PeerConsumer;
|
|
30
|
+
audioConsumer?: PeerConsumer;
|
|
32
31
|
engine: Engine;
|
|
33
32
|
soundLevel?: number;
|
|
34
33
|
loginDate: Date;
|
|
@@ -60,7 +59,7 @@ class Peer {
|
|
|
60
59
|
|
|
61
60
|
private producers: Map<string, PeerProducer> = new Map();
|
|
62
61
|
|
|
63
|
-
private consumers: Map<string,
|
|
62
|
+
private consumers: Map<string, PeerConsumer> = new Map();
|
|
64
63
|
|
|
65
64
|
private readonly engine: Engine;
|
|
66
65
|
|
|
@@ -130,7 +129,7 @@ class Peer {
|
|
|
130
129
|
|
|
131
130
|
public async setMinResolution(consumerId: string): Promise<void> {
|
|
132
131
|
const consumer = this.consumers.get(consumerId);
|
|
133
|
-
if (!
|
|
132
|
+
if (!consumer?.isVideo || consumer.spatialLayers === 0) {
|
|
134
133
|
return;
|
|
135
134
|
}
|
|
136
135
|
|
|
@@ -139,7 +138,7 @@ class Peer {
|
|
|
139
138
|
|
|
140
139
|
public async setMediumResolution(consumerId: string): Promise<void> {
|
|
141
140
|
const consumer = this.consumers.get(consumerId);
|
|
142
|
-
if (!
|
|
141
|
+
if (!consumer?.isVideo || consumer.spatialLayers === 0) {
|
|
143
142
|
return;
|
|
144
143
|
}
|
|
145
144
|
|
|
@@ -151,7 +150,7 @@ class Peer {
|
|
|
151
150
|
|
|
152
151
|
public async setMaxResolution(consumerId: string): Promise<void> {
|
|
153
152
|
const consumer = this.consumers.get(consumerId);
|
|
154
|
-
if (!
|
|
153
|
+
if (!consumer?.isVideo || consumer.spatialLayers === 0) {
|
|
155
154
|
return;
|
|
156
155
|
}
|
|
157
156
|
|
|
@@ -250,13 +249,7 @@ class Peer {
|
|
|
250
249
|
const consumer = await transport.consume(remoteConsumer);
|
|
251
250
|
await this.engine.network.socket.request(MEDIASOUP_EVENTS.resumeConsumer, { consumerId: consumer.id });
|
|
252
251
|
|
|
253
|
-
|
|
254
|
-
this.consumers.set(consumer.id, new Consumer(consumer));
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
if (producer.kind === 'video') {
|
|
258
|
-
this.consumers.set(consumer.id, new VideoConsumer(consumer));
|
|
259
|
-
}
|
|
252
|
+
this.consumers.set(consumer.id, new PeerConsumer(consumer));
|
|
260
253
|
|
|
261
254
|
this.logger.debug(`Subscribed for ${producer.kind}`, { peer: this });
|
|
262
255
|
this.observer.safeEmit(PEER_EVENTS.trackStart, {
|
|
@@ -272,7 +265,7 @@ class Peer {
|
|
|
272
265
|
}
|
|
273
266
|
|
|
274
267
|
private async changeConsumerPreferredLayers(
|
|
275
|
-
consumer:
|
|
268
|
+
consumer: PeerConsumer,
|
|
276
269
|
{ spatialLayer, temporalLayer }: PreferredLayersParams,
|
|
277
270
|
): Promise<void> {
|
|
278
271
|
try {
|
|
@@ -448,7 +441,7 @@ class Peer {
|
|
|
448
441
|
|
|
449
442
|
this.observer.on(MEDIASOUP_EVENTS.consumerChangePreferredLayers, (payload: ChangePreferredLayersPayload) => {
|
|
450
443
|
const consumer = this.consumers.get(payload.consumerId);
|
|
451
|
-
if (consumer
|
|
444
|
+
if (consumer?.isVideo) {
|
|
452
445
|
consumer.setCurrentTemporalLayer(payload.temporalLayer);
|
|
453
446
|
consumer.setCurrentSpatialLayer(payload.spatialLayer);
|
|
454
447
|
}
|
|
@@ -476,7 +469,7 @@ class Peer {
|
|
|
476
469
|
return ConnectionQuality.GOOD;
|
|
477
470
|
}
|
|
478
471
|
|
|
479
|
-
public getAllConsumers():
|
|
472
|
+
public getAllConsumers(): PeerConsumer[] {
|
|
480
473
|
return Array.from(this.consumers.values());
|
|
481
474
|
}
|
|
482
475
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { parseScalabilityMode } from 'mediasoup-client';
|
|
2
|
+
import { MediaKind } from 'mediasoup-client/lib/RtpParameters';
|
|
3
|
+
import { Consumer as MediasoupConsumer } from 'mediasoup-client/lib/types';
|
|
4
|
+
import { ConsumerData } from '../types/common';
|
|
5
|
+
import Logger from './Logger';
|
|
6
|
+
|
|
7
|
+
class PeerConsumer {
|
|
8
|
+
public score = 10;
|
|
9
|
+
|
|
10
|
+
public producerScore = 10;
|
|
11
|
+
|
|
12
|
+
public spatialLayers = 0;
|
|
13
|
+
|
|
14
|
+
public temporalLayers = 0;
|
|
15
|
+
|
|
16
|
+
public currentSpatialLayer = 0;
|
|
17
|
+
|
|
18
|
+
public currentTemporalLayer = 0;
|
|
19
|
+
|
|
20
|
+
readonly id: string;
|
|
21
|
+
|
|
22
|
+
readonly kind: MediaKind;
|
|
23
|
+
|
|
24
|
+
readonly producerId: string;
|
|
25
|
+
|
|
26
|
+
readonly appData: ConsumerData;
|
|
27
|
+
|
|
28
|
+
private readonly consumer: MediasoupConsumer;
|
|
29
|
+
|
|
30
|
+
private readonly logger: Logger;
|
|
31
|
+
|
|
32
|
+
constructor(consumer: MediasoupConsumer) {
|
|
33
|
+
this.id = consumer.id;
|
|
34
|
+
this.kind = consumer.kind as MediaKind;
|
|
35
|
+
this.producerId = consumer.producerId;
|
|
36
|
+
this.appData = consumer.appData as ConsumerData;
|
|
37
|
+
this.consumer = consumer;
|
|
38
|
+
this.logger = new Logger('PeerConsumer');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
get paused() {
|
|
42
|
+
return this.consumer.paused;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
pause() {
|
|
46
|
+
return this.consumer.pause();
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
resume() {
|
|
50
|
+
return this.consumer.resume();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
close() {
|
|
54
|
+
return this.consumer.close();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
get isVideo(): boolean {
|
|
58
|
+
return this.kind === 'video';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
get isAudio(): boolean {
|
|
62
|
+
return this.kind === 'audio';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
parseScalabilityMode(): void {
|
|
66
|
+
if (this.consumer.rtpParameters.encodings) {
|
|
67
|
+
const { scalabilityMode } = this.consumer.rtpParameters.encodings[0];
|
|
68
|
+
const { spatialLayers, temporalLayers } = parseScalabilityMode(scalabilityMode);
|
|
69
|
+
this.spatialLayers = spatialLayers;
|
|
70
|
+
this.temporalLayers = temporalLayers;
|
|
71
|
+
this.logger.debug('parseScalabilityMode()', {
|
|
72
|
+
scalabilityMode,
|
|
73
|
+
spatialLayers,
|
|
74
|
+
temporalLayers,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
setCurrentSpatialLayer(currentSpatialLayer: number): void {
|
|
80
|
+
if (this.kind !== 'video') {
|
|
81
|
+
throw new Error('setCurrentSpatialLayer applies to video consumers only');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
this.currentSpatialLayer = currentSpatialLayer;
|
|
85
|
+
this.logger.debug('setCurrentSpatialLayer()', { currentSpatialLayer });
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
setCurrentTemporalLayer(currentTemporalLayer: number): void {
|
|
89
|
+
if (this.kind !== 'video') {
|
|
90
|
+
throw new Error('setCurrentTemporalLayer applies to video consumers only');
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this.currentTemporalLayer = currentTemporalLayer;
|
|
94
|
+
this.logger.debug('setCurrentTemporalLayer()', { currentTemporalLayer });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export default PeerConsumer;
|
|
@@ -135,7 +135,7 @@ class Network {
|
|
|
135
135
|
}
|
|
136
136
|
});
|
|
137
137
|
|
|
138
|
-
this.sendTransport.
|
|
138
|
+
this.sendTransport.on(MEDIASOUP_EVENTS.transportStateChange, (state: RTCPeerConnectionState) => {
|
|
139
139
|
this.logger.debug('sendTransport.state', { state });
|
|
140
140
|
if (state === 'failed') {
|
|
141
141
|
if (this.sendTransport) {
|
|
@@ -178,7 +178,7 @@ class Network {
|
|
|
178
178
|
}
|
|
179
179
|
});
|
|
180
180
|
|
|
181
|
-
this.receiveTransport.
|
|
181
|
+
this.receiveTransport.on(MEDIASOUP_EVENTS.transportStateChange, (state: RTCPeerConnectionState) => {
|
|
182
182
|
this.logger.debug('receiveTransport.state', { state });
|
|
183
183
|
if (state === 'failed') {
|
|
184
184
|
if (this.receiveTransport) {
|
package/src/types/common.ts
CHANGED
|
@@ -30,6 +30,13 @@ export type ProducerData = {
|
|
|
30
30
|
label: TrackLabel,
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
export type ConsumerData = {
|
|
34
|
+
producerData: ProducerData,
|
|
35
|
+
peerId: string,
|
|
36
|
+
appId: string,
|
|
37
|
+
channelId: string,
|
|
38
|
+
};
|
|
39
|
+
|
|
33
40
|
export type Role = 'audience' | 'host';
|
|
34
41
|
|
|
35
42
|
export type PeerResponse = {
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Consumer as MediasoupConsumer } from 'mediasoup-client/lib/types';
|
|
2
|
-
import Consumer from './Consumer';
|
|
3
|
-
declare class VideoConsumer extends Consumer {
|
|
4
|
-
spatialLayers: number;
|
|
5
|
-
temporalLayers: number;
|
|
6
|
-
currentSpatialLayer: number;
|
|
7
|
-
currentTemporalLayer: number;
|
|
8
|
-
private readonly logger;
|
|
9
|
-
constructor(consumer: MediasoupConsumer);
|
|
10
|
-
parseScalabilityMode(): void;
|
|
11
|
-
setCurrentSpatialLayer(currentSpatialLayer: number): void;
|
|
12
|
-
setCurrentTemporalLayer(currentTemporalLayer: number): void;
|
|
13
|
-
}
|
|
14
|
-
export default VideoConsumer;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { Consumer as MediasoupConsumer } from 'mediasoup-client/lib/types';
|
|
2
|
-
import { parseScalabilityMode } from 'mediasoup-client';
|
|
3
|
-
import Consumer from './Consumer';
|
|
4
|
-
import Logger from '../Logger';
|
|
5
|
-
|
|
6
|
-
class VideoConsumer extends Consumer {
|
|
7
|
-
public spatialLayers = 0;
|
|
8
|
-
|
|
9
|
-
public temporalLayers = 0;
|
|
10
|
-
|
|
11
|
-
public currentSpatialLayer = 0;
|
|
12
|
-
|
|
13
|
-
public currentTemporalLayer = 0;
|
|
14
|
-
|
|
15
|
-
private readonly logger: Logger;
|
|
16
|
-
|
|
17
|
-
constructor(consumer: MediasoupConsumer) {
|
|
18
|
-
super(consumer);
|
|
19
|
-
this.logger = new Logger('VideoConsumer');
|
|
20
|
-
this.parseScalabilityMode();
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
parseScalabilityMode(): void {
|
|
24
|
-
if (this.rtpParameters.encodings) {
|
|
25
|
-
const { scalabilityMode } = this.rtpParameters.encodings[0];
|
|
26
|
-
const { spatialLayers, temporalLayers } = parseScalabilityMode(scalabilityMode);
|
|
27
|
-
this.spatialLayers = spatialLayers;
|
|
28
|
-
this.temporalLayers = temporalLayers;
|
|
29
|
-
this.logger.debug('parseScalabilityMode()', {
|
|
30
|
-
scalabilityMode,
|
|
31
|
-
spatialLayers,
|
|
32
|
-
temporalLayers,
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
setCurrentSpatialLayer(currentSpatialLayer: number): void {
|
|
38
|
-
this.currentSpatialLayer = currentSpatialLayer;
|
|
39
|
-
this.logger.debug('setCurrentSpatialLayer()', { currentSpatialLayer });
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
setCurrentTemporalLayer(currentTemporalLayer: number): void {
|
|
43
|
-
this.currentTemporalLayer = currentTemporalLayer;
|
|
44
|
-
this.logger.debug('setCurrentTemporalLayer()', { currentTemporalLayer });
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export default VideoConsumer;
|