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