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