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