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