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