All files / src/functions chunker.ts

100% Statements 8/8
100% Branches 0/0
100% Functions 3/3
100% Lines 6/6

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26        1x               1x   1x 1x   1x       1x        
type WorkerFunction<T> = (arg: T) => Promise<void>;
 
export class Chunker {
  static Instantiate() {
    return new Chunker();
  }
 
  async ExecuteInChunks<T>(
    chunkSize: number,
    dataSet: T[],
    worker: WorkerFunction<T>,
  ) {
    const chunks: T[][] = [];
 
    for (let i = 0; i < dataSet.length; i += chunkSize) {
      chunks.push(dataSet.slice(i, i + chunkSize));
    }
    for (const chunk of chunks) {
      // NOTE: This is on purpose. We don't want to overwhelm
      //    the server with requests spawned, so we rate limit to `chunksize` at a time
      // eslint-disable-next-line no-await-in-loop
      await Promise.all(chunk.map((x) => worker(x)));
    }
  }
}