@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.
- 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/handlers/MediaSoupEventHandler.d.ts +2 -0
- 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 +2 -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 +10 -4
- package/src/engine/PeerConsumer.ts +12 -3
- package/src/engine/handlers/ChannelEventHandler.ts +4 -1
- package/src/engine/handlers/MediaSoupEventHandler.ts +42 -27
- package/src/engine/index.ts +43 -9
- 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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@livedigital/client",
|
|
3
3
|
"author": "vlprojects",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "2.
|
|
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 {
|
|
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,
|
|
@@ -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(
|
|
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 {
|
|
@@ -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(
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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;
|
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
|
}
|
|
@@ -329,7 +355,7 @@ class Engine {
|
|
|
329
355
|
? track.getCodecOptions()
|
|
330
356
|
: undefined;
|
|
331
357
|
|
|
332
|
-
const maxSpatialLayer =
|
|
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 {
|
|
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 {
|