mediasfu-shared 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +228 -0
- package/dist/index.cjs +7707 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +7285 -0
- package/dist/index.js +7690 -0
- package/dist/index.js.map +1 -0
- package/package.json +78 -0
- package/src/ProducerClient/producerClientEmits/createDeviceClient.ts +68 -0
- package/src/consumers/addVideosGrid.ts +18 -0
- package/src/consumers/autoAdjust.ts +100 -0
- package/src/consumers/calculateRowsAndColumns.ts +51 -0
- package/src/consumers/changeVids.ts +753 -0
- package/src/consumers/checkGrid.ts +100 -0
- package/src/consumers/checkPermission.ts +89 -0
- package/src/consumers/checkScreenShare.ts +114 -0
- package/src/consumers/closeAndResize.ts +401 -0
- package/src/consumers/compareActiveNames.ts +122 -0
- package/src/consumers/compareScreenStates.ts +117 -0
- package/src/consumers/connectIps.ts +175 -0
- package/src/consumers/connectLocalIps.ts +103 -0
- package/src/consumers/connectRecvTransport.ts +158 -0
- package/src/consumers/connectSendTransport.ts +150 -0
- package/src/consumers/connectSendTransportAudio.ts +161 -0
- package/src/consumers/connectSendTransportScreen.ts +169 -0
- package/src/consumers/connectSendTransportVideo.ts +149 -0
- package/src/consumers/consumerResume.ts +25 -0
- package/src/consumers/controlMedia.ts +118 -0
- package/src/consumers/createSendTransport.ts +312 -0
- package/src/consumers/disconnectSendTransportAudio.ts +170 -0
- package/src/consumers/disconnectSendTransportScreen.ts +130 -0
- package/src/consumers/disconnectSendTransportVideo.ts +161 -0
- package/src/consumers/dispStreams.ts +694 -0
- package/src/consumers/generatePageContent.ts +118 -0
- package/src/consumers/getEstimate.ts +124 -0
- package/src/consumers/getPipedProducersAlt.ts +96 -0
- package/src/consumers/getProducersPiped.ts +89 -0
- package/src/consumers/getVideos.ts +107 -0
- package/src/consumers/mixStreams.ts +97 -0
- package/src/consumers/onScreenChanges.ts +106 -0
- package/src/consumers/prepopulateUserMedia.ts +18 -0
- package/src/consumers/processConsumerTransports.ts +157 -0
- package/src/consumers/processConsumerTransportsAudio.ts +121 -0
- package/src/consumers/rePort.ts +123 -0
- package/src/consumers/reUpdateInter.ts +289 -0
- package/src/consumers/readjust.ts +170 -0
- package/src/consumers/receiveAllPipedTransports.ts +77 -0
- package/src/consumers/receiveRoomMessages.ts +55 -0
- package/src/consumers/reorderStreams.ts +246 -0
- package/src/consumers/requestScreenShare.ts +103 -0
- package/src/consumers/resumePauseAudioStreams.ts +174 -0
- package/src/consumers/resumePauseStreams.ts +110 -0
- package/src/consumers/resumeSendTransportAudio.ts +143 -0
- package/src/consumers/signalNewConsumerTransport.ts +179 -0
- package/src/consumers/socketReceiveMethods/joinConsumeRoom.ts +130 -0
- package/src/consumers/socketReceiveMethods/newPipeProducer.ts +138 -0
- package/src/consumers/socketReceiveMethods/producerClosed.ts +102 -0
- package/src/consumers/startShareScreen.ts +124 -0
- package/src/consumers/stopShareScreen.ts +241 -0
- package/src/consumers/streamSuccessAudio.ts +297 -0
- package/src/consumers/streamSuccessAudioSwitch.ts +315 -0
- package/src/consumers/streamSuccessScreen.ts +255 -0
- package/src/consumers/streamSuccessVideo.ts +373 -0
- package/src/consumers/switchUserAudio.ts +140 -0
- package/src/consumers/switchUserVideo.ts +201 -0
- package/src/consumers/switchUserVideoAlt.ts +331 -0
- package/src/consumers/trigger.ts +250 -0
- package/src/consumers/updateMiniCardsGrid.ts +150 -0
- package/src/consumers/updateParticipantAudioDecibels.ts +56 -0
- package/src/index.ts +119 -0
- package/src/methods/background/launchBackground.ts +16 -0
- package/src/methods/breakoutRooms/breakoutRoomUpdated.ts +161 -0
- package/src/methods/breakoutRooms/handleStartBreakout.ts +96 -0
- package/src/methods/breakoutRooms/handleStopBreakout.ts +72 -0
- package/src/methods/breakoutRooms/index.ts +4 -0
- package/src/methods/breakoutRooms/launchBreakoutRooms.ts +31 -0
- package/src/methods/coHost/launchCoHost.ts +28 -0
- package/src/methods/coHostMethods/index.ts +2 -0
- package/src/methods/coHostMethods/modifyCoHostSettings.ts +94 -0
- package/src/methods/displaySettings/index.ts +1 -0
- package/src/methods/displaySettings/launchDisplaySettings.ts +31 -0
- package/src/methods/displaySettings/modifyDisplaySettings.ts +242 -0
- package/src/methods/exit/confirmExit.ts +60 -0
- package/src/methods/exit/index.ts +2 -0
- package/src/methods/exit/launchConfirmExit.ts +29 -0
- package/src/methods/index.ts +5 -0
- package/src/methods/mediaSettings/launchMediaSettings.ts +61 -0
- package/src/methods/menu/launchMenuModal.ts +28 -0
- package/src/methods/message/index.ts +1 -0
- package/src/methods/message/launchMessages.ts +27 -0
- package/src/methods/message/sendMessage.ts +175 -0
- package/src/methods/participants/index.ts +3 -0
- package/src/methods/participants/launchParticipants.ts +25 -0
- package/src/methods/participants/messageParticipants.ts +78 -0
- package/src/methods/participants/muteParticipants.ts +79 -0
- package/src/methods/participants/removeParticipants.ts +97 -0
- package/src/methods/polls/handleCreatePoll.ts +66 -0
- package/src/methods/polls/handleEndPoll.ts +64 -0
- package/src/methods/polls/handleVotePoll.ts +76 -0
- package/src/methods/polls/index.ts +3 -0
- package/src/methods/polls/launchPoll.ts +25 -0
- package/src/methods/prejoin/handleCreateRoom.ts +441 -0
- package/src/methods/prejoin/handleJoinRoom.ts +153 -0
- package/src/methods/prejoin/index.ts +14 -0
- package/src/methods/recording/checkPauseState.ts +57 -0
- package/src/methods/recording/checkResumeState.ts +42 -0
- package/src/methods/recording/confirmRecording.ts +241 -0
- package/src/methods/recording/launchRecording.ts +114 -0
- package/src/methods/recording/recordPauseTimer.ts +52 -0
- package/src/methods/recording/recordResumeTimer.ts +92 -0
- package/src/methods/recording/recordStartTimer.ts +106 -0
- package/src/methods/recording/recordUpdateTimer.ts +49 -0
- package/src/methods/recording/startRecording.ts +268 -0
- package/src/methods/recording/stopRecording.ts +124 -0
- package/src/methods/recording/updateRecording.ts +245 -0
- package/src/methods/requests/index.ts +1 -0
- package/src/methods/requests/launchRequests.ts +25 -0
- package/src/methods/requests/respondToRequests.ts +108 -0
- package/src/methods/settings/index.ts +2 -0
- package/src/methods/settings/launchSettings.ts +25 -0
- package/src/methods/settings/modifySettings.ts +99 -0
- package/src/methods/stream/clickVideo.ts +337 -0
- package/src/methods/stream/index.ts +3 -0
- package/src/methods/stream/switchAudio.ts +73 -0
- package/src/methods/stream/switchVideo.ts +148 -0
- package/src/methods/stream/switchVideoAlt.ts +152 -0
- package/src/methods/utils/checkLimitsAndMakeRequest.ts +103 -0
- package/src/methods/utils/validateAlphanumeric.ts +41 -0
- package/src/methods/waiting/index.ts +1 -0
- package/src/methods/waiting/launchWaiting.ts +26 -0
- package/src/methods/waiting/respondToWaiting.ts +82 -0
- package/src/methods/welcome/handleWelcomeRequest.ts +189 -0
- package/src/methods/welcome/index.ts +5 -0
- package/src/methods/whiteboard/handleStartWhiteboard.ts +65 -0
- package/src/methods/whiteboard/handleStopWhiteboard.ts +48 -0
- package/src/methods/whiteboard/index.ts +4 -0
- package/src/methods/whiteboard/launchConfigureWhiteboard.ts +29 -0
- package/src/producers/producerEmits/joinConRoom.ts +153 -0
- package/src/sockets/SocketManager.ts +232 -0
- package/src/types/shared-base-types.ts +752 -0
- package/src/types/types.ts +84 -0
|
@@ -0,0 +1,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,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
|
+
}
|