@livedigital/client 2.12.0 → 2.13.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 +11 -0
- package/dist/engine/DefaultEngineDependenciesFactory.d.ts +3 -4
- package/dist/engine/Logger.d.ts +10 -3
- package/dist/engine/PeerConsumer.d.ts +6 -2
- package/dist/engine/index.d.ts +10 -4
- package/dist/engine/media/index.d.ts +2 -0
- package/dist/engine/media/tracks/BaseTrack.d.ts +6 -2
- package/dist/engine/network/Socket.d.ts +5 -2
- package/dist/engine/network/index.d.ts +2 -0
- package/dist/engine/system/index.d.ts +2 -4
- package/dist/engine/wid/types.d.ts +1 -1
- package/dist/helpers/retry.d.ts +2 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.es.js +1 -1
- package/dist/index.js +1 -1
- package/dist/types/common.d.ts +1 -0
- package/dist/types/engine.d.ts +15 -5
- package/package.json +1 -1
- package/src/constants/common.ts +13 -0
- package/src/engine/DefaultEngineDependenciesFactory.ts +18 -13
- package/src/engine/Logger.ts +43 -17
- package/src/engine/Peer.ts +8 -2
- package/src/engine/PeerConsumer.ts +12 -3
- package/src/engine/handlers/ChannelEventHandler.ts +4 -1
- package/src/engine/handlers/MediaSoupEventHandler.ts +4 -1
- package/src/engine/index.ts +42 -8
- package/src/engine/media/index.ts +17 -4
- package/src/engine/media/tracks/BaseTrack.ts +13 -3
- package/src/engine/media/tracks/PeerTrack.ts +5 -1
- package/src/engine/network/Socket.ts +10 -3
- package/src/engine/network/index.ts +6 -2
- package/src/engine/system/index.ts +7 -7
- package/src/engine/wid/WebRTCIssueDetector.ts +2 -2
- package/src/engine/wid/types.ts +1 -1
- package/src/helpers/retry.ts +4 -2
- package/src/index.ts +14 -1
- package/src/types/common.ts +2 -0
- package/src/types/engine.ts +18 -5
package/dist/types/common.d.ts
CHANGED
package/dist/types/engine.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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: (
|
|
19
|
-
createMedia: () => Media;
|
|
20
|
-
createNetwork: (
|
|
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
|
@@ -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 {
|
|
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(
|
|
16
|
-
return new System(
|
|
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
|
-
|
|
44
|
-
issues.forEach((issue) => {
|
|
45
|
-
params.logger.warn('webRtcIssueDetector', issue);
|
|
46
|
-
});
|
|
47
|
-
},
|
|
52
|
+
onIssues: params.onIssues,
|
|
48
53
|
});
|
|
49
54
|
}
|
|
50
55
|
}
|
package/src/engine/Logger.ts
CHANGED
|
@@ -1,35 +1,48 @@
|
|
|
1
1
|
import debug from 'debug';
|
|
2
|
-
import {
|
|
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
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
75
|
+
if (this.#logLevel >= LogLevels.Error) {
|
|
76
|
+
this.#onLogMessage(msg, ...meta);
|
|
77
|
+
}
|
|
52
78
|
}
|
|
53
79
|
}
|
|
54
80
|
|
package/src/engine/Peer.ts
CHANGED
|
@@ -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(
|
|
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(
|
|
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,
|
|
@@ -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(
|
|
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(
|
|
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(
|
|
13
|
+
this.logger = new Logger({
|
|
14
|
+
logLevel: engine.logLevel,
|
|
15
|
+
namespace: 'ChannelEvents',
|
|
16
|
+
});
|
|
14
17
|
}
|
|
15
18
|
|
|
16
19
|
public subscribeToEvents(): void {
|
|
@@ -17,7 +17,10 @@ class MediaSoupEventHandler {
|
|
|
17
17
|
|
|
18
18
|
constructor(engine: Engine) {
|
|
19
19
|
this.engine = engine;
|
|
20
|
-
this.logger = new Logger(
|
|
20
|
+
this.logger = new Logger({
|
|
21
|
+
logLevel: engine.logLevel,
|
|
22
|
+
namespace: 'MediasoupEvents',
|
|
23
|
+
});
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
public subscribeToEvents(): void {
|
package/src/engine/index.ts
CHANGED
|
@@ -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 {
|
|
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:
|
|
36
|
-
|
|
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.
|
|
76
|
-
this.
|
|
77
|
-
|
|
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(
|
|
83
|
-
|
|
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
|
}
|
|
@@ -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 {
|
|
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
|
|
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
|
|
20
|
+
protected logger: Logger;
|
|
16
21
|
|
|
17
|
-
constructor(
|
|
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
|
|
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(
|
|
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 {
|
|
@@ -6,13 +6,14 @@ import {
|
|
|
6
6
|
} from 'mediasoup-client/lib/Transport';
|
|
7
7
|
import { Device } from 'mediasoup-client';
|
|
8
8
|
import SocketIO from './Socket';
|
|
9
|
-
import { ProduceParams } from '../../types/common';
|
|
9
|
+
import { LogLevel, ProduceParams } from '../../types/common';
|
|
10
10
|
import LoadBalancerApiClient from './LoadBalancerClient';
|
|
11
11
|
import { MEDIASOUP_EVENTS, MEDIASOUP_TRANSPORT_EVENTS } from '../../constants/events';
|
|
12
12
|
import Logger from '../Logger';
|
|
13
13
|
|
|
14
14
|
export type NetworkParams = {
|
|
15
15
|
socketClient: SocketIO;
|
|
16
|
+
logLevel: LogLevel,
|
|
16
17
|
loadBalancerApiClient: LoadBalancerApiClient;
|
|
17
18
|
};
|
|
18
19
|
|
|
@@ -31,7 +32,10 @@ class Network {
|
|
|
31
32
|
const { socketClient, loadBalancerApiClient } = params;
|
|
32
33
|
this.socket = socketClient;
|
|
33
34
|
this.loadBalancerClient = loadBalancerApiClient;
|
|
34
|
-
this.logger = new Logger(
|
|
35
|
+
this.logger = new Logger({
|
|
36
|
+
namespace: 'Network',
|
|
37
|
+
logLevel: params.logLevel,
|
|
38
|
+
});
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
async closeRemoteProducer(producerId: string): Promise<void> {
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
+
import { CreateSystemParams } from '../../types/engine';
|
|
1
2
|
import { CLIENT_EVENTS } from '../../constants/events';
|
|
2
3
|
import EnhancedEventEmitter from '../../EnhancedEventEmitter';
|
|
3
4
|
import { AvailableMediaDevices } from '../../types/common';
|
|
4
5
|
import Logger from '../Logger';
|
|
5
6
|
|
|
6
|
-
type SystemParams = {
|
|
7
|
-
clientEventEmitter: EnhancedEventEmitter,
|
|
8
|
-
};
|
|
9
|
-
|
|
10
7
|
class System {
|
|
11
8
|
public isEnableVideoDevicesLock = false;
|
|
12
9
|
|
|
@@ -24,10 +21,13 @@ class System {
|
|
|
24
21
|
|
|
25
22
|
private readonly logger: Logger;
|
|
26
23
|
|
|
27
|
-
constructor(params:
|
|
28
|
-
const { clientEventEmitter } = params;
|
|
24
|
+
constructor(params: CreateSystemParams) {
|
|
25
|
+
const { clientEventEmitter, logLevel } = params;
|
|
29
26
|
this.clientEventEmitter = clientEventEmitter;
|
|
30
|
-
this.logger = new Logger(
|
|
27
|
+
this.logger = new Logger({
|
|
28
|
+
namespace: 'System',
|
|
29
|
+
logLevel,
|
|
30
|
+
});
|
|
31
31
|
this.listenDevices();
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -28,8 +28,8 @@ class WebRTCIssueDetector {
|
|
|
28
28
|
#running = false;
|
|
29
29
|
|
|
30
30
|
constructor(params: WebRTCIssueDetectorConstructorParams) {
|
|
31
|
-
if (params.
|
|
32
|
-
this.eventEmitter.on(EventType.Issue, params.
|
|
31
|
+
if (params.onIssues) {
|
|
32
|
+
this.eventEmitter.on(EventType.Issue, params.onIssues);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
// Move instantiation from the constructor
|
package/src/engine/wid/types.ts
CHANGED
|
@@ -19,7 +19,7 @@ export enum EventType {
|
|
|
19
19
|
export type EventPayload = IssueDetectorResult;
|
|
20
20
|
|
|
21
21
|
export type WebRTCIssueDetectorConstructorParams = {
|
|
22
|
-
|
|
22
|
+
onIssues?: (payload: IssueDetectorResult) => void,
|
|
23
23
|
};
|
|
24
24
|
|
|
25
25
|
export enum IssueType {
|
package/src/helpers/retry.ts
CHANGED
|
@@ -6,9 +6,9 @@ export type RetryOpts = {
|
|
|
6
6
|
minBackoffDelayMs?: number;
|
|
7
7
|
maxBackoffDelayMs?: number;
|
|
8
8
|
actionName?: string; // human-readable action name for debug purposes
|
|
9
|
+
logger?: Logger;
|
|
9
10
|
};
|
|
10
11
|
|
|
11
|
-
const logger = new Logger('Retry');
|
|
12
12
|
const timeProvider = new DefaultTimeProvider();
|
|
13
13
|
|
|
14
14
|
const retryAsync = async <ReturnType>(
|
|
@@ -28,7 +28,9 @@ const retryAsync = async <ReturnType>(
|
|
|
28
28
|
return await action();
|
|
29
29
|
} catch (err: unknown) {
|
|
30
30
|
lastError = err;
|
|
31
|
-
|
|
31
|
+
if (opts.logger) {
|
|
32
|
+
opts.logger.info('Action retry failed', currentAttempt, opts.actionName, err);
|
|
33
|
+
}
|
|
32
34
|
|
|
33
35
|
if (currentAttempt < maxRetries) {
|
|
34
36
|
const delay = 2 ** (currentAttempt - 1) * minBackoffDelayMs;
|