@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.
@@ -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.0.0",
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.42",
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"
@@ -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?: VideoConsumer;
31
- audioConsumer?: Consumer;
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, Consumer | VideoConsumer> = new Map();
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 (!(consumer instanceof VideoConsumer) || consumer.spatialLayers === 0) {
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 (!(consumer instanceof VideoConsumer) || consumer.spatialLayers === 0) {
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 (!(consumer instanceof VideoConsumer) || consumer.spatialLayers === 0) {
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
- if (producer.kind === 'audio') {
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: VideoConsumer,
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 instanceof VideoConsumer) {
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(): Consumer[] {
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.observer.on(MEDIASOUP_EVENTS.transportStateChange, (state: RTCPeerConnectionState) => {
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.observer.on(MEDIASOUP_EVENTS.transportStateChange, (state: RTCPeerConnectionState) => {
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) {
@@ -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,6 +0,0 @@
1
- import { Consumer as MediasoupConsumer } from 'mediasoup-client/lib/types';
2
- declare class Consumer extends MediasoupConsumer {
3
- score: number;
4
- producerScore: number;
5
- }
6
- export default Consumer;
@@ -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,9 +0,0 @@
1
- import { Consumer as MediasoupConsumer } from 'mediasoup-client/lib/types';
2
-
3
- class Consumer extends MediasoupConsumer {
4
- public score = 10;
5
-
6
- public producerScore = 10;
7
- }
8
-
9
- export default Consumer;
@@ -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;