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,118 @@
1
+
2
+ import { Socket } from "socket.io-client";
3
+ import { CoHostResponsibility, Participant, ShowAlert } from "../types/types";
4
+
5
+ export interface ControlMediaOptions {
6
+ participantId: string;
7
+ participantName: string;
8
+ type: 'audio' | 'video' | 'screenshare' | 'all';
9
+ socket: Socket;
10
+ coHostResponsibility: CoHostResponsibility[];
11
+ participants: Participant[];
12
+ member: string;
13
+ islevel: string;
14
+ showAlert?: ShowAlert;
15
+ coHost: string;
16
+ roomName: string;
17
+ }
18
+ // Export the type definition for the function
19
+ export type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;
20
+
21
+ /**
22
+ * Controls the media of a participant in a media session if certain conditions are met.
23
+ *
24
+ * @param {ControlMediaOptions} options - The options for controlling media.
25
+ * @param {string} options.participantId - The ID of the participant to control.
26
+ * @param {string} options.participantName - The name of the participant to control.
27
+ * @param {'audio' | 'video' | 'screenshare' | 'all'} options.type - The type of media to control.
28
+ * @param {Socket} options.socket - The socket instance for communication.
29
+ * @param {Array<CoHostResponsibility>} options.coHostResponsibility - List of co-host responsibilities.
30
+ * @param {Array<Participant>} options.participants - List of participants in the session.
31
+ * @param {string} options.member - The current member attempting to control media.
32
+ * @param {string} options.islevel - The level of the current member.
33
+ * @param {Function} [options.showAlert] - Optional function to show alerts.
34
+ * @param {string} options.coHost - The co-host information.
35
+ * @param {string} options.roomName - The name of the room.
36
+ *
37
+ * @returns {Promise<void>} A promise that resolves when the media control operation is complete.
38
+ *
39
+ * @throws Will log an error message if there are issues controlling the media or if participant is not found.
40
+ *
41
+ * @example
42
+ * const options = {
43
+ * participantId: '1234',
44
+ * participantName: 'John Doe',
45
+ * type: 'audio',
46
+ * socket: socketInstance,
47
+ * coHostResponsibility: [{ name: 'media', value: true }],
48
+ * participants: participantList,
49
+ * member: 'Admin',
50
+ * islevel: '1',
51
+ * showAlert: (alert) => console.log(alert.message),
52
+ * coHost: 'CoHostName',
53
+ * roomName: 'Room 1',
54
+ * };
55
+ *
56
+ * controlMedia(options)
57
+ * .then(() => {
58
+ * console.log('Media control operation completed successfully.');
59
+ * })
60
+ * .catch((error) => {
61
+ * console.error('Error controlling media:', error);
62
+ * });
63
+ */
64
+
65
+ export async function controlMedia({
66
+ participantId,
67
+ participantName,
68
+ type,
69
+ socket,
70
+ coHostResponsibility,
71
+ participants,
72
+ member,
73
+ islevel,
74
+ showAlert,
75
+ coHost,
76
+ roomName,
77
+ }: ControlMediaOptions): Promise<void> {
78
+ try {
79
+ let mediaValue = false;
80
+
81
+ try {
82
+ mediaValue = coHostResponsibility.find((item) => item.name === "media")?.value ?? false;
83
+ } catch (error) {
84
+ console.log("Error retrieving media control value", error);
85
+ }
86
+
87
+ const participant = participants.find((obj) => obj.name === participantName);
88
+
89
+ if (!participant) {
90
+ console.log("Participant not found");
91
+ return;
92
+ }
93
+
94
+ if (islevel === "2" || (coHost === member && mediaValue === true)) {
95
+ if (
96
+ (!participant.muted && participant.islevel !== "2" && type === "audio") ||
97
+ (participant.islevel !== "2" && type === "video" && participant.videoOn)
98
+ ) {
99
+ socket.emit("controlMedia", {
100
+ participantId,
101
+ participantName,
102
+ type,
103
+ roomName,
104
+ });
105
+ }
106
+ } else {
107
+ if (showAlert) {
108
+ showAlert({
109
+ message: "You are not allowed to control media for other participants.",
110
+ type: "danger",
111
+ duration: 3000,
112
+ });
113
+ }
114
+ }
115
+ } catch (error) {
116
+ console.log("controlMedia error", error);
117
+ }
118
+ }
@@ -0,0 +1,312 @@
1
+ import type { Device, Transport, DtlsParameters } from 'mediasoup-client/lib/types';
2
+ import { Socket } from "socket.io-client";
3
+ import {
4
+ ConnectSendTransportParameters,
5
+ ConnectSendTransportType,
6
+ } from "../types/types";
7
+
8
+ export interface CreateSendTransportParameters extends ConnectSendTransportParameters {
9
+ islevel: string;
10
+ member: string;
11
+ socket: Socket;
12
+ localSocket?: Socket;
13
+ device: Device | null;
14
+ producerTransport: Transport | null;
15
+ localProducerTransport?: Transport | null;
16
+ transportCreated: boolean;
17
+ localTransportCreated?: boolean;
18
+ updateProducerTransport: (producerTransport: Transport | null) => void;
19
+ updateLocalProducerTransport?: (localTransport: Transport | null) => void;
20
+ updateTransportCreated: (transportCreated: boolean) => void;
21
+ updateLocalTransportCreated?: (localTransportCreated: boolean) => void;
22
+
23
+ // mediasfu functions
24
+ connectSendTransport: ConnectSendTransportType;
25
+ getUpdatedAllParams: () => CreateSendTransportParameters;
26
+ [key: string]: any;
27
+ }
28
+
29
+ export interface CreateSendTransportOptions {
30
+ option: "audio" | "video" | "screen" | "all";
31
+ parameters: CreateSendTransportParameters;
32
+ }
33
+
34
+ // Export the type definition for the function
35
+ export type CreateSendTransportType = (options: CreateSendTransportOptions) => Promise<void>;
36
+
37
+ const createLocalSendTransport = async ({
38
+ option,
39
+ parameters,
40
+ }: CreateSendTransportOptions): Promise<void> => {
41
+ try {
42
+ let {
43
+ islevel,
44
+ member,
45
+ socket,
46
+ localSocket,
47
+ device,
48
+ localProducerTransport,
49
+ localTransportCreated,
50
+ updateLocalProducerTransport,
51
+ updateLocalTransportCreated,
52
+
53
+ connectSendTransport,
54
+ } = parameters;
55
+
56
+
57
+ if (!localSocket || !localSocket.id || socket.id === localSocket.id) {
58
+ return;
59
+ }
60
+
61
+ localSocket.emit(
62
+ "createWebRtcTransport",
63
+ { consumer: false, islevel },
64
+ async ({ params }: { params: any }) => {
65
+ if (params && params.error) {
66
+ console.error("Error in local createWebRtcTransport:", params.error);
67
+ return;
68
+ }
69
+
70
+ // Create local send transport
71
+ localProducerTransport = await device!.createSendTransport(params);
72
+ if (updateLocalProducerTransport) {
73
+ updateLocalProducerTransport(localProducerTransport);
74
+ }
75
+
76
+ // Handle local transport events
77
+ localProducerTransport.on(
78
+ "connect",
79
+ async ({ dtlsParameters }: { dtlsParameters: DtlsParameters }, callback: () => void, errback: (error: Error) => void) => {
80
+ try {
81
+ localSocket.emit("transport-connect", { dtlsParameters });
82
+ callback();
83
+ } catch (error) {
84
+ errback(error as Error);
85
+ }
86
+ }
87
+ );
88
+
89
+ localProducerTransport.on(
90
+ "produce",
91
+ async (
92
+ parameters: { kind: string; rtpParameters: any; appData: any },
93
+ callback: (response: { id: string }) => void,
94
+ errback: (error: Error) => void
95
+ ) => {
96
+ try {
97
+ localSocket.emit(
98
+ "transport-produce",
99
+ {
100
+ kind: parameters.kind,
101
+ rtpParameters: parameters.rtpParameters,
102
+ appData: parameters.appData,
103
+ islevel,
104
+ name: member,
105
+ },
106
+ ({ id }: { id: string }) => callback({ id })
107
+ );
108
+ } catch (error) {
109
+ errback(error as Error);
110
+ }
111
+ }
112
+ );
113
+
114
+ localProducerTransport.on("connectionstatechange", (state: string) => {
115
+ if (state === "failed") {
116
+ console.error("Local transport connection failed.");
117
+ if (localProducerTransport) {
118
+ localProducerTransport.close();
119
+ }
120
+ }
121
+ });
122
+
123
+ // Mark local transport as created
124
+ localTransportCreated = true;
125
+ updateLocalTransportCreated?.(localTransportCreated);
126
+
127
+ // connect local transport
128
+ await connectSendTransport({
129
+ targetOption: "local",
130
+ option,
131
+ parameters: { ...parameters, localProducerTransport: localProducerTransport },
132
+ });
133
+ }
134
+ );
135
+ } catch (error) {
136
+ console.error("Error creating local send transport:", error);
137
+ }
138
+ };
139
+
140
+ /**
141
+ * Creates a WebRTC send transport and sets up event handlers for the transport.
142
+ *
143
+ * Supports both primary and local transports with modular handling.
144
+ *
145
+ * @param {CreateSendTransportOptions} options - The options for creating the send transport.
146
+ * @param {string} options.option - The type of transport to create.
147
+ * @param {CreateSendTransportParameters} options.parameters - The parameters required for creating the transport.
148
+ * @param {string} options.parameters.islevel - The level of the transport.
149
+ * @param {string} options.parameters.member - The member name for the transport.
150
+ * @param {Socket} options.parameters.socket - The primary socket instance.
151
+ * @param {Device} options.parameters.device - The device instance.
152
+ * @param {Transport | null} options.parameters.producerTransport - The primary producer transport object.
153
+ * @param {boolean} options.parameters.transportCreated - The state of the primary transport creation.
154
+ * @param {(transport: Transport | null) => void} options.parameters.updateProducerTransport - The function to update the primary transport object.
155
+ * @param {(state: boolean) => void} options.parameters.updateTransportCreated - The function to update the primary transport creation state.
156
+ * @param {Function} options.parameters.connectSendTransport - The function to connect the send transport.
157
+ * @param {Function} options.parameters.getUpdatedAllParams - The function to get updated parameters.
158
+ * @param {Socket} [options.parameters.localSocket] - The local socket instance.
159
+ * @param {Transport | null} [options.parameters.localProducerTransport] - The local producer transport object.
160
+ * @param {boolean} [options.parameters.localTransportCreated] - The state of the local transport creation.
161
+ * @param {(localTransport: Transport | null) => void} [options.parameters.updateLocalProducerTransport] - The function to update the local transport object.
162
+ * @param {(state: boolean) => void} [options.parameters.updateLocalTransportCreated] - The function to update the local transport creation state.
163
+ * @returns {Promise<void>} A promise that resolves when the send transport is created and configured.
164
+ *
165
+ * @throws Will throw an error if there is an issue creating the send transport.
166
+ *
167
+ * @example
168
+ * const options = {
169
+ * option: 'video',
170
+ * parameters: {
171
+ * islevel: '1',
172
+ * member: 'John Doe',
173
+ * socket: socketInstance,
174
+ * localSocket: localSocketInstance,
175
+ * device: deviceInstance,
176
+ * producerTransport: null,
177
+ * localProducerTransport: null,
178
+ * transportCreated: false,
179
+ * localTransportCreated: false,
180
+ * updateProducerTransport: (transport) => console.log('Primary transport updated:', transport),
181
+ * updateLocalProducerTransport: (transport) => console.log('Local transport updated:', transport),
182
+ * updateTransportCreated: (state) => console.log('Primary transport created:', state),
183
+ * updateLocalTransportCreated: (state) => console.log('Local transport created:', state),
184
+ * },
185
+ * };
186
+ *
187
+ * createSendTransport(options)
188
+ * .then(() => console.log('Send transport created successfully'))
189
+ * .catch((error) => console.error('Error creating send transport:', error));
190
+ */
191
+
192
+ export const createSendTransport: CreateSendTransportType = async ({
193
+ option,
194
+ parameters,
195
+ }: CreateSendTransportOptions): Promise<void> => {
196
+ try {
197
+ // Destructure parameters
198
+ let {
199
+ islevel,
200
+ member,
201
+ socket,
202
+ device,
203
+ producerTransport,
204
+ transportCreated,
205
+ updateProducerTransport,
206
+ updateTransportCreated,
207
+ connectSendTransport,
208
+ } = parameters;
209
+
210
+ // Get updated device and socket parameters
211
+ const updatedParams = parameters.getUpdatedAllParams();
212
+ device = updatedParams.device;
213
+ socket = updatedParams.socket;
214
+
215
+ try {
216
+ // Handle local transport creation first
217
+ await createLocalSendTransport({option, parameters});
218
+ } catch (error) {
219
+ console.log("Error creating local send transport:", error);
220
+ }
221
+
222
+ // Emit createWebRtcTransport event to the server
223
+ socket.emit(
224
+ "createWebRtcTransport",
225
+ { consumer: false, islevel: islevel },
226
+ async ({ params }: { params: any }) => {
227
+ // Check if there is an error in the response
228
+ if (params && params.error) {
229
+ console.error("Error in createWebRtcTransport:", params.error);
230
+ return;
231
+ }
232
+
233
+ // Create a WebRTC send transport
234
+ producerTransport = await device!.createSendTransport(params);
235
+ updateProducerTransport(producerTransport);
236
+
237
+ // Handle 'connect' event
238
+ producerTransport.on(
239
+ "connect",
240
+ async ({ dtlsParameters }: { dtlsParameters: DtlsParameters }, callback: () => void, errback: (error: Error) => void) => {
241
+ try {
242
+ socket.emit("transport-connect", { dtlsParameters });
243
+ callback();
244
+ } catch (error) {
245
+ errback(error as Error);
246
+ }
247
+ }
248
+ );
249
+
250
+ // Handle 'produce' event
251
+ producerTransport.on(
252
+ "produce",
253
+ async (
254
+ parameters: { kind: string; rtpParameters: any; appData: any },
255
+ callback: (response: { id: string }) => void,
256
+ errback: (error: Error) => void
257
+ ) => {
258
+ try {
259
+ socket.emit(
260
+ "transport-produce",
261
+ {
262
+ kind: parameters.kind,
263
+ rtpParameters: parameters.rtpParameters,
264
+ appData: parameters.appData,
265
+ islevel: islevel,
266
+ name: member,
267
+ },
268
+ async ({ id }: { id: string }) => {
269
+ callback({ id });
270
+ }
271
+ );
272
+ } catch (error) {
273
+ errback(error as Error);
274
+ }
275
+ }
276
+ );
277
+
278
+ // Handle 'connectionstatechange' event
279
+ producerTransport.on("connectionstatechange", async (state: string) => {
280
+ switch (state) {
281
+ case "connecting":
282
+ break;
283
+ case "connected":
284
+ break;
285
+ case "failed":
286
+ console.log("Transport connection failed.");
287
+ producerTransport!.close();
288
+ break;
289
+ default:
290
+ break;
291
+ }
292
+ });
293
+
294
+ // Update transport creation state
295
+ transportCreated = true;
296
+ parameters = parameters.getUpdatedAllParams();
297
+ await connectSendTransport({
298
+ targetOption: "remote",
299
+ option,
300
+ parameters: {
301
+ ...parameters,
302
+ producerTransport,
303
+ },
304
+ });
305
+ updateTransportCreated(transportCreated);
306
+ }
307
+ );
308
+
309
+ } catch (error) {
310
+ console.log("Error creating send transport:", error);
311
+ }
312
+ };
@@ -0,0 +1,170 @@
1
+ import { Socket } from "socket.io-client";
2
+ import { PrepopulateUserMediaType, PrepopulateUserMediaParameters } from "../types/types";
3
+ import type { Producer } from 'mediasoup-client/lib/types';
4
+
5
+ export interface DisconnectSendTransportAudioParameters extends PrepopulateUserMediaParameters {
6
+ audioProducer: Producer | null;
7
+ localAudioProducer?: Producer | null;
8
+ socket: Socket;
9
+ localSocket?: Socket;
10
+ videoAlreadyOn: boolean;
11
+ islevel: string;
12
+ lock_screen: boolean;
13
+ shared: boolean;
14
+ updateMainWindow: boolean;
15
+ hostLabel: string;
16
+ roomName: string;
17
+ updateAudioProducer: (audioProducer: Producer | null) => void;
18
+ updateLocalAudioProducer?: (localAudioProducer: Producer | null) => void;
19
+ updateUpdateMainWindow: (updateMainWindow: boolean) => void;
20
+
21
+ // mediasfu functions
22
+ prepopulateUserMedia: PrepopulateUserMediaType;
23
+ [key: string]: any;
24
+ }
25
+
26
+ export interface DisconnectSendTransportAudioOptions {
27
+ parameters: DisconnectSendTransportAudioParameters;
28
+ }
29
+
30
+ // Export the type definition for the function
31
+ export type DisconnectSendTransportAudioType = (options: DisconnectSendTransportAudioOptions) => Promise<void>;
32
+
33
+ const disconnectLocalSendTransportAudio = async ({
34
+ parameters,
35
+ }: DisconnectSendTransportAudioOptions): Promise<void> => {
36
+ try {
37
+ const {
38
+ localAudioProducer,
39
+ localSocket,
40
+ roomName,
41
+ updateLocalAudioProducer,
42
+ } = parameters;
43
+
44
+ if (localSocket && localSocket.id) {
45
+ // Close the local audio producer and notify the server
46
+ if (localAudioProducer) {
47
+ localAudioProducer.close(); // Actual logic: pause instead of close for MediaSFU preference
48
+ updateLocalAudioProducer?.(null);
49
+ }
50
+
51
+ localSocket.emit("pauseProducerMedia", { mediaTag: "audio", roomName: roomName });
52
+ } else {
53
+ return;
54
+ }
55
+ } catch (error) {
56
+ console.log("Error disconnecting local audio send transport:", error);
57
+ throw error; // Re-throw to propagate the error
58
+ }
59
+ };
60
+
61
+ /**
62
+ * Disconnects the send transport for audio by pausing the audio producer and updating the UI accordingly.
63
+ *
64
+ * This function supports both a primary and a local audio producer, delegating local handling to a separate function.
65
+ *
66
+ * @param {DisconnectSendTransportAudioOptions} options - The options for disconnecting the send transport for audio.
67
+ * @param {DisconnectSendTransportAudioParameters} options.parameters - The parameters for disconnecting the send transport for audio.
68
+ * @param {Producer} options.parameters.audioProducer - The primary audio producer to disconnect.
69
+ * @param {Producer} [options.parameters.localAudioProducer] - The local audio producer to disconnect.
70
+ * @param {Socket} options.parameters.socket - The socket instance to use for communication.
71
+ * @param {Socket} [options.parameters.localSocket] - The local socket instance to use for communication.
72
+ * @param {boolean} options.parameters.videoAlreadyOn - Flag indicating if video is already on.
73
+ * @param {string} options.parameters.islevel - The level of the user.
74
+ * @param {boolean} options.parameters.lock_screen - Flag indicating if the screen is locked.
75
+ * @param {boolean} options.parameters.shared - Flag indicating if the screen is shared.
76
+ * @param {boolean} options.parameters.updateMainWindow - Flag to update the main window.
77
+ * @param {string} options.parameters.hostLabel - The label for the host user.
78
+ * @param {string} options.parameters.roomName - The name of the room.
79
+ * @param {function} options.parameters.updateAudioProducer - Function to update the audio producer.
80
+ * @param {function} [options.parameters.updateLocalAudioProducer] - Function to update the local audio producer (optional).
81
+ * @param {function} options.parameters.updateUpdateMainWindow - Function to update the main window state.
82
+ * @param {function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.
83
+ * @param {object} options.parameters - The parameters required for disconnecting the send transport for audio.
84
+ * @returns {Promise<void>} A promise that resolves when the send transport for audio is disconnected.
85
+ *
86
+ * @throws Will throw an error if the operation fails.
87
+ *
88
+ * @example
89
+ * const options = {
90
+ * parameters: {
91
+ * audioProducer: audioProducerInstance,
92
+ * localAudioProducer: localAudioProducerInstance,
93
+ * socket: socketInstance,
94
+ * localSocket: localSocketInstance,
95
+ * videoAlreadyOn: false,
96
+ * islevel: '1',
97
+ * lock_screen: false,
98
+ * shared: false,
99
+ * updateMainWindow: true,
100
+ * hostLabel: 'Host',
101
+ * roomName: 'Room 1',
102
+ * updateAudioProducer: (producer) => console.log('Updated audio producer:', producer),
103
+ * updateLocalAudioProducer: (producer) => console.log('Updated local audio producer:', producer),
104
+ * updateUpdateMainWindow: (state) => console.log('Main window state updated:', state),
105
+ * prepopulateUserMedia: async ({ name, parameters }) => console.log('Prepopulating user media for', name),
106
+ * },
107
+ * };
108
+ *
109
+ * disconnectSendTransportAudio(options)
110
+ * .then(() => console.log("Audio send transport disconnected successfully"))
111
+ * .catch((error) => console.log("Error disconnecting audio send transport:", error));
112
+ */
113
+
114
+ export const disconnectSendTransportAudio: DisconnectSendTransportAudioType = async ({
115
+ parameters,
116
+ }: DisconnectSendTransportAudioOptions): Promise<void> => {
117
+ try {
118
+ // Destructure parameters
119
+ let {
120
+ audioProducer,
121
+ socket,
122
+ videoAlreadyOn,
123
+ islevel,
124
+ lock_screen,
125
+ shared,
126
+ updateMainWindow,
127
+ hostLabel,
128
+ roomName,
129
+ updateAudioProducer,
130
+ updateUpdateMainWindow,
131
+
132
+ //mediasfu functions
133
+ prepopulateUserMedia,
134
+ } = parameters;
135
+
136
+ // Pause the primary audio producer
137
+ if (audioProducer) {
138
+ audioProducer.pause(); // Actual logic: pause instead of close for MediaSFU preference
139
+ updateAudioProducer(audioProducer);
140
+ }
141
+
142
+ // Update the UI
143
+ if (!videoAlreadyOn && islevel === "2") {
144
+ if (!lock_screen && !shared) {
145
+ updateMainWindow = true;
146
+ updateUpdateMainWindow(updateMainWindow);
147
+
148
+ await prepopulateUserMedia({ name: hostLabel, parameters });
149
+
150
+ updateMainWindow = false;
151
+ updateUpdateMainWindow(updateMainWindow);
152
+ }
153
+ }
154
+
155
+ // Notify the server about pausing audio producer
156
+ socket.emit("pauseProducerMedia", {
157
+ mediaTag: "audio",
158
+ roomName: roomName,
159
+ });
160
+
161
+ // Handle local audio transport
162
+ try {
163
+ await disconnectLocalSendTransportAudio({ parameters });
164
+ } catch (localError) {
165
+ console.log("Error disconnecting local audio send transport:", localError);
166
+ }
167
+ } catch (error) {
168
+ console.log("Error disconnecting primary audio send transport:", error);
169
+ }
170
+ };