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,189 @@
1
+ import { Socket } from 'socket.io-client';
2
+ import Cookies from 'universal-cookie';
3
+ import type { PreJoinPageParameters } from '../../types/types';
4
+
5
+ const cookies = new Cookies();
6
+ const MAX_ATTEMPTS = 10;
7
+ const RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours
8
+
9
+ /**
10
+ * Options for handleWelcomeRequest function
11
+ */
12
+ export interface HandleWelcomeRequestOptions {
13
+ apiUserName: string;
14
+ apiToken: string;
15
+ link: string;
16
+ userName: string;
17
+ parameters: PreJoinPageParameters;
18
+ }
19
+
20
+ /**
21
+ * Validates alphanumeric strings
22
+ */
23
+ export function validateAlphanumeric(str: string): boolean {
24
+ if (str.length === 0) return true;
25
+ const alphanumericRegex = /^[a-zA-Z0-9]+$/;
26
+ return alphanumericRegex.test(str);
27
+ }
28
+
29
+ /**
30
+ * Validates welcome page form inputs
31
+ */
32
+ export interface ValidateWelcomeInputsOptions {
33
+ name: string;
34
+ secret: string;
35
+ eventID: string;
36
+ link: string;
37
+ }
38
+
39
+ export function validateWelcomeInputs({
40
+ name,
41
+ secret,
42
+ eventID,
43
+ link,
44
+ }: ValidateWelcomeInputsOptions): { valid: boolean; message?: string } {
45
+ if (name.length === 0 || secret.length === 0 || eventID.length === 0 || link.length === 0) {
46
+ return { valid: false, message: 'Please fill all the fields.' };
47
+ }
48
+
49
+ if (
50
+ !validateAlphanumeric(name) ||
51
+ !validateAlphanumeric(secret) ||
52
+ !validateAlphanumeric(eventID) ||
53
+ !link.includes('mediasfu.com') ||
54
+ eventID.toLowerCase().startsWith('d')
55
+ ) {
56
+ return { valid: false, message: 'Please enter valid details.' };
57
+ }
58
+
59
+ if (
60
+ secret.length != 64 ||
61
+ name.length > 12 ||
62
+ name.length < 2 ||
63
+ eventID.length > 32 ||
64
+ eventID.length < 8 ||
65
+ link.length < 12
66
+ ) {
67
+ return { valid: false, message: 'Please enter valid details.' };
68
+ }
69
+
70
+ return { valid: true };
71
+ }
72
+
73
+ /**
74
+ * Handles connection request with rate limiting for welcome page
75
+ *
76
+ * @param {HandleWelcomeRequestOptions} options - Configuration for the request
77
+ * @returns {Promise<void>}
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * await handleWelcomeRequest({
82
+ * apiUserName: 'room123',
83
+ * apiToken: 'secret123',
84
+ * link: 'https://mediasfu.com/meeting',
85
+ * userName: 'John Doe',
86
+ * parameters,
87
+ * });
88
+ * ```
89
+ */
90
+ export async function handleWelcomeRequest({
91
+ apiUserName,
92
+ apiToken,
93
+ link,
94
+ userName,
95
+ parameters,
96
+ }: HandleWelcomeRequestOptions): Promise<void> {
97
+ const {
98
+ showAlert,
99
+ updateIsLoadingModalVisible,
100
+ connectSocket,
101
+ updateSocket,
102
+ updateValidated,
103
+ updateApiUserName,
104
+ updateApiToken,
105
+ updateLink,
106
+ updateRoomName,
107
+ updateMember,
108
+ } = parameters;
109
+
110
+ const TIMEOUT_DURATION = 10000; // 10 seconds
111
+
112
+ let unsuccessfulAttempts = parseInt(cookies.get('unsuccessfulAttempts') || '0');
113
+ let lastRequestTimestamp = parseInt(cookies.get('lastRequestTimestamp') || '0');
114
+
115
+ if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
116
+ if (Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {
117
+ showAlert?.({
118
+ message: 'Too many unsuccessful attempts. Please try again later.',
119
+ type: 'danger',
120
+ duration: 3000,
121
+ });
122
+ cookies.set('lastRequestTimestamp', Date.now().toString());
123
+ return;
124
+ } else {
125
+ unsuccessfulAttempts = 0;
126
+ cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
127
+ cookies.set('lastRequestTimestamp', Date.now().toString());
128
+ }
129
+ }
130
+
131
+ try {
132
+ updateIsLoadingModalVisible(true);
133
+
134
+ const socketPromise = connectSocket({
135
+ apiUserName,
136
+ apiKey: '',
137
+ apiToken,
138
+ link,
139
+ });
140
+ const timeoutPromise = new Promise<never>((_, reject) =>
141
+ setTimeout(() => reject(new Error('Request timed out')), TIMEOUT_DURATION)
142
+ );
143
+
144
+ const socket = await Promise.race([socketPromise, timeoutPromise]);
145
+
146
+ if (socket && socket instanceof Socket && socket.id) {
147
+ unsuccessfulAttempts = 0;
148
+ cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
149
+ cookies.set('lastRequestTimestamp', Date.now().toString());
150
+ updateSocket(socket);
151
+ updateApiUserName(apiUserName);
152
+ updateApiToken(apiToken);
153
+ updateLink(link);
154
+ updateRoomName(apiUserName);
155
+ updateMember(userName);
156
+ updateValidated(true);
157
+ } else {
158
+ unsuccessfulAttempts += 1;
159
+ cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
160
+ cookies.set('lastRequestTimestamp', Date.now().toString());
161
+ updateIsLoadingModalVisible(false);
162
+
163
+ if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
164
+ showAlert?.({
165
+ message: 'Too many unsuccessful attempts. Please try again later.',
166
+ type: 'danger',
167
+ duration: 3000,
168
+ });
169
+ } else {
170
+ showAlert?.({
171
+ message: 'Invalid credentials.',
172
+ type: 'danger',
173
+ duration: 3000,
174
+ });
175
+ }
176
+ }
177
+ } catch {
178
+ showAlert?.({
179
+ message: 'Unable to connect. Check your credentials and try again.',
180
+ type: 'danger',
181
+ duration: 3000,
182
+ });
183
+
184
+ unsuccessfulAttempts += 1;
185
+ cookies.set('unsuccessfulAttempts', unsuccessfulAttempts.toString());
186
+ cookies.set('lastRequestTimestamp', Date.now().toString());
187
+ updateIsLoadingModalVisible(false);
188
+ }
189
+ }
@@ -0,0 +1,5 @@
1
+ export { handleWelcomeRequest, validateAlphanumeric, validateWelcomeInputs } from './handleWelcomeRequest';
2
+ export type {
3
+ HandleWelcomeRequestOptions,
4
+ ValidateWelcomeInputsOptions,
5
+ } from './handleWelcomeRequest';
@@ -0,0 +1,65 @@
1
+ import type { Socket } from 'socket.io-client';
2
+ import type { ShowAlert, WhiteboardUser } from '../../types/types';
3
+
4
+
5
+ export interface HandleStartWhiteboardOptions {
6
+ socket: Socket;
7
+ whiteboardUsers: WhiteboardUser[];
8
+ roomName: string;
9
+ whiteboardStarted: boolean;
10
+ whiteboardEnded: boolean;
11
+ showAlert?: ShowAlert;
12
+ updateWhiteboardStarted: (started: boolean) => void;
13
+ updateWhiteboardEnded: (ended: boolean) => void;
14
+ updateIsConfigureWhiteboardModalVisible: (isVisible: boolean) => void;
15
+ }
16
+
17
+ export type HandleStartWhiteboardType = (options: HandleStartWhiteboardOptions) => Promise<boolean>;
18
+
19
+ /**
20
+ * Handles the start of a whiteboard session.
21
+ * @function
22
+ * @param {HandleStartWhiteboardOptions} options - The options for starting the whiteboard.
23
+ * @param {Socket} options.socket - The socket instance for communication.
24
+ * @param {WhiteboardUser[]} options.whiteboardUsers - Array of users assigned to the whiteboard.
25
+ * @param {string} options.roomName - The name of the room.
26
+ * @param {boolean} options.whiteboardStarted - Whether the whiteboard has already started.
27
+ * @param {boolean} options.whiteboardEnded - Whether the whiteboard has ended.
28
+ * @param {ShowAlert} [options.showAlert] - Function to show alerts.
29
+ * @param {Function} options.updateWhiteboardStarted - Function to update whiteboard started state.
30
+ * @param {Function} options.updateWhiteboardEnded - Function to update whiteboard ended state.
31
+ * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to close the configure modal.
32
+ * @returns {Promise<boolean>}
33
+ */
34
+ export const handleStartWhiteboard = async ({
35
+ socket,
36
+ whiteboardUsers,
37
+ roomName,
38
+ whiteboardStarted,
39
+ whiteboardEnded,
40
+ showAlert,
41
+ updateWhiteboardStarted,
42
+ updateWhiteboardEnded,
43
+ updateIsConfigureWhiteboardModalVisible,
44
+ }: HandleStartWhiteboardOptions): Promise<boolean> => {
45
+ const emitName = whiteboardStarted && !whiteboardEnded ? 'updateWhiteboard' : 'startWhiteboard';
46
+ const filteredWhiteboardUsers = whiteboardUsers.map(({ name, useBoard }) => ({ name, useBoard }));
47
+
48
+ return new Promise((resolve) => {
49
+ socket.emit(
50
+ emitName,
51
+ { whiteboardUsers: filteredWhiteboardUsers, roomName },
52
+ (response: { success: boolean; reason?: string }) => {
53
+ if (response.success) {
54
+ showAlert?.({ message: 'Whiteboard active', type: 'success' });
55
+ updateWhiteboardStarted(true);
56
+ updateWhiteboardEnded(false);
57
+ updateIsConfigureWhiteboardModalVisible(false);
58
+ } else {
59
+ showAlert?.({ message: response.reason || 'Failed to start whiteboard', type: 'danger' });
60
+ }
61
+ resolve(response.success);
62
+ }
63
+ );
64
+ });
65
+ };
@@ -0,0 +1,48 @@
1
+ import type { Socket } from 'socket.io-client';
2
+ import type { ShowAlert } from '../../types/types';
3
+
4
+ export interface HandleStopWhiteboardOptions {
5
+ socket: Socket;
6
+ roomName: string;
7
+ showAlert?: ShowAlert;
8
+ updateWhiteboardStarted: (started: boolean) => void;
9
+ updateWhiteboardEnded: (ended: boolean) => void;
10
+ updateIsConfigureWhiteboardModalVisible: (isVisible: boolean) => void;
11
+ }
12
+
13
+ export type HandleStopWhiteboardType = (options: HandleStopWhiteboardOptions) => Promise<boolean>;
14
+
15
+ /**
16
+ * Handles stopping a whiteboard session.
17
+ * @function
18
+ * @param {HandleStopWhiteboardOptions} options - The options for stopping the whiteboard.
19
+ * @param {Socket} options.socket - The socket instance for communication.
20
+ * @param {string} options.roomName - The name of the room.
21
+ * @param {ShowAlert} [options.showAlert] - Function to show alerts.
22
+ * @param {Function} options.updateWhiteboardStarted - Function to update whiteboard started state.
23
+ * @param {Function} options.updateWhiteboardEnded - Function to update whiteboard ended state.
24
+ * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to close the configure modal.
25
+ * @returns {Promise<boolean>}
26
+ */
27
+ export const handleStopWhiteboard = async ({
28
+ socket,
29
+ roomName,
30
+ showAlert,
31
+ updateWhiteboardStarted,
32
+ updateWhiteboardEnded,
33
+ updateIsConfigureWhiteboardModalVisible,
34
+ }: HandleStopWhiteboardOptions): Promise<boolean> => {
35
+ return new Promise((resolve) => {
36
+ socket.emit('stopWhiteboard', { roomName }, (response: { success: boolean; reason?: string }) => {
37
+ if (response.success) {
38
+ showAlert?.({ message: 'Whiteboard stopped', type: 'success' });
39
+ updateWhiteboardStarted(false);
40
+ updateWhiteboardEnded(true);
41
+ updateIsConfigureWhiteboardModalVisible(false);
42
+ } else {
43
+ showAlert?.({ message: response.reason || 'Failed to stop whiteboard', type: 'danger' });
44
+ }
45
+ resolve(response.success);
46
+ });
47
+ });
48
+ };
@@ -0,0 +1,4 @@
1
+ export { handleStartWhiteboard } from './handleStartWhiteboard';
2
+ export type { HandleStartWhiteboardOptions, HandleStartWhiteboardType } from './handleStartWhiteboard';
3
+ export { handleStopWhiteboard } from './handleStopWhiteboard';
4
+ export type { HandleStopWhiteboardOptions, HandleStopWhiteboardType } from './handleStopWhiteboard';
@@ -0,0 +1,29 @@
1
+ export interface LaunchConfigureWhiteboardOptions {
2
+ updateIsConfigureWhiteboardModalVisible: (visible: boolean) => void
3
+ isConfigureWhiteboardModalVisible: boolean
4
+ }
5
+
6
+ export type LaunchConfigureWhiteboardType = (options: LaunchConfigureWhiteboardOptions) => void
7
+
8
+ /**
9
+ * Toggles the visibility of the configure whiteboard modal.
10
+ *
11
+ * @param {LaunchConfigureWhiteboardOptions} options - The options for toggling the whiteboard modal visibility.
12
+ * @param {Function} options.updateIsConfigureWhiteboardModalVisible - Function to update the visibility state of the configure whiteboard modal.
13
+ * @param {boolean} options.isConfigureWhiteboardModalVisible - Current visibility state of the configure whiteboard modal.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const options = {
18
+ * updateIsConfigureWhiteboardModalVisible: (visible: boolean) => console.log('Modal visibility updated:', visible),
19
+ * isConfigureWhiteboardModalVisible: false,
20
+ * }
21
+ * launchConfigureWhiteboard(options)
22
+ * ```
23
+ */
24
+ export const launchConfigureWhiteboard: LaunchConfigureWhiteboardType = ({
25
+ updateIsConfigureWhiteboardModalVisible,
26
+ isConfigureWhiteboardModalVisible,
27
+ }) => {
28
+ updateIsConfigureWhiteboardModalVisible(!isConfigureWhiteboardModalVisible)
29
+ }
@@ -0,0 +1,153 @@
1
+ import { Socket } from "socket.io-client";
2
+ import { validateAlphanumeric } from "../../methods/utils/validateAlphanumeric"; // Import the validateAlphanumeric function from the validateAlphanumeric file
3
+ import type { RtpCapabilities } from "mediasoup-client/lib/types";
4
+
5
+ export interface JoinConRoomOptions {
6
+ socket: Socket;
7
+ roomName: string;
8
+ islevel: string;
9
+ member: string;
10
+ sec: string;
11
+ apiUserName: string;
12
+ }
13
+
14
+ export interface JoinConRoomResponse {
15
+ success: boolean;
16
+ rtpCapabilities: RtpCapabilities | null;
17
+ reason?: string;
18
+ banned?: boolean;
19
+ suspended?: boolean;
20
+ noAdmin?: boolean;
21
+ [key: string]: any;
22
+ }
23
+
24
+
25
+ // Export the type definition for the function
26
+ export type JoinConRoomType = (options: JoinConRoomOptions) => Promise<JoinConRoomResponse>;
27
+
28
+ /**
29
+ * Joins a conference room using the provided options.
30
+ *
31
+ * @param {JoinConRoomOptions} options - The options for joining the conference room.
32
+ * @param {Socket} options.socket - The socket instance to use for communication.
33
+ * @param {string} options.roomName - The name of the room to join.
34
+ * @param {string} options.islevel - The level of the user.
35
+ * @param {string} options.member - The member identifier.
36
+ * @param {string} options.sec - The security token.
37
+ * @param {string} options.apiUserName - The API username.
38
+ *
39
+ * @returns {Promise<JoinConRoomResponse>} A promise that resolves with the response of the join operation.
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * const options = {
44
+ * socket: socketInstance,
45
+ * roomName: "s12345678",
46
+ * islevel: "1",
47
+ * member: "user123",
48
+ * sec: "64CharacterLongSecretHere",
49
+ * apiUserName: "user123",
50
+ * };
51
+ *
52
+ * try {
53
+ * const response = await joinConRoom(options);
54
+ * console.log("Room joined:", response);
55
+ * } catch (error) {
56
+ * console.error("Failed to join room:", error);
57
+ * }
58
+ * ```
59
+ */
60
+
61
+ export async function joinConRoom(
62
+ { socket, roomName, islevel, member, sec, apiUserName }: JoinConRoomOptions
63
+ ): Promise<JoinConRoomResponse> {
64
+ return new Promise((resolve, reject) => {
65
+ // Validate inputs
66
+ if (!(sec && roomName && islevel && apiUserName && member)) {
67
+ const validationError: JoinConRoomResponse = {
68
+ success: false,
69
+ rtpCapabilities: null,
70
+ reason: "Missing required parameters",
71
+ };
72
+ reject(validationError);
73
+ return;
74
+ }
75
+
76
+ // Validate alphanumeric for roomName, apiUserName, and member
77
+ try {
78
+ validateAlphanumeric({ str: roomName });
79
+ validateAlphanumeric({ str: apiUserName });
80
+ validateAlphanumeric({ str: member });
81
+ } catch {
82
+ const validationError: JoinConRoomResponse = {
83
+ success: false,
84
+ rtpCapabilities: null,
85
+ reason: "Invalid roomName or apiUserName or member",
86
+ };
87
+ reject(validationError);
88
+ return;
89
+ }
90
+
91
+ // Validate roomName starts with 's' or 'p'
92
+ if (!(roomName.startsWith("s") || roomName.startsWith("p"))) {
93
+ const validationError: JoinConRoomResponse = {
94
+ success: false,
95
+ rtpCapabilities: null,
96
+ reason: "Invalid roomName, must start with s or p",
97
+ };
98
+ reject(validationError);
99
+ return;
100
+ }
101
+
102
+ // Validate other conditions for sec, roomName, islevel, apiUserName
103
+ if (
104
+ !(
105
+ sec.length === 64 &&
106
+ roomName.length >= 8 &&
107
+ islevel.length === 1 &&
108
+ apiUserName.length >= 6 &&
109
+ (islevel == "0" || islevel == "1" || islevel == "2")
110
+ )
111
+ ) {
112
+ const validationError: JoinConRoomResponse = {
113
+ success: false,
114
+ rtpCapabilities: null,
115
+ reason: "Invalid roomName or islevel or apiUserName or secret",
116
+ };
117
+ reject(validationError);
118
+ return;
119
+ }
120
+
121
+ socket.emit(
122
+ "joinConRoom",
123
+ { roomName, islevel, member, sec, apiUserName },
124
+ async (data: JoinConRoomResponse) => {
125
+ try {
126
+ // Check if rtpCapabilities is null
127
+ if (data.rtpCapabilities == null) {
128
+ // Check if banned, suspended, or noAdmin
129
+ if (data.banned) {
130
+ throw new Error("User is banned.");
131
+ }
132
+ if (data.suspended) {
133
+ throw new Error("User is suspended.");
134
+ }
135
+ if (data.noAdmin) {
136
+ throw new Error("Host has not joined the room yet.");
137
+ }
138
+
139
+ // Resolve with the data received from the 'joinConRoom' event
140
+ resolve(data);
141
+ } else {
142
+ // Handle other cases or perform additional actions
143
+ resolve(data);
144
+ }
145
+ } catch (error) {
146
+ // Handle errors during the joinConRoom process
147
+ console.log("Error joining room:", error);
148
+ reject(error);
149
+ }
150
+ }
151
+ );
152
+ });
153
+ }