@livedigital/client 3.48.0 → 3.49.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/LICENSE +1 -1
  2. package/dist/constants/encodings.d.ts +3 -3
  3. package/dist/constants/encodings.ts +3 -3
  4. package/dist/engine/handlers/ChannelAudioObserverEventHandler.d.ts +3 -1
  5. package/dist/engine/handlers/ChannelAudioObserverMissingProducerRestorer.d.ts +10 -0
  6. package/dist/engine/handlers/MediaEventHandler.d.ts +0 -1
  7. package/dist/engine/index.d.ts +7 -4
  8. package/dist/engine/network/DatachannelHeartbeater.d.ts +2 -2
  9. package/dist/engine/network/NetworkTransportPolicyManager.d.ts +22 -0
  10. package/dist/engine/network/index.d.ts +10 -8
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.es.js +2 -2
  13. package/dist/index.js +2 -2
  14. package/dist/inversify.tokens.d.ts +3 -1
  15. package/dist/types/network.d.ts +6 -6
  16. package/package.json +2 -3
  17. package/src/ClientMetaProvider.ts +0 -41
  18. package/src/EnhancedEventEmitter.ts +0 -75
  19. package/src/config/ConfigService.ts +0 -66
  20. package/src/constants/common.ts +0 -85
  21. package/src/constants/encodings.ts +0 -26
  22. package/src/constants/events.ts +0 -126
  23. package/src/constants/mutex.ts +0 -6
  24. package/src/constants/stats.ts +0 -1
  25. package/src/constants/videoConstrains.ts +0 -21
  26. package/src/engine/CallState.ts +0 -19
  27. package/src/engine/ChannelStateSynchronizer/ChannelStateSynchronizer.ts +0 -448
  28. package/src/engine/ChannelStateSynchronizer/types.ts +0 -22
  29. package/src/engine/EventsQueue.ts +0 -255
  30. package/src/engine/IntegrationsService.ts +0 -163
  31. package/src/engine/LocalMutex.ts +0 -45
  32. package/src/engine/Logger.ts +0 -234
  33. package/src/engine/MyPeer.ts +0 -25
  34. package/src/engine/Peer.ts +0 -602
  35. package/src/engine/PeerConsumer.ts +0 -276
  36. package/src/engine/PeerProducer.ts +0 -50
  37. package/src/engine/Peers.ts +0 -150
  38. package/src/engine/PeersStorage.ts +0 -45
  39. package/src/engine/RemotePeerTracks.ts +0 -73
  40. package/src/engine/WIDHandler.ts +0 -166
  41. package/src/engine/WebRTCStats/ConnectionStatsManager.ts +0 -31
  42. package/src/engine/WebRTCStats/InboundTrackStatsManager.ts +0 -51
  43. package/src/engine/WebRTCStats/OutboudTrackStatsManager.ts +0 -51
  44. package/src/engine/WebRTCStats/StatsHandler.ts +0 -80
  45. package/src/engine/WebRTCStats/TransportsStatsProvider.ts +0 -123
  46. package/src/engine/WebRTCStats/types.ts +0 -20
  47. package/src/engine/analyticsApiClient/LogApi.ts +0 -24
  48. package/src/engine/analyticsApiClient/MetricsApi.ts +0 -30
  49. package/src/engine/analyticsApiClient/helper.ts +0 -88
  50. package/src/engine/analyticsApiClient/index.ts +0 -42
  51. package/src/engine/analyticsApiClient/types.ts +0 -33
  52. package/src/engine/handlers/ChannelAudioObserverEventHandler.ts +0 -177
  53. package/src/engine/handlers/ChannelEventHandler.ts +0 -268
  54. package/src/engine/handlers/ChannelStateSyncEventHandler/ChannelStateConsistencyCheckResult.ts +0 -31
  55. package/src/engine/handlers/ChannelStateSyncEventHandler/ChannelStateConsistencyChecker.ts +0 -146
  56. package/src/engine/handlers/ChannelStateSyncEventHandler/consts.ts +0 -7
  57. package/src/engine/handlers/ChannelStateSyncEventHandler/index.ts +0 -342
  58. package/src/engine/handlers/ChannelStateSyncEventHandler/types.ts +0 -21
  59. package/src/engine/handlers/MediaEventHandler.ts +0 -273
  60. package/src/engine/index.ts +0 -793
  61. package/src/engine/media/index.ts +0 -574
  62. package/src/engine/media/producer/PendingClosureProducerStorage.ts +0 -37
  63. package/src/engine/media/producer/ProducerCloseManager.ts +0 -115
  64. package/src/engine/media/streamEffects/ProcessorsCache.ts +0 -41
  65. package/src/engine/media/streamEffects/audio/AudioTrackProcessor.ts +0 -7
  66. package/src/engine/media/streamEffects/audio/asdk/ASDKTrackProcessor.ts +0 -275
  67. package/src/engine/media/streamEffects/audio/asdk/atsrb.d.ts +0 -36
  68. package/src/engine/media/streamEffects/audio/asdk/errorBus.d.ts +0 -47
  69. package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionAudioWorkletNode.ts +0 -35
  70. package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionNodeProvider.ts +0 -44
  71. package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionScriptProcessorNode.ts +0 -69
  72. package/src/engine/media/streamEffects/audio/noiseSuppression/RNNoiseTrackProcessor.ts +0 -134
  73. package/src/engine/media/streamEffects/audio/noiseSuppression/WasmModuleCompiler.ts +0 -9
  74. package/src/engine/media/streamEffects/video/esdk/TrackProcessor.ts +0 -386
  75. package/src/engine/media/streamEffects/video/esdk/components/component.d.ts +0 -35
  76. package/src/engine/media/streamEffects/video/esdk/components/countdown/countdown.d.ts +0 -27
  77. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/doubleSlideRect.d.ts +0 -33
  78. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/horizontalMirror.d.ts +0 -29
  79. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/leftTextbox.d.ts +0 -31
  80. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/slideBold.d.ts +0 -41
  81. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/twoSideRects/animatedBox.d.ts +0 -59
  82. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/twoSideRects/twoSlideRects.d.ts +0 -27
  83. package/src/engine/media/streamEffects/video/esdk/components/lower-third/lowerThird.d.ts +0 -83
  84. package/src/engine/media/streamEffects/video/esdk/components/overlay-screen/overlayScreen.d.ts +0 -40
  85. package/src/engine/media/streamEffects/video/esdk/components/overlay-screen/overlaySprite.d.ts +0 -10
  86. package/src/engine/media/streamEffects/video/esdk/components/stickers/stickerSprite.d.ts +0 -51
  87. package/src/engine/media/streamEffects/video/esdk/components/stickers/stickers.d.ts +0 -54
  88. package/src/engine/media/streamEffects/video/esdk/components/utils/positionHelper.d.ts +0 -14
  89. package/src/engine/media/streamEffects/video/esdk/components/waterMark/waterMark.d.ts +0 -20
  90. package/src/engine/media/streamEffects/video/esdk/tsvb.d.ts +0 -187
  91. package/src/engine/media/streamEffects/video/esdk/utils/errorBus.d.ts +0 -42
  92. package/src/engine/media/tracks/DefaultAudioTrack.ts +0 -178
  93. package/src/engine/media/tracks/DefaultBaseTrack.ts +0 -592
  94. package/src/engine/media/tracks/DefaultVideoTrack.ts +0 -301
  95. package/src/engine/media/tracks/MediaStreamTrackManager.ts +0 -50
  96. package/src/engine/media/tracks/PeerTrack.ts +0 -558
  97. package/src/engine/network/DataChannelsManager.ts +0 -164
  98. package/src/engine/network/DatachannelHeartbeater.ts +0 -122
  99. package/src/engine/network/SignalingHeartbeater.ts +0 -55
  100. package/src/engine/network/index.ts +0 -961
  101. package/src/engine/signalingApiClient/SignalingApiClient.ts +0 -95
  102. package/src/engine/signalingApiClient/api.ts +0 -2289
  103. package/src/engine/system/index.ts +0 -221
  104. package/src/errors/AlreadyConnectedError.ts +0 -11
  105. package/src/errors/AlreadyCreatedError.ts +0 -11
  106. package/src/errors/ForbiddenError.ts +0 -11
  107. package/src/errors/InvalidPayloadError.ts +0 -11
  108. package/src/errors/InvalidRequestError.ts +0 -11
  109. package/src/errors/LivedigitalSDKError.ts +0 -15
  110. package/src/errors/NeedJoinFirstError.ts +0 -11
  111. package/src/errors/NotFoundError.ts +0 -11
  112. package/src/errors/OperationError.ts +0 -47
  113. package/src/errors/RequestError.ts +0 -11
  114. package/src/errors/TimeoutError.ts +0 -11
  115. package/src/errors/TooManyRequestsError.ts +0 -11
  116. package/src/errors/UnauthorizedError.ts +0 -11
  117. package/src/errors/UnsupportedError.ts +0 -15
  118. package/src/errors/signalingApiErrorMapper.ts +0 -143
  119. package/src/helpers/appDataValidator.ts +0 -21
  120. package/src/helpers/browser.ts +0 -37
  121. package/src/helpers/channelMessageConverter.ts +0 -124
  122. package/src/helpers/common.ts +0 -96
  123. package/src/helpers/datetime.ts +0 -11
  124. package/src/helpers/errors.ts +0 -25
  125. package/src/helpers/filterStatsCodecs.ts +0 -3
  126. package/src/helpers/loader.ts +0 -59
  127. package/src/helpers/media.ts +0 -57
  128. package/src/helpers/peer.ts +0 -19
  129. package/src/helpers/randomString.ts +0 -18
  130. package/src/helpers/retry.ts +0 -74
  131. package/src/index.ts +0 -171
  132. package/src/inversify.config.ts +0 -333
  133. package/src/inversify.factories.ts +0 -191
  134. package/src/inversify.tokens.ts +0 -42
  135. package/src/proto/.gitkeep +0 -0
  136. package/src/proto/generated/channel/channel_activity_confirmation_time.ts +0 -110
  137. package/src/proto/generated/channel/channel_management_event.ts +0 -213
  138. package/src/proto/generated/channel/channel_produce_permissions.ts +0 -171
  139. package/src/proto/generated/channel/channel_state.ts +0 -94
  140. package/src/proto/generated/channel/channel_state_short.ts +0 -282
  141. package/src/proto/generated/channel_message/channel_event.ts +0 -401
  142. package/src/proto/generated/channel_message/channel_message.ts +0 -139
  143. package/src/proto/generated/channel_message/media_event.ts +0 -290
  144. package/src/proto/generated/consumer/consumer.ts +0 -167
  145. package/src/proto/generated/google/protobuf/struct.ts +0 -588
  146. package/src/proto/generated/google/protobuf/timestamp.ts +0 -229
  147. package/src/proto/generated/peer/peer.ts +0 -430
  148. package/src/proto/generated/peer/peer_group.ts +0 -48
  149. package/src/proto/generated/peer/peer_role.ts +0 -48
  150. package/src/proto/generated/producer/producer.ts +0 -204
  151. package/src/proto/generated/producer/producer_kind.ts +0 -48
  152. package/src/proto/generated/producer/producer_label.ts +0 -78
  153. package/src/proto/generated/producer/producer_spatial_layer_request.ts +0 -116
  154. package/src/proto/generated/transport/transport_connection_timeout.ts +0 -156
  155. package/src/proto/generated/transport/transport_connection_timeout_reason.ts +0 -48
  156. package/src/proto/generated/transport/transport_direction.ts +0 -48
  157. package/src/types/channelAudioObserver.ts +0 -34
  158. package/src/types/channelStateSyncronizer.ts +0 -22
  159. package/src/types/client.ts +0 -27
  160. package/src/types/common.ts +0 -399
  161. package/src/types/container.ts +0 -31
  162. package/src/types/engine.ts +0 -97
  163. package/src/types/media.ts +0 -146
  164. package/src/types/mediasoup.ts +0 -10
  165. package/src/types/network.ts +0 -10
  166. package/src/types/streamEffects.ts +0 -23
@@ -1,124 +0,0 @@
1
- import type { MediaKind } from 'mediasoup-client/lib/RtpParameters';
2
- import type { PeerGroup, PeerResponse, ProducerData, Role } from '../types/common';
3
- import { TrackLabel } from '../types/common';
4
- import { ProducerLabel } from '../proto/generated/producer/producer_label';
5
- import type { Producer as ChannelMessageProducer } from '../proto/generated/producer/producer';
6
- import type { Peer as ChannelMessagePeer } from '../proto/generated/peer/peer';
7
- import { PeerGroup as ChannelMessagePeerGroup } from '../proto/generated/peer/peer_group';
8
- import { PeerRole as ChannelMessagePeerRole } from '../proto/generated/peer/peer_role';
9
- import { ProducerKind as ChannelMessageProducerKind } from '../proto/generated/producer/producer_kind';
10
-
11
- const producerKindToMediaKindMapping: Partial<Record<ChannelMessageProducerKind, MediaKind>> = {
12
- [ChannelMessageProducerKind.PRODUCER_KIND_VIDEO]: 'video',
13
- [ChannelMessageProducerKind.PRODUCER_KIND_AUDIO]: 'audio',
14
- };
15
-
16
- const channelMessagePeerRoleToPeerRole: Partial<Record<ChannelMessagePeerRole, Role>> = {
17
- [ChannelMessagePeerRole.PEER_ROLE_HOST]: 'host',
18
- [ChannelMessagePeerRole.PEER_ROLE_AUDIENCE]: 'audience',
19
- };
20
-
21
- const producerLabelToTrackLabelMapping: Partial<Record<ProducerLabel, TrackLabel>> = {
22
- [ProducerLabel.PRODUCER_LABEL_CAMERA]: TrackLabel.Camera,
23
- [ProducerLabel.PRODUCER_LABEL_MICROPHONE]: TrackLabel.Microphone,
24
- [ProducerLabel.PRODUCER_LABEL_SCREEN_VIDEO]: TrackLabel.ScreenVideo,
25
- [ProducerLabel.PRODUCER_LABEL_SCREEN_AUDIO]: TrackLabel.ScreenAudio,
26
- [ProducerLabel.PRODUCER_LABEL_CUSTOM_VIDEO]: TrackLabel.CustomVideo,
27
- [ProducerLabel.PRODUCER_LABEL_CUSTOM_AUDIO]: TrackLabel.CustomAudio,
28
- [ProducerLabel.PRODUCER_LABEL_UNKNOWN]: TrackLabel.Unknown,
29
- [ProducerLabel.PRODUCER_LABEL_UNSPECIFIED]: TrackLabel.Unknown,
30
- };
31
-
32
- const channelMessagePeerGroupToPeerGroupMapping: Partial<Record<ChannelMessagePeerGroup, PeerGroup>> = {
33
- [ChannelMessagePeerGroup.PEER_GROUP_MODERATOR]: 'moderator',
34
- [ChannelMessagePeerGroup.PEER_GROUP_USER]: 'user',
35
- };
36
-
37
- export const convertChannelMessageProducerKindToMediaKind =
38
- (producerKind: ChannelMessageProducerKind): MediaKind => {
39
- const mediaKind = producerKindToMediaKindMapping[producerKind];
40
-
41
- if (!mediaKind) {
42
- throw new Error(`Unknown producer kind: ${ producerKind }`);
43
- }
44
-
45
- return mediaKind;
46
- };
47
-
48
- export const convertChannelMessagePeerGroupsToPeerGroups = (
49
- peerGroup: ChannelMessagePeerGroup,
50
- ): PeerGroup => {
51
- const group = channelMessagePeerGroupToPeerGroupMapping[peerGroup];
52
-
53
- if (!group) {
54
- throw new Error(`Unknown peer group: ${ peerGroup }`);
55
- }
56
-
57
- return group;
58
- };
59
-
60
- export const convertChannelMessageProducerLabelsToTrackLabels = (
61
- producerLabel: ProducerLabel,
62
- ): TrackLabel => {
63
- const label = producerLabelToTrackLabelMapping[producerLabel];
64
-
65
- if (!label) {
66
- throw new Error(`Unknown producer label: ${ producerLabel }`);
67
- }
68
-
69
- return label;
70
- };
71
-
72
- export const convertChannelMessagePeerRoleToRole = (peerRole: ChannelMessagePeerRole): Role => {
73
- const role = channelMessagePeerRoleToPeerRole[peerRole];
74
-
75
- if (!role) {
76
- throw new Error(`Unknown peer role: ${ peerRole }`);
77
- }
78
-
79
- return role;
80
- };
81
-
82
- export const convertChannelMessagePeerToPeerResponse = (
83
- peer: ChannelMessagePeer,
84
- ): PeerResponse => {
85
- return {
86
- id: peer.id,
87
- channelIds: peer.channelIds,
88
- groups: peer.groups.map(convertChannelMessagePeerGroupsToPeerGroups),
89
- producePermissions: peer.producePermissions.map(convertChannelMessageProducerLabelsToTrackLabels),
90
- appId: peer.appId,
91
- producers: peer.producers.map(convertChannelMessageProducerToProducerData),
92
- uid: peer.uid,
93
- appData: peer.appData,
94
- role: convertChannelMessagePeerRoleToRole(peer.role),
95
- loginDate: peer.loginDate as unknown as Date,
96
- };
97
- };
98
-
99
- export const convertChannelMessageProducerToProducerData = (
100
- producer: ChannelMessageProducer,
101
- ): ProducerData => {
102
- return {
103
- id: producer.id,
104
- kind: convertChannelMessageProducerKindToMediaKind(producer.kind),
105
- label: convertChannelMessageProducerLabelsToTrackLabels(producer.label),
106
- peerId: producer.peerId,
107
- paused: producer.paused,
108
- encodings: producer.encodings as unknown as ProducerData['encodings'],
109
- maxSpatialLayer: producer.maxSpatialLayer ?? 0,
110
- };
111
- };
112
-
113
- export const convertPeerGroupsToChannelMessagePeerGroups = (
114
- peerGroup: PeerGroup,
115
- ): ChannelMessagePeerGroup => {
116
- switch (peerGroup) {
117
- case 'moderator':
118
- return ChannelMessagePeerGroup.PEER_GROUP_MODERATOR;
119
- case 'user':
120
- return ChannelMessagePeerGroup.PEER_GROUP_USER;
121
- default:
122
- return ChannelMessagePeerGroup.PEER_GROUP_UNSPECIFIED;
123
- }
124
- };
@@ -1,96 +0,0 @@
1
- import { LogLevels } from '../constants/common';
2
- import type { LogLevel } from '../types/common';
3
-
4
- declare global {
5
- interface Window {
6
- _sdkMarks: Set<string>;
7
- }
8
- }
9
-
10
- type PlainObject = Record<string, unknown>;
11
-
12
- export function isObject(value: unknown): value is PlainObject {
13
- return typeof value === 'object' && value !== null && !Array.isArray(value);
14
- }
15
-
16
- export function deepEqualObject(object1: PlainObject, object2: PlainObject): boolean {
17
- const keysOfObject1 = Object.keys(object1);
18
- const keysObObject2 = Object.keys(object2);
19
-
20
- if (keysOfObject1.length !== keysObObject2.length) {
21
- return false;
22
- }
23
-
24
- let isEquals = true;
25
-
26
- keysOfObject1.forEach((key) => {
27
- const object1Element = object1[key];
28
- const object2Element = object2[key];
29
- const areObjects = isObject(object1Element) && isObject(object2Element);
30
-
31
- const isObjectAndNotEquals = areObjects && !deepEqualObject(object1Element, object2Element);
32
- const isNotObjectAndNotEquals = !areObjects && (object1Element !== object2Element);
33
-
34
- if (isObjectAndNotEquals || isNotObjectAndNotEquals) {
35
- isEquals = false;
36
- }
37
- });
38
-
39
- return isEquals;
40
- };
41
-
42
- export function debounce<T extends(...args: never[]) => Promise<void>>(callback: T, delay: number, immediate = false) {
43
- let timeout: ReturnType<typeof setTimeout> | null = null;
44
-
45
- return async function debounced(this: unknown, ...args: Parameters<typeof callback>): Promise<void> {
46
- const later = async (): Promise<void> => {
47
- timeout = null;
48
-
49
- if (!immediate) {
50
- await callback.apply(this, args);
51
- }
52
- };
53
-
54
- const callNow = immediate && !timeout;
55
-
56
- if (typeof timeout === 'number') {
57
- clearTimeout(timeout);
58
- }
59
-
60
- timeout = setTimeout(later, delay);
61
-
62
- if (callNow) {
63
- await callback.apply(this, args);
64
- }
65
- };
66
- }
67
-
68
- export function prepareLogLevel(level?: LogLevel): LogLevel {
69
- return level ?? LogLevels.Error;
70
- }
71
-
72
- export function isAnalyticsActive(flag?: boolean): boolean {
73
- return flag ?? true;
74
- }
75
-
76
- export function markSDKInstance(mark: string): void {
77
- window._sdkMarks ||= new Set<string>();
78
- window._sdkMarks.add(mark);
79
- }
80
-
81
- export function getSDKInstancesMarks(): string[] {
82
- return Array.from(window._sdkMarks || []);
83
- }
84
-
85
- export async function safeCall<T>(
86
- handler: () => Promise<T>,
87
- onError?: (error: unknown) => void,
88
- ): Promise<T | undefined> {
89
- try {
90
- return await handler();
91
- } catch (error) {
92
- onError?.(error);
93
-
94
- return undefined;
95
- }
96
- }
@@ -1,11 +0,0 @@
1
- class DefaultTimeProvider {
2
- async sleepMs(ms: number): Promise<void> {
3
- await new Promise((resolve) => setTimeout(resolve, ms));
4
- }
5
-
6
- now(): Date {
7
- return new Date(Date.now());
8
- }
9
- }
10
-
11
- export default DefaultTimeProvider;
@@ -1,25 +0,0 @@
1
- export const hasStringMessage = (value: unknown): value is { message: string } => {
2
- if (!value || typeof value !== 'object') {
3
- return false;
4
- }
5
-
6
- const { message } = (value as Record<string, unknown>);
7
-
8
- return typeof message === 'string';
9
- };
10
-
11
- export const getErrorMessage = (err: unknown): string | undefined => {
12
- if (err instanceof Error) {
13
- return err.message;
14
- }
15
-
16
- if (typeof err === 'string') {
17
- return err;
18
- }
19
-
20
- if (hasStringMessage(err)) {
21
- return err.message;
22
- }
23
-
24
- return undefined;
25
- };
@@ -1,3 +0,0 @@
1
- const filterStatsCodecs = (codec: RTCRtpCodecParameters): boolean => codec.mimeType !== 'rtx';
2
-
3
- export default filterStatsCodecs;
@@ -1,59 +0,0 @@
1
- import loadScript from 'load-script';
2
- import DefaultTimeProvider from './datetime';
3
-
4
- const timeProvider = new DefaultTimeProvider();
5
- const MAX_RETRIES_DEFAULT = 3;
6
- const RETRY_DELAY_DEFAULT = 500;
7
-
8
- export const asyncLoadScript = async (
9
- url: string,
10
- ): Promise<HTMLScriptElement> => await new Promise((resolve, reject) => {
11
- loadScript(
12
- url,
13
- (err: Error | null, script: HTMLScriptElement) => {
14
- if (err) {
15
- reject(err);
16
-
17
- return;
18
- }
19
-
20
- resolve(script);
21
- },
22
- );
23
- });
24
-
25
- export const loadScriptWithRetries = async (
26
- url: string,
27
- maxRetries = MAX_RETRIES_DEFAULT,
28
- retryDelayMs = RETRY_DELAY_DEFAULT,
29
- ): Promise<void> => {
30
- let retries = 0;
31
-
32
- while (retries < maxRetries) {
33
- try {
34
- await asyncLoadScript(url);
35
-
36
- return;
37
- } catch (error) {
38
- retries += 1;
39
-
40
- if (retries < maxRetries) {
41
- await timeProvider.sleepMs(retryDelayMs);
42
- } else {
43
- throw error;
44
- }
45
- }
46
- }
47
- };
48
-
49
- export const loadScriptWithFallback = async (mainUrl: string, fallbackUrl?: string): Promise<void> => {
50
- try {
51
- await loadScriptWithRetries(mainUrl);
52
- } catch (error) {
53
- if (!fallbackUrl) {
54
- throw error;
55
- }
56
-
57
- await loadScriptWithRetries(fallbackUrl);
58
- }
59
- };
@@ -1,57 +0,0 @@
1
- import type { Device, types } from 'mediasoup-client';
2
- import Bowser from 'bowser';
3
-
4
- export const detectHandlerName = (userAgent?: string): types.BuiltinHandlerName | undefined => {
5
- const ua = userAgent ?? navigator?.userAgent;
6
-
7
- if (!ua) {
8
- return undefined;
9
- }
10
-
11
- const browser = Bowser.getParser(ua);
12
-
13
- if (browser.satisfies({ 'yandex browser': '>=25' }) && browser.getOSName() === 'iOS') {
14
- return undefined;
15
- }
16
-
17
- if (browser.satisfies({ 'yandex browser': '>=23.7' })) {
18
- return 'Chrome111';
19
- }
20
-
21
- if (browser.satisfies({ 'yandex browser': '>=22' })) {
22
- return 'Chrome74';
23
- }
24
-
25
- if (browser.satisfies({ 'Samsung Internet for Android': '>=17' })) {
26
- return 'Chrome111';
27
- }
28
-
29
- return undefined;
30
- };
31
-
32
- export const getNewAudioContext = (contextOptions?: AudioContextOptions): AudioContext | null => {
33
- const Context = window.AudioContext // Default
34
- || (window as unknown as { webkitAudioContext: unknown }).webkitAudioContext // Safari and old versions of Chrome
35
- || false;
36
-
37
- if (Context) {
38
- return new Context(contextOptions);
39
- }
40
-
41
- return null;
42
- };
43
-
44
- export const getSupportedCodecsMimeTypes = (device: Device): string[] => device
45
- .rtpCapabilities
46
- .codecs
47
- ?.reduce((acc: string[], codec: types.RtpCodecCapability) => {
48
- const preparedCodec = codec.mimeType?.toLowerCase();
49
-
50
- if (preparedCodec && !acc.includes(preparedCodec)) {
51
- acc.push(preparedCodec);
52
- }
53
-
54
- return acc;
55
- }, []) ?? [];
56
-
57
- export const isVp9 = (codecOrMimeType: string): boolean => ['video/vp9', 'vp9'].includes(codecOrMimeType.toLowerCase());
@@ -1,19 +0,0 @@
1
- import type Peer from '../engine/Peer';
2
-
3
- interface PeerLogResponse {
4
- id: Peer['id'];
5
- appId: Peer['appId'];
6
- role: Peer['role'];
7
- groups: Peer['groups'];
8
- producePermissions: Peer['producePermissions'];
9
- }
10
-
11
- export function logResponse(peer: Peer): PeerLogResponse {
12
- return {
13
- id: peer.id,
14
- appId: peer.appId,
15
- role: peer.role,
16
- groups: peer.groups,
17
- producePermissions: peer.producePermissions,
18
- };
19
- }
@@ -1,18 +0,0 @@
1
- // eslint-disable-next-line
2
- const hexLUT: string[] = Array.from({ length: 256 }, (_, i) => (i + 256).toString(16).slice(1));
3
-
4
- const RANDOM_STR_LENGTH = 24;
5
-
6
- export function randomString(len: number = RANDOM_STR_LENGTH): string {
7
- const buf = new Uint8Array(len);
8
- crypto.getRandomValues(buf);
9
-
10
- let result = '';
11
-
12
- // eslint-disable-next-line
13
- for (let i = 0; i < buf.length; i++) {
14
- result += hexLUT[buf[i]];
15
- }
16
-
17
- return result;
18
- }
@@ -1,74 +0,0 @@
1
- import { serializeError } from 'serialize-error';
2
- import DefaultTimeProvider from './datetime';
3
- import type Logger from '../engine/Logger';
4
-
5
- export interface RetryOpts {
6
- maxRetries?: number;
7
- minBackoffDelayMs?: number;
8
- maxBackoffDelayMs?: number;
9
- actionName?: string; // human-readable action name for debug purposes
10
- logger?: Logger;
11
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
- abortOnError?: (error: any) => boolean;
13
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
- onError?: (error: any) => Promise<void>;
15
- }
16
-
17
- const timeProvider = new DefaultTimeProvider();
18
-
19
- const MAX_RETRIES_DEFAULT = 2;
20
- const BACKOFF_DELAY_DEFAULT = 50;
21
- const RETRY_DELAY_FACTOR = 2;
22
-
23
- const retryAsync = async <ReturnType>(
24
- action: () => Promise<ReturnType>,
25
- opts: RetryOpts = {},
26
- ): Promise<ReturnType> => {
27
- const maxRetries = opts.maxRetries ?? MAX_RETRIES_DEFAULT;
28
- const minBackoffDelayMs = opts.minBackoffDelayMs ?? BACKOFF_DELAY_DEFAULT;
29
- let currentAttempt = 0;
30
- let lastError: Error | undefined = undefined;
31
-
32
- while (currentAttempt < maxRetries) {
33
- currentAttempt += 1;
34
-
35
- try {
36
- return await action();
37
- } catch (err: unknown) {
38
- lastError = err as Error;
39
-
40
- if (opts.logger) {
41
- opts.logger.info('Action retry failed', {
42
- currentAttempt,
43
- actionName: opts.actionName,
44
- error: serializeError(err),
45
- });
46
- }
47
-
48
- if (opts.abortOnError?.(err)) {
49
- throw lastError;
50
- }
51
-
52
- if (opts.onError) {
53
- await opts.onError(err);
54
- }
55
-
56
- if (currentAttempt < maxRetries) {
57
- const delay = RETRY_DELAY_FACTOR ** (currentAttempt - 1) * minBackoffDelayMs;
58
-
59
- await timeProvider.sleepMs(Math.min(delay, opts.maxBackoffDelayMs ?? delay));
60
- }
61
- }
62
- }
63
-
64
- throw lastError ?? new Error('retryAsync logic failed');
65
- };
66
-
67
- const retry = async <ReturnType extends () => ReturnType>(
68
- action: () => ReturnType,
69
- opts: RetryOpts = {},
70
- // eslint-disable-next-line @typescript-eslint/require-await
71
- ): Promise<ReturnType> => await retryAsync(async () => action(), opts);
72
-
73
- export { retryAsync };
74
- export default retry;
package/src/index.ts DELETED
@@ -1,171 +0,0 @@
1
- import 'reflect-metadata';
2
- import ConfigService from './config/ConfigService';
3
- import type Engine from './engine';
4
- import type { IntegrationsService } from './engine/IntegrationsService';
5
- import type Peer from './engine/Peer';
6
- import type { TransportsWebRTCStats } from './engine/WebRTCStats/types';
7
- import EnhancedEventEmitter from './EnhancedEventEmitter';
8
- import OperationError from './errors/OperationError';
9
- import { container } from './inversify.config';
10
- import { TOKEN } from './inversify.tokens';
11
- import type { ClientParams } from './types/client';
12
- import type {
13
- AvailableMediaDevices,
14
- CreateCameraVideoTrackOptions,
15
- CreateCustomAudioOptions,
16
- CreateCustomVideoOptions,
17
- CreateMicrophoneAudioTrackOptions,
18
- CreateScreenMediaOptions,
19
- JoinChannelParams,
20
- Role,
21
- TransportsStateInfo,
22
- } from './types/common';
23
- import type { ClientObserverEvents } from './types/engine';
24
- import type { AudioTrack, Track, VideoTrack } from './types/media';
25
-
26
- class Client {
27
- readonly #engine: Engine;
28
-
29
- private readonly clientEventEmitter: EnhancedEventEmitter;
30
-
31
- readonly canUseNoiseSuppression = true;
32
-
33
- constructor(params: ClientParams) {
34
- const { clientEventEmitter, internalEventEmitter } = params;
35
-
36
- container
37
- .bind<ConfigService>(TOKEN.Config)
38
- .toDynamicValue(() => new ConfigService(params))
39
- .inSingletonScope();
40
-
41
- container
42
- .bind<EnhancedEventEmitter>(TOKEN.InternalEventEmitter)
43
- .toDynamicValue(() => internalEventEmitter ?? new EnhancedEventEmitter())
44
- .inSingletonScope();
45
-
46
- container
47
- .bind<EnhancedEventEmitter>(TOKEN.ClientEventEmitter)
48
- .toDynamicValue(() => clientEventEmitter ?? new EnhancedEventEmitter())
49
- .inSingletonScope();
50
-
51
- container.get<IntegrationsService>(TOKEN.IntegrationsService); // instantiate service
52
-
53
- this.clientEventEmitter = container.get<EnhancedEventEmitter>(TOKEN.ClientEventEmitter);
54
-
55
- this.#engine = container.get<Engine>(TOKEN.Engine);
56
- }
57
-
58
- get observer(): EnhancedEventEmitter<ClientObserverEvents> {
59
- return this.clientEventEmitter;
60
- }
61
-
62
- get id(): string | undefined {
63
- return this.#engine.myPeerId;
64
- }
65
-
66
- get peers(): Peer[] {
67
- return this.#engine.getPeers();
68
- }
69
-
70
- get availableVideoDevices(): MediaDeviceInfo[] {
71
- return this.#engine.system.availableVideoDevices;
72
- }
73
-
74
- get availableAudioDevices(): MediaDeviceInfo[] {
75
- return this.#engine.system.availableAudioDevices;
76
- }
77
-
78
- get effectsSDKInitialized(): boolean {
79
- return this.#engine.media.effectsSDKInitialized;
80
- }
81
-
82
- async detectDevices(force?: boolean): Promise<AvailableMediaDevices> {
83
- try {
84
- await this.#engine.system.detectDevices(force);
85
- } catch (error) {
86
- const errorCode = error instanceof Error ? error.message : 'detect_devices_failed';
87
- throw new OperationError(errorCode, error);
88
- }
89
-
90
- return {
91
- video: this.#engine.system.availableVideoDevices,
92
- audio: this.#engine.system.availableAudioDevices,
93
- };
94
- }
95
-
96
- async initEffectsSDK(): Promise<boolean> {
97
- return await this.#engine.media.initEffectsSDK();
98
- }
99
-
100
- async join(params: JoinChannelParams): Promise<void> {
101
- await this.#engine.join(params);
102
- }
103
-
104
- async leave(keepTracks?: boolean): Promise<void> {
105
- await this.#engine.release(keepTracks);
106
- }
107
-
108
- async confirmActivity(): Promise<void> {
109
- await this.#engine.confirmActivity();
110
- }
111
-
112
- async createCameraVideoTrack(options?: CreateCameraVideoTrackOptions): Promise<VideoTrack> {
113
- return await this.#engine.createCameraVideoTrack(options);
114
- }
115
-
116
- async createMicrophoneAudioTrack(
117
- options?: CreateMicrophoneAudioTrackOptions,
118
- ): Promise<AudioTrack> {
119
- return await this.#engine.createMicrophoneAudioTrack(options);
120
- }
121
-
122
- async createScreenMediaTracks(options?: CreateScreenMediaOptions): Promise<Track[]> {
123
- return await this.#engine.createScreenMediaTracks(options);
124
- }
125
-
126
- createCustomAudioTrack(options: CreateCustomAudioOptions): Track {
127
- return this.#engine.createCustomAudioTrack(options);
128
- }
129
-
130
- createCustomVideoTrack(options: CreateCustomVideoOptions): Track {
131
- return this.#engine.createCustomVideoTrack(options);
132
- }
133
-
134
- async deleteTrack(track: Track): Promise<void> {
135
- await this.#engine.deleteTrack(track);
136
- }
137
-
138
- async loadPeers(role?: Role): Promise<void> {
139
- await this.#engine.loadPeers(role);
140
- }
141
-
142
- requestChannelStateSync(): void {
143
- this.#engine.requestChannelStateSync();
144
- }
145
-
146
- async updateAppData(appData: Record<string, unknown>): Promise<void> {
147
- await this.#engine.updateAppData(appData);
148
- }
149
-
150
- public async getTransportsInfo(): Promise<TransportsStateInfo> {
151
- return await this.#engine.network.getTransportsStateInfo();
152
- }
153
-
154
- public setPreferRelay(value: boolean): void {
155
- this.#engine.network.setPreferRelay(value);
156
- }
157
-
158
- public getPreferRelay(): boolean {
159
- return this.#engine.network.getPreferRelay();
160
- }
161
-
162
- public transportsStats(): TransportsWebRTCStats | undefined {
163
- return this.#engine.transportsStats();
164
- }
165
-
166
- public setSignalingServerUrl(url: string): void {
167
- this.#engine.setSignalingServerUrl(url);
168
- }
169
- }
170
-
171
- export default Client;