mirror of
https://github.com/dergigi/boris.git
synced 2026-01-17 05:44:24 +01:00
40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
/**
|
|
* Wrap a promise with a timeout
|
|
*/
|
|
export async function withTimeout<T>(promise: Promise<T>, timeoutMs = 30000): Promise<T> {
|
|
return Promise.race([
|
|
promise,
|
|
new Promise<T>((_, reject) =>
|
|
setTimeout(() => reject(new Error(`Timeout after ${timeoutMs}ms`)), timeoutMs)
|
|
)
|
|
])
|
|
}
|
|
|
|
/**
|
|
* Map items through an async function with limited concurrency
|
|
* @param items - Array of items to process
|
|
* @param limit - Maximum number of concurrent operations
|
|
* @param mapper - Async function to apply to each item
|
|
* @returns Array of results in the same order as input
|
|
*/
|
|
export async function mapWithConcurrency<T, R>(
|
|
items: T[],
|
|
limit: number,
|
|
mapper: (item: T, index: number) => Promise<R>
|
|
): Promise<R[]> {
|
|
const results: R[] = new Array(items.length)
|
|
let currentIndex = 0
|
|
|
|
const worker = async () => {
|
|
while (currentIndex < items.length) {
|
|
const index = currentIndex++
|
|
results[index] = await mapper(items[index], index)
|
|
}
|
|
}
|
|
|
|
const workers = new Array(Math.min(limit, items.length)).fill(0).map(() => worker())
|
|
await Promise.all(workers)
|
|
return results
|
|
}
|
|
|