@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
text/typescript
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 };