Use same lock values as mobile clients
[ProtonMail-WebClient.git] / packages / shared / lib / api / helpers / queryPages.ts
blob84771a7ee5b4a2a254c69fb2adfcea28ee5c8715
1 import chunk from '@proton/utils/chunk';
3 import { runChunksDelayed } from '../../helpers/promise';
5 interface Arguments {
6     pageSize: number;
7     pagesPerChunk: number;
8     delayPerChunk: number;
11 const queryPages = async <T extends { Total: number }>(
12     requestPage: (page: number, pageSize: number) => Promise<T>,
13     { pageSize = 50, pagesPerChunk = 10, delayPerChunk = 100 }: Partial<Arguments> = {}
14 ) => {
15     const firstPage = await requestPage(0, pageSize);
16     const n = Math.ceil((firstPage?.Total || 0) / pageSize) - 1; // First page already loaded
18     if (n <= 0) {
19         return [firstPage];
20     }
22     const pages = Array.from({ length: n }, (a, i) => i + 1);
23     const chunks = chunk(pages, pagesPerChunk);
25     const restPages =
26         chunks.length > 0 ? await runChunksDelayed(chunks, (idx) => requestPage(idx, pageSize), delayPerChunk) : [];
28     return [firstPage].concat(restPages);
31 export default queryPages;