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