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.
Files changed (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/dist/index.cjs +7707 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.ts +7285 -0
  6. package/dist/index.js +7690 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +78 -0
  9. package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +68 -0
  10. package/src/consumers/addVideosGrid.ts +18 -0
  11. package/src/consumers/autoAdjust.ts +100 -0
  12. package/src/consumers/calculateRowsAndColumns.ts +51 -0
  13. package/src/consumers/changeVids.ts +753 -0
  14. package/src/consumers/checkGrid.ts +100 -0
  15. package/src/consumers/checkPermission.ts +89 -0
  16. package/src/consumers/checkScreenShare.ts +114 -0
  17. package/src/consumers/closeAndResize.ts +401 -0
  18. package/src/consumers/compareActiveNames.ts +122 -0
  19. package/src/consumers/compareScreenStates.ts +117 -0
  20. package/src/consumers/connectIps.ts +175 -0
  21. package/src/consumers/connectLocalIps.ts +103 -0
  22. package/src/consumers/connectRecvTransport.ts +158 -0
  23. package/src/consumers/connectSendTransport.ts +150 -0
  24. package/src/consumers/connectSendTransportAudio.ts +161 -0
  25. package/src/consumers/connectSendTransportScreen.ts +169 -0
  26. package/src/consumers/connectSendTransportVideo.ts +149 -0
  27. package/src/consumers/consumerResume.ts +25 -0
  28. package/src/consumers/controlMedia.ts +118 -0
  29. package/src/consumers/createSendTransport.ts +312 -0
  30. package/src/consumers/disconnectSendTransportAudio.ts +170 -0
  31. package/src/consumers/disconnectSendTransportScreen.ts +130 -0
  32. package/src/consumers/disconnectSendTransportVideo.ts +161 -0
  33. package/src/consumers/dispStreams.ts +694 -0
  34. package/src/consumers/generatePageContent.ts +118 -0
  35. package/src/consumers/getEstimate.ts +124 -0
  36. package/src/consumers/getPipedProducersAlt.ts +96 -0
  37. package/src/consumers/getProducersPiped.ts +89 -0
  38. package/src/consumers/getVideos.ts +107 -0
  39. package/src/consumers/mixStreams.ts +97 -0
  40. package/src/consumers/onScreenChanges.ts +106 -0
  41. package/src/consumers/prepopulateUserMedia.ts +18 -0
  42. package/src/consumers/processConsumerTransports.ts +157 -0
  43. package/src/consumers/processConsumerTransportsAudio.ts +121 -0
  44. package/src/consumers/rePort.ts +123 -0
  45. package/src/consumers/reUpdateInter.ts +289 -0
  46. package/src/consumers/readjust.ts +170 -0
  47. package/src/consumers/receiveAllPipedTransports.ts +77 -0
  48. package/src/consumers/receiveRoomMessages.ts +55 -0
  49. package/src/consumers/reorderStreams.ts +246 -0
  50. package/src/consumers/requestScreenShare.ts +103 -0
  51. package/src/consumers/resumePauseAudioStreams.ts +174 -0
  52. package/src/consumers/resumePauseStreams.ts +110 -0
  53. package/src/consumers/resumeSendTransportAudio.ts +143 -0
  54. package/src/consumers/signalNewConsumerTransport.ts +179 -0
  55. package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +130 -0
  56. package/src/consumers/socketReceiveMethods/newPipeProducer.ts +138 -0
  57. package/src/consumers/socketReceiveMethods/producerClosed.ts +102 -0
  58. package/src/consumers/startShareScreen.ts +124 -0
  59. package/src/consumers/stopShareScreen.ts +241 -0
  60. package/src/consumers/streamSuccessAudio.ts +297 -0
  61. package/src/consumers/streamSuccessAudioSwitch.ts +315 -0
  62. package/src/consumers/streamSuccessScreen.ts +255 -0
  63. package/src/consumers/streamSuccessVideo.ts +373 -0
  64. package/src/consumers/switchUserAudio.ts +140 -0
  65. package/src/consumers/switchUserVideo.ts +201 -0
  66. package/src/consumers/switchUserVideoAlt.ts +331 -0
  67. package/src/consumers/trigger.ts +250 -0
  68. package/src/consumers/updateMiniCardsGrid.ts +150 -0
  69. package/src/consumers/updateParticipantAudioDecibels.ts +56 -0
  70. package/src/index.ts +119 -0
  71. package/src/methods/background/launchBackground.ts +16 -0
  72. package/src/methods/breakoutRooms/breakoutRoomUpdated.ts +161 -0
  73. package/src/methods/breakoutRooms/handleStartBreakout.ts +96 -0
  74. package/src/methods/breakoutRooms/handleStopBreakout.ts +72 -0
  75. package/src/methods/breakoutRooms/index.ts +4 -0
  76. package/src/methods/breakoutRooms/launchBreakoutRooms.ts +31 -0
  77. package/src/methods/coHost/launchCoHost.ts +28 -0
  78. package/src/methods/coHostMethods/index.ts +2 -0
  79. package/src/methods/coHostMethods/modifyCoHostSettings.ts +94 -0
  80. package/src/methods/displaySettings/index.ts +1 -0
  81. package/src/methods/displaySettings/launchDisplaySettings.ts +31 -0
  82. package/src/methods/displaySettings/modifyDisplaySettings.ts +242 -0
  83. package/src/methods/exit/confirmExit.ts +60 -0
  84. package/src/methods/exit/index.ts +2 -0
  85. package/src/methods/exit/launchConfirmExit.ts +29 -0
  86. package/src/methods/index.ts +5 -0
  87. package/src/methods/mediaSettings/launchMediaSettings.ts +61 -0
  88. package/src/methods/menu/launchMenuModal.ts +28 -0
  89. package/src/methods/message/index.ts +1 -0
  90. package/src/methods/message/launchMessages.ts +27 -0
  91. package/src/methods/message/sendMessage.ts +175 -0
  92. package/src/methods/participants/index.ts +3 -0
  93. package/src/methods/participants/launchParticipants.ts +25 -0
  94. package/src/methods/participants/messageParticipants.ts +78 -0
  95. package/src/methods/participants/muteParticipants.ts +79 -0
  96. package/src/methods/participants/removeParticipants.ts +97 -0
  97. package/src/methods/polls/handleCreatePoll.ts +66 -0
  98. package/src/methods/polls/handleEndPoll.ts +64 -0
  99. package/src/methods/polls/handleVotePoll.ts +76 -0
  100. package/src/methods/polls/index.ts +3 -0
  101. package/src/methods/polls/launchPoll.ts +25 -0
  102. package/src/methods/prejoin/handleCreateRoom.ts +441 -0
  103. package/src/methods/prejoin/handleJoinRoom.ts +153 -0
  104. package/src/methods/prejoin/index.ts +14 -0
  105. package/src/methods/recording/checkPauseState.ts +57 -0
  106. package/src/methods/recording/checkResumeState.ts +42 -0
  107. package/src/methods/recording/confirmRecording.ts +241 -0
  108. package/src/methods/recording/launchRecording.ts +114 -0
  109. package/src/methods/recording/recordPauseTimer.ts +52 -0
  110. package/src/methods/recording/recordResumeTimer.ts +92 -0
  111. package/src/methods/recording/recordStartTimer.ts +106 -0
  112. package/src/methods/recording/recordUpdateTimer.ts +49 -0
  113. package/src/methods/recording/startRecording.ts +268 -0
  114. package/src/methods/recording/stopRecording.ts +124 -0
  115. package/src/methods/recording/updateRecording.ts +245 -0
  116. package/src/methods/requests/index.ts +1 -0
  117. package/src/methods/requests/launchRequests.ts +25 -0
  118. package/src/methods/requests/respondToRequests.ts +108 -0
  119. package/src/methods/settings/index.ts +2 -0
  120. package/src/methods/settings/launchSettings.ts +25 -0
  121. package/src/methods/settings/modifySettings.ts +99 -0
  122. package/src/methods/stream/clickVideo.ts +337 -0
  123. package/src/methods/stream/index.ts +3 -0
  124. package/src/methods/stream/switchAudio.ts +73 -0
  125. package/src/methods/stream/switchVideo.ts +148 -0
  126. package/src/methods/stream/switchVideoAlt.ts +152 -0
  127. package/src/methods/utils/checkLimitsAndMakeRequest.ts +103 -0
  128. package/src/methods/utils/validateAlphanumeric.ts +41 -0
  129. package/src/methods/waiting/index.ts +1 -0
  130. package/src/methods/waiting/launchWaiting.ts +26 -0
  131. package/src/methods/waiting/respondToWaiting.ts +82 -0
  132. package/src/methods/welcome/handleWelcomeRequest.ts +189 -0
  133. package/src/methods/welcome/index.ts +5 -0
  134. package/src/methods/whiteboard/handleStartWhiteboard.ts +65 -0
  135. package/src/methods/whiteboard/handleStopWhiteboard.ts +48 -0
  136. package/src/methods/whiteboard/index.ts +4 -0
  137. package/src/methods/whiteboard/launchConfigureWhiteboard.ts +29 -0
  138. package/src/producers/producerEmits/joinConRoom.ts +153 -0
  139. package/src/sockets/SocketManager.ts +232 -0
  140. package/src/types/shared-base-types.ts +752 -0
  141. 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
+