build: reenable eslint type checking
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 31 May 2024 14:28:25 +0000 (16:28 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Fri, 31 May 2024 14:28:25 +0000 (16:28 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
28 files changed:
.lintstagedrc.js
eslint.config.js
examples/typescript/http-client-pool/src/main.ts
examples/typescript/http-client-pool/src/worker.ts
examples/typescript/http-server-pool/express-cluster/src/main.ts
examples/typescript/http-server-pool/express-cluster/src/worker.ts
examples/typescript/http-server-pool/express-hybrid/src/express-worker.ts
examples/typescript/http-server-pool/express-hybrid/src/main.ts
examples/typescript/http-server-pool/express-worker_threads/src/main.ts
examples/typescript/http-server-pool/fastify-cluster/src/main.ts
examples/typescript/http-server-pool/fastify-hybrid/src/main.ts
examples/typescript/pool.ts
examples/typescript/smtp-client-pool/src/main.ts
examples/typescript/websocket-server-pool/ws-cluster/src/main.ts
examples/typescript/websocket-server-pool/ws-cluster/src/worker.ts
examples/typescript/websocket-server-pool/ws-hybrid/src/main.ts
examples/typescript/websocket-server-pool/ws-hybrid/src/websocket-server-worker.ts
examples/typescript/websocket-server-pool/ws-worker_threads/src/main.ts
src/circular-buffer.ts
src/fixed-priority-queue.ts
src/pools/abstract-pool.ts
src/pools/selection-strategies/selection-strategies-utils.ts
src/pools/selection-strategies/worker-choice-strategies-context.ts
src/pools/utils.ts
src/priority-queue.ts
src/utils.ts
src/worker/abstract-worker.ts
src/worker/utils.ts

index 8cdf685f19b20acc912299aa08259b9050eccf86..403bbda9f12c5e4f7e37fb73145b150fb9b1153d 100644 (file)
@@ -1,7 +1,8 @@
 export default {
   '**/*.{ts,tsx,js,jsx,cjs,mjs}': [
-    'biome format --write',
-    'eslint --cache --fix',
+    // 'biome format --write',
+    // 'eslint --cache --fix',
+    'eslint --cache',
   ],
   '**/*.json': ['biome format --write'],
   '**/*.{md,yml,yaml}': ['prettier --cache --write'],
index e0fa23c6d758dd007f652bd2d29891d8425bfc61..8a100a1a51fce7e7377972a62362ed32f6a6e5fc 100644 (file)
@@ -17,7 +17,10 @@ export default defineFlatConfig([
   js.configs.recommended,
   ...nodePlugin.configs['flat/mixed-esm-and-cjs'],
   jsdoc.configs['flat/recommended-typescript'],
-  ...tseslint.config(...tseslint.configs.strict, ...tseslint.configs.stylistic),
+  ...tseslint.config(
+    ...tseslint.configs.strictTypeChecked,
+    ...tseslint.configs.stylisticTypeChecked
+  ),
   ...neostandard({
     ts: true,
     globals: {
@@ -25,18 +28,14 @@ export default defineFlatConfig([
       ...globals.mocha,
     },
   }),
-  // ...tseslint.config(
-  //   ...tseslint.configs.strictTypeChecked,
-  //   ...tseslint.configs.stylisticTypeChecked,
-  //   {
-  //     languageOptions: {
-  //       parserOptions: {
-  //         project: true,
-  //         tsconfigRootDir: import.meta.dirname,
-  //       },
-  //     },
-  //   }
-  // ),
+  {
+    languageOptions: {
+      parserOptions: {
+        project: true,
+        tsconfigRootDir: import.meta.dirname,
+      },
+    },
+  },
   {
     plugins: {
       'simple-import-sort': simpleImportSort,
@@ -73,11 +72,16 @@ export default defineFlatConfig([
     },
   },
   {
-    files: ['examples/**/*.ts'],
-    rules: {
-      'no-undef': 'off',
-    },
+    files: ['**/*.js', '**/*.mjs', '**/*.cjs'],
+    ...tseslint.configs.disableTypeChecked,
   },
+  // examples specific configuration
+  // {
+  //   files: ['examples/**/*.ts'],
+  //   rules: {
+  //     'no-undef': 'off',
+  //   },
+  // },
   {
     files: ['examples/**/*.js', 'examples/**/*.cjs'],
     rules: {
@@ -90,12 +94,14 @@ export default defineFlatConfig([
       '@typescript-eslint/no-require-imports': 'off',
     },
   },
+  // benchmarks specific configuration
   {
     files: ['benchmarks/**/*.cjs'],
     rules: {
       '@typescript-eslint/no-require-imports': 'off',
     },
   },
+  // tests specific configuration
   {
     files: ['tests/**/*.js', 'tests/**/*.mjs', 'tests/**/*.cjs'],
     rules: {
index 722de1e6dc200bbc535f1dfce8db4516d6c95d58..696671eaeb8e0e81b7b27ee1119704b289e2afd2 100644 (file)
@@ -18,9 +18,9 @@ for (const workerFunction of ['node_fetch', 'fetch', 'axios']) {
     const responses = await Promise.all(httpClientPoolPromises)
     const elapsedTime = performance.now() - now
     console.info(
-      `Received in ${elapsedTime.toFixed(2)}ms an array with ${
-        responses.length
-      } responses from ${parallelism} parallel requests made with HTTP client pool task function ${workerFunction} on ${requestUrl}:\n`,
+      `Received in ${elapsedTime.toFixed(
+        2
+      )}ms an array with ${responses.length.toString()} responses from ${parallelism.toString()} parallel requests made with HTTP client pool task function ${workerFunction} on ${requestUrl}:\n`,
       responses
     )
   } catch (error) {
index 95917d64207d4d846353be93b6560b9ff6b21e9d..5878523ee19a74e192e22f6773ec1d02a35a9699 100644 (file)
@@ -40,6 +40,7 @@ class HttpClientWorker extends ThreadWorker<WorkerData, WorkerResponse> {
           ...workerData?.axiosRequestConfig,
         })
         return {
+          // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
           text: response.data,
         }
       },
index eeb196a623a9c939a1f38bbabd157a581a5b7f5d..0b7c45b18d7a8aa73d2edb14535ab8a229e1c7a8 100644 (file)
@@ -21,7 +21,8 @@ const pool = new FixedClusterPool<WorkerData, WorkerResponse>(
         .then(response => {
           if (response.status) {
             console.info(
-              `Express is listening in cluster worker on port ${response.port}`
+              // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+              `Express is listening in cluster worker on port ${response.port?.toString()}`
             )
           }
           return undefined
index af25b056351d2d2eedd0a9798f04e65399a27410..6c0aad8c43f340b0df7423eecb7f17deaf835072 100644 (file)
@@ -50,7 +50,7 @@ class ExpressWorker extends ClusterWorker<WorkerData, WorkerResponse> {
     ExpressWorker.server = application.listen(port, () => {
       listenerPort = (ExpressWorker.server.address() as AddressInfo).port
       console.info(
-        `⚡️[express server]: Express server is started in cluster worker at http://localhost:${listenerPort}/`
+        `⚡️[express server]: Express server is started in cluster worker at http://localhost:${listenerPort.toString()}/`
       )
     })
     return {
index 360cf9137cdc2af41c059d6b9ef789788a02c74a..f9364b43fe354fc91d6a661516035e72bc90fc4f 100644 (file)
@@ -54,6 +54,7 @@ class ExpressWorker extends ClusterWorker<
 
     application.all('/api/echo', (req: Request, res: Response) => {
       ExpressWorker.requestHandlerPool
+        // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
         .execute({ data: req.body }, 'echo')
         .then(response => {
           return res.send(response.data).end()
@@ -75,7 +76,7 @@ class ExpressWorker extends ClusterWorker<
     ExpressWorker.server = application.listen(port, () => {
       listenerPort = (ExpressWorker.server.address() as AddressInfo).port
       console.info(
-        `⚡️[express server]: Express server is started in cluster worker at http://localhost:${listenerPort}/`
+        `⚡️[express server]: Express server is started in cluster worker at http://localhost:${listenerPort.toString()}/`
       )
     })
     return {
index 1406248fbcc7b98891d6ec49c62f6af69528836d..d7b6c89d1b76f45b335f357405c08f25dd6aa13c 100644 (file)
@@ -40,7 +40,8 @@ const pool = new FixedClusterPool<ClusterWorkerData, ClusterWorkerResponse>(
         .then(response => {
           if (response.status) {
             console.info(
-              `Express is listening in cluster worker on port ${response.port}`
+              // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+              `Express is listening in cluster worker on port ${response.port?.toString()}`
             )
           }
           return undefined
index e0cb704218b817d638e986826fd2e078d36ad92e..dc70d7ec03a0ceb8589863b615a63e178e0c72b2 100644 (file)
@@ -23,6 +23,7 @@ expressApp.use(express.json())
 
 expressApp.all('/api/echo', (req: Request, res: Response) => {
   requestHandlerPool
+    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
     .execute({ body: req.body }, 'echo')
     .then(response => {
       return res.send(response.body).end()
@@ -43,7 +44,7 @@ expressApp.get('/api/factorial/:number', (req: Request, res: Response) => {
 try {
   expressApp.listen(port, () => {
     console.info(
-      `⚡️[express server]: Express server is started at http://localhost:${port}/`
+      `⚡️[express server]: Express server is started at http://localhost:${port.toString()}/`
     )
   })
 } catch (err) {
index 794a93b6bfed3b3288c57238390a8eb60e422ff8..a548b13ddeed7d04630b4876cb9f5b366d0d4f4b 100644 (file)
@@ -21,7 +21,8 @@ const pool = new FixedClusterPool<WorkerData, WorkerResponse>(
         .then(response => {
           if (response.status) {
             console.info(
-              `Fastify is listening in cluster worker on port ${response.port}`
+              // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+              `Fastify is listening in cluster worker on port ${response.port?.toString()}`
             )
           }
           return undefined
index 4622324c02c97f1e141abccb7c7b464ed113508d..74ed1f70158ce7876e717ab844cd16e8e7a3b58f 100644 (file)
@@ -40,7 +40,8 @@ const pool = new FixedClusterPool<ClusterWorkerData, ClusterWorkerResponse>(
         .then(response => {
           if (response.status) {
             console.info(
-              `Fastify is listening in cluster worker on port ${response.port}`
+              // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+              `Fastify is listening in cluster worker on port ${response.port?.toString()}`
             )
           }
           return undefined
index 5d3d8e756833d84775d24bde59a975792da5b94b..1be0691a7aa7bf42423530d25d82994e4ce7fa6e 100644 (file)
@@ -45,6 +45,7 @@ const dynamicPool = new DynamicThreadPool<MyData, MyResponse>(
 
 await dynamicPool.execute()
 
+// eslint-disable-next-line @typescript-eslint/no-misused-promises
 setTimeout(async () => {
   await fixedPool.destroy()
   await dynamicPool.destroy()
index e00372dc6f931ab5a4dea915728a9dd0c14754f6..4d1f2ea896188b7cfa49aa559dfaaab5f5a28f7c 100644 (file)
@@ -32,9 +32,9 @@ try {
   await Promise.all(smtpClientPoolPromises)
   const elapsedTime = performance.now() - now
   console.info(
-    `Send in parallel in ${elapsedTime.toFixed(2)}ms ${
-      tos.length
-    } mails with SMTP client pool`
+    `Send in parallel in ${elapsedTime.toFixed(
+      2
+    )}ms ${tos.length.toString()} mails with SMTP client pool`
   )
 } catch (error) {
   console.error(error)
index 200afb357e222b440e43613e88e867161016eb9f..6e108d6f87efe1efcaf4ebfb91ef34319b06b37c 100644 (file)
@@ -21,7 +21,8 @@ const pool = new FixedClusterPool<WorkerData, WorkerResponse>(
         .then(response => {
           if (response.status) {
             console.info(
-              `WebSocket server is listening in cluster worker on port ${response.port}`
+              // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+              `WebSocket server is listening in cluster worker on port ${response.port?.toString()}`
             )
           }
           return undefined
index a3ab5e28f04b458c68493faadd9125243c2b5b1d..d9091e7f0eb1c27ea0ecf208d9495a4e8ca4578f 100644 (file)
@@ -33,7 +33,7 @@ class WebSocketServerWorker extends ClusterWorker<WorkerData, WorkerResponse> {
 
     WebSocketServerWorker.wss = new WebSocketServer({ port }, () => {
       console.info(
-        `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/`
+        `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port.toString()}/`
       )
     })
 
@@ -41,6 +41,7 @@ class WebSocketServerWorker extends ClusterWorker<WorkerData, WorkerResponse> {
       ws.on('error', console.error)
       ws.on('message', (message: RawData) => {
         const { type, data } = JSON.parse(
+          // eslint-disable-next-line @typescript-eslint/no-base-to-string
           message.toString()
         ) as MessagePayload<DataPayload>
         switch (type) {
@@ -62,7 +63,7 @@ class WebSocketServerWorker extends ClusterWorker<WorkerData, WorkerResponse> {
                     number: WebSocketServerWorker.factorial(data.number!),
                   },
                 },
-                (_, v) => (typeof v === 'bigint' ? v.toString() : v)
+                (_, v: unknown) => (typeof v === 'bigint' ? v.toString() : v)
               )
             )
             break
index 5ba8805199ed7e40388f2e8eededb464ea8297ac..400f0beed3e2a790fd8306e6f70f183f36819213 100644 (file)
@@ -40,7 +40,8 @@ const pool = new FixedClusterPool<ClusterWorkerData, ClusterWorkerResponse>(
         .then(response => {
           if (response.status) {
             console.info(
-              `WebSocket server is listening in cluster worker on port ${response.port}`
+              // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+              `WebSocket server is listening in cluster worker on port ${response.port?.toString()}`
             )
           }
           return undefined
index 6aa993d29ebd9d725cfed426535107061dad46e5..72ac2a1baef359eb635543a2e7ac68dcb080e832 100644 (file)
@@ -48,7 +48,7 @@ class WebSocketServerWorker extends ClusterWorker<
 
     WebSocketServerWorker.wss = new WebSocketServer({ port }, () => {
       console.info(
-        `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port}/`
+        `⚡️[ws server]: WebSocket server is started in cluster worker at ws://localhost:${port.toString()}/`
       )
     })
 
@@ -56,6 +56,7 @@ class WebSocketServerWorker extends ClusterWorker<
       ws.on('error', console.error)
       ws.on('message', (message: RawData) => {
         const { type, data } = JSON.parse(
+          // eslint-disable-next-line @typescript-eslint/no-base-to-string
           message.toString()
         ) as MessagePayload<DataPayload>
         switch (type) {
@@ -83,7 +84,8 @@ class WebSocketServerWorker extends ClusterWorker<
                       type: MessageType.factorial,
                       data: response.data,
                     },
-                    (_, v) => (typeof v === 'bigint' ? v.toString() : v)
+                    (_, v: unknown) =>
+                      typeof v === 'bigint' ? v.toString() : v
                   )
                 )
                 return undefined
index 2954cbdec897d26f495e705b65118388f069e1da..cb28beebb18b9eaa4579b7630ef0a23bc8ceadfb 100644 (file)
@@ -6,7 +6,7 @@ import { type DataPayload, type MessagePayload, MessageType } from './types.js'
 const port = 8080
 const wss = new WebSocketServer({ port }, () => {
   console.info(
-    `⚡️[ws server]: WebSocket server is started at ws://localhost:${port}/`
+    `⚡️[ws server]: WebSocket server is started at ws://localhost:${port.toString()}/`
   )
 })
 
@@ -18,6 +18,7 @@ wss.on('connection', ws => {
   ws.on('error', console.error)
   ws.on('message', (message: RawData) => {
     const { type, data } = JSON.parse(
+      // eslint-disable-next-line @typescript-eslint/no-base-to-string
       message.toString()
     ) as MessagePayload<DataPayload>
     switch (type) {
@@ -45,7 +46,7 @@ wss.on('connection', ws => {
                   type: MessageType.factorial,
                   data: response.data,
                 },
-                (_, v) => (typeof v === 'bigint' ? v.toString() : v)
+                (_, v: unknown) => (typeof v === 'bigint' ? v.toString() : v)
               )
             )
             return undefined
index b4a6003013e1aab89cb41a598c8e37e0470581ef..5015483b290055e1a78e961c248024625800b6d6 100644 (file)
@@ -85,11 +85,13 @@ export class CircularBuffer {
   private checkSize (size: number): void {
     if (!Number.isSafeInteger(size)) {
       throw new TypeError(
-        `Invalid circular buffer size: '${size}' is not an integer`
+        `Invalid circular buffer size: '${size.toString()}' is not an integer`
       )
     }
     if (size < 0) {
-      throw new RangeError(`Invalid circular buffer size: ${size} < 0`)
+      throw new RangeError(
+        `Invalid circular buffer size: ${size.toString()} < 0`
+      )
     }
   }
 }
index efcc35ca67c23d89e8c5eed82c50125e3353a4d7..a3de02095fb4fcd34874cea8efbf67c703d01e5c 100644 (file)
@@ -175,11 +175,13 @@ export class FixedPriorityQueue<T> {
   private checkSize (size: number): void {
     if (!Number.isSafeInteger(size)) {
       throw new TypeError(
-        `Invalid fixed priority queue size: '${size}' is not an integer`
+        `Invalid fixed priority queue size: '${size.toString()}' is not an integer`
       )
     }
     if (size < 0) {
-      throw new RangeError(`Invalid fixed priority queue size: ${size} < 0`)
+      throw new RangeError(
+        `Invalid fixed priority queue size: ${size.toString()} < 0`
+      )
     }
   }
 }
index e4dac676ab95acae7ee60a82d332084766735e46..3b676faa7a4f28309743d38328ab0e35ab80818a 100644 (file)
@@ -658,7 +658,7 @@ export abstract class AbstractPool<
       throw new Error('Worker message received without worker id')
     } else if (this.getWorkerNodeKeyByWorkerId(message.workerId) === -1) {
       throw new Error(
-        `Worker message received from unknown worker '${message.workerId}'`
+        `Worker message received from unknown worker '${message.workerId.toString()}'`
       )
     }
   }
@@ -891,7 +891,11 @@ export abstract class AbstractPool<
           } else {
             reject(
               new Error(
-                `Task function operation '${message.taskFunctionOperation}' failed on worker ${message.workerId} with error: '${message.workerError?.message}'`
+                // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+                `Task function operation '${message.taskFunctionOperation?.toString()}' failed on worker ${message.workerId?.toString()} with error: '${
+                  // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+                  message.workerError?.message
+                }'`
               )
             )
           }
@@ -939,7 +943,9 @@ export abstract class AbstractPool<
                 new Error(
                   `Task function operation '${
                     message.taskFunctionOperation as string
-                  }' failed on worker ${errorResponse?.workerId} with error: '${
+                    // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+                  }' failed on worker ${errorResponse?.workerId?.toString()} with error: '${
+                    // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
                     errorResponse?.workerError?.message
                   }'`
                 )
@@ -1284,6 +1290,7 @@ export abstract class AbstractPool<
 
   private async sendKillMessageToWorker (workerNodeKey: number): Promise<void> {
     await new Promise<void>((resolve, reject) => {
+      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
       if (this.workerNodes[workerNodeKey] == null) {
         resolve()
         return
@@ -1295,7 +1302,8 @@ export abstract class AbstractPool<
         } else if (message.kill === 'failure') {
           reject(
             new Error(
-              `Kill message handling failed on worker ${message.workerId}`
+              // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+              `Kill message handling failed on worker ${message.workerId?.toString()}`
             )
           )
         }
@@ -1351,6 +1359,7 @@ export abstract class AbstractPool<
     workerNodeKey: number,
     task: Task<Data>
   ): void {
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (this.workerNodes[workerNodeKey]?.usage != null) {
       const workerUsage = this.workerNodes[workerNodeKey].usage
       ++workerUsage.tasks.executing
@@ -1391,6 +1400,7 @@ export abstract class AbstractPool<
     message: MessageValue<Response>
   ): void {
     let needWorkerChoiceStrategiesUpdate = false
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (this.workerNodes[workerNodeKey]?.usage != null) {
       const workerUsage = this.workerNodes[workerNodeKey].usage
       updateTaskStatisticsWorkerUsage(workerUsage, message)
@@ -1568,6 +1578,7 @@ export abstract class AbstractPool<
       ) {
         this.redistributeQueuedTasks(this.workerNodes.indexOf(workerNode))
       }
+      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
       workerNode?.terminate().catch((error: unknown) => {
         this.emitter?.emit(PoolEvents.error, error)
       })
@@ -1786,6 +1797,7 @@ export abstract class AbstractPool<
     taskName: string
   ): void {
     const workerNode = this.workerNodes[workerNodeKey]
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (workerNode?.usage != null) {
       ++workerNode.usage.tasks.stolen
     }
@@ -1804,6 +1816,7 @@ export abstract class AbstractPool<
     previousTaskName?: string
   ): void {
     const workerNode = this.workerNodes[workerNodeKey]
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (workerNode?.usage != null) {
       ++workerNode.usage.tasks.sequentiallyStolen
     }
@@ -1832,6 +1845,7 @@ export abstract class AbstractPool<
     taskName: string
   ): void {
     const workerNode = this.workerNodes[workerNodeKey]
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (workerNode?.usage != null) {
       workerNode.usage.tasks.sequentiallyStolen = 0
     }
@@ -1859,7 +1873,7 @@ export abstract class AbstractPool<
     const workerInfo = this.getWorkerInfo(workerNodeKey)
     if (workerInfo == null) {
       throw new Error(
-        `Worker node with key '${workerNodeKey}' not found in pool`
+        `Worker node with key '${workerNodeKey.toString()}' not found in pool`
       )
     }
     if (
@@ -1975,7 +1989,7 @@ export abstract class AbstractPool<
         const workerInfo = this.getWorkerInfo(workerNodeKey)
         if (workerInfo == null) {
           throw new Error(
-            `Worker node with key '${workerNodeKey}' not found in pool`
+            `Worker node with key '${workerNodeKey.toString()}' not found in pool`
           )
         }
         workerInfo.stealing = true
@@ -2032,7 +2046,8 @@ export abstract class AbstractPool<
   private handleWorkerReadyResponse (message: MessageValue<Response>): void {
     const { workerId, ready, taskFunctionsProperties } = message
     if (ready == null || !ready) {
-      throw new Error(`Worker ${workerId} failed to initialize`)
+      // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
+      throw new Error(`Worker ${workerId?.toString()} failed to initialize`)
     }
     const workerNodeKey = this.getWorkerNodeKeyByWorkerId(workerId)
     const workerNode = this.workerNodes[workerNodeKey]
@@ -2068,10 +2083,12 @@ export abstract class AbstractPool<
       this.afterTaskExecutionHook(workerNodeKey, message)
       // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
       this.promiseResponseMap.delete(taskId!)
+      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
       workerNode?.emit('taskFinished', taskId)
       if (
         this.opts.enableTasksQueue === true &&
         !this.destroying &&
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
         workerNode != null
       ) {
         const workerNodeTasksUsage = workerNode.usage.tasks
index 007f1e574bc4cf1b505f5b1f3d728db990fad6cb..1c0b91b4de0ae9e6ca8a3c93ce11c06fdec39b1b 100644 (file)
@@ -33,13 +33,16 @@ const estimatedCpuSpeed = (): number => {
 const getDefaultWorkerWeight = (): number => {
   const currentCpus = cpus()
   let estCpuSpeed: number | undefined
+  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
   if (currentCpus.every(cpu => cpu.speed == null || cpu.speed === 0)) {
     estCpuSpeed = estimatedCpuSpeed()
   }
   let cpusCycleTimeWeight = 0
   for (const cpu of currentCpus) {
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (cpu.speed == null || cpu.speed === 0) {
       cpu.speed =
+        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
         currentCpus.find(cpu => cpu.speed != null && cpu.speed !== 0)?.speed ??
         estCpuSpeed ??
         2000
@@ -180,6 +183,7 @@ export const getWorkerChoiceStrategy = <Worker extends IWorker, Data, Response>(
       ))(pool, opts)
     default:
       throw new Error(
+        // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
         `Worker choice strategy '${workerChoiceStrategy}' is not valid`
       )
   }
index b7b0ad5633ca53bbbf459f18ea189996a08091cf..a736896a792649a85c9294d9b53aa6633b442820 100644 (file)
@@ -174,7 +174,7 @@ export class WorkerChoiceStrategiesContext<
     } while (workerNodeKey == null && retriesCount < this.retries)
     if (workerNodeKey == null) {
       throw new Error(
-        `Worker node key chosen is null or undefined after ${retriesCount} retries`
+        `Worker node key chosen is null or undefined after ${retriesCount.toString()} retries`
       )
     }
     return workerNodeKey
index 3ac39b4d478e7dec43b97546066fbb101706b696..24f2cfb2a6d075b2133473bef04aa9a650607c5b 100644 (file)
@@ -89,7 +89,7 @@ export const checkDynamicPoolSize = (
 
 export const checkValidPriority = (priority: number | undefined): void => {
   if (priority != null && !Number.isSafeInteger(priority)) {
-    throw new TypeError(`Invalid property 'priority': '${priority}'`)
+    throw new TypeError(`Invalid property 'priority': '${priority.toString()}'`)
   }
   if (
     priority != null &&
@@ -130,7 +130,7 @@ export const checkValidTasksQueueOptions = (
     tasksQueueOptions.concurrency <= 0
   ) {
     throw new RangeError(
-      `Invalid worker node tasks concurrency: ${tasksQueueOptions.concurrency} is a negative integer or zero`
+      `Invalid worker node tasks concurrency: ${tasksQueueOptions.concurrency.toString()} is a negative integer or zero`
     )
   }
   if (
@@ -143,7 +143,7 @@ export const checkValidTasksQueueOptions = (
   }
   if (tasksQueueOptions?.size != null && tasksQueueOptions.size <= 0) {
     throw new RangeError(
-      `Invalid worker node tasks queue size: ${tasksQueueOptions.size} is a negative integer or zero`
+      `Invalid worker node tasks queue size: ${tasksQueueOptions.size.toString()} is a negative integer or zero`
     )
   }
 }
@@ -261,6 +261,7 @@ const updateMeasurementStatistics = (
   }
 }
 if (env.NODE_ENV === 'test') {
+  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
   exports.updateMeasurementStatistics = updateMeasurementStatistics
 }
 
@@ -290,6 +291,7 @@ export const updateTaskStatisticsWorkerUsage = <Response = unknown>(
 ): void => {
   const workerTaskStatistics = workerUsage.tasks
   if (
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     workerTaskStatistics.executing != null &&
     workerTaskStatistics.executing > 0
   ) {
@@ -377,6 +379,7 @@ export const createWorker = <Worker extends IWorker>(
     case WorkerTypes.cluster:
       return cluster.fork(opts.env) as unknown as Worker
     default:
+      // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
       throw new Error(`Unknown worker type '${type}'`)
   }
 }
index c613cd2e9ee393589a80950bda985bb7004f35ff..93e7b76dbfa8051fd3783f2063460f6c86252753 100644 (file)
@@ -40,11 +40,11 @@ export class PriorityQueue<T> {
   ) {
     if (!Number.isSafeInteger(bucketSize)) {
       throw new TypeError(
-        `Invalid bucket size: '${bucketSize}' is not an integer`
+        `Invalid bucket size: '${bucketSize.toString()}' is not an integer`
       )
     }
     if (bucketSize < 0) {
-      throw new RangeError(`Invalid bucket size: ${bucketSize} < 0`)
+      throw new RangeError(`Invalid bucket size: ${bucketSize.toString()} < 0`)
     }
     this.bucketSize = bucketSize
     this.head = this.tail = new FixedPriorityQueue(
index af6a432b1c2550f9591ecc4714d17af0a012b98a..b36eba273510160016c6308e71aa11cc4b818af3 100644 (file)
@@ -205,6 +205,7 @@ export const once = <A extends any[], R, C extends ThisType<any>>(
 ): ((...args: A) => R) => {
   let result: R
   return (...args: A) => {
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (fn != null) {
       result = fn.apply<C, A, R>(context, args)
       ;(fn as unknown as undefined) = (context as unknown as undefined) =
index 9b9ded5e9d1cc1267846fb9e0279d88de405262f..7803ce2eb836b003159760ce408f97fb3acedd50 100644 (file)
@@ -355,9 +355,10 @@ export abstract class AbstractWorker<
     switch (taskFunctionOperation) {
       case 'add':
         response = this.addTaskFunction(taskFunctionProperties.name, {
-          // eslint-disable-next-line no-new-func
+          // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func
           taskFunction: new Function(
-            `return ${taskFunction}`
+            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+            `return ${taskFunction!}`
           )() as TaskFunction<Data, Response>,
           ...(taskFunctionProperties.priority != null && {
             priority: taskFunctionProperties.priority,
@@ -408,7 +409,7 @@ export abstract class AbstractWorker<
         })
     } else {
       try {
-        this.opts.killHandler?.()
+        ;(this.opts.killHandler as (() => void) | undefined)?.()
         this.sendToMainWorker({ kill: 'success' })
       } catch {
         this.sendToMainWorker({ kill: 'failure' })
@@ -426,7 +427,7 @@ export abstract class AbstractWorker<
       throw new Error('Message worker id is not set')
     } else if (message.workerId !== this.id) {
       throw new Error(
-        `Message worker id ${message.workerId} does not match the worker id ${this.id}`
+        `Message worker id ${message.workerId.toString()} does not match the worker id ${this.id.toString()}`
       )
     }
   }
@@ -514,7 +515,8 @@ export abstract class AbstractWorker<
         workerError: {
           // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
           name: name!,
-          message: `Task function '${name}' not found`,
+          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+          message: `Task function '${name!}' not found`,
           data,
         },
         taskId,
@@ -553,7 +555,7 @@ export abstract class AbstractWorker<
         workerError: {
           // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
           name: name!,
-          message: this.handleError(error as Error | string),
+          message: this.handleError(error),
           data,
         },
         taskId,
index f324a23524646b2553f2c75d6dc62c5a5be16a4c..59a0289b79e78e9a9020257b872aca0c95486999 100644 (file)
@@ -53,6 +53,7 @@ export const checkValidTaskFunctionObjectEntry = <
   }
   if (typeof fnObj.taskFunction !== 'function') {
     throw new TypeError(
+      // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
       `taskFunction object 'taskFunction' property '${fnObj.taskFunction}' is not a function`
     )
   }