@livedigital/client 3.48.0 → 3.49.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 (165) hide show
  1. package/dist/constants/encodings.d.ts +3 -3
  2. package/dist/constants/encodings.ts +3 -3
  3. package/dist/engine/handlers/ChannelAudioObserverEventHandler.d.ts +3 -1
  4. package/dist/engine/handlers/ChannelAudioObserverMissingProducerRestorer.d.ts +10 -0
  5. package/dist/engine/handlers/MediaEventHandler.d.ts +0 -1
  6. package/dist/engine/index.d.ts +7 -4
  7. package/dist/engine/network/DatachannelHeartbeater.d.ts +2 -2
  8. package/dist/engine/network/NetworkTransportPolicyManager.d.ts +22 -0
  9. package/dist/engine/network/index.d.ts +10 -8
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.es.js +2 -2
  12. package/dist/index.js +2 -2
  13. package/dist/inversify.tokens.d.ts +3 -1
  14. package/dist/types/network.d.ts +6 -6
  15. package/package.json +2 -3
  16. package/src/ClientMetaProvider.ts +0 -41
  17. package/src/EnhancedEventEmitter.ts +0 -75
  18. package/src/config/ConfigService.ts +0 -66
  19. package/src/constants/common.ts +0 -85
  20. package/src/constants/encodings.ts +0 -26
  21. package/src/constants/events.ts +0 -126
  22. package/src/constants/mutex.ts +0 -6
  23. package/src/constants/stats.ts +0 -1
  24. package/src/constants/videoConstrains.ts +0 -21
  25. package/src/engine/CallState.ts +0 -19
  26. package/src/engine/ChannelStateSynchronizer/ChannelStateSynchronizer.ts +0 -448
  27. package/src/engine/ChannelStateSynchronizer/types.ts +0 -22
  28. package/src/engine/EventsQueue.ts +0 -255
  29. package/src/engine/IntegrationsService.ts +0 -163
  30. package/src/engine/LocalMutex.ts +0 -45
  31. package/src/engine/Logger.ts +0 -234
  32. package/src/engine/MyPeer.ts +0 -25
  33. package/src/engine/Peer.ts +0 -602
  34. package/src/engine/PeerConsumer.ts +0 -276
  35. package/src/engine/PeerProducer.ts +0 -50
  36. package/src/engine/Peers.ts +0 -150
  37. package/src/engine/PeersStorage.ts +0 -45
  38. package/src/engine/RemotePeerTracks.ts +0 -73
  39. package/src/engine/WIDHandler.ts +0 -166
  40. package/src/engine/WebRTCStats/ConnectionStatsManager.ts +0 -31
  41. package/src/engine/WebRTCStats/InboundTrackStatsManager.ts +0 -51
  42. package/src/engine/WebRTCStats/OutboudTrackStatsManager.ts +0 -51
  43. package/src/engine/WebRTCStats/StatsHandler.ts +0 -80
  44. package/src/engine/WebRTCStats/TransportsStatsProvider.ts +0 -123
  45. package/src/engine/WebRTCStats/types.ts +0 -20
  46. package/src/engine/analyticsApiClient/LogApi.ts +0 -24
  47. package/src/engine/analyticsApiClient/MetricsApi.ts +0 -30
  48. package/src/engine/analyticsApiClient/helper.ts +0 -88
  49. package/src/engine/analyticsApiClient/index.ts +0 -42
  50. package/src/engine/analyticsApiClient/types.ts +0 -33
  51. package/src/engine/handlers/ChannelAudioObserverEventHandler.ts +0 -177
  52. package/src/engine/handlers/ChannelEventHandler.ts +0 -268
  53. package/src/engine/handlers/ChannelStateSyncEventHandler/ChannelStateConsistencyCheckResult.ts +0 -31
  54. package/src/engine/handlers/ChannelStateSyncEventHandler/ChannelStateConsistencyChecker.ts +0 -146
  55. package/src/engine/handlers/ChannelStateSyncEventHandler/consts.ts +0 -7
  56. package/src/engine/handlers/ChannelStateSyncEventHandler/index.ts +0 -342
  57. package/src/engine/handlers/ChannelStateSyncEventHandler/types.ts +0 -21
  58. package/src/engine/handlers/MediaEventHandler.ts +0 -273
  59. package/src/engine/index.ts +0 -793
  60. package/src/engine/media/index.ts +0 -574
  61. package/src/engine/media/producer/PendingClosureProducerStorage.ts +0 -37
  62. package/src/engine/media/producer/ProducerCloseManager.ts +0 -115
  63. package/src/engine/media/streamEffects/ProcessorsCache.ts +0 -41
  64. package/src/engine/media/streamEffects/audio/AudioTrackProcessor.ts +0 -7
  65. package/src/engine/media/streamEffects/audio/asdk/ASDKTrackProcessor.ts +0 -275
  66. package/src/engine/media/streamEffects/audio/asdk/atsrb.d.ts +0 -36
  67. package/src/engine/media/streamEffects/audio/asdk/errorBus.d.ts +0 -47
  68. package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionAudioWorkletNode.ts +0 -35
  69. package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionNodeProvider.ts +0 -44
  70. package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionScriptProcessorNode.ts +0 -69
  71. package/src/engine/media/streamEffects/audio/noiseSuppression/RNNoiseTrackProcessor.ts +0 -134
  72. package/src/engine/media/streamEffects/audio/noiseSuppression/WasmModuleCompiler.ts +0 -9
  73. package/src/engine/media/streamEffects/video/esdk/TrackProcessor.ts +0 -386
  74. package/src/engine/media/streamEffects/video/esdk/components/component.d.ts +0 -35
  75. package/src/engine/media/streamEffects/video/esdk/components/countdown/countdown.d.ts +0 -27
  76. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/doubleSlideRect.d.ts +0 -33
  77. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/horizontalMirror.d.ts +0 -29
  78. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/leftTextbox.d.ts +0 -31
  79. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/slideBold.d.ts +0 -41
  80. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/twoSideRects/animatedBox.d.ts +0 -59
  81. package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/twoSideRects/twoSlideRects.d.ts +0 -27
  82. package/src/engine/media/streamEffects/video/esdk/components/lower-third/lowerThird.d.ts +0 -83
  83. package/src/engine/media/streamEffects/video/esdk/components/overlay-screen/overlayScreen.d.ts +0 -40
  84. package/src/engine/media/streamEffects/video/esdk/components/overlay-screen/overlaySprite.d.ts +0 -10
  85. package/src/engine/media/streamEffects/video/esdk/components/stickers/stickerSprite.d.ts +0 -51
  86. package/src/engine/media/streamEffects/video/esdk/components/stickers/stickers.d.ts +0 -54
  87. package/src/engine/media/streamEffects/video/esdk/components/utils/positionHelper.d.ts +0 -14
  88. package/src/engine/media/streamEffects/video/esdk/components/waterMark/waterMark.d.ts +0 -20
  89. package/src/engine/media/streamEffects/video/esdk/tsvb.d.ts +0 -187
  90. package/src/engine/media/streamEffects/video/esdk/utils/errorBus.d.ts +0 -42
  91. package/src/engine/media/tracks/DefaultAudioTrack.ts +0 -178
  92. package/src/engine/media/tracks/DefaultBaseTrack.ts +0 -592
  93. package/src/engine/media/tracks/DefaultVideoTrack.ts +0 -301
  94. package/src/engine/media/tracks/MediaStreamTrackManager.ts +0 -50
  95. package/src/engine/media/tracks/PeerTrack.ts +0 -558
  96. package/src/engine/network/DataChannelsManager.ts +0 -164
  97. package/src/engine/network/DatachannelHeartbeater.ts +0 -122
  98. package/src/engine/network/SignalingHeartbeater.ts +0 -55
  99. package/src/engine/network/index.ts +0 -961
  100. package/src/engine/signalingApiClient/SignalingApiClient.ts +0 -95
  101. package/src/engine/signalingApiClient/api.ts +0 -2289
  102. package/src/engine/system/index.ts +0 -221
  103. package/src/errors/AlreadyConnectedError.ts +0 -11
  104. package/src/errors/AlreadyCreatedError.ts +0 -11
  105. package/src/errors/ForbiddenError.ts +0 -11
  106. package/src/errors/InvalidPayloadError.ts +0 -11
  107. package/src/errors/InvalidRequestError.ts +0 -11
  108. package/src/errors/LivedigitalSDKError.ts +0 -15
  109. package/src/errors/NeedJoinFirstError.ts +0 -11
  110. package/src/errors/NotFoundError.ts +0 -11
  111. package/src/errors/OperationError.ts +0 -47
  112. package/src/errors/RequestError.ts +0 -11
  113. package/src/errors/TimeoutError.ts +0 -11
  114. package/src/errors/TooManyRequestsError.ts +0 -11
  115. package/src/errors/UnauthorizedError.ts +0 -11
  116. package/src/errors/UnsupportedError.ts +0 -15
  117. package/src/errors/signalingApiErrorMapper.ts +0 -143
  118. package/src/helpers/appDataValidator.ts +0 -21
  119. package/src/helpers/browser.ts +0 -37
  120. package/src/helpers/channelMessageConverter.ts +0 -124
  121. package/src/helpers/common.ts +0 -96
  122. package/src/helpers/datetime.ts +0 -11
  123. package/src/helpers/errors.ts +0 -25
  124. package/src/helpers/filterStatsCodecs.ts +0 -3
  125. package/src/helpers/loader.ts +0 -59
  126. package/src/helpers/media.ts +0 -57
  127. package/src/helpers/peer.ts +0 -19
  128. package/src/helpers/randomString.ts +0 -18
  129. package/src/helpers/retry.ts +0 -74
  130. package/src/index.ts +0 -171
  131. package/src/inversify.config.ts +0 -333
  132. package/src/inversify.factories.ts +0 -191
  133. package/src/inversify.tokens.ts +0 -42
  134. package/src/proto/.gitkeep +0 -0
  135. package/src/proto/generated/channel/channel_activity_confirmation_time.ts +0 -110
  136. package/src/proto/generated/channel/channel_management_event.ts +0 -213
  137. package/src/proto/generated/channel/channel_produce_permissions.ts +0 -171
  138. package/src/proto/generated/channel/channel_state.ts +0 -94
  139. package/src/proto/generated/channel/channel_state_short.ts +0 -282
  140. package/src/proto/generated/channel_message/channel_event.ts +0 -401
  141. package/src/proto/generated/channel_message/channel_message.ts +0 -139
  142. package/src/proto/generated/channel_message/media_event.ts +0 -290
  143. package/src/proto/generated/consumer/consumer.ts +0 -167
  144. package/src/proto/generated/google/protobuf/struct.ts +0 -588
  145. package/src/proto/generated/google/protobuf/timestamp.ts +0 -229
  146. package/src/proto/generated/peer/peer.ts +0 -430
  147. package/src/proto/generated/peer/peer_group.ts +0 -48
  148. package/src/proto/generated/peer/peer_role.ts +0 -48
  149. package/src/proto/generated/producer/producer.ts +0 -204
  150. package/src/proto/generated/producer/producer_kind.ts +0 -48
  151. package/src/proto/generated/producer/producer_label.ts +0 -78
  152. package/src/proto/generated/producer/producer_spatial_layer_request.ts +0 -116
  153. package/src/proto/generated/transport/transport_connection_timeout.ts +0 -156
  154. package/src/proto/generated/transport/transport_connection_timeout_reason.ts +0 -48
  155. package/src/proto/generated/transport/transport_direction.ts +0 -48
  156. package/src/types/channelAudioObserver.ts +0 -34
  157. package/src/types/channelStateSyncronizer.ts +0 -22
  158. package/src/types/client.ts +0 -27
  159. package/src/types/common.ts +0 -399
  160. package/src/types/container.ts +0 -31
  161. package/src/types/engine.ts +0 -97
  162. package/src/types/media.ts +0 -146
  163. package/src/types/mediasoup.ts +0 -10
  164. package/src/types/network.ts +0 -10
  165. 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;