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