mirror of
https://github.com/AustinKelsay/plebdevs.git
synced 2025-06-23 16:05:24 +00:00
add retry logic for lesson decryption with timeout handling
This commit is contained in:
parent
333cb30e31
commit
c54785353e
@ -141,6 +141,8 @@ const useDecryption = (session, paidCourse, course, lessons, setLessons, router)
|
|||||||
const { decryptContent } = useDecryptContent();
|
const { decryptContent } = useDecryptContent();
|
||||||
const processingRef = useRef(false);
|
const processingRef = useRef(false);
|
||||||
const lastLessonIdRef = useRef(null);
|
const lastLessonIdRef = useRef(null);
|
||||||
|
const retryCountRef = useRef({});
|
||||||
|
const MAX_RETRIES = 3;
|
||||||
|
|
||||||
// Get the current active lesson
|
// Get the current active lesson
|
||||||
const currentLessonIndex = router.query.active ? parseInt(router.query.active, 10) : 0;
|
const currentLessonIndex = router.query.active ? parseInt(router.query.active, 10) : 0;
|
||||||
@ -163,6 +165,13 @@ const useDecryption = (session, paidCourse, course, lessons, setLessons, router)
|
|||||||
);
|
);
|
||||||
}, [session, paidCourse, course]);
|
}, [session, paidCourse, course]);
|
||||||
|
|
||||||
|
// Reset retry count when lesson changes
|
||||||
|
useEffect(() => {
|
||||||
|
if (currentLessonId && lastLessonIdRef.current !== currentLessonId) {
|
||||||
|
retryCountRef.current[currentLessonId] = 0;
|
||||||
|
}
|
||||||
|
}, [currentLessonId]);
|
||||||
|
|
||||||
// Simplified decrypt function
|
// Simplified decrypt function
|
||||||
const decryptCurrentLesson = useCallback(async () => {
|
const decryptCurrentLesson = useCallback(async () => {
|
||||||
if (!currentLesson || !hasAccess || !paidCourse) return;
|
if (!currentLesson || !hasAccess || !paidCourse) return;
|
||||||
@ -170,6 +179,19 @@ const useDecryption = (session, paidCourse, course, lessons, setLessons, router)
|
|||||||
if (decryptedLessonIds[currentLesson.id]) return;
|
if (decryptedLessonIds[currentLesson.id]) return;
|
||||||
if (!currentLesson.content) return;
|
if (!currentLesson.content) return;
|
||||||
|
|
||||||
|
// Check retry count
|
||||||
|
if (!retryCountRef.current[currentLesson.id]) {
|
||||||
|
retryCountRef.current[currentLesson.id] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Limit maximum retries
|
||||||
|
if (retryCountRef.current[currentLesson.id] >= MAX_RETRIES) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Increment retry count
|
||||||
|
retryCountRef.current[currentLesson.id]++;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
processingRef.current = true;
|
processingRef.current = true;
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
@ -179,11 +201,22 @@ const useDecryption = (session, paidCourse, course, lessons, setLessons, router)
|
|||||||
setTimeout(() => reject(new Error('Decryption timeout')), 10000)
|
setTimeout(() => reject(new Error('Decryption timeout')), 10000)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Use a separate try-catch for the race
|
||||||
|
let decryptedContent;
|
||||||
|
try {
|
||||||
// Race between decryption and timeout
|
// Race between decryption and timeout
|
||||||
const decryptedContent = await Promise.race([
|
decryptedContent = await Promise.race([
|
||||||
decryptContent(currentLesson.content),
|
decryptContent(currentLesson.content),
|
||||||
timeoutPromise
|
timeoutPromise
|
||||||
]);
|
]);
|
||||||
|
} catch (error) {
|
||||||
|
// If timeout or network error, schedule a retry
|
||||||
|
setTimeout(() => {
|
||||||
|
processingRef.current = false;
|
||||||
|
decryptCurrentLesson();
|
||||||
|
}, 5000);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
|
||||||
if (!decryptedContent) {
|
if (!decryptedContent) {
|
||||||
return;
|
return;
|
||||||
@ -203,6 +236,9 @@ const useDecryption = (session, paidCourse, course, lessons, setLessons, router)
|
|||||||
...prev,
|
...prev,
|
||||||
[currentLesson.id]: true
|
[currentLesson.id]: true
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
// Reset retry counter on success
|
||||||
|
retryCountRef.current[currentLesson.id] = 0;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// Silent error handling to prevent UI disruption
|
// Silent error handling to prevent UI disruption
|
||||||
} finally {
|
} finally {
|
||||||
@ -215,8 +251,8 @@ const useDecryption = (session, paidCourse, course, lessons, setLessons, router)
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!currentLessonId) return;
|
if (!currentLessonId) return;
|
||||||
|
|
||||||
// Skip if the lesson hasn't changed
|
// Skip if the lesson hasn't changed, unless it failed decryption previously
|
||||||
if (lastLessonIdRef.current === currentLessonId) return;
|
if (lastLessonIdRef.current === currentLessonId && decryptedLessonIds[currentLessonId]) return;
|
||||||
|
|
||||||
// Update the last processed lesson id
|
// Update the last processed lesson id
|
||||||
lastLessonIdRef.current = currentLessonId;
|
lastLessonIdRef.current = currentLessonId;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user