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