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