mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-15 03:01:09 +02:00
- Delete unused Input.svelte from Picture app (70 LOC) - Remove sleep() from shared-api-client, import from shared-utils - Fix NodeJS.Timeout type for browser compatibility Part of consolidation effort - see docs/CONSOLIDATION_OPPORTUNITIES.md Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
66 lines
1.3 KiB
TypeScript
66 lines
1.3 KiB
TypeScript
/**
|
|
* Async utility functions
|
|
*/
|
|
|
|
/**
|
|
* Sleep for a specified number of milliseconds
|
|
*/
|
|
export function sleep(ms: number): Promise<void> {
|
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
}
|
|
|
|
/**
|
|
* Retry a function with exponential backoff
|
|
*/
|
|
export async function retry<T>(
|
|
fn: () => Promise<T>,
|
|
options: {
|
|
maxAttempts?: number;
|
|
initialDelay?: number;
|
|
maxDelay?: number;
|
|
backoffMultiplier?: number;
|
|
} = {}
|
|
): Promise<T> {
|
|
const { maxAttempts = 3, initialDelay = 1000, maxDelay = 10000, backoffMultiplier = 2 } = options;
|
|
|
|
let lastError: Error | undefined;
|
|
let delay = initialDelay;
|
|
|
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
try {
|
|
return await fn();
|
|
} catch (error) {
|
|
lastError = error as Error;
|
|
|
|
if (attempt === maxAttempts) {
|
|
break;
|
|
}
|
|
|
|
await sleep(delay);
|
|
delay = Math.min(delay * backoffMultiplier, maxDelay);
|
|
}
|
|
}
|
|
|
|
throw lastError;
|
|
}
|
|
|
|
/**
|
|
* Debounce a function
|
|
*/
|
|
export function debounce<T extends (...args: any[]) => any>(
|
|
fn: T,
|
|
delay: number
|
|
): (...args: Parameters<T>) => void {
|
|
let timeoutId: ReturnType<typeof setTimeout> | null = null;
|
|
|
|
return (...args: Parameters<T>) => {
|
|
if (timeoutId) {
|
|
clearTimeout(timeoutId);
|
|
}
|
|
|
|
timeoutId = setTimeout(() => {
|
|
fn(...args);
|
|
timeoutId = null;
|
|
}, delay);
|
|
};
|
|
}
|