refactor: add input sanity checks to mapExecute()
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 13 Jun 2024 21:02:09 +0000 (23:02 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Thu, 13 Jun 2024 21:02:09 +0000 (23:02 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
src/pools/abstract-pool.ts
tests/pools/abstract-pool.test.mjs

index 8dedf2052baa90603be809d488639f0e9cb256fd..3b79565e062aa7b1660e42eb506478ca07d79da4 100644 (file)
@@ -1232,8 +1232,18 @@ export abstract class AbstractPool<
     name?: string,
     transferList?: readonly TransferListItem[]
   ): Promise<Response[]> {
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+    if (data == null) {
+      throw new TypeError('data argument must be a defined iterable')
+    }
+    if (typeof data[Symbol.iterator] !== 'function') {
+      throw new TypeError('data argument must be an iterable')
+    }
+    if (!Array.isArray(data)) {
+      data = [...data]
+    }
     return Promise.all(
-      [...data].map(data => this.execute(data, name, transferList))
+      (data as Data[]).map(data => this.execute(data, name, transferList))
     )
   }
 
index 97a2c111363f8d70a7bfd5e810794bf7fa840596..8db1d2b1b2fac2af2beba35a3e72b03ce1fc14cc 100644 (file)
@@ -1714,6 +1714,8 @@ describe('Abstract pool test suite', () => {
       numberOfWorkers,
       './tests/worker-files/thread/testMultipleTaskFunctionsWorker.mjs'
     )
+    expect(() => pool.mapExecute()).toThrow(new TypeError('data argument must be a defined iterable'))
+    expect(() => pool.mapExecute(0)).toThrow(new Error('data argument must be an iterable'))
     let results = await pool.mapExecute([{}, {}, {}, {}])
     expect(results).toStrictEqual([
       { ok: 1 },
@@ -1732,6 +1734,15 @@ describe('Abstract pool test suite', () => {
     ])
     expect(pool.info.executingTasks).toBe(0)
     expect(pool.info.executedTasks).toBe(8)
+    results = await pool.mapExecute(new Set([{ n: 10 }, { n: 20 }, { n: 30 }, { n: 40 }]), 'factorial')
+    expect(results).toStrictEqual([
+      3628800,
+      2432902008176640000,
+      2.6525285981219103e+32,
+      8.159152832478977e+47,
+    ])
+    expect(pool.info.executingTasks).toBe(0)
+    expect(pool.info.executedTasks).toBe(12)
     await pool.destroy()
   })