@livedigital/client 2.45.0-test-speaker.1 → 3.0.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 (35) hide show
  1. package/dist/constants/common.d.ts +1 -0
  2. package/dist/engine/handlers/ChannelAudioObserverEventHandler.d.ts +0 -3
  3. package/dist/engine/index.d.ts +9 -4
  4. package/dist/engine/media/DefaultMediaTracksFactory.d.ts +6 -0
  5. package/dist/engine/media/index.d.ts +9 -8
  6. package/dist/engine/media/tracks/{AudioTrack.d.ts → DefaultAudioTrack.d.ts} +5 -7
  7. package/dist/engine/media/tracks/{BaseTrack.d.ts → DefaultBaseTrack.d.ts} +6 -14
  8. package/dist/engine/media/tracks/{VideoTrack.d.ts → DefaultVideoTrack.d.ts} +7 -6
  9. package/dist/engine/network/Socket.d.ts +2 -2
  10. package/dist/helpers/retry.d.ts +1 -0
  11. package/dist/index.d.ts +4 -3
  12. package/dist/index.es.js +11 -11
  13. package/dist/index.js +11 -11
  14. package/dist/types/common.d.ts +2 -14
  15. package/dist/types/engine.d.ts +8 -1
  16. package/dist/types/media.d.ts +73 -0
  17. package/dist/types/network.d.ts +20 -0
  18. package/package.json +3 -1
  19. package/src/constants/common.ts +2 -0
  20. package/src/engine/handlers/ChannelAudioObserverEventHandler.ts +0 -23
  21. package/src/engine/handlers/MediaSoupEventHandler.ts +1 -1
  22. package/src/engine/index.ts +52 -33
  23. package/src/engine/media/DefaultMediaTracksFactory.ts +17 -0
  24. package/src/engine/media/index.ts +19 -16
  25. package/src/engine/media/tracks/{AudioTrack.ts → DefaultAudioTrack.ts} +5 -8
  26. package/src/engine/media/tracks/{BaseTrack.ts → DefaultBaseTrack.ts} +9 -13
  27. package/src/engine/media/tracks/{VideoTrack.ts → DefaultVideoTrack.ts} +7 -6
  28. package/src/engine/network/Socket.ts +6 -3
  29. package/src/helpers/media.ts +1 -1
  30. package/src/helpers/retry.ts +5 -0
  31. package/src/index.ts +8 -3
  32. package/src/types/common.ts +2 -17
  33. package/src/types/engine.ts +11 -1
  34. package/src/types/media.ts +96 -0
  35. package/src/types/network.ts +24 -0
@@ -1,17 +1,14 @@
1
1
  import { ProducerCodecOptions } from 'mediasoup-client/lib/Producer';
2
2
  import { RtpEncodingParameters } from 'mediasoup-client/lib/RtpParameters';
3
- import { AudioCodec, AudioEncoderConfig, TrackWithEncodings } from '../../../types/common';
4
- import BaseTrack, { BaseTrackConstructorParams } from './BaseTrack';
3
+ import { AudioCodec, AudioEncoderConfig } from '../../../types/common';
4
+ import DefaultBaseTrack from './DefaultBaseTrack';
5
5
  import { INTERNAL_CLIENT_EVENTS } from '../../../constants/events';
6
6
  import { AUDIO_ENCODINGS } from '../../../constants/encodings';
7
7
  import TrackProcessor from '../streamEffects/audio/noiseSuppression/TrackProcessor';
8
8
  import Logger from '../../Logger';
9
+ import { AudioTrack, AudioTrackParams } from '../../../types/media';
9
10
 
10
- interface AudioTrackParams extends BaseTrackConstructorParams {
11
- noiseSuppressor?: WebAssembly.WebAssemblyInstantiatedSource;
12
- }
13
-
14
- class AudioTrack extends BaseTrack implements TrackWithEncodings {
11
+ class DefaultAudioTrack extends DefaultBaseTrack implements AudioTrack {
15
12
  readonly #trackProcessor?: TrackProcessor;
16
13
 
17
14
  #originalTrack?: MediaStreamTrack;
@@ -115,4 +112,4 @@ class AudioTrack extends BaseTrack implements TrackWithEncodings {
115
112
  }
116
113
  }
117
114
 
118
- export default AudioTrack;
115
+ export default DefaultAudioTrack;
@@ -4,7 +4,6 @@ import { Mutex } from 'async-mutex';
4
4
  import {
5
5
  BaseTrackInfo,
6
6
  EncoderConfig,
7
- LogLevel,
8
7
  SocketResponse, Timeout,
9
8
  TrackLabel,
10
9
  TrackOutboundStats,
@@ -18,17 +17,9 @@ import { CLIENT_EVENTS, INTERNAL_CLIENT_EVENTS, MEDIASOUP_EVENTS } from '../../.
18
17
  import EnhancedEventEmitter from '../../../EnhancedEventEmitter';
19
18
  import filterStatsCodecs from '../../../helpers/filterStatsCodecs';
20
19
  import MediaStreamTrackManager from './MediaStreamTrackManager';
20
+ import { BaseTrack, BaseTrackParams } from '../../../types/media';
21
21
 
22
- export type BaseTrackConstructorParams = {
23
- mediaStreamTrack: MediaStreamTrack,
24
- logLevel: LogLevel,
25
- engine: Engine,
26
- clientEventEmitter: EnhancedEventEmitter,
27
- constraints: MediaStreamConstraints;
28
- mediaStreamTrackManager: MediaStreamTrackManager;
29
- };
30
-
31
- class BaseTrack {
22
+ class DefaultBaseTrack implements BaseTrack {
32
23
  #mediaStreamTrack: MediaStreamTrack;
33
24
 
34
25
  protected encoderConfig: EncoderConfig = {};
@@ -59,7 +50,7 @@ class BaseTrack {
59
50
 
60
51
  #mutex = new Mutex();
61
52
 
62
- constructor(params: BaseTrackConstructorParams) {
53
+ constructor(params: BaseTrackParams) {
63
54
  const {
64
55
  mediaStreamTrack, logLevel, engine, clientEventEmitter, constraints, mediaStreamTrackManager,
65
56
  } = params;
@@ -385,6 +376,11 @@ class BaseTrack {
385
376
  }
386
377
  }
387
378
 
379
+ async publish(): Promise<void> {
380
+ await this.produce({});
381
+ this.clientEventEmitter.emit(INTERNAL_CLIENT_EVENTS.trackProduced, this);
382
+ }
383
+
388
384
  async unpublish(): Promise<void> {
389
385
  try {
390
386
  if (!this.producer) {
@@ -558,4 +554,4 @@ class BaseTrack {
558
554
  }
559
555
  }
560
556
 
561
- export default BaseTrack;
557
+ export default DefaultBaseTrack;
@@ -2,24 +2,25 @@ import { ProducerCodecOptions } from 'mediasoup-client/lib/Producer';
2
2
  import { RtpEncodingParameters } from 'mediasoup-client/lib/RtpParameters';
3
3
  import { WEBCAM_SIMULCAST_ENCODINGS } from '../../../constants/encodings';
4
4
  import {
5
- TrackLabel, TrackPublishParams, TrackWithEncodings, VideoCodec, VideoEncoderConfig,
5
+ TrackLabel, VideoCodec, VideoEncoderConfig,
6
6
  } from '../../../types/common';
7
- import BaseTrack, { BaseTrackConstructorParams } from './BaseTrack';
7
+ import DefaultBaseTrack from './DefaultBaseTrack';
8
8
  import { INTERNAL_CLIENT_EVENTS } from '../../../constants/events';
9
9
  import TrackProcessor from '../streamEffects/video/virtual-background/TrackProcessor';
10
10
  import {
11
11
  BLUR_IN_BACKGROUND_TASK_PIPELINE_CONFIG,
12
12
  BLUR_PIPELINE_CONFIG,
13
13
  } from '../streamEffects/video/virtual-background/constants';
14
+ import { BaseTrackParams, VideoTrack, VideoTrackPublishParams } from '../../../types/media';
14
15
 
15
- class VideoTrack extends BaseTrack implements TrackWithEncodings {
16
+ class DefaultVideoTrack extends DefaultBaseTrack implements VideoTrack {
16
17
  readonly #trackProcessor: TrackProcessor;
17
18
 
18
19
  #originalTrack?: MediaStreamTrack;
19
20
 
20
21
  public transformParams = {};
21
22
 
22
- constructor(params: BaseTrackConstructorParams) {
23
+ constructor(params: BaseTrackParams) {
23
24
  super(params);
24
25
  this.#trackProcessor = new TrackProcessor({
25
26
  logLevel: params.logLevel,
@@ -124,7 +125,7 @@ class VideoTrack extends BaseTrack implements TrackWithEncodings {
124
125
  }
125
126
  }
126
127
 
127
- async publish(params: TrackPublishParams = {}): Promise<void> {
128
+ async publish(params: VideoTrackPublishParams = {}): Promise<void> {
128
129
  await this.produce({
129
130
  encodings: this.getEncodings(),
130
131
  preferredCodec: this.getPreferredCodec(),
@@ -184,4 +185,4 @@ class VideoTrack extends BaseTrack implements TrackWithEncodings {
184
185
  }
185
186
  }
186
187
 
187
- export default VideoTrack;
188
+ export default DefaultVideoTrack;
@@ -50,11 +50,14 @@ class SocketIO {
50
50
  return this.connection?.id;
51
51
  }
52
52
 
53
- connect(serverUrl: string): void {
53
+ connect(serverUrl: string, token: string): void {
54
54
  const connection = io(serverUrl, {
55
55
  transports: ['polling', 'websocket'],
56
56
  upgrade: true,
57
57
  rememberUpgrade: false,
58
+ auth: {
59
+ token,
60
+ },
58
61
  });
59
62
 
60
63
  this.connection = connection;
@@ -114,7 +117,7 @@ class SocketIO {
114
117
  }
115
118
  }
116
119
 
117
- request(event: string, payload = {}): Promise<SocketResponse> {
120
+ request<T>(event: string, payload = {}): Promise<SocketResponse<T>> {
118
121
  return new Promise((resolve, reject) => {
119
122
  if (!this.connection) {
120
123
  this.logger.error('request()', { type: event, data: payload });
@@ -122,7 +125,7 @@ class SocketIO {
122
125
  return;
123
126
  }
124
127
 
125
- this.connection.emit(event, payload, (response: SocketResponse) => {
128
+ this.connection.emit(event, payload, (response: SocketResponse<T>) => {
126
129
  if (response.error) {
127
130
  this.logger.error('request()', { event, payload, response });
128
131
  reject(response.error);
@@ -26,7 +26,7 @@ export const detectHandlerName = (userAgent?: string): types.BuiltinHandlerName
26
26
 
27
27
  export const getNewAudioContext = (contextOptions?: AudioContextOptions): AudioContext | null => {
28
28
  const Context = window.AudioContext // Default
29
- || window.webkitAudioContext // Safari and old versions of Chrome
29
+ || (window as unknown as { webkitAudioContext : any }).webkitAudioContext // Safari and old versions of Chrome
30
30
  || false;
31
31
 
32
32
  if (Context) {
@@ -7,6 +7,7 @@ export type RetryOpts = {
7
7
  maxBackoffDelayMs?: number;
8
8
  actionName?: string; // human-readable action name for debug purposes
9
9
  logger?: Logger;
10
+ abortOnError?: (error: any) => boolean;
10
11
  };
11
12
 
12
13
  const timeProvider = new DefaultTimeProvider();
@@ -36,6 +37,10 @@ const retryAsync = async <ReturnType>(
36
37
  });
37
38
  }
38
39
 
40
+ if (opts.abortOnError && opts.abortOnError(err)) {
41
+ throw lastError;
42
+ }
43
+
39
44
  if (currentAttempt < maxRetries) {
40
45
  const delay = 2 ** (currentAttempt - 1) * minBackoffDelayMs;
41
46
  // eslint-disable-next-line no-await-in-loop
package/src/index.ts CHANGED
@@ -7,7 +7,6 @@ import {
7
7
  LogLevel,
8
8
  LogMessageHandler,
9
9
  Role,
10
- Track,
11
10
  TransportsStateInfo,
12
11
  } from './types/common';
13
12
  import EnhancedEventEmitter from './EnhancedEventEmitter';
@@ -16,6 +15,8 @@ import Peer from './engine/Peer';
16
15
  import { LoadBalancerApiClientParams } from './engine/network/LoadBalancerClient';
17
16
  import DefaultEngineDependenciesFactory from './engine/DefaultEngineDependenciesFactory';
18
17
  import { IssuesHandler, NetworkScoresUpdatedHandler } from './types/engine';
18
+ import DefaultMediaTracksFactory from './engine/media/DefaultMediaTracksFactory';
19
+ import { AudioTrack, Track, VideoTrack } from './types/media';
19
20
 
20
21
  type ClientParams = {
21
22
  observer?: EnhancedEventEmitter;
@@ -47,9 +48,13 @@ class Client {
47
48
 
48
49
  this._observer = observer ?? new EnhancedEventEmitter();
49
50
  const dependenciesFactory = new DefaultEngineDependenciesFactory();
51
+ const mediaTracksFactory = new DefaultMediaTracksFactory();
50
52
  this.engine = new Engine({
51
53
  dependenciesFactory,
52
54
  clientEventEmitter: this.observer,
55
+ media: {
56
+ mediaTracksFactory,
57
+ },
53
58
  network: {
54
59
  loadbalancer: {
55
60
  baseURL: network?.loadbalancer?.baseURL,
@@ -108,11 +113,11 @@ class Client {
108
113
  return this.engine.confirmActivity();
109
114
  }
110
115
 
111
- createCameraVideoTrack(options?: CreateCameraVideoTrackOptions): Promise<Track> {
116
+ createCameraVideoTrack(options?: CreateCameraVideoTrackOptions): Promise<VideoTrack> {
112
117
  return this.engine.createCameraVideoTrack(options);
113
118
  }
114
119
 
115
- createMicrophoneAudioTrack(options?: CreateMicrophoneAudioTrackOptions): Promise<Track> {
120
+ createMicrophoneAudioTrack(options?: CreateMicrophoneAudioTrackOptions): Promise<AudioTrack> {
116
121
  return this.engine.createMicrophoneAudioTrack(options);
117
122
  }
118
123
 
@@ -8,13 +8,11 @@ import { RtpCapabilities } from 'mediasoup-client/src/RtpParameters';
8
8
  import { ProducerCodecOptions } from 'mediasoup-client/lib/Producer';
9
9
  import { ConnectionState } from 'mediasoup-client/src/Transport';
10
10
  import { DtlsRole } from 'mediasoup-client/lib/Transport';
11
- import AudioTrack from '../engine/media/tracks/AudioTrack';
12
- import VideoTrack from '../engine/media/tracks/VideoTrack';
13
11
  import NodeJSTimeout = NodeJS.Timeout;
14
12
 
15
13
  export type Timeout = NodeJSTimeout | number;
16
14
 
17
- export type SocketResponse = {
15
+ export type SocketResponse<T = Record<string, any>> = T & {
18
16
  success?: boolean;
19
17
  error?: string;
20
18
  errorCode?: string;
@@ -77,10 +75,8 @@ export type AvailableMediaDevices = {
77
75
 
78
76
  export type JoinChannelParams = {
79
77
  channelId: string,
80
- appId: string,
81
- sdkSecret: string,
78
+ token: string,
82
79
  role: Role,
83
- uid?: string,
84
80
  appData?: Record<string, unknown>,
85
81
  };
86
82
 
@@ -176,8 +172,6 @@ export type CreateScreenMediaOptions = BaseVideoTrackOptions & BaseAudioTrackOpt
176
172
  audioEncoderConfig?: AudioEncoderConfig,
177
173
  };
178
174
 
179
- export type Track = VideoTrack | AudioTrack;
180
-
181
175
  export enum TrackLabel {
182
176
  Camera = 'camera',
183
177
  Microphone = 'microphone',
@@ -378,10 +372,6 @@ export type CreateTracksPayload = {
378
372
  constraints: MediaStreamConstraints,
379
373
  };
380
374
 
381
- export type TrackPublishParams = {
382
- keyFrameRequestDelay?: number;
383
- };
384
-
385
375
  export type ChangeProducerStatePayload = {
386
376
  peerId: string,
387
377
  producerId: string,
@@ -392,11 +382,6 @@ export type ForceCloseProducerPayload = {
392
382
  label: TrackLabel,
393
383
  };
394
384
 
395
- export interface TrackWithEncodings {
396
- getCodecOptions(): ProducerCodecOptions;
397
- getEncodings(): RtpEncodingParameters[];
398
- }
399
-
400
385
  export type ActivityConfirmationRequiredPayload = {
401
386
  channelId: string;
402
387
  time: number;
@@ -7,8 +7,11 @@ import Engine from '../engine';
7
7
  import ChannelEventHandler from '../engine/handlers/ChannelEventHandler';
8
8
  import MediaSoupEventHandler from '../engine/handlers/MediaSoupEventHandler';
9
9
  import { LoadBalancerApiClientParams } from '../engine/network/LoadBalancerClient';
10
- import { Logger, LogLevel, LogMessageHandler } from './common';
10
+ import {
11
+ Logger, LogLevel, LogMessageHandler, Role,
12
+ } from './common';
11
13
  import ChannelAudioObserverEventHandler from '../engine/handlers/ChannelAudioObserverEventHandler';
14
+ import { MediaTracksFactory } from './media';
12
15
 
13
16
  export type IssuesHandler = (issues: IssueDetectorResult) => void;
14
17
 
@@ -25,6 +28,7 @@ export interface CreateMediaParams {
25
28
  logLevel: LogLevel;
26
29
  engine: Engine;
27
30
  clientEventEmitter: EnhancedEventEmitter;
31
+ mediaTracksFactory: MediaTracksFactory;
28
32
  onLogMessage?: LogMessageHandler;
29
33
  }
30
34
 
@@ -60,6 +64,12 @@ export interface CreateAudioObserverEventHandlerParams {
60
64
  onLogMessage?: LogMessageHandler;
61
65
  }
62
66
 
67
+ export interface ConnectParams {
68
+ channelId: string,
69
+ role: Role,
70
+ token: string,
71
+ }
72
+
63
73
  export interface EngineDependenciesFactory {
64
74
  createSystem: (params: CreateSystemParams) => System;
65
75
  createMedia: (params: CreateMediaParams) => Media;
@@ -0,0 +1,96 @@
1
+ import { Producer, ProducerCodecOptions } from 'mediasoup-client/lib/Producer';
2
+ import { RtpEncodingParameters } from 'mediasoup-client/lib/types';
3
+ import { MediaKind } from 'mediasoup-client/lib/RtpParameters';
4
+ import Engine from '../engine';
5
+ import {
6
+ BaseTrackInfo,
7
+ EncoderConfig,
8
+ LogLevel,
9
+ TrackLabel,
10
+ TrackOutboundStats,
11
+ TrackProduceParams,
12
+ } from './common';
13
+ import EnhancedEventEmitter from '../EnhancedEventEmitter';
14
+ import MediaStreamTrackManager from '../engine/media/tracks/MediaStreamTrackManager';
15
+
16
+ export interface BaseTrackParams {
17
+ mediaStreamTrack: MediaStreamTrack;
18
+ logLevel: LogLevel;
19
+ engine: Engine;
20
+ clientEventEmitter: EnhancedEventEmitter;
21
+ constraints: MediaStreamConstraints;
22
+ mediaStreamTrackManager: MediaStreamTrackManager;
23
+ }
24
+
25
+ export interface BaseTrack {
26
+ mediaStreamTrack: MediaStreamTrack;
27
+ id: string;
28
+ kind: MediaKind;
29
+ isPublished: boolean;
30
+ isPaused: boolean;
31
+ clientEventEmitter: EnhancedEventEmitter;
32
+ producerId?: string;
33
+ getLabel(): TrackLabel;
34
+ setLabel(label: TrackLabel): void;
35
+ setEncoderConfig(encoderConfig: EncoderConfig): void;
36
+ getEncoderConfig(): EncoderConfig;
37
+ setProducer(producer: Producer): void;
38
+ setStopTrackOnPause(value: boolean): void;
39
+ getProducer(): Producer | undefined;
40
+ stopMediaStreamTrack(): void;
41
+ closeProducer(stopTrack?: boolean): Promise<void>;
42
+ setPriority(priority: RTCPriorityType): Promise<void>;
43
+ produce({
44
+ encodings,
45
+ codecOptions,
46
+ preferredCodec,
47
+ transformParams,
48
+ keyFrameRequestDelay,
49
+ }: TrackProduceParams): Promise<void>;
50
+ publish(): Promise<void>;
51
+ unpublish(): Promise<void>;
52
+ pause(): Promise<void>;
53
+ resume(): Promise<void>;
54
+ getInfo(): Promise<BaseTrackInfo>;
55
+ getStats(): Promise<TrackOutboundStats | undefined>;
56
+ replaceTrack(track: MediaStreamTrack): Promise<void>
57
+ }
58
+
59
+ export interface TrackWithEncodings extends BaseTrack {
60
+ getCodecOptions(): ProducerCodecOptions;
61
+ getEncodings(): RtpEncodingParameters[];
62
+ getPreferredCodec(): string;
63
+ }
64
+
65
+ export interface TrackWithEffects extends BaseTrack {
66
+ isEffectsProcessing: boolean;
67
+ }
68
+
69
+ export interface AudioTrack extends BaseTrack, TrackWithEncodings, TrackWithEffects {
70
+ enableNoiseSuppression(): Promise<void>;
71
+ disableNoiseSuppression(): Promise<void>;
72
+ }
73
+
74
+ export type VideoTrackPublishParams = {
75
+ keyFrameRequestDelay?: number;
76
+ };
77
+
78
+ export interface VideoTrack extends BaseTrack, TrackWithEncodings, TrackWithEffects {
79
+ publish(params?: VideoTrackPublishParams): Promise<void>;
80
+ setTransformParams(transformParams: {}): void;
81
+ setMaxSpatialLayer(spatialLayer: number): Promise<void>;
82
+ getMaxSpatialLayer(): number | undefined;
83
+ enableBlur(): Promise<void>;
84
+ disableBlur(): Promise<void>;
85
+ }
86
+
87
+ export type Track = AudioTrack | VideoTrack;
88
+
89
+ export interface AudioTrackParams extends BaseTrackParams {
90
+ noiseSuppressor?: WebAssembly.WebAssemblyInstantiatedSource;
91
+ }
92
+
93
+ export interface MediaTracksFactory {
94
+ createAudioTrack: (params: AudioTrackParams) => BaseTrack;
95
+ createVideoTrack: (params: BaseTrackParams) => BaseTrack;
96
+ }
@@ -1,3 +1,4 @@
1
+ import { SocketIOEvents } from '../constants/events';
1
2
  import { Role } from './common';
2
3
 
3
4
  export type GetNodeRequest = {
@@ -8,3 +9,26 @@ export type GetNodeRequest = {
8
9
  export type GetNodeResponse = {
9
10
  webSocketUrl: string;
10
11
  };
12
+
13
+ export type JoinChannelRequest = {
14
+ appData?: Record<string, unknown>,
15
+ };
16
+
17
+ export type JoinChannelSuccessResponse = {
18
+ channelId: string;
19
+ appId: string;
20
+ role: string;
21
+ };
22
+
23
+ export type SocketConnectionError = {
24
+ message: string;
25
+ data?: {
26
+ errorCode: string;
27
+ };
28
+ };
29
+
30
+ export type SocketObserverEvent = {
31
+ state: SocketIOEvents;
32
+ code?: string;
33
+ error?: SocketConnectionError;
34
+ };