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