refactor: add PoolEvents/PoolEvent types
[poolifier.git] / README.md
index 39da874467fe459653b2ecd6aba06d4fe504e303..49f24ef5e11c6e201568c99f7386716a2933b053 100644 (file)
--- a/README.md
+++ b/README.md
@@ -3,10 +3,6 @@
 </div>
 
 <h2 align="center">Node Thread Pool and Cluster Pool :arrow_double_up: :on:</h2>
-<h2 align="center">
-  <a href="https://ko-fi.com/Q5Q31D6QY">
-    <img alt="Ko-fi" src="https://ko-fi.com/img/githubbutton_sm.svg"></a>
-</h2>
 
 <p align="center">
   <a href="https://www.npmjs.com/package/poolifier">
   <a href="https://sonarcloud.io/dashboard?id=pioardi_poolifier">
     <img alt="Quality Gate Status" src="https://sonarcloud.io/api/project_badges/measure?project=pioardi_poolifier&metric=alert_status"></a>
   <a href="https://sonarcloud.io/component_measures/metric/coverage/list?id=pioardi_poolifier">
-    <img alt="Code coverage" src="https://sonarcloud.io/api/project_badges/measure?project=pioardi_poolifier&metric=coverage"></a>
+    <img alt="Code Coverage" src="https://sonarcloud.io/api/project_badges/measure?project=pioardi_poolifier&metric=coverage"></a>
   <a href="https://standardjs.com">
     <img alt="Javascript Standard Style Guide" src="https://img.shields.io/badge/code_style-standard-brightgreen.svg"></a>
   <a href="https://gitter.im/poolifier/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge">
     <img alt="Gitter chat" src="https://badges.gitter.im/poolifier/community.svg"></a>
+  <a href="https://opencollective.com/poolifier">
+    <img alt="Open Collective" src="https://opencollective.com/poolifier/tiers/badge.svg"></a>
   <a href="https://badgen.net/badge/Dependabot/enabled/green?icon=dependabot">
     <img alt="Dependabot" src="https://badgen.net/badge/Dependabot/enabled/green?icon=dependabot"></a>
   <a href="http://makeapullrequest.com">
@@ -39,16 +37,16 @@ Please consult our <a href="#general-guidance">general guidelines</a>
 - Performance :racehorse: [benchmarks](./benchmarks/README.md)
 - Security :bank: :cop: [![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=pioardi_poolifier&metric=security_rating)](https://sonarcloud.io/dashboard?id=pioardi_poolifier) [![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=pioardi_poolifier&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=pioardi_poolifier)
 - Easy to use :couple:
-- Easy switch from a pool to another, easy to tune :heavy_check_mark:
-- Dynamic pool size :heavy_check_mark:
-- No runtime dependencies :heavy_check_mark:
-- Proper async integration with node async hooks :heavy_check_mark:
-- Support for worker threads and cluster node modules :heavy_check_mark:
-- Support sync and async tasks :heavy_check_mark:
-- General guidance on pools to use :heavy_check_mark:
-- Widely tested :heavy_check_mark:
-- Error handling out of the box :heavy_check_mark:
-- Active community :heavy_check_mark:
+- Easy switch from a pool to another, easy to tune :white_check_mark:
+- Dynamic pool size :white_check_mark:
+- No runtime dependencies :white_check_mark:
+- Proper async integration with node async hooks :white_check_mark:
+- Support for worker threads and cluster node modules :white_check_mark:
+- Support sync and async tasks :white_check_mark:
+- General guidance on pools to use :white_check_mark:
+- Widely tested :white_check_mark:
+- Error handling out of the box :white_check_mark:
+- Active community :white_check_mark:
 - Code quality :octocat: [![Bugs](https://sonarcloud.io/api/project_badges/measure?project=pioardi_poolifier&metric=bugs)](https://sonarcloud.io/dashboard?id=pioardi_poolifier)
   [![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=pioardi_poolifier&metric=code_smells)](https://sonarcloud.io/dashboard?id=pioardi_poolifier)
   [![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=pioardi_poolifier&metric=duplicated_lines_density)](https://sonarcloud.io/dashboard?id=pioardi_poolifier)
@@ -99,7 +97,7 @@ You can implement a worker-threads worker in a simple way by extending the class
 'use strict'
 const { ThreadWorker } = require('poolifier')
 
-function yourFunction (data) {
+function yourFunction(data) {
   // this will be executed in the worker thread,
   // the data will be received by using the execute method
   return { ok: 1 }
@@ -115,19 +113,22 @@ Instantiate your pool based on your needed :
 
 ```js
 'use strict'
-const { FixedThreadPool, DynamicThreadPool } = require('poolifier')
+const { DynamicThreadPool, FixedThreadPool, PoolEvents } = require('poolifier')
 
 // a fixed worker-threads pool
 const pool = new FixedThreadPool(15,
   './yourWorker.js',
   { errorHandler: (e) => console.error(e), onlineHandler: () => console.log('worker is online') })
 
+pool.emitter.on(PoolEvents.busy, () => console.log('Pool is busy'))
+
 // or a dynamic worker-threads pool
 const pool = new DynamicThreadPool(10, 100,
   './yourWorker.js',
   { errorHandler: (e) => console.error(e), onlineHandler: () => console.log('worker is online') })
 
-pool.emitter.on('busy', () => console.log('Pool is busy'))
+pool.emitter.on(PoolEvents.full, () => console.log('Pool is full'))
+pool.emitter.on(PoolEvents.busy, () => console.log('Pool is busy'))
 
 // the execute method signature is the same for both implementations,
 // so you can easy switch from one to another
@@ -146,10 +147,12 @@ Remember that workers can only send and receive serializable data.
 
 ## Node versions
 
-You can use node versions >= 12.x for thread pool, and node versions >= 16.x for cluster pool.
+Node versions >= 16.x are supported.
 
 ## API
 
+### [Documentation](https://poolifier.github.io/poolifier/)
+
 ### `pool = new FixedThreadPool/FixedClusterPool(numberOfThreads/numberOfWorkers, filePath, opts)`
 
 `numberOfThreads/numberOfWorkers` (mandatory) Number of workers for this pool  
@@ -163,11 +166,12 @@ You can use node versions >= 12.x for thread pool, and node versions >= 16.x for
 - `workerChoiceStrategy` (optional) - The worker choice strategy to use in this pool:
 
   - `WorkerChoiceStrategies.ROUND_ROBIN`: Submit tasks to worker in a round robbin fashion
-  - `WorkerChoiceStrategies.LESS_RECENTLY_USED`: Submit tasks to the less recently used worker
-  - `WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN` Submit tasks to worker using a weighted round robin scheduling algorithm based on tasks execution time
+  - `WorkerChoiceStrategies.LESS_USED`: Submit tasks to the less used worker
+  - `WorkerChoiceStrategies.LESS_BUSY`: Submit tasks to the less busy worker
+  - `WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN`: Submit tasks to worker using a weighted round robin scheduling algorithm based on tasks execution time
   - `WorkerChoiceStrategies.FAIR_SHARE`: Submit tasks to worker using a fair share tasks scheduling algorithm based on tasks execution time
 
-  `WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN` and `WorkerChoiceStrategies.FAIR_SHARE` strategies are targeted to heavy and long tasks
+  `WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN` and `WorkerChoiceStrategies.FAIR_SHARE` strategies are targeted to heavy and long tasks  
   Default: `WorkerChoiceStrategies.ROUND_ROBIN`
 
 - `enableEvents` (optional) - Events emission enablement in this pool. Default: true
@@ -203,7 +207,7 @@ This method will call the terminate method on each worker.
 - `async` - true/false, true if your function contains async code pieces, else false
 - `killBehavior` - Dictates if your async unit (worker/process) will be deleted in case that a task is active on it.  
   **KillBehaviors.SOFT**: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still running, then the worker **won't** be deleted.  
-  **KillBehaviors.HARD**: If `lastActiveTime` is greater than `maxInactiveTime` but a task is still running, then the worker will be deleted.  
+  **KillBehaviors.HARD**: If `currentTime - lastActiveTime` is greater than `maxInactiveTime` but a task is still running, then the worker will be deleted.  
   This option only apply to the newly created workers.  
   Default: `KillBehaviors.SOFT`
 
@@ -248,7 +252,7 @@ But in general, **always profile your application**
 ## Contribute
 
 See guidelines [CONTRIBUTING](CONTRIBUTING.md)  
-Choose your task here [2.3.0](https://github.com/orgs/poolifier/projects/1), propose an idea, a fix, an improvement.
+Choose your task here [2.4.x](https://github.com/orgs/poolifier/projects/1), propose an idea, a fix, an improvement.
 
 ## Team