UNPKG

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
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