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