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