@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.
- package/dist/constants/encodings.d.ts +3 -3
- package/dist/constants/encodings.ts +3 -3
- package/dist/engine/handlers/ChannelAudioObserverEventHandler.d.ts +3 -1
- package/dist/engine/handlers/ChannelAudioObserverMissingProducerRestorer.d.ts +10 -0
- package/dist/engine/handlers/MediaEventHandler.d.ts +0 -1
- package/dist/engine/index.d.ts +7 -4
- package/dist/engine/network/DatachannelHeartbeater.d.ts +2 -2
- package/dist/engine/network/NetworkTransportPolicyManager.d.ts +22 -0
- package/dist/engine/network/index.d.ts +10 -8
- package/dist/index.d.ts +2 -0
- package/dist/index.es.js +2 -2
- package/dist/index.js +2 -2
- package/dist/inversify.tokens.d.ts +3 -1
- package/dist/types/network.d.ts +6 -6
- package/package.json +2 -3
- package/src/ClientMetaProvider.ts +0 -41
- package/src/EnhancedEventEmitter.ts +0 -75
- package/src/config/ConfigService.ts +0 -66
- package/src/constants/common.ts +0 -85
- package/src/constants/encodings.ts +0 -26
- package/src/constants/events.ts +0 -126
- package/src/constants/mutex.ts +0 -6
- package/src/constants/stats.ts +0 -1
- package/src/constants/videoConstrains.ts +0 -21
- package/src/engine/CallState.ts +0 -19
- package/src/engine/ChannelStateSynchronizer/ChannelStateSynchronizer.ts +0 -448
- package/src/engine/ChannelStateSynchronizer/types.ts +0 -22
- package/src/engine/EventsQueue.ts +0 -255
- package/src/engine/IntegrationsService.ts +0 -163
- package/src/engine/LocalMutex.ts +0 -45
- package/src/engine/Logger.ts +0 -234
- package/src/engine/MyPeer.ts +0 -25
- package/src/engine/Peer.ts +0 -602
- package/src/engine/PeerConsumer.ts +0 -276
- package/src/engine/PeerProducer.ts +0 -50
- package/src/engine/Peers.ts +0 -150
- package/src/engine/PeersStorage.ts +0 -45
- package/src/engine/RemotePeerTracks.ts +0 -73
- package/src/engine/WIDHandler.ts +0 -166
- package/src/engine/WebRTCStats/ConnectionStatsManager.ts +0 -31
- package/src/engine/WebRTCStats/InboundTrackStatsManager.ts +0 -51
- package/src/engine/WebRTCStats/OutboudTrackStatsManager.ts +0 -51
- package/src/engine/WebRTCStats/StatsHandler.ts +0 -80
- package/src/engine/WebRTCStats/TransportsStatsProvider.ts +0 -123
- package/src/engine/WebRTCStats/types.ts +0 -20
- package/src/engine/analyticsApiClient/LogApi.ts +0 -24
- package/src/engine/analyticsApiClient/MetricsApi.ts +0 -30
- package/src/engine/analyticsApiClient/helper.ts +0 -88
- package/src/engine/analyticsApiClient/index.ts +0 -42
- package/src/engine/analyticsApiClient/types.ts +0 -33
- package/src/engine/handlers/ChannelAudioObserverEventHandler.ts +0 -177
- package/src/engine/handlers/ChannelEventHandler.ts +0 -268
- package/src/engine/handlers/ChannelStateSyncEventHandler/ChannelStateConsistencyCheckResult.ts +0 -31
- package/src/engine/handlers/ChannelStateSyncEventHandler/ChannelStateConsistencyChecker.ts +0 -146
- package/src/engine/handlers/ChannelStateSyncEventHandler/consts.ts +0 -7
- package/src/engine/handlers/ChannelStateSyncEventHandler/index.ts +0 -342
- package/src/engine/handlers/ChannelStateSyncEventHandler/types.ts +0 -21
- package/src/engine/handlers/MediaEventHandler.ts +0 -273
- package/src/engine/index.ts +0 -793
- package/src/engine/media/index.ts +0 -574
- package/src/engine/media/producer/PendingClosureProducerStorage.ts +0 -37
- package/src/engine/media/producer/ProducerCloseManager.ts +0 -115
- package/src/engine/media/streamEffects/ProcessorsCache.ts +0 -41
- package/src/engine/media/streamEffects/audio/AudioTrackProcessor.ts +0 -7
- package/src/engine/media/streamEffects/audio/asdk/ASDKTrackProcessor.ts +0 -275
- package/src/engine/media/streamEffects/audio/asdk/atsrb.d.ts +0 -36
- package/src/engine/media/streamEffects/audio/asdk/errorBus.d.ts +0 -47
- package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionAudioWorkletNode.ts +0 -35
- package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionNodeProvider.ts +0 -44
- package/src/engine/media/streamEffects/audio/noiseSuppression/NoiseSuppressionScriptProcessorNode.ts +0 -69
- package/src/engine/media/streamEffects/audio/noiseSuppression/RNNoiseTrackProcessor.ts +0 -134
- package/src/engine/media/streamEffects/audio/noiseSuppression/WasmModuleCompiler.ts +0 -9
- package/src/engine/media/streamEffects/video/esdk/TrackProcessor.ts +0 -386
- package/src/engine/media/streamEffects/video/esdk/components/component.d.ts +0 -35
- package/src/engine/media/streamEffects/video/esdk/components/countdown/countdown.d.ts +0 -27
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/doubleSlideRect.d.ts +0 -33
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/horizontalMirror.d.ts +0 -29
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/leftTextbox.d.ts +0 -31
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/slideBold.d.ts +0 -41
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/twoSideRects/animatedBox.d.ts +0 -59
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/collection/twoSideRects/twoSlideRects.d.ts +0 -27
- package/src/engine/media/streamEffects/video/esdk/components/lower-third/lowerThird.d.ts +0 -83
- package/src/engine/media/streamEffects/video/esdk/components/overlay-screen/overlayScreen.d.ts +0 -40
- package/src/engine/media/streamEffects/video/esdk/components/overlay-screen/overlaySprite.d.ts +0 -10
- package/src/engine/media/streamEffects/video/esdk/components/stickers/stickerSprite.d.ts +0 -51
- package/src/engine/media/streamEffects/video/esdk/components/stickers/stickers.d.ts +0 -54
- package/src/engine/media/streamEffects/video/esdk/components/utils/positionHelper.d.ts +0 -14
- package/src/engine/media/streamEffects/video/esdk/components/waterMark/waterMark.d.ts +0 -20
- package/src/engine/media/streamEffects/video/esdk/tsvb.d.ts +0 -187
- package/src/engine/media/streamEffects/video/esdk/utils/errorBus.d.ts +0 -42
- package/src/engine/media/tracks/DefaultAudioTrack.ts +0 -178
- package/src/engine/media/tracks/DefaultBaseTrack.ts +0 -592
- package/src/engine/media/tracks/DefaultVideoTrack.ts +0 -301
- package/src/engine/media/tracks/MediaStreamTrackManager.ts +0 -50
- package/src/engine/media/tracks/PeerTrack.ts +0 -558
- package/src/engine/network/DataChannelsManager.ts +0 -164
- package/src/engine/network/DatachannelHeartbeater.ts +0 -122
- package/src/engine/network/SignalingHeartbeater.ts +0 -55
- package/src/engine/network/index.ts +0 -961
- package/src/engine/signalingApiClient/SignalingApiClient.ts +0 -95
- package/src/engine/signalingApiClient/api.ts +0 -2289
- package/src/engine/system/index.ts +0 -221
- package/src/errors/AlreadyConnectedError.ts +0 -11
- package/src/errors/AlreadyCreatedError.ts +0 -11
- package/src/errors/ForbiddenError.ts +0 -11
- package/src/errors/InvalidPayloadError.ts +0 -11
- package/src/errors/InvalidRequestError.ts +0 -11
- package/src/errors/LivedigitalSDKError.ts +0 -15
- package/src/errors/NeedJoinFirstError.ts +0 -11
- package/src/errors/NotFoundError.ts +0 -11
- package/src/errors/OperationError.ts +0 -47
- package/src/errors/RequestError.ts +0 -11
- package/src/errors/TimeoutError.ts +0 -11
- package/src/errors/TooManyRequestsError.ts +0 -11
- package/src/errors/UnauthorizedError.ts +0 -11
- package/src/errors/UnsupportedError.ts +0 -15
- package/src/errors/signalingApiErrorMapper.ts +0 -143
- package/src/helpers/appDataValidator.ts +0 -21
- package/src/helpers/browser.ts +0 -37
- package/src/helpers/channelMessageConverter.ts +0 -124
- package/src/helpers/common.ts +0 -96
- package/src/helpers/datetime.ts +0 -11
- package/src/helpers/errors.ts +0 -25
- package/src/helpers/filterStatsCodecs.ts +0 -3
- package/src/helpers/loader.ts +0 -59
- package/src/helpers/media.ts +0 -57
- package/src/helpers/peer.ts +0 -19
- package/src/helpers/randomString.ts +0 -18
- package/src/helpers/retry.ts +0 -74
- package/src/index.ts +0 -171
- package/src/inversify.config.ts +0 -333
- package/src/inversify.factories.ts +0 -191
- package/src/inversify.tokens.ts +0 -42
- package/src/proto/.gitkeep +0 -0
- package/src/proto/generated/channel/channel_activity_confirmation_time.ts +0 -110
- package/src/proto/generated/channel/channel_management_event.ts +0 -213
- package/src/proto/generated/channel/channel_produce_permissions.ts +0 -171
- package/src/proto/generated/channel/channel_state.ts +0 -94
- package/src/proto/generated/channel/channel_state_short.ts +0 -282
- package/src/proto/generated/channel_message/channel_event.ts +0 -401
- package/src/proto/generated/channel_message/channel_message.ts +0 -139
- package/src/proto/generated/channel_message/media_event.ts +0 -290
- package/src/proto/generated/consumer/consumer.ts +0 -167
- package/src/proto/generated/google/protobuf/struct.ts +0 -588
- package/src/proto/generated/google/protobuf/timestamp.ts +0 -229
- package/src/proto/generated/peer/peer.ts +0 -430
- package/src/proto/generated/peer/peer_group.ts +0 -48
- package/src/proto/generated/peer/peer_role.ts +0 -48
- package/src/proto/generated/producer/producer.ts +0 -204
- package/src/proto/generated/producer/producer_kind.ts +0 -48
- package/src/proto/generated/producer/producer_label.ts +0 -78
- package/src/proto/generated/producer/producer_spatial_layer_request.ts +0 -116
- package/src/proto/generated/transport/transport_connection_timeout.ts +0 -156
- package/src/proto/generated/transport/transport_connection_timeout_reason.ts +0 -48
- package/src/proto/generated/transport/transport_direction.ts +0 -48
- package/src/types/channelAudioObserver.ts +0 -34
- package/src/types/channelStateSyncronizer.ts +0 -22
- package/src/types/client.ts +0 -27
- package/src/types/common.ts +0 -399
- package/src/types/container.ts +0 -31
- package/src/types/engine.ts +0 -97
- package/src/types/media.ts +0 -146
- package/src/types/mediasoup.ts +0 -10
- package/src/types/network.ts +0 -10
- 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
|
-
};
|
package/src/helpers/common.ts
DELETED
|
@@ -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
|
-
}
|
package/src/helpers/datetime.ts
DELETED
package/src/helpers/errors.ts
DELETED
|
@@ -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
|
-
};
|
package/src/helpers/loader.ts
DELETED
|
@@ -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
|
-
};
|
package/src/helpers/media.ts
DELETED
|
@@ -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());
|
package/src/helpers/peer.ts
DELETED
|
@@ -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
|
-
}
|
package/src/helpers/retry.ts
DELETED
|
@@ -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;
|