mediasfu-shared 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +228 -0
- package/dist/index.cjs +7707 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +7285 -0
- package/dist/index.js +7690 -0
- package/dist/index.js.map +1 -0
- package/package.json +78 -0
- package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +68 -0
- package/src/consumers/addVideosGrid.ts +18 -0
- package/src/consumers/autoAdjust.ts +100 -0
- package/src/consumers/calculateRowsAndColumns.ts +51 -0
- package/src/consumers/changeVids.ts +753 -0
- package/src/consumers/checkGrid.ts +100 -0
- package/src/consumers/checkPermission.ts +89 -0
- package/src/consumers/checkScreenShare.ts +114 -0
- package/src/consumers/closeAndResize.ts +401 -0
- package/src/consumers/compareActiveNames.ts +122 -0
- package/src/consumers/compareScreenStates.ts +117 -0
- package/src/consumers/connectIps.ts +175 -0
- package/src/consumers/connectLocalIps.ts +103 -0
- package/src/consumers/connectRecvTransport.ts +158 -0
- package/src/consumers/connectSendTransport.ts +150 -0
- package/src/consumers/connectSendTransportAudio.ts +161 -0
- package/src/consumers/connectSendTransportScreen.ts +169 -0
- package/src/consumers/connectSendTransportVideo.ts +149 -0
- package/src/consumers/consumerResume.ts +25 -0
- package/src/consumers/controlMedia.ts +118 -0
- package/src/consumers/createSendTransport.ts +312 -0
- package/src/consumers/disconnectSendTransportAudio.ts +170 -0
- package/src/consumers/disconnectSendTransportScreen.ts +130 -0
- package/src/consumers/disconnectSendTransportVideo.ts +161 -0
- package/src/consumers/dispStreams.ts +694 -0
- package/src/consumers/generatePageContent.ts +118 -0
- package/src/consumers/getEstimate.ts +124 -0
- package/src/consumers/getPipedProducersAlt.ts +96 -0
- package/src/consumers/getProducersPiped.ts +89 -0
- package/src/consumers/getVideos.ts +107 -0
- package/src/consumers/mixStreams.ts +97 -0
- package/src/consumers/onScreenChanges.ts +106 -0
- package/src/consumers/prepopulateUserMedia.ts +18 -0
- package/src/consumers/processConsumerTransports.ts +157 -0
- package/src/consumers/processConsumerTransportsAudio.ts +121 -0
- package/src/consumers/rePort.ts +123 -0
- package/src/consumers/reUpdateInter.ts +289 -0
- package/src/consumers/readjust.ts +170 -0
- package/src/consumers/receiveAllPipedTransports.ts +77 -0
- package/src/consumers/receiveRoomMessages.ts +55 -0
- package/src/consumers/reorderStreams.ts +246 -0
- package/src/consumers/requestScreenShare.ts +103 -0
- package/src/consumers/resumePauseAudioStreams.ts +174 -0
- package/src/consumers/resumePauseStreams.ts +110 -0
- package/src/consumers/resumeSendTransportAudio.ts +143 -0
- package/src/consumers/signalNewConsumerTransport.ts +179 -0
- package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +130 -0
- package/src/consumers/socketReceiveMethods/newPipeProducer.ts +138 -0
- package/src/consumers/socketReceiveMethods/producerClosed.ts +102 -0
- package/src/consumers/startShareScreen.ts +124 -0
- package/src/consumers/stopShareScreen.ts +241 -0
- package/src/consumers/streamSuccessAudio.ts +297 -0
- package/src/consumers/streamSuccessAudioSwitch.ts +315 -0
- package/src/consumers/streamSuccessScreen.ts +255 -0
- package/src/consumers/streamSuccessVideo.ts +373 -0
- package/src/consumers/switchUserAudio.ts +140 -0
- package/src/consumers/switchUserVideo.ts +201 -0
- package/src/consumers/switchUserVideoAlt.ts +331 -0
- package/src/consumers/trigger.ts +250 -0
- package/src/consumers/updateMiniCardsGrid.ts +150 -0
- package/src/consumers/updateParticipantAudioDecibels.ts +56 -0
- package/src/index.ts +119 -0
- package/src/methods/background/launchBackground.ts +16 -0
- package/src/methods/breakoutRooms/breakoutRoomUpdated.ts +161 -0
- package/src/methods/breakoutRooms/handleStartBreakout.ts +96 -0
- package/src/methods/breakoutRooms/handleStopBreakout.ts +72 -0
- package/src/methods/breakoutRooms/index.ts +4 -0
- package/src/methods/breakoutRooms/launchBreakoutRooms.ts +31 -0
- package/src/methods/coHost/launchCoHost.ts +28 -0
- package/src/methods/coHostMethods/index.ts +2 -0
- package/src/methods/coHostMethods/modifyCoHostSettings.ts +94 -0
- package/src/methods/displaySettings/index.ts +1 -0
- package/src/methods/displaySettings/launchDisplaySettings.ts +31 -0
- package/src/methods/displaySettings/modifyDisplaySettings.ts +242 -0
- package/src/methods/exit/confirmExit.ts +60 -0
- package/src/methods/exit/index.ts +2 -0
- package/src/methods/exit/launchConfirmExit.ts +29 -0
- package/src/methods/index.ts +5 -0
- package/src/methods/mediaSettings/launchMediaSettings.ts +61 -0
- package/src/methods/menu/launchMenuModal.ts +28 -0
- package/src/methods/message/index.ts +1 -0
- package/src/methods/message/launchMessages.ts +27 -0
- package/src/methods/message/sendMessage.ts +175 -0
- package/src/methods/participants/index.ts +3 -0
- package/src/methods/participants/launchParticipants.ts +25 -0
- package/src/methods/participants/messageParticipants.ts +78 -0
- package/src/methods/participants/muteParticipants.ts +79 -0
- package/src/methods/participants/removeParticipants.ts +97 -0
- package/src/methods/polls/handleCreatePoll.ts +66 -0
- package/src/methods/polls/handleEndPoll.ts +64 -0
- package/src/methods/polls/handleVotePoll.ts +76 -0
- package/src/methods/polls/index.ts +3 -0
- package/src/methods/polls/launchPoll.ts +25 -0
- package/src/methods/prejoin/handleCreateRoom.ts +441 -0
- package/src/methods/prejoin/handleJoinRoom.ts +153 -0
- package/src/methods/prejoin/index.ts +14 -0
- package/src/methods/recording/checkPauseState.ts +57 -0
- package/src/methods/recording/checkResumeState.ts +42 -0
- package/src/methods/recording/confirmRecording.ts +241 -0
- package/src/methods/recording/launchRecording.ts +114 -0
- package/src/methods/recording/recordPauseTimer.ts +52 -0
- package/src/methods/recording/recordResumeTimer.ts +92 -0
- package/src/methods/recording/recordStartTimer.ts +106 -0
- package/src/methods/recording/recordUpdateTimer.ts +49 -0
- package/src/methods/recording/startRecording.ts +268 -0
- package/src/methods/recording/stopRecording.ts +124 -0
- package/src/methods/recording/updateRecording.ts +245 -0
- package/src/methods/requests/index.ts +1 -0
- package/src/methods/requests/launchRequests.ts +25 -0
- package/src/methods/requests/respondToRequests.ts +108 -0
- package/src/methods/settings/index.ts +2 -0
- package/src/methods/settings/launchSettings.ts +25 -0
- package/src/methods/settings/modifySettings.ts +99 -0
- package/src/methods/stream/clickVideo.ts +337 -0
- package/src/methods/stream/index.ts +3 -0
- package/src/methods/stream/switchAudio.ts +73 -0
- package/src/methods/stream/switchVideo.ts +148 -0
- package/src/methods/stream/switchVideoAlt.ts +152 -0
- package/src/methods/utils/checkLimitsAndMakeRequest.ts +103 -0
- package/src/methods/utils/validateAlphanumeric.ts +41 -0
- package/src/methods/waiting/index.ts +1 -0
- package/src/methods/waiting/launchWaiting.ts +26 -0
- package/src/methods/waiting/respondToWaiting.ts +82 -0
- package/src/methods/welcome/handleWelcomeRequest.ts +189 -0
- package/src/methods/welcome/index.ts +5 -0
- package/src/methods/whiteboard/handleStartWhiteboard.ts +65 -0
- package/src/methods/whiteboard/handleStopWhiteboard.ts +48 -0
- package/src/methods/whiteboard/index.ts +4 -0
- package/src/methods/whiteboard/launchConfigureWhiteboard.ts +29 -0
- package/src/producers/producerEmits/joinConRoom.ts +153 -0
- package/src/sockets/SocketManager.ts +232 -0
- package/src/types/shared-base-types.ts +752 -0
- package/src/types/types.ts +84 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import type { Producer, ProducerCodecOptions, ProducerOptions } from 'mediasoup-client/lib/types';
|
|
4
|
+
import { Socket } from "socket.io-client";
|
|
5
|
+
import { PrepopulateUserMediaParameters, PrepopulateUserMediaType, CreateSendTransportParameters, CreateSendTransportType, ConnectSendTransportAudioParameters, ConnectSendTransportAudioType, SleepType } from "../types/types";
|
|
6
|
+
|
|
7
|
+
export interface StreamSuccessAudioSwitchParameters extends PrepopulateUserMediaParameters, CreateSendTransportParameters, ConnectSendTransportAudioParameters {
|
|
8
|
+
audioProducer: Producer | null;
|
|
9
|
+
localAudioProducer?: Producer | null;
|
|
10
|
+
socket: Socket;
|
|
11
|
+
localSocket?: Socket;
|
|
12
|
+
roomName: string;
|
|
13
|
+
localStream: MediaStream | null;
|
|
14
|
+
localStreamAudio: MediaStream | null;
|
|
15
|
+
audioParams: ProducerOptions;
|
|
16
|
+
audioPaused: boolean;
|
|
17
|
+
audioAlreadyOn: boolean;
|
|
18
|
+
transportCreated: boolean;
|
|
19
|
+
localTransportCreated?: boolean;
|
|
20
|
+
audioParamse?: ProducerCodecOptions;
|
|
21
|
+
defAudioID: string;
|
|
22
|
+
userDefaultAudioInputDevice: string;
|
|
23
|
+
hostLabel: string;
|
|
24
|
+
updateMainWindow: boolean;
|
|
25
|
+
videoAlreadyOn: boolean;
|
|
26
|
+
islevel: string;
|
|
27
|
+
lock_screen: boolean;
|
|
28
|
+
shared: boolean;
|
|
29
|
+
|
|
30
|
+
updateAudioProducer: (audioProducer: Producer | null) => void;
|
|
31
|
+
updateLocalAudioProducer?: (localAudioProducer: Producer | null) => void;
|
|
32
|
+
updateLocalStream: (localStream: MediaStream | null) => void;
|
|
33
|
+
updateAudioParams: (audioParams: ProducerOptions) => void;
|
|
34
|
+
updateDefAudioID: (defAudioID: string) => void;
|
|
35
|
+
updateUserDefaultAudioInputDevice: (userDefaultAudioInputDevice: string) => void;
|
|
36
|
+
updateUpdateMainWindow: (updateMainWindow: boolean) => void;
|
|
37
|
+
|
|
38
|
+
// mediasfu functions
|
|
39
|
+
sleep: SleepType;
|
|
40
|
+
prepopulateUserMedia: PrepopulateUserMediaType;
|
|
41
|
+
createSendTransport: CreateSendTransportType;
|
|
42
|
+
connectSendTransportAudio: ConnectSendTransportAudioType;
|
|
43
|
+
|
|
44
|
+
getUpdatedAllParams: () => StreamSuccessAudioSwitchParameters;
|
|
45
|
+
[key: string]: any;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface StreamSuccessAudioSwitchOptions {
|
|
49
|
+
stream: MediaStream;
|
|
50
|
+
parameters: StreamSuccessAudioSwitchParameters;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Export the type definition for the function
|
|
54
|
+
export type StreamSuccessAudioSwitchType = (options: StreamSuccessAudioSwitchOptions) => Promise<void>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Handles the switching of the audio stream upon successful stream connection.
|
|
58
|
+
*
|
|
59
|
+
* @param {StreamSuccessAudioSwitchOptions} options - The options for the audio stream success switch.
|
|
60
|
+
* @param {MediaStream} options.stream - The new media stream containing the audio track.
|
|
61
|
+
* @param {Object} options.parameters - The parameters required for setting up the audio stream.
|
|
62
|
+
* @param {Producer} options.parameters.audioProducer - The current audio producer.
|
|
63
|
+
* @param {Producer} options.parameters.localAudioProducer - The local audio producer.
|
|
64
|
+
* @param {Socket} options.parameters.socket - The socket connection for communication.
|
|
65
|
+
* @param {Socket} options.parameters.localSocket - The local socket connection for communication.
|
|
66
|
+
* @param {string} options.parameters.roomName - The name of the room.
|
|
67
|
+
* @param {MediaStream | null} options.parameters.localStream - The local media stream.
|
|
68
|
+
* @param {MediaStream | null} options.parameters.localStreamAudio - The local audio stream.
|
|
69
|
+
* @param {ProducerOptions} options.parameters.audioParams - The audio parameters.
|
|
70
|
+
* @param {boolean} options.parameters.audioPaused - Indicates if the audio is paused.
|
|
71
|
+
* @param {boolean} options.parameters.audioAlreadyOn - Indicates if the audio is already on.
|
|
72
|
+
* @param {boolean} options.parameters.transportCreated - Indicates if the transport is created.
|
|
73
|
+
* @param {ProducerCodecOptions} options.parameters.audioParamse - Additional audio parameters.
|
|
74
|
+
* @param {string} options.parameters.defAudioID - The default audio device ID.
|
|
75
|
+
* @param {string} options.parameters.userDefaultAudioInputDevice - The user default audio input device.
|
|
76
|
+
* @param {string} options.parameters.hostLabel - The label of the host.
|
|
77
|
+
* @param {boolean} options.parameters.updateMainWindow - Indicates if the main window should be updated.
|
|
78
|
+
* @param {boolean} options.parameters.videoAlreadyOn - Indicates if the video is already on.
|
|
79
|
+
* @param {string} options.parameters.islevel - The level of the participant.
|
|
80
|
+
* @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.
|
|
81
|
+
* @param {boolean} options.parameters.shared - Indicates if the screen is shared.
|
|
82
|
+
* @param {Function} options.parameters.updateAudioProducer - Function to update the audio producer.
|
|
83
|
+
* @param {Function} options.parameters.updateLocalAudioProducer - Function to update the local audio producer.
|
|
84
|
+
* @param {Function} options.parameters.updateLocalStream - Function to update the local stream.
|
|
85
|
+
* @param {Function} options.parameters.updateAudioParams - Function to update the audio parameters.
|
|
86
|
+
* @param {Function} options.parameters.updateDefAudioID - Function to update the default audio device ID.
|
|
87
|
+
* @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update the user default audio input device.
|
|
88
|
+
* @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.
|
|
89
|
+
* @param {Function} options.parameters.sleep - Function to pause execution for a specified time.
|
|
90
|
+
* @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.
|
|
91
|
+
* @param {Function} options.parameters.createSendTransport - Function to create a send transport.
|
|
92
|
+
* @param {Function} options.parameters.connectSendTransportAudio - Function to connect the send transport for audio.
|
|
93
|
+
*
|
|
94
|
+
* @returns {Promise<void>} A promise that resolves when the audio stream switch is complete.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* const options = {
|
|
98
|
+
* stream: newAudioStream, // MediaStream object containing the new audio track
|
|
99
|
+
* parameters: {
|
|
100
|
+
* audioProducer: currentAudioProducer,
|
|
101
|
+
* localAudioProducer: localAudioProducerInstance,
|
|
102
|
+
* localSocket: localSocketInstance,
|
|
103
|
+
* socket: socketInstance,
|
|
104
|
+
* roomName: "Room1",
|
|
105
|
+
* localStream: null,
|
|
106
|
+
* localStreamAudio: null,
|
|
107
|
+
* audioParams: audioProducerOptions,
|
|
108
|
+
* audioPaused: false,
|
|
109
|
+
* audioAlreadyOn: true,
|
|
110
|
+
* transportCreated: false,
|
|
111
|
+
* audioParamse: additionalAudioParams,
|
|
112
|
+
* defAudioID: "default-audio-device-id",
|
|
113
|
+
* userDefaultAudioInputDevice: "user-input-device-id",
|
|
114
|
+
* hostLabel: "Host",
|
|
115
|
+
* islevel: "1",
|
|
116
|
+
* videoAlreadyOn: false,
|
|
117
|
+
* lock_screen: false,
|
|
118
|
+
* shared: false,
|
|
119
|
+
* updateAudioProducer: updateAudioProducerFunction,
|
|
120
|
+
* updateLocalAudioProducer: updateLocalAudioProducerFunction,
|
|
121
|
+
* updateLocalStream: updateLocalStreamFunction,
|
|
122
|
+
* updateAudioParams: updateAudioParamsFunction,
|
|
123
|
+
* updateDefAudioID: updateDefAudioIDFunction,
|
|
124
|
+
* updateUserDefaultAudioInputDevice: updateUserDefaultAudioInputDeviceFunction,
|
|
125
|
+
* updateUpdateMainWindow: updateMainWindowFunction,
|
|
126
|
+
* sleep: sleepFunction,
|
|
127
|
+
* prepopulateUserMedia: prepopulateUserMediaFunction,
|
|
128
|
+
* createSendTransport: createSendTransportFunction,
|
|
129
|
+
* connectSendTransportAudio: connectSendTransportAudioFunction,
|
|
130
|
+
* },
|
|
131
|
+
* };
|
|
132
|
+
*
|
|
133
|
+
* streamSuccessAudioSwitch(options)
|
|
134
|
+
* .then(() => {
|
|
135
|
+
* console.log('Audio stream switched successfully');
|
|
136
|
+
* })
|
|
137
|
+
* .catch(error => {
|
|
138
|
+
* console.error('Error switching audio stream:', error);
|
|
139
|
+
* });
|
|
140
|
+
*/
|
|
141
|
+
|
|
142
|
+
export const streamSuccessAudioSwitch = async ({
|
|
143
|
+
stream,
|
|
144
|
+
parameters,
|
|
145
|
+
}: StreamSuccessAudioSwitchOptions): Promise<void> => {
|
|
146
|
+
|
|
147
|
+
let {
|
|
148
|
+
audioProducer,
|
|
149
|
+
localAudioProducer,
|
|
150
|
+
socket,
|
|
151
|
+
localSocket,
|
|
152
|
+
roomName,
|
|
153
|
+
localStream,
|
|
154
|
+
localStreamAudio,
|
|
155
|
+
audioParams,
|
|
156
|
+
audioPaused,
|
|
157
|
+
audioAlreadyOn,
|
|
158
|
+
transportCreated,
|
|
159
|
+
audioParamse,
|
|
160
|
+
defAudioID,
|
|
161
|
+
userDefaultAudioInputDevice,
|
|
162
|
+
hostLabel,
|
|
163
|
+
updateMainWindow,
|
|
164
|
+
videoAlreadyOn,
|
|
165
|
+
islevel,
|
|
166
|
+
lock_screen,
|
|
167
|
+
shared,
|
|
168
|
+
|
|
169
|
+
updateAudioProducer,
|
|
170
|
+
updateLocalAudioProducer,
|
|
171
|
+
updateLocalStream,
|
|
172
|
+
updateAudioParams,
|
|
173
|
+
updateDefAudioID,
|
|
174
|
+
updateUserDefaultAudioInputDevice,
|
|
175
|
+
updateUpdateMainWindow,
|
|
176
|
+
|
|
177
|
+
//mediasfu functions
|
|
178
|
+
sleep,
|
|
179
|
+
prepopulateUserMedia,
|
|
180
|
+
createSendTransport,
|
|
181
|
+
connectSendTransportAudio,
|
|
182
|
+
} = parameters;
|
|
183
|
+
|
|
184
|
+
// Get the new default audio device ID
|
|
185
|
+
let newDefAudioID = stream.getAudioTracks()[0].getSettings().deviceId;
|
|
186
|
+
|
|
187
|
+
// Check if the audio device has changed
|
|
188
|
+
if (newDefAudioID !== defAudioID) {
|
|
189
|
+
// Close the current audioProducer
|
|
190
|
+
if (audioProducer) {
|
|
191
|
+
audioProducer.close();
|
|
192
|
+
updateAudioProducer(audioProducer);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Emit a pauseProducerMedia event to pause the audio media
|
|
196
|
+
socket.emit("pauseProducerMedia", {
|
|
197
|
+
mediaTag: "audio",
|
|
198
|
+
roomName: roomName,
|
|
199
|
+
force: true,
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
try {
|
|
203
|
+
if (localSocket && localSocket.id) {
|
|
204
|
+
if (localAudioProducer) {
|
|
205
|
+
localAudioProducer.close();
|
|
206
|
+
if (updateLocalAudioProducer){
|
|
207
|
+
updateLocalAudioProducer(localAudioProducer);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
localSocket.emit("pauseProducerMedia", {
|
|
211
|
+
mediaTag: "audio",
|
|
212
|
+
roomName: roomName,
|
|
213
|
+
force: true,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
} catch {
|
|
217
|
+
// Do nothing
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Update the localStreamAudio with the new audio tracks
|
|
221
|
+
localStreamAudio = stream;
|
|
222
|
+
|
|
223
|
+
// If localStream is null, create a new MediaStream with the new audio track
|
|
224
|
+
if (localStream == null) {
|
|
225
|
+
localStream = new MediaStream([
|
|
226
|
+
localStreamAudio.getAudioTracks()[0],
|
|
227
|
+
]);
|
|
228
|
+
} else {
|
|
229
|
+
// Remove all existing audio tracks from localStream and add the new audio track
|
|
230
|
+
localStream.getAudioTracks().forEach((track) => {
|
|
231
|
+
localStream!.removeTrack(track);
|
|
232
|
+
});
|
|
233
|
+
localStream.addTrack(localStreamAudio.getAudioTracks()[0]);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Update localStream
|
|
237
|
+
updateLocalStream(localStream);
|
|
238
|
+
|
|
239
|
+
// Get the new default audio device ID from the new audio track
|
|
240
|
+
const audioTracked = localStream.getAudioTracks()[0];
|
|
241
|
+
defAudioID = audioTracked.getSettings().deviceId || "";
|
|
242
|
+
updateDefAudioID(defAudioID);
|
|
243
|
+
|
|
244
|
+
// Update userDefaultAudioInputDevice
|
|
245
|
+
userDefaultAudioInputDevice = defAudioID;
|
|
246
|
+
updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice);
|
|
247
|
+
|
|
248
|
+
// Update audioParams with the new audio track
|
|
249
|
+
audioParams = {
|
|
250
|
+
track: localStream.getAudioTracks()[0],
|
|
251
|
+
...audioParamse,
|
|
252
|
+
};
|
|
253
|
+
updateAudioParams(audioParams);
|
|
254
|
+
|
|
255
|
+
// Sleep for 500 milliseconds
|
|
256
|
+
await sleep({ ms: 500 });
|
|
257
|
+
|
|
258
|
+
// Create a new send transport if not created, otherwise, connect the existing transport
|
|
259
|
+
if (!transportCreated) {
|
|
260
|
+
try {
|
|
261
|
+
await createSendTransport({
|
|
262
|
+
parameters: {
|
|
263
|
+
...parameters,
|
|
264
|
+
audioParams: audioParams,
|
|
265
|
+
},
|
|
266
|
+
option: "audio",
|
|
267
|
+
});
|
|
268
|
+
} catch (error) {
|
|
269
|
+
console.error("Error creating send transport:", error);
|
|
270
|
+
}
|
|
271
|
+
} else {
|
|
272
|
+
await connectSendTransportAudio({
|
|
273
|
+
audioParams,
|
|
274
|
+
parameters,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// If audio is paused and not already on, pause the audioProducer and emit a pauseProducerMedia event
|
|
279
|
+
if (audioPaused === true && !audioAlreadyOn) {
|
|
280
|
+
audioProducer!.pause();
|
|
281
|
+
updateAudioProducer(audioProducer);
|
|
282
|
+
socket.emit("pauseProducerMedia", {
|
|
283
|
+
mediaTag: "audio",
|
|
284
|
+
roomName: roomName,
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
try {
|
|
288
|
+
if (localSocket && localSocket.id) {
|
|
289
|
+
localAudioProducer!.pause();
|
|
290
|
+
if (updateLocalAudioProducer){
|
|
291
|
+
updateLocalAudioProducer(localAudioProducer!);
|
|
292
|
+
}
|
|
293
|
+
localSocket.emit("pauseProducerMedia", {
|
|
294
|
+
mediaTag: "audio",
|
|
295
|
+
roomName: roomName,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
} catch {
|
|
299
|
+
// Do nothing
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Update the UI based on the participant's level and screen lock status
|
|
305
|
+
if (!videoAlreadyOn && islevel === "2") {
|
|
306
|
+
if (!lock_screen && !shared) {
|
|
307
|
+
updateMainWindow = true;
|
|
308
|
+
updateUpdateMainWindow(updateMainWindow);
|
|
309
|
+
await prepopulateUserMedia({ name: hostLabel, parameters });
|
|
310
|
+
updateMainWindow = false;
|
|
311
|
+
updateUpdateMainWindow(updateMainWindow);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { Socket } from "socket.io-client";
|
|
4
|
+
import {
|
|
5
|
+
SleepType, CreateSendTransportType, ConnectSendTransportScreenType, DisconnectSendTransportScreenType, StopShareScreenType, ReorderStreamsType, PrepopulateUserMediaType, RePortType,
|
|
6
|
+
ShowAlert, CreateSendTransportParameters, ConnectSendTransportScreenParameters, DisconnectSendTransportScreenParameters, StopShareScreenParameters, ReorderStreamsParameters, PrepopulateUserMediaParameters,
|
|
7
|
+
EventType
|
|
8
|
+
} from "../types/types";
|
|
9
|
+
|
|
10
|
+
export interface StreamSuccessScreenParameters extends CreateSendTransportParameters, ConnectSendTransportScreenParameters, DisconnectSendTransportScreenParameters, StopShareScreenParameters, ReorderStreamsParameters, PrepopulateUserMediaParameters {
|
|
11
|
+
socket: Socket;
|
|
12
|
+
transportCreated: boolean;
|
|
13
|
+
localStreamScreen: MediaStream | null;
|
|
14
|
+
screenAlreadyOn: boolean;
|
|
15
|
+
screenAction: boolean;
|
|
16
|
+
transportCreatedScreen: boolean;
|
|
17
|
+
hostLabel: string;
|
|
18
|
+
eventType: EventType;
|
|
19
|
+
showAlert?: ShowAlert;
|
|
20
|
+
annotateScreenStream: boolean;
|
|
21
|
+
shared: boolean;
|
|
22
|
+
|
|
23
|
+
updateTransportCreatedScreen: (transportCreatedScreen: boolean) => void;
|
|
24
|
+
updateScreenAlreadyOn: (screenAlreadyOn: boolean) => void;
|
|
25
|
+
updateScreenAction: (screenAction: boolean) => void;
|
|
26
|
+
updateTransportCreated: (transportCreated: boolean) => void;
|
|
27
|
+
updateLocalStreamScreen: (localStreamScreen: MediaStream | null) => void;
|
|
28
|
+
updateShared: (shared: boolean) => void;
|
|
29
|
+
updateIsScreenboardModalVisible: (isVisible: boolean) => void;
|
|
30
|
+
|
|
31
|
+
// mediasfu functions
|
|
32
|
+
sleep: SleepType;
|
|
33
|
+
createSendTransport: CreateSendTransportType;
|
|
34
|
+
connectSendTransportScreen: ConnectSendTransportScreenType;
|
|
35
|
+
disconnectSendTransportScreen: DisconnectSendTransportScreenType;
|
|
36
|
+
stopShareScreen: StopShareScreenType;
|
|
37
|
+
reorderStreams: ReorderStreamsType;
|
|
38
|
+
prepopulateUserMedia: PrepopulateUserMediaType;
|
|
39
|
+
rePort: RePortType;
|
|
40
|
+
|
|
41
|
+
getUpdatedAllParams: () => StreamSuccessScreenParameters;
|
|
42
|
+
[key: string]: any;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface StreamSuccessScreenOptions {
|
|
46
|
+
stream: MediaStream;
|
|
47
|
+
parameters: StreamSuccessScreenParameters;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Export the type definition for the function
|
|
51
|
+
export type StreamSuccessScreenType = (options: StreamSuccessScreenOptions) => Promise<void>;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Handles the successful initiation of screen sharing.
|
|
55
|
+
*
|
|
56
|
+
* @param {StreamSuccessScreenOptions} options - The options for the screen sharing success handler.
|
|
57
|
+
* @param {MediaStream} options.stream - The media stream to be shared.
|
|
58
|
+
* @param {Object} options.parameters - The parameters required for screen sharing.
|
|
59
|
+
* @param {Socket} options.parameters.socket - The socket instance for communication.
|
|
60
|
+
* @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is already created.
|
|
61
|
+
* @param {MediaStream | null} options.parameters.localStreamScreen - The local screen media stream.
|
|
62
|
+
* @param {boolean} options.parameters.screenAlreadyOn - Flag indicating if the screen is already being shared.
|
|
63
|
+
* @param {boolean} options.parameters.screenAction - Flag indicating if the screen share action is requested.
|
|
64
|
+
* @param {boolean} options.parameters.transportCreatedScreen - Flag indicating if the screen transport is created.
|
|
65
|
+
* @param {string} options.parameters.hostLabel - The label of the host.
|
|
66
|
+
* @param {string} options.parameters.eventType - The type of the event (e.g., conference).
|
|
67
|
+
* @param {Function} options.parameters.showAlert - Function to show alerts.
|
|
68
|
+
* @param {boolean} options.parameters.annotateScreenStream - Flag indicating if screen annotation is enabled.
|
|
69
|
+
* @param {Function} options.parameters.updateTransportCreatedScreen - Function to update the screen transport creation state.
|
|
70
|
+
* @param {Function} options.parameters.updateScreenAlreadyOn - Function to update the screen sharing state.
|
|
71
|
+
* @param {Function} options.parameters.updateScreenAction - Function to update the screen action state.
|
|
72
|
+
* @param {Function} options.parameters.updateTransportCreated - Function to update the transport creation state.
|
|
73
|
+
* @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen stream.
|
|
74
|
+
* @param {Function} options.parameters.updateShared - Function to update the shared state.
|
|
75
|
+
* @param {Function} options.parameters.updateIsScreenboardModalVisible - Function to update the screenboard modal visibility.
|
|
76
|
+
* @param {Function} options.parameters.sleep - Function to pause execution for a specified duration.
|
|
77
|
+
* @param {Function} options.parameters.createSendTransport - Function to create a send transport.
|
|
78
|
+
* @param {Function} options.parameters.connectSendTransportScreen - Function to connect the send transport for screen sharing.
|
|
79
|
+
* @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport for screen sharing.
|
|
80
|
+
* @param {Function} options.parameters.stopShareScreen - Function to stop screen sharing.
|
|
81
|
+
* @param {Function} options.parameters.reorderStreams - Function to reorder streams.
|
|
82
|
+
* @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.
|
|
83
|
+
* @param {Function} options.parameters.rePort - Function to reinitialize ports.
|
|
84
|
+
*
|
|
85
|
+
* @returns {Promise<void>} A promise that resolves when the screen sharing setup is complete.
|
|
86
|
+
*
|
|
87
|
+
* @throws Will throw an error if there is an issue with screen sharing.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```typescript
|
|
91
|
+
* await streamSuccessScreen({
|
|
92
|
+
* stream: mediaStream,
|
|
93
|
+
* parameters: {
|
|
94
|
+
* socket,
|
|
95
|
+
* transportCreated,
|
|
96
|
+
* localStreamScreen: null,
|
|
97
|
+
* screenAlreadyOn: false,
|
|
98
|
+
* screenAction: true,
|
|
99
|
+
* transportCreatedScreen: false,
|
|
100
|
+
* hostLabel: "Host",
|
|
101
|
+
* eventType: "conference",
|
|
102
|
+
* showAlert,
|
|
103
|
+
* annotateScreenStream: false,
|
|
104
|
+
* updateTransportCreatedScreen,
|
|
105
|
+
* updateScreenAlreadyOn,
|
|
106
|
+
* updateScreenAction,
|
|
107
|
+
* updateTransportCreated,
|
|
108
|
+
* updateLocalStreamScreen,
|
|
109
|
+
* updateShared,
|
|
110
|
+
* updateIsScreenboardModalVisible,
|
|
111
|
+
* sleep,
|
|
112
|
+
* createSendTransport,
|
|
113
|
+
* connectSendTransportScreen,
|
|
114
|
+
* disconnectSendTransportScreen,
|
|
115
|
+
* stopShareScreen,
|
|
116
|
+
* reorderStreams,
|
|
117
|
+
* prepopulateUserMedia,
|
|
118
|
+
* rePort,
|
|
119
|
+
* },
|
|
120
|
+
* });
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
|
|
124
|
+
export const streamSuccessScreen = async ({
|
|
125
|
+
stream,
|
|
126
|
+
parameters,
|
|
127
|
+
}: StreamSuccessScreenOptions): Promise<void> => {
|
|
128
|
+
let { getUpdatedAllParams } = parameters;
|
|
129
|
+
parameters = getUpdatedAllParams();
|
|
130
|
+
|
|
131
|
+
let {
|
|
132
|
+
socket,
|
|
133
|
+
transportCreated,
|
|
134
|
+
localStreamScreen,
|
|
135
|
+
screenAlreadyOn,
|
|
136
|
+
screenAction,
|
|
137
|
+
transportCreatedScreen,
|
|
138
|
+
hostLabel,
|
|
139
|
+
eventType,
|
|
140
|
+
showAlert,
|
|
141
|
+
annotateScreenStream,
|
|
142
|
+
|
|
143
|
+
updateTransportCreatedScreen,
|
|
144
|
+
updateScreenAlreadyOn,
|
|
145
|
+
updateScreenAction,
|
|
146
|
+
updateTransportCreated,
|
|
147
|
+
updateLocalStreamScreen,
|
|
148
|
+
updateShared,
|
|
149
|
+
updateIsScreenboardModalVisible,
|
|
150
|
+
sleep,
|
|
151
|
+
|
|
152
|
+
// mediasfu functions
|
|
153
|
+
createSendTransport,
|
|
154
|
+
connectSendTransportScreen,
|
|
155
|
+
disconnectSendTransportScreen,
|
|
156
|
+
stopShareScreen,
|
|
157
|
+
reorderStreams,
|
|
158
|
+
prepopulateUserMedia,
|
|
159
|
+
rePort,
|
|
160
|
+
} = parameters;
|
|
161
|
+
|
|
162
|
+
// Share screen on success
|
|
163
|
+
localStreamScreen = stream;
|
|
164
|
+
updateLocalStreamScreen(localStreamScreen);
|
|
165
|
+
|
|
166
|
+
try {
|
|
167
|
+
// Create transport if not created else connect transport
|
|
168
|
+
if (!transportCreated) {
|
|
169
|
+
await createSendTransport({
|
|
170
|
+
option: "screen",
|
|
171
|
+
parameters: { ...parameters, localStreamScreen },
|
|
172
|
+
});
|
|
173
|
+
} else {
|
|
174
|
+
await connectSendTransportScreen({
|
|
175
|
+
stream: localStreamScreen,
|
|
176
|
+
parameters: { ...parameters, localStreamScreen },
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Alert the socket that you are sharing the screen
|
|
181
|
+
socket.emit("startScreenShare");
|
|
182
|
+
} catch (error: any) {
|
|
183
|
+
showAlert?.({
|
|
184
|
+
message: error.message,
|
|
185
|
+
type: "danger",
|
|
186
|
+
duration: 3000,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Re-update the screen display
|
|
191
|
+
try {
|
|
192
|
+
updateShared(true);
|
|
193
|
+
await prepopulateUserMedia({
|
|
194
|
+
name: hostLabel,
|
|
195
|
+
parameters: { ...parameters, localStreamScreen, shared: true },
|
|
196
|
+
});
|
|
197
|
+
} catch (error) {
|
|
198
|
+
console.error("Error updating shared screen UI:", error);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Update the screen sharing state
|
|
202
|
+
screenAlreadyOn = true;
|
|
203
|
+
updateScreenAlreadyOn(screenAlreadyOn);
|
|
204
|
+
|
|
205
|
+
// Reorder streams if required
|
|
206
|
+
try {
|
|
207
|
+
if (eventType === "conference") {
|
|
208
|
+
await reorderStreams({ add: false, screenChanged: true, parameters });
|
|
209
|
+
await prepopulateUserMedia({ name: hostLabel, parameters });
|
|
210
|
+
} else {
|
|
211
|
+
await reorderStreams({ parameters });
|
|
212
|
+
}
|
|
213
|
+
} catch {
|
|
214
|
+
try {
|
|
215
|
+
await rePort({ parameters });
|
|
216
|
+
} catch {
|
|
217
|
+
// console.error("Error reordering streams:", error);
|
|
218
|
+
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Handle screen share end
|
|
223
|
+
localStreamScreen.getVideoTracks()[0].onended = async function () {
|
|
224
|
+
// Supports both manual and automatic screen share end
|
|
225
|
+
await disconnectSendTransportScreen({ parameters });
|
|
226
|
+
await stopShareScreen({ parameters });
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
// If user requested to share screen, update the screenAction state
|
|
230
|
+
if (screenAction === true) {
|
|
231
|
+
screenAction = false;
|
|
232
|
+
}
|
|
233
|
+
updateScreenAction(screenAction);
|
|
234
|
+
|
|
235
|
+
// Update the transport created state
|
|
236
|
+
transportCreatedScreen = true;
|
|
237
|
+
updateTransportCreatedScreen(transportCreatedScreen);
|
|
238
|
+
transportCreated = true;
|
|
239
|
+
updateTransportCreated(transportCreated);
|
|
240
|
+
|
|
241
|
+
// Handle screen annotation modal
|
|
242
|
+
try {
|
|
243
|
+
if (annotateScreenStream) {
|
|
244
|
+
annotateScreenStream = false;
|
|
245
|
+
updateIsScreenboardModalVisible(true);
|
|
246
|
+
await sleep({ ms: 500 });
|
|
247
|
+
updateIsScreenboardModalVisible(false);
|
|
248
|
+
}
|
|
249
|
+
} catch (error) {
|
|
250
|
+
console.error("Error handling screen annotation:", error);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
};
|
|
255
|
+
|