@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.
- package/LICENSE +1 -1
- 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,448 +0,0 @@
|
|
|
1
|
-
import { inject, injectable } from 'inversify';
|
|
2
|
-
import { serializeError } from 'serialize-error';
|
|
3
|
-
import {
|
|
4
|
-
CHANNEL_EVENTS, CLIENT_EVENTS, MEDIASOUP_EVENTS, PEER_EVENTS,
|
|
5
|
-
} from '../../constants/events';
|
|
6
|
-
import Media from '../media';
|
|
7
|
-
import { MyPeer } from '../MyPeer';
|
|
8
|
-
import Network from '../network';
|
|
9
|
-
import { Peers } from '../Peers';
|
|
10
|
-
import EnhancedEventEmitter from '../../EnhancedEventEmitter';
|
|
11
|
-
import { debounce, deepEqualObject } from '../../helpers/common';
|
|
12
|
-
import { TOKEN } from '../../inversify.tokens';
|
|
13
|
-
import { PeerShortData } from '../../types/common';
|
|
14
|
-
import EventsQueue from '../EventsQueue';
|
|
15
|
-
import Logger from '../Logger';
|
|
16
|
-
import Peer from '../Peer';
|
|
17
|
-
import {
|
|
18
|
-
RestoreChannelStateResult,
|
|
19
|
-
RestoredLocalPeersStateResult,
|
|
20
|
-
RestoredProducersStateResult,
|
|
21
|
-
RestoredTracksResult,
|
|
22
|
-
} from './types';
|
|
23
|
-
import { ChannelState } from '../../proto/generated/channel/channel_state';
|
|
24
|
-
import { Peer as ChannelMessagePeer } from '../../proto/generated/peer/peer';
|
|
25
|
-
import { PeerRole as ChannelMessagePeerRole } from '../../proto/generated/peer/peer_role';
|
|
26
|
-
import {
|
|
27
|
-
convertChannelMessagePeerToPeerResponse,
|
|
28
|
-
convertChannelMessageProducerToProducerData,
|
|
29
|
-
} from '../../helpers/channelMessageConverter';
|
|
30
|
-
import { FIVE_SECONDS_IN_MS } from '../../constants/common';
|
|
31
|
-
import { retryAsync } from '../../helpers/retry';
|
|
32
|
-
import { BaseTrack } from '../../types/media';
|
|
33
|
-
import { Producer } from '../../proto/generated/producer/producer';
|
|
34
|
-
|
|
35
|
-
const RESTORE_STATE_DEBOUNCE_TIME_MS = 3000;
|
|
36
|
-
|
|
37
|
-
@injectable()
|
|
38
|
-
class ChannelStateSynchronizer {
|
|
39
|
-
readonly #logger: Logger;
|
|
40
|
-
|
|
41
|
-
readonly debouncedTriggerChannelStateEvent: (
|
|
42
|
-
this: ChannelStateSynchronizer,
|
|
43
|
-
) => void;
|
|
44
|
-
|
|
45
|
-
constructor(
|
|
46
|
-
@inject(TOKEN.Network) private readonly network: Network,
|
|
47
|
-
@inject(TOKEN.Media) private readonly media: Media,
|
|
48
|
-
@inject(TOKEN.MyPeer) private readonly myPeer: MyPeer,
|
|
49
|
-
@inject(TOKEN.EventsQueue) private readonly eventsQueue: EventsQueue,
|
|
50
|
-
@inject(TOKEN.ClientEventEmitter) private readonly clientEventEmitter: EnhancedEventEmitter,
|
|
51
|
-
@inject(TOKEN.Peers) private readonly peers: Peers,
|
|
52
|
-
@inject(TOKEN.LoggerFactory) loggerFactory: (namespace: string) => Logger,
|
|
53
|
-
) {
|
|
54
|
-
this.#logger = loggerFactory('ChannelStateSyncEventHandler');
|
|
55
|
-
|
|
56
|
-
this.debouncedTriggerChannelStateEvent = debounce(
|
|
57
|
-
this.triggerChannelStateEvent.bind(this),
|
|
58
|
-
RESTORE_STATE_DEBOUNCE_TIME_MS,
|
|
59
|
-
);
|
|
60
|
-
|
|
61
|
-
this.watchNetworkState();
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
async handleChannelStateEvent(channelState: ChannelState): Promise<void> {
|
|
65
|
-
if (this.network.peersLoaded) {
|
|
66
|
-
await this.restoreState(channelState);
|
|
67
|
-
} else {
|
|
68
|
-
this.loadChannelState(channelState);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
this.clientEventEmitter.emit(CLIENT_EVENTS.channelStateSynced);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
private watchNetworkState(): void {
|
|
75
|
-
this.clientEventEmitter.on(CLIENT_EVENTS.connectionRestored, () => {
|
|
76
|
-
this.debouncedTriggerChannelStateEvent();
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async triggerChannelStateEvent(): Promise<void> {
|
|
81
|
-
const triggerChannelStateEventWithRetry = async (): Promise<void> => await new Promise(async (resolve, reject) => {
|
|
82
|
-
const messageId = await this.network.triggerChannelStateEvent('host');
|
|
83
|
-
const timeout = setTimeout(() => {
|
|
84
|
-
if (this.eventsQueue.isMessageReceived(messageId)) {
|
|
85
|
-
this.#logger.info('Channel state event received', {
|
|
86
|
-
case: 'ChannelStateSynchronizer.triggerChannelStateEvent',
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
resolve();
|
|
90
|
-
} else {
|
|
91
|
-
reject(new Error('Channel state event not received'));
|
|
92
|
-
}
|
|
93
|
-
}, FIVE_SECONDS_IN_MS);
|
|
94
|
-
|
|
95
|
-
const abortOnConnectionLost = (): void => {
|
|
96
|
-
clearTimeout(timeout);
|
|
97
|
-
this.clientEventEmitter.off(CLIENT_EVENTS.connectionLost, abortOnConnectionLost);
|
|
98
|
-
resolve();
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
this.clientEventEmitter.on(CLIENT_EVENTS.connectionLost, abortOnConnectionLost);
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
try {
|
|
105
|
-
await retryAsync(triggerChannelStateEventWithRetry, {
|
|
106
|
-
maxRetries: 5,
|
|
107
|
-
actionName: 'triggerChannelStateEventWithRetry',
|
|
108
|
-
logger: this.#logger,
|
|
109
|
-
});
|
|
110
|
-
} catch (error: unknown) {
|
|
111
|
-
this.#logger.warn('Failed to trigger channel state event', {
|
|
112
|
-
case: 'ChannelStateSynchronizer.triggerChannelStateEvent',
|
|
113
|
-
error: serializeError(error),
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
loadChannelState(channelState: ChannelState): void {
|
|
119
|
-
this.#logger.info('Loading channel state', { case: 'loadChannelState' });
|
|
120
|
-
|
|
121
|
-
try {
|
|
122
|
-
const localPeers = this.peers.hosts().map((peer) => peer.shortData);
|
|
123
|
-
const clusterPeers = channelState.peers.filter((peer) => peer.role === ChannelMessagePeerRole.PEER_ROLE_HOST);
|
|
124
|
-
|
|
125
|
-
this.setMissingPeers(localPeers, clusterPeers);
|
|
126
|
-
this.restoreLocalPeersState(clusterPeers);
|
|
127
|
-
this.network.peersLoaded = true;
|
|
128
|
-
} catch (error: unknown) {
|
|
129
|
-
this.#logger.error('Failed to load channel state', {
|
|
130
|
-
case: 'loadState',
|
|
131
|
-
error: serializeError(error),
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
async restoreState(channelState: ChannelState): Promise<RestoreChannelStateResult> {
|
|
137
|
-
const { peers } = channelState;
|
|
138
|
-
const result: RestoreChannelStateResult = {
|
|
139
|
-
missingPeers: [],
|
|
140
|
-
removedPeers: [],
|
|
141
|
-
missingProducers: [],
|
|
142
|
-
removedProducers: [],
|
|
143
|
-
fixedProducersState: [],
|
|
144
|
-
fixedConsumersState: [],
|
|
145
|
-
restoredAppDataPeers: [],
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
try {
|
|
149
|
-
if (!this.network.isNetworkActive) {
|
|
150
|
-
this.#logger.info('Connection inactive, skipping restore local state', { case: 'restoreLocalState' });
|
|
151
|
-
|
|
152
|
-
return result;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
this.#logger.info('Restoring local state', { case: 'restoreLocalState' });
|
|
156
|
-
|
|
157
|
-
const localPeers = this.peers.hosts().map((peer) => peer.shortData);
|
|
158
|
-
const clusterPeers = peers.filter((peer) => peer.role === ChannelMessagePeerRole.PEER_ROLE_HOST);
|
|
159
|
-
|
|
160
|
-
const { removedProducers, fixedProducersState } = await this.restoreRemoteProducersState(clusterPeers);
|
|
161
|
-
result.fixedProducersState.push(...fixedProducersState);
|
|
162
|
-
result.removedProducers.push(...removedProducers);
|
|
163
|
-
|
|
164
|
-
result.removedPeers.push(...this.removeUnnecessaryPeers(localPeers, clusterPeers));
|
|
165
|
-
result.missingPeers.push(...this.setMissingPeers(localPeers, clusterPeers));
|
|
166
|
-
|
|
167
|
-
const restoreLocalStateResult = this.restoreLocalPeersState(clusterPeers);
|
|
168
|
-
result.missingProducers.push(...restoreLocalStateResult.missingProducers);
|
|
169
|
-
result.removedProducers.push(...restoreLocalStateResult.removedProducers);
|
|
170
|
-
result.restoredAppDataPeers.push(...restoreLocalStateResult.restoredAppDataPeers);
|
|
171
|
-
result.fixedProducersState.push(...restoreLocalStateResult.fixedProducersState);
|
|
172
|
-
result.fixedConsumersState.push(...restoreLocalStateResult.fixedConsumersState);
|
|
173
|
-
|
|
174
|
-
return result;
|
|
175
|
-
} catch (error) {
|
|
176
|
-
this.#logger.info('Failed to restore local state', {
|
|
177
|
-
case: 'restoreLocalState',
|
|
178
|
-
error: serializeError(error),
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
return result;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
private async restoreRemoteProducersState(
|
|
186
|
-
clusterPeers: ChannelMessagePeer[],
|
|
187
|
-
): Promise<RestoredProducersStateResult> {
|
|
188
|
-
const results: RestoredProducersStateResult = {
|
|
189
|
-
removedProducers: [],
|
|
190
|
-
fixedProducersState: [],
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
const myLocalPeer = this.myPeer.get();
|
|
194
|
-
const myClusterPeer = clusterPeers.find((peer) => peer.id === this.myPeer.id);
|
|
195
|
-
|
|
196
|
-
if (!myLocalPeer || !myClusterPeer) {
|
|
197
|
-
return results;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// removing extra producers from server
|
|
201
|
-
const publishedLocalTracks = new Map<string, BaseTrack>();
|
|
202
|
-
this.media.getAllTracks().forEach((track) => {
|
|
203
|
-
if (!track.producerId) {
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
publishedLocalTracks.set(track.producerId, track);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
const localProducersIds = new Set(publishedLocalTracks.keys());
|
|
211
|
-
const unnecessaryLocalProducers = myClusterPeer.producers.filter((cp) => !localProducersIds.has(cp.id));
|
|
212
|
-
|
|
213
|
-
await Promise.all(unnecessaryLocalProducers.map(async (producer) => {
|
|
214
|
-
await this.network.closeRemoteProducer(producer.id);
|
|
215
|
-
myLocalPeer.producers.delete(producer.id);
|
|
216
|
-
results.removedProducers.push(producer.id);
|
|
217
|
-
this.#logger.info('Unnecessary local producer closed', {
|
|
218
|
-
case: 'restoreLocalState',
|
|
219
|
-
removedProducerId: producer.id,
|
|
220
|
-
removedProducerPeerId: producer.peerId,
|
|
221
|
-
});
|
|
222
|
-
}));
|
|
223
|
-
|
|
224
|
-
// repair producers state on server
|
|
225
|
-
const wrongStateProducers: { cp: Producer; localTrack: BaseTrack }[] = [];
|
|
226
|
-
|
|
227
|
-
for (const cp of myClusterPeer.producers) {
|
|
228
|
-
const localTrack = publishedLocalTracks.get(cp.id);
|
|
229
|
-
|
|
230
|
-
if (!localTrack) {
|
|
231
|
-
continue;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (localTrack.isPaused !== cp.paused) {
|
|
235
|
-
wrongStateProducers.push({ cp, localTrack });
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
await Promise.all(wrongStateProducers.map(async ({ cp, localTrack }) => {
|
|
240
|
-
if (localTrack.isPaused) {
|
|
241
|
-
await this.network.pauseRemoteProducer(cp.id);
|
|
242
|
-
} else {
|
|
243
|
-
await this.network.resumeRemoteProducer(cp.id);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
results.fixedProducersState.push(cp.id);
|
|
247
|
-
cp.paused = localTrack.isPaused;
|
|
248
|
-
|
|
249
|
-
this.#logger.info('Remote producer state repaired', {
|
|
250
|
-
case: 'restoreLocalState',
|
|
251
|
-
removedProducerId: cp.id,
|
|
252
|
-
removedProducerPeerId: cp.peerId,
|
|
253
|
-
paused: localTrack.isPaused,
|
|
254
|
-
});
|
|
255
|
-
}));
|
|
256
|
-
|
|
257
|
-
return results;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
private removeUnnecessaryPeers(localPeers: PeerShortData[], clusterPeers: ChannelMessagePeer[]): string[] {
|
|
261
|
-
const results: string[] = [];
|
|
262
|
-
const unnecessaryPeers = localPeers
|
|
263
|
-
.filter((localPeer) => !clusterPeers.find((remotePeer) => remotePeer.id === localPeer.id));
|
|
264
|
-
|
|
265
|
-
unnecessaryPeers.forEach((unnecessaryPeer) => {
|
|
266
|
-
this.peers.remove(unnecessaryPeer.id).catch((error: unknown) => {
|
|
267
|
-
this.#logger.error('Failed to remove peer', {
|
|
268
|
-
error: serializeError(error),
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
results.push(unnecessaryPeer.id);
|
|
272
|
-
this.#logger.info('Unnecessary peer removed', {
|
|
273
|
-
case: 'restoreLocalState',
|
|
274
|
-
removedPeerId: unnecessaryPeer.id,
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
return results;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
private setMissingPeers(localPeers: PeerShortData[], clusterPeers: ChannelMessagePeer[]): string[] {
|
|
282
|
-
const results: string[] = [];
|
|
283
|
-
clusterPeers.forEach((clusterPeer) => {
|
|
284
|
-
const peer = localPeers.find((localPeer) => localPeer.id === clusterPeer.id);
|
|
285
|
-
|
|
286
|
-
if (peer) {
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
const newPeer = this.peers.add(convertChannelMessagePeerToPeerResponse(clusterPeer));
|
|
291
|
-
results.push(newPeer.id);
|
|
292
|
-
this.#logger.info('Missing peer added to storage', {
|
|
293
|
-
case: 'restoreLocalState',
|
|
294
|
-
peerId: clusterPeer.id,
|
|
295
|
-
});
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
return results;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
private restoreLocalPeersState(clusterPeers: ChannelMessagePeer[]): RestoredLocalPeersStateResult {
|
|
302
|
-
const clusterPeersMap = new Map(clusterPeers.map((peer) => [peer.id, peer]));
|
|
303
|
-
const localPeers = this.peers.hosts();
|
|
304
|
-
|
|
305
|
-
const result: RestoredLocalPeersStateResult = {
|
|
306
|
-
removedProducers: [],
|
|
307
|
-
missingProducers: [],
|
|
308
|
-
restoredAppDataPeers: [],
|
|
309
|
-
fixedConsumersState: [],
|
|
310
|
-
fixedProducersState: [],
|
|
311
|
-
};
|
|
312
|
-
|
|
313
|
-
localPeers.forEach((localPeer) => {
|
|
314
|
-
const clusterPeer = clusterPeersMap.get(localPeer.id);
|
|
315
|
-
|
|
316
|
-
if (!clusterPeer) {
|
|
317
|
-
this.#logger.warn('Found new local peer, skip restoring state', {
|
|
318
|
-
case: 'restoreLocalState',
|
|
319
|
-
newPeerId: localPeer.id,
|
|
320
|
-
});
|
|
321
|
-
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
result.removedProducers.push(...this.removeUnnecessaryProducers(localPeer, clusterPeer));
|
|
326
|
-
|
|
327
|
-
const isAppDataRestored = this.restoreAppData(localPeer, clusterPeer);
|
|
328
|
-
|
|
329
|
-
if (isAppDataRestored) {
|
|
330
|
-
result.restoredAppDataPeers.push(localPeer.id);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
const {
|
|
334
|
-
fixedProducersState,
|
|
335
|
-
fixedConsumersState,
|
|
336
|
-
missingProducers,
|
|
337
|
-
} = this.restoreTracksState(localPeer, clusterPeer);
|
|
338
|
-
|
|
339
|
-
result.fixedProducersState.push(...fixedProducersState);
|
|
340
|
-
result.fixedConsumersState.push(...fixedConsumersState);
|
|
341
|
-
result.missingProducers.push(...missingProducers);
|
|
342
|
-
});
|
|
343
|
-
|
|
344
|
-
this.#logger.info('Peers state restored', { case: 'restoreLocalState' });
|
|
345
|
-
|
|
346
|
-
return result;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
private removeUnnecessaryProducers(localPeer: Peer, clusterPeer: ChannelMessagePeer): string[] {
|
|
350
|
-
const result: string[] = [];
|
|
351
|
-
const unnecessaryProducers = localPeer.getProducers()
|
|
352
|
-
.filter((lp) => !clusterPeer.producers.find((cp) => cp.id === lp.id));
|
|
353
|
-
unnecessaryProducers.forEach((producer) => {
|
|
354
|
-
localPeer.observer.safeEmit(MEDIASOUP_EVENTS.producerClose, producer);
|
|
355
|
-
result.push(producer.id);
|
|
356
|
-
this.#logger.info('Unnecessary producer removed', {
|
|
357
|
-
case: 'restoreLocalState',
|
|
358
|
-
removedProducerId: producer.id,
|
|
359
|
-
removedProducerPeerId: producer.peerId,
|
|
360
|
-
});
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
return result;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
private restoreTracksState(localPeer: Peer, clusterPeer: ChannelMessagePeer): RestoredTracksResult {
|
|
367
|
-
const result: RestoredTracksResult = {
|
|
368
|
-
missingProducers: [],
|
|
369
|
-
fixedProducersState: [],
|
|
370
|
-
fixedConsumersState: [],
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
clusterPeer.producers.forEach((clusterPeerProducer) => {
|
|
374
|
-
const localProducer = localPeer.producers.get(clusterPeerProducer.id);
|
|
375
|
-
|
|
376
|
-
if (!localProducer) {
|
|
377
|
-
localPeer.observer.safeEmit(
|
|
378
|
-
MEDIASOUP_EVENTS.newProducer,
|
|
379
|
-
convertChannelMessageProducerToProducerData(clusterPeerProducer),
|
|
380
|
-
);
|
|
381
|
-
result.missingProducers.push(clusterPeerProducer.id);
|
|
382
|
-
this.#logger.info('Missing producer added to storage', {
|
|
383
|
-
case: 'restoreLocalState',
|
|
384
|
-
producerId: clusterPeerProducer.id,
|
|
385
|
-
producerPeerId: clusterPeerProducer.peerId,
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
return;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
const { paused } = clusterPeerProducer;
|
|
392
|
-
|
|
393
|
-
if (localProducer.paused !== paused) {
|
|
394
|
-
localProducer.setPaused(paused);
|
|
395
|
-
const producerStateEvent = localProducer.paused ? PEER_EVENTS.publisherPaused : PEER_EVENTS.publisherResumed;
|
|
396
|
-
localPeer.observer.safeEmit(producerStateEvent, {
|
|
397
|
-
producerId: localProducer.id,
|
|
398
|
-
kind: localProducer.kind,
|
|
399
|
-
label: localProducer.label,
|
|
400
|
-
paused: localProducer.paused,
|
|
401
|
-
});
|
|
402
|
-
result.fixedProducersState.push(clusterPeerProducer.id);
|
|
403
|
-
|
|
404
|
-
this.#logger.info('Producer state fixed', {
|
|
405
|
-
case: 'restoreLocalState',
|
|
406
|
-
producerId: clusterPeerProducer.id,
|
|
407
|
-
producerPeerId: clusterPeerProducer.peerId,
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
const consumer = localPeer.tracks.get(localProducer.label);
|
|
412
|
-
|
|
413
|
-
if (consumer?.consumerId && consumer.consumer?.paused !== clusterPeerProducer.paused) {
|
|
414
|
-
const { consumerId } = consumer;
|
|
415
|
-
const eventName = localProducer.paused ? MEDIASOUP_EVENTS.pauseConsumer : MEDIASOUP_EVENTS.resumeConsumer;
|
|
416
|
-
localPeer.observer.safeEmit(eventName, consumerId);
|
|
417
|
-
result.fixedConsumersState.push(consumerId);
|
|
418
|
-
this.#logger.info('Consumer state fixed', {
|
|
419
|
-
case: 'restoreLocalState',
|
|
420
|
-
consumerId,
|
|
421
|
-
consumerProducerId: clusterPeerProducer.id,
|
|
422
|
-
consumerProducerPeerId: clusterPeerProducer.peerId,
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
return result;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
private restoreAppData(localPeer: Peer, clusterPeer: ChannelMessagePeer): boolean {
|
|
431
|
-
const isSameAppData = deepEqualObject(localPeer.appData, clusterPeer.appData);
|
|
432
|
-
|
|
433
|
-
if (isSameAppData) {
|
|
434
|
-
return false;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
localPeer.observer.emit(CHANNEL_EVENTS.updatePeerAppData, clusterPeer.appData);
|
|
438
|
-
this.#logger.info('Application data restored', {
|
|
439
|
-
case: 'restoreLocalState',
|
|
440
|
-
peerId: localPeer.id,
|
|
441
|
-
appData: clusterPeer.appData,
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
return true;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
|
|
448
|
-
export default ChannelStateSynchronizer;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface RestoredProducersStateResult {
|
|
2
|
-
removedProducers: string[];
|
|
3
|
-
fixedProducersState: string[];
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export interface RestoredTracksResult {
|
|
7
|
-
missingProducers: string[];
|
|
8
|
-
fixedProducersState: string[];
|
|
9
|
-
fixedConsumersState: string[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface RestoredLocalPeersStateResult extends RestoredTracksResult {
|
|
13
|
-
removedProducers: string[];
|
|
14
|
-
restoredAppDataPeers: string[];
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export type RestoreChannelStateResult = {
|
|
18
|
-
removedPeers: string[];
|
|
19
|
-
missingPeers: string[];
|
|
20
|
-
} & RestoredProducersStateResult
|
|
21
|
-
& RestoredTracksResult
|
|
22
|
-
& RestoredLocalPeersStateResult;
|