mediasfu-reactnative-expo
Version:
mediasfu-reactnative-expo – Expo-managed React Native WebRTC SDK for video conferencing, webinars, live streaming, broadcast, screen sharing, whiteboard, chat, recording, live subtitles, translation, and AI agent rooms on iOS, Android, and web. Prebuilt r
88 lines • 4.03 kB
JavaScript
import AsyncStorage from '@react-native-async-storage/async-storage';
const MAX_ATTEMPTS = 10;
const RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000;
const readStoredNumber = async (key) => {
const value = await AsyncStorage.getItem(key);
const parsed = parseInt((value ?? '0').toString(), 10);
return Number.isNaN(parsed) ? 0 : parsed;
};
const writeStoredNumber = async (key, value) => {
await AsyncStorage.setItem(key, value.toString());
};
const hasConnectedSocketId = (socket) => {
if (!socket || typeof socket !== 'object') {
return false;
}
const candidate = socket;
return typeof candidate.id === 'string' && candidate.id.length > 0;
};
export const checkLimitsAndMakeRequest = async ({ apiUserName, apiToken, link, apiKey = '', userName, parameters, validate = true, }) => {
const TIMEOUT_DURATION = 10000;
try {
let unsuccessfulAttempts = await readStoredNumber('unsuccessfulAttempts');
const lastRequestTimestamp = await readStoredNumber('lastRequestTimestamp');
if (unsuccessfulAttempts >= MAX_ATTEMPTS &&
Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {
parameters.showAlert?.({
message: 'Too many unsuccessful attempts. Please try again later.',
type: 'danger',
duration: 3000,
});
await writeStoredNumber('lastRequestTimestamp', Date.now());
return;
}
if (unsuccessfulAttempts >= MAX_ATTEMPTS) {
unsuccessfulAttempts = 0;
await writeStoredNumber('unsuccessfulAttempts', unsuccessfulAttempts);
await writeStoredNumber('lastRequestTimestamp', Date.now());
}
parameters.updateIsLoadingModalVisible(true);
const socketPromise = parameters.connectSocket({ apiUserName, apiKey, apiToken, link });
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error('Request timed out')), TIMEOUT_DURATION));
const socket = await Promise.race([socketPromise, timeoutPromise]);
if (hasConnectedSocketId(socket)) {
unsuccessfulAttempts = 0;
await writeStoredNumber('unsuccessfulAttempts', unsuccessfulAttempts);
await writeStoredNumber('lastRequestTimestamp', Date.now());
if (validate) {
parameters.updateSocket(socket);
}
else {
parameters.updateLocalSocket?.(socket);
}
parameters.updateApiUserName(apiUserName);
parameters.updateApiToken(apiToken);
parameters.updateLink(link);
parameters.updateRoomName(apiUserName);
parameters.updateMember(userName);
if (validate)
parameters.updateValidated(true);
}
else {
unsuccessfulAttempts += 1;
await writeStoredNumber('unsuccessfulAttempts', unsuccessfulAttempts);
await writeStoredNumber('lastRequestTimestamp', Date.now());
parameters.updateIsLoadingModalVisible(false);
parameters.showAlert?.({
message: unsuccessfulAttempts >= MAX_ATTEMPTS
? 'Too many unsuccessful attempts. Please try again later.'
: 'Invalid credentials.',
type: 'danger',
duration: 3000,
});
}
}
catch (error) {
console.error('Error connecting to socket:', error);
parameters.showAlert?.({
message: 'Unable to connect. Check your credentials and try again.',
type: 'danger',
duration: 3000,
});
const unsuccessfulAttempts = (await readStoredNumber('unsuccessfulAttempts')) + 1;
await writeStoredNumber('unsuccessfulAttempts', unsuccessfulAttempts);
await writeStoredNumber('lastRequestTimestamp', Date.now());
parameters.updateIsLoadingModalVisible(false);
}
};
//# sourceMappingURL=checkLimitsAndMakeRequest.js.map