From 87b217c5d1b3dd83ced97831a59fac8112a44c3e Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Tue, 3 Oct 2023 10:15:03 +0200 Subject: [PATCH] feat: switch to `EventEmitterAsyncRessource` type for `@types/node` MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- @types/events.d.ts | 53 --------- CHANGELOG.md | 4 + package.json | 6 +- pnpm-lock.yaml | 160 +++++++++++++------------- src/pools/abstract-pool.ts | 8 +- src/pools/pool.ts | 4 +- tests/worker/abstract-worker.test.mjs | 61 ---------- tests/worker/cluster-worker.test.mjs | 62 ++++++++++ tests/worker/thread-worker.test.mjs | 64 +++++++++++ tsconfig.json | 1 - 10 files changed, 218 insertions(+), 205 deletions(-) delete mode 100644 @types/events.d.ts diff --git a/@types/events.d.ts b/@types/events.d.ts deleted file mode 100644 index b5338939..00000000 --- a/@types/events.d.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { AsyncResource, AsyncResourceOptions } from 'node:async_hooks' -import { EventEmitter } from 'node:events' - -declare module 'events' { - interface EventEmitterOptions { - /** - * Enables automatic capturing of promise rejection. - */ - captureRejections?: boolean | undefined - } - - interface EventEmitterAsyncResourceOptions - extends AsyncResourceOptions, - EventEmitterOptions { - /** - * The type of async event. - * @default new.target.name if instantiated as a child class. - */ - name?: string - } - - /** - * Integrates `EventEmitter` with `AsyncResource` for `EventEmitter`s that require - * manual async tracking. Specifically, all events emitted by instances of - * `EventEmitterAsyncResource` will run within its async context. - * - * The EventEmitterAsyncResource class has the same methods and takes the - * same options as EventEmitter and AsyncResource themselves. - * @throws if `options.name` is not provided when instantiated directly. - * @since v17.4.0, v16.14.0 - */ - export class EventEmitterAsyncResource extends EventEmitter { - /** - * @param options Only optional in child class. - */ - constructor (options?: EventEmitterAsyncResourceOptions) - /** - * Call all `destroy` hooks. This should only ever be called once. An error will - * be thrown if it is called more than once. This **must** be manually called. If - * the resource is left to be collected by the GC then the `destroy` hooks will - * never be called. - */ - emitDestroy (): void - /** The unique asyncId assigned to the resource. */ - readonly asyncId: number - /** The same triggerAsyncId that is passed to the AsyncResource constructor. */ - readonly triggerAsyncId: number - /** The underlying AsyncResource */ - readonly asyncResource: AsyncResource & { - readonly eventEmitter: EventEmitterAsyncResource - } - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md index 19b7b283..f1597268 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Use `EventEmitterAsyncResource` type from `@types/node` for pool event emitter. TypeScript users will need to update to latest `@types/node` version. + ## [2.7.4] - 2023-09-25 ### Fixed diff --git a/package.json b/package.json index dafcf0aa..d59c9599 100644 --- a/package.json +++ b/package.json @@ -108,9 +108,9 @@ "@release-it/keep-a-changelog": "^4.0.0", "@rollup/plugin-terser": "^0.4.3", "@rollup/plugin-typescript": "^11.1.4", - "@types/node": "^20.7.2", - "@typescript-eslint/eslint-plugin": "^6.7.3", - "@typescript-eslint/parser": "^6.7.3", + "@types/node": "^20.8.2", + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", "benchmark": "^2.1.4", "c8": "^8.0.1", "eslint": "^8.50.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6aecc6c..5c7a521e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,14 +30,14 @@ devDependencies: specifier: ^11.1.4 version: 11.1.4(rollup@3.29.4)(typescript@5.2.2) '@types/node': - specifier: ^20.7.2 - version: 20.7.2 + specifier: ^20.8.2 + version: 20.8.2 '@typescript-eslint/eslint-plugin': - specifier: ^6.7.3 - version: 6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) + specifier: ^6.7.4 + version: 6.7.4(@typescript-eslint/parser@6.7.4)(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^6.7.3 - version: 6.7.3(eslint@8.50.0)(typescript@5.2.2) + specifier: ^6.7.4 + version: 6.7.4(eslint@8.50.0)(typescript@5.2.2) benchmark: specifier: ^2.1.4 version: 2.1.4 @@ -52,16 +52,16 @@ devDependencies: version: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.1.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0) eslint-config-standard-with-typescript: specifier: ^39.1.0 - version: 39.1.0(@typescript-eslint/eslint-plugin@6.7.3)(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.1.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0)(typescript@5.2.2) + version: 39.1.0(@typescript-eslint/eslint-plugin@6.7.4)(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.1.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0)(typescript@5.2.2) eslint-define-config: specifier: ^1.23.0 version: 1.23.0 eslint-import-resolver-typescript: specifier: ^3.6.1 - version: 3.6.1(@typescript-eslint/parser@6.7.3)(eslint-plugin-import@2.28.1)(eslint@8.50.0) + version: 3.6.1(@typescript-eslint/parser@6.7.4)(eslint-plugin-import@2.28.1)(eslint@8.50.0) eslint-plugin-import: specifier: ^2.28.1 - version: 2.28.1(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) + version: 2.28.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) eslint-plugin-jsdoc: specifier: ^46.8.2 version: 46.8.2(eslint@8.50.0) @@ -329,7 +329,7 @@ packages: lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1(@types/node@20.7.2)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@20.8.2)(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - '@swc/core' @@ -429,8 +429,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.9.0: - resolution: {integrity: sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==} + /@eslint-community/regexpp@4.9.1: + resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -506,7 +506,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.2 - '@types/node': 20.7.2 + '@types/node': 20.8.2 '@types/yargs': 17.0.26 chalk: 4.1.2 dev: true @@ -889,7 +889,7 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.7.2 + '@types/node': 20.8.2 dev: true /@types/http-cache-semantics@4.0.2: @@ -932,8 +932,8 @@ packages: resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} dev: true - /@types/node@20.7.2: - resolution: {integrity: sha512-RcdC3hOBOauLP+r/kRt27NrByYtDjsXyAuSbR87O6xpsvi763WI+5fbSIvYJrXnt9w4RuxhV6eAXfIs7aaf/FQ==} + /@types/node@20.8.2: + resolution: {integrity: sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==} dev: true /@types/normalize-package-data@2.4.2: @@ -969,7 +969,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.0 + '@eslint-community/regexpp': 4.9.1 '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@5.2.2) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.50.0)(typescript@5.2.2) @@ -986,8 +986,8 @@ packages: - supports-color dev: true - /@typescript-eslint/eslint-plugin@6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==} + /@typescript-eslint/eslint-plugin@6.7.4(@typescript-eslint/parser@6.7.4)(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -997,12 +997,12 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.0 - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.7.3 - '@typescript-eslint/type-utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.3 + '@eslint-community/regexpp': 4.9.1 + '@typescript-eslint/parser': 6.7.4(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.7.4 + '@typescript-eslint/type-utils': 6.7.4(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.4(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.4 debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 graphemer: 1.4.0 @@ -1035,8 +1035,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.7.3(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==} + /@typescript-eslint/parser@6.7.4(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1045,10 +1045,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.7.3 - '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.7.3 + '@typescript-eslint/scope-manager': 6.7.4 + '@typescript-eslint/types': 6.7.4 + '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.7.4 debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 typescript: 5.2.2 @@ -1064,12 +1064,12 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/scope-manager@6.7.3: - resolution: {integrity: sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==} + /@typescript-eslint/scope-manager@6.7.4: + resolution: {integrity: sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/visitor-keys': 6.7.3 + '@typescript-eslint/types': 6.7.4 + '@typescript-eslint/visitor-keys': 6.7.4 dev: true /@typescript-eslint/type-utils@5.62.0(eslint@8.50.0)(typescript@5.2.2): @@ -1092,8 +1092,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils@6.7.3(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==} + /@typescript-eslint/type-utils@6.7.4(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1102,8 +1102,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) - '@typescript-eslint/utils': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.2.2) + '@typescript-eslint/utils': 6.7.4(eslint@8.50.0)(typescript@5.2.2) debug: 4.3.4(supports-color@8.1.1) eslint: 8.50.0 ts-api-utils: 1.0.3(typescript@5.2.2) @@ -1117,8 +1117,8 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@6.7.3: - resolution: {integrity: sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==} + /@typescript-eslint/types@6.7.4: + resolution: {integrity: sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==} engines: {node: ^16.0.0 || >=18.0.0} dev: true @@ -1143,8 +1143,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.7.3(typescript@5.2.2): - resolution: {integrity: sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==} + /@typescript-eslint/typescript-estree@6.7.4(typescript@5.2.2): + resolution: {integrity: sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -1152,8 +1152,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/visitor-keys': 6.7.3 + '@typescript-eslint/types': 6.7.4 + '@typescript-eslint/visitor-keys': 6.7.4 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 @@ -1184,8 +1184,8 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.7.3(eslint@8.50.0)(typescript@5.2.2): - resolution: {integrity: sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==} + /@typescript-eslint/utils@6.7.4(eslint@8.50.0)(typescript@5.2.2): + resolution: {integrity: sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -1193,9 +1193,9 @@ packages: '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) '@types/json-schema': 7.0.13 '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 6.7.3 - '@typescript-eslint/types': 6.7.3 - '@typescript-eslint/typescript-estree': 6.7.3(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.7.4 + '@typescript-eslint/types': 6.7.4 + '@typescript-eslint/typescript-estree': 6.7.4(typescript@5.2.2) eslint: 8.50.0 semver: 7.5.4 transitivePeerDependencies: @@ -1211,11 +1211,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@6.7.3: - resolution: {integrity: sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==} + /@typescript-eslint/visitor-keys@6.7.4: + resolution: {integrity: sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.7.3 + '@typescript-eslint/types': 6.7.4 eslint-visitor-keys: 3.4.3 dev: true @@ -1912,7 +1912,7 @@ packages: dependencies: '@types/node': 20.5.1 cosmiconfig: 8.3.6(typescript@5.2.2) - ts-node: 10.9.1(@types/node@20.7.2)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@20.8.2)(typescript@5.2.2) typescript: 5.2.2 dev: true @@ -1962,8 +1962,8 @@ packages: engines: {node: '>= 12'} dev: true - /data-uri-to-buffer@5.0.1: - resolution: {integrity: sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==} + /data-uri-to-buffer@6.0.1: + resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} engines: {node: '>= 14'} dev: true @@ -2388,7 +2388,7 @@ packages: - supports-color dev: true - /eslint-config-standard-with-typescript@39.1.0(@typescript-eslint/eslint-plugin@6.7.3)(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.1.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0)(typescript@5.2.2): + /eslint-config-standard-with-typescript@39.1.0(@typescript-eslint/eslint-plugin@6.7.4)(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.1.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0)(typescript@5.2.2): resolution: {integrity: sha512-5+SPKis3yr6T1X6wSA7HhDuumTRMrTDMcsTrIWhdZuI+sX3e8SPGZYzuJxVxdc239Yo718dEVEVyJhHI6jUjrQ==} peerDependencies: '@typescript-eslint/eslint-plugin': ^6.4.0 @@ -2398,11 +2398,11 @@ packages: eslint-plugin-promise: ^6.0.0 typescript: '*' dependencies: - '@typescript-eslint/eslint-plugin': 6.7.3(@typescript-eslint/parser@6.7.3)(eslint@8.50.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.7.4(@typescript-eslint/parser@6.7.4)(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.4(eslint@8.50.0)(typescript@5.2.2) eslint: 8.50.0 eslint-config-standard: 17.1.0(eslint-plugin-import@2.28.1)(eslint-plugin-n@16.1.0)(eslint-plugin-promise@6.1.1)(eslint@8.50.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) eslint-plugin-n: 16.1.0(eslint@8.50.0) eslint-plugin-promise: 6.1.1(eslint@8.50.0) typescript: 5.2.2 @@ -2434,7 +2434,7 @@ packages: eslint-plugin-promise: ^6.0.0 dependencies: eslint: 8.50.0 - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) eslint-plugin-n: 16.1.0(eslint@8.50.0) eslint-plugin-promise: 6.1.1(eslint@8.50.0) dev: true @@ -2454,7 +2454,7 @@ packages: - supports-color dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.7.3)(eslint-plugin-import@2.28.1)(eslint@8.50.0): + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.7.4)(eslint-plugin-import@2.28.1)(eslint@8.50.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -2464,8 +2464,8 @@ packages: debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.15.0 eslint: 8.50.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) fast-glob: 3.3.1 get-tsconfig: 4.7.2 is-core-module: 2.13.0 @@ -2502,12 +2502,12 @@ packages: debug: 3.2.7 eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.3)(eslint-plugin-import@2.28.1)(eslint@8.50.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.4)(eslint-plugin-import@2.28.1)(eslint@8.50.0) transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2528,11 +2528,11 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.4(eslint@8.50.0)(typescript@5.2.2) debug: 3.2.7 eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.3)(eslint-plugin-import@2.28.1)(eslint@8.50.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.7.4)(eslint-plugin-import@2.28.1)(eslint@8.50.0) transitivePeerDependencies: - supports-color dev: true @@ -2544,7 +2544,7 @@ packages: eslint: '>=8' dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) - '@eslint-community/regexpp': 4.9.0 + '@eslint-community/regexpp': 4.9.1 eslint: 8.50.0 dev: true @@ -2594,7 +2594,7 @@ packages: - supports-color dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0): + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0): resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} engines: {node: '>=4'} peerDependencies: @@ -2604,7 +2604,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.7.3(eslint@8.50.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.7.4(eslint@8.50.0)(typescript@5.2.2) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 @@ -2613,7 +2613,7 @@ packages: doctrine: 2.1.0 eslint: 8.50.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.3)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.7.4)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.50.0) has: 1.0.3 is-core-module: 2.13.0 is-glob: 4.0.3 @@ -2790,7 +2790,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) - '@eslint-community/regexpp': 4.9.0 + '@eslint-community/regexpp': 4.9.1 '@eslint/eslintrc': 2.1.2 '@eslint/js': 8.50.0 '@humanwhocodes/config-array': 0.11.11 @@ -3165,12 +3165,12 @@ packages: resolve-pkg-maps: 1.0.0 dev: true - /get-uri@6.0.1: - resolution: {integrity: sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==} + /get-uri@6.0.2: + resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} engines: {node: '>= 14'} dependencies: basic-ftp: 5.0.3 - data-uri-to-buffer: 5.0.1 + data-uri-to-buffer: 6.0.1 debug: 4.3.4(supports-color@8.1.1) fs-extra: 8.1.0 transitivePeerDependencies: @@ -4015,7 +4015,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.7.2 + '@types/node': 20.8.2 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -4935,7 +4935,7 @@ packages: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.0 debug: 4.3.4(supports-color@8.1.1) - get-uri: 6.0.1 + get-uri: 6.0.2 http-proxy-agent: 7.0.0 https-proxy-agent: 7.0.2 pac-resolver: 7.0.0 @@ -5971,7 +5971,7 @@ packages: typescript: 5.2.2 dev: true - /ts-node@10.9.1(@types/node@20.7.2)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@20.8.2)(typescript@5.2.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -5990,7 +5990,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.7.2 + '@types/node': 20.8.2 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 diff --git a/src/pools/abstract-pool.ts b/src/pools/abstract-pool.ts index c56beaa6..f1d8b058 100644 --- a/src/pools/abstract-pool.ts +++ b/src/pools/abstract-pool.ts @@ -1,7 +1,7 @@ import { randomUUID } from 'node:crypto' import { performance } from 'node:perf_hooks' import type { TransferListItem } from 'node:worker_threads' -import { type EventEmitter, EventEmitterAsyncResource } from 'node:events' +import { EventEmitterAsyncResource } from 'node:events' import type { MessageValue, PromiseResponseWrapper, @@ -70,7 +70,7 @@ export abstract class AbstractPool< public readonly workerNodes: Array> = [] /** @inheritDoc */ - public emitter?: EventEmitter | EventEmitterAsyncResource + public emitter?: EventEmitterAsyncResource /** * The task execution response promise map: @@ -944,9 +944,7 @@ export abstract class AbstractPool< }) ) this.emitter?.emit(PoolEvents.destroy, this.info) - if (this.emitter instanceof EventEmitterAsyncResource) { - this.emitter?.emitDestroy() - } + this.emitter?.emitDestroy() this.started = false } diff --git a/src/pools/pool.ts b/src/pools/pool.ts index 06989941..af80bcfb 100644 --- a/src/pools/pool.ts +++ b/src/pools/pool.ts @@ -1,5 +1,5 @@ import type { TransferListItem } from 'node:worker_threads' -import type { EventEmitter, EventEmitterAsyncResource } from 'node:events' +import type { EventEmitterAsyncResource } from 'node:events' import type { TaskFunction } from '../worker/task-functions' import type { ErrorHandler, @@ -235,7 +235,7 @@ export interface IPool< * - `'taskError'`: Emitted when an error occurs while executing a task. * - `'backPressure'`: Emitted when all worker nodes have back pressure (i.e. their tasks queue is full: queue size \>= maximum queue size). */ - readonly emitter?: EventEmitter | EventEmitterAsyncResource + readonly emitter?: EventEmitterAsyncResource /** * Executes the specified function in the worker constructor with the task data input parameter. * diff --git a/tests/worker/abstract-worker.test.mjs b/tests/worker/abstract-worker.test.mjs index 11bf6927..e15f60a5 100644 --- a/tests/worker/abstract-worker.test.mjs +++ b/tests/worker/abstract-worker.test.mjs @@ -176,20 +176,6 @@ describe('Abstract worker test suite', () => { ) }) - it('Verify that sync kill handler is called when worker is killed', () => { - const worker = new ClusterWorker(() => {}, { - killHandler: stub().returns() - }) - worker.isMain = false - worker.getMainWorker = stub().returns({ - id: 1, - send: stub().returns() - }) - worker.handleKillMessage() - expect(worker.getMainWorker().send.calledOnce).toBe(true) - expect(worker.opts.killHandler.calledOnce).toBe(true) - }) - it('Verify that async kill handler is called when worker is killed', () => { const killHandlerStub = stub().returns() const worker = new ClusterWorker(() => {}, { @@ -283,53 +269,6 @@ describe('Abstract worker test suite', () => { ) }) - it('Verify that removeTaskFunction() is working', () => { - const fn1 = () => { - return 1 - } - const fn2 = () => { - return 2 - } - const worker = new ClusterWorker({ fn1, fn2 }) - expect(worker.removeTaskFunction(0, fn1)).toStrictEqual({ - status: false, - error: new TypeError('name parameter is not a string') - }) - expect(worker.removeTaskFunction('', fn1)).toStrictEqual({ - status: false, - error: new TypeError('name parameter is an empty string') - }) - worker.getMainWorker = stub().returns({ - id: 1, - send: stub().returns() - }) - expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toBeInstanceOf(Function) - expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function) - expect(worker.taskFunctions.get('fn2')).toBeInstanceOf(Function) - expect(worker.taskFunctions.size).toBe(3) - expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toStrictEqual( - worker.taskFunctions.get('fn1') - ) - expect(worker.removeTaskFunction(DEFAULT_TASK_NAME)).toStrictEqual({ - status: false, - error: new Error( - 'Cannot remove the task function with the default reserved name' - ) - }) - expect(worker.removeTaskFunction('fn1')).toStrictEqual({ - status: false, - error: new Error( - 'Cannot remove the task function used as the default task function' - ) - }) - worker.removeTaskFunction('fn2') - expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toBeInstanceOf(Function) - expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function) - expect(worker.taskFunctions.get('fn2')).toBeUndefined() - expect(worker.taskFunctions.size).toBe(2) - expect(worker.getMainWorker().send.calledOnce).toBe(true) - }) - it('Verify that listTaskFunctionNames() is working', () => { const fn1 = () => { return 1 diff --git a/tests/worker/cluster-worker.test.mjs b/tests/worker/cluster-worker.test.mjs index 9349743c..8ceb403d 100644 --- a/tests/worker/cluster-worker.test.mjs +++ b/tests/worker/cluster-worker.test.mjs @@ -1,6 +1,7 @@ import { expect } from 'expect' import { restore, stub } from 'sinon' import { ClusterWorker } from '../../lib/index.js' +import { DEFAULT_TASK_NAME } from '../../lib/utils.js' describe('Cluster worker test suite', () => { const sendStub = stub().returns() @@ -14,6 +15,67 @@ describe('Cluster worker test suite', () => { restore() }) + it('Verify that sync kill handler is called when worker is killed', () => { + const worker = new ClusterWorker(() => {}, { + killHandler: stub().returns() + }) + worker.isMain = false + worker.getMainWorker = stub().returns({ + id: 1, + send: stub().returns() + }) + worker.handleKillMessage() + expect(worker.getMainWorker().send.calledOnce).toBe(true) + expect(worker.opts.killHandler.calledOnce).toBe(true) + }) + + it('Verify that removeTaskFunction() is working', () => { + const fn1 = () => { + return 1 + } + const fn2 = () => { + return 2 + } + const worker = new ClusterWorker({ fn1, fn2 }) + expect(worker.removeTaskFunction(0, fn1)).toStrictEqual({ + status: false, + error: new TypeError('name parameter is not a string') + }) + expect(worker.removeTaskFunction('', fn1)).toStrictEqual({ + status: false, + error: new TypeError('name parameter is an empty string') + }) + worker.getMainWorker = stub().returns({ + id: 1, + send: stub().returns() + }) + expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toBeInstanceOf(Function) + expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function) + expect(worker.taskFunctions.get('fn2')).toBeInstanceOf(Function) + expect(worker.taskFunctions.size).toBe(3) + expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toStrictEqual( + worker.taskFunctions.get('fn1') + ) + expect(worker.removeTaskFunction(DEFAULT_TASK_NAME)).toStrictEqual({ + status: false, + error: new Error( + 'Cannot remove the task function with the default reserved name' + ) + }) + expect(worker.removeTaskFunction('fn1')).toStrictEqual({ + status: false, + error: new Error( + 'Cannot remove the task function used as the default task function' + ) + }) + worker.removeTaskFunction('fn2') + expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toBeInstanceOf(Function) + expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function) + expect(worker.taskFunctions.get('fn2')).toBeUndefined() + expect(worker.taskFunctions.size).toBe(2) + expect(worker.getMainWorker().send.calledOnce).toBe(true) + }) + it('Verify that handleError() method is working properly', () => { const error = new Error('Error as an error') const worker = new ClusterWorker(() => {}) diff --git a/tests/worker/thread-worker.test.mjs b/tests/worker/thread-worker.test.mjs index 6121995b..26da45e1 100644 --- a/tests/worker/thread-worker.test.mjs +++ b/tests/worker/thread-worker.test.mjs @@ -1,6 +1,7 @@ import { expect } from 'expect' import { restore, stub } from 'sinon' import { ThreadWorker } from '../../lib/index.js' +import { DEFAULT_TASK_NAME } from '../../lib/utils.js' describe('Thread worker test suite', () => { class SpyWorker extends ThreadWorker { @@ -14,6 +15,69 @@ describe('Thread worker test suite', () => { restore() }) + it('Verify that sync kill handler is called when worker is killed', () => { + const worker = new ThreadWorker(() => {}, { + killHandler: stub().returns() + }) + worker.isMain = false + worker.port = { + postMessage: stub().returns(), + unref: stub().returns(), + close: stub().returns() + } + worker.handleKillMessage() + expect(worker.port.postMessage.calledOnce).toBe(true) + expect(worker.port.unref.calledOnce).toBe(true) + expect(worker.port.close.calledOnce).toBe(true) + expect(worker.opts.killHandler.calledOnce).toBe(true) + }) + + it('Verify that removeTaskFunction() is working', () => { + const fn1 = () => { + return 1 + } + const fn2 = () => { + return 2 + } + const worker = new ThreadWorker({ fn1, fn2 }) + expect(worker.removeTaskFunction(0, fn1)).toStrictEqual({ + status: false, + error: new TypeError('name parameter is not a string') + }) + expect(worker.removeTaskFunction('', fn1)).toStrictEqual({ + status: false, + error: new TypeError('name parameter is an empty string') + }) + worker.port = { + postMessage: stub().returns() + } + expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toBeInstanceOf(Function) + expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function) + expect(worker.taskFunctions.get('fn2')).toBeInstanceOf(Function) + expect(worker.taskFunctions.size).toBe(3) + expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toStrictEqual( + worker.taskFunctions.get('fn1') + ) + expect(worker.removeTaskFunction(DEFAULT_TASK_NAME)).toStrictEqual({ + status: false, + error: new Error( + 'Cannot remove the task function with the default reserved name' + ) + }) + expect(worker.removeTaskFunction('fn1')).toStrictEqual({ + status: false, + error: new Error( + 'Cannot remove the task function used as the default task function' + ) + }) + worker.removeTaskFunction('fn2') + expect(worker.taskFunctions.get(DEFAULT_TASK_NAME)).toBeInstanceOf(Function) + expect(worker.taskFunctions.get('fn1')).toBeInstanceOf(Function) + expect(worker.taskFunctions.get('fn2')).toBeUndefined() + expect(worker.taskFunctions.size).toBe(2) + expect(worker.port.postMessage.calledOnce).toBe(true) + }) + it('Verify that handleError() method is working properly', () => { const error = new Error('Error as an error') const worker = new ThreadWorker(() => {}) diff --git a/tsconfig.json b/tsconfig.json index 1bd56853..79ab1b82 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,6 @@ "target": "ES2022", "module": "ES2022", "moduleResolution": "Node", - "typeRoots": ["./node_modules/@types", "./@types"], "declaration": true, "declarationDir": "./lib/dts", "strict": true, -- 2.34.1