chore: v4.0.6
[poolifier.git] / CHANGELOG.md
1 # Changelog
2
3 All notable changes to this project will be documented in this file.
4
5 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
8 ## [Unreleased]
9
10 ## [4.0.6] - 2024-05-10
11
12 ### Fixed
13
14 - Fix pools' `addTaskFunction()` type definition.
15
16 ## [4.0.5] - 2024-05-09
17
18 ### Fixed
19
20 - Avoid queued tasks redistribution on the errored worker node.
21
22 ## [4.0.4] - 2024-05-08
23
24 ### Fixed
25
26 - Disable `tasksStealingOnBackPressure` by default until performance issues under heavy load are sorted out.
27
28 ## [4.0.3] - 2024-05-08
29
30 ### Changed
31
32 - Optimize task(s) stealing by dequeuing task(s) from the last prioritized bucket.
33
34 ## [4.0.2] - 2024-05-06
35
36 ### Fixed
37
38 - Ensure poolifier worker task performance measurement requirements are synchronized with task function objects' worker choice strategies.
39
40 ## [4.0.1] - 2024-05-02
41
42 ### Fixed
43
44 - Ensure dynamic worker node are initialized with sensible worker node usage default values to avoid worker choice strategies biased decisions.
45 - Account for tasks wait time in task execution time computation in worker choice strategies to avoid biased decisions under load with several prioritized task functions and tasks queue enabled.
46
47 ## [4.0.0] - 2024-04-30
48
49 ### Changed
50
51 - Support per task function(s) priority and worker choice strategy definition via a task function object: `{ taskFunction: (data?: Data) => Response | Promise<Response>, priority?: number, strategy?: WorkerChoiceStrategy }`.
52 - Add priority queue based tasks queueing. One priority queue is divided into prioritized buckets to avoid queued tasks starvation under load.
53 - BREAKING CHANGE: `listTaskFunctionNames()` to `listTaskFunctionsProperties()` in pool and worker API returning registered task functions properties.
54 - BREAKING CHANGE: `strategy` field in pool information renamed to `defaultStrategy`.
55
56 ### Fixed
57
58 - Ensure worker choice strategy options changes at runtime are propagated to poolifier workers.
59
60 ## [3.1.30] - 2024-04-22
61
62 ### Fixed
63
64 - Fix `transferList` argument type definition.
65
66 ## [3.1.29] - 2024-04-02
67
68 ### Fixed
69
70 - Fix possible race condition at worker node recreation on worker `error` and `exit` events.
71
72 ## [3.1.28] - 2024-04-01
73
74 ### Fixed
75
76 - Ensure the minimum number of workers on a started pool is guaranteed.
77
78 ## [3.1.27] - 2024-03-27
79
80 ### Fixed
81
82 - Fix publishing on JSR, take 4.
83
84 ## [3.1.26] - 2024-03-27
85
86 ### Fixed
87
88 - Fix publishing on JSR, take 3.
89
90 ## [3.1.25] - 2024-03-27
91
92 ### Fixed
93
94 - Fix publishing on JSR, take 2.
95
96 ## [3.1.24] - 2024-03-27
97
98 ### Fixed
99
100 - Fix publishing on JSR.
101
102 ## [3.1.23] - 2024-03-27
103
104 ### Changed
105
106 - Publish on JSR.
107
108 ## [3.1.22] - 2024-03-15
109
110 ### Fixed
111
112 - Fix pool event emitter registered callbacks removal at `destroy()`.
113
114 ## [3.1.21] - 2024-02-22
115
116 ### Fixed
117
118 - Fix null exception regression: [#1496](https://github.com/poolifier/poolifier/issues/1496).
119
120 ## [3.1.20] - 2024-02-11
121
122 ### Fixed
123
124 - Ensure `worker_threads` workers are unreferenced at termination.
125
126 ## [3.1.19] - 2024-01-16
127
128 ### Fixed
129
130 - Fix possible null exception at task finishing handling.
131
132 ### Changed
133
134 - Optimize Deque implementation to improve tasks queueing performance.
135
136 ## [3.1.18] - 2024-01-06
137
138 ### Fixed
139
140 - Fix dynamic pool with minimum number of workers set to zero: [#1748](https://github.com/poolifier/poolifier/issues/1748).
141
142 ## [3.1.17] - 2024-01-05
143
144 ### Changed
145
146 - Improve performance by clean up unneeded condition checks on hot code paths.
147
148 ## [3.1.16] - 2024-01-03
149
150 ### Fixed
151
152 - Add missing type to TS type definitions.
153
154 ## [3.1.15] - 2024-01-02
155
156 ### Fixed
157
158 - Fix CommonJS support with TypeScript: [#1821](https://github.com/poolifier/poolifier/issues/1821).
159
160 ## [3.1.15-0] - 2024-01-02
161
162 ### Fixed
163
164 - Fix CommonJS support with TypeScript: [#1821](https://github.com/poolifier/poolifier/issues/1821).
165
166 ## [3.1.14] - 2024-01-01
167
168 ### Fixed
169
170 - Properly handle dynamic pool with zero minimum size.
171
172 ## [3.1.13] - 2023-12-30
173
174 ### Changed
175
176 - Reduce branching in several hot code paths.
177 - Use faster object cloning implementation.
178
179 ## [3.1.12] - 2023-12-27
180
181 ### Fixed
182
183 - Fix tasks redistribution triggers at pool destroying.
184
185 ### Changed
186
187 - Switch TypeScript module resolution to Node16.
188
189 ## [3.1.12-0] - 2023-12-27
190
191 ### Fixed
192
193 - Fix tasks redistribution triggers at pool destroying.
194
195 ## [3.1.11] - 2023-12-24
196
197 ### Fixed
198
199 - Avoid worker node cross tasks stealing.
200 - Ensure only half the pool worker nodes can steal tasks.
201
202 ## [3.1.10] - 2023-12-23
203
204 ### Changed
205
206 - Avoid useless branching on pool type.
207
208 ## [3.1.9] - 2023-12-22
209
210 ### Changed
211
212 - Readd ThreadPoolOptions and ClusterPoolOptions TS type aliases to PoolOptions.
213
214 ## [3.1.8] - 2023-12-21
215
216 ### Fixed
217
218 - Fix default worker weight computation.
219 - Fix possible null exception at pool destroying.
220
221 ## [3.1.7] - 2023-12-20
222
223 ### Fixed
224
225 - Ensure worker choice strategies implementation wait for worker node readiness: [#1748](https://github.com/poolifier/poolifier/issues/1748).
226
227 ## [3.1.6] - 2023-12-18
228
229 ### Fixed
230
231 - Fix pool destroying with tasks queuing enabled.
232
233 ## [3.1.5] - 2023-12-18
234
235 ### Added
236
237 - Add queued tasks end timeout support to worker node termination.
238
239 ## [3.1.4] - 2023-12-18
240
241 ### Fixed
242
243 - Make more robust the fix for possible null exception at handling task execution response.
244
245 ## [3.1.3] - 2023-12-17
246
247 ### Fixed
248
249 - Fix possible null exception at handling task execution response.
250
251 ## [3.1.2] - 2023-12-17
252
253 ### Fixed
254
255 - Wait for queued tasks to end at worker node termination.
256
257 ## [3.1.1] - 2023-12-16
258
259 ### Fixed
260
261 - Fix pool options TS type definition.
262
263 ## [3.1.0] - 2023-12-16
264
265 ### Changed
266
267 - TypeScript breaking change: merge ThreadPoolOptions and ClusterPoolOptions types into PoolOptions type.
268
269 ## [3.0.14] - 2023-12-13
270
271 ### Fixed
272
273 - Fix possible null exception with worker_threads pools.
274
275 ## [3.0.13] - 2023-12-12
276
277 ### Fixed
278
279 - Ensure worker choice strategy wait for worker nodes readiness.
280
281 ### Changed
282
283 - Remove infinite retries support in worker choice strategy to avoid configuration leading to possible infinite recursion or loop.
284
285 ## [3.0.12] - 2023-12-12
286
287 ### Changed
288
289 - Add infinite retries support in worker choice strategy.
290
291 ## [3.0.11] - 2023-12-11
292
293 ### Fixed
294
295 - Ensure pool asynchronous resource properly track tasks execution.
296
297 ## [3.0.10] - 2023-12-08
298
299 ### Changed
300
301 - Add a fastpath when tasks stealing or redistribution is impossible.
302
303 ## [3.0.9] - 2023-11-26
304
305 ### Fixed
306
307 - Remove all pool events listener at pool destroying.
308 - Remove all worker node events listener at worker node destroying.
309 - Fix worker node event emitter listeners handling memory leak at pool options runtime change.
310
311 ## [3.0.8] - 2023-11-25
312
313 ### Fixed
314
315 - Ensure continuous tasks stealing on idle start at worker node idling.
316
317 ## [3.0.7] - 2023-11-24
318
319 ### Changed
320
321 - Make continuous tasks stealing start at worker node idling.
322
323 ## [3.0.6] - 2023-11-24
324
325 ### Fixed
326
327 - Ensure pool statuses are checked at initialization, `start()` or `destroy()`.
328 - Ensure pool `ready` event can be emitted after several `start()/destroy()` cycles.
329
330 ## [3.0.5] - 2023-10-27
331
332 ### Fixed
333
334 - Ensure pool `ready` event can be emitted only once.
335
336 ## [3.0.4] - 2023-10-20
337
338 ### Changed
339
340 - Switch to Bencher for benchmarking: [https://bencher.dev/perf/poolifier](https://bencher.dev/perf/poolifier).
341 - Use builtin retry mechanism in worker choice strategies instead of custom one.
342
343 ## [3.0.3] - 2023-10-19
344
345 ### Fixed
346
347 - Avoid null exception at sending message to worker.
348 - Avoid null exception at checking worker node readiness.
349
350 ## [3.0.2] - 2023-10-17
351
352 ### Fixed
353
354 - Fix race condition at dynamic worker node task assignment and scheduled removal. See issue [#1468](https://github.com/poolifier/poolifier/issues/1468) and [#1496](https://github.com/poolifier/poolifier/issues/1496).
355
356 ## [3.0.1] - 2023-10-16
357
358 ### Fixed
359
360 - Workaround possible race condition at work nodes array element removal and querying. See issue [#1468](https://github.com/poolifier/poolifier/issues/1468).
361
362 ### Changed
363
364 - Switch the worker node eventing code to `EventTarget` API.
365
366 ## [3.0.0] - 2023-10-08
367
368 ### Changed
369
370 - Remove Node.js 16.x.x (EOL) support.
371
372 ## [2.7.5] - 2023-10-03
373
374 ### Changed
375
376 - Use `EventEmitterAsyncResource` type from `@types/node` for pool event emitter. TypeScript users will need to update to latest `@types/node` version.
377
378 ## [2.7.4] - 2023-09-25
379
380 ### Fixed
381
382 - Fix source maps (bundler issue).
383
384 ## [2.7.3] - 2023-09-24
385
386 ### Changed
387
388 - Convert pool event emitter to event emitter async resource.
389
390 ## [2.7.2] - 2023-09-23
391
392 ### Changed
393
394 - Add source maps to npm package to ease debugging.
395
396 ### Added
397
398 - Continuous benchmarking versus other worker pools: [https://poolifier.github.io/benchmark](https://poolifier.github.io/benchmark).
399
400 ## [2.7.1] - 2023-09-20
401
402 ### Fixed
403
404 - Ensure worker message listener used one time are removed after usage.
405
406 ## [2.7.0] - 2023-09-19
407
408 ### Fixed
409
410 - Fix task stealing related tasks queue options handling at runtime.
411
412 ### Changed
413
414 - Rename `listTaskFunctions()` to `listTaskFunctionNames()` in pool and worker API.
415
416 ### Added
417
418 - Add `hasTaskFunction()`, `addTaskFunction()`, `removeTaskFunction()`, `setDefaultTaskFunction()` methods to pool API: [PR #1148](https://github.com/poolifier/poolifier/pull/1148).
419 - Stricter worker constructor arguments validation.
420
421 ## [2.6.45] - 2023-09-17
422
423 ### Changed
424
425 - Disable publication on GitHub packages registry on release until authentication issue is fixed.
426
427 ### Added
428
429 - Add `startWorkers` to pool options to whether start the minimum number of workers at pool initialization or not.
430 - Add `start()` method to pool API to start the minimum number of workers.
431 - Add `taskStealing` and `tasksStealingOnBackPressure` to tasks queue options to whether enable task stealing or not and whether enable tasks stealing under back pressure or not.
432 - Continuous internal benchmarking: [https://poolifier.github.io/benchmark-results/dev/bench](https://poolifier.github.io/benchmark-results/dev/bench).
433
434 ## [2.6.44] - 2023-09-08
435
436 ### Fixed
437
438 - Use a dedicated PAT to publish on GitHub packages registry.
439
440 ### Added
441
442 - Publish on GitHub packages registry on release.
443
444 ### Changed
445
446 - Switch from rome to biome: [PR #1128](https://github.com/poolifier/poolifier/pull/1128).
447
448 ## [2.6.43] - 2023-09-08
449
450 ### Added
451
452 - Publish on GitHub packages registry on release.
453
454 ### Changed
455
456 - Switch from rome to biome: [PR #1128](https://github.com/poolifier/poolifier/pull/1128).
457
458 ## [2.6.42] - 2023-09-06
459
460 ### Changed
461
462 - Optimize hot code paths implementation: avoid unnecessary branching, add and use optimized helpers (min, max), use reduce() array helper, ...
463
464 ## [2.6.41] - 2023-09-03
465
466 ### Changed
467
468 - Optimize worker choice strategies implementation.
469
470 ## [2.6.40] - 2023-09-01
471
472 ### Fixed
473
474 - Do not pre-choose in WRR worker choice strategy to avoid bias.
475 - Avoid array out of bound in worker choice strategies after worker node removal.
476
477 ## [2.6.39] - 2023-08-30
478
479 ### Fixed
480
481 - Fix race condition in worker choice strategies at worker node info querying while not yet initialized.
482
483 ## [2.6.38] - 2023-08-30
484
485 ### Added
486
487 - Bundle typescript types declaration into one file.
488
489 ### Changed
490
491 - Improve interleaved weighted round robin worker choice strategy implementation.
492
493 ## [2.6.37] - 2023-08-28
494
495 ### Fixed
496
497 - Ensure unused worker usage statistics are deleted at runtime.
498
499 ### Changed
500
501 - Rename worker choice strategy options `choiceRetries` to `retries`.
502 - Avoid unnecessary branching in worker choice strategies.
503
504 ## [2.6.36] - 2023-08-27
505
506 ### Fixed
507
508 - Fix pool `execute()` arguments check.
509
510 ### Changed
511
512 - Make continuous tasks stealing algorithm less aggressive.
513 - Fine tune tasks stealing algorithm under back pressure.
514
515 ## [2.6.35] - 2023-08-25
516
517 ### Fixed
518
519 - Don't account worker usage statistics for tasks that have failed.
520 - Fix pool information runtime and wait time median computation.
521
522 ### Changed
523
524 - Update simple moving average implementation to use a circular buffer.
525 - Update simple moving median implementation to use a circular buffer.
526 - Account for stolen tasks in worker usage statistics and pool information.
527
528 ### Added
529
530 - Continuous tasks stealing algorithm.
531
532 ## [2.6.34] - 2023-08-24
533
534 ### Fixes
535
536 - Avoid cascading tasks stealing under back pressure.
537
538 ### Changed
539
540 - Add fastpath to queued tasks rescheduling.
541
542 ## [2.6.33] - 2023-08-24
543
544 ### Fixed
545
546 - Fix queued tasks rescheduling.
547
548 ### Changed
549
550 - Rename tasks queue options `queueMaxSize` to `size`.
551
552 ### Added
553
554 - Task stealing scheduling algorithm if tasks queueing is enabled.
555
556 ## [2.6.32] - 2023-08-23
557
558 ### Fixed
559
560 - Ensure no task can be executed when the pool is destroyed.
561
562 ### Added
563
564 - Add `queueMaxSize` option to tasks queue options.
565 - Add O(1) deque implementation implemented with doubly linked list and use it for tasks queueing.
566 - Add tasks stealing algorithm when a worker node queue is back pressured if tasks queueing is enabled.
567
568 ## [2.6.31] - 2023-08-20
569
570 ### Fixed
571
572 - Fix worker choice strategy retries mechanism in some edge cases.
573
574 ### Changed
575
576 - Make orthogonal worker choice strategies tasks distribution and created dynamic worker usage.
577 - Remove the experimental status of the `LEAST_ELU` worker choice strategy.
578
579 ## [2.6.30] - 2023-08-19
580
581 ### Fixed
582
583 - Ensure pool event `backPressure` is emitted.
584 - Ensure pool event `full` is emitted only once.
585 - Ensure worker node cannot be instantiated without proper arguments.
586
587 ## [2.6.29] - 2023-08-18
588
589 ### Fixed
590
591 - Fix race condition between readiness and task functions worker message handling at startup.
592 - Fix duplicate task function worker usage statistics computation per task function.
593 - Update task function worker usage statistics if and only if there's at least two different task functions.
594 - Fix race condition at task function worker usage executing task computation leading to negative value.
595
596 ### Added
597
598 - Add back pressure detection on the worker node queue. Event `backPressure` is emitted when all worker node queues are full (worker node queue size >= poolMaxSize^2).
599 - Use back pressure detection in worker choice strategies.
600 - Add worker choice strategies retries mechanism if no worker is eligible.
601
602 ## [2.6.28] - 2023-08-16
603
604 ### Fixed
605
606 - Ensure pool workers are properly initialized.
607
608 ### Added
609
610 - HTTP server pool examples: express-cluster, express-hybrid.
611
612 ### Changed
613
614 - Remove now useless branching in worker hot code path.
615
616 ## [2.6.27] - 2023-08-15
617
618 ### Fixed
619
620 - Add `KillHandler` type definition to exported types.
621
622 ### Added
623
624 - Add `destroy` event to pool API.
625
626 ## [2.6.26] - 2023-08-15
627
628 ### Added
629
630 - Add kill handler to worker options allowing to execute custom code when worker is killed.
631 - Add `listTaskFunctions()` method to pool API.
632 - SMTP client pool example: nodemailer.
633
634 ## [2.6.25] - 2023-08-13
635
636 ### Added
637
638 - HTTP server pool examples: fastify-cluster, fastify-hybrid.
639 - WebSocket server pool examples: ws-cluster, ws-hybrid.
640
641 ## [2.6.24] - 2023-08-12
642
643 ### Added
644
645 - Add array of transferable objects to the `execute()` method arguments.
646 - WebSocket server pool examples: ws-worker_threads.
647
648 ## [2.6.23] - 2023-08-11
649
650 ### Fixed
651
652 - Fix pool busyness semantic when tasks queueing is enabled: the pool is busy when the number of executing tasks on each worker has reached the maximum tasks concurrency per worker.
653
654 ### Added
655
656 - HTTP client pool examples: fetch, node-fetch and axios with multiple task functions.
657 - HTTP server pool examples: express-worker_threads, fastify-worker_threads.
658
659 ## [2.6.22] - 2023-08-10
660
661 ### Fixed
662
663 - Add missing `types` field to package.json `exports`.
664
665 ### Changed
666
667 - Structure markdown documentation (PR #811).
668
669 ## [2.6.21] - 2023-08-03
670
671 ### Changed
672
673 - Improve code documentation.
674 - Code refactoring and cleanup for better maintainability and readability.
675
676 ## [2.6.20] - 2023-07-21
677
678 ### Fixed
679
680 - Fix queued tasks redistribution on error task execution starvation.
681 - Ensure tasks queueing per worker condition is untangled from the pool busyness semantic.
682
683 ### Changed
684
685 - Drastically reduce lookups by worker in the worker nodes.
686
687 ## [2.6.19] - 2023-07-20
688
689 ### Added
690
691 - Dedicated internal communication channel for worker_threads pools.
692
693 ## [2.6.18] - 2023-07-19
694
695 ### Changed
696
697 - Code refactoring and cleanup for better maintainability and readability. Bundle size is a bit smaller.
698
699 ## [2.6.17] - 2023-07-16
700
701 ### Added
702
703 - Add `listTaskFunctions()` method to worker API.
704
705 ## [2.6.16] - 2023-07-12
706
707 ### Fixed
708
709 - Fix pool startup detection.
710 - Fix worker task functions handling.
711
712 ## [2.6.15] - 2023-07-11
713
714 ### Added
715
716 - Take into account worker node readiness in worker choice strategies.
717
718 ## [2.6.14] - 2023-07-10
719
720 ### Fixed
721
722 - Fix task function statistics tracking.
723
724 ## [2.6.13] - 2023-07-10
725
726 ### Added
727
728 - Add per task function statistics tracking.
729 - Add public methods to manipulate the worker task functions at runtime.
730
731 ## [2.6.12] - 2023-07-09
732
733 ### Fixed
734
735 - Workaround import issue with `node:os` module in node 16.x.x.
736
737 ## [2.6.11] - 2023-07-09
738
739 ### Fixed
740
741 - Fix pool readiness semantic.
742
743 ## [2.6.10] - 2023-07-08
744
745 ### Fixed
746
747 - Ensure workers are not recreated on error at pool startup.
748
749 ### Added
750
751 - Add `ready` and `strategy` fields to pool information.
752 - Add pool event `ready` to notify when the number of workers created in the pool has reached the maximum size expected and are ready.
753 - Add dynamic pool sizing checks.
754
755 ## [2.6.9] - 2023-07-07
756
757 ### Fixed
758
759 - Recreate the right worker type on uncaught exception.
760
761 ### Added
762
763 - Add minimum and maximum to internal measurement statistics.
764 - Add `runTime` and `waitTime` to pool information.
765 - Check worker inactive time only on dynamic worker.
766
767 ## [2.6.8] - 2023-07-03
768
769 ### Fixed
770
771 - Brown paper bag release to fix version handling in pool information.
772
773 ## [2.6.7] - 2023-07-03
774
775 ### Fixed
776
777 - Ensure worker queued tasks at error are reassigned to other pool workers.
778
779 ### Added
780
781 - Add pool `utilization` ratio to pool information.
782 - Add `version` to pool information.
783 - Add worker information to worker nodes.
784
785 ## [2.6.6] - 2023-07-01
786
787 ### Added
788
789 - Add safe helper `availableParallelism()` to help sizing the pool.
790
791 ### Fixed
792
793 - Ensure message handler is only registered in worker.
794
795 ## [2.6.5] - 2023-06-27
796
797 ### Known issues
798
799 - Cluster pools tasks execution are not working by using ESM files extension: https://github.com/poolifier/poolifier/issues/782
800
801 ### Fixed
802
803 - Artificial version bump to 2.6.5 to workaround publication issue.
804 - Ensure cluster pool `destroy()` gracefully shutdowns worker's server.
805 - Ensure pool event is emitted before task error promise rejection.
806 - Fix queued tasks count computation.
807
808 ### Removed
809
810 - Remove unneeded worker_threads worker `MessageChannel` internal usage for IPC.
811
812 ## [2.6.4] - 2023-06-27
813
814 ### Known issues
815
816 - Cluster pools tasks execution are not working by using ESM files extension: https://github.com/poolifier/poolifier/issues/782
817
818 ### Fixed
819
820 - Ensure cluster pool `destroy()` gracefully shutdowns worker's server.
821 - Ensure pool event is emitted before task error promise rejection.
822 - Fix queued tasks count computation.
823
824 ### Removed
825
826 - Remove unneeded worker_threads worker `MessageChannel` internal usage for IPC.
827
828 ## [2.6.3] - 2023-06-19
829
830 ### Fixed
831
832 - Ensure no tasks are queued when trying to soft kill a dynamic worker.
833 - Update strategies internals after statistics computation.
834
835 ### Changed
836
837 - Optimize O(1) queue implementation.
838
839 ## [2.6.2] - 2023-06-12
840
841 ### Fixed
842
843 - Fix new worker use after creation in dynamic pool given the current worker choice strategy.
844
845 ## [2.6.1] - 2023-06-10
846
847 ### Added
848
849 - Add worker choice strategy documentation: [README.md](./docs/worker-choice-strategies.md).
850
851 ### Fixed
852
853 - Fix average statistics computation: ensure failed tasks are not accounted.
854
855 ## [2.6.0] - 2023-06-09
856
857 ### Added
858
859 - Add `LEAST_ELU` worker choice strategy (experimental).
860 - Add tasks ELU instead of runtime support to `FAIR_SHARE` worker choice strategy.
861
862 ### Changed
863
864 - Refactor pool worker node usage internals.
865 - Breaking change: refactor worker choice strategy statistics requirements: the syntax of the worker choice strategy options has changed.
866 - Breaking change: pool information `info` property object fields have been renamed.
867
868 ### Fixed
869
870 - Fix wait time accounting.
871 - Ensure worker choice strategy `LEAST_BUSY` accounts also tasks wait time.
872 - Ensure worker choice strategy `LEAST_USED` accounts also queued tasks.
873
874 ## [2.5.4] - 2023-06-07
875
876 ### Added
877
878 - Add Event Loop Utilization (ELU) statistics to worker tasks usage.
879
880 ### Changed
881
882 - Compute statistics at the worker level only if needed.
883 - Add `worker_threads` options to thread pool options.
884
885 ### Fixed
886
887 - Make the `LEAST_BUSY` strategy only relies on task runtime.
888
889 ## [2.5.3] - 2023-06-04
890
891 ### Changed
892
893 - Refine pool information content.
894 - Limit pool internals public exposure.
895
896 ## [2.5.2] - 2023-06-02
897
898 ### Added
899
900 - Add `taskError` pool event for task execution error.
901 - Add pool information `info` property to pool.
902 - Emit pool information on `busy` and `full` pool events.
903
904 ## [2.5.1] - 2023-06-01
905
906 ### Added
907
908 - Add pool option `restartWorkerOnError` to restart worker on uncaught error. Default to `true`.
909 - Add `error` pool event for uncaught worker error.
910
911 ## [2.5.0] - 2023-05-31
912
913 ### Added
914
915 - Switch pool event emitter to `EventEmitterAsyncResource`.
916 - Add tasks wait time accounting in per worker tasks usage.
917 - Add interleaved weighted round robin `INTERLEAVED_WEIGHTED_ROUND_ROBIN` worker choice strategy (experimental).
918
919 ### Changed
920
921 - Renamed worker choice strategy `LESS_BUSY` to `LEAST_BUSY` and `LESS_USED` to `LEAST_USED`.
922
923 ## [2.4.14] - 2023-05-09
924
925 ### Fixed
926
927 - Ensure no undefined task runtime can land in the tasks history.
928 - Fix median computation implementation once again.
929
930 ### Added
931
932 - Unit tests for median and queue implementations.
933
934 ## [2.4.13] - 2023-05-08
935
936 ### Fixed
937
938 - Fix worker choice strategy options validation.
939 - Fix fair share worker choice strategy internals update: ensure virtual task end timestamp is computed at task submission.
940
941 ## [2.4.12] - 2023-05-06
942
943 ### Added
944
945 - Support multiple task functions per worker.
946 - Add custom worker weights support to worker choice strategies options.
947
948 ### Changed
949
950 - Use O(1) queue implementation for tasks queueing.
951
952 ### Fixed
953
954 - Fix median computation implementation.
955 - Fix fair share worker choice strategy internals update.
956
957 ## [2.4.11] - 2023-04-23
958
959 ### Changed
960
961 - Optimize free worker finding in worker choice strategies.
962
963 ## [2.4.10] - 2023-04-15
964
965 ### Fixed
966
967 - Fix typescript type definition for task function: ensure the input data is optional.
968 - Fix typescript type definition for pool execute(): ensure the input data is optional.
969
970 ## [2.4.9] - 2023-04-15
971
972 ### Added
973
974 - Add tasks queue enablement runtime setter to pool.
975 - Add tasks queue options runtime setter to pool.
976 - Add worker choice strategy options runtime setter to pool.
977
978 ### Changed
979
980 - Remove the tasks queuing experimental status.
981
982 ### Fixed
983
984 - Fix task function type definition and validation.
985 - Fix worker choice strategy options handling.
986
987 ## [2.4.8] - 2023-04-12
988
989 ### Fixed
990
991 - Fix message between main worker and worker type definition for tasks.
992 - Fix code documentation.
993
994 ## [2.4.7] - 2023-04-11
995
996 ### Added
997
998 - Add worker tasks queue options to pool options.
999
1000 ### Fixed
1001
1002 - Fix missing documentation.
1003
1004 ## [2.4.6] - 2023-04-10
1005
1006 ### Fixed
1007
1008 - Ensure one task at a time is executed per worker with tasks queueing enabled.
1009 - Properly count worker executing tasks with tasks queueing enabled.
1010
1011 ## [2.4.5] - 2023-04-09
1012
1013 ### Added
1014
1015 - Use monotonic high resolution timer for worker tasks runtime.
1016 - Add worker tasks median runtime to statistics.
1017 - Add worker tasks queue (experimental).
1018
1019 ## [2.4.4] - 2023-04-07
1020
1021 ### Added
1022
1023 - Add `PoolEvents` enumeration and `PoolEvent` type.
1024
1025 ### Fixed
1026
1027 - Destroy worker only on alive check.
1028
1029 ## [2.4.3] - 2023-04-07
1030
1031 ### Fixed
1032
1033 - Fix typedoc generation with inheritance.
1034
1035 ## [2.4.2] - 2023-04-06
1036
1037 ### Added
1038
1039 - Add `full` event to dynamic pool.
1040 - Keep worker choice strategy in memory for conditional reuse.
1041
1042 ### Fixed
1043
1044 - Fix possible negative worker key at worker removal in worker choice strategies.
1045
1046 ## [2.4.1] - 2023-04-05
1047
1048 ### Changed
1049
1050 - Optimize worker choice strategy for dynamic pool.
1051
1052 ### Fixed
1053
1054 - Ensure dynamic pool does not alter worker choice strategy expected behavior.
1055
1056 ## [2.4.0] - 2023-04-04
1057
1058 ### Added
1059
1060 - Add `LESS_BUSY` worker choice strategy.
1061
1062 ### Changed
1063
1064 - Optimize worker storage in pool.
1065 - Optimize worker alive status check.
1066 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1067 - Optimize `LESS_USED` worker choice strategy.
1068 - Update benchmark versus external threads pools.
1069 - Optimize tasks usage statistics requirements for worker choice strategy.
1070
1071 ### Fixed
1072
1073 - Ensure trimmable characters are checked at pool initialization.
1074 - Fix message id integer overflow.
1075 - Fix pool worker removal in worker choice strategy internals.
1076 - Fix package publication with pnpm.
1077
1078 ## [2.4.0-3] - 2023-04-04
1079
1080 ### Added
1081
1082 - Add `LESS_BUSY` worker choice strategy.
1083
1084 ### Changed
1085
1086 - Optimize worker storage in pool.
1087 - Optimize worker alive status check.
1088 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1089 - Optimize `LESS_USED` worker choice strategy.
1090 - Update benchmark versus external threads pools.
1091
1092 ### Fixed
1093
1094 - Ensure trimmable characters are checked at pool initialization.
1095 - Fix message id integer overflow.
1096 - Fix pool worker removal in worker choice strategy internals.
1097 - Fix package publication with pnpm.
1098
1099 ## [2.4.0-2] - 2023-04-03
1100
1101 ### Added
1102
1103 - Add `LESS_BUSY` worker choice strategy.
1104
1105 ### Changed
1106
1107 - Optimize worker storage in pool.
1108 - Optimize worker alive status check.
1109 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1110 - Optimize `LESS_USED` worker choice strategy.
1111
1112 ### Fixed
1113
1114 - Ensure trimmable characters are checked at pool initialization.
1115 - Fix message id integer overflow.
1116 - Fix pool worker removal in worker choice strategy internals.
1117 - Fix package publication with pnpm.
1118
1119 ## [2.4.0-1] - 2023-04-03
1120
1121 ### Added
1122
1123 - Add `LESS_BUSY` worker choice strategy.
1124
1125 ### Changed
1126
1127 - Optimize worker storage in pool.
1128 - Optimize worker alive status check.
1129 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1130 - Optimize `LESS_USED` worker choice strategy.
1131
1132 ### Fixed
1133
1134 - Ensure trimmable characters are checked at pool initialization.
1135 - Fix message id integer overflow.
1136 - Fix pool worker removal in worker choice strategy internals.
1137
1138 ## [2.4.0-0] - 2023-04-03
1139
1140 ### Added
1141
1142 - Add `LESS_BUSY` worker choice strategy.
1143
1144 ### Changed
1145
1146 - Optimize worker storage in pool.
1147 - Optimize worker alive status check.
1148 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1149 - Optimize `LESS_USED` worker choice strategy.
1150
1151 ### Fixed
1152
1153 - Ensure trimmable characters are checked at pool initialization.
1154 - Fix message id integer overflow.
1155 - Fix pool worker removal in worker choice strategy internals.
1156
1157 ## [2.3.10] - 2023-03-18
1158
1159 ### Fixed
1160
1161 - Fix package.json `exports` syntax for ESM and CommonJS.
1162
1163 ### Changed
1164
1165 - Permit SemVer pre-release publication.
1166
1167 ## [2.3.10-2] - 2023-03-18
1168
1169 ### Fixed
1170
1171 - Fix package.json `exports` syntax for ESM and CommonJS.
1172
1173 ## [2.3.10-1] - 2023-03-18
1174
1175 ### Changed
1176
1177 - Permit SemVer pre-release publication.
1178
1179 ## [2.3.10-0] - 2023-03-18
1180
1181 ### Fixed
1182
1183 - Fix package.json `exports` syntax for ESM and CommonJS.
1184
1185 ## [2.3.9] - 2023-03-18
1186
1187 ### Changed
1188
1189 - Introduce ESM module support along with CommonJS one.
1190
1191 ### Fixed
1192
1193 - Fix brown paper bag bug referencing the same object literal.
1194
1195 ## [2.3.8] - 2023-03-18
1196
1197 ### Changed
1198
1199 - Switch internal benchmarking code to benny.
1200 - Switch to TypeScript 5.x.x.
1201 - Switch rollup bundler plugins to core ones.
1202 - Switch to TSDoc syntax.
1203 - Enforce conventional commits.
1204
1205 ### Fixed
1206
1207 - Fix random integer generator.
1208 - Fix worker choice strategy pool type identification at initialization.
1209
1210 ## [2.3.7] - 2022-10-23
1211
1212 ### Changed
1213
1214 - Switch to open collective FOSS project funding platform.
1215 - Switch to ts-standard linter configuration on TypeScript code.
1216
1217 ### Fixed
1218
1219 - Fixed missing async on pool execute method.
1220 - Fixed typing in TypeScript example.
1221 - Fixed types in unit tests.
1222
1223 ## [2.3.6] - 2022-10-22
1224
1225 ### Changed
1226
1227 - Cleanup pool attributes and methods.
1228 - Refine error types thrown.
1229
1230 ### Fixed
1231
1232 - Fix continuous integration build on windows.
1233 - Fix code coverage reporting by using c8 instead of nyc.
1234
1235 ## [2.3.5] - 2022-10-21
1236
1237 ### Changed
1238
1239 - Improve benchmarks: add IO intensive task workload, add task size option, integrate code into linter.
1240 - Optimize tasks usage lookup implementation.
1241
1242 ### Fixed
1243
1244 - Fix missed pool event emitter type export.
1245 - Fix typedoc documentation generation.
1246
1247 ## [2.3.4] - 2022-10-17
1248
1249 ### Added
1250
1251 - Fully automate release process with release-it.
1252
1253 ### Changed
1254
1255 - Optimize fair share task scheduling algorithm implementation.
1256 - Update benchmark versus external pools results with latest version.
1257
1258 ## [2.3.3] - 2022-10-15
1259
1260 ### Added
1261
1262 - Add support for [cluster settings](https://nodejs.org/api/cluster.html#cluster_cluster_settings) in cluster pool options.
1263
1264 ## [2.3.2] - 2022-10-14
1265
1266 ### Changed
1267
1268 - Optimize fair share worker selection strategy implementation.
1269
1270 ### Fixed
1271
1272 - Fix WRR worker selection strategy: ensure the condition triggering the round robin can be fulfilled.
1273
1274 ## [2.3.1] - 2022-10-13
1275
1276 ### Added
1277
1278 - Pool worker choice strategies:
1279 - `WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN` strategy based on weighted round robin scheduling algorithm using tasks execution time for now.
1280 - `WorkerChoiceStrategies.FAIR_SHARE` strategy based on fair share scheduling algorithm using tasks execution time for now.
1281
1282 ## [2.2.2] - 2022-10-09
1283
1284 ### Fixed
1285
1286 - Fixed `README.md` file.
1287
1288 ## [2.2.1] - 2022-10-08
1289
1290 ### Added
1291
1292 - Dynamic worker choice strategy change at runtime.
1293
1294 ## [2.2.0] - 2022-01-05
1295
1296 ### Breaking Changes
1297
1298 - Support only Node.js version 16.x.x for cluster pool: upstream cluster API have changed on that version.
1299
1300 ## [2.1.0] - 2021-08-29
1301
1302 ### Added
1303
1304 - Add an optional pool option `messageHandler` to `PoolOptions<Worker>` for registering a message handler callback on each worker.
1305
1306 ### Breaking Changes
1307
1308 - `AbstractWorker` class `maxInactiveTime`, `killBehavior` and `async` attributes have been removed in favour of the same ones in the worker options `opts` public attribute.
1309 - `AbstractWorker` class `lastTask` attribute have been renamed to `lastTaskTimestamp`.
1310 - `AbstractWorker` class `interval` attribute have been renamed to `aliveInterval`.
1311 - `AbstractWorker` class cannot be instantiated without specifying the `mainWorker` argument referencing the main worker.
1312
1313 ## [2.0.2] - 2021-05-12
1314
1315 ### Bug fixes
1316
1317 - Fix `busy` event emission on fixed pool type
1318
1319 ## [2.0.1] - 2021-03-16
1320
1321 ### Bug fixes
1322
1323 - Check if pool options are properly set.
1324 - `busy` event is emitted on all pool types.
1325
1326 ## [2.0.0] - 2021-03-01
1327
1328 ### Bug fixes
1329
1330 - Now a thread/process by default is not deleted when the task submitted take more time than maxInactiveTime configured (issue #70).
1331
1332 ### Breaking Changes
1333
1334 - `FullPool` event is now renamed to `busy`.
1335 - `maxInactiveTime` on `ThreadWorker` default behavior is now changed, if you want to keep the old behavior set `killBehavior` to `KillBehaviors.HARD`.
1336 _Find more details on our JSDoc._
1337
1338 - `maxTasks` option on `FixedThreadPool` and `DynamicThreadPool` is now removed since is no more needed.
1339
1340 - We changed some internal structures, but you shouldn't be too affected by them as these are internal changes.
1341
1342 ### Pool options types declaration merge
1343
1344 `FixedThreadPoolOptions` and `DynamicThreadPoolOptions` type declarations have been merged to `PoolOptions<Worker>`.
1345
1346 #### New `export` strategy
1347
1348 ```js
1349 // Before
1350 const DynamicThreadPool = require('poolifier/lib/dynamic')
1351 // After
1352 const { DynamicThreadPool } = require('poolifier/lib/dynamic')
1353 ```
1354
1355 But you should always prefer just using
1356
1357 ```js
1358 const { DynamicThreadPool } = require('poolifier')
1359 ```
1360
1361 #### New type definitions for input data and response
1362
1363 For cluster worker and worker-thread pools, you can now only send and receive structured-cloneable data.
1364 _This is not a limitation by poolifier but Node.js._
1365
1366 #### Public property replacements
1367
1368 `numWorkers` property is now `numberOfWorkers`
1369
1370 #### Internal (protected) properties and methods renaming
1371
1372 These properties are not intended for end users
1373
1374 - `id` => `nextMessageId`
1375
1376 These methods are not intended for end users
1377
1378 - `_chooseWorker` => `chooseWorker`
1379 - `_newWorker` => `createWorker`
1380 - `_execute` => `internalExecute`
1381 - `_chooseWorker` => `chooseWorker`
1382 - `_checkAlive` => `checkAlive`
1383 - `_run` => `run`
1384 - `_runAsync` => `runAsync`
1385
1386 ## [1.1.0] - 2020-05-21
1387
1388 ### Added
1389
1390 - ThreadWorker support async functions as option
1391 - Various external library patches
1392
1393 ## [1.0.0] - 2020-01-24
1394
1395 ### Added
1396
1397 - FixedThreadPool implementation
1398 - DynamicThreadPool implementation
1399 - WorkerThread implementation to improve developer experience