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,124 @@
1
+
2
+ import { StreamSuccessScreenType, StreamSuccessScreenParameters, ShowAlert } from "../types/types";
3
+ export interface StartShareScreenParameters extends StreamSuccessScreenParameters {
4
+ shared: boolean;
5
+ showAlert?: ShowAlert;
6
+ updateShared: (shared: boolean) => void;
7
+ mediaDevices: MediaDevices;
8
+ onWeb: boolean;
9
+ targetWidth?: number;
10
+ targetHeight?: number;
11
+
12
+ // mediasfu functions
13
+ streamSuccessScreen: StreamSuccessScreenType;
14
+ [key: string]: any;
15
+ }
16
+
17
+ export interface StartShareScreenOptions {
18
+ parameters: StartShareScreenParameters;
19
+ }
20
+
21
+ // Export the type definition for the function
22
+ export type StartShareScreenType = (options: StartShareScreenOptions) => Promise<void>;
23
+
24
+ /**
25
+ * Starts the screen sharing process.
26
+ *
27
+ * @param {StartShareScreenOptions} options - The options for starting screen sharing.
28
+ * @param {Object} options.parameters - The parameters for screen sharing.
29
+ * @param {boolean} options.parameters.shared - Indicates if the screen is currently being shared.
30
+ * @param {Function} options.parameters.showAlert - Function to show alert messages.
31
+ * @param {Function} options.parameters.updateShared - Function to update the shared state.
32
+ * @param {MediaDevices} options.parameters.mediaDevices - The media devices available for screen sharing.
33
+ * @param {boolean} options.parameters.onWeb - Indicates if the application is running on a web platform.
34
+ * @param {number} [options.parameters.targetWidth] - The target width for screen sharing.
35
+ * @param {number} [options.parameters.targetHeight] - The target height for screen sharing.
36
+ * @param {Function} options.parameters.streamSuccessScreen - Function to handle successful screen sharing.
37
+ *
38
+ * @returns {Promise<void>} A promise that resolves when the screen sharing process is complete.
39
+ *
40
+ * @throws Will log an error message if there is an issue starting the screen share.
41
+ *
42
+ * @example
43
+ * const options = {
44
+ * parameters: {
45
+ * shared: false,
46
+ * showAlert: showAlertFunction,
47
+ * updateShared: updateSharedFunction,
48
+ * mediaDevices: navigator.mediaDevices,
49
+ * onWeb: true,
50
+ * targetWidth: 1280,
51
+ * targetHeight: 720,
52
+ * streamSuccessScreen: streamSuccessFunction,
53
+ * },
54
+ * };
55
+ *
56
+ * startShareScreen(options)
57
+ * .then(() => {
58
+ * console.log('Screen sharing started successfully');
59
+ * })
60
+ * .catch(error => {
61
+ * console.error('Error starting screen share:', error);
62
+ * });
63
+ */
64
+
65
+ export async function startShareScreen({ parameters }: StartShareScreenOptions): Promise<void> {
66
+ let {
67
+ shared,
68
+ showAlert,
69
+ updateShared,
70
+ mediaDevices,
71
+ onWeb,
72
+ targetWidth = 1280,
73
+ targetHeight = 720,
74
+
75
+ streamSuccessScreen,
76
+ } = parameters;
77
+
78
+ try {
79
+ if (!onWeb) {
80
+ showAlert?.({
81
+ message: "You cannot share screen while on mobile",
82
+ type: "danger",
83
+ duration: 3000,
84
+ });
85
+ return;
86
+ }
87
+
88
+ if (mediaDevices && mediaDevices.getDisplayMedia) {
89
+ shared = true;
90
+ await mediaDevices
91
+ .getDisplayMedia({
92
+ video: {
93
+ width: targetWidth,
94
+ height: targetHeight,
95
+ frameRate: 30,
96
+ },
97
+ audio: false,
98
+ })
99
+ .then(async (stream: MediaStream) => {
100
+ await streamSuccessScreen({ stream, parameters });
101
+ })
102
+ .catch(async () => {
103
+ shared = false;
104
+ showAlert?.({
105
+ message: "Could not share screen, check and retry",
106
+ type: "danger",
107
+ duration: 3000,
108
+ });
109
+ });
110
+ } else {
111
+ showAlert?.({
112
+ message: "Could not share screen, check and retry",
113
+ type: "danger",
114
+ duration: 3000,
115
+ });
116
+ }
117
+
118
+ // Update the shared variable
119
+ updateShared(shared);
120
+ } catch (error) {
121
+ console.log("Error starting screen share", error);
122
+ }
123
+ }
124
+
@@ -0,0 +1,241 @@
1
+ import { DisconnectSendTransportScreenType, PrepopulateUserMediaType, ReorderStreamsType, GetVideosType, DisconnectSendTransportScreenParameters, PrepopulateUserMediaParameters, ReorderStreamsParameters, EventType } from '../types/types';
2
+ export interface StopShareScreenParameters extends DisconnectSendTransportScreenParameters, PrepopulateUserMediaParameters, ReorderStreamsParameters {
3
+ shared: boolean;
4
+ shareScreenStarted: boolean;
5
+ shareEnded: boolean;
6
+ updateMainWindow: boolean;
7
+ defer_receive: boolean;
8
+ hostLabel: string;
9
+ lock_screen: boolean;
10
+ forceFullDisplay: boolean;
11
+ firstAll: boolean;
12
+ first_round: boolean;
13
+ localStreamScreen: MediaStream | null;
14
+ eventType: EventType;
15
+ prevForceFullDisplay: boolean;
16
+ annotateScreenStream: boolean;
17
+
18
+ updateShared: (shared: boolean) => void;
19
+ updateShareScreenStarted: (shareScreenStarted: boolean) => void;
20
+ updateShareEnded: (shareEnded: boolean) => void;
21
+ updateUpdateMainWindow: (updateMainWindow: boolean) => void;
22
+ updateDefer_receive: (defer_receive: boolean) => void;
23
+ updateLock_screen: (lock_screen: boolean) => void;
24
+ updateForceFullDisplay: (forceFullDisplay: boolean) => void;
25
+ updateFirstAll: (firstAll: boolean) => void;
26
+ updateFirst_round: (first_round: boolean) => void;
27
+ updateLocalStreamScreen: (localStreamScreen: MediaStream | null) => void;
28
+ updateMainHeightWidth: (mainHeightWidth: number) => void;
29
+ updateAnnotateScreenStream: (annotateScreenStream: boolean) => void;
30
+ updateIsScreenboardModalVisible: (isVisible: boolean) => void;
31
+
32
+ // mediasfu functions
33
+ disconnectSendTransportScreen: DisconnectSendTransportScreenType;
34
+ prepopulateUserMedia: PrepopulateUserMediaType;
35
+ reorderStreams: ReorderStreamsType;
36
+ getVideos: GetVideosType;
37
+
38
+ getUpdatedAllParams: () => StopShareScreenParameters;
39
+ [key: string]: any;
40
+ }
41
+
42
+ export interface StopShareScreenOptions {
43
+ parameters: StopShareScreenParameters;
44
+ }
45
+
46
+ // Export the type definition for the function
47
+ export type StopShareScreenType = (options: StopShareScreenOptions) => Promise<void>;
48
+
49
+ /**
50
+ * Stops the screen sharing process and updates the relevant parameters and states.
51
+ *
52
+ * @param {StopShareScreenOptions} options - The options for stopping the screen share.
53
+ * @param {Object} options.parameters - The parameters required for stopping the screen share.
54
+ * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.
55
+ * @param {boolean} options.parameters.shared - Indicates if the screen is currently shared.
56
+ * @param {boolean} options.parameters.shareScreenStarted - Indicates if the screen sharing has started.
57
+ * @param {boolean} options.parameters.shareEnded - Indicates if the screen sharing has ended.
58
+ * @param {boolean} options.parameters.updateMainWindow - Indicates if the main window needs to be updated.
59
+ * @param {boolean} options.parameters.defer_receive - Indicates if receiving is deferred.
60
+ * @param {string} options.parameters.hostLabel - The label of the host.
61
+ * @param {boolean} options.parameters.lock_screen - Indicates if the screen is locked.
62
+ * @param {boolean} options.parameters.forceFullDisplay - Indicates if full display is forced.
63
+ * @param {boolean} options.parameters.firstAll - Indicates if it is the first all.
64
+ * @param {boolean} options.parameters.first_round - Indicates if it is the first round.
65
+ * @param {MediaStream} options.parameters.localStreamScreen - The local screen stream.
66
+ * @param {string} options.parameters.eventType - The type of event.
67
+ * @param {boolean} options.parameters.prevForceFullDisplay - Indicates if full display was previously forced.
68
+ * @param {boolean} options.parameters.annotateScreenStream - Indicates if the screen stream is annotated.
69
+ * @param {Function} options.parameters.updateShared - Function to update the shared state.
70
+ * @param {Function} options.parameters.updateShareScreenStarted - Function to update the share screen started state.
71
+ * @param {Function} options.parameters.updateShareEnded - Function to update the share ended state.
72
+ * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window state.
73
+ * @param {Function} options.parameters.updateDefer_receive - Function to update the defer receive state.
74
+ * @param {Function} options.parameters.updateLock_screen - Function to update the lock screen state.
75
+ * @param {Function} options.parameters.updateForceFullDisplay - Function to update the force full display state.
76
+ * @param {Function} options.parameters.updateFirstAll - Function to update the first all state.
77
+ * @param {Function} options.parameters.updateFirst_round - Function to update the first round state.
78
+ * @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen stream.
79
+ * @param {Function} options.parameters.updateMainHeightWidth - Function to update the main height and width.
80
+ * @param {Function} options.parameters.updateAnnotateScreenStream - Function to update the annotate screen stream state.
81
+ * @param {Function} options.parameters.updateIsScreenboardModalVisible - Function to update the screenboard modal visibility.
82
+ * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport screen.
83
+ * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.
84
+ * @param {Function} options.parameters.reorderStreams - Function to reorder streams.
85
+ * @param {Function} options.parameters.getVideos - Function to get videos.
86
+ *
87
+ * @returns {Promise<void>} A promise that resolves when the screen sharing process is stopped.
88
+ *
89
+ * @example
90
+ * const options = {
91
+ * parameters: {
92
+ * shared: true,
93
+ * shareScreenStarted: true,
94
+ * shareEnded: false,
95
+ * updateMainWindow: true,
96
+ * defer_receive: false,
97
+ * hostLabel: "Host",
98
+ * lock_screen: false,
99
+ * forceFullDisplay: false,
100
+ * firstAll: false,
101
+ * first_round: false,
102
+ * localStreamScreen: localStream, // MediaStream object
103
+ * eventType: "conference",
104
+ * prevForceFullDisplay: false,
105
+ * annotateScreenStream: false,
106
+ * updateShared: updateSharedFunction,
107
+ * updateShareScreenStarted: updateShareScreenStartedFunction,
108
+ * updateShareEnded: updateShareEndedFunction,
109
+ * updateUpdateMainWindow: updateUpdateMainWindowFunction,
110
+ * updateDefer_receive: updateDefer_receiveFunction,
111
+ * updateLock_screen: updateLock_screenFunction,
112
+ * updateForceFullDisplay: updateForceFullDisplayFunction,
113
+ * updateFirstAll: updateFirstAllFunction,
114
+ * updateFirst_round: updateFirst_roundFunction,
115
+ * updateLocalStreamScreen: updateLocalStreamScreenFunction,
116
+ * updateMainHeightWidth: updateMainHeightWidthFunction,
117
+ * updateAnnotateScreenStream: updateAnnotateScreenStreamFunction,
118
+ * updateIsScreenboardModalVisible: updateIsScreenboardModalVisibleFunction,
119
+ * disconnectSendTransportScreen: disconnectSendTransportScreenFunction,
120
+ * prepopulateUserMedia: prepopulateUserMediaFunction,
121
+ * reorderStreams: reorderStreamsFunction,
122
+ * getVideos: getVideosFunction,
123
+ * },
124
+ * };
125
+ *
126
+ * stopShareScreen(options)
127
+ * .then(() => {
128
+ * console.log('Screen sharing stopped successfully');
129
+ * })
130
+ * .catch(error => {
131
+ * console.error('Error stopping screen share:', error);
132
+ * });
133
+ */
134
+
135
+ export async function stopShareScreen({ parameters }: StopShareScreenOptions): Promise<void> {
136
+ let { getUpdatedAllParams } = parameters;
137
+ parameters = getUpdatedAllParams();
138
+
139
+ let {
140
+ shared,
141
+ shareScreenStarted,
142
+ shareEnded,
143
+ updateMainWindow,
144
+ defer_receive,
145
+ hostLabel,
146
+ lock_screen,
147
+ forceFullDisplay,
148
+ firstAll,
149
+ first_round,
150
+ localStreamScreen,
151
+ eventType,
152
+ prevForceFullDisplay,
153
+ annotateScreenStream,
154
+
155
+ updateShared,
156
+ updateShareScreenStarted,
157
+ updateShareEnded,
158
+ updateUpdateMainWindow,
159
+ updateDefer_receive,
160
+ updateLock_screen,
161
+ updateForceFullDisplay,
162
+ updateFirstAll,
163
+ updateFirst_round,
164
+ updateLocalStreamScreen,
165
+ updateMainHeightWidth,
166
+ updateAnnotateScreenStream,
167
+ updateIsScreenboardModalVisible,
168
+
169
+ disconnectSendTransportScreen,
170
+ prepopulateUserMedia,
171
+ reorderStreams,
172
+ getVideos,
173
+ } = parameters;
174
+
175
+ shared = false;
176
+ updateShared(shared);
177
+ shareScreenStarted = false;
178
+ updateShareScreenStarted(shareScreenStarted);
179
+ shareEnded = true;
180
+ updateShareEnded(shareEnded);
181
+ updateMainWindow = true;
182
+ updateUpdateMainWindow(updateMainWindow);
183
+
184
+ if (defer_receive) {
185
+ defer_receive = false;
186
+ updateDefer_receive(defer_receive);
187
+ await getVideos({
188
+ participants: parameters.participants,
189
+ allVideoStreams: parameters.allVideoStreams,
190
+ oldAllStreams: parameters.oldAllStreams,
191
+ adminVidID: parameters.adminVidID,
192
+ updateAllVideoStreams: parameters.updateAllVideoStreams,
193
+ updateOldAllStreams: parameters.updateOldAllStreams
194
+ });
195
+ }
196
+ try {
197
+ localStreamScreen!.getTracks().forEach(track => track.stop());
198
+ } catch {
199
+ // Do nothing
200
+ }
201
+ updateLocalStreamScreen(null);
202
+ await disconnectSendTransportScreen({ parameters });
203
+
204
+ try {
205
+ if (annotateScreenStream) {
206
+ annotateScreenStream = false;
207
+ updateAnnotateScreenStream(annotateScreenStream);
208
+ updateIsScreenboardModalVisible(true);
209
+ await new Promise(resolve => setTimeout(resolve, 500));
210
+ updateIsScreenboardModalVisible(false);
211
+ }
212
+ } catch (error) {
213
+ console.log('Error handling screen annotation:', error);
214
+ }
215
+
216
+ if (eventType === 'conference') {
217
+ updateMainHeightWidth(0);
218
+ }
219
+
220
+ try {
221
+ await prepopulateUserMedia({ name: hostLabel, parameters });
222
+ } catch (error) {
223
+ console.log("Error in prepopulateUserMedia", error);
224
+ }
225
+
226
+ try {
227
+ await reorderStreams({ add: false, screenChanged: true, parameters });
228
+ } catch (error) {
229
+ console.log("Error in reorderStreams", error);
230
+ }
231
+
232
+ lock_screen = false;
233
+ updateLock_screen(lock_screen);
234
+ forceFullDisplay = prevForceFullDisplay;
235
+ updateForceFullDisplay(forceFullDisplay);
236
+ firstAll = false;
237
+ updateFirstAll(firstAll);
238
+ first_round = false;
239
+ updateFirst_round(first_round);
240
+ }
241
+
@@ -0,0 +1,297 @@
1
+
2
+
3
+ import { Socket } from "socket.io-client";
4
+ import type { ProducerOptions } from 'mediasoup-client/lib/types';
5
+ import { Participant, PrepopulateUserMediaParameters, ShowAlert, CreateSendTransportParameters, ConnectSendTransportAudioParameters, ResumeSendTransportAudioParameters, PrepopulateUserMediaType, CreateSendTransportType, ConnectSendTransportAudioType, ResumeSendTransportAudioType } from "../types/types";
6
+ export interface StreamSuccessAudioParameters extends CreateSendTransportParameters, ConnectSendTransportAudioParameters, ResumeSendTransportAudioParameters, PrepopulateUserMediaParameters {
7
+ socket: Socket;
8
+ participants: Participant[];
9
+ localStream: MediaStream | null;
10
+ transportCreated: boolean;
11
+ transportCreatedAudio: boolean;
12
+ audioAlreadyOn: boolean;
13
+ micAction: boolean;
14
+ audioParams: ProducerOptions;
15
+ localStreamAudio: MediaStream | null;
16
+ defAudioID: string;
17
+ userDefaultAudioInputDevice: string;
18
+ params: ProducerOptions;
19
+ audioParamse?: ProducerOptions;
20
+ aParams: ProducerOptions;
21
+ hostLabel: string;
22
+ islevel: string;
23
+ member: string;
24
+ updateMainWindow: boolean;
25
+ lock_screen: boolean;
26
+ shared: boolean;
27
+ videoAlreadyOn: boolean;
28
+ showAlert?: ShowAlert;
29
+
30
+ updateParticipants: (participants: Participant[]) => void;
31
+ updateTransportCreated: (transportCreated: boolean) => void;
32
+ updateTransportCreatedAudio: (transportCreatedAudio: boolean) => void;
33
+ updateAudioAlreadyOn: (audioAlreadyOn: boolean) => void;
34
+ updateMicAction: (micAction: boolean) => void;
35
+ updateAudioParams: (audioParams: ProducerOptions) => void;
36
+ updateLocalStream: (localStream: MediaStream | null) => void;
37
+ updateLocalStreamAudio: (localStreamAudio: MediaStream | null) => void;
38
+ updateDefAudioID: (defAudioID: string) => void;
39
+ updateUserDefaultAudioInputDevice: (userDefaultAudioInputDevice: string) => void;
40
+ updateUpdateMainWindow: (updateMainWindow: boolean) => void;
41
+
42
+ // mediasfu functions
43
+ createSendTransport: CreateSendTransportType;
44
+ connectSendTransportAudio: ConnectSendTransportAudioType;
45
+ resumeSendTransportAudio: ResumeSendTransportAudioType;
46
+ prepopulateUserMedia: PrepopulateUserMediaType;
47
+
48
+ getUpdatedAllParams: () => StreamSuccessAudioParameters;
49
+ [key: string]: any;
50
+ }
51
+
52
+ export interface StreamSuccessAudioOptions {
53
+ stream: MediaStream;
54
+ parameters: StreamSuccessAudioParameters;
55
+ }
56
+
57
+ // Export the type definition for the function
58
+ export type StreamSuccessAudioType = (options: StreamSuccessAudioOptions) => Promise<void>;
59
+
60
+ /**
61
+ * Handles the successful streaming of audio by setting up the necessary transports and updating the relevant states.
62
+ *
63
+ * @param {StreamSuccessAudioOptions} options - The options for streaming success audio.
64
+ * @param {MediaStream} options.stream - The media stream containing the audio track.
65
+ * @param {Object} options.parameters - The parameters required for setting up the audio stream.
66
+ * @param {Socket} options.parameters.socket - The socket connection for communication.
67
+ * @param {Array<Participant>} options.parameters.participants - The list of participants.
68
+ * @param {MediaStream | null} options.parameters.localStream - The local media stream.
69
+ * @param {boolean} options.parameters.transportCreated - Flag indicating if the transport is created.
70
+ * @param {boolean} options.parameters.transportCreatedAudio - Flag indicating if the audio transport is created.
71
+ * @param {boolean} options.parameters.audioAlreadyOn - Flag indicating if the audio is already on.
72
+ * @param {boolean} options.parameters.micAction - Flag indicating the microphone action.
73
+ * @param {ProducerOptions} options.parameters.audioParams - The audio parameters.
74
+ * @param {MediaStream | null} options.parameters.localStreamAudio - The local audio stream.
75
+ * @param {string} options.parameters.defAudioID - The default audio device ID.
76
+ * @param {string} options.parameters.userDefaultAudioInputDevice - The user default audio input device.
77
+ * @param {ProducerOptions} options.parameters.params - Additional parameters.
78
+ * @param {ProducerOptions} options.parameters.audioParamse - Additional audio parameters.
79
+ * @param {ProducerOptions} options.parameters.aParams - Additional parameters for audio.
80
+ * @param {string} options.parameters.hostLabel - The label of the host.
81
+ * @param {string} options.parameters.islevel - The level of the user.
82
+ * @param {string} options.parameters.member - The member name.
83
+ * @param {boolean} options.parameters.updateMainWindow - Flag indicating if the main window should be updated.
84
+ * @param {boolean} options.parameters.lock_screen - Flag indicating if the screen is locked.
85
+ * @param {boolean} options.parameters.shared - Flag indicating if the screen is shared.
86
+ * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if the video is already on.
87
+ * @param {Function} options.parameters.showAlert - Function to show alert messages.
88
+ * @param {Function} options.parameters.updateParticipants - Function to update participants.
89
+ * @param {Function} options.parameters.updateTransportCreated - Function to update transport created flag.
90
+ * @param {Function} options.parameters.updateTransportCreatedAudio - Function to update audio transport created flag.
91
+ * @param {Function} options.parameters.updateAudioAlreadyOn - Function to update audio already on flag.
92
+ * @param {Function} options.parameters.updateMicAction - Function to update microphone action flag.
93
+ * @param {Function} options.parameters.updateAudioParams - Function to update audio parameters.
94
+ * @param {Function} options.parameters.updateLocalStream - Function to update local stream.
95
+ * @param {Function} options.parameters.updateLocalStreamAudio - Function to update local audio stream.
96
+ * @param {Function} options.parameters.updateDefAudioID - Function to update default audio device ID.
97
+ * @param {Function} options.parameters.updateUserDefaultAudioInputDevice - Function to update user default audio input device.
98
+ * @param {Function} options.parameters.updateUpdateMainWindow - Function to update main window flag.
99
+ * @param {Function} options.parameters.createSendTransport - Function to create send transport.
100
+ * @param {Function} options.parameters.connectSendTransportAudio - Function to connect send transport audio.
101
+ * @param {Function} options.parameters.resumeSendTransportAudio - Function to resume send transport audio.
102
+ * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.
103
+ *
104
+ * @returns {Promise<void>} A promise that resolves when the audio streaming setup is complete.
105
+ *
106
+ * @example
107
+ * const options = {
108
+ * stream: localStream, // MediaStream object containing the audio track
109
+ * parameters: {
110
+ * socket: socketInstance,
111
+ * participants: participantList,
112
+ * localStream: null,
113
+ * transportCreated: false,
114
+ * transportCreatedAudio: false,
115
+ * audioAlreadyOn: false,
116
+ * micAction: false,
117
+ * audioParams: {},
118
+ * localStreamAudio: null,
119
+ * defAudioID: "",
120
+ * userDefaultAudioInputDevice: "",
121
+ * params: {},
122
+ * audioParamse: {},
123
+ * aParams: {},
124
+ * hostLabel: "Host",
125
+ * islevel: "1",
126
+ * member: "user1",
127
+ * updateMainWindow: true,
128
+ * lock_screen: false,
129
+ * shared: false,
130
+ * videoAlreadyOn: false,
131
+ * showAlert: alertFunction,
132
+ * updateParticipants: updateParticipantsFunction,
133
+ * updateTransportCreated: updateTransportCreatedFunction,
134
+ * updateTransportCreatedAudio: updateTransportCreatedAudioFunction,
135
+ * updateAudioAlreadyOn: updateAudioAlreadyOnFunction,
136
+ * updateMicAction: updateMicActionFunction,
137
+ * updateAudioParams: updateAudioParamsFunction,
138
+ * updateLocalStream: updateLocalStreamFunction,
139
+ * updateLocalStreamAudio: updateLocalStreamAudioFunction,
140
+ * updateDefAudioID: updateDefAudioIDFunction,
141
+ * updateUserDefaultAudioInputDevice: updateUserDefaultAudioInputDeviceFunction,
142
+ * updateUpdateMainWindow: updateUpdateMainWindowFunction,
143
+ * createSendTransport: createSendTransportFunction,
144
+ * connectSendTransportAudio: connectSendTransportAudioFunction,
145
+ * resumeSendTransportAudio: resumeSendTransportAudioFunction,
146
+ * prepopulateUserMedia: prepopulateUserMediaFunction,
147
+ * },
148
+ * };
149
+ *
150
+ * streamSuccessAudio(options)
151
+ * .then(() => {
152
+ * console.log('Audio streaming setup successfully');
153
+ * })
154
+ * .catch(error => {
155
+ * console.error('Error setting up audio streaming:', error);
156
+ * });
157
+ */
158
+
159
+ export const streamSuccessAudio = async ({
160
+ stream,
161
+ parameters,
162
+ }: StreamSuccessAudioOptions): Promise<void> => {
163
+ let {
164
+ socket,
165
+ participants,
166
+ localStream,
167
+ transportCreated,
168
+ transportCreatedAudio,
169
+ audioAlreadyOn,
170
+ micAction,
171
+ audioParams,
172
+ localStreamAudio,
173
+ defAudioID,
174
+ userDefaultAudioInputDevice,
175
+ params,
176
+ audioParamse,
177
+ aParams,
178
+ hostLabel,
179
+ islevel,
180
+ member,
181
+ updateMainWindow,
182
+ lock_screen,
183
+ shared,
184
+ videoAlreadyOn,
185
+ showAlert,
186
+
187
+ //update functions
188
+ updateParticipants,
189
+ updateTransportCreated,
190
+ updateTransportCreatedAudio,
191
+ updateAudioAlreadyOn,
192
+ updateMicAction,
193
+ updateAudioParams,
194
+ updateLocalStream,
195
+ updateLocalStreamAudio,
196
+ updateDefAudioID,
197
+ updateUserDefaultAudioInputDevice,
198
+ updateUpdateMainWindow,
199
+
200
+ //mediasfu functions
201
+ createSendTransport,
202
+ connectSendTransportAudio,
203
+ resumeSendTransportAudio,
204
+ prepopulateUserMedia,
205
+ } = parameters;
206
+
207
+ localStreamAudio = stream;
208
+ updateLocalStreamAudio(localStreamAudio);
209
+
210
+ if (localStream == null) {
211
+ localStream = new MediaStream([localStreamAudio.getAudioTracks()[0]]);
212
+ updateLocalStream(localStream);
213
+ } else {
214
+ localStream.addTrack(localStreamAudio.getAudioTracks()[0]);
215
+ updateLocalStream(localStream);
216
+ }
217
+
218
+ const audioTracked = localStream.getAudioTracks()[0];
219
+ defAudioID = audioTracked.getSettings().deviceId || "";
220
+ userDefaultAudioInputDevice = defAudioID;
221
+
222
+ updateDefAudioID(defAudioID);
223
+ updateUserDefaultAudioInputDevice(userDefaultAudioInputDevice);
224
+
225
+ try {
226
+ params = aParams;
227
+ audioParamse = { ...params };
228
+
229
+ audioParams = {
230
+ track: localStream.getAudioTracks()[0],
231
+ ...audioParamse,
232
+ };
233
+ updateAudioParams(audioParams);
234
+
235
+ if (!transportCreated) {
236
+ try {
237
+ await createSendTransport({
238
+ parameters: {
239
+ ...parameters,
240
+ audioParams: audioParams,
241
+ },
242
+ option: "audio",
243
+ });
244
+ } catch (error) {
245
+ console.error("Error creating transport:", error);
246
+ }
247
+ } else {
248
+ if (!transportCreatedAudio) {
249
+ await connectSendTransportAudio({
250
+ audioParams,
251
+ parameters,
252
+ });
253
+ } else {
254
+ await resumeSendTransportAudio({ parameters });
255
+ }
256
+ }
257
+ } catch (error: any) {
258
+ if (showAlert) {
259
+ showAlert({
260
+ message: error.message,
261
+ type: "danger",
262
+ duration: 3000,
263
+ });
264
+ }
265
+ }
266
+
267
+ audioAlreadyOn = true;
268
+ updateAudioAlreadyOn(audioAlreadyOn);
269
+
270
+ if (micAction === true) {
271
+ micAction = false;
272
+ updateMicAction(micAction);
273
+ }
274
+
275
+ participants.forEach((participant) => {
276
+ if (participant.socketId === socket.id && participant.name === member) {
277
+ participant.muted = false;
278
+ }
279
+ });
280
+ updateParticipants(participants);
281
+
282
+ transportCreated = true;
283
+ transportCreatedAudio = true;
284
+ updateTransportCreated(transportCreated);
285
+ updateTransportCreatedAudio(transportCreatedAudio);
286
+
287
+ if (!videoAlreadyOn && islevel === "2") {
288
+ if (!lock_screen && !shared) {
289
+ updateMainWindow = true;
290
+ updateUpdateMainWindow(updateMainWindow);
291
+ await prepopulateUserMedia({ name: hostLabel, parameters });
292
+ updateMainWindow = false;
293
+ updateUpdateMainWindow(updateMainWindow);
294
+ }
295
+ }
296
+ };
297
+