@livedigital/client 2.12.0 → 2.14.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.
Files changed (39) hide show
  1. package/dist/constants/common.d.ts +11 -0
  2. package/dist/engine/DefaultEngineDependenciesFactory.d.ts +3 -4
  3. package/dist/engine/Logger.d.ts +10 -3
  4. package/dist/engine/PeerConsumer.d.ts +6 -2
  5. package/dist/engine/handlers/MediaSoupEventHandler.d.ts +2 -0
  6. package/dist/engine/index.d.ts +10 -4
  7. package/dist/engine/media/index.d.ts +2 -0
  8. package/dist/engine/media/tracks/BaseTrack.d.ts +6 -2
  9. package/dist/engine/network/Socket.d.ts +5 -2
  10. package/dist/engine/network/index.d.ts +2 -0
  11. package/dist/engine/system/index.d.ts +2 -4
  12. package/dist/engine/wid/types.d.ts +1 -1
  13. package/dist/helpers/retry.d.ts +2 -0
  14. package/dist/index.d.ts +4 -1
  15. package/dist/index.es.js +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/types/common.d.ts +1 -0
  18. package/dist/types/engine.d.ts +15 -5
  19. package/package.json +2 -1
  20. package/src/constants/common.ts +13 -0
  21. package/src/engine/DefaultEngineDependenciesFactory.ts +18 -13
  22. package/src/engine/Logger.ts +43 -17
  23. package/src/engine/Peer.ts +10 -4
  24. package/src/engine/PeerConsumer.ts +12 -3
  25. package/src/engine/handlers/ChannelEventHandler.ts +4 -1
  26. package/src/engine/handlers/MediaSoupEventHandler.ts +42 -27
  27. package/src/engine/index.ts +43 -9
  28. package/src/engine/media/index.ts +17 -4
  29. package/src/engine/media/tracks/BaseTrack.ts +13 -3
  30. package/src/engine/media/tracks/PeerTrack.ts +5 -1
  31. package/src/engine/network/Socket.ts +10 -3
  32. package/src/engine/network/index.ts +6 -2
  33. package/src/engine/system/index.ts +7 -7
  34. package/src/engine/wid/WebRTCIssueDetector.ts +2 -2
  35. package/src/engine/wid/types.ts +1 -1
  36. package/src/helpers/retry.ts +4 -2
  37. package/src/index.ts +14 -1
  38. package/src/types/common.ts +2 -0
  39. package/src/types/engine.ts +18 -5
@@ -203,3 +203,4 @@ export declare type RemoteConsumerOptions = ConsumerOptions & {
203
203
  producerPaused: boolean;
204
204
  };
205
205
  export declare type LogMessageHandler = (msg: any, ...meta: any) => void;
206
+ export declare type LogLevel = 3 | 4 | 6 | 7;
@@ -7,17 +7,27 @@ import ChannelEventHandler from '../engine/handlers/ChannelEventHandler';
7
7
  import MediaSoupEventHandler from '../engine/handlers/MediaSoupEventHandler';
8
8
  import WebRTCIssueDetector from '../engine/wid/WebRTCIssueDetector';
9
9
  import { LoadBalancerApiClientParams } from '../engine/network/LoadBalancerClient';
10
- import Logger from '../engine/Logger';
10
+ import { IssueDetectorResult } from '../engine/wid/types';
11
+ import { LogLevel } from './common';
12
+ export declare type IssuesHandler = (issues: IssueDetectorResult) => void;
11
13
  export interface CreateIssueDetectorParams {
12
- logger: Logger;
14
+ onIssues?: IssuesHandler;
15
+ }
16
+ export interface CreateMediaParams {
17
+ logLevel: LogLevel;
13
18
  }
14
19
  export interface CreateNetworkParams {
20
+ logLevel: LogLevel;
15
21
  loadbalancer: LoadBalancerApiClientParams;
16
22
  }
23
+ export interface CreateSystemParams {
24
+ logLevel: LogLevel;
25
+ clientEventEmitter: EnhancedEventEmitter;
26
+ }
17
27
  export interface EngineDependenciesFactory {
18
- createSystem: (clientEventEmitter: EnhancedEventEmitter) => System;
19
- createMedia: () => Media;
20
- createNetwork: (networkParams: CreateNetworkParams) => Network;
28
+ createSystem: (params: CreateSystemParams) => System;
29
+ createMedia: (params: CreateMediaParams) => Media;
30
+ createNetwork: (params: CreateNetworkParams) => Network;
21
31
  createChannelEventHandler: (engine: Engine) => ChannelEventHandler;
22
32
  createMediaSoupEventHandler: (engine: Engine) => MediaSoupEventHandler;
23
33
  createIssueDetector: (params: CreateIssueDetectorParams) => WebRTCIssueDetector;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@livedigital/client",
3
3
  "author": "vlprojects",
4
4
  "license": "MIT",
5
- "version": "2.12.0",
5
+ "version": "2.14.1",
6
6
  "private": false,
7
7
  "bugs": {
8
8
  "url": "https://github.com/vlprojects/livedigital-sdk/issues"
@@ -41,6 +41,7 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@peermetrics/webrtc-stats": "^5.4.0",
44
+ "awaitqueue": "^2.4.0",
44
45
  "axios": "^0.21.4",
45
46
  "debug": "^4.3.1",
46
47
  "mediasoup-client": "^3.6.50",
@@ -0,0 +1,13 @@
1
+ import { LogLevel } from '../types/common';
2
+
3
+ export const LOG_LEVEL_ERROR: LogLevel = 3;
4
+ export const LOG_LEVEL_WARN: LogLevel = 4;
5
+ export const LOG_LEVEL_INFO: LogLevel = 6;
6
+ export const LOG_LEVEL_DEBUG: LogLevel = 7;
7
+
8
+ export const LogLevels = {
9
+ Error: LOG_LEVEL_ERROR,
10
+ Warn: LOG_LEVEL_WARN,
11
+ Info: LOG_LEVEL_INFO,
12
+ Debug: LOG_LEVEL_DEBUG,
13
+ };
@@ -1,4 +1,3 @@
1
- import EnhancedEventEmitter from '../EnhancedEventEmitter';
2
1
  import Network from './network';
3
2
  import System from './system';
4
3
  import Media from './media';
@@ -6,25 +5,35 @@ import ChannelEventHandler from './handlers/ChannelEventHandler';
6
5
  import Engine from './index';
7
6
  import MediaSoupEventHandler from './handlers/MediaSoupEventHandler';
8
7
  import WebRTCIssueDetector from './wid/WebRTCIssueDetector';
9
- import { CreateIssueDetectorParams, CreateNetworkParams, EngineDependenciesFactory } from '../types/engine';
8
+ import {
9
+ CreateIssueDetectorParams,
10
+ CreateMediaParams,
11
+ CreateNetworkParams,
12
+ CreateSystemParams,
13
+ EngineDependenciesFactory,
14
+ } from '../types/engine';
10
15
  import SocketIO from './network/Socket';
11
16
  import LoadBalancerApiClient from './network/LoadBalancerClient';
12
17
 
13
18
  /* eslint-disable class-methods-use-this */
14
19
  class DefaultEngineDependenciesFactory implements EngineDependenciesFactory {
15
- createSystem(clientEventEmitter: EnhancedEventEmitter): System {
16
- return new System({ clientEventEmitter });
20
+ createSystem(params: CreateSystemParams): System {
21
+ return new System(params);
17
22
  }
18
23
 
19
- createMedia(): Media {
20
- return new Media();
24
+ createMedia(params: CreateMediaParams): Media {
25
+ return new Media(params);
21
26
  }
22
27
 
23
28
  createNetwork(params: CreateNetworkParams): Network {
24
- const { loadbalancer } = params;
25
- const socketClient = new SocketIO();
29
+ const { loadbalancer, logLevel } = params;
30
+ const socketClient = new SocketIO({
31
+ logLevel,
32
+ });
33
+
26
34
  const loadBalancerApiClient = new LoadBalancerApiClient(loadbalancer);
27
35
  return new Network({
36
+ logLevel,
28
37
  socketClient,
29
38
  loadBalancerApiClient,
30
39
  });
@@ -40,11 +49,7 @@ class DefaultEngineDependenciesFactory implements EngineDependenciesFactory {
40
49
 
41
50
  createIssueDetector(params: CreateIssueDetectorParams): WebRTCIssueDetector {
42
51
  return new WebRTCIssueDetector({
43
- onIssue: (issues: any[]) => {
44
- issues.forEach((issue) => {
45
- params.logger.warn('webRtcIssueDetector', issue);
46
- });
47
- },
52
+ onIssues: params.onIssues,
48
53
  });
49
54
  }
50
55
  }
@@ -1,35 +1,48 @@
1
1
  import debug from 'debug';
2
- import { LogMessageHandler } from '../types/common';
2
+ import { LogLevels } from '../constants/common';
3
+ import { LogLevel, LogMessageHandler } from '../types/common';
3
4
 
4
5
  const APP_NAME = 'LiveDigital';
5
6
 
7
+ export type LoggerConstructorParams = {
8
+ namespace: string,
9
+ logLevel: LogLevel,
10
+ onLogMessage?: LogMessageHandler,
11
+ };
12
+
6
13
  class Logger {
7
14
  private readonly _debug: debug.Debugger;
8
15
 
16
+ private readonly _info: debug.Debugger;
17
+
9
18
  private readonly _warn: debug.Debugger;
10
19
 
11
20
  private readonly _error: debug.Debugger;
12
21
 
13
- private readonly onLogMessage: LogMessageHandler;
14
-
15
- constructor(prefix?: string, onLogMessage?: LogMessageHandler) {
16
- if (prefix) {
17
- this._debug = debug(`${APP_NAME}:${prefix}`);
18
- this._warn = debug(`${APP_NAME}:WARN:${prefix}`);
19
- this._error = debug(`${APP_NAME}:ERROR:${prefix}`);
20
- } else {
21
- this._debug = debug(APP_NAME);
22
- this._warn = debug(`${APP_NAME}:WARN`);
23
- this._error = debug(`${APP_NAME}:ERROR`);
24
- }
22
+ #namespace: string;
23
+
24
+ #logLevel: LogLevel;
25
+
26
+ #onLogMessage: LogMessageHandler;
27
+
28
+ constructor(params: LoggerConstructorParams) {
29
+ const { logLevel, namespace, onLogMessage } = params;
30
+ this.#namespace = namespace;
31
+ this.#logLevel = logLevel;
32
+
33
+ this._debug = debug(APP_NAME).extend('debug').extend(this.#namespace);
34
+ this._info = debug(APP_NAME).extend('info').extend(this.#namespace);
35
+ this._warn = debug(APP_NAME).extend('warn').extend(this.#namespace);
36
+ this._error = debug(APP_NAME).extend('error').extend(this.#namespace);
25
37
 
26
38
  /* eslint-disable no-console */
27
39
  this._debug.log = console.info.bind(console);
40
+ this._info.log = console.info.bind(console);
28
41
  this._warn.log = console.warn.bind(console);
29
42
  this._error.log = console.error.bind(console);
30
43
  /* eslint-enable no-console */
31
44
 
32
- this.onLogMessage = (msg: any, ...meta: any[]) => {
45
+ this.#onLogMessage = (msg: any, ...meta: any[]) => {
33
46
  if (typeof onLogMessage === 'function') {
34
47
  onLogMessage(msg, ...meta);
35
48
  }
@@ -38,17 +51,30 @@ class Logger {
38
51
 
39
52
  debug(msg: any, ...meta: any[]): void {
40
53
  this._debug(msg, ...meta);
41
- this.onLogMessage(msg, ...meta);
54
+ if (this.#logLevel >= LogLevels.Debug) {
55
+ this.#onLogMessage(msg, ...meta);
56
+ }
57
+ }
58
+
59
+ info(msg: any, ...meta: any[]): void {
60
+ this._debug(msg, ...meta);
61
+ if (this.#logLevel >= LogLevels.Info) {
62
+ this.#onLogMessage(msg, ...meta);
63
+ }
42
64
  }
43
65
 
44
66
  warn(msg: any, ...meta: any[]): void {
45
67
  this._warn(msg, ...meta);
46
- this.onLogMessage(msg, ...meta);
68
+ if (this.#logLevel >= LogLevels.Warn) {
69
+ this.#onLogMessage(msg, ...meta);
70
+ }
47
71
  }
48
72
 
49
73
  error(msg: any, ...meta: any[]): void {
50
74
  this._error(msg, ...meta);
51
- this.onLogMessage(msg, ...meta);
75
+ if (this.#logLevel >= LogLevels.Error) {
76
+ this.#onLogMessage(msg, ...meta);
77
+ }
52
78
  }
53
79
  }
54
80
 
@@ -89,7 +89,10 @@ class Peer {
89
89
  this.uid = uid;
90
90
  this.role = role;
91
91
  this.engine = engine;
92
- this.logger = new Logger('Peer');
92
+ this.logger = new Logger({
93
+ logLevel: engine.logLevel,
94
+ namespace: 'Peer',
95
+ });
93
96
  producers.forEach(this.handleNewProducer.bind(this));
94
97
  this.handlePeerEvents();
95
98
  }
@@ -155,7 +158,10 @@ class Peer {
155
158
  const track = new PeerTrack({
156
159
  mediaStreamTrack: consumer.track,
157
160
  label: producer.label,
158
- consumer: new PeerConsumer(consumer),
161
+ consumer: new PeerConsumer({
162
+ consumer,
163
+ logLevel: this.engine.logLevel,
164
+ }),
159
165
  engine: this.engine,
160
166
  isPaused: remoteConsumer.producerPaused,
161
167
  peerEventEmitter: this.observer,
@@ -231,7 +237,7 @@ class Peer {
231
237
  }
232
238
 
233
239
  const consumer = this.getConsumerById(payload.consumerId);
234
- if (!consumer) {
240
+ if (!consumer || consumer.paused) {
235
241
  return;
236
242
  }
237
243
 
@@ -255,7 +261,7 @@ class Peer {
255
261
  // pick scores of low quality consumers (consumerScore < producerScore)
256
262
  this.engine.peers.forEach((peer) => {
257
263
  peer.getAllConsumers().forEach((item) => {
258
- if (item.score < item.producerScore) {
264
+ if ((item.score < item.producerScore) && !item.paused) {
259
265
  allPeersLowQualityConsumersScores.push(item.score);
260
266
  }
261
267
  });
@@ -1,9 +1,14 @@
1
1
  import { parseScalabilityMode } from 'mediasoup-client';
2
2
  import { MediaKind, RtpEncodingParameters } from 'mediasoup-client/lib/RtpParameters';
3
3
  import { Consumer as MediasoupConsumer } from 'mediasoup-client/lib/types';
4
- import { ConsumerData, SpatialLayerParams } from '../types/common';
4
+ import { ConsumerData, LogLevel, SpatialLayerParams } from '../types/common';
5
5
  import Logger from './Logger';
6
6
 
7
+ export type PeerConsumerConstructorParams = {
8
+ consumer: MediasoupConsumer,
9
+ logLevel: LogLevel,
10
+ };
11
+
7
12
  class PeerConsumer {
8
13
  public score = 10;
9
14
 
@@ -37,13 +42,17 @@ class PeerConsumer {
37
42
 
38
43
  private readonly logger: Logger;
39
44
 
40
- constructor(consumer: MediasoupConsumer) {
45
+ constructor(params: PeerConsumerConstructorParams) {
46
+ const { logLevel, consumer } = params;
41
47
  this.id = consumer.id;
42
48
  this.kind = consumer.kind as MediaKind;
43
49
  this.producerId = consumer.producerId;
44
50
  this.appData = consumer.appData as ConsumerData;
45
51
  this.consumer = consumer;
46
- this.logger = new Logger('PeerConsumer');
52
+ this.logger = new Logger({
53
+ logLevel,
54
+ namespace: 'PeerConsumer',
55
+ });
47
56
  this.currentMaxSpatialLayer = this.appData.producerData.maxSpatialLayer;
48
57
  this.parseScalabilityMode();
49
58
  this.setSpatialLayersParams();
@@ -10,7 +10,10 @@ class ChannelEventHandler {
10
10
 
11
11
  constructor(engine: Engine) {
12
12
  this.engine = engine;
13
- this.logger = new Logger('ChannelEvents');
13
+ this.logger = new Logger({
14
+ logLevel: engine.logLevel,
15
+ namespace: 'ChannelEvents',
16
+ });
14
17
  }
15
18
 
16
19
  public subscribeToEvents(): void {
@@ -1,3 +1,4 @@
1
+ import { AwaitQueue } from 'awaitqueue';
1
2
  import {
2
3
  ChangePreferredLayersParams,
3
4
  ConsumerScoreChangedPayload,
@@ -15,9 +16,14 @@ class MediaSoupEventHandler {
15
16
 
16
17
  private readonly logger: Logger;
17
18
 
19
+ private readonly queue = new AwaitQueue();
20
+
18
21
  constructor(engine: Engine) {
19
22
  this.engine = engine;
20
- this.logger = new Logger('MediasoupEvents');
23
+ this.logger = new Logger({
24
+ logLevel: engine.logLevel,
25
+ namespace: 'MediasoupEvents',
26
+ });
21
27
  }
22
28
 
23
29
  public subscribeToEvents(): void {
@@ -115,32 +121,9 @@ class MediaSoupEventHandler {
115
121
  producerId,
116
122
  spatialLayer,
117
123
  }: ProducerRequestMaxSpatialLayer) => {
118
- const track = this.engine.media.getAllTracks().find((t) => t.getProducer()?.id === producerId);
119
- if (!track) {
120
- this.logger.warn('producerRequestMaxSpatialLayer()', { message: 'Producer not found' });
121
- return;
122
- }
123
-
124
- if (!(track instanceof VideoTrack)) {
125
- this.logger.warn('producerRequestMaxSpatialLayer()', { message: 'Wrong producer kind' });
126
- return;
127
- }
128
-
129
- const currentMaxSpatialLayer = track.getMaxSpatialLayer();
130
- if (currentMaxSpatialLayer === spatialLayer) {
131
- this.logger.debug('producerRequestMaxSpatialLayer()', {
132
- message: 'Skip set max spatial layer',
133
- requestedSpatialLayer: spatialLayer,
134
- currentMaxSpatialLayer,
135
- });
136
- return;
137
- }
138
-
139
- await track.setMaxSpatialLayer(spatialLayer);
140
- await this.engine.network.socket.request(MEDIASOUP_EVENTS.producerSetMaxSpatialLayer, {
141
- producerId,
142
- maxSpatialLayer: spatialLayer,
143
- });
124
+ await this.queue.push(async () => {
125
+ await this.handleProducerSetMaxSpatialLayer({ producerId, spatialLayer });
126
+ }, MEDIASOUP_EVENTS.producerRequestMaxSpatialLayer);
144
127
  });
145
128
 
146
129
  connection.on(MEDIASOUP_EVENTS.producerSetMaxSpatialLayer, async ({
@@ -156,6 +139,38 @@ class MediaSoupEventHandler {
156
139
  peer.observer.safeEmit(MEDIASOUP_EVENTS.producerSetMaxSpatialLayer, { peerId, producerId, spatialLayer });
157
140
  });
158
141
  }
142
+
143
+ private async handleProducerSetMaxSpatialLayer({
144
+ producerId,
145
+ spatialLayer,
146
+ }: ProducerRequestMaxSpatialLayer): Promise<void> {
147
+ const track = this.engine.media.getAllTracks().find((t) => t.getProducer()?.id === producerId);
148
+ if (!track) {
149
+ this.logger.warn('producerRequestMaxSpatialLayer()', { message: 'Producer not found' });
150
+ return;
151
+ }
152
+
153
+ if (!(track instanceof VideoTrack)) {
154
+ this.logger.warn('producerRequestMaxSpatialLayer()', { message: 'Wrong producer kind' });
155
+ return;
156
+ }
157
+
158
+ const currentMaxSpatialLayer = track.getMaxSpatialLayer();
159
+ if (currentMaxSpatialLayer === spatialLayer) {
160
+ this.logger.debug('producerRequestMaxSpatialLayer()', {
161
+ message: 'Skip set max spatial layer',
162
+ requestedSpatialLayer: spatialLayer,
163
+ currentMaxSpatialLayer,
164
+ });
165
+ return;
166
+ }
167
+
168
+ await track.setMaxSpatialLayer(spatialLayer);
169
+ await this.engine.network.socket.request(MEDIASOUP_EVENTS.producerSetMaxSpatialLayer, {
170
+ producerId,
171
+ maxSpatialLayer: spatialLayer,
172
+ });
173
+ }
159
174
  }
160
175
 
161
176
  export default MediaSoupEventHandler;
@@ -10,6 +10,7 @@ import {
10
10
  Track,
11
11
  TrackLabel,
12
12
  LogMessageHandler,
13
+ LogLevel,
13
14
  } from '../types/common';
14
15
  import EnhancedEventEmitter from '../EnhancedEventEmitter';
15
16
  import System from './system';
@@ -28,13 +29,19 @@ import AudioTrack from './media/tracks/AudioTrack';
28
29
  import PeerTrack from './media/tracks/PeerTrack';
29
30
  import WebRTCIssueDetector from './wid/WebRTCIssueDetector';
30
31
  import { retryAsync } from '../helpers/retry';
31
- import { CreateNetworkParams, EngineDependenciesFactory } from '../types/engine';
32
+ import { EngineDependenciesFactory, IssuesHandler } from '../types/engine';
33
+ import { LogLevels } from '../constants/common';
34
+ import { LoadBalancerApiClientParams } from './network/LoadBalancerClient';
32
35
 
33
36
  type EngineParams = {
34
37
  clientEventEmitter: EnhancedEventEmitter,
35
- network: CreateNetworkParams,
36
- onLogMessage?: LogMessageHandler;
38
+ network: {
39
+ loadbalancer: LoadBalancerApiClientParams;
40
+ },
37
41
  dependenciesFactory: EngineDependenciesFactory;
42
+ logLevel?: LogLevel;
43
+ onLogMessage?: LogMessageHandler;
44
+ onIssues?: IssuesHandler;
38
45
  };
39
46
 
40
47
  class Engine {
@@ -46,6 +53,8 @@ class Engine {
46
53
 
47
54
  public clientEventEmitter: EnhancedEventEmitter;
48
55
 
56
+ public logLevel: LogLevel;
57
+
49
58
  private readonly peersRepository: Map<string, Peer>;
50
59
 
51
60
  private channelEventsHandler: ChannelEventHandler;
@@ -71,16 +80,33 @@ class Engine {
71
80
  clientEventEmitter,
72
81
  network,
73
82
  dependenciesFactory,
83
+ logLevel,
74
84
  } = params;
75
- this.system = dependenciesFactory.createSystem(clientEventEmitter);
76
- this.media = dependenciesFactory.createMedia();
77
- this.network = dependenciesFactory.createNetwork(network);
85
+ this.logLevel = logLevel || LogLevels.Error;
86
+ this.system = dependenciesFactory.createSystem({
87
+ logLevel: this.logLevel,
88
+ clientEventEmitter,
89
+ });
90
+ this.media = dependenciesFactory.createMedia({
91
+ logLevel: this.logLevel,
92
+ });
93
+ this.network = dependenciesFactory.createNetwork({
94
+ logLevel: this.logLevel,
95
+ loadbalancer: network.loadbalancer,
96
+ });
78
97
  this.peersRepository = new Map<string, Peer>();
79
98
  this.clientEventEmitter = clientEventEmitter;
80
99
  this.channelEventsHandler = dependenciesFactory.createChannelEventHandler(this);
81
100
  this.mediaSoupEventsHandler = dependenciesFactory.createMediaSoupEventHandler(this);
82
- this.logger = new Logger('Engine', params.onLogMessage);
83
- this.webRtcIssueDetector = dependenciesFactory.createIssueDetector({ logger: this.logger });
101
+ this.logger = new Logger({
102
+ logLevel: this.logLevel,
103
+ namespace: 'Engine',
104
+ onLogMessage: params.onLogMessage,
105
+ });
106
+
107
+ this.webRtcIssueDetector = dependenciesFactory.createIssueDetector({
108
+ onIssues: params.onIssues,
109
+ });
84
110
 
85
111
  this.watchSocketState();
86
112
  }
@@ -329,7 +355,7 @@ class Engine {
329
355
  ? track.getCodecOptions()
330
356
  : undefined;
331
357
 
332
- const maxSpatialLayer = encodings && encodings.length >= 1 ? 1 : 0;
358
+ const maxSpatialLayer = 0;
333
359
  const appData = {
334
360
  peerId: this.mySocketId,
335
361
  label: track.getLabel(),
@@ -441,6 +467,10 @@ class Engine {
441
467
  minBackoffDelayMs: 150,
442
468
  maxBackoffDelayMs: 5_000,
443
469
  actionName: 'connectToSocketServer',
470
+ logger: new Logger({
471
+ namespace: 'RetrySocketConnect',
472
+ logLevel: this.logLevel,
473
+ }),
444
474
  });
445
475
  }
446
476
 
@@ -520,6 +550,10 @@ class Engine {
520
550
  maxRetries: 3,
521
551
  minBackoffDelayMs: 300,
522
552
  actionName: 'sendJoinChannelRequest',
553
+ logger: new Logger({
554
+ namespace: 'RetryJoin',
555
+ logLevel: this.logLevel,
556
+ }),
523
557
  });
524
558
  }
525
559
 
@@ -2,10 +2,13 @@ import { Device } from 'mediasoup-client';
2
2
  import { RtpCapabilities, RtpCodecCapability } from 'mediasoup-client/lib/RtpParameters';
3
3
  import VideoTrack from './tracks/VideoTrack';
4
4
  import AudioTrack from './tracks/AudioTrack';
5
- import { CreateScreenVideoTrackOptions, CreateVideoTrackParams, Track } from '../../types/common';
5
+ import {
6
+ CreateScreenVideoTrackOptions, CreateVideoTrackParams, LogLevel, Track,
7
+ } from '../../types/common';
6
8
  import Logger from '../Logger';
7
9
  import { VIDEO_CONSTRAINS } from '../../constants/videoConstrains';
8
10
  import { SCREEN_SHARING_SIMULCAST_ENCODINGS, WEBCAM_SIMULCAST_ENCODINGS } from '../../constants/simulcastEncodings';
11
+ import { CreateMediaParams } from '../../types/engine';
9
12
 
10
13
  class Media {
11
14
  public isDeviceLoaded = false;
@@ -14,7 +17,17 @@ class Media {
14
17
 
15
18
  private tracks: Map<string, Track> = new Map();
16
19
 
17
- #logger = new Logger('Media');
20
+ #logger: Logger;
21
+
22
+ #logLevel: LogLevel;
23
+
24
+ constructor(params: CreateMediaParams) {
25
+ this.#logLevel = params.logLevel;
26
+ this.#logger = new Logger({
27
+ namespace: 'Media',
28
+ logLevel: params.logLevel,
29
+ });
30
+ }
18
31
 
19
32
  get mediasoupDevice(): Device {
20
33
  if (!this.device) {
@@ -50,8 +63,8 @@ class Media {
50
63
  const mediaStreamTracks = stream.getTracks();
51
64
  return mediaStreamTracks.map((mediaStreamTrack) => {
52
65
  const track = mediaStreamTrack.kind === 'audio'
53
- ? new AudioTrack(mediaStreamTrack)
54
- : new VideoTrack(mediaStreamTrack);
66
+ ? new AudioTrack({ mediaStreamTrack, logLevel: this.#logLevel })
67
+ : new VideoTrack({ mediaStreamTrack, logLevel: this.#logLevel });
55
68
 
56
69
  this.tracks.set(track.id, track);
57
70
  this.#logger.debug('createTrack() track created', {
@@ -1,8 +1,13 @@
1
1
  import { Producer } from 'mediasoup-client/lib/Producer';
2
2
  import { MediaKind } from 'mediasoup-client/lib/RtpParameters';
3
- import { EncoderConfig, TrackLabel } from '../../../types/common';
3
+ import { EncoderConfig, LogLevel, TrackLabel } from '../../../types/common';
4
4
  import Logger from '../../Logger';
5
5
 
6
+ export type BaseTrackConstructorParams = {
7
+ mediaStreamTrack: MediaStreamTrack,
8
+ logLevel: LogLevel,
9
+ };
10
+
6
11
  class BaseTrack {
7
12
  readonly #mediaStreamTrack: MediaStreamTrack;
8
13
 
@@ -12,10 +17,15 @@ class BaseTrack {
12
17
 
13
18
  private label: TrackLabel = TrackLabel.Unknown;
14
19
 
15
- protected logger = new Logger('Track');
20
+ protected logger: Logger;
16
21
 
17
- constructor(mediaStreamTrack: MediaStreamTrack) {
22
+ constructor(params: BaseTrackConstructorParams) {
23
+ const { mediaStreamTrack, logLevel } = params;
18
24
  this.#mediaStreamTrack = mediaStreamTrack;
25
+ this.logger = new Logger({
26
+ namespace: 'Track',
27
+ logLevel,
28
+ });
19
29
  }
20
30
 
21
31
  get mediaStreamTrack(): MediaStreamTrack {
@@ -27,7 +27,7 @@ class PeerTrack {
27
27
 
28
28
  readonly #engine: Engine;
29
29
 
30
- readonly #logger = new Logger('PeerTrack');
30
+ readonly #logger: Logger;
31
31
 
32
32
  readonly #peerEventEmitter: EnhancedEventEmitter;
33
33
 
@@ -38,6 +38,10 @@ class PeerTrack {
38
38
  this.label = payload.label;
39
39
  this.consumer = payload.consumer;
40
40
  this.#engine = payload.engine;
41
+ this.#logger = new Logger({
42
+ logLevel: payload.engine.logLevel,
43
+ namespace: 'PeerTrack',
44
+ });
41
45
  this.#peerEventEmitter = payload.peerEventEmitter;
42
46
  this.#paused = payload.isPaused;
43
47
  this.#peerEventEmitter.safeEmit(PEER_EVENTS.trackStart, this);
@@ -1,9 +1,13 @@
1
1
  import { io, Socket } from 'socket.io-client';
2
2
  import EnhancedEventEmitter from '../../EnhancedEventEmitter';
3
3
  import { SocketIOEvents } from '../../constants/events';
4
- import { SocketResponse } from '../../types/common';
4
+ import { LogLevel, SocketResponse } from '../../types/common';
5
5
  import Logger from '../Logger';
6
6
 
7
+ export type SocketIOConstructorParams = {
8
+ logLevel: LogLevel,
9
+ };
10
+
7
11
  class SocketIO {
8
12
  public connection?: Socket;
9
13
 
@@ -29,8 +33,11 @@ class SocketIO {
29
33
  'transport error': 'transport.error',
30
34
  };
31
35
 
32
- constructor() {
33
- this.logger = new Logger('Socket');
36
+ constructor(params: SocketIOConstructorParams) {
37
+ this.logger = new Logger({
38
+ namespace: 'Socket',
39
+ logLevel: params.logLevel,
40
+ });
34
41
  }
35
42
 
36
43
  get observer(): EnhancedEventEmitter {