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