UNPKG

@afriapps/fs-client

Version:

React Native FileServer Client SDK for file synchronization and data management. Requires React Native environment with SQLite and File System support.

63 lines (57 loc) 2.15 kB
type TimeoutHandle = ReturnType<typeof setTimeout>; class CompletableFutureManager { /** * Gère une promesse avec un délai de temporisation et une gestion des exceptions. * * @param promise La promesse à gérer. * @param timeout Le délai d'expiration en millisecondes. * @param onTimeout Fonction à exécuter en cas de dépassement du délai. * @param onCancel Fonction à exécuter en cas d'annulation. * @returns Un objet contenant la promesse gérée et une fonction d'annulation. */ public manageFuture<T>( promise: Promise<T>, timeout: number, onTimeout?: (error: Error) => void, onCancel?: () => void, onFinally?: () => void ): { promise: Promise<T>; cancel: () => void } { let timeoutHandle: TimeoutHandle | null = null; let wasCancelled = false; const timeoutPromise: Promise<never> = new Promise((_, reject) => { // Promise<never> indique qu'il ne se résout pas normalement timeoutHandle = setTimeout(() => { const timeoutError = new Error('Operation timed out'); wasCancelled = true; if (onTimeout) { onTimeout(timeoutError); } reject(timeoutError); // Rejeter avec une erreur au lieu de résoudre avec null }, timeout); }); const wrappedPromise = Promise.race([promise, timeoutPromise]) .then(result => { if (wasCancelled) throw new Error('Promise was cancelled'); return result; // Résultat de type T }) .catch(error => { if (wasCancelled) throw new Error('Promise was cancelled'); throw error; // Error est propagée, donc la chaîne de promesse est de type Promise<T> }) .finally(() => { clearTimeout(timeoutHandle as TimeoutHandle); onFinally?.(); }); return { promise: wrappedPromise, cancel: () => { if (timeoutHandle) { clearTimeout(timeoutHandle); timeoutHandle = null; wasCancelled = true; onCancel?.(); } } }; } } export { CompletableFutureManager };