@livedigital/client 2.12.0-add-onissue-callback.3 → 2.12.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.
Files changed (43) hide show
  1. package/dist/constants/events.d.ts +2 -0
  2. package/dist/engine/DefaultEngineDependenciesFactory.d.ts +4 -3
  3. package/dist/engine/Logger.d.ts +3 -10
  4. package/dist/engine/Peer.d.ts +3 -4
  5. package/dist/engine/PeerConsumer.d.ts +2 -6
  6. package/dist/engine/index.d.ts +5 -10
  7. package/dist/engine/media/index.d.ts +0 -2
  8. package/dist/engine/media/tracks/BaseTrack.d.ts +2 -6
  9. package/dist/engine/media/tracks/PeerTrack.d.ts +4 -0
  10. package/dist/engine/network/Socket.d.ts +2 -5
  11. package/dist/engine/network/index.d.ts +0 -2
  12. package/dist/engine/system/index.d.ts +4 -2
  13. package/dist/engine/wid/types.d.ts +2 -2
  14. package/dist/helpers/retry.d.ts +0 -2
  15. package/dist/index.d.ts +1 -4
  16. package/dist/index.es.js +1 -1
  17. package/dist/index.js +2 -2
  18. package/dist/types/common.d.ts +4 -12
  19. package/dist/types/engine.d.ts +5 -15
  20. package/package.json +1 -1
  21. package/src/constants/events.ts +2 -0
  22. package/src/engine/DefaultEngineDependenciesFactory.ts +13 -18
  23. package/src/engine/Logger.ts +17 -43
  24. package/src/engine/Peer.ts +68 -38
  25. package/src/engine/PeerConsumer.ts +3 -12
  26. package/src/engine/handlers/ChannelEventHandler.ts +1 -4
  27. package/src/engine/handlers/MediaSoupEventHandler.ts +2 -37
  28. package/src/engine/index.ts +22 -55
  29. package/src/engine/media/index.ts +4 -17
  30. package/src/engine/media/tracks/BaseTrack.ts +3 -13
  31. package/src/engine/media/tracks/PeerTrack.ts +31 -12
  32. package/src/engine/network/Socket.ts +3 -10
  33. package/src/engine/network/index.ts +2 -6
  34. package/src/engine/system/index.ts +7 -7
  35. package/src/engine/wid/WebRTCIssueDetector.ts +2 -2
  36. package/src/engine/wid/detectors/NetworkIssueDetector.ts +16 -13
  37. package/src/engine/wid/types.ts +2 -2
  38. package/src/helpers/retry.ts +2 -4
  39. package/src/index.ts +1 -14
  40. package/src/types/common.ts +5 -15
  41. package/src/types/engine.ts +5 -18
  42. package/dist/constants/common.d.ts +0 -11
  43. package/src/constants/common.ts +0 -13
@@ -1,4 +1,5 @@
1
1
  import { MediaKind, RtpEncodingParameters, RtpParameters } from 'mediasoup-client/lib/types';
2
+ import { ConsumerOptions } from 'mediasoup-client/lib/Consumer';
2
3
  import AudioTrack from '../engine/media/tracks/AudioTrack';
3
4
  import VideoTrack from '../engine/media/tracks/VideoTrack';
4
5
  export declare type SocketResponse = {
@@ -153,17 +154,6 @@ export declare enum TrackLabel {
153
154
  ScreenAudio = "screen-audio",
154
155
  Unknown = "unknown"
155
156
  }
156
- export declare type StartTrackPayload = {
157
- producerId: string;
158
- consumerId?: string;
159
- track: MediaStreamTrack;
160
- label: TrackLabel;
161
- };
162
- export declare type EndTrackPayload = {
163
- producerId: string;
164
- kind: MediaKind;
165
- label: TrackLabel;
166
- };
167
157
  export declare type PayloadOfPublishedMedia = {
168
158
  producerId: string;
169
159
  kind: MediaKind;
@@ -209,5 +199,7 @@ export declare type TransformParams = {
209
199
  width?: number;
210
200
  height?: number;
211
201
  };
202
+ export declare type RemoteConsumerOptions = ConsumerOptions & {
203
+ producerPaused: boolean;
204
+ };
212
205
  export declare type LogMessageHandler = (msg: any, ...meta: any) => void;
213
- export declare type LogLevel = 3 | 4 | 6 | 7;
@@ -7,27 +7,17 @@ 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 { IssueDetectorResult } from '../engine/wid/types';
11
- import { LogLevel } from './common';
12
- export declare type IssuesHandler = (issues: IssueDetectorResult) => void;
10
+ import Logger from '../engine/Logger';
13
11
  export interface CreateIssueDetectorParams {
14
- onIssues?: IssuesHandler;
15
- }
16
- export interface CreateMediaParams {
17
- logLevel: LogLevel;
12
+ logger: Logger;
18
13
  }
19
14
  export interface CreateNetworkParams {
20
- logLevel: LogLevel;
21
15
  loadbalancer: LoadBalancerApiClientParams;
22
16
  }
23
- export interface CreateSystemParams {
24
- logLevel: LogLevel;
25
- clientEventEmitter: EnhancedEventEmitter;
26
- }
27
17
  export interface EngineDependenciesFactory {
28
- createSystem: (params: CreateSystemParams) => System;
29
- createMedia: (params: CreateMediaParams) => Media;
30
- createNetwork: (params: CreateNetworkParams) => Network;
18
+ createSystem: (clientEventEmitter: EnhancedEventEmitter) => System;
19
+ createMedia: () => Media;
20
+ createNetwork: (networkParams: CreateNetworkParams) => Network;
31
21
  createChannelEventHandler: (engine: Engine) => ChannelEventHandler;
32
22
  createMediaSoupEventHandler: (engine: Engine) => MediaSoupEventHandler;
33
23
  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-add-onissue-callback.3",
5
+ "version": "2.12.0",
6
6
  "private": false,
7
7
  "bugs": {
8
8
  "url": "https://github.com/vlprojects/livedigital-sdk/issues"
@@ -19,6 +19,8 @@ export const PEER_EVENTS = {
19
19
  connectionQualityChanged: 'connection-quality-changed',
20
20
  trackStart: 'track-start',
21
21
  trackEnd: 'track-end',
22
+ trackPaused: 'track-paused',
23
+ trackResumed: 'track-resumed',
22
24
  };
23
25
 
24
26
  export enum SocketIOEvents {
@@ -1,3 +1,4 @@
1
+ import EnhancedEventEmitter from '../EnhancedEventEmitter';
1
2
  import Network from './network';
2
3
  import System from './system';
3
4
  import Media from './media';
@@ -5,35 +6,25 @@ import ChannelEventHandler from './handlers/ChannelEventHandler';
5
6
  import Engine from './index';
6
7
  import MediaSoupEventHandler from './handlers/MediaSoupEventHandler';
7
8
  import WebRTCIssueDetector from './wid/WebRTCIssueDetector';
8
- import {
9
- CreateIssueDetectorParams,
10
- CreateMediaParams,
11
- CreateNetworkParams,
12
- CreateSystemParams,
13
- EngineDependenciesFactory,
14
- } from '../types/engine';
9
+ import { CreateIssueDetectorParams, CreateNetworkParams, EngineDependenciesFactory } from '../types/engine';
15
10
  import SocketIO from './network/Socket';
16
11
  import LoadBalancerApiClient from './network/LoadBalancerClient';
17
12
 
18
13
  /* eslint-disable class-methods-use-this */
19
14
  class DefaultEngineDependenciesFactory implements EngineDependenciesFactory {
20
- createSystem(params: CreateSystemParams): System {
21
- return new System(params);
15
+ createSystem(clientEventEmitter: EnhancedEventEmitter): System {
16
+ return new System({ clientEventEmitter });
22
17
  }
23
18
 
24
- createMedia(params: CreateMediaParams): Media {
25
- return new Media(params);
19
+ createMedia(): Media {
20
+ return new Media();
26
21
  }
27
22
 
28
23
  createNetwork(params: CreateNetworkParams): Network {
29
- const { loadbalancer, logLevel } = params;
30
- const socketClient = new SocketIO({
31
- logLevel,
32
- });
33
-
24
+ const { loadbalancer } = params;
25
+ const socketClient = new SocketIO();
34
26
  const loadBalancerApiClient = new LoadBalancerApiClient(loadbalancer);
35
27
  return new Network({
36
- logLevel,
37
28
  socketClient,
38
29
  loadBalancerApiClient,
39
30
  });
@@ -49,7 +40,11 @@ class DefaultEngineDependenciesFactory implements EngineDependenciesFactory {
49
40
 
50
41
  createIssueDetector(params: CreateIssueDetectorParams): WebRTCIssueDetector {
51
42
  return new WebRTCIssueDetector({
52
- onIssues: params.onIssues,
43
+ onIssue: (issues: any[]) => {
44
+ issues.forEach((issue) => {
45
+ params.logger.warn('webRtcIssueDetector', issue);
46
+ });
47
+ },
53
48
  });
54
49
  }
55
50
  }
@@ -1,48 +1,35 @@
1
1
  import debug from 'debug';
2
- import { LogLevels } from '../constants/common';
3
- import { LogLevel, LogMessageHandler } from '../types/common';
2
+ import { LogMessageHandler } from '../types/common';
4
3
 
5
4
  const APP_NAME = 'LiveDigital';
6
5
 
7
- export type LoggerConstructorParams = {
8
- namespace: string,
9
- logLevel: LogLevel,
10
- onLogMessage?: LogMessageHandler,
11
- };
12
-
13
6
  class Logger {
14
7
  private readonly _debug: debug.Debugger;
15
8
 
16
- private readonly _info: debug.Debugger;
17
-
18
9
  private readonly _warn: debug.Debugger;
19
10
 
20
11
  private readonly _error: debug.Debugger;
21
12
 
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);
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
+ }
37
25
 
38
26
  /* eslint-disable no-console */
39
27
  this._debug.log = console.info.bind(console);
40
- this._info.log = console.info.bind(console);
41
28
  this._warn.log = console.warn.bind(console);
42
29
  this._error.log = console.error.bind(console);
43
30
  /* eslint-enable no-console */
44
31
 
45
- this.#onLogMessage = (msg: any, ...meta: any[]) => {
32
+ this.onLogMessage = (msg: any, ...meta: any[]) => {
46
33
  if (typeof onLogMessage === 'function') {
47
34
  onLogMessage(msg, ...meta);
48
35
  }
@@ -51,30 +38,17 @@ class Logger {
51
38
 
52
39
  debug(msg: any, ...meta: any[]): void {
53
40
  this._debug(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
- }
41
+ this.onLogMessage(msg, ...meta);
64
42
  }
65
43
 
66
44
  warn(msg: any, ...meta: any[]): void {
67
45
  this._warn(msg, ...meta);
68
- if (this.#logLevel >= LogLevels.Warn) {
69
- this.#onLogMessage(msg, ...meta);
70
- }
46
+ this.onLogMessage(msg, ...meta);
71
47
  }
72
48
 
73
49
  error(msg: any, ...meta: any[]): void {
74
50
  this._error(msg, ...meta);
75
- if (this.#logLevel >= LogLevels.Error) {
76
- this.#onLogMessage(msg, ...meta);
77
- }
51
+ this.onLogMessage(msg, ...meta);
78
52
  }
79
53
  }
80
54
 
@@ -1,14 +1,14 @@
1
- import { ConsumerOptions } from 'mediasoup-client/lib/Consumer';
2
1
  import {
3
2
  ConsumerScoreChangedPayload,
4
3
  ProducerData,
5
4
  ProducerScoreChangedPayload,
6
5
  ConnectionQuality,
7
- EndTrackPayload,
8
6
  PayloadOfPublishedMedia,
9
7
  PayloadOfUnpublishedMedia,
10
8
  ChangePreferredLayersPayload,
11
9
  Role,
10
+ ProducerSetMaxSpatialLayer,
11
+ RemoteConsumerOptions,
12
12
  } from '../types/common';
13
13
  import EnhancedEventEmitter from '../EnhancedEventEmitter';
14
14
  import Engine from './index';
@@ -89,10 +89,7 @@ class Peer {
89
89
  this.uid = uid;
90
90
  this.role = role;
91
91
  this.engine = engine;
92
- this.logger = new Logger({
93
- logLevel: engine.logLevel,
94
- namespace: 'Peer',
95
- });
92
+ this.logger = new Logger('Peer');
96
93
  producers.forEach(this.handleNewProducer.bind(this));
97
94
  this.handlePeerEvents();
98
95
  }
@@ -147,23 +144,23 @@ class Peer {
147
144
  channelId: this.engine.channelId,
148
145
  },
149
146
  producerPeerId: this.id,
150
- }) as ConsumerOptions;
147
+ }) as RemoteConsumerOptions;
151
148
 
152
149
  const consumer = await transport.consume(remoteConsumer);
153
- await this.engine.network.socket.request(MEDIASOUP_EVENTS.resumeConsumer, { consumerId: consumer.id });
150
+ if (!remoteConsumer.producerPaused) {
151
+ await this.engine.network.socket.request(MEDIASOUP_EVENTS.resumeConsumer, { consumerId: consumer.id });
152
+ }
154
153
 
155
154
  this.logger.debug(`Subscribed for ${producer.kind}`, { peer: this });
156
155
  const track = new PeerTrack({
157
156
  mediaStreamTrack: consumer.track,
158
157
  label: producer.label,
159
- consumer: new PeerConsumer({
160
- consumer,
161
- logLevel: this.engine.logLevel,
162
- }),
158
+ consumer: new PeerConsumer(consumer),
163
159
  engine: this.engine,
160
+ isPaused: remoteConsumer.producerPaused,
161
+ peerEventEmitter: this.observer,
164
162
  });
165
163
  this.tracks.set(track.label, track);
166
- this.observer.safeEmit(PEER_EVENTS.trackStart, track);
167
164
  } catch (error) {
168
165
  this.logger.error('createConsumer()', producer, error);
169
166
  throw new Error('Error subscribe media');
@@ -199,39 +196,32 @@ class Peer {
199
196
  });
200
197
 
201
198
  this.observer.on(MEDIASOUP_EVENTS.closeConsumer, (consumerId) => {
202
- const consumer = this.getConsumerById(consumerId);
203
- if (!consumer) {
199
+ const track = this.getTrackByConsumerId(consumerId);
200
+ if (!track) {
204
201
  return;
205
202
  }
206
203
 
207
- consumer.close();
208
- this.tracks.delete(consumer.appData.producerData.label);
209
- this.observer.safeEmit(PEER_EVENTS.trackEnd, {
210
- producerId: consumer.producerId,
211
- kind: consumer.kind,
212
- label: consumer.appData.producerData.label,
213
- } as EndTrackPayload);
204
+ track.close();
205
+ this.tracks.delete(track.label);
214
206
  this.logger.debug('Peer video track was ended:', { peer: this });
215
207
  });
216
208
 
217
- this.observer.on(MEDIASOUP_EVENTS.pauseConsumer, (consumerId) => {
218
- const consumer = this.getConsumerById(consumerId);
219
- if (!consumer) {
209
+ this.observer.on(MEDIASOUP_EVENTS.pauseConsumer, async (consumerId) => {
210
+ const track = this.getTrackByConsumerId(consumerId);
211
+ if (!track) {
220
212
  return;
221
213
  }
222
214
 
223
- consumer.pause();
224
- this.logger.debug('Peer video track was paused:', { peer: this });
215
+ await track.pause();
225
216
  });
226
217
 
227
- this.observer.on(MEDIASOUP_EVENTS.resumeConsumer, (consumerId) => {
228
- const consumer = this.getConsumerById(consumerId);
229
- if (!consumer) {
218
+ this.observer.on(MEDIASOUP_EVENTS.resumeConsumer, async (consumerId) => {
219
+ const track = this.getTrackByConsumerId(consumerId);
220
+ if (!track) {
230
221
  return;
231
222
  }
232
223
 
233
- consumer.resume();
234
- this.logger.debug('Peer video track was paused:', { peer: this });
224
+ await track.resume();
235
225
  });
236
226
 
237
227
  // set outgoing connection quality for remote peer
@@ -333,6 +323,46 @@ class Peer {
333
323
  this.logger.debug('consumerChangePreferredLayers()', { consumer, ...payload });
334
324
  }
335
325
  });
326
+
327
+ this.observer.on(MEDIASOUP_EVENTS.producerSetMaxSpatialLayer, async (payload: ProducerSetMaxSpatialLayer) => {
328
+ const { producerId, spatialLayer } = payload;
329
+ const consumer = this.getConsumerByProducerId(producerId);
330
+ if (!consumer) {
331
+ this.logger.debug('producerSetMaxSpatialLayer()', {
332
+ message: 'Consumer for producer not created, ignore MaxSpatialLayer change',
333
+ });
334
+
335
+ return;
336
+ }
337
+
338
+ consumer.setCurrentMaxSpatialLayer(spatialLayer);
339
+ this.logger.debug('producerSetMaxSpatialLayer()', {
340
+ producerId,
341
+ consumerId: consumer.id,
342
+ spatialLayer,
343
+ });
344
+
345
+ if (consumer.requestedSpatialLayer !== spatialLayer) {
346
+ this.logger.debug('producerSetMaxSpatialLayer()', {
347
+ message: 'No need to request new preferred layer',
348
+ currentMaxSpatialLayer: spatialLayer,
349
+ requestedMaxSpatialLayer: consumer.requestedSpatialLayer,
350
+ });
351
+
352
+ return;
353
+ }
354
+
355
+ await this.engine.network.socket.request(MEDIASOUP_EVENTS.consumerChangePreferredLayers, {
356
+ consumerId: consumer.id,
357
+ spatialLayer,
358
+ });
359
+
360
+ this.logger.debug('requestVideoPreferredLayers()', {
361
+ producerId,
362
+ consumerId: consumer.id,
363
+ spatialLayer,
364
+ });
365
+ });
336
366
  }
337
367
 
338
368
  private emitConnectionQuality(): void {
@@ -371,17 +401,17 @@ class Peer {
371
401
  .filter((item): item is PeerConsumer => !!item);
372
402
  }
373
403
 
374
- public getAllProducers(): PeerProducer[] {
375
- return Array.from(this.producers.values());
376
- }
377
-
378
- public getConsumerByProducerId(producerId: string): PeerConsumer | undefined {
404
+ private getConsumerByProducerId(producerId: string): PeerConsumer | undefined {
379
405
  return this.getAllConsumers().find((consumer) => consumer.producerId === producerId);
380
406
  }
381
407
 
382
- public getConsumerById(id: string): PeerConsumer | undefined {
408
+ private getConsumerById(id: string): PeerConsumer | undefined {
383
409
  return this.getAllConsumers().find((consumer) => consumer.id === id);
384
410
  }
411
+
412
+ private getTrackByConsumerId(id: string): PeerTrack | undefined {
413
+ return Array.from(this.tracks.values()).find((track) => track.consumerId === id);
414
+ }
385
415
  }
386
416
 
387
417
  export default Peer;
@@ -1,14 +1,9 @@
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, LogLevel, SpatialLayerParams } from '../types/common';
4
+ import { ConsumerData, SpatialLayerParams } from '../types/common';
5
5
  import Logger from './Logger';
6
6
 
7
- export type PeerConsumerConstructorParams = {
8
- consumer: MediasoupConsumer,
9
- logLevel: LogLevel,
10
- };
11
-
12
7
  class PeerConsumer {
13
8
  public score = 10;
14
9
 
@@ -42,17 +37,13 @@ class PeerConsumer {
42
37
 
43
38
  private readonly logger: Logger;
44
39
 
45
- constructor(params: PeerConsumerConstructorParams) {
46
- const { logLevel, consumer } = params;
40
+ constructor(consumer: MediasoupConsumer) {
47
41
  this.id = consumer.id;
48
42
  this.kind = consumer.kind as MediaKind;
49
43
  this.producerId = consumer.producerId;
50
44
  this.appData = consumer.appData as ConsumerData;
51
45
  this.consumer = consumer;
52
- this.logger = new Logger({
53
- logLevel,
54
- namespace: 'PeerConsumer',
55
- });
46
+ this.logger = new Logger('PeerConsumer');
56
47
  this.currentMaxSpatialLayer = this.appData.producerData.maxSpatialLayer;
57
48
  this.parseScalabilityMode();
58
49
  this.setSpatialLayersParams();
@@ -10,10 +10,7 @@ class ChannelEventHandler {
10
10
 
11
11
  constructor(engine: Engine) {
12
12
  this.engine = engine;
13
- this.logger = new Logger({
14
- logLevel: engine.logLevel,
15
- namespace: 'ChannelEvents',
16
- });
13
+ this.logger = new Logger('ChannelEvents');
17
14
  }
18
15
 
19
16
  public subscribeToEvents(): void {
@@ -17,10 +17,7 @@ class MediaSoupEventHandler {
17
17
 
18
18
  constructor(engine: Engine) {
19
19
  this.engine = engine;
20
- this.logger = new Logger({
21
- logLevel: engine.logLevel,
22
- namespace: 'MediasoupEvents',
23
- });
20
+ this.logger = new Logger('MediasoupEvents');
24
21
  }
25
22
 
26
23
  public subscribeToEvents(): void {
@@ -156,39 +153,7 @@ class MediaSoupEventHandler {
156
153
  return;
157
154
  }
158
155
 
159
- const consumer = peer.getConsumerByProducerId(producerId);
160
- if (!consumer) {
161
- this.logger.warn('producerSetMaxSpatialLayer()', { message: 'Consumer not found' });
162
- return;
163
- }
164
-
165
- consumer.setCurrentMaxSpatialLayer(spatialLayer);
166
- this.logger.debug('producerSetMaxSpatialLayer()', {
167
- producerId,
168
- consumerId: consumer.id,
169
- spatialLayer,
170
- });
171
-
172
- if (consumer.requestedSpatialLayer !== spatialLayer) {
173
- this.logger.debug('producerSetMaxSpatialLayer()', {
174
- message: 'No need to request new preferred layer',
175
- currentMaxSpatialLayer: spatialLayer,
176
- requestedMaxSpatialLayer: consumer.requestedSpatialLayer,
177
- });
178
-
179
- return;
180
- }
181
-
182
- await this.engine.network.socket.request(MEDIASOUP_EVENTS.consumerChangePreferredLayers, {
183
- consumerId: consumer.id,
184
- spatialLayer,
185
- });
186
-
187
- this.logger.debug('requestVideoPreferredLayers()', {
188
- producerId,
189
- consumerId: consumer.id,
190
- spatialLayer,
191
- });
156
+ peer.observer.safeEmit(MEDIASOUP_EVENTS.producerSetMaxSpatialLayer, { peerId, producerId, spatialLayer });
192
157
  });
193
158
  }
194
159
  }