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