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